Job Improvement Project - Genetic (#3284)

* Fixes #2571.
* Updates Homunculus skills from kRO maintenance: http://ro.gnjoy.com/news/update/View.asp?seq=218&curpage=1
* Updates Genetic skills from kRO maintenance: http://ro.gnjoy.com/news/update/View.asp?seq=246&curpage=1
Thanks to @Tokeiburu, @Badarosk0, @Balferian, and @Haydrich!
This commit is contained in:
Aleos 2020-03-25 13:26:26 -04:00 committed by GitHub
parent 24ecebcaf3
commit 652d77eb02
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
22 changed files with 811 additions and 825 deletions

View File

@ -50,7 +50,7 @@ homunculus_auto_vapor: 80
homunculus_max_level: 99 homunculus_max_level: 99
// Max level for Homunculus S // Max level for Homunculus S
homunculus_S_max_level: 150 homunculus_S_max_level: 175
// Growth level for Homunculus S // Growth level for Homunculus S
// This is the level at which homunculus S can use their growth tables // This is the level at which homunculus S can use their growth tables
@ -70,3 +70,8 @@ homunculus_autofeed_always: yes
// You will only receive items if 'homunculus_autoloot' is activated, // You will only receive items if 'homunculus_autoloot' is activated,
// otherwise they will be dropped on the ground as usual. // otherwise they will be dropped on the ground as usual.
hom_idle_no_share: no hom_idle_no_share: no
// The rate at which homunculus gain experience from kills. (Note 2)
// Only applies to renewal mode.
// Official: 10%
homunculus_exp_gain: 10

View File

@ -89,31 +89,31 @@
//Eira //Eira
6048,8022,5,128,0,0,0,0,0,0,0,0,0,0,0 //MH_LIGHT_OF_REGENE 6048,8022,5,128,0,0,0,0,0,0,0,0,0,0,0 //MH_LIGHT_OF_REGENE
6048,8023,5,114,0,0,0,0,0,0,0,0,0,0,0 //MH_OVERED_BOOST 6048,8023,5,114,0,0,0,0,0,0,0,0,0,0,0 //MH_OVERED_BOOST
6048,8024,5,106,0,0,0,0,0,0,0,0,0,0,0 //MH_ERASER_CUTTER 6048,8024,10,106,0,0,0,0,0,0,0,0,0,0,0 //MH_ERASER_CUTTER
6048,8025,5,121,0,0,0,0,0,0,0,0,0,0,0 //MH_XENO_SLASHER 6048,8025,10,121,0,0,0,0,0,0,0,0,0,0,0 //MH_XENO_SLASHER
6048,8026,5,137,0,0,0,0,0,0,0,0,0,0,0 //MH_SILENT_BREEZE 6048,8026,5,137,0,0,0,0,0,0,0,0,0,0,0 //MH_SILENT_BREEZE
//Bayeri //Bayeri
6049,8031,5,105,0,0,0,0,0,0,0,0,0,0,0 //MH_STAHL_HORN 6049,8031,10,105,0,0,0,0,0,0,0,0,0,0,0 //MH_STAHL_HORN
6049,8032,5,112,0,0,0,0,0,0,0,0,0,0,0 //MH_GOLDENE_FERSE 6049,8032,5,112,0,0,0,0,0,0,0,0,0,0,0 //MH_GOLDENE_FERSE
6049,8033,5,121,0,0,0,0,0,0,0,0,0,0,0 //MH_STEINWAND 6049,8033,5,121,0,0,0,0,0,0,0,0,0,0,0 //MH_STEINWAND
6049,8034,5,138,0,0,0,0,0,0,0,0,0,0,0 //MH_HEILIGE_STANGE 6049,8034,10,138,0,0,0,0,0,0,0,0,0,0,0 //MH_HEILIGE_STANGE
6049,8035,5,130,0,0,0,0,0,0,0,0,0,0,0 //MH_ANGRIFFS_MODUS 6049,8035,5,130,0,0,0,0,0,0,0,0,0,0,0 //MH_ANGRIFFS_MODUS
//Sera //Sera
6050,8018,5,132,0,0,0,0,0,0,0,0,0,0,0 //MH_SUMMON_LEGION 6050,8018,5,132,0,0,0,0,0,0,0,0,0,0,0 //MH_SUMMON_LEGION
6050,8019,5,105,0,0,0,0,0,0,0,0,0,0,0 //MH_NEEDLE_OF_PARALYZE 6050,8019,10,105,0,0,0,0,0,0,0,0,0,0,0 //MH_NEEDLE_OF_PARALYZE
6050,8020,5,116,0,0,0,0,0,0,0,0,0,0,0 //MH_POISON_MIST 6050,8020,5,116,0,0,0,0,0,0,0,0,0,0,0 //MH_POISON_MIST
6050,8021,5,123,0,0,0,0,0,0,0,0,0,0,0 //MH_PAIN_KILLER 6050,8021,10,123,0,0,0,0,0,0,0,0,0,0,0 //MH_PAIN_KILLER
//Dieter //Dieter
6051,8039,5,122,0,0,0,0,0,0,0,0,0,0,0 //MH_MAGMA_FLOW 6051,8039,5,122,0,0,0,0,0,0,0,0,0,0,0 //MH_MAGMA_FLOW
6051,8040,5,116,0,0,0,0,0,0,0,0,0,0,0 //MH_GRANITIC_ARMOR 6051,8040,5,116,0,0,0,0,0,0,0,0,0,0,0 //MH_GRANITIC_ARMOR
6051,8041,5,109,0,0,0,0,0,0,0,0,0,0,0 //MH_LAVA_SLIDE 6051,8041,10,109,0,0,0,0,0,0,0,0,0,0,0 //MH_LAVA_SLIDE
6051,8042,5,131,0,0,0,0,0,0,0,0,0,0,0 //MH_PYROCLASTIC 6051,8042,10,131,0,0,0,0,0,0,0,0,0,0,0 //MH_PYROCLASTIC
6051,8043,5,102,0,0,0,0,0,0,0,0,0,0,0 //MH_VOLCANIC_ASH 6051,8043,5,102,0,0,0,0,0,0,0,0,0,0,0 //MH_VOLCANIC_ASH
//Elanor //Elanor
6052,8027,1,100,0,0,0,0,0,0,0,0,0,0,0 //MH_STYLE_CHANGE 6052,8027,1,100,0,0,0,0,0,0,0,0,0,0,0 //MH_STYLE_CHANGE
6052,8028,5,100,0,0,0,0,0,0,0,0,0,0,0 //MH_SONIC_CRAW 6052,8028,5,100,0,0,0,0,0,0,0,0,0,0,0 //MH_SONIC_CRAW
6052,8029,5,114,0,0,0,0,0,0,0,0,0,0,0 //MH_SILVERVEIN_RUSH 6052,8029,10,114,0,0,0,0,0,0,0,0,0,0,0 //MH_SILVERVEIN_RUSH
6052,8030,5,128,0,0,0,0,0,0,0,0,0,0,0 //MH_MIDNIGHT_FRENZY 6052,8030,10,128,0,0,0,0,0,0,0,0,0,0,0 //MH_MIDNIGHT_FRENZY
6052,8036,5,100,0,0,0,0,0,0,0,0,0,0,0 //MH_TINDER_BREAKER 6052,8036,5,100,0,0,0,0,0,0,0,0,0,0,0 //MH_TINDER_BREAKER
6052,8037,5,112,0,0,0,0,0,0,0,0,0,0,0 //MH_CBC 6052,8037,5,112,0,0,0,0,0,0,0,0,0,0,0 //MH_CBC
6052,8038,5,133,0,0,0,0,0,0,0,0,0,0,0 //MH_EQC 6052,8038,5,133,0,0,0,0,0,0,0,0,0,0,0 //MH_EQC

View File

@ -27355,24 +27355,10 @@ Body:
ItemCost: ItemCost:
- Item: Mandragora_Flowerpot - Item: Mandragora_Flowerpot
Amount: 1 Amount: 1
- Id: 2493 # - Id: 2493 # Removed on kRO
Name: GN_SLINGITEM # Name: GN_SLINGITEM
Description: Sling Item # Description: Sling Item
MaxLevel: 1 # MaxLevel: 1
TargetType: Support
DamageFlags:
NoDamage: true
Flags:
NoTargetSelf: true
Range: 11
Hit: Single
HitCount: 1
Cooldown: 1000
Requires:
SpCost: 4
Ammo:
Throwweapon: true
AmmoAmount: 1
- Id: 2494 - Id: 2494
Name: GN_CHANGEMATERIAL Name: GN_CHANGEMATERIAL
Description: Change Material Description: Change Material
@ -27399,21 +27385,10 @@ Body:
Amount: 5 Amount: 5
- Level: 2 - Level: 2
Amount: 40 Amount: 40
- Id: 2496 # - Id: 2496 # Removed on kRO
Name: GN_MAKEBOMB # Name: GN_MAKEBOMB
Description: Create Bomb # Description: Create Bomb
MaxLevel: 2 # MaxLevel: 2
TargetType: Self
DamageFlags:
NoDamage: true
Hit: Single
HitCount: 1
Requires:
SpCost:
- Level: 1
Amount: 5
- Level: 2
Amount: 40
- Id: 2497 - Id: 2497
Name: GN_S_PHARMACY Name: GN_S_PHARMACY
Description: Special Pharmacy Description: Special Pharmacy
@ -27425,17 +27400,10 @@ Body:
HitCount: 1 HitCount: 1
Requires: Requires:
SpCost: 12 SpCost: 12
- Id: 2498 # - Id: 2498 # Removed on kRO
Name: GN_SLINGITEM_RANGEMELEEATK # Name: GN_SLINGITEM_RANGEMELEEATK
Description: Sling Item Attack # Description: Sling Item Attack
MaxLevel: 1 # MaxLevel: 1
Type: Weapon
TargetType: Attack
Range: 11
Hit: Single
HitCount: 1
Requires:
SpCost: 1
- Id: 2533 - Id: 2533
Name: ALL_ODINS_RECALL Name: ALL_ODINS_RECALL
Description: Odin's Recall Description: Odin's Recall

View File

@ -179,4 +179,3 @@
2303,2048 //SC_BLOODYLUST 2303,2048 //SC_BLOODYLUST
2419,2048 //WM_POEMOFNETHERWORLD 2419,2048 //WM_POEMOFNETHERWORLD
2482,2048 //GN_WALLOFTHORN 2482,2048 //GN_WALLOFTHORN
2493,2048 //GN_SLINGITEM

View File

@ -3403,10 +3403,8 @@
4071,2486,5,2485,3,0,0,0,0,0,0,0,0 //GN_FIRE_EXPANSION#Fire Expansion# 4071,2486,5,2485,3,0,0,0,0,0,0,0,0 //GN_FIRE_EXPANSION#Fire Expansion#
4071,2490,5,2480,3,0,0,0,0,0,0,0,0 //GN_HELLS_PLANT#Hell's Plant# 4071,2490,5,2480,3,0,0,0,0,0,0,0,0 //GN_HELLS_PLANT#Hell's Plant#
4071,2492,5,2490,3,0,0,0,0,0,0,0,0 //GN_MANDRAGORA#Howling of Mandragora# 4071,2492,5,2490,3,0,0,0,0,0,0,0,0 //GN_MANDRAGORA#Howling of Mandragora#
4071,2493,1,2494,1,0,0,0,0,0,0,0,0 //GN_SLINGITEM#Sling Item#
4071,2494,1,0,0,0,0,0,0,0,0,0,0 //GN_CHANGEMATERIAL#Change Material# 4071,2494,1,0,0,0,0,0,0,0,0,0,0 //GN_CHANGEMATERIAL#Change Material#
4071,2495,2,2497,1,0,0,0,0,0,0,0,0 //GN_MIX_COOKING#Mix Cooking# 4071,2495,2,2497,1,0,0,0,0,0,0,0,0 //GN_MIX_COOKING#Mix Cooking#
4071,2496,2,2495,1,0,0,0,0,0,0,0,0 //GN_MAKEBOMB#Create Bomb#
4071,2497,10,0,0,0,0,0,0,0,0,0,0 //GN_S_PHARMACY#Special Pharmacy# 4071,2497,10,0,0,0,0,0,0,0,0,0,0 //GN_S_PHARMACY#Special Pharmacy#
4071,5003,5,2497,1,0,0,0,0,0,0,0,0 //GN_ILLUSIONDOOPING#Hallucination Drug# 4071,5003,5,2497,1,0,0,0,0,0,0,0,0 //GN_ILLUSIONDOOPING#Hallucination Drug#
4071,5014,5,0,0,0,0,0,0,0,0,0,0 //ALL_FULL_THROTTLE#Full Throttle# 4071,5014,5,0,0,0,0,0,0,0,0,0,0 //ALL_FULL_THROTTLE#Full Throttle#
@ -3847,10 +3845,8 @@
4078,2486,5,2485,3,0,0,0,0,0,0,0,0 //GN_FIRE_EXPANSION#Fire Expansion# 4078,2486,5,2485,3,0,0,0,0,0,0,0,0 //GN_FIRE_EXPANSION#Fire Expansion#
4078,2490,5,2480,3,0,0,0,0,0,0,0,0 //GN_HELLS_PLANT#Hell's Plant# 4078,2490,5,2480,3,0,0,0,0,0,0,0,0 //GN_HELLS_PLANT#Hell's Plant#
4078,2492,5,2490,3,0,0,0,0,0,0,0,0 //GN_MANDRAGORA#Howling of Mandragora# 4078,2492,5,2490,3,0,0,0,0,0,0,0,0 //GN_MANDRAGORA#Howling of Mandragora#
4078,2493,1,2494,1,0,0,0,0,0,0,0,0 //GN_SLINGITEM#Sling Item#
4078,2494,1,0,0,0,0,0,0,0,0,0,0 //GN_CHANGEMATERIAL#Change Material# 4078,2494,1,0,0,0,0,0,0,0,0,0,0 //GN_CHANGEMATERIAL#Change Material#
4078,2495,2,2497,1,0,0,0,0,0,0,0,0 //GN_MIX_COOKING#Mix Cooking# 4078,2495,2,2497,1,0,0,0,0,0,0,0,0 //GN_MIX_COOKING#Mix Cooking#
4078,2496,2,2495,1,0,0,0,0,0,0,0,0 //GN_MAKEBOMB#Create Bomb#
4078,2497,10,0,0,0,0,0,0,0,0,0,0 //GN_S_PHARMACY#Special Pharmacy# 4078,2497,10,0,0,0,0,0,0,0,0,0,0 //GN_S_PHARMACY#Special Pharmacy#
4078,5003,5,2497,1,0,0,0,0,0,0,0,0 //GN_ILLUSIONDOOPING#Hallucination Drug# 4078,5003,5,2497,1,0,0,0,0,0,0,0,0 //GN_ILLUSIONDOOPING#Hallucination Drug#
4078,5014,5,0,0,0,0,0,0,0,0,0,0 //ALL_FULL_THROTTLE#Full Throttle# 4078,5014,5,0,0,0,0,0,0,0,0,0,0 //ALL_FULL_THROTTLE#Full Throttle#
@ -5056,10 +5052,8 @@
4107,2486,5,2485,3,0,0,0,0,0,0,0,0 //GN_FIRE_EXPANSION#Fire Expansion# 4107,2486,5,2485,3,0,0,0,0,0,0,0,0 //GN_FIRE_EXPANSION#Fire Expansion#
4107,2490,5,2480,3,0,0,0,0,0,0,0,0 //GN_HELLS_PLANT#Hell's Plant# 4107,2490,5,2480,3,0,0,0,0,0,0,0,0 //GN_HELLS_PLANT#Hell's Plant#
4107,2492,5,2490,3,0,0,0,0,0,0,0,0 //GN_MANDRAGORA#Howling of Mandragora# 4107,2492,5,2490,3,0,0,0,0,0,0,0,0 //GN_MANDRAGORA#Howling of Mandragora#
4107,2493,1,2494,1,0,0,0,0,0,0,0,0 //GN_SLINGITEM#Sling Item#
4107,2494,1,0,0,0,0,0,0,0,0,0,0 //GN_CHANGEMATERIAL#Change Material# 4107,2494,1,0,0,0,0,0,0,0,0,0,0 //GN_CHANGEMATERIAL#Change Material#
4107,2495,2,2497,1,0,0,0,0,0,0,0,0 //GN_MIX_COOKING#Mix Cooking# 4107,2495,2,2497,1,0,0,0,0,0,0,0,0 //GN_MIX_COOKING#Mix Cooking#
4107,2496,2,2495,1,0,0,0,0,0,0,0,0 //GN_MAKEBOMB#Create Bomb#
4107,2497,10,0,0,0,0,0,0,0,0,0,0 //GN_S_PHARMACY#Special Pharmacy# 4107,2497,10,0,0,0,0,0,0,0,0,0,0 //GN_S_PHARMACY#Special Pharmacy#
4107,5003,5,2497,1,0,0,0,0,0,0,0,0 //GN_ILLUSIONDOOPING#Hallucination Drug# 4107,5003,5,2497,1,0,0,0,0,0,0,0,0 //GN_ILLUSIONDOOPING#Hallucination Drug#
4107,5014,5,0,0,0,0,0,0,0,0,0,0 //ALL_FULL_THROTTLE#Full Throttle# 4107,5014,5,0,0,0,0,0,0,0,0,0,0 //ALL_FULL_THROTTLE#Full Throttle#

View File

@ -1,151 +1,176 @@
// Homunculus Experience Tables // Homunculus Experience Tables
347 50
545 110
891 180
1485 260
2178 350
3168 630
3762 950
4158 1310
4505 1710
4900 2150
5390 3180
5880 4300
5978 5510
6223 6810
6566 8200
7203 10800
7840 13560
8232 16480
8624 19560
8924 22800
9409 28090
9991 33630
10670 39420
11446 45460
12610 51750
13580 61150
14550 70910
15520 81030
16490 91510
17460 102350
18430 117580
19400 133300
20370 149510
21340 166210
22504 183400
23280 206480
25220 230200
26675 254560
28130 279560
28800 305200
30240 338450
31680 372510
32640 407380
34560 443060
36000 479550
36480 525590
38400 572630
40320 620670
42720 669710
45120 719750
47040 781500
48960 844460
50880 908630
52800 974010
54720 1040600
56640 1121280
59040 1203400
60480 1286960
62400 1371960
64320 1458400
66240 1561530
67200 1666350
70080 1772860
73920 1881060
76800 1990950
80640 2120350
84480 2251710
87360 2385030
91200 2520310
104500 2657550
121600 2817340
133000 2979380
147250 3143670
154850 3310210
161500 3479000
171000 3673600
178600 3870760
185250 4070480
190000 4272760
218500 4477600
247000 4711730
285000 4948750
332500 5188660
380000 5431460
456000 5677150
522500 5955830
570000 6237750
646000 6522910
712500 6811310
855000 7102950
950000 7431500
1140000 7763660
1425000 8099430
1710000 8438810
1995000 8781800
2280000 9165840
2660000 9553880
3135000 9945920
3800000 10350000
4124000 10462000
4260000 10580000
4462000 10700000
4527000 10826000
4779000 10980000
4921000 11150000
4984000 11334000
5118000 11520000
5353000 11712000
5438000 11906000
5507000 12108000
5610000 12317000
5776000 12530000
5867000 12745000
6000000 12968000
6116000 13193000
6241000 13420000
6373000 13653000
6498000 13890000
6639000 14130000
6720000 14374200
6907000 14620000
7025000 14870000
7105000 15123200
7264000 15378000
7454000 15638000
7611000 15900000
7688000 16164000
7735000 16430000
7940000 16698000
8020000 16970000
8198000 17245000
8318000 17523000
8376000 17804000
8469000 18090000
8528000 18380000
8573000 18675000
8650000 18974000
8701000 19280000
8769000 19588000
8814000 19900000
8820000 20215000
8826000 20534000
8838000 20854200
8887000 21180000
8905000 21509500
8916000 21847000
8922000 22197000
8966000 22558000
9094000 22930000
0 23320000
24500000
25750000
26750000
28000000
29000000
30250000
31250000
32500000
33500000
34750000
36250000
38050000
40210000
42800000
47982500
50572500
53680000
57410000
61887500
70842500
75320000
80692500
87140000
94875000
0

View File

@ -616,67 +616,69 @@
//-- Petti Tail Noodle <-- GN_MIX_COOKING Lv1, Mix Cook Book, 1 Melange Pot, 2 Petti Tail, 1 Fine Noodle, 1 Cool Gravy //-- Petti Tail Noodle <-- GN_MIX_COOKING Lv1, Mix Cook Book, 1 Melange Pot, 2 Petti Tail, 1 Fine Noodle, 1 Cool Gravy
245,12434,27,2495,1,11022,0,6248,1,6260,2,6261,1,6262,1 245,12434,27,2495,1,11022,0,6248,1,6260,2,6261,1,6262,1
//---- Create Bomb --- ItemLV=28 --------------- //---- Create Bomb --- ItemLV=28 --------------- Removed skill (free slot)
//-- Apple Bomb <-- GN_MAKEBOMB Lv1, Apple Bomb CB, 1 Apple, 1 Scell, 1 Detonator, 1 Gun Powder
246,13260,28,2496,1,6279,0,512,1,911,1,1051,1,6244,1
//-- Coconut Bomb <-- GN_MAKEBOMB Lv1, Coconut Bomb CB, 1 Detonator, 1 Coconut Fruit, 2 Gun Powder
247,13261,28,2496,1,6281,0,1051,1,6263,1,6244,2
//-- Melon Bomb <-- GN_MAKEBOMB Lv1, Melon Bomb CB, 1 Sticky Mucus, 1 Detonator, 2 Gun Powder, 1 Melon
248,13262,28,2496,1,6282,0,938,1,1051,1,6244,2,6264,1
//-- Pineapple Bomb <-- GN_MAKEBOMB Lv1, Pinepple Bomb CB, 1 Cactus Needle, 1 Detonator, 3 Gun Powder, 1 Pineapple
249,13263,28,2496,1,6280,0,952,1,1051,1,6244,3,6265,1
//-- Banana Bomb <-- GN_MAKEBOMB Lv1, Banana Bomb CB, 1 Banana, 1 Detonator, 4 Gun Powder, 1 Mould Powder
250,13264,28,2496,1,6283,0,513,1,1051,1,6244,4,7001,1
//---- Special Pharmacy --- ItemLV=29 ---------- //---- Special Pharmacy --- ItemLV=29 ----------
//-- Seed Of Horny Plant <-- GN_S_PHARMACY Lv1, Plant Genetic Grow, 10 Prickly Fruit //-- Seed Of Horny Plant <-- GN_S_PHARMACY Lv1, Plant Genetic Grow, 10 Prickly Fruit
251,6210,29,2497,1,6284,0,576,10 246,6210,29,2497,1,6284,0,576,10
//-- Bloodsuck Plant Seed <-- GN_S_PHARMACY Lv1, Plant Genetic Grow, 10 Root Of Maneater //-- Bloodsuck Plant Seed <-- GN_S_PHARMACY Lv1, Plant Genetic Grow, 10 Root Of Maneater
252,6211,29,2497,1,6284,0,1033,10 247,6211,29,2497,1,6284,0,1033,10
//-- Bomb Mushroom Spore <-- GN_S_PHARMACY Lv1, Plant Genetic Grow, 10 Mushroom Spore, 2 Gun Powder, 5 Poison Spore //-- Bomb Mushroom Spore <-- GN_S_PHARMACY Lv1, Plant Genetic Grow, 10 Mushroom Spore, 2 Gun Powder, 5 Poison Spore
253,6212,29,2497,1,6284,0,921,10,6244,2,7033,5 248,6212,29,2497,1,6284,0,921,10,6244,2,7033,5
//-- HP Increase Potion (Small) <-- GN_S_PHARMACY Lv1, Increase Stamina Study, 10 White Herb, 5 Monster's Feed, 10 Empty Bottle, 1 Hot Sauce //-- HP Increase Potion (Small) <-- GN_S_PHARMACY Lv1, Increase Stamina Study, 10 White Herb, 5 Monster's Feed, 10 Empty Bottle, 1 Hot Sauce
254,12422,29,2497,1,11023,0,509,10,528,5,713,10,7455,1 249,12422,29,2497,1,11023,0,509,10,528,5,713,10,7455,1
//-- HP Increase Potion (Medium) <-- GN_S_PHARMACY Lv1, Increase Stamina Study, 10 Yellow Herb, 10 White Herb, 10 Empty Bottle, 1 Hot Sauce //-- HP Increase Potion (Medium) <-- GN_S_PHARMACY Lv1, Increase Stamina Study, 10 Yellow Herb, 10 White Herb, 10 Empty Bottle, 1 Hot Sauce
255,12423,29,2497,1,11023,0,508,10,509,10,713,10,7455,1 250,12423,29,2497,1,11023,0,508,10,509,10,713,10,7455,1
//-- HP Increase Potion (Large) <-- GN_S_PHARMACY Lv1, Increase Stamina Study, 15 White Herb, 3 Fruit Of Mastela, 1 Holy Water, 10 Empty Bottle, 1 Hot Sauce //-- HP Increase Potion (Large) <-- GN_S_PHARMACY Lv1, Increase Stamina Study, 15 White Herb, 3 Fruit Of Mastela, 1 Holy Water, 10 Empty Bottle, 1 Hot Sauce
256,12424,29,2497,1,11023,0,509,15,522,3,523,1,713,10,7455,1 251,12424,29,2497,1,11023,0,509,15,522,3,523,1,713,10,7455,1
//-- SP Increase Potion (Small) <-- GN_S_PHARMACY Lv1, Vital Drink CB, 10 Grape, 10 Lemon, 10 Empty Bottle, 1 Sweet Sauce //-- SP Increase Potion (Small) <-- GN_S_PHARMACY Lv1, Vital Drink CB, 10 Grape, 10 Lemon, 10 Empty Bottle, 1 Sweet Sauce
257,12425,29,2497,1,11024,0,514,10,568,10,713,10,7453,1 252,12425,29,2497,1,11024,0,514,10,568,10,713,10,7453,1
//-- SP Increase Potion (Medium) <-- GN_S_PHARMACY Lv1, Vital Drink CB, 10 Blue Herb, 10 Honey, 10 Empty Bottle, 1 Sweet Sauce //-- SP Increase Potion (Medium) <-- GN_S_PHARMACY Lv1, Vital Drink CB, 10 Blue Herb, 10 Honey, 10 Empty Bottle, 1 Sweet Sauce
258,12426,29,2497,1,11024,0,510,10,518,10,713,10,7453,1 253,12426,29,2497,1,11024,0,510,10,518,10,713,10,7453,1
//-- SP Increase Potion (Large) <-- GN_S_PHARMACY Lv1, Vital Drink CB, 15 Blue Herb, 10 Royal Jelly, 10 Empty Bottle, 1 Sweet Sauce //-- SP Increase Potion (Large) <-- GN_S_PHARMACY Lv1, Vital Drink CB, 15 Blue Herb, 10 Royal Jelly, 10 Empty Bottle, 1 Sweet Sauce
259,12427,29,2497,1,11024,0,510,15,526,10,713,10,7453,1 254,12427,29,2497,1,11024,0,510,15,526,10,713,10,7453,1
//-- Enrich White Potion Z <-- GN_S_PHARMACY Lv1, Quality Potion Book, 20 White Potion, 10 White Herb, 1 Alchol, 10 Empty Cylinder //-- Enrich White Potion Z <-- GN_S_PHARMACY Lv1, Quality Potion Book, 20 White Potion, 10 White Herb, 1 Alchol, 10 Empty Cylinder
260,12428,29,2497,1,6285,0,504,20,509,10,970,1,1092,10 255,12428,29,2497,1,6285,0,504,20,509,10,970,1,1092,10
//-- Vitata 500 <-- GN_S_PHARMACY Lv1, Quality Potion Book, 10 Blue Herb, 10 Grape, 10 Honey, 10 Empty Cylinder //-- Vitata 500 <-- GN_S_PHARMACY Lv1, Quality Potion Book, 10 Blue Herb, 10 Grape, 10 Honey, 10 Empty Cylinder
261,12436,29,2497,1,6285,0,510,10,514,10,518,10,1092,10 256,12436,29,2497,1,6285,0,510,10,514,10,518,10,1092,10
//-- Enrich Celermine Juice <-- GN_S_PHARMACY Lv1, Quality Potion Book, 5 Center Potion, 5 Awakening Potion, 10 Empty Cylinder, 5 Hot Sauce //-- Enrich Celermine Juice <-- GN_S_PHARMACY Lv1, Quality Potion Book, 5 Center Potion, 5 Awakening Potion, 10 Empty Cylinder, 5 Hot Sauce
262,12437,29,2497,1,6285,0,645,5,656,5,1092,10,7455,5 257,12437,29,2497,1,6285,0,645,5,656,5,1092,10,7455,5
//-- Cure Free <-- GN_S_PHARMACY Lv1, Quality Potion Book, 20 Green Herb, 1 Fruit Of Mastela, 5 Panacea, 1 Leaf Of Yggdrasil, 10 Empty Cylinder //-- Cure Free <-- GN_S_PHARMACY Lv1, Quality Potion Book, 20 Green Herb, 1 Fruit Of Mastela, 5 Panacea, 1 Leaf Of Yggdrasil, 10 Empty Cylinder
263,12475,29,2497,1,6285,0,511,20,522,1,525,5,610,1,1092,10 258,12475,29,2497,1,6285,0,511,20,522,1,525,5,610,1,1092,10
//-- Golden X <-- GN_S_PHARMACY Lvl, 10 Empty Testtube, 10 Yggdrasilberry, 5 Gold
//259,100231,29,2497,1,1092,10,607,10,969,5
//-- Red Herb Activator <-- GN_S_PHARMACY Lvl, 10 Empty Testtube, 45 Red Herb, 5 Yggdrasil Seed
//260,100232,29,2497,1,1092,10,507,45,608,5
//-- Blue Herb Activator <-- GN_S_PHARMACY Lvl, 10 Empty Testtube, 15 Blue Herb, 5 Yggdrasil Seed
//261,100233,29,2497,1,1092,10,510,15,608,5
//-- Concentrated Red Syrup Potion <-- GN_S_PHARMACY Lvl, 10 Empty Testtube, 10 Empty Potion Bottle, 15 Red Syrup
//262,1100003,29,2497,1,1092,10,1093,10,11621,15
//-- Concentrated Blue Syrup Potion <-- GN_S_PHARMACY Lvl, 10 Empty Testtube, 10 Empty Potion Bottle, 15 Blue Syrup
//263,1100004,29,2497,1,1092,10,1093,10,11624,15
//-- Concentrated Golden Syrup Potion <-- GN_S_PHARMACY Lvl, 10 Empty Testtube, 10 Empty Potion Bottle, 15 White Syrup, 15 Yellow Syrup
//264,1100005,29,2497,1,1092,10,1093,10,11623,15,11622,15
//=============================================== //===============================================
//--------------------LEVEL 30----------- //--------------------LEVEL 30-----------
// Novice Red Potion (569) <-- 2 Red Herbs, 1 Apple // Novice Red Potion (569) <-- 2 Red Herbs, 1 Apple
264,569,30,0,0,11058,0,507,2,512,1 265,569,30,0,0,11058,0,507,2,512,1
// Novice Magnifier (12325) <-- 3 Fine-grained Trunk, 1 Jellopy // Novice Magnifier (12325) <-- 3 Fine-grained Trunk, 1 Jellopy
265,12325,30,0,0,11058,0,1066,3,909,1 266,12325,30,0,0,11058,0,1066,3,909,1
// Novice Fly Wing (12323) <-- 2 Fluffs, 2 Feathers, 2 Jellopies // Novice Fly Wing (12323) <-- 2 Fluffs, 2 Feathers, 2 Jellopies
266,12323,30,0,0,11058,0,914,2,949,2,909,2 267,12323,30,0,0,11058,0,914,2,949,2,909,2
// Novice Cutter (13040) <-- 10 Shells, 10 Worm Peelings, 1 Phracon // Novice Cutter (13040) <-- 10 Shells, 10 Worm Peelings, 1 Phracon
267,13040,30,0,0,11058,0,935,10,955,10,1010,1 268,13040,30,0,0,11058,0,935,10,955,10,1010,1
// Little Unripe Apple (12846) <-- 1 Apple, 1 Green Herb // Little Unripe Apple (12846) <-- 1 Apple, 1 Green Herb
268,12846,30,0,0,11058,0,512,1,511,1 269,12846,30,0,0,11058,0,512,1,511,1
// Four Leaf Clover (706) <-- 200 Clovers, 200 Sticky Mucus // Four Leaf Clover (706) <-- 200 Clovers, 200 Sticky Mucus
269,706,30,0,0,11058,0,705,200,938,200 270,706,30,0,0,11058,0,705,200,938,200
// Banana Juice (532) <-- 1 Banana, 1 Milk // Banana Juice (532) <-- 1 Banana, 1 Milk
270,532,30,0,0,11058,0,513,1,519,1 271,532,30,0,0,11058,0,513,1,519,1
// Apple Juice (531) <-- 1 Apple, 1 Milk // Apple Juice (531) <-- 1 Apple, 1 Milk
271,531,30,0,0,11058,0,512,1,519,1 272,531,30,0,0,11058,0,512,1,519,1
// Carrot Juice (534) <-- 1 Carrot, 1 Milk // Carrot Juice (534) <-- 1 Carrot, 1 Milk
272,534,30,0,0,11058,0,515,1,519,1 273,534,30,0,0,11058,0,515,1,519,1
// Grape Juice (533) <-- 1 Grape, 1 Milk // Grape Juice (533) <-- 1 Grape, 1 Milk
273,533,30,0,0,11058,0,514,1,519,1 274,533,30,0,0,11058,0,514,1,519,1
// Unripe Apple (619) <-- 10 Sticky Mucus, 20 Green Herbs, 10 Apples // Unripe Apple (619) <-- 10 Sticky Mucus, 20 Green Herbs, 10 Apples
274,619,30,0,0,11058,0,938,10,511,20,512,10 275,619,30,0,0,11058,0,938,10,511,20,512,10

File diff suppressed because it is too large Load Diff

View File

@ -56,7 +56,6 @@
395,4 //CG_MOONLIT 395,4 //CG_MOONLIT
409,4 //WE_CALLPARENT 409,4 //WE_CALLPARENT
410,4 //WE_CALLBABY 410,4 //WE_CALLBABY
491,4 //CR_CULTIVATION
530,4 //NJ_KIRIKAGE 530,4 //NJ_KIRIKAGE
691,4 //CASH_ASSUMPTIO 691,4 //CASH_ASSUMPTIO
2284,4 //SC_FATALMENACE 2284,4 //SC_FATALMENACE
@ -79,7 +78,6 @@
395,8 //CG_MOONLIT 395,8 //CG_MOONLIT
409,8 //WE_CALLPARENT 409,8 //WE_CALLPARENT
410,8 //WE_CALLBABY 410,8 //WE_CALLBABY
491,8 //CR_CULTIVATION
411,8 //TK_RUN 411,8 //TK_RUN
426,8 //TK_HIGHJUMP 426,8 //TK_HIGHJUMP
427,8 //SG_FEEL 427,8 //SG_FEEL
@ -132,7 +130,6 @@
409,16 // WE_CALLPARENT 409,16 // WE_CALLPARENT
410,16 // WE_CALLBABY 410,16 // WE_CALLBABY
426,16 // TK_HIGHJUMP 426,16 // TK_HIGHJUMP
491,16 // CR_CULTIVATION
529,16 // NJ_SHADOWJUMP 529,16 // NJ_SHADOWJUMP
// 530,16 // NJ_KIRIKAGE // 530,16 // NJ_KIRIKAGE
691,16 // CASH_ASSUMPTIO 691,16 // CASH_ASSUMPTIO
@ -219,11 +216,9 @@
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
232,2048 //AM_CANNIBALIZE 232,2048 //AM_CANNIBALIZE
233,2048 //AM_SPHEREMINE 233,2048 //AM_SPHEREMINE
491,2048 //CR_CULTIVATION
1013,2048 //BS_GREED 1013,2048 //BS_GREED
2419,2048 //WM_POEMOFNETHERWORLD 2419,2048 //WM_POEMOFNETHERWORLD
2482,2048 //GN_WALLOFTHORN 2482,2048 //GN_WALLOFTHORN
2493,2048 //GN_SLINGITEM
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
// Zone 8 - WOE:TE Dungeons // Zone 8 - WOE:TE Dungeons

View File

@ -1266,7 +1266,6 @@
4019,478,10,231,5,0,0,0,0,0,0,0,0 //CR_SLIMPITCHER#Aid Condensed Potion# 4019,478,10,231,5,0,0,0,0,0,0,0,0 //CR_SLIMPITCHER#Aid Condensed Potion#
4019,479,5,234,5,235,5,236,5,237,5,0,0 //CR_FULLPROTECTION#Full Protection# 4019,479,5,234,5,235,5,236,5,237,5,0,0 //CR_FULLPROTECTION#Full Protection#
4019,490,10,229,5,230,5,0,0,0,0,0,0 //CR_ACIDDEMONSTRATION#Acid Demonstration# 4019,490,10,229,5,230,5,0,0,0,0,0,0 //CR_ACIDDEMONSTRATION#Acid Demonstration#
4019,491,2,0,0,0,0,0,0,0,0,0,0 //CR_CULTIVATION#Cultivation#
4019,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby# 4019,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
4019,446,1,0,0,0,0,0,0,0,0,0,0 //AM_BERSERKPITCHER#Berserk Pitcher# 4019,446,1,0,0,0,0,0,0,0,0,0,0 //AM_BERSERKPITCHER#Berserk Pitcher#
4019,496,1,228,10,0,0,0,0,0,0,0,0 //AM_TWILIGHT1#Twilight Alchemy 1# 4019,496,1,228,10,0,0,0,0,0,0,0,0 //AM_TWILIGHT1#Twilight Alchemy 1#
@ -3434,10 +3433,8 @@
4071,2486,5,2485,3,0,0,0,0,0,0,0,0 //GN_FIRE_EXPANSION#Fire Expansion# 4071,2486,5,2485,3,0,0,0,0,0,0,0,0 //GN_FIRE_EXPANSION#Fire Expansion#
4071,2490,5,2480,3,0,0,0,0,0,0,0,0 //GN_HELLS_PLANT#Hell's Plant# 4071,2490,5,2480,3,0,0,0,0,0,0,0,0 //GN_HELLS_PLANT#Hell's Plant#
4071,2492,5,2490,3,0,0,0,0,0,0,0,0 //GN_MANDRAGORA#Howling of Mandragora# 4071,2492,5,2490,3,0,0,0,0,0,0,0,0 //GN_MANDRAGORA#Howling of Mandragora#
4071,2493,1,2494,1,0,0,0,0,0,0,0,0 //GN_SLINGITEM#Sling Item#
4071,2494,1,0,0,0,0,0,0,0,0,0,0 //GN_CHANGEMATERIAL#Change Material# 4071,2494,1,0,0,0,0,0,0,0,0,0,0 //GN_CHANGEMATERIAL#Change Material#
4071,2495,2,2497,1,0,0,0,0,0,0,0,0 //GN_MIX_COOKING#Mix Cooking# 4071,2495,2,2497,1,0,0,0,0,0,0,0,0 //GN_MIX_COOKING#Mix Cooking#
4071,2496,2,2495,1,0,0,0,0,0,0,0,0 //GN_MAKEBOMB#Create Bomb#
4071,2497,10,0,0,0,0,0,0,0,0,0,0 //GN_S_PHARMACY#Special Pharmacy# 4071,2497,10,0,0,0,0,0,0,0,0,0,0 //GN_S_PHARMACY#Special Pharmacy#
4071,5003,5,2497,1,0,0,0,0,0,0,0,0 //GN_ILLUSIONDOOPING#Hallucination Drug# 4071,5003,5,2497,1,0,0,0,0,0,0,0,0 //GN_ILLUSIONDOOPING#Hallucination Drug#
4071,5014,5,0,0,0,0,0,0,0,0,0,0 //ALL_FULL_THROTTLE#Full Throttle# 4071,5014,5,0,0,0,0,0,0,0,0,0,0 //ALL_FULL_THROTTLE#Full Throttle#
@ -3860,7 +3857,6 @@
4078,478,10,231,5,0,0,0,0,0,0,0,0 //CR_SLIMPITCHER#Aid Condensed Potion# 4078,478,10,231,5,0,0,0,0,0,0,0,0 //CR_SLIMPITCHER#Aid Condensed Potion#
4078,479,5,234,5,235,5,236,5,237,5,0,0 //CR_FULLPROTECTION#Full Protection# 4078,479,5,234,5,235,5,236,5,237,5,0,0 //CR_FULLPROTECTION#Full Protection#
4078,490,10,229,5,230,5,0,0,0,0,0,0 //CR_ACIDDEMONSTRATION#Acid Demonstration# 4078,490,10,229,5,230,5,0,0,0,0,0,0 //CR_ACIDDEMONSTRATION#Acid Demonstration#
4078,491,2,0,0,0,0,0,0,0,0,0,0 //CR_CULTIVATION#Cultivation#
4078,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby# 4078,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
4078,446,1,0,0,0,0,0,0,0,0,0,0 //AM_BERSERKPITCHER#Berserk Pitcher# 4078,446,1,0,0,0,0,0,0,0,0,0,0 //AM_BERSERKPITCHER#Berserk Pitcher#
4078,496,1,228,10,0,0,0,0,0,0,0,0 //AM_TWILIGHT1#Twilight Alchemy 1# 4078,496,1,228,10,0,0,0,0,0,0,0,0 //AM_TWILIGHT1#Twilight Alchemy 1#
@ -3880,10 +3876,8 @@
4078,2486,5,2485,3,0,0,0,0,0,0,0,0 //GN_FIRE_EXPANSION#Fire Expansion# 4078,2486,5,2485,3,0,0,0,0,0,0,0,0 //GN_FIRE_EXPANSION#Fire Expansion#
4078,2490,5,2480,3,0,0,0,0,0,0,0,0 //GN_HELLS_PLANT#Hell's Plant# 4078,2490,5,2480,3,0,0,0,0,0,0,0,0 //GN_HELLS_PLANT#Hell's Plant#
4078,2492,5,2490,3,0,0,0,0,0,0,0,0 //GN_MANDRAGORA#Howling of Mandragora# 4078,2492,5,2490,3,0,0,0,0,0,0,0,0 //GN_MANDRAGORA#Howling of Mandragora#
4078,2493,1,2494,1,0,0,0,0,0,0,0,0 //GN_SLINGITEM#Sling Item#
4078,2494,1,0,0,0,0,0,0,0,0,0,0 //GN_CHANGEMATERIAL#Change Material# 4078,2494,1,0,0,0,0,0,0,0,0,0,0 //GN_CHANGEMATERIAL#Change Material#
4078,2495,2,2497,1,0,0,0,0,0,0,0,0 //GN_MIX_COOKING#Mix Cooking# 4078,2495,2,2497,1,0,0,0,0,0,0,0,0 //GN_MIX_COOKING#Mix Cooking#
4078,2496,2,2495,1,0,0,0,0,0,0,0,0 //GN_MAKEBOMB#Create Bomb#
4078,2497,10,0,0,0,0,0,0,0,0,0,0 //GN_S_PHARMACY#Special Pharmacy# 4078,2497,10,0,0,0,0,0,0,0,0,0,0 //GN_S_PHARMACY#Special Pharmacy#
4078,5003,5,2497,1,0,0,0,0,0,0,0,0 //GN_ILLUSIONDOOPING#Hallucination Drug# 4078,5003,5,2497,1,0,0,0,0,0,0,0,0 //GN_ILLUSIONDOOPING#Hallucination Drug#
4078,5014,5,0,0,0,0,0,0,0,0,0,0 //ALL_FULL_THROTTLE#Full Throttle# 4078,5014,5,0,0,0,0,0,0,0,0,0,0 //ALL_FULL_THROTTLE#Full Throttle#
@ -5102,10 +5096,8 @@
4107,2486,5,2485,3,0,0,0,0,0,0,0,0 //GN_FIRE_EXPANSION#Fire Expansion# 4107,2486,5,2485,3,0,0,0,0,0,0,0,0 //GN_FIRE_EXPANSION#Fire Expansion#
4107,2490,5,2480,3,0,0,0,0,0,0,0,0 //GN_HELLS_PLANT#Hell's Plant# 4107,2490,5,2480,3,0,0,0,0,0,0,0,0 //GN_HELLS_PLANT#Hell's Plant#
4107,2492,5,2490,3,0,0,0,0,0,0,0,0 //GN_MANDRAGORA#Howling of Mandragora# 4107,2492,5,2490,3,0,0,0,0,0,0,0,0 //GN_MANDRAGORA#Howling of Mandragora#
4107,2493,1,2494,1,0,0,0,0,0,0,0,0 //GN_SLINGITEM#Sling Item#
4107,2494,1,0,0,0,0,0,0,0,0,0,0 //GN_CHANGEMATERIAL#Change Material# 4107,2494,1,0,0,0,0,0,0,0,0,0,0 //GN_CHANGEMATERIAL#Change Material#
4107,2495,2,2497,1,0,0,0,0,0,0,0,0 //GN_MIX_COOKING#Mix Cooking# 4107,2495,2,2497,1,0,0,0,0,0,0,0,0 //GN_MIX_COOKING#Mix Cooking#
4107,2496,2,2495,1,0,0,0,0,0,0,0,0 //GN_MAKEBOMB#Create Bomb#
4107,2497,10,0,0,0,0,0,0,0,0,0,0 //GN_S_PHARMACY#Special Pharmacy# 4107,2497,10,0,0,0,0,0,0,0,0,0,0 //GN_S_PHARMACY#Special Pharmacy#
4107,5003,5,2497,1,0,0,0,0,0,0,0,0 //GN_ILLUSIONDOOPING#Hallucination Drug# 4107,5003,5,2497,1,0,0,0,0,0,0,0,0 //GN_ILLUSIONDOOPING#Hallucination Drug#
4107,5014,5,0,0,0,0,0,0,0,0,0,0 //ALL_FULL_THROTTLE#Full Throttle# 4107,5014,5,0,0,0,0,0,0,0,0,0,0 //ALL_FULL_THROTTLE#Full Throttle#

View File

@ -1046,7 +1046,7 @@ bool battle_check_sc(struct block_list *src, struct block_list *target, struct s
status_change_end(target, SC_SAFETYWALL, INVALID_TIMER); status_change_end(target, SC_SAFETYWALL, INVALID_TIMER);
} }
if (sc->data[SC_NEUTRALBARRIER] && ((d->flag&(BF_LONG|BF_MAGIC)) == BF_LONG || skill_id == CR_ACIDDEMONSTRATION)) { if (sc->data[SC_NEUTRALBARRIER] && (d->flag&(BF_LONG|BF_MAGIC)) == BF_LONG) {
d->dmg_lv = ATK_MISS; d->dmg_lv = ATK_MISS;
return false; return false;
} }
@ -1350,7 +1350,7 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam
if (sc->data[SC_DEFENDER] && if (sc->data[SC_DEFENDER] &&
skill_id != NJ_ZENYNAGE && skill_id != KO_MUCHANAGE && skill_id != NJ_ZENYNAGE && skill_id != KO_MUCHANAGE &&
#ifdef RENEWAL #ifdef RENEWAL
((flag&(BF_LONG|BF_WEAPON)) == (BF_LONG|BF_WEAPON) || skill_id == CR_ACIDDEMONSTRATION || skill_id == GN_FIRE_EXPANSION_ACID)) ((flag&(BF_LONG|BF_WEAPON)) == (BF_LONG|BF_WEAPON) || skill_id == GN_FIRE_EXPANSION_ACID))
#else #else
(flag&(BF_LONG|BF_WEAPON)) == (BF_LONG|BF_WEAPON)) (flag&(BF_LONG|BF_WEAPON)) == (BF_LONG|BF_WEAPON))
#endif #endif
@ -3876,6 +3876,13 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
skillratio += 100 + 50 * skill_lv; skillratio += 100 + 50 * skill_lv;
#endif #endif
break; break;
#ifdef RENEWAL
case CR_ACIDDEMONSTRATION:
skillratio += -100 + 200 * skill_lv + sstatus->int_ + sstatus->vit; // !TODO: Confirm status bonus
if (target->type == BL_PC)
skillratio /= 2;
break;
#endif
case CG_ARROWVULCAN: case CG_ARROWVULCAN:
#ifdef RENEWAL #ifdef RENEWAL
skillratio += 400 + 100 * skill_lv; skillratio += 400 + 100 * skill_lv;
@ -4405,47 +4412,26 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
} }
break; break;
case GN_CARTCANNON: case GN_CARTCANNON:
// ATK [{( Cart Remodeling Skill Level x 50 ) x ( INT / 40 )} + ( Cart Cannon Skill Level x 60 )] % // ATK [{( INT / (6 - ( Cart Remodeling Skill Level ) )} + ( Cart Cannon Skill Level x 350 )] %
skillratio += -100 + 60 * skill_lv + ((sd) ? pc_checkskill(sd, GN_REMODELING_CART) : 1) * 50 * status_get_int(src) / 40; skillratio += -100 + 350 * skill_lv + sstatus->int_ / (6 - (sd ? pc_checkskill(sd, GN_REMODELING_CART) : 1));
RE_LVL_DMOD(100);
break; break;
case GN_SPORE_EXPLOSION: case GN_SPORE_EXPLOSION:
skillratio += -100 + 150 * skill_lv + 200 + status_get_int(src); if (wd->miscflag & 2048)
skillratio += 200; // Target
skillratio += -100 + 180 * skill_lv + sstatus->int_;
RE_LVL_DMOD(100); RE_LVL_DMOD(100);
break; break;
case GN_WALLOFTHORN: case GN_WALLOFTHORN:
skillratio += 10 * skill_lv; skillratio += 10 * skill_lv;
break; break;
case GN_CRAZYWEED_ATK: case GN_CRAZYWEED_ATK:
skillratio += 400 + 100 * skill_lv; skillratio += -100 + 700 + 100 * skill_lv;
RE_LVL_DMOD(100);
break; break;
case GN_SLINGITEM_RANGEMELEEATK: case GN_HELLS_PLANT_ATK:
if( sd ) { skillratio += -100 + 500 * skill_lv + sstatus->int_ * (10 - (sd ? pc_checkskill(sd, AM_CANNIBALIZE) : 0)); // !TODO: Confirm INT and Cannibalize bonus
switch( sd->itemid ) { RE_LVL_DMOD(100);
case ITEMID_APPLE_BOMB:
skillratio += 200 + status_get_str(src) + status_get_dex(src);
break;
case ITEMID_COCONUT_BOMB:
case ITEMID_PINEAPPLE_BOMB:
skillratio += 700 + status_get_str(src) + status_get_dex(src);
break;
case ITEMID_MELON_BOMB:
skillratio += 400 + status_get_str(src) + status_get_dex(src);
break;
case ITEMID_BANANA_BOMB:
skillratio += 777 + status_get_str(src) + status_get_dex(src);
break;
case ITEMID_BLACK_LUMP:
skillratio += -100 + (status_get_str(src) + status_get_agi(src) + status_get_dex(src)) / 3;
break;
case ITEMID_BLACK_HARD_LUMP:
skillratio += -100 + (status_get_str(src) + status_get_agi(src) + status_get_dex(src)) / 2;
break;
case ITEMID_VERY_HARD_LUMP:
skillratio += -100 + status_get_str(src) + status_get_agi(src) + status_get_dex(src);
break;
}
RE_LVL_DMOD(100);
}
break; break;
// Physical Elemantal Spirits Attack Skills // Physical Elemantal Spirits Attack Skills
case EL_CIRCLE_OF_FIRE: case EL_CIRCLE_OF_FIRE:
@ -4503,28 +4489,22 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
skillratio += -100 + 20 * skill_lv; skillratio += -100 + 20 * skill_lv;
break; break;
case MH_NEEDLE_OF_PARALYZE: case MH_NEEDLE_OF_PARALYZE:
skillratio += 600 + 100 * skill_lv; skillratio += -100 + 300 * skill_lv * status_get_lv(src) / 100 + sstatus->dex; // !TODO: Confirm Base Level and DEX bonus
break; break;
case MH_STAHL_HORN: case MH_STAHL_HORN:
skillratio += 400 + 100 * skill_lv * status_get_lv(src) / 150; skillratio += 900 + 100 * skill_lv * status_get_lv(src) / 150 + sstatus->vit; // !TODO: Confirm VIT bonus
break; break;
case MH_LAVA_SLIDE: case MH_LAVA_SLIDE:
skillratio += -100 + 70 * skill_lv; skillratio += -100 + 70 * skill_lv;
break; break;
case MH_SONIC_CRAW: case MH_SONIC_CRAW:
skillratio += -100 + 40 * skill_lv * status_get_lv(src) / 150; skillratio += -100 + 60 * skill_lv * status_get_lv(src) / 150;
break; break;
case MH_SILVERVEIN_RUSH: case MH_SILVERVEIN_RUSH:
skillratio += -100 + 150 * skill_lv * status_get_lv(src) / 100; skillratio += -100 + 250 * skill_lv * status_get_lv(src) / 100 + sstatus->str; // !TODO: Confirm STR bonus
break; break;
case MH_MIDNIGHT_FRENZY: case MH_MIDNIGHT_FRENZY:
skillratio += -100 + 300 * skill_lv * status_get_lv(src) / 150; skillratio += -100 + 350 * skill_lv * status_get_lv(src) / 150 + sstatus->str; // !TODO: Confirm STR bonus
break;
case MH_TINDER_BREAKER:
skillratio += -100 + (100 * skill_lv + 3 * status_get_str(src)) * status_get_lv(src) / 120;
break;
case MH_CBC:
skillratio += 300 * skill_lv + 4 * status_get_lv(src);
break; break;
case MH_MAGMA_FLOW: case MH_MAGMA_FLOW:
skillratio += -100 + (100 * skill_lv + 3 * status_get_lv(src)) * status_get_lv(src) / 120; skillratio += -100 + (100 * skill_lv + 3 * status_get_lv(src)) * status_get_lv(src) / 120;
@ -5746,7 +5726,16 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl
} else } else
ATK_ADD(wd.damage, wd.damage2, (sstatus->sp * (1 + skill_lv * 2 / 10)) + 10 * status_get_lv(src)); ATK_ADD(wd.damage, wd.damage2, (sstatus->sp * (1 + skill_lv * 2 / 10)) + 10 * status_get_lv(src));
} }
break; break;
case MH_TINDER_BREAKER:
ATK_ADD(wd.damage, wd.damage2, 2500 * skill_lv + status_get_lv(src)); // !TODO: Confirm base level bonus
break;
case MH_CBC:
ATK_ADD(wd.damage, wd.damage2, 4000 * skill_lv + status_get_lv(src)); // !TODO: Confirm base level bonus
break;
case MH_EQC:
ATK_ADD(wd.damage, wd.damage2, 6000 * skill_lv + status_get_lv(src)); // !TODO: Confirm base level bonus
break;
} }
if(sd) { if(sd) {
@ -5799,7 +5788,6 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl
switch(skill_id) { switch(skill_id) {
case NJ_ISSEN: case NJ_ISSEN:
case ASC_BREAKER: case ASC_BREAKER:
case CR_ACIDDEMONSTRATION:
case GN_FIRE_EXPANSION_ACID: case GN_FIRE_EXPANSION_ACID:
break; //These skills will do a card fix later break; //These skills will do a card fix later
default: default:
@ -5820,7 +5808,6 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl
switch (skill_id) { switch (skill_id) {
case MC_CARTREVOLUTION: case MC_CARTREVOLUTION:
case MO_INVESTIGATE: case MO_INVESTIGATE:
case CR_ACIDDEMONSTRATION:
case SR_GATEOFHELL: case SR_GATEOFHELL:
case GN_FIRE_EXPANSION_ACID: case GN_FIRE_EXPANSION_ACID:
case KO_BAKURETSU: case KO_BAKURETSU:
@ -5882,7 +5869,6 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl
switch (skill_id) { switch (skill_id) {
case NJ_ISSEN: case NJ_ISSEN:
case ASC_BREAKER: case ASC_BREAKER:
case CR_ACIDDEMONSTRATION:
case GN_FIRE_EXPANSION_ACID: case GN_FIRE_EXPANSION_ACID:
return wd; //These skills will do a GVG fix later return wd; //These skills will do a GVG fix later
default: default:
@ -6481,17 +6467,11 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
skillratio += 1100; skillratio += 1100;
break; break;
case MH_ERASER_CUTTER: case MH_ERASER_CUTTER:
skillratio += 400 + 100 * skill_lv + (skill_lv%2 > 0 ? 0 : 300);
break;
case MH_XENO_SLASHER: case MH_XENO_SLASHER:
if(skill_lv%2) skillratio += -100 + 350 * skill_lv * status_get_lv(src) / 100 + sstatus->int_; // !TODO: Confirm Base Level and INT bonus
skillratio += 350 + 50 * skill_lv; //500:600:700
else
skillratio += 400 + 100 * skill_lv; //700:900
break; break;
case MH_HEILIGE_STANGE: case MH_HEILIGE_STANGE:
skillratio += 400 + 250 * skill_lv; skillratio += -100 + 1000 + 250 * skill_lv * status_get_lv(src) / 150 + sstatus->vit; // !TODO: Confirm VIT bonus
skillratio = (skillratio * status_get_lv(src)) / 150;
break; break;
case MH_POISON_MIST: case MH_POISON_MIST:
skillratio += -100 + 40 * skill_lv * status_get_lv(src) / 100; skillratio += -100 + 40 * skill_lv * status_get_lv(src) / 100;
@ -6548,7 +6528,6 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
} }
#ifdef RENEWAL #ifdef RENEWAL
switch(skill_id) { // These skills will do a card fix later switch(skill_id) { // These skills will do a card fix later
case CR_ACIDDEMONSTRATION:
case ASC_BREAKER: case ASC_BREAKER:
break; break;
default: default:
@ -6686,7 +6665,6 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
#ifdef RENEWAL #ifdef RENEWAL
switch(skill_id) { switch(skill_id) {
case ASC_BREAKER: case ASC_BREAKER:
case CR_ACIDDEMONSTRATION:
return ad; //These skills will do a GVG fix later return ad; //These skills will do a GVG fix later
} }
#endif #endif
@ -6886,7 +6864,6 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list *
md.damage = 0; md.damage = 0;
} }
break; break;
case CR_ACIDDEMONSTRATION:
case GN_FIRE_EXPANSION_ACID: case GN_FIRE_EXPANSION_ACID:
#ifdef RENEWAL #ifdef RENEWAL
// Official Renewal formula [helvetica] // Official Renewal formula [helvetica]
@ -6979,19 +6956,12 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list *
case GN_THORNS_TRAP: case GN_THORNS_TRAP:
md.damage = 100 + 200 * skill_lv + status_get_int(src); md.damage = 100 + 200 * skill_lv + status_get_int(src);
break; break;
case GN_HELLS_PLANT_ATK:
//[{( Hell Plant Skill Level x Casters Base Level ) x 10 } + {( Casters INT x 7 ) / 2 } x { 18 + ( Casters Job Level / 4 )] x ( 5 / ( 10 - Summon Flora Skill Level ))
md.damage = skill_lv * status_get_lv(src) * 10 + status_get_int(src) * 7 / 2 * (18 + (sd ? sd->status.job_level : 0) / 4) * 5 / (10 - (sd ? pc_checkskill(sd, AM_CANNIBALIZE) : 0));
break;
case RL_B_TRAP: case RL_B_TRAP:
// kRO 2014-02-12: Damage: Caster's DEX, Target's current HP, Skill Level // kRO 2014-02-12: Damage: Caster's DEX, Target's current HP, Skill Level
md.damage = status_get_dex(src) * 10 + (skill_lv * 3 * status_get_hp(target)) / 100; md.damage = status_get_dex(src) * 10 + (skill_lv * 3 * status_get_hp(target)) / 100;
if (status_bl_has_mode(target, MD_STATUS_IMMUNE)) if (status_bl_has_mode(target, MD_STATUS_IMMUNE))
md.damage /= 10; md.damage /= 10;
break; break;
case MH_EQC:
md.damage = max(tstatus->hp - sstatus->hp, 0);
break;
case NPC_MAXPAIN_ATK: case NPC_MAXPAIN_ATK:
if (ssc && ssc->data[SC_MAXPAIN]) if (ssc && ssc->data[SC_MAXPAIN])
md.damage = ssc->data[SC_MAXPAIN]->val2; md.damage = ssc->data[SC_MAXPAIN]->val2;
@ -8907,6 +8877,7 @@ static const struct _battle_data {
{ "hom_idle_no_share", &battle_config.hom_idle_no_share, 0, 0, INT_MAX, }, { "hom_idle_no_share", &battle_config.hom_idle_no_share, 0, 0, INT_MAX, },
{ "devotion_standup_fix", &battle_config.devotion_standup_fix, 1, 0, 1, }, { "devotion_standup_fix", &battle_config.devotion_standup_fix, 1, 0, 1, },
{ "feature.bgqueue", &battle_config.feature_bgqueue, 1, 0, 1, }, { "feature.bgqueue", &battle_config.feature_bgqueue, 1, 0, 1, },
{ "homunculus_exp_gain", &battle_config.homunculus_exp_gain, 10, 0, 100, },
#include "../custom/battle_config_init.inc" #include "../custom/battle_config_init.inc"
}; };

View File

@ -673,6 +673,7 @@ struct Battle_Config
int hom_idle_no_share; int hom_idle_no_share;
int devotion_standup_fix; int devotion_standup_fix;
int feature_bgqueue; int feature_bgqueue;
int homunculus_exp_gain;
#include "../custom/battle_config_struct.inc" #include "../custom/battle_config_struct.inc"
}; };

View File

@ -1606,7 +1606,7 @@ void read_homunculus_expdb(void)
if (fp == NULL) { if (fp == NULL) {
if (i != 0) if (i != 0)
continue; continue;
ShowError("Can't read %s\n",line); ShowError("read_homunculus_expdb: Can't read %s\n",line);
return; return;
} }
while (fgets(line, sizeof(line), fp) && j < MAX_LEVEL) { while (fgets(line, sizeof(line), fp) && j < MAX_LEVEL) {
@ -1618,7 +1618,7 @@ void read_homunculus_expdb(void)
break; break;
} }
if (hexptbl[MAX_LEVEL - 1]) { // Last permitted level have to be 0! if (hexptbl[MAX_LEVEL - 1]) { // Last permitted level have to be 0!
ShowWarning("read_hexptbl: Reached max level in %s [%d]. Remaining lines were not read.\n ",path,MAX_LEVEL); ShowWarning("read_homunculus_expdb: Reached max level in %s [%d]. Remaining lines were not read.\n ",path,MAX_LEVEL);
hexptbl[MAX_LEVEL - 1] = 0; hexptbl[MAX_LEVEL - 1] = 0;
} }
fclose(fp); fclose(fp);

View File

@ -176,21 +176,10 @@ enum genetic_item_list
ITEMID_VITATA500, ITEMID_VITATA500,
ITEMID_CONCENTRATED_CEROMAIN_SOUP, ITEMID_CONCENTRATED_CEROMAIN_SOUP,
ITEMID_CURE_FREE = 12475, ITEMID_CURE_FREE = 12475,
ITEMID_APPLE_BOMB = 13260, ITEMID_BLACK_LUMP = 13265,
ITEMID_COCONUT_BOMB,
ITEMID_MELON_BOMB,
ITEMID_PINEAPPLE_BOMB,
ITEMID_BANANA_BOMB,
ITEMID_BLACK_LUMP,
ITEMID_BLACK_HARD_LUMP, ITEMID_BLACK_HARD_LUMP,
ITEMID_VERY_HARD_LUMP, ITEMID_VERY_HARD_LUMP,
ITEMID_MYSTERIOUS_POWDER, ITEMID_MYSTERIOUS_POWDER,
ITEMID_HP_INC_POTS_TO_THROW = 13275,
ITEMID_HP_INC_POTM_TO_THROW,
ITEMID_HP_INC_POTL_TO_THROW,
ITEMID_SP_INC_POTS_TO_THROW,
ITEMID_SP_INC_POTM_TO_THROW,
ITEMID_SP_INC_POTL_TO_THROW,
}; };
///Guillotine Cross ///Guillotine Cross

