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
// Max level for Homunculus S
homunculus_S_max_level: 150
homunculus_S_max_level: 175
// Growth level for Homunculus S
// 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,
// otherwise they will be dropped on the ground as usual.
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
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,8024,5,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,8024,10,106,0,0,0,0,0,0,0,0,0,0,0 //MH_ERASER_CUTTER
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
//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,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
//Sera
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,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
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,8041,5,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,8041,10,109,0,0,0,0,0,0,0,0,0,0,0 //MH_LAVA_SLIDE
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
//Elanor
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,8029,5,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,8029,10,114,0,0,0,0,0,0,0,0,0,0,0 //MH_SILVERVEIN_RUSH
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,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

View File

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

View File

@ -179,4 +179,3 @@
2303,2048 //SC_BLOODYLUST
2419,2048 //WM_POEMOFNETHERWORLD
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,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,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,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,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#
@ -3847,10 +3845,8 @@
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,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,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,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#
@ -5056,10 +5052,8 @@
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,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,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,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#

View File

@ -1,151 +1,176 @@
// Homunculus Experience Tables
347
545
891
1485
2178
3168
3762
4158
4505
4900
5390
5880
5978
6223
6566
7203
7840
8232
8624
8924
9409
9991
10670
11446
12610
13580
14550
15520
16490
17460
18430
19400
20370
21340
22504
23280
25220
26675
28130
28800
30240
31680
32640
34560
36000
36480
38400
40320
42720
45120
47040
48960
50880
52800
54720
56640
59040
60480
62400
64320
66240
67200
70080
73920
76800
80640
84480
87360
91200
104500
121600
133000
147250
154850
161500
171000
178600
185250
190000
218500
247000
285000
332500
380000
456000
522500
570000
646000
712500
855000
950000
1140000
1425000
1710000
1995000
2280000
2660000
3135000
3800000
4124000
4260000
4462000
4527000
4779000
4921000
4984000
5118000
5353000
5438000
5507000
5610000
5776000
5867000
6000000
6116000
6241000
6373000
6498000
6639000
6720000
6907000
7025000
7105000
7264000
7454000
7611000
7688000
7735000
7940000
8020000
8198000
8318000
8376000
8469000
8528000
8573000
8650000
8701000
8769000
8814000
8820000
8826000
8838000
8887000
8905000
8916000
8922000
8966000
9094000
0
50
110
180
260
350
630
950
1310
1710
2150
3180
4300
5510
6810
8200
10800
13560
16480
19560
22800
28090
33630
39420
45460
51750
61150
70910
81030
91510
102350
117580
133300
149510
166210
183400
206480
230200
254560
279560
305200
338450
372510
407380
443060
479550
525590
572630
620670
669710
719750
781500
844460
908630
974010
1040600
1121280
1203400
1286960
1371960
1458400
1561530
1666350
1772860
1881060
1990950
2120350
2251710
2385030
2520310
2657550
2817340
2979380
3143670
3310210
3479000
3673600
3870760
4070480
4272760
4477600
4711730
4948750
5188660
5431460
5677150
5955830
6237750
6522910
6811310
7102950
7431500
7763660
8099430
8438810
8781800
9165840
9553880
9945920
10350000
10462000
10580000
10700000
10826000
10980000
11150000
11334000
11520000
11712000
11906000
12108000
12317000
12530000
12745000
12968000
13193000
13420000
13653000
13890000
14130000
14374200
14620000
14870000
15123200
15378000
15638000
15900000
16164000
16430000
16698000
16970000
17245000
17523000
17804000
18090000
18380000
18675000
18974000
19280000
19588000
19900000
20215000
20534000
20854200
21180000
21509500
21847000
22197000
22558000
22930000
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
245,12434,27,2495,1,11022,0,6248,1,6260,2,6261,1,6262,1
//---- Create Bomb --- ItemLV=28 ---------------
//-- 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
//---- Create Bomb --- ItemLV=28 --------------- Removed skill (free slot)
//---- Special Pharmacy --- ItemLV=29 ----------
//-- 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
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
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
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
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
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
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
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
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
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
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
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
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-----------
// 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
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
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
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
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
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
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
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
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
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
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
409,4 //WE_CALLPARENT
410,4 //WE_CALLBABY
491,4 //CR_CULTIVATION
530,4 //NJ_KIRIKAGE
691,4 //CASH_ASSUMPTIO
2284,4 //SC_FATALMENACE
@ -79,7 +78,6 @@
395,8 //CG_MOONLIT
409,8 //WE_CALLPARENT
410,8 //WE_CALLBABY
491,8 //CR_CULTIVATION
411,8 //TK_RUN
426,8 //TK_HIGHJUMP
427,8 //SG_FEEL
@ -132,7 +130,6 @@
409,16 // WE_CALLPARENT
410,16 // WE_CALLBABY
426,16 // TK_HIGHJUMP
491,16 // CR_CULTIVATION
529,16 // NJ_SHADOWJUMP
// 530,16 // NJ_KIRIKAGE
691,16 // CASH_ASSUMPTIO
@ -219,11 +216,9 @@
//----------------------------------------------------------------------------
232,2048 //AM_CANNIBALIZE
233,2048 //AM_SPHEREMINE
491,2048 //CR_CULTIVATION
1013,2048 //BS_GREED
2419,2048 //WM_POEMOFNETHERWORLD
2482,2048 //GN_WALLOFTHORN
2493,2048 //GN_SLINGITEM
//----------------------------------------------------------------------------
// 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,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,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,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#
@ -3434,10 +3433,8 @@
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,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,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,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#
@ -3860,7 +3857,6 @@
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,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,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#
@ -3880,10 +3876,8 @@
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,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,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,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#
@ -5102,10 +5096,8 @@
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,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,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,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#

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);
}
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;
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] &&
skill_id != NJ_ZENYNAGE && skill_id != KO_MUCHANAGE &&
#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
(flag&(BF_LONG|BF_WEAPON)) == (BF_LONG|BF_WEAPON))
#endif
@ -3876,6 +3876,13 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
skillratio += 100 + 50 * skill_lv;
#endif
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:
#ifdef RENEWAL
skillratio += 400 + 100 * skill_lv;
@ -4405,47 +4412,26 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
}
break;
case GN_CARTCANNON:
// ATK [{( Cart Remodeling Skill Level x 50 ) x ( INT / 40 )} + ( Cart Cannon Skill Level x 60 )] %
skillratio += -100 + 60 * skill_lv + ((sd) ? pc_checkskill(sd, GN_REMODELING_CART) : 1) * 50 * status_get_int(src) / 40;
// ATK [{( INT / (6 - ( Cart Remodeling Skill Level ) )} + ( Cart Cannon Skill Level x 350 )] %
skillratio += -100 + 350 * skill_lv + sstatus->int_ / (6 - (sd ? pc_checkskill(sd, GN_REMODELING_CART) : 1));
RE_LVL_DMOD(100);
break;
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);
break;
case GN_WALLOFTHORN:
skillratio += 10 * skill_lv;
break;
case GN_CRAZYWEED_ATK:
skillratio += 400 + 100 * skill_lv;
skillratio += -100 + 700 + 100 * skill_lv;
RE_LVL_DMOD(100);
break;
case GN_SLINGITEM_RANGEMELEEATK:
if( sd ) {
switch( sd->itemid ) {
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);
}
case GN_HELLS_PLANT_ATK:
skillratio += -100 + 500 * skill_lv + sstatus->int_ * (10 - (sd ? pc_checkskill(sd, AM_CANNIBALIZE) : 0)); // !TODO: Confirm INT and Cannibalize bonus
RE_LVL_DMOD(100);
break;
// Physical Elemantal Spirits Attack Skills
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;
break;
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;
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;
case MH_LAVA_SLIDE:
skillratio += -100 + 70 * skill_lv;
break;
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;
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;
case MH_MIDNIGHT_FRENZY:
skillratio += -100 + 300 * skill_lv * status_get_lv(src) / 150;
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);
skillratio += -100 + 350 * skill_lv * status_get_lv(src) / 150 + sstatus->str; // !TODO: Confirm STR bonus
break;
case MH_MAGMA_FLOW:
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
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) {
@ -5799,7 +5788,6 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl
switch(skill_id) {
case NJ_ISSEN:
case ASC_BREAKER:
case CR_ACIDDEMONSTRATION:
case GN_FIRE_EXPANSION_ACID:
break; //These skills will do a card fix later
default:
@ -5820,7 +5808,6 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl
switch (skill_id) {
case MC_CARTREVOLUTION:
case MO_INVESTIGATE:
case CR_ACIDDEMONSTRATION:
case SR_GATEOFHELL:
case GN_FIRE_EXPANSION_ACID:
case KO_BAKURETSU:
@ -5882,7 +5869,6 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl
switch (skill_id) {
case NJ_ISSEN:
case ASC_BREAKER:
case CR_ACIDDEMONSTRATION:
case GN_FIRE_EXPANSION_ACID:
return wd; //These skills will do a GVG fix later
default:
@ -6481,17 +6467,11 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
skillratio += 1100;
break;
case MH_ERASER_CUTTER:
skillratio += 400 + 100 * skill_lv + (skill_lv%2 > 0 ? 0 : 300);
break;
case MH_XENO_SLASHER:
if(skill_lv%2)
skillratio += 350 + 50 * skill_lv; //500:600:700
else
skillratio += 400 + 100 * skill_lv; //700:900
skillratio += -100 + 350 * skill_lv * status_get_lv(src) / 100 + sstatus->int_; // !TODO: Confirm Base Level and INT bonus
break;
case MH_HEILIGE_STANGE:
skillratio += 400 + 250 * skill_lv;
skillratio = (skillratio * status_get_lv(src)) / 150;
skillratio += -100 + 1000 + 250 * skill_lv * status_get_lv(src) / 150 + sstatus->vit; // !TODO: Confirm VIT bonus
break;
case MH_POISON_MIST:
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
switch(skill_id) { // These skills will do a card fix later
case CR_ACIDDEMONSTRATION:
case ASC_BREAKER:
break;
default:
@ -6686,7 +6665,6 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
#ifdef RENEWAL
switch(skill_id) {
case ASC_BREAKER:
case CR_ACIDDEMONSTRATION:
return ad; //These skills will do a GVG fix later
}
#endif
@ -6886,7 +6864,6 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list *
md.damage = 0;
}
break;
case CR_ACIDDEMONSTRATION:
case GN_FIRE_EXPANSION_ACID:
#ifdef RENEWAL
// 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:
md.damage = 100 + 200 * skill_lv + status_get_int(src);
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:
// 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;
if (status_bl_has_mode(target, MD_STATUS_IMMUNE))
md.damage /= 10;
break;
case MH_EQC:
md.damage = max(tstatus->hp - sstatus->hp, 0);
break;
case NPC_MAXPAIN_ATK:
if (ssc && ssc->data[SC_MAXPAIN])
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, },
{ "devotion_standup_fix", &battle_config.devotion_standup_fix, 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"
};

View File

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

View File

@ -1606,7 +1606,7 @@ void read_homunculus_expdb(void)
if (fp == NULL) {
if (i != 0)
continue;
ShowError("Can't read %s\n",line);
ShowError("read_homunculus_expdb: Can't read %s\n",line);
return;
}
while (fgets(line, sizeof(line), fp) && j < MAX_LEVEL) {
@ -1618,7 +1618,7 @@ void read_homunculus_expdb(void)
break;
}
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;
}
fclose(fp);

View File

@ -176,21 +176,10 @@ enum genetic_item_list
ITEMID_VITATA500,
ITEMID_CONCENTRATED_CEROMAIN_SOUP,
ITEMID_CURE_FREE = 12475,
ITEMID_APPLE_BOMB = 13260,
ITEMID_COCONUT_BOMB,
ITEMID_MELON_BOMB,
ITEMID_PINEAPPLE_BOMB,
ITEMID_BANANA_BOMB,
ITEMID_BLACK_LUMP,
ITEMID_BLACK_LUMP = 13265,
ITEMID_BLACK_HARD_LUMP,
ITEMID_VERY_HARD_LUMP,
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

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);
if (sc->data[SC_BANDING])
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])
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);
}
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;
else {
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;
}
}
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);
#endif
if(flag) {
if(base_exp || job_exp) {
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);
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;
}