View File

@ -489,6 +489,8 @@ int map_moveblock(struct block_list *bl, int x1, int y1, t_tick tick)
skill_unit_move_unit_group(skill_id2group(sc->data[SC_WARM]->val4), bl->m, x1-x0, y1-y0); skill_unit_move_unit_group(skill_id2group(sc->data[SC_WARM]->val4), bl->m, x1-x0, y1-y0);
if (sc->data[SC_BANDING]) if (sc->data[SC_BANDING])
skill_unit_move_unit_group(skill_id2group(sc->data[SC_BANDING]->val4), bl->m, x1-x0, y1-y0); skill_unit_move_unit_group(skill_id2group(sc->data[SC_BANDING]->val4), bl->m, x1-x0, y1-y0);
if (sc->data[SC_HELLS_PLANT])
skill_unit_move_unit_group(skill_id2group(sc->data[SC_HELLS_PLANT]->val4), bl->m, x1-x0, y1-y0);
if (sc->data[SC_NEUTRALBARRIER_MASTER]) if (sc->data[SC_NEUTRALBARRIER_MASTER])
skill_unit_move_unit_group(skill_id2group(sc->data[SC_NEUTRALBARRIER_MASTER]->val2), bl->m, x1-x0, y1-y0); skill_unit_move_unit_group(skill_id2group(sc->data[SC_NEUTRALBARRIER_MASTER]->val2), bl->m, x1-x0, y1-y0);