View File

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

View File

@ -446,8 +446,6 @@ unsigned short skill_dummy2skill_id(unsigned short skill_id) {
return GN_CRAZYWEED;
case GN_HELLS_PLANT_ATK:
return GN_HELLS_PLANT;
case GN_SLINGITEM_RANGEMELEEATK:
return GN_SLINGITEM;
case RL_R_TRIP_PLUSATK:
return RL_R_TRIP;
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:
sc_start(src,bl, SC_STUN, 5 * skill_lv, skill_lv, skill_get_time(skill_id, skill_lv));
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:
sc_start(src,bl, SC_STUN, 20 + 10 * skill_lv, skill_lv, skill_get_time2(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_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_time(skill_id, skill_lv));
break;
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));
@ -1934,23 +1910,13 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1
}
break;
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;
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;
case MH_NEEDLE_OF_PARALYZE:
sc_start(src,bl, SC_PARALYSIS, 40 + (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));
}
sc_start(src,bl, SC_PARALYSIS, 30 + 5 * skill_lv, skill_lv, skill_get_time(skill_id, skill_lv));
break;
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));
@ -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
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;
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 SR_EARTHSHAKER:
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 KO_BAKURETSU:
case GN_CRAZYWEED_ATK:
case GN_HELLS_PLANT_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);
break;
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);
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:
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;
@ -3967,7 +3925,6 @@ static int skill_check_unit_range_sub(struct block_list *bl, va_list ap)
case NPC_REVERBERATION:
case WM_REVERBERATION:
case GN_THORNS_TRAP:
case GN_HELLS_PLANT:
case RL_B_TRAP:
case SC_ESCAPE:
//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;
break;
case SC_MANHOLE:
case GN_HELLS_PLANT:
range = 0;
break;
default: {
@ -4844,6 +4800,9 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
case NPC_PETRIFYATTACK:
case NPC_CURSEATTACK:
case NPC_SLEEPATTACK:
#ifdef RENEWAL
case CR_ACIDDEMONSTRATION:
#endif
case LK_AURABLADE:
case LK_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 WM_SEVERE_RAINSTORM_MELEE:
case WM_GREAT_ECHO:
case GN_SLINGITEM_RANGEMELEEATK:
case KO_SETSUDAN:
case RL_MASS_SPIRAL:
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] )
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 ((skill_id == SP_SHA || skill_id == SP_SWHOO) && !battle_config.allow_es_magic_pc && bl->type != BL_MOB)
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
//special case: Venom Splasher uses a different range for searching than for splashing
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
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:
#ifndef RENEWAL
case PA_PRESSURE:
#endif
case CR_ACIDDEMONSTRATION:
#endif
case TF_THROWSTONE:
#ifdef RENEWAL
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 NJ_ZENYNAGE:
case GN_THORNS_TRAP:
case GN_HELLS_PLANT_ATK:
case RL_B_TRAP:
skill_attack(BF_MISC,src,src,bl,skill_id,skill_lv,tick,flag);
break;
@ -6223,16 +6187,12 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
case MH_CBC:
case MH_EQC:
{
int duration = 0;
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)) {
clif_blown(src);
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,
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;
case GN_SPORE_EXPLOSION:
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;
case GN_MANDRAGORA:
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);
}
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_MAKEBOMB:
case GN_S_PHARMACY:
if( sd ) {
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;
if( skill_id != GN_S_PHARMACY && skill_lv > 1 )
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);
}
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);
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));
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));
}
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_VACUUM_EXTREME:
case GN_THORNS_TRAP:
case GN_HELLS_PLANT:
case SO_EARTHGRAVE:
case SO_DIAMONDDUST:
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;
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_ELECTRICWALK:
if( sc && sc->data[type] )
@ -13512,9 +13420,6 @@ struct skill_unit_group *skill_unitsetting(struct block_list *src, uint16 skill_
break;
case WZ_QUAGMIRE: //The target changes to "all" if used in a gvg map. [Skotlex]
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))
target = BCT_ALL;
break;
@ -14913,12 +14818,8 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, t_t
break;
case UNT_HELLS_PLANT:
if ((tsc && tsc->data[SC__MANHOLE]) || status_isimmune(bl))
break;
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);
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;
case UNT_ZEPHYR:
@ -15646,7 +15547,6 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i
}
break;
case GN_MIX_COOKING:
case GN_MAKEBOMB:
case GN_S_PHARMACY:
case GN_CHANGEMATERIAL:
if( sd->menuskill_id != skill_id )
@ -16673,7 +16573,6 @@ bool skill_check_condition_castend(struct map_session_data* sd, uint16 skill_id,
}
break;
case GN_MIX_COOKING:
case GN_MAKEBOMB:
case GN_S_PHARMACY:
case GN_CHANGEMATERIAL:
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);
//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 (unit->val2&(1 << UF_RANGEDSINGLEUNIT))
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_MOON_WARM:
case SG_STAR_WARM:
case LG_BANDING:
case GN_HELLS_PLANT:
{
struct status_change *sc = NULL;
if( (sc = status_get_sc(src)) != NULL && sc->data[SC_WARM] ) {
sc->data[SC_WARM]->val4 = 0;
status_change_end(src, SC_WARM, INVALID_TIMER);
status_change *sc = status_get_sc(src);
sc_type type = status_skill2sc(group->skill_id);
if (sc && sc->data[type]) {
sc->data[type]->val4 = 0;
status_change_end(src, type, INVALID_TIMER);
}
}
break;
@ -19176,15 +19079,6 @@ int skill_delunitgroup_(struct skill_unit_group *group, const char* file, int li
}
}
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)
@ -20058,7 +19952,7 @@ bool skill_produce_mix(struct map_session_data *sd, uint16 skill_id, unsigned sh
} 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);
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:
difficulty += 15;
break;
case ITEMID_BANANA_BOMB:
case ITEMID_HP_INCREASE_POTION_MEDIUM:
case ITEMID_SP_INCREASE_POTION_LARGE:
case ITEMID_VITATA500:
@ -20231,7 +20124,6 @@ bool skill_produce_mix(struct map_session_data *sd, uint16 skill_id, unsigned sh
make_per = 10000;
}
break;
case GN_MAKEBOMB:
case GN_MIX_COOKING:
{
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;
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_COCKTAIL_WARG_BLOOD:
case ITEMID_MINOR_STEW:
case ITEMID_SIROMA_ICED_TEA:
case ITEMID_DROSERA_HERB_SALAD:
case ITEMID_PETITE_TAIL_NOODLES:
case ITEMID_PINEAPPLE_BOMB:
difficulty += 15;
break;
case ITEMID_BANANA_BOMB:
difficulty += 20;
break;
}
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;
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;
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);
}
}
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_misceffect(&sd->bl,5);
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);
}
break;
case GN_MAKEBOMB:
case GN_S_PHARMACY:
case GN_CHANGEMATERIAL:
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_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 );
add_sc( GN_HELLS_PLANT , SC_HELLS_PLANT );
set_sc( GN_MANDRAGORA , SC_MANDRAGORA , EFST_MANDRAGORA , SCB_INT );
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_CLOSECONFINE] |= SCS_NOMOVE;
StatusChangeStateTable[SC_CLOSECONFINE2] |= SCS_NOMOVE;
StatusChangeStateTable[SC_TINDER_BREAKER] |= SCS_NOMOVE;
StatusChangeStateTable[SC_TINDER_BREAKER2] |= SCS_NOMOVE;
StatusChangeStateTable[SC_MADNESSCANCEL] |= SCS_NOMOVE;
#ifndef RENEWAL
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);
if(sc->data[SC_OVERED_BOOST]) //Should be final and unmodifiable by any means
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
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;
if( sc->data[SC_WIND_STEP_OPTION] )
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] )
flee += sc->data[SC_ZEPHYR]->val2;
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])
def -= 20 * sc->data[SC_ODINS_POWER]->val1;
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])
def += sc->data[SC_STONEHARDSKIN]->val1;
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);
return 1;
break;
case SC_TINDER_BREAKER2:
case SC_CLOSECONFINE2:
{
struct block_list *src2 = val2?map_id2bl(val2):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[type2]:NULL;
struct status_change_entry *sce2 = sc2?sc2->data[SC_CLOSECONFINE]:NULL;
if (src2 && sc2) {
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.
(sce2->val2)++;
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.
return 0;
@ -11553,7 +11550,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
break;
case SC_ANGRIFFS_MODUS:
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
tick_time = 1000;
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
break;
case SC_OVERED_BOOST:
val2 = 300 + 40*val1; // flee bonus
val3 = 179 + 2*val1; // aspd bonus
val2 = 400 + 40 * val1; // flee bonus
val3 = 180 + 2 * val1; // aspd bonus
val4 = 50; // def reduc %
break;
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_CLOSECONFINE:
case SC_CLOSECONFINE2:
case SC_TINDER_BREAKER:
case SC_TINDER_BREAKER2:
case SC_BITE:
case SC_THORNSTRAP:
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);
}
break;
case SC_PYROCLASTIC:
if(bl->type == BL_PC)
skill_break_equip(bl,bl,EQP_WEAPON,10000,BCT_SELF);
break;
case SC_RUN:
{
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 );
}
break;
case SC_TINDER_BREAKER2:
case SC_CLOSECONFINE2:{
struct block_list *src = sce->val2?map_id2bl(sce->val2):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[type2]) {
if (src && sc2 && sc2->data[SC_CLOSECONFINE]) {
// If status was already ended, do nothing.
// Decrease count
if (type==SC_TINDER_BREAKER2 || (--(sc2->data[type2]->val1) <= 0)) // No more holds, free him up.
status_change_end(src, type2, INVALID_TIMER);
if (--(sc2->data[SC_CLOSECONFINE]->val1) <= 0) // No more holds, free him up.
status_change_end(src, SC_CLOSECONFINE, INVALID_TIMER);
}
}
case SC_TINDER_BREAKER:
case SC_CLOSECONFINE:
if (sce->val2 > 0) {
// 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;
case SC_WARM:
case SC__MANHOLE:
case SC_BANDING:
case SC_HELLS_PLANT:
if (sce->val4) { // Clear the group.
struct skill_unit_group* group = skill_id2group(sce->val4);
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);
}
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:
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());
@ -13962,7 +13944,6 @@ TIMER_FUNC(status_change_timer){
break;
case SC_SPLASHER:
case SC_SPORE_EXPLOSION:
// Custom Venom Splasher countdown timer
// if (sce->val4 % 1000 == 0) {
// char timer[10];
@ -14670,16 +14651,13 @@ int status_change_timer_sub(struct block_list* bl, va_list ap)
}
}
break;
case SC_TINDER_BREAKER:
case SC_CLOSECONFINE:{
enum sc_type type2 = ((type==SC_CLOSECONFINE)?SC_CLOSECONFINE2:SC_TINDER_BREAKER2);
case SC_CLOSECONFINE:
// Lock char has released the hold on everyone...
if (tsc && tsc->data[type2] && tsc->data[type2]->val2 == src->id) {
tsc->data[type2]->val2 = 0;
status_change_end(bl, type2, INVALID_TIMER);
if (tsc && tsc->data[SC_CLOSECONFINE2] && tsc->data[SC_CLOSECONFINE2]->val2 == src->id) {
tsc->data[SC_CLOSECONFINE2]->val2 = 0;
status_change_end(bl, SC_CLOSECONFINE2, INVALID_TIMER);
}
break;
}
case SC_CURSEDCIRCLE_TARGET:
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);

View File

@ -920,6 +920,8 @@ enum sc_type : int16 {
SC_SP_SHA,
SC_SOULCURSE,
SC_HELLS_PLANT,
#ifdef RENEWAL
SC_EXTREMITYFIST2, //! NOTE: This SC should be right before SC_MAX, so it doesn't disturb if RENEWAL is disabled
#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_NEUTRALBARRIER_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__MANHOLE, INVALID_TIMER);
status_change_end(bl, SC_VACUUM_EXTREME, INVALID_TIMER);