View File

@ -2607,7 +2607,11 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type)
base_exp = (unsigned int)cap_value(exp, 1, UINT_MAX); base_exp = (unsigned int)cap_value(exp, 1, UINT_MAX);
} }
if (map_getmapflag(m, MF_NOJOBEXP) || !md->db->job_exp || md->dmglog[i].flag == MDLF_HOMUN) //Homun earned job-exp is always lost. if (map_getmapflag(m, MF_NOJOBEXP) || !md->db->job_exp
#ifndef RENEWAL
|| md->dmglog[i].flag == MDLF_HOMUN // Homun earned job-exp is always lost.
#endif
)
job_exp = 0; job_exp = 0;
else { else {
double exp = apply_rate2(md->db->job_exp, per, 1); double exp = apply_rate2(md->db->job_exp, per, 1);
@ -2648,8 +2652,13 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type)
flag = 0; flag = 0;
} }
} }
if(base_exp && md->dmglog[i].flag == MDLF_HOMUN) //tmpsd[i] is null if it has no homunc. #ifdef RENEWAL
if (base_exp && tmpsd[i] && tmpsd[i]->hd)
hom_gainexp(tmpsd[i]->hd, base_exp * battle_config.homunculus_exp_gain / 100); // Homunculus only receive 10% of EXP
#else
if (base_exp && md->dmglog[i].flag == MDLF_HOMUN) //tmpsd[i] is null if it has no homunc.
hom_gainexp(tmpsd[i]->hd, base_exp); hom_gainexp(tmpsd[i]->hd, base_exp);
#endif
if(flag) { if(flag) {
if(base_exp || job_exp) { if(base_exp || job_exp) {
if( md->dmglog[i].flag != MDLF_PET || battle_config.pet_attack_exp_to_master ) { if( md->dmglog[i].flag != MDLF_PET || battle_config.pet_attack_exp_to_master ) {

View File

@ -10415,6 +10415,10 @@ BUILDIN_FUNC(getexp)
job = (int) cap_value(job * bonus, 0, INT_MAX); job = (int) cap_value(job * bonus, 0, INT_MAX);
pc_gainexp(sd, NULL, base, job, 1); pc_gainexp(sd, NULL, base, job, 1);
#ifdef RENEWAL
if (base && sd->hd)
hom_gainexp(sd->hd, base * battle_config.homunculus_exp_gain / 100); // Homunculus only receive 10% of EXP
#endif
return SCRIPT_CMD_SUCCESS; return SCRIPT_CMD_SUCCESS;
} }

View File

@ -1575,6 +1575,7 @@
export_constant(SC_USE_SKILL_SP_SHA); export_constant(SC_USE_SKILL_SP_SHA);
export_constant(SC_SP_SHA); export_constant(SC_SP_SHA);
export_constant(SC_SOULCURSE); export_constant(SC_SOULCURSE);
export_constant(SC_HELLS_PLANT);
#ifdef RENEWAL #ifdef RENEWAL
export_constant(SC_EXTREMITYFIST2); export_constant(SC_EXTREMITYFIST2);
#endif #endif

View File

@ -446,8 +446,6 @@ unsigned short skill_dummy2skill_id(unsigned short skill_id) {
return GN_CRAZYWEED; return GN_CRAZYWEED;
case GN_HELLS_PLANT_ATK: case GN_HELLS_PLANT_ATK:
return GN_HELLS_PLANT; return GN_HELLS_PLANT;
case GN_SLINGITEM_RANGEMELEEATK:
return GN_SLINGITEM;
case RL_R_TRIP_PLUSATK: case RL_R_TRIP_PLUSATK:
return RL_R_TRIP; return RL_R_TRIP;
case NPC_MAXPAIN_ATK: case NPC_MAXPAIN_ATK:
@ -1869,31 +1867,9 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1
case SO_VARETYR_SPEAR: case SO_VARETYR_SPEAR:
sc_start(src,bl, SC_STUN, 5 * skill_lv, skill_lv, skill_get_time(skill_id, skill_lv)); sc_start(src,bl, SC_STUN, 5 * skill_lv, skill_lv, skill_get_time(skill_id, skill_lv));
break; break;
case GN_SLINGITEM_RANGEMELEEATK:
if( sd ) {
switch( sd->itemid ) { // Starting SCs here instead of do it in skill_additional_effect to simplify the code.
case ITEMID_COCONUT_BOMB:
sc_start(src,bl, SC_STUN, 5 + sd->status.job_level / 2, skill_lv, 1000 * sd->status.job_level / 3);
sc_start2(src,bl, SC_BLEEDING, 3 + sd->status.job_level / 2, skill_lv, src->id, 1000 * status_get_lv(src) / 4 + sd->status.job_level / 3);
break;
case ITEMID_MELON_BOMB:
sc_start4(src, bl, SC_MELON_BOMB, 100, skill_lv, 20 + sd->status.job_level, 10 + sd->status.job_level / 2, 0, 1000 * status_get_lv(src) / 4);
break;
case ITEMID_BANANA_BOMB:
{
uint16 duration = (battle_config.banana_bomb_duration ? battle_config.banana_bomb_duration : 1000 * sd->status.job_level / 4);
sc_start(src,bl, SC_BANANA_BOMB_SITDOWN, status_get_lv(src) + sd->status.job_level + sstatus->dex / 6 - status_get_lv(bl) - tstatus->agi / 4 - tstatus->luk / 5, skill_lv, duration);
sc_start(src,bl, SC_BANANA_BOMB, 100, skill_lv, 30000);
break;
}
}
sd->itemid = -1;
}
break;
case GN_HELLS_PLANT_ATK: case GN_HELLS_PLANT_ATK:
sc_start(src,bl, SC_STUN, 20 + 10 * skill_lv, skill_lv, skill_get_time2(skill_id, skill_lv)); sc_start(src,bl, SC_STUN, 20 + 10 * skill_lv, skill_lv, skill_get_time(skill_id, skill_lv));
sc_start2(src,bl, SC_BLEEDING, 5 + 5 * skill_lv, skill_lv, src->id,skill_get_time2(skill_id, skill_lv)); sc_start2(src,bl, SC_BLEEDING, 5 + 5 * skill_lv, skill_lv, src->id,skill_get_time(skill_id, skill_lv));
break; break;
case EL_WIND_SLASH: // Non confirmed rate. case EL_WIND_SLASH: // Non confirmed rate.
sc_start2(src,bl, SC_BLEEDING, 25, skill_lv, src->id, skill_get_time(skill_id,skill_lv)); sc_start2(src,bl, SC_BLEEDING, 25, skill_lv, src->id, skill_get_time(skill_id,skill_lv));
@ -1934,23 +1910,13 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1
} }
break; break;
case MH_LAVA_SLIDE: case MH_LAVA_SLIDE:
sc_start4(src,bl, SC_BURNING, 10 * skill_lv, skill_lv, 1000, src->id, 0, skill_get_time2(skill_id, skill_lv)); sc_start4(src,bl, SC_BURNING, 5 * skill_lv, skill_lv, 1000, src->id, 0, skill_get_time2(skill_id, skill_lv));
break; break;
case MH_STAHL_HORN: case MH_STAHL_HORN:
sc_start(src,bl, SC_STUN, (20 + 4 * (skill_lv-1)), skill_lv, skill_get_time(skill_id, skill_lv)); sc_start(src,bl, SC_STUN, 20 + 2 * skill_lv, skill_lv, skill_get_time(skill_id, skill_lv));
break; break;
case MH_NEEDLE_OF_PARALYZE: case MH_NEEDLE_OF_PARALYZE:
sc_start(src,bl, SC_PARALYSIS, 40 + (5*skill_lv), skill_lv, skill_get_time(skill_id, skill_lv)); sc_start(src,bl, SC_PARALYSIS, 30 + 5 * skill_lv, skill_lv, skill_get_time(skill_id, skill_lv));
break;
case MH_SILVERVEIN_RUSH:
sc_start4(src,bl,SC_STUN,20 + (5*skill_lv),skill_lv,src->id,0,0,skill_get_time(skill_id,skill_lv));
break;
case MH_MIDNIGHT_FRENZY:
{
TBL_HOM *hd = BL_CAST(BL_HOM,src);
int spiritball = (hd?hd->homunculus.spiritball:1);
sc_start4(src,bl,SC_FEAR,spiritball*(10+2*skill_lv),skill_lv,src->id,0,0,skill_get_time(skill_id,skill_lv));
}
break; break;
case MH_XENO_SLASHER: case MH_XENO_SLASHER:
sc_start4(src, bl, SC_BLEEDING, skill_lv, skill_lv, src->id, 0, 0, skill_get_time2(skill_id, skill_lv)); sc_start4(src, bl, SC_BLEEDING, skill_lv, skill_lv, src->id, 0, 0, skill_get_time2(skill_id, skill_lv));
@ -3579,12 +3545,6 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
else // the central target doesn't display an animation else // the central target doesn't display an animation
dmg.dmotion = clif_skill_damage(dsrc,bl,tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -2, DMG_SPLASH); // needs -2(!) as skill level dmg.dmotion = clif_skill_damage(dsrc,bl,tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -2, DMG_SPLASH); // needs -2(!) as skill level
break; break;
case GN_SPORE_EXPLOSION:
if (flag&SD_ANIMATION)
dmg.dmotion = clif_skill_damage(dsrc, bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, NV_BASIC, -1, DMG_SPLASH);
else
dmg.dmotion = clif_skill_damage(dsrc, bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -2, DMG_SPLASH);
break;
case WL_HELLINFERNO: case WL_HELLINFERNO:
case SR_EARTHSHAKER: case SR_EARTHSHAKER:
dmg.dmotion = clif_skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,1,skill_id,-2,DMG_SINGLE); dmg.dmotion = clif_skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,1,skill_id,-2,DMG_SINGLE);
@ -3632,15 +3592,13 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
case EL_HURRICANE_ATK: case EL_HURRICANE_ATK:
case KO_BAKURETSU: case KO_BAKURETSU:
case GN_CRAZYWEED_ATK: case GN_CRAZYWEED_ATK:
case GN_HELLS_PLANT_ATK:
case SU_SV_ROOTTWIST_ATK: case SU_SV_ROOTTWIST_ATK:
dmg.dmotion = clif_skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,skill_id,-1,DMG_SPLASH); dmg.dmotion = clif_skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,skill_id,-1,DMG_SPLASH);
break; break;
case GN_FIRE_EXPANSION_ACID: case GN_FIRE_EXPANSION_ACID:
dmg.dmotion = clif_skill_damage(dsrc, bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, CR_ACIDDEMONSTRATION, skill_lv, DMG_MULTI_HIT); dmg.dmotion = clif_skill_damage(dsrc, bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, CR_ACIDDEMONSTRATION, skill_lv, DMG_MULTI_HIT);
break; break;
case GN_SLINGITEM_RANGEMELEEATK:
dmg.dmotion = clif_skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,GN_SLINGITEM,-2,DMG_SINGLE);
break;
case EL_STONE_RAIN: case EL_STONE_RAIN:
dmg.dmotion = clif_skill_damage(dsrc,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,skill_id,-1,(flag&1)?DMG_MULTI_HIT:DMG_SPLASH); dmg.dmotion = clif_skill_damage(dsrc,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,skill_id,-1,(flag&1)?DMG_MULTI_HIT:DMG_SPLASH);
break; break;
@ -3967,7 +3925,6 @@ static int skill_check_unit_range_sub(struct block_list *bl, va_list ap)
case NPC_REVERBERATION: case NPC_REVERBERATION:
case WM_REVERBERATION: case WM_REVERBERATION:
case GN_THORNS_TRAP: case GN_THORNS_TRAP:
case GN_HELLS_PLANT:
case RL_B_TRAP: case RL_B_TRAP:
case SC_ESCAPE: case SC_ESCAPE:
//Non stackable on themselves and traps (including venom dust which does not has the trap inf2 set) //Non stackable on themselves and traps (including venom dust which does not has the trap inf2 set)
@ -4044,7 +4001,6 @@ static int skill_check_unit_range2 (struct block_list *bl, int x, int y, uint16
range = 2; range = 2;
break; break;
case SC_MANHOLE: case SC_MANHOLE:
case GN_HELLS_PLANT:
range = 0; range = 0;
break; break;
default: { default: {
@ -4844,6 +4800,9 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
case NPC_PETRIFYATTACK: case NPC_PETRIFYATTACK:
case NPC_CURSEATTACK: case NPC_CURSEATTACK:
case NPC_SLEEPATTACK: case NPC_SLEEPATTACK:
#ifdef RENEWAL
case CR_ACIDDEMONSTRATION:
#endif
case LK_AURABLADE: case LK_AURABLADE:
case LK_SPIRALPIERCE: case LK_SPIRALPIERCE:
case ML_SPIRALPIERCE: case ML_SPIRALPIERCE:
@ -4905,7 +4864,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
case SR_GENTLETOUCH_QUIET: case SR_GENTLETOUCH_QUIET:
case WM_SEVERE_RAINSTORM_MELEE: case WM_SEVERE_RAINSTORM_MELEE:
case WM_GREAT_ECHO: case WM_GREAT_ECHO:
case GN_SLINGITEM_RANGEMELEEATK:
case KO_SETSUDAN: case KO_SETSUDAN:
case RL_MASS_SPIRAL: case RL_MASS_SPIRAL:
case RL_BANISHING_BUSTER: case RL_BANISHING_BUSTER:
@ -5228,6 +5186,13 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
if( skill_area_temp[1] != bl->id && !inf2[INF2_ISNPC] ) if( skill_area_temp[1] != bl->id && !inf2[INF2_ISNPC] )
sflag |= SD_ANIMATION; // original target gets no animation (as well as all NPC skills) sflag |= SD_ANIMATION; // original target gets no animation (as well as all NPC skills)
switch (skill_id) {
case GN_SPORE_EXPLOSION:
if (flag&2 && skill_area_temp[1] == bl->id)
sflag |= 2048; // Flag for main target
break;
}
// If a enemy player is standing next to a mob when splash Es- skill is casted, the player won't get hurt. // If a enemy player is standing next to a mob when splash Es- skill is casted, the player won't get hurt.
if ((skill_id == SP_SHA || skill_id == SP_SWHOO) && !battle_config.allow_es_magic_pc && bl->type != BL_MOB) if ((skill_id == SP_SHA || skill_id == SP_SWHOO) && !battle_config.allow_es_magic_pc && bl->type != BL_MOB)
break; break;
@ -5293,7 +5258,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
//SD_LEVEL -> Forced splash damage for Auto Blitz-Beat -> count targets //SD_LEVEL -> Forced splash damage for Auto Blitz-Beat -> count targets
//special case: Venom Splasher uses a different range for searching than for splashing //special case: Venom Splasher uses a different range for searching than for splashing
if( flag&SD_LEVEL || skill_get_nk(skill_id, NK_SPLASHSPLIT) ) if( flag&SD_LEVEL || skill_get_nk(skill_id, NK_SPLASHSPLIT) )
skill_area_temp[0] = map_foreachinallrange(skill_area_sub, bl, (skill_id == AS_SPLASHER || skill_id == GN_SPORE_EXPLOSION)?1:skill_get_splash(skill_id, skill_lv), BL_CHAR, src, skill_id, skill_lv, tick, BCT_ENEMY, skill_area_sub_count); skill_area_temp[0] = map_foreachinallrange(skill_area_sub, bl, (skill_id == AS_SPLASHER)?1:skill_get_splash(skill_id, skill_lv), BL_CHAR, src, skill_id, skill_lv, tick, BCT_ENEMY, skill_area_sub_count);
// recursive invocation of skill_castend_damage_id() with flag|1 // recursive invocation of skill_castend_damage_id() with flag|1
map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), starget, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill_castend_damage_id); map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), starget, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill_castend_damage_id);
@ -5574,8 +5539,8 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
case SN_FALCONASSAULT: case SN_FALCONASSAULT:
#ifndef RENEWAL #ifndef RENEWAL
case PA_PRESSURE: case PA_PRESSURE:
#endif
case CR_ACIDDEMONSTRATION: case CR_ACIDDEMONSTRATION:
#endif
case TF_THROWSTONE: case TF_THROWSTONE:
#ifdef RENEWAL #ifdef RENEWAL
case ASC_BREAKER: case ASC_BREAKER:
@ -5584,7 +5549,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
case GS_FLING: case GS_FLING:
case NJ_ZENYNAGE: case NJ_ZENYNAGE:
case GN_THORNS_TRAP: case GN_THORNS_TRAP:
case GN_HELLS_PLANT_ATK:
case RL_B_TRAP: case RL_B_TRAP:
skill_attack(BF_MISC,src,src,bl,skill_id,skill_lv,tick,flag); skill_attack(BF_MISC,src,src,bl,skill_id,skill_lv,tick,flag);
break; break;
@ -6223,16 +6187,12 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
case MH_CBC: case MH_CBC:
case MH_EQC: case MH_EQC:
{ {
int duration = 0;
TBL_HOM *hd = BL_CAST(BL_HOM,src); TBL_HOM *hd = BL_CAST(BL_HOM,src);
duration = max(skill_lv,(status_get_str(src)/7 - status_get_str(bl)/10))*1000; //Yommy formula int duration = max(skill_lv, (status_get_str(src) / 7 - status_get_str(bl) / 10)) * 1000; //Yommy formula
if (skill_id == MH_TINDER_BREAKER && unit_movepos(src, bl->x, bl->y, 1, 1)) { if (skill_id == MH_TINDER_BREAKER && unit_movepos(src, bl->x, bl->y, 1, 1)) {
clif_blown(src); clif_blown(src);
clif_skill_poseffect(src,skill_id,skill_lv,bl->x,bl->y,tick); clif_skill_poseffect(src,skill_id,skill_lv,bl->x,bl->y,tick);
} else if (skill_id == MH_EQC && status_bl_has_mode(bl, MD_STATUS_IMMUNE)) {
clif_skill_fail(hd->master, skill_id, USESKILL_FAIL_TOTARGET, 0);
break;
} }
clif_skill_nodamage(src,bl,skill_id,skill_lv, clif_skill_nodamage(src,bl,skill_id,skill_lv,
sc_start4(src,bl,status_skill2sc(skill_id),100,skill_lv,src->id,0,0,duration)); sc_start4(src,bl,status_skill2sc(skill_id),100,skill_lv,src->id,0,0,duration));
@ -11090,7 +11050,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
break; break;
case GN_SPORE_EXPLOSION: case GN_SPORE_EXPLOSION:
clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);
sc_start4(src, bl, type, 100, skill_lv, skill_id, src->id, skill_get_time(skill_id, skill_lv), skill_get_time(skill_id, skill_lv)); skill_castend_damage_id(src, bl, skill_id, skill_lv, tick, flag|1|2); // First attack to target
sc_start4(src, bl, type, 100, skill_lv, skill_id, src->id, 0, skill_get_time(skill_id, skill_lv));
break; break;
case GN_MANDRAGORA: case GN_MANDRAGORA:
if( flag&1 ) { if( flag&1 ) {
@ -11109,63 +11070,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
clif_skill_nodamage(src,src,skill_id,skill_lv,1); clif_skill_nodamage(src,src,skill_id,skill_lv,1);
} }
break; break;
case GN_SLINGITEM:
if( sd ) {
int ammo_id;
i = sd->equip_index[EQI_AMMO];
if( i < 0 )
break; // No ammo.
ammo_id = sd->inventory_data[i]->nameid;
if( ammo_id <= 0 )
break;
sd->itemid = ammo_id;
if( itemdb_group_item_exists(IG_BOMB, ammo_id) ) {
if(battle_check_target(src,bl,BCT_ENEMY) > 0) {// Only attack if the target is an enemy.
if( ammo_id == ITEMID_PINEAPPLE_BOMB )
map_foreachincell(skill_area_sub,bl->m,bl->x,bl->y,BL_CHAR,src,GN_SLINGITEM_RANGEMELEEATK,skill_lv,tick,flag|BCT_ENEMY|1,skill_castend_damage_id);
else
skill_attack(BF_WEAPON,src,src,bl,GN_SLINGITEM_RANGEMELEEATK,skill_lv,tick,flag);
} else //Otherwise, it fails, shows animation and removes items.
clif_skill_fail(sd,GN_SLINGITEM_RANGEMELEEATK,USESKILL_FAIL,0);
} else if (itemdb_group_item_exists(IG_THROWABLE, ammo_id)) {
switch (ammo_id) {
case ITEMID_HP_INC_POTS_TO_THROW: // MaxHP +(500 + Thrower BaseLv * 10 / 3) and heals 1% MaxHP
sc_start2(src, bl, SC_PROMOTE_HEALTH_RESERCH, 100, 2, 1, 500000);
status_percent_heal(bl, 1, 0);
break;
case ITEMID_HP_INC_POTM_TO_THROW: // MaxHP +(1500 + Thrower BaseLv * 10 / 3) and heals 2% MaxHP
sc_start2(src, bl, SC_PROMOTE_HEALTH_RESERCH, 100, 2, 2, 500000);
status_percent_heal(bl, 2, 0);
break;
case ITEMID_HP_INC_POTL_TO_THROW: // MaxHP +(2500 + Thrower BaseLv * 10 / 3) and heals 5% MaxHP
sc_start2(src, bl, SC_PROMOTE_HEALTH_RESERCH, 100, 2, 3, 500000);
status_percent_heal(bl, 5, 0);
break;
case ITEMID_SP_INC_POTS_TO_THROW: // MaxSP +(Thrower BaseLv / 10 - 5)% and recovers 2% MaxSP
sc_start2(src, bl, SC_ENERGY_DRINK_RESERCH, 100, 2, 1, 500000);
status_percent_heal(bl, 0, 2);
break;
case ITEMID_SP_INC_POTM_TO_THROW: // MaxSP +(Thrower BaseLv / 10)% and recovers 4% MaxSP
sc_start2(src, bl, SC_ENERGY_DRINK_RESERCH, 100, 2, 2, 500000);
status_percent_heal(bl, 0, 4);
break;
case ITEMID_SP_INC_POTL_TO_THROW: // MaxSP +(Thrower BaseLv / 10 + 5)% and recovers 8% MaxSP
sc_start2(src, bl, SC_ENERGY_DRINK_RESERCH, 100, 2, 3, 500000);
status_percent_heal(bl, 0, 8);
break;
default:
if (dstsd)
run_script(sd->inventory_data[i]->script, 0, dstsd->bl.id, fake_nd->bl.id);
break;
}
}
}
clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
clif_skill_nodamage(src,bl,skill_id,skill_lv,1);// This packet is received twice actually, I think it is to show the animation.
break;
case GN_MIX_COOKING: case GN_MIX_COOKING:
case GN_MAKEBOMB:
case GN_S_PHARMACY: case GN_S_PHARMACY:
if( sd ) { if( sd ) {
int qty = 1; int qty = 1;
@ -11173,7 +11078,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
sd->skill_lv_old = skill_lv; sd->skill_lv_old = skill_lv;
if( skill_id != GN_S_PHARMACY && skill_lv > 1 ) if( skill_id != GN_S_PHARMACY && skill_lv > 1 )
qty = 10; qty = 10;
clif_cooking_list(sd,(skill_id - GN_MIX_COOKING) + 27,skill_id,qty,skill_id==GN_MAKEBOMB?5:6); clif_cooking_list(sd,(skill_id - GN_MIX_COOKING) + 27,skill_id,qty,6);
clif_skill_nodamage(src,bl,skill_id,skill_lv,1); clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
} }
break; break;
@ -11412,8 +11317,6 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
struct block_list *s_bl = battle_get_master(src); struct block_list *s_bl = battle_get_master(src);
if(s_bl) sc_start(src, s_bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv)); if(s_bl) sc_start(src, s_bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv));
sc_start2(src, src, type, 100, skill_lv, hd->homunculus.level, skill_get_time(skill_id, skill_lv)); sc_start2(src, src, type, 100, skill_lv, hd->homunculus.level, skill_get_time(skill_id, skill_lv));
hd->homunculus.intimacy = hom_intimacy_grade2intimacy(HOMGRADE_NEUTRAL); //change to neutral
if(sd) clif_send_homdata(sd, SP_INTIMATE, hd->homunculus.intimacy/100); //refresh intimacy info
skill_blockhomun_start(hd, skill_id, skill_get_cooldown(skill_id, skill_lv)); skill_blockhomun_start(hd, skill_id, skill_get_cooldown(skill_id, skill_lv));
} }
break; break;
@ -12523,7 +12426,6 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
case SO_PSYCHIC_WAVE: case SO_PSYCHIC_WAVE:
case SO_VACUUM_EXTREME: case SO_VACUUM_EXTREME:
case GN_THORNS_TRAP: case GN_THORNS_TRAP:
case GN_HELLS_PLANT:
case SO_EARTHGRAVE: case SO_EARTHGRAVE:
case SO_DIAMONDDUST: case SO_DIAMONDDUST:
case SO_FIRE_INSIGNIA: case SO_FIRE_INSIGNIA:
@ -13070,6 +12972,12 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
} }
break; break;
case GN_HELLS_PLANT:
skill_clear_unitgroup(src);
if ((sg = skill_unitsetting(src, skill_id, skill_lv, src->x, src->y, 0)) != nullptr)
sc_start4(src, src, type, 100, skill_lv, 0, 0, sg->group_id, skill_get_time(skill_id, skill_lv));
break;
case SO_FIREWALK: case SO_FIREWALK:
case SO_ELECTRICWALK: case SO_ELECTRICWALK:
if( sc && sc->data[type] ) if( sc && sc->data[type] )
@ -13512,9 +13420,6 @@ struct skill_unit_group *skill_unitsetting(struct block_list *src, uint16 skill_
break; break;
case WZ_QUAGMIRE: //The target changes to "all" if used in a gvg map. [Skotlex] case WZ_QUAGMIRE: //The target changes to "all" if used in a gvg map. [Skotlex]
case AM_DEMONSTRATION: case AM_DEMONSTRATION:
case GN_HELLS_PLANT:
if( skill_id == GN_HELLS_PLANT && map_getcell(src->m, x, y, CELL_CHKLANDPROTECTOR) )
return NULL;
if (battle_config.vs_traps_bctall && (src->type&battle_config.vs_traps_bctall) && map_flag_vs(src->m)) if (battle_config.vs_traps_bctall && (src->type&battle_config.vs_traps_bctall) && map_flag_vs(src->m))
target = BCT_ALL; target = BCT_ALL;
break; break;
@ -14913,12 +14818,8 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, t_t
break; break;
case UNT_HELLS_PLANT: case UNT_HELLS_PLANT:
if ((tsc && tsc->data[SC__MANHOLE]) || status_isimmune(bl))
break;
if( battle_check_target(&unit->bl,bl,BCT_ENEMY) > 0 ) if( battle_check_target(&unit->bl,bl,BCT_ENEMY) > 0 )
skill_attack(skill_get_type(GN_HELLS_PLANT_ATK), ss, &unit->bl, bl, GN_HELLS_PLANT_ATK, sg->skill_lv, tick, SCSTART_NONE); skill_attack(skill_get_type(GN_HELLS_PLANT_ATK), ss, &unit->bl, bl, GN_HELLS_PLANT_ATK, sg->skill_lv, tick, SCSTART_NONE);
if( ss != bl) // The caster is the only one who can step on the Plants without destroying them
sg->limit = DIFF_TICK(tick, sg->tick) + 100;
break; break;
case UNT_ZEPHYR: case UNT_ZEPHYR:
@ -15646,7 +15547,6 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i
} }
break; break;
case GN_MIX_COOKING: case GN_MIX_COOKING:
case GN_MAKEBOMB:
case GN_S_PHARMACY: case GN_S_PHARMACY:
case GN_CHANGEMATERIAL: case GN_CHANGEMATERIAL:
if( sd->menuskill_id != skill_id ) if( sd->menuskill_id != skill_id )
@ -16673,7 +16573,6 @@ bool skill_check_condition_castend(struct map_session_data* sd, uint16 skill_id,
} }
break; break;
case GN_MIX_COOKING: case GN_MIX_COOKING:
case GN_MAKEBOMB:
case GN_S_PHARMACY: case GN_S_PHARMACY:
case GN_CHANGEMATERIAL: case GN_CHANGEMATERIAL:
if( sd->menuskill_id != skill_id ) if( sd->menuskill_id != skill_id )
@ -18325,7 +18224,7 @@ static int skill_cell_overlap(struct block_list *bl, va_list ap)
std::shared_ptr<s_skill_db> skill = skill_db.find(unit->group->skill_id); std::shared_ptr<s_skill_db> skill = skill_db.find(unit->group->skill_id);
//It deletes everything except traps and barriers //It deletes everything except traps and barriers
if ((!skill->inf2[INF2_ISTRAP] && !skill->inf2[INF2_IGNORELANDPROTECTOR]) || unit->group->skill_id == WZ_FIREPILLAR || unit->group->skill_id == GN_HELLS_PLANT) { if ((!skill->inf2[INF2_ISTRAP] && !skill->inf2[INF2_IGNORELANDPROTECTOR]) || unit->group->skill_id == WZ_FIREPILLAR) {
if (skill->unit_flag[UF_RANGEDSINGLEUNIT]) { if (skill->unit_flag[UF_RANGEDSINGLEUNIT]) {
if (unit->val2&(1 << UF_RANGEDSINGLEUNIT)) if (unit->val2&(1 << UF_RANGEDSINGLEUNIT))
skill_delunitgroup(unit->group); skill_delunitgroup(unit->group);
@ -19146,11 +19045,15 @@ int skill_delunitgroup_(struct skill_unit_group *group, const char* file, int li
case SG_SUN_WARM: case SG_SUN_WARM:
case SG_MOON_WARM: case SG_MOON_WARM:
case SG_STAR_WARM: case SG_STAR_WARM:
case LG_BANDING:
case GN_HELLS_PLANT:
{ {
struct status_change *sc = NULL; status_change *sc = status_get_sc(src);
if( (sc = status_get_sc(src)) != NULL && sc->data[SC_WARM] ) { sc_type type = status_skill2sc(group->skill_id);
sc->data[SC_WARM]->val4 = 0;
status_change_end(src, SC_WARM, INVALID_TIMER); if (sc && sc->data[type]) {
sc->data[type]->val4 = 0;
status_change_end(src, type, INVALID_TIMER);
} }
} }
break; break;
@ -19176,15 +19079,6 @@ int skill_delunitgroup_(struct skill_unit_group *group, const char* file, int li
} }
} }
break; break;
case LG_BANDING:
{
struct status_change *sc = NULL;
if( (sc = status_get_sc(src)) && sc->data[SC_BANDING] ) {
sc->data[SC_BANDING]->val4 = 0;
status_change_end(src,SC_BANDING,INVALID_TIMER);
}
}
break;
} }
if (src->type==BL_PC && group->state.ammo_consume) if (src->type==BL_PC && group->state.ammo_consume)
@ -20058,7 +19952,7 @@ bool skill_produce_mix(struct map_session_data *sd, uint16 skill_id, unsigned sh
} while( j >= 0 && x > 0 ); } while( j >= 0 && x > 0 );
} }
if ((equip = (itemdb_isequip(nameid) && skill_id != GN_CHANGEMATERIAL && skill_id != GN_MAKEBOMB ))) if ((equip = (itemdb_isequip(nameid) && skill_id != GN_CHANGEMATERIAL )))
wlv = itemdb_wlv(nameid); wlv = itemdb_wlv(nameid);
if (!equip) { if (!equip) {
@ -20201,7 +20095,6 @@ bool skill_produce_mix(struct map_session_data *sd, uint16 skill_id, unsigned sh
case ITEMID_SP_INCREASE_POTION_MEDIUM: case ITEMID_SP_INCREASE_POTION_MEDIUM:
difficulty += 15; difficulty += 15;
break; break;
case ITEMID_BANANA_BOMB:
case ITEMID_HP_INCREASE_POTION_MEDIUM: case ITEMID_HP_INCREASE_POTION_MEDIUM:
case ITEMID_SP_INCREASE_POTION_LARGE: case ITEMID_SP_INCREASE_POTION_LARGE:
case ITEMID_VITATA500: case ITEMID_VITATA500:
@ -20231,7 +20124,6 @@ bool skill_produce_mix(struct map_session_data *sd, uint16 skill_id, unsigned sh
make_per = 10000; make_per = 10000;
} }
break; break;
case GN_MAKEBOMB:
case GN_MIX_COOKING: case GN_MIX_COOKING:
{ {
int difficulty = 30 + rnd()%120; // Random number between (30 ~ 150) int difficulty = 30 + rnd()%120; // Random number between (30 ~ 150)
@ -20240,25 +20132,14 @@ bool skill_produce_mix(struct map_session_data *sd, uint16 skill_id, unsigned sh
qty = ~(5 + rnd()%5) + 1; qty = ~(5 + rnd()%5) + 1;
switch(nameid){// difficulty factor switch(nameid){// difficulty factor
case ITEMID_APPLE_BOMB:
difficulty += 5;
break;
case ITEMID_COCONUT_BOMB:
case ITEMID_MELON_BOMB:
difficulty += 10;
break;
case ITEMID_SAVAGE_FULL_ROAST: case ITEMID_SAVAGE_FULL_ROAST:
case ITEMID_COCKTAIL_WARG_BLOOD: case ITEMID_COCKTAIL_WARG_BLOOD:
case ITEMID_MINOR_STEW: case ITEMID_MINOR_STEW:
case ITEMID_SIROMA_ICED_TEA: case ITEMID_SIROMA_ICED_TEA:
case ITEMID_DROSERA_HERB_SALAD: case ITEMID_DROSERA_HERB_SALAD:
case ITEMID_PETITE_TAIL_NOODLES: case ITEMID_PETITE_TAIL_NOODLES:
case ITEMID_PINEAPPLE_BOMB:
difficulty += 15; difficulty += 15;
break; break;
case ITEMID_BANANA_BOMB:
difficulty += 20;
break;
} }
if( make_per >= 30 && make_per > difficulty) if( make_per >= 30 && make_per > difficulty)
@ -20381,7 +20262,7 @@ bool skill_produce_mix(struct map_session_data *sd, uint16 skill_id, unsigned sh
tmp_item.amount = 0; tmp_item.amount = 0;
for (i = 0; i < qty; i++) { //Apply quantity modifiers. for (i = 0; i < qty; i++) { //Apply quantity modifiers.
if ((skill_id == GN_MIX_COOKING || skill_id == GN_MAKEBOMB || skill_id == GN_S_PHARMACY) && make_per > 1) { if ((skill_id == GN_MIX_COOKING || skill_id == GN_S_PHARMACY) && make_per > 1) {
tmp_item.amount = qty; tmp_item.amount = qty;
break; break;
} }
@ -20484,7 +20365,7 @@ bool skill_produce_mix(struct map_session_data *sd, uint16 skill_id, unsigned sh
map_addflooritem(&tmp_item,tmp_item.amount,sd->bl.m,sd->bl.x,sd->bl.y,0,0,0,0,0); map_addflooritem(&tmp_item,tmp_item.amount,sd->bl.m,sd->bl.x,sd->bl.y,0,0,0,0,0);
} }
} }
if (skill_id == GN_MIX_COOKING || skill_id == GN_MAKEBOMB || skill_id == GN_S_PHARMACY) { if (skill_id == GN_MIX_COOKING || skill_id == GN_S_PHARMACY) {
clif_produceeffect(sd,6,nameid); clif_produceeffect(sd,6,nameid);
clif_misceffect(&sd->bl,5); clif_misceffect(&sd->bl,5);
clif_msg_skill(sd,skill_id,ITEM_PRODUCE_SUCCESS); clif_msg_skill(sd,skill_id,ITEM_PRODUCE_SUCCESS);
@ -20548,7 +20429,6 @@ bool skill_produce_mix(struct map_session_data *sd, uint16 skill_id, unsigned sh
clif_msg_skill(sd,skill_id,ITEM_PRODUCE_FAIL); clif_msg_skill(sd,skill_id,ITEM_PRODUCE_FAIL);
} }
break; break;
case GN_MAKEBOMB:
case GN_S_PHARMACY: case GN_S_PHARMACY:
case GN_CHANGEMATERIAL: case GN_CHANGEMATERIAL:
clif_produceeffect(sd,7,nameid); clif_produceeffect(sd,7,nameid);

View File

@ -962,6 +962,7 @@ void initChangeTables(void)
set_sc( GN_SPORE_EXPLOSION , SC_SPORE_EXPLOSION , EFST_SPORE_EXPLOSION, SCB_NONE ); set_sc( GN_SPORE_EXPLOSION , SC_SPORE_EXPLOSION , EFST_SPORE_EXPLOSION, SCB_NONE );
set_sc( GN_FIRE_EXPANSION_SMOKE_POWDER , SC_SMOKEPOWDER , EFST_FIRE_EXPANSION_SMOKE_POWDER, SCB_FLEE ); set_sc( GN_FIRE_EXPANSION_SMOKE_POWDER , SC_SMOKEPOWDER , EFST_FIRE_EXPANSION_SMOKE_POWDER, SCB_FLEE );
set_sc( GN_FIRE_EXPANSION_TEAR_GAS , SC_TEARGAS , EFST_FIRE_EXPANSION_TEAR_GAS , SCB_HIT|SCB_FLEE ); set_sc( GN_FIRE_EXPANSION_TEAR_GAS , SC_TEARGAS , EFST_FIRE_EXPANSION_TEAR_GAS , SCB_HIT|SCB_FLEE );
add_sc( GN_HELLS_PLANT , SC_HELLS_PLANT );
set_sc( GN_MANDRAGORA , SC_MANDRAGORA , EFST_MANDRAGORA , SCB_INT ); set_sc( GN_MANDRAGORA , SC_MANDRAGORA , EFST_MANDRAGORA , SCB_INT );
set_sc_with_vfx( GN_ILLUSIONDOPING , SC_ILLUSIONDOPING , EFST_ILLUSIONDOPING , SCB_HIT ); set_sc_with_vfx( GN_ILLUSIONDOPING , SC_ILLUSIONDOPING , EFST_ILLUSIONDOPING , SCB_HIT );
@ -1622,8 +1623,6 @@ void initChangeTables(void)
StatusChangeStateTable[SC_STOP] |= SCS_NOMOVE; StatusChangeStateTable[SC_STOP] |= SCS_NOMOVE;
StatusChangeStateTable[SC_CLOSECONFINE] |= SCS_NOMOVE; StatusChangeStateTable[SC_CLOSECONFINE] |= SCS_NOMOVE;
StatusChangeStateTable[SC_CLOSECONFINE2] |= SCS_NOMOVE; StatusChangeStateTable[SC_CLOSECONFINE2] |= SCS_NOMOVE;
StatusChangeStateTable[SC_TINDER_BREAKER] |= SCS_NOMOVE;
StatusChangeStateTable[SC_TINDER_BREAKER2] |= SCS_NOMOVE;
StatusChangeStateTable[SC_MADNESSCANCEL] |= SCS_NOMOVE; StatusChangeStateTable[SC_MADNESSCANCEL] |= SCS_NOMOVE;
#ifndef RENEWAL #ifndef RENEWAL
StatusChangeStateTable[SC_GRAVITATION] |= SCS_NOMOVE|SCS_NOMOVECOND; StatusChangeStateTable[SC_GRAVITATION] |= SCS_NOMOVE|SCS_NOMOVECOND;
@ -6760,8 +6759,6 @@ static signed short status_calc_flee(struct block_list *bl, struct status_change
return cap_value(flee,1,SHRT_MAX); return cap_value(flee,1,SHRT_MAX);
if(sc->data[SC_OVERED_BOOST]) //Should be final and unmodifiable by any means if(sc->data[SC_OVERED_BOOST]) //Should be final and unmodifiable by any means
return sc->data[SC_OVERED_BOOST]->val2; return sc->data[SC_OVERED_BOOST]->val2;
if(sc->data[SC_TINDER_BREAKER] || sc->data[SC_TINDER_BREAKER2])
return 1; // 1 = min flee
// Fixed value // Fixed value
if(sc->data[SC_INCFLEE]) if(sc->data[SC_INCFLEE])
@ -6828,6 +6825,8 @@ static signed short status_calc_flee(struct block_list *bl, struct status_change
flee -= flee * (40 + 10 * sc->data[SC_SATURDAYNIGHTFEVER]->val1) / 100; flee -= flee * (40 + 10 * sc->data[SC_SATURDAYNIGHTFEVER]->val1) / 100;
if( sc->data[SC_WIND_STEP_OPTION] ) if( sc->data[SC_WIND_STEP_OPTION] )
flee += flee * sc->data[SC_WIND_STEP_OPTION]->val2 / 100; flee += flee * sc->data[SC_WIND_STEP_OPTION]->val2 / 100;
if( sc->data[SC_TINDER_BREAKER] || sc->data[SC_TINDER_BREAKER2] )
flee -= flee * 50 / 100;
if( sc->data[SC_ZEPHYR] ) if( sc->data[SC_ZEPHYR] )
flee += sc->data[SC_ZEPHYR]->val2; flee += sc->data[SC_ZEPHYR]->val2;
if(sc->data[SC_ASH]) if(sc->data[SC_ASH])
@ -6916,7 +6915,7 @@ static defType status_calc_def(struct block_list *bl, struct status_change *sc,
if(sc->data[SC_ODINS_POWER]) if(sc->data[SC_ODINS_POWER])
def -= 20 * sc->data[SC_ODINS_POWER]->val1; def -= 20 * sc->data[SC_ODINS_POWER]->val1;
if( sc->data[SC_ANGRIFFS_MODUS] ) if( sc->data[SC_ANGRIFFS_MODUS] )
def -= 30 + 20 * sc->data[SC_ANGRIFFS_MODUS]->val1; def -= 20 + 10 * sc->data[SC_ANGRIFFS_MODUS]->val1;
if(sc->data[SC_STONEHARDSKIN]) if(sc->data[SC_STONEHARDSKIN])
def += sc->data[SC_STONEHARDSKIN]->val1; def += sc->data[SC_STONEHARDSKIN]->val1;
if(sc->data[SC_STONE] && sc->opt1 == OPT1_STONE) if(sc->data[SC_STONE] && sc->opt1 == OPT1_STONE)
@ -10668,21 +10667,19 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
status_zap(bl, status->hp-1, val2?0:status->sp); status_zap(bl, status->hp-1, val2?0:status->sp);
return 1; return 1;
break; break;
case SC_TINDER_BREAKER2:
case SC_CLOSECONFINE2: case SC_CLOSECONFINE2:
{ {
struct block_list *src2 = val2?map_id2bl(val2):NULL; struct block_list *src2 = val2?map_id2bl(val2):NULL;
struct status_change *sc2 = src2?status_get_sc(src2):NULL; struct status_change *sc2 = src2?status_get_sc(src2):NULL;
enum sc_type type2 = ((type == SC_TINDER_BREAKER2)?SC_TINDER_BREAKER:SC_CLOSECONFINE); struct status_change_entry *sce2 = sc2?sc2->data[SC_CLOSECONFINE]:NULL;
struct status_change_entry *sce2 = sc2?sc2->data[type2]:NULL;
if (src2 && sc2) { if (src2 && sc2) {
if (!sce2) // Start lock on caster. if (!sce2) // Start lock on caster.
sc_start4(src2,src2,type2,100,val1,1,0,0,tick+1000); sc_start4(src2,src2,SC_CLOSECONFINE,100,val1,1,0,0,tick+1000);
else { // Increase count of locked enemies and refresh time. else { // Increase count of locked enemies and refresh time.
(sce2->val2)++; (sce2->val2)++;
delete_timer(sce2->timer, status_change_timer); delete_timer(sce2->timer, status_change_timer);
sce2->timer = add_timer(gettick()+tick+1000, status_change_timer, src2->id, type2); sce2->timer = add_timer(gettick()+tick+1000, status_change_timer, src2->id, SC_CLOSECONFINE);
} }
} else // Status failed. } else // Status failed.
return 0; return 0;
@ -11553,7 +11550,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
break; break;
case SC_ANGRIFFS_MODUS: case SC_ANGRIFFS_MODUS:
val2 = 50 + 20 * val1; // atk bonus val2 = 50 + 20 * val1; // atk bonus
val3 = 40 + 20 * val1; // Flee reduction. val3 = 25 + 10 * val1; // Flee reduction.
val4 = tick/1000; // hp/sp reduction timer val4 = tick/1000; // hp/sp reduction timer
tick_time = 1000; tick_time = 1000;
break; break;
@ -11563,8 +11560,8 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
val4 = 2 + 2 * val1; // Chance of holy attack val4 = 2 + 2 * val1; // Chance of holy attack
break; break;
case SC_OVERED_BOOST: case SC_OVERED_BOOST:
val2 = 300 + 40*val1; // flee bonus val2 = 400 + 40 * val1; // flee bonus
val3 = 179 + 2*val1; // aspd bonus val3 = 180 + 2 * val1; // aspd bonus
val4 = 50; // def reduc % val4 = 50; // def reduc %
break; break;
case SC_GRANITIC_ARMOR: case SC_GRANITIC_ARMOR:
@ -12130,8 +12127,6 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
case SC_CONFUSION: case SC_CONFUSION:
case SC_CLOSECONFINE: case SC_CLOSECONFINE:
case SC_CLOSECONFINE2: case SC_CLOSECONFINE2:
case SC_TINDER_BREAKER:
case SC_TINDER_BREAKER2:
case SC_BITE: case SC_BITE:
case SC_THORNSTRAP: case SC_THORNSTRAP:
case SC_MEIKYOUSISUI: case SC_MEIKYOUSISUI:
@ -12879,10 +12874,6 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const
status_damage(NULL,bl,damage,0,0,1,0); status_damage(NULL,bl,damage,0,0,1,0);
} }
break; break;
case SC_PYROCLASTIC:
if(bl->type == BL_PC)
skill_break_equip(bl,bl,EQP_WEAPON,10000,BCT_SELF);
break;
case SC_RUN: case SC_RUN:
{ {
struct unit_data *ud = unit_bl2ud(bl); struct unit_data *ud = unit_bl2ud(bl);
@ -13030,19 +13021,16 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const
skill_castend_damage_id(src, bl, sce->val2, sce->val1, gettick(), SD_LEVEL ); skill_castend_damage_id(src, bl, sce->val2, sce->val1, gettick(), SD_LEVEL );
} }
break; break;
case SC_TINDER_BREAKER2:
case SC_CLOSECONFINE2:{ case SC_CLOSECONFINE2:{
struct block_list *src = sce->val2?map_id2bl(sce->val2):NULL; struct block_list *src = sce->val2?map_id2bl(sce->val2):NULL;
struct status_change *sc2 = src?status_get_sc(src):NULL; struct status_change *sc2 = src?status_get_sc(src):NULL;
enum sc_type type2 = ((type==SC_CLOSECONFINE2)?SC_CLOSECONFINE:SC_TINDER_BREAKER); if (src && sc2 && sc2->data[SC_CLOSECONFINE]) {
if (src && sc2 && sc2->data[type2]) {
// If status was already ended, do nothing. // If status was already ended, do nothing.
// Decrease count // Decrease count
if (type==SC_TINDER_BREAKER2 || (--(sc2->data[type2]->val1) <= 0)) // No more holds, free him up. if (--(sc2->data[SC_CLOSECONFINE]->val1) <= 0) // No more holds, free him up.
status_change_end(src, type2, INVALID_TIMER); status_change_end(src, SC_CLOSECONFINE, INVALID_TIMER);
} }
} }
case SC_TINDER_BREAKER:
case SC_CLOSECONFINE: case SC_CLOSECONFINE:
if (sce->val2 > 0) { if (sce->val2 > 0) {
// Caster has been unlocked... nearby chars need to be unlocked. // Caster has been unlocked... nearby chars need to be unlocked.
@ -13113,6 +13101,8 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const
break; break;
case SC_WARM: case SC_WARM:
case SC__MANHOLE: case SC__MANHOLE:
case SC_BANDING:
case SC_HELLS_PLANT:
if (sce->val4) { // Clear the group. if (sce->val4) { // Clear the group.
struct skill_unit_group* group = skill_id2group(sce->val4); struct skill_unit_group* group = skill_id2group(sce->val4);
sce->val4 = 0; sce->val4 = 0;
@ -13206,14 +13196,6 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const
skill_delunitgroup(group); skill_delunitgroup(group);
} }
break; break;
case SC_BANDING:
if(sce->val4) {
struct skill_unit_group *group = skill_id2group(sce->val4);
sce->val4 = 0;
if( group ) // Might have been cleared before status ended, e.g. land protector
skill_delunitgroup(group);
}
break;
case SC_CURSEDCIRCLE_ATKER: case SC_CURSEDCIRCLE_ATKER:
if( sce->val2 ) // Used the default area size cause there is a chance the caster could knock back and can't clear the target. if( sce->val2 ) // Used the default area size cause there is a chance the caster could knock back and can't clear the target.
map_foreachinallrange(status_change_timer_sub, bl, AREA_SIZE + 3, BL_CHAR, bl, sce, SC_CURSEDCIRCLE_TARGET, gettick()); map_foreachinallrange(status_change_timer_sub, bl, AREA_SIZE + 3, BL_CHAR, bl, sce, SC_CURSEDCIRCLE_TARGET, gettick());
@ -13962,7 +13944,6 @@ TIMER_FUNC(status_change_timer){
break; break;
case SC_SPLASHER: case SC_SPLASHER:
case SC_SPORE_EXPLOSION:
// Custom Venom Splasher countdown timer // Custom Venom Splasher countdown timer
// if (sce->val4 % 1000 == 0) { // if (sce->val4 % 1000 == 0) {
// char timer[10]; // char timer[10];
@ -14670,16 +14651,13 @@ int status_change_timer_sub(struct block_list* bl, va_list ap)
} }
} }
break; break;
case SC_TINDER_BREAKER: case SC_CLOSECONFINE:
case SC_CLOSECONFINE:{
enum sc_type type2 = ((type==SC_CLOSECONFINE)?SC_CLOSECONFINE2:SC_TINDER_BREAKER2);
// Lock char has released the hold on everyone... // Lock char has released the hold on everyone...
if (tsc && tsc->data[type2] && tsc->data[type2]->val2 == src->id) { if (tsc && tsc->data[SC_CLOSECONFINE2] && tsc->data[SC_CLOSECONFINE2]->val2 == src->id) {
tsc->data[type2]->val2 = 0; tsc->data[SC_CLOSECONFINE2]->val2 = 0;
status_change_end(bl, type2, INVALID_TIMER); status_change_end(bl, SC_CLOSECONFINE2, INVALID_TIMER);
} }
break; break;
}
case SC_CURSEDCIRCLE_TARGET: case SC_CURSEDCIRCLE_TARGET:
if( tsc && tsc->data[SC_CURSEDCIRCLE_TARGET] && tsc->data[SC_CURSEDCIRCLE_TARGET]->val2 == src->id ) { if( tsc && tsc->data[SC_CURSEDCIRCLE_TARGET] && tsc->data[SC_CURSEDCIRCLE_TARGET]->val2 == src->id ) {
clif_bladestop(bl, tsc->data[SC_CURSEDCIRCLE_TARGET]->val2, 0); clif_bladestop(bl, tsc->data[SC_CURSEDCIRCLE_TARGET]->val2, 0);

View File

@ -920,6 +920,8 @@ enum sc_type : int16 {
SC_SP_SHA, SC_SP_SHA,
SC_SOULCURSE, SC_SOULCURSE,
SC_HELLS_PLANT,
#ifdef RENEWAL #ifdef RENEWAL
SC_EXTREMITYFIST2, //! NOTE: This SC should be right before SC_MAX, so it doesn't disturb if RENEWAL is disabled SC_EXTREMITYFIST2, //! NOTE: This SC should be right before SC_MAX, so it doesn't disturb if RENEWAL is disabled
#endif #endif

View File

@ -2932,6 +2932,7 @@ int unit_remove_map_(struct block_list *bl, clr_type clrtype, const char* file,
status_change_end(bl, SC_CAMOUFLAGE, INVALID_TIMER); status_change_end(bl, SC_CAMOUFLAGE, INVALID_TIMER);
status_change_end(bl, SC_NEUTRALBARRIER_MASTER, INVALID_TIMER); status_change_end(bl, SC_NEUTRALBARRIER_MASTER, INVALID_TIMER);
status_change_end(bl, SC_STEALTHFIELD_MASTER, INVALID_TIMER); status_change_end(bl, SC_STEALTHFIELD_MASTER, INVALID_TIMER);
status_change_end(bl, SC_HELLS_PLANT, INVALID_TIMER);
status_change_end(bl, SC__SHADOWFORM, INVALID_TIMER); status_change_end(bl, SC__SHADOWFORM, INVALID_TIMER);
status_change_end(bl, SC__MANHOLE, INVALID_TIMER); status_change_end(bl, SC__MANHOLE, INVALID_TIMER);
status_change_end(bl, SC_VACUUM_EXTREME, INVALID_TIMER); status_change_end(bl, SC_VACUUM_EXTREME, INVALID_TIMER);