Job Improvement Bundle patch (#5517)

* Updates various skills following kRO's job improvement patch.
* Change log: https://ro.gnjoy.com/news/notice/View.asp?BBSMode=10001&seq=7275&curpage=2
* Does not include changes to homunculus HP/SP level up bonuses as more information is required.
Thanks to @ecdarreola, @attackjom, @Haydrich, @rye305, @eppc0330, @Badarosk0, and @Lemongrass3110!
This commit is contained in:
Aleos 2021-05-07 08:23:42 -04:00 committed by GitHub
parent 16b4cbfca1
commit 3d4021bfc6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
19 changed files with 1039 additions and 1470 deletions

View File

@ -109,6 +109,3 @@ exp_cost_redemptio: 1
// If by default, the 'exp_cost_redemptio' is 1 (1%) and every single player revived the penalty is reduced to 0.2%, // If by default, the 'exp_cost_redemptio' is 1 (1%) and every single player revived the penalty is reduced to 0.2%,
// it means 'exp_cost_redemptio_limit' is 5. // it means 'exp_cost_redemptio_limit' is 5.
exp_cost_redemptio_limit: 5 exp_cost_redemptio_limit: 5
// EXP cost for cast LG_INSPIRATION (Note 2)
exp_cost_inspiration: 1

View File

@ -49472,6 +49472,13 @@ Body:
NoAuction: true NoAuction: true
Script: | Script: |
/* upgradeui 100368; */ /* upgradeui 100368; */
- Id: 100371
AegisName: aegis_100371
Name: Homunculus Nutritional Supplement
Type: Usable
Weight: 10
Script: |
addhomintimacy 100; // !TODO: Confirm increase amount
- Id: 100376 - Id: 100376
AegisName: Royal_Bow_K_Cube AegisName: Royal_Bow_K_Cube
Name: Royal Bow Remodeling Cube Name: Royal Bow Remodeling Cube

View File

@ -379,6 +379,8 @@
139,970,22,228,1,7127,0,713,1,7033,5,905,5,1092,1 139,970,22,228,1,7127,0,713,1,7033,5,905,5,1092,1
//-- Embryo <-- AM_PHARMACY & Potion Creation Guide & 1 Seed of Life, 1 Morning Dew of Yggdrasil, 1 Glass Tube //-- Embryo <-- AM_PHARMACY & Potion Creation Guide & 1 Seed of Life, 1 Morning Dew of Yggdrasil, 1 Glass Tube
140,7142,22,228,1,7144,0,7140,1,7141,1,7143,1 140,7142,22,228,1,7144,0,7140,1,7141,1,7143,1
//-- Homunculus Supplement <-- AM_BIOETHICS & Potion Creation Guide & 1 Seed of Life, 1 Yellow Herb, 1 Empty Bottle
141,100371,22,228,1,7144,0,7140,1,508,1,713,1
//---------------------------------------------- //----------------------------------------------
//============================================== //==============================================
@ -387,63 +389,63 @@
//===== Elemental Converters === ItemLV=23 ===== //===== Elemental Converters === ItemLV=23 =====
//-- Fire Elemental Converter <-- SA_CREATECON & 1 Blank Scroll, 3 Scorpion Tail //-- Fire Elemental Converter <-- SA_CREATECON & 1 Blank Scroll, 3 Scorpion Tail
141,12114,23,1007,1,7433,1,904,3 142,12114,23,1007,1,7433,1,904,3
//-- Water Elemental Converter <-- SA_CREATECON & 1 Blank Scroll, 3 Snail's Shell //-- Water Elemental Converter <-- SA_CREATECON & 1 Blank Scroll, 3 Snail's Shell
142,12115,23,1007,1,7433,1,946,3 143,12115,23,1007,1,7433,1,946,3
//-- Earth Elemental Converter <-- SA_CREATECON & 1 Blank Scroll, 3 Horn //-- Earth Elemental Converter <-- SA_CREATECON & 1 Blank Scroll, 3 Horn
143,12116,23,1007,1,7433,1,947,3 144,12116,23,1007,1,7433,1,947,3
//-- Wind Elemental Converter <-- SA_CREATECON & 1 Blank Scroll, 3 Rainbow Shell //-- Wind Elemental Converter <-- SA_CREATECON & 1 Blank Scroll, 3 Rainbow Shell
144,12117,23,1007,1,7433,1,1013,3 145,12117,23,1007,1,7433,1,1013,3
//============================================== //==============================================
//===== Ancilla And Runes === ItemLV=24 ======== //===== Ancilla And Runes === ItemLV=24 ========
//---- Ancilla --------------------------------- //---- Ancilla ---------------------------------
//-- Ancilla <-- AB_ANCILLA & 1 Blue Gemstone //-- Ancilla <-- AB_ANCILLA & 1 Blue Gemstone
145,12333,24,2039,1,717,1 146,12333,24,2039,1,717,1
//---- Rune Stones ----------------------------- //---- Rune Stones -----------------------------
//-- Runstone Nosiege <-- RK_RUNEMASTERY Lv8, 1 Broken Armor Piece, 1 Old Magic Circle, 1 Light Granule, 1 Elder Branch //-- Runstone Nosiege <-- RK_RUNEMASTERY Lv8, 1 Broken Armor Piece, 1 Old Magic Circle, 1 Light Granule, 1 Elder Branch
146,12725,24,2010,8,7069,1,7099,1,7938,1,7939,1 147,12725,24,2010,8,7069,1,7099,1,7938,1,7939,1
//-- Runstone Rhydo <-- RK_RUNEMASTERY Lv7, 1 Red Gemstone, 1 Light Granule, 1 Elder Branch //-- Runstone Rhydo <-- RK_RUNEMASTERY Lv7, 1 Red Gemstone, 1 Light Granule, 1 Elder Branch
147,12726,24,2010,7,716,1,7938,1,7939,1 148,12726,24,2010,7,716,1,7938,1,7939,1
//-- Runstone Verkana <-- RK_RUNEMASTERY Lv9, 1 Dullahan Armor, 1 Elder Branch //-- Runstone Verkana <-- RK_RUNEMASTERY Lv9, 1 Dullahan Armor, 1 Elder Branch
148,12727,24,2010,9,7210,1,7939,1 149,12727,24,2010,9,7210,1,7939,1
//-- Runstone Isia <-- RK_RUNEMASTERY Lv2, 1 Burning Heart, 1 Elder Branch //-- Runstone Isia <-- RK_RUNEMASTERY Lv2, 1 Burning Heart, 1 Elder Branch
149,12728,24,2010,2,7097,1,7939,1 150,12728,24,2010,2,7097,1,7939,1
//-- Runstone Asir <-- RK_RUNEMASTERY Lv5, 1 Ogre Tooth, 1 Light Granule, 1 Elder Branch //-- Runstone Asir <-- RK_RUNEMASTERY Lv5, 1 Ogre Tooth, 1 Light Granule, 1 Elder Branch
150,12729,24,2010,5,7002,1,7938,1,7939,1 151,12729,24,2010,5,7002,1,7938,1,7939,1
//-- Runstone Urj <-- RK_RUNEMASTERY Lv6, 1 Honey, 1 Slender Snake, 1 Elder Branch //-- Runstone Urj <-- RK_RUNEMASTERY Lv6, 1 Honey, 1 Slender Snake, 1 Elder Branch
151,12730,24,2010,6,518,1,1048,1,7939,1 152,12730,24,2010,6,518,1,1048,1,7939,1
//-- Runstone Turisus <-- RK_RUNEMASTERY Lv1, 1 Cobold Hair, 1 Claw Of Desert Wolf, 1 Elder Branch //-- Runstone Turisus <-- RK_RUNEMASTERY Lv1, 1 Cobold Hair, 1 Claw Of Desert Wolf, 1 Elder Branch
152,12731,24,2010,1,1034,1,7030,1,7939,1 153,12731,24,2010,1,1034,1,7030,1,7939,1
//-- Runstone Pertz <-- RK_RUNEMASTERY Lv3, 1 Dragon Canine, 1 Tangled Chain, 1 Light Granule, 1 Elder Branch //-- Runstone Pertz <-- RK_RUNEMASTERY Lv3, 1 Dragon Canine, 1 Tangled Chain, 1 Light Granule, 1 Elder Branch
153,12732,24,2010,3,1035,1,7221,1,7938,1,7939,1 154,12732,24,2010,3,1035,1,7221,1,7938,1,7939,1
//-- Runstone Hagalas <-- RK_RUNEMASTERY Lv4, 1 Round Shell, 1 Dragon's Skin, 1 Elder Branch //-- Runstone Hagalas <-- RK_RUNEMASTERY Lv4, 1 Round Shell, 1 Dragon's Skin, 1 Elder Branch
154,12733,24,2010,4,1096,1,7123,1,7939,1 155,12733,24,2010,4,1096,1,7123,1,7939,1
//-- Runstone Lux Anima <-- RK_RUNEMASTERY Lv10, 3 Gold, 3 Light Granule //-- Runstone Lux Anima <-- RK_RUNEMASTERY Lv10, 3 Gold, 3 Light Granule
155,22540,24,2010,10,969,3,7938,3 156,22540,24,2010,10,969,3,7938,3
//============================================== //==============================================
//===== Guillotine Cross Poisons === ItemLv=25 = //===== Guillotine Cross Poisons === ItemLv=25 =
//-- Guillotine Antidote <-- GC_RESEARCHNEWPOISON Lv5, 1 White Herb, 1 Blue Herb, 2 Green Herb //-- Guillotine Antidote <-- GC_RESEARCHNEWPOISON Lv5, 1 White Herb, 1 Blue Herb, 2 Green Herb
156,6128,25,2024,5,509,1,510,1,511,2 157,6128,25,2024,5,509,1,510,1,511,2
//-- Poison Paralysis <-- GC_RESEARCHNEWPOISON Lv1, 1 Medicine Bowl, 20 Poison Toad's Skin, 1 Poison Kit, 1 Poison Herb Amoena //-- Poison Paralysis <-- GC_RESEARCHNEWPOISON Lv1, 1 Medicine Bowl, 20 Poison Toad's Skin, 1 Poison Kit, 1 Poison Herb Amoena
157,12717,25,2024,1,7134,1,7155,20,7931,1,7937,1 158,12717,25,2024,1,7134,1,7155,20,7931,1,7937,1
//-- Poison Leech <-- GC_RESEARCHNEWPOISON Lv4, 1 Medicine Bowl, 1 Poison Kit, 1 Poison Herb Nerium, 1 Poison Herb Scopolia //-- Poison Leech <-- GC_RESEARCHNEWPOISON Lv4, 1 Medicine Bowl, 1 Poison Kit, 1 Poison Herb Nerium, 1 Poison Herb Scopolia
158,12718,25,2024,4,7134,1,7931,1,7932,1,7936,1 159,12718,25,2024,4,7134,1,7931,1,7932,1,7936,1
//-- Poison Oblivion <-- GC_RESEARCHNEWPOISON Lv9, 1 Izidor, 10 Heart Of Mermaid, 1 Medicine Bowl, 1 Poison Kit //-- Poison Oblivion <-- GC_RESEARCHNEWPOISON Lv9, 1 Izidor, 10 Heart Of Mermaid, 1 Medicine Bowl, 1 Poison Kit
159,12719,25,2024,9,709,1,950,10,7134,1,7931,1 160,12719,25,2024,9,709,1,950,10,7134,1,7931,1
//-- Poison Contamination <-- GC_RESEARCHNEWPOISON Lv3, 25 Decayed Nail, 1 Medicine Bowl, 1 Poison Kit, 1 Poison Herb Seratum //-- Poison Contamination <-- GC_RESEARCHNEWPOISON Lv3, 25 Decayed Nail, 1 Medicine Bowl, 1 Poison Kit, 1 Poison Herb Seratum
160,12720,25,2024,3,957,25,7134,1,7931,1,7935,1 161,12720,25,2024,3,957,25,7134,1,7931,1,7935,1
//-- Poison Numb <-- GC_RESEARCHNEWPOISON Lv8, 1 Medicine Bowl, 10 Sticky Poison, 1 Poison Kit, 1 Poison Herb Nerium //-- Poison Numb <-- GC_RESEARCHNEWPOISON Lv8, 1 Medicine Bowl, 10 Sticky Poison, 1 Poison Kit, 1 Poison Herb Nerium
161,12721,25,2024,8,7134,1,7565,10,7931,1,7932,1 162,12721,25,2024,8,7134,1,7565,10,7931,1,7932,1
//-- Poison Fever <-- GC_RESEARCHNEWPOISON Lv2, 20 Anolian Skin, 1 Medicine Bowl, 1 Poison Kit, 1 Poison Herb Rantana //-- Poison Fever <-- GC_RESEARCHNEWPOISON Lv2, 20 Anolian Skin, 1 Medicine Bowl, 1 Poison Kit, 1 Poison Herb Rantana
162,12722,25,2024,2,7003,20,7134,1,7931,1,7933,1 163,12722,25,2024,2,7003,20,7134,1,7931,1,7933,1
//-- Poison Laughing <-- GC_RESEARCHNEWPOISON Lv7, 10 Poison Spore, 1 Medicine Bowl, 1 Poison Kit, 1 Poison Herb Makulata //-- Poison Laughing <-- GC_RESEARCHNEWPOISON Lv7, 10 Poison Spore, 1 Medicine Bowl, 1 Poison Kit, 1 Poison Herb Makulata
163,12723,25,2024,7,7033,10,7134,1,7931,1,7934,1 164,12723,25,2024,7,7033,10,7134,1,7931,1,7934,1
//-- Poison Fatigue <-- GC_RESEARCHNEWPOISON Lv6, 1 Izidor, 1 Medicine Bowl, 10 Sticky Poison, 1 Poison Kit //-- Poison Fatigue <-- GC_RESEARCHNEWPOISON Lv6, 1 Izidor, 1 Medicine Bowl, 10 Sticky Poison, 1 Poison Kit
164,12724,25,2024,6,709,1,7134,1,7565,10,7931,1 165,12724,25,2024,6,709,1,7134,1,7565,10,7931,1
//============================================== //==============================================
//============================================== //==============================================
@ -451,244 +453,244 @@
//============================================== //==============================================
//----- Change Material ---- ItemLV=26 --------- //----- Change Material ---- ItemLV=26 ---------
//-- Sacred Masque <-- GN_CHANGEMATERIAL Lv1, 45 Grasshopper's Leg, 35 Yoyo Tail //-- Sacred Masque <-- GN_CHANGEMATERIAL Lv1, 45 Grasshopper's Leg, 35 Yoyo Tail
165,1045,26,2494,1,940,45,942,35 166,1045,26,2494,1,940,45,942,35
//-- Long Hair <-- GN_CHANGEMATERIAL Lv1, 40 Pencil Case, 5 Tiger's Skin //-- Long Hair <-- GN_CHANGEMATERIAL Lv1, 40 Pencil Case, 5 Tiger's Skin
166,1020,26,2494,1,738,40,1029,5 167,1020,26,2494,1,738,40,1029,5
//-- Phracon <-- GN_CHANGEMATERIAL Lv1, 45 Spawn, 40 Glass Bead //-- Phracon <-- GN_CHANGEMATERIAL Lv1, 45 Spawn, 40 Glass Bead
167,1010,26,2494,1,908,45,746,40 168,1010,26,2494,1,908,45,746,40
//-- Lantern <-- GN_CHANGEMATERIAL Lv1, 10 Solid Shell, 20 Blossom Of Maneater //-- Lantern <-- GN_CHANGEMATERIAL Lv1, 10 Solid Shell, 20 Blossom Of Maneater
168,1041,26,2494,1,943,10,1032,20 169,1041,26,2494,1,943,10,1032,20
//-- Acorn <-- GN_CHANGEMATERIAL Lv1, 30 Cactus Needle, 10 Snail's Shell //-- Acorn <-- GN_CHANGEMATERIAL Lv1, 30 Cactus Needle, 10 Snail's Shell
169,1026,26,2494,1,952,30,946,10 170,1026,26,2494,1,952,30,946,10
//-- Frozen Heart <-- GN_CHANGEMATERIAL Lv1, 25 Raccoondog Doll, 35 Moth Dust //-- Frozen Heart <-- GN_CHANGEMATERIAL Lv1, 25 Raccoondog Doll, 35 Moth Dust
170,1008,26,2494,1,754,25,1057,35 171,1008,26,2494,1,754,25,1057,35
//-- Horrendous Mouth <-- GN_CHANGEMATERIAL Lv1, 45 Stem, 45 Dragon Scale //-- Horrendous Mouth <-- GN_CHANGEMATERIAL Lv1, 45 Stem, 45 Dragon Scale
171,958,26,2494,1,905,45,1036,45 172,958,26,2494,1,905,45,1036,45
//-- Detrimindexta <-- GN_CHANGEMATERIAL Lv1, 40 Chrysalis, 10 Flesh Of Clam //-- Detrimindexta <-- GN_CHANGEMATERIAL Lv1, 40 Chrysalis, 10 Flesh Of Clam
172,971,26,2494,1,915,40,966,10 173,971,26,2494,1,915,40,966,10
//-- Detonator <-- GN_CHANGEMATERIAL Lv1, 45 Nose Ring, 25 Feather Of Birds //-- Detonator <-- GN_CHANGEMATERIAL Lv1, 45 Nose Ring, 25 Feather Of Birds
173,1051,26,2494,1,941,45,916,25 174,1051,26,2494,1,941,45,916,25
//-- Tweezer <-- GN_CHANGEMATERIAL Lv1, 40 Worm Peelings, 5 Monkey Doll //-- Tweezer <-- GN_CHANGEMATERIAL Lv1, 40 Worm Peelings, 5 Monkey Doll
174,1046,26,2494,1,955,40,753,5 175,1046,26,2494,1,955,40,753,5
//-- Petite DiablOfs Horn <-- GN_CHANGEMATERIAL Lv1, 5 Stone Heart, 10 Resin //-- Petite DiablOfs Horn <-- GN_CHANGEMATERIAL Lv1, 5 Stone Heart, 10 Resin
175,1038,26,2494,1,953,5,907,10 176,1038,26,2494,1,953,5,907,10
//-- Root Of Maneater <-- GN_CHANGEMATERIAL Lv1, 25 Talon, 20 Tooth Of //-- Root Of Maneater <-- GN_CHANGEMATERIAL Lv1, 25 Talon, 20 Tooth Of
176,1033,26,2494,1,917,25,1044,20 177,1033,26,2494,1,917,25,1044,20
//-- Conch <-- GN_CHANGEMATERIAL Lv1, 5 Gill, 25 Immortal Heart //-- Conch <-- GN_CHANGEMATERIAL Lv1, 5 Gill, 25 Immortal Heart
177,961,26,2494,1,956,5,929,25 178,961,26,2494,1,956,5,929,25
//-- Rotten Scale <-- GN_CHANGEMATERIAL Lv1, 20 Shell, 50 Thin N' Long Tongue //-- Rotten Scale <-- GN_CHANGEMATERIAL Lv1, 20 Shell, 50 Thin N' Long Tongue
178,959,26,2494,1,935,20,1015,50 179,959,26,2494,1,935,20,1015,50
//-- Elder Pixie's Beard <-- GN_CHANGEMATERIAL Lv1, 35 Bee Sting, 45 Petite DiablOfs Wing //-- Elder Pixie's Beard <-- GN_CHANGEMATERIAL Lv1, 35 Bee Sting, 45 Petite DiablOfs Wing
179,1040,26,2494,1,939,35,1039,45 180,1040,26,2494,1,939,35,1039,45
//-- Lizard Scruff <-- GN_CHANGEMATERIAL Lv1, 20 Scale Of Snakes, 15 Karvodailnirol //-- Lizard Scruff <-- GN_CHANGEMATERIAL Lv1, 20 Scale Of Snakes, 15 Karvodailnirol
180,1012,26,2494,1,926,20,972,15 181,1012,26,2494,1,926,20,972,15
//-- Emveretarcon <-- GN_CHANGEMATERIAL Lv1, 5 Heart Of Mermaid, 40 Grasshopper Doll //-- Emveretarcon <-- GN_CHANGEMATERIAL Lv1, 5 Heart Of Mermaid, 40 Grasshopper Doll
181,1011,26,2494,1,950,5,752,40 182,1011,26,2494,1,950,5,752,40
//-- Chinese Ink <-- GN_CHANGEMATERIAL Lv1, 20 Bear's Foot, 25 Black Ladle //-- Chinese Ink <-- GN_CHANGEMATERIAL Lv1, 20 Bear's Foot, 25 Black Ladle
182,1024,26,2494,1,948,20,737,25 183,1024,26,2494,1,948,20,737,25
//-- Spiderweb <-- GN_CHANGEMATERIAL Lv1, 50 Fin, 35 Slender Snake //-- Spiderweb <-- GN_CHANGEMATERIAL Lv1, 50 Fin, 35 Slender Snake
183,1025,26,2494,1,951,50,1048,35 184,1025,26,2494,1,951,50,1048,35
//-- Reins <-- GN_CHANGEMATERIAL Lv1, 30 Chonchon Doll, 50 Stuffed Doll //-- Reins <-- GN_CHANGEMATERIAL Lv1, 30 Chonchon Doll, 50 Stuffed Doll
184,1064,26,2494,1,742,30,740,50 185,1064,26,2494,1,742,30,740,50
//-- Wooden Block <-- GN_CHANGEMATERIAL Lv1, 10 Rotten Bandage, 10 Single Cell //-- Wooden Block <-- GN_CHANGEMATERIAL Lv1, 10 Rotten Bandage, 10 Single Cell
185,1019,26,2494,1,930,10,1052,10 186,1019,26,2494,1,930,10,1052,10
//-- Tentacle <-- GN_CHANGEMATERIAL Lv1, 40 Decayed Nail, 5 Wild Boar's Mane //-- Tentacle <-- GN_CHANGEMATERIAL Lv1, 40 Decayed Nail, 5 Wild Boar's Mane
186,962,26,2494,1,957,40,1028,5 187,962,26,2494,1,957,40,1028,5
//-- Mixture <-- GN_CHANGEMATERIAL Lv1, 15 Posionous Canine, 30 Powder Of Butterfly //-- Mixture <-- GN_CHANGEMATERIAL Lv1, 15 Posionous Canine, 30 Powder Of Butterfly
187,974,26,2494,1,937,15,924,30 188,974,26,2494,1,937,15,924,30
//-- Colorful Shell <-- GN_CHANGEMATERIAL Lv1, 50 Horn, 45 Zargon //-- Colorful Shell <-- GN_CHANGEMATERIAL Lv1, 50 Horn, 45 Zargon
188,1013,26,2494,1,947,50,912,45 189,1013,26,2494,1,947,50,912,45
//-- Wing Of Moth <-- GN_CHANGEMATERIAL Lv1, 20 Frozen Rose, 30 Reptile Tongue //-- Wing Of Moth <-- GN_CHANGEMATERIAL Lv1, 20 Frozen Rose, 30 Reptile Tongue
189,1058,26,2494,1,749,20,903,30 190,1058,26,2494,1,749,20,903,30
//-- Nipper <-- GN_CHANGEMATERIAL Lv1, 25 Sticky Mucus, 40 Earthworm Peeling //-- Nipper <-- GN_CHANGEMATERIAL Lv1, 25 Sticky Mucus, 40 Earthworm Peeling
190,960,26,2494,1,938,25,1055,40 191,960,26,2494,1,938,25,1055,40
//-- Turtle Shell <-- GN_CHANGEMATERIAL Lv1, 5 Fluff, 40 Poring Doll //-- Turtle Shell <-- GN_CHANGEMATERIAL Lv1, 5 Fluff, 40 Poring Doll
191,967,26,2494,1,914,5,741,40 192,967,26,2494,1,914,5,741,40
//-- Nail Of Orc <-- GN_CHANGEMATERIAL Lv1, 50 Raccoon Leaf, 10 Garlet //-- Nail Of Orc <-- GN_CHANGEMATERIAL Lv1, 50 Raccoon Leaf, 10 Garlet
192,1043,26,2494,1,945,50,910,10 193,1043,26,2494,1,945,50,910,10
//-- Dragon Canine <-- GN_CHANGEMATERIAL Lv1, 50 Osiris Doll, 35 Sticky Webfoot //-- Dragon Canine <-- GN_CHANGEMATERIAL Lv1, 50 Osiris Doll, 35 Sticky Webfoot
193,1035,26,2494,1,751,50,918,35 194,1035,26,2494,1,751,50,918,35
//-- Skirt Of Virgin <-- GN_CHANGEMATERIAL Lv1, 30 Scales Shell, 35 Head Of Medusa //-- Skirt Of Virgin <-- GN_CHANGEMATERIAL Lv1, 30 Scales Shell, 35 Head Of Medusa
194,1049,26,2494,1,936,30,1047,35 195,1049,26,2494,1,936,30,1047,35
//-- Dragon Train <-- GN_CHANGEMATERIAL Lv1, 25 Tooth Of Bat, 35 Sharpened Cuspid //-- Dragon Train <-- GN_CHANGEMATERIAL Lv1, 25 Tooth Of Bat, 35 Sharpened Cuspid
195,1037,26,2494,1,913,25,1063,35 196,1037,26,2494,1,913,25,1063,35
//-- Dokkaebi Horn <-- GN_CHANGEMATERIAL Lv1, 15 Shining Scales, 25 Lip Of Ancient Fish //-- Dokkaebi Horn <-- GN_CHANGEMATERIAL Lv1, 15 Shining Scales, 25 Lip Of Ancient Fish
196,1021,26,2494,1,954,15,1054,25 197,1021,26,2494,1,954,15,1054,25
//-- Grit <-- GN_CHANGEMATERIAL Lv1, 35 Crystal Mirror, 50 Limb Of Mantis //-- Grit <-- GN_CHANGEMATERIAL Lv1, 35 Crystal Mirror, 50 Limb Of Mantis
197,1056,26,2494,1,747,35,1031,50 198,1056,26,2494,1,747,35,1031,50
//-- Sharp Scale <-- GN_CHANGEMATERIAL Lv1, 10 Horseshoe, 20 Clam Shell //-- Sharp Scale <-- GN_CHANGEMATERIAL Lv1, 10 Horseshoe, 20 Clam Shell
198,963,26,2494,1,944,10,965,20 199,963,26,2494,1,944,10,965,20
//-- Short Leg <-- GN_CHANGEMATERIAL Lv1, 20 Claw Of Wolves, 45 Scell //-- Short Leg <-- GN_CHANGEMATERIAL Lv1, 20 Claw Of Wolves, 45 Scell
199,1042,26,2494,1,920,20,911,45 200,1042,26,2494,1,920,20,911,45
//-- Starsand Of Witch <-- GN_CHANGEMATERIAL Lv1, 10 Insect Feeler, 15 Blue Porcelain //-- Starsand Of Witch <-- GN_CHANGEMATERIAL Lv1, 10 Insect Feeler, 15 Blue Porcelain
200,1061,26,2494,1,928,10,735,15 201,1061,26,2494,1,928,10,735,15
//-- Fox Tail <-- GN_CHANGEMATERIAL Lv1, 10 Animal's Skin, 15 Rouge //-- Fox Tail <-- GN_CHANGEMATERIAL Lv1, 10 Animal's Skin, 15 Rouge
201,1022,26,2494,1,919,10,739,15 202,1022,26,2494,1,919,10,739,15
//-- Cobold Hair <-- GN_CHANGEMATERIAL Lv1, 45 Jellopy, 20 Wedding Bouquet //-- Cobold Hair <-- GN_CHANGEMATERIAL Lv1, 45 Jellopy, 20 Wedding Bouquet
202,1034,26,2494,1,909,45,745,20 203,1034,26,2494,1,909,45,745,20
//-- Jaws Of Ant <-- GN_CHANGEMATERIAL Lv1, 20 Spore Doll, 20 Witherless Rose //-- Jaws Of Ant <-- GN_CHANGEMATERIAL Lv1, 20 Spore Doll, 20 Witherless Rose
203,1014,26,2494,1,743,20,748,20 204,1014,26,2494,1,743,20,748,20
//-- Voucher Of Orcish Hero <-- GN_CHANGEMATERIAL Lv1, 5 Tree Root, 45 Nail Of Mole //-- Voucher Of Orcish Hero <-- GN_CHANGEMATERIAL Lv1, 5 Tree Root, 45 Nail Of Mole
204,968,26,2494,1,902,5,1018,45 205,968,26,2494,1,902,5,1018,45
//-- Sacred Marks <-- GN_CHANGEMATERIAL Lv1, 10 Scorpion's Tail, 30 Pumpkin Head //-- Sacred Marks <-- GN_CHANGEMATERIAL Lv1, 10 Scorpion's Tail, 30 Pumpkin Head
205,1009,26,2494,1,904,10,1062,30 206,1009,26,2494,1,904,10,1062,30
//-- Alchol <-- GN_CHANGEMATERIAL Lv1, 50 Orcish Voucher, 40 Skel Bone //-- Alchol <-- GN_CHANGEMATERIAL Lv1, 50 Orcish Voucher, 40 Skel Bone
206,970,26,2494,1,931,50,932,40 207,970,26,2494,1,931,50,932,40
//-- Crap Shell <-- GN_CHANGEMATERIAL Lv1, 50 Baphomet Doll, 30 Fish Tail //-- Crap Shell <-- GN_CHANGEMATERIAL Lv1, 50 Baphomet Doll, 30 Fish Tail
207,964,26,2494,1,750,50,1023,30 208,964,26,2494,1,750,50,1023,30
//-- Tendon <-- GN_CHANGEMATERIAL Lv1, 25 Orcish Cuspid, 5 Feather //-- Tendon <-- GN_CHANGEMATERIAL Lv1, 25 Orcish Cuspid, 5 Feather
208,1050,26,2494,1,922,25,949,5 209,1050,26,2494,1,922,25,949,5
//-- Tiger Footskin <-- GN_CHANGEMATERIAL Lv1, 5 Pointed Scale, 20 White Platter //-- Tiger Footskin <-- GN_CHANGEMATERIAL Lv1, 5 Pointed Scale, 20 White Platter
209,1030,26,2494,1,906,5,736,20 210,1030,26,2494,1,906,5,736,20
//-- Hinalle <-- GN_CHANGEMATERIAL Lv1, 45 Bunch Of Flowers, 40 Moustache Of Mole //-- Hinalle <-- GN_CHANGEMATERIAL Lv1, 45 Bunch Of Flowers, 40 Moustache Of Mole
210,703,26,2494,1,744,45,1017,40 211,703,26,2494,1,744,45,1017,40
//-- Counteragent <-- GN_CHANGEMATERIAL Lv1, 15 Evil Horn, 30 Mementos //-- Counteragent <-- GN_CHANGEMATERIAL Lv1, 15 Evil Horn, 30 Mementos
211,973,26,2494,1,923,15,934,30 212,973,26,2494,1,923,15,934,30
//-- Tooth Of Ancient Fish <-- GN_CHANGEMATERIAL Lv1, 35 Bill Of Birds, 30 Transparent Cloth //-- Tooth Of Ancient Fish <-- GN_CHANGEMATERIAL Lv1, 35 Bill Of Birds, 30 Transparent Cloth
212,1053,26,2494,1,925,35,1059,30 213,1053,26,2494,1,925,35,1059,30
//-- Rat Tail <-- GN_CHANGEMATERIAL Lv1, 35 Mushroom Spore, 40 Golden Hair //-- Rat Tail <-- GN_CHANGEMATERIAL Lv1, 35 Mushroom Spore, 40 Golden Hair
213,1016,26,2494,1,921,35,1060,40 214,1016,26,2494,1,921,35,1060,40
//-- Coal <-- GN_CHANGEMATERIAL Lv1, 1 Guard //-- Coal <-- GN_CHANGEMATERIAL Lv1, 1 Guard
214,1003,26,2494,1,2101,1 215,1003,26,2494,1,2101,1
//-- Steel <-- GN_CHANGEMATERIAL Lv1, 1 Tsurugi //-- Steel <-- GN_CHANGEMATERIAL Lv1, 1 Tsurugi
215,999,26,2494,1,1119,1 216,999,26,2494,1,1119,1
//-- Cigar <-- GN_CHANGEMATERIAL Lv1, 1 Orcish Axe //-- Cigar <-- GN_CHANGEMATERIAL Lv1, 1 Orcish Axe
216,2267,26,2494,1,1304,1 217,2267,26,2494,1,1304,1
//-- Bone Wand <-- GN_CHANGEMATERIAL Lv1, 100 Clattering Skull, 100 Broken Farming Utensil //-- Bone Wand <-- GN_CHANGEMATERIAL Lv1, 100 Clattering Skull, 100 Broken Farming Utensil
217,1615,26,2494,1,7752,100,7753,100 218,1615,26,2494,1,7752,100,7753,100
//-- Cigar <-- GN_CHANGEMATERIAL Lv1, 1 Orcish Axe, 100 Orcish Voucher //-- Cigar <-- GN_CHANGEMATERIAL Lv1, 1 Orcish Axe, 100 Orcish Voucher
218,2267,26,2494,1,1304,1,931,100 219,2267,26,2494,1,1304,1,931,100
//-- Starsand Of Witch <-- GN_CHANGEMATERIAL Lv1, 100 Moth Dust, 100 Scell //-- Starsand Of Witch <-- GN_CHANGEMATERIAL Lv1, 100 Moth Dust, 100 Scell
219,1061,26,2494,1,1057,100,911,100 220,1061,26,2494,1,1057,100,911,100
//-- Soft Feather <-- GN_CHANGEMATERIAL Lv1, 30 Feather, 30 Feather Of Birds //-- Soft Feather <-- GN_CHANGEMATERIAL Lv1, 30 Feather, 30 Feather Of Birds
220,7063,26,2494,1,949,30,916,30 221,7063,26,2494,1,949,30,916,30
//-- Wind Of Verdure <-- GN_CHANGEMATERIAL Lv1, 100 Ice Piece //-- Wind Of Verdure <-- GN_CHANGEMATERIAL Lv1, 100 Ice Piece
221,992,26,2494,1,7066,100 222,992,26,2494,1,7066,100
//-- Crystal Blue <-- GN_CHANGEMATERIAL Lv1, 100 Claw Of Wolves //-- Crystal Blue <-- GN_CHANGEMATERIAL Lv1, 100 Claw Of Wolves
222,991,26,2494,1,920,100 223,991,26,2494,1,920,100
//-- Soft Silk Cloth <-- GN_CHANGEMATERIAL Lv1, 10 Transparent Cloth //-- Soft Silk Cloth <-- GN_CHANGEMATERIAL Lv1, 10 Transparent Cloth
223,7166,26,2494,1,1059,10 224,7166,26,2494,1,1059,10
//-- Transparent Cloth <-- GN_CHANGEMATERIAL Lv1, 2 Soft Silk Cloth //-- Transparent Cloth <-- GN_CHANGEMATERIAL Lv1, 2 Soft Silk Cloth
224,1059,26,2494,1,7166,2 225,1059,26,2494,1,7166,2
//-- Boost500 To Throw <-- GN_CHANGEMATERIAL Lv1, 10 Empty Potion, 10 Boost500, 10 Flexible String //-- Boost500 To Throw <-- GN_CHANGEMATERIAL Lv1, 10 Empty Potion, 10 Boost500, 10 Flexible String
225,13269,26,2494,1,1093,10,12417,10,7200,10 226,13269,26,2494,1,1093,10,12417,10,7200,10
//-- Full SwingK To Throw <-- GN_CHANGEMATERIAL Lv1, 10 Empty Potion, 10 Full SwingK, 10 Flexible String //-- Full SwingK To Throw <-- GN_CHANGEMATERIAL Lv1, 10 Empty Potion, 10 Full SwingK, 10 Flexible String
226,13270,26,2494,1,1093,10,12418,10,7200,10 227,13270,26,2494,1,1093,10,12418,10,7200,10
//-- Mana Plus To Throw <-- GN_CHANGEMATERIAL Lv1, 10 Empty Potion, 10 Mana Plus, 10 Flexible String //-- Mana Plus To Throw <-- GN_CHANGEMATERIAL Lv1, 10 Empty Potion, 10 Mana Plus, 10 Flexible String
227,13271,26,2494,1,1093,10,12419,10,7200,10 228,13271,26,2494,1,1093,10,12419,10,7200,10
//-- Cure Free To Throw <-- GN_CHANGEMATERIAL Lv1, 10 Empty Potion, 10 Cure Free, 10 Flexible String //-- Cure Free To Throw <-- GN_CHANGEMATERIAL Lv1, 10 Empty Potion, 10 Cure Free, 10 Flexible String
228,13272,26,2494,1,1093,10,12475,10,7200,10 229,13272,26,2494,1,1093,10,12475,10,7200,10
//-- Stamina Up M To Throw <-- GN_CHANGEMATERIAL Lv1, 10 Empty Potion, 10 Stamina Up M, 10 Flexible String //-- Stamina Up M To Throw <-- GN_CHANGEMATERIAL Lv1, 10 Empty Potion, 10 Stamina Up M, 10 Flexible String
229,13273,26,2494,1,1093,10,12420,10,7200,10 230,13273,26,2494,1,1093,10,12420,10,7200,10
//-- Digestive F To Throw <-- GN_CHANGEMATERIAL Lv1, 10 Empty Potion, 10 Digestive F, 10 Flexible String //-- Digestive F To Throw <-- GN_CHANGEMATERIAL Lv1, 10 Empty Potion, 10 Digestive F, 10 Flexible String
230,13274,26,2494,1,1093,10,12421,10,7200,10 231,13274,26,2494,1,1093,10,12421,10,7200,10
//-- HP Inc PotS To Throw <-- GN_CHANGEMATERIAL Lv1, 10 Bottle To Throw, 10 HP Increase PotionS //-- HP Inc PotS To Throw <-- GN_CHANGEMATERIAL Lv1, 10 Bottle To Throw, 10 HP Increase PotionS
231,13275,26,2494,1,6297,10,12422,10 232,13275,26,2494,1,6297,10,12422,10
//-- HP Inc PotM To Throw <-- GN_CHANGEMATERIAL Lv1, 10 Bottle To Throw, 10 HP Increase PotionM //-- HP Inc PotM To Throw <-- GN_CHANGEMATERIAL Lv1, 10 Bottle To Throw, 10 HP Increase PotionM
232,13276,26,2494,1,6297,10,12423,10 233,13276,26,2494,1,6297,10,12423,10
//-- HP Inc PotL To Throw <-- GN_CHANGEMATERIAL Lv1, 10 Bottle To Throw, 10 HP Increase PotionL //-- HP Inc PotL To Throw <-- GN_CHANGEMATERIAL Lv1, 10 Bottle To Throw, 10 HP Increase PotionL
233,13277,26,2494,1,6297,10,12424,10 234,13277,26,2494,1,6297,10,12424,10
//-- SP Inc PotS To Throw <-- GN_CHANGEMATERIAL Lv1, 10 Bottle To Throw, 10 SP Increase PotionS //-- SP Inc PotS To Throw <-- GN_CHANGEMATERIAL Lv1, 10 Bottle To Throw, 10 SP Increase PotionS
234,13278,26,2494,1,6297,10,12425,10 235,13278,26,2494,1,6297,10,12425,10
//-- SP Inc PotM To Throw <-- GN_CHANGEMATERIAL Lv1, 10 Bottle To Throw, 10 SP Increase PotionM //-- SP Inc PotM To Throw <-- GN_CHANGEMATERIAL Lv1, 10 Bottle To Throw, 10 SP Increase PotionM
235,13279,26,2494,1,6297,10,12426,10 236,13279,26,2494,1,6297,10,12426,10
//-- SP Inc PotL To Throw <-- GN_CHANGEMATERIAL Lv1, 10 Bottle To Throw, 10 SP Increase PotionL //-- SP Inc PotL To Throw <-- GN_CHANGEMATERIAL Lv1, 10 Bottle To Throw, 10 SP Increase PotionL
236,13280,26,2494,1,6297,10,12427,10 237,13280,26,2494,1,6297,10,12427,10
//-- En White PotZ To Throw <-- GN_CHANGEMATERIAL Lv1, 10 Bottle To Throw, 10 Enrich White PotionZ //-- En White PotZ To Throw <-- GN_CHANGEMATERIAL Lv1, 10 Bottle To Throw, 10 Enrich White PotionZ
237,13281,26,2494,1,6297,10,12428,10 238,13281,26,2494,1,6297,10,12428,10
//-- Vitata500 To Throw <-- GN_CHANGEMATERIAL Lv1, 10 Bottle To Throw, 10 Vitata500 //-- Vitata500 To Throw <-- GN_CHANGEMATERIAL Lv1, 10 Bottle To Throw, 10 Vitata500
238,13282,26,2494,1,6297,10,12436,10 239,13282,26,2494,1,6297,10,12436,10
//-- En Cel Juice To Throw <-- GN_CHANGEMATERIAL Lv1, 10 Bottle To Throw, 10 Enrich Celermine Juice //-- En Cel Juice To Throw <-- GN_CHANGEMATERIAL Lv1, 10 Bottle To Throw, 10 Enrich Celermine Juice
239,13283,26,2494,1,6297,10,12437,10 240,13283,26,2494,1,6297,10,12437,10
//============================================== //==============================================
//---- Mix Cooking --- ItemLV=27 --------------- //---- Mix Cooking --- ItemLV=27 ---------------
//-- Savage BBQ <-- GN_MIX_COOKING Lv1, Mix Cook Book, 1 Melange Pot, 1 Savage Meat, 1 Cooking Skewer, 1 Black Charcoal //-- Savage BBQ <-- GN_MIX_COOKING Lv1, Mix Cook Book, 1 Melange Pot, 1 Savage Meat, 1 Cooking Skewer, 1 Black Charcoal
240,12429,27,2495,1,11022,0,6248,1,6249,1,6250,1,6251,1 241,12429,27,2495,1,11022,0,6248,1,6249,1,6250,1,6251,1
//-- Wug Blood Cocktail <-- GN_MIX_COOKING Lv1, Mix Cook Book, 1 Melange Pot, 3 Wolf Blood, 2 Cold Ice //-- Wug Blood Cocktail <-- GN_MIX_COOKING Lv1, Mix Cook Book, 1 Melange Pot, 3 Wolf Blood, 2 Cold Ice
241,12430,27,2495,1,11022,0,6248,1,6252,3,6253,2 242,12430,27,2495,1,11022,0,6248,1,6252,3,6253,2
//-- Minor Brisket <-- GN_MIX_COOKING Lv1, Mix Cook Book, 1 Melange Pot, 2 Beef Head Meat, 1 Large Cookpot //-- Minor Brisket <-- GN_MIX_COOKING Lv1, Mix Cook Book, 1 Melange Pot, 2 Beef Head Meat, 1 Large Cookpot
242,12431,27,2495,1,11022,0,6248,1,6254,2,6255,1 243,12431,27,2495,1,11022,0,6248,1,6254,2,6255,1
//-- Siroma Icetea <-- GN_MIX_COOKING Lv1, Mix Cook Book, 1 Melange Pot, 3 Ice Fragment, 2 Ice Crystal, 1 Comodo Tropic Fruit //-- Siroma Icetea <-- GN_MIX_COOKING Lv1, Mix Cook Book, 1 Melange Pot, 3 Ice Fragment, 2 Ice Crystal, 1 Comodo Tropic Fruit
243,12432,27,2495,1,11022,0,6248,1,6256,3,6257,2,6258,1 244,12432,27,2495,1,11022,0,6248,1,6256,3,6257,2,6258,1
//-- Drocera Herb Stew <-- GN_MIX_COOKING Lv1, Mix Cook Book, 3 Red Herb, 3 White Herb, 3 Blue Herb, 1 Melange Pot, 1 Large Cookpot, 1 Drocera Tentacle //-- Drocera Herb Stew <-- GN_MIX_COOKING Lv1, Mix Cook Book, 3 Red Herb, 3 White Herb, 3 Blue Herb, 1 Melange Pot, 1 Large Cookpot, 1 Drocera Tentacle
244,12433,27,2495,1,11022,0,507,3,509,3,510,3,6248,1,6255,1,6259,3 245,12433,27,2495,1,11022,0,507,3,509,3,510,3,6248,1,6255,1,6259,3
//-- 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 246,12434,27,2495,1,11022,0,6248,1,6260,2,6261,1,6262,1
//---- Create Bomb --- ItemLV=28 --------------- //---- Create Bomb --- ItemLV=28 ---------------
//-- Apple Bomb <-- GN_MAKEBOMB Lv1, Apple Bomb CB, 1 Apple, 1 Scell, 1 Detonator, 1 Gun Powder //-- 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 //247,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 //-- 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 //248,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 //-- 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 //249,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 //-- 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 //250,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 //-- 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 //251,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 252,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 253,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 254,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 255,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 256,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 257,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 258,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 259,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 260,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 261,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 262,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 263,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 264,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 //-- Golden X <-- GN_S_PHARMACY Lvl, 10 Empty Testtube, 10 Yggdrasilberry, 5 Gold
264,100231,29,2497,1,1092,10,607,10,969,5 265,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 //-- Red Herb Activator <-- GN_S_PHARMACY Lvl, 10 Empty Testtube, 45 Red Herb, 5 Yggdrasil Seed
265,100232,29,2497,1,1092,10,507,45,608,5 266,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 //-- Blue Herb Activator <-- GN_S_PHARMACY Lvl, 10 Empty Testtube, 15 Blue Herb, 5 Yggdrasil Seed
266,100233,29,2497,1,1092,10,510,15,608,5 267,100233,29,2497,1,1092,10,510,15,608,5
//-- Concentrated Red Syrup Potion <-- GN_S_PHARMACY Lvl, 10 Empty Testtube, 5 Empty Potion Bottle, 15 Red Syrup //-- Concentrated Red Syrup Potion <-- GN_S_PHARMACY Lvl, 10 Empty Testtube, 5 Empty Potion Bottle, 15 Red Syrup
267,1100003,29,2497,1,1092,10,1093,5,11621,15 268,1100003,29,2497,1,1092,10,1093,5,11621,15
//-- Concentrated Blue Syrup Potion <-- GN_S_PHARMACY Lvl, 10 Empty Testtube, 5 Empty Potion Bottle, 15 Blue Syrup //-- Concentrated Blue Syrup Potion <-- GN_S_PHARMACY Lvl, 10 Empty Testtube, 5 Empty Potion Bottle, 15 Blue Syrup
268,1100004,29,2497,1,1092,10,1093,5,11624,15 269,1100004,29,2497,1,1092,10,1093,5,11624,15
//-- Concentrated Golden Syrup Potion <-- GN_S_PHARMACY Lvl, 10 Empty Testtube, 5 Empty Potion Bottle, 10 White Syrup, 10 Yellow Syrup //-- Concentrated Golden Syrup Potion <-- GN_S_PHARMACY Lvl, 10 Empty Testtube, 5 Empty Potion Bottle, 10 White Syrup, 10 Yellow Syrup
269,1100005,29,2497,1,1092,10,1093,5,11623,10,11622,10 270,1100005,29,2497,1,1092,10,1093,5,11623,10,11622,10
//=============================================== //===============================================
//--------------------LEVEL 30----------- //--------------------LEVEL 30-----------
// Novice Red Potion (569) <-- 2 Red Herbs, 1 Apple // Novice Red Potion (569) <-- 2 Red Herbs, 1 Apple
270,569,30,0,0,11058,0,507,2,512,1 271,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
271,12325,30,0,0,11058,0,1066,3,909,1 272,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
272,12323,30,0,0,11058,0,914,2,949,2,909,2 273,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
273,13040,30,0,0,11058,0,935,10,955,10,1010,1 274,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
274,12846,30,0,0,11058,0,512,1,511,1 275,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
275,706,30,0,0,11058,0,705,200,938,200 276,706,30,0,0,11058,0,705,200,938,200
// Banana Juice (532) <-- 1 Banana, 1 Milk // Banana Juice (532) <-- 1 Banana, 1 Milk
276,532,30,0,0,11058,0,513,1,519,1 277,532,30,0,0,11058,0,513,1,519,1
// Apple Juice (531) <-- 1 Apple, 1 Milk // Apple Juice (531) <-- 1 Apple, 1 Milk
277,531,30,0,0,11058,0,512,1,519,1 278,531,30,0,0,11058,0,512,1,519,1
// Carrot Juice (534) <-- 1 Carrot, 1 Milk // Carrot Juice (534) <-- 1 Carrot, 1 Milk
278,534,30,0,0,11058,0,515,1,519,1 279,534,30,0,0,11058,0,515,1,519,1
// Grape Juice (533) <-- 1 Grape, 1 Milk // Grape Juice (533) <-- 1 Grape, 1 Milk
279,533,30,0,0,11058,0,514,1,519,1 280,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
280,619,30,0,0,11058,0,938,10,511,20,512,10 281,619,30,0,0,11058,0,938,10,511,20,512,10

File diff suppressed because it is too large Load Diff

View File

@ -118,9 +118,9 @@ SC_LEECHESEND,16
// ROYAL_GUARD // ROYAL_GUARD
SC_REFLECTDAMAGE,16 SC_REFLECTDAMAGE,16
SC_FORCEOFVANGUARD,16 SC_FORCEOFVANGUARD,16
SC_SHIELDSPELL_DEF,16 SC_SHIELDSPELL_HP,16
SC_SHIELDSPELL_MDEF,16 SC_SHIELDSPELL_SP,16
SC_SHIELDSPELL_REF,16 SC_SHIELDSPELL_ATK,16
SC_EXEEDBREAK,16 SC_EXEEDBREAK,16
SC_PRESTIGE,16 SC_PRESTIGE,16
SC_BANDING,16 SC_BANDING,16

View File

@ -9961,6 +9961,12 @@ current invoking character.
--------------------------------------- ---------------------------------------
*addhomintimacy <amount>{,<char_id>};
Increase or decrease a homunculus' intimacy value by the given <amount>. 100000 is full loyalty.
---------------------------------------
========================== ==========================
|12.- Mercenary commands.| |12.- Mercenary commands.|
========================== ==========================

View File

@ -540,6 +540,13 @@ int64 battle_attr_fix(struct block_list *src, struct block_list *target, int64 d
#else #else
damage += (int64)(damage * tsc->data[SC_VENOMIMPRESS]->val2 / 100); damage += (int64)(damage * tsc->data[SC_VENOMIMPRESS]->val2 / 100);
#endif #endif
if (tsc->data[SC_CLOUD_POISON]) {
#ifdef RENEWAL
ratio += 5 * tsc->data[SC_CLOUD_POISON]->val1;
#else
damage += (int64)(damage * 5 * tsc->data[SC_CLOUD_POISON]->val1 / 100);
#endif
}
break; break;
case ELE_WIND: case ELE_WIND:
if (tsc->data[SC_WATER_INSIGNIA]) if (tsc->data[SC_WATER_INSIGNIA])
@ -1488,8 +1495,11 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam
if (sc->data[SC_SOUNDOFDESTRUCTION]) if (sc->data[SC_SOUNDOFDESTRUCTION])
damage <<= 1; damage <<= 1;
if (sc->data[SC_DARKCROW] && (flag&(BF_SHORT|BF_MAGIC)) == BF_SHORT) if (sc->data[SC_DARKCROW] && (flag&(BF_SHORT|BF_MAGIC)) == BF_SHORT) {
damage += damage * sc->data[SC_DARKCROW]->val2 / 100; damage += damage * sc->data[SC_DARKCROW]->val2 / 100;
if (status_get_class_(bl) == CLASS_BOSS)
damage /= 2;
}
// Damage reductions // Damage reductions
// Assumptio increases DEF on RE mode, otherwise gives a reduction on the final damage. [Igniz] // Assumptio increases DEF on RE mode, otherwise gives a reduction on the final damage. [Igniz]
@ -1515,6 +1525,9 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam
damage >>= 2; //75% reduction damage >>= 2; //75% reduction
} }
if (sc->data[SC_SPORE_EXPLOSION] && (flag & BF_LONG) == BF_LONG)
damage += damage * (status_get_class(bl) == CLASS_BOSS ? 5 : 10) / 100;
if(sc->data[SC_ARMORCHANGE]) { if(sc->data[SC_ARMORCHANGE]) {
//On official servers, SC_ARMORCHANGE does not change DEF/MDEF but rather increases/decreases the damage //On official servers, SC_ARMORCHANGE does not change DEF/MDEF but rather increases/decreases the damage
if(flag&BF_WEAPON) if(flag&BF_WEAPON)
@ -1603,7 +1616,7 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam
damage -= damage * sc->data[SC_GRANITIC_ARMOR]->val2 / 100; damage -= damage * sc->data[SC_GRANITIC_ARMOR]->val2 / 100;
if(sc->data[SC_PAIN_KILLER]) { if(sc->data[SC_PAIN_KILLER]) {
damage -= sc->data[SC_PAIN_KILLER]->val3; damage -= sc->data[SC_PAIN_KILLER]->val2;
damage = i64max(damage, 1); damage = i64max(damage, 1);
} }
@ -1674,6 +1687,9 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam
if ((sce = sc->data[SC_BLOODLUST]) && flag&BF_WEAPON && damage > 0 && rnd()%100 < sce->val3) if ((sce = sc->data[SC_BLOODLUST]) && flag&BF_WEAPON && damage > 0 && rnd()%100 < sce->val3)
status_heal(src, damage * sce->val4 / 100, 0, 3); status_heal(src, damage * sce->val4 / 100, 0, 3);
if ((sce = sc->data[SC_BLOODSUCKER]) && flag & BF_WEAPON && damage > 0 && rnd() % 100 < (2 * sce->val1 - 1))
status_heal(src, damage * sce->val1 / 100, 0, 3);
if (flag&BF_MAGIC && bl->type == BL_PC && sc->data[SC_GVG_GIANT] && sc->data[SC_GVG_GIANT]->val4) if (flag&BF_MAGIC && bl->type == BL_PC && sc->data[SC_GVG_GIANT] && sc->data[SC_GVG_GIANT]->val4)
damage += damage * sc->data[SC_GVG_GIANT]->val4 / 100; damage += damage * sc->data[SC_GVG_GIANT]->val4 / 100;
@ -1716,11 +1732,6 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam
} }
} }
} }
/* Self Buff that destroys the armor of any target hit with melee or ranged physical attacks */
if( sc->data[SC_SHIELDSPELL_REF] && sc->data[SC_SHIELDSPELL_REF]->val1 == 1 && flag&BF_WEAPON ) {
skill_break_equip(src,bl, EQP_ARMOR, 10000, BCT_ENEMY); // 100% chance (http://irowiki.org/wiki/Shield_Spell#Level_3_spells_.28refine_based.29)
status_change_end(src,SC_SHIELDSPELL_REF,INVALID_TIMER);
}
if (sc->data[SC_POISONINGWEAPON] && flag&BF_SHORT && (skill_id == 0 || skill_id == GC_VENOMPRESSURE) && damage > 0) { if (sc->data[SC_POISONINGWEAPON] && flag&BF_SHORT && (skill_id == 0 || skill_id == GC_VENOMPRESSURE) && damage > 0) {
damage += damage * 10 / 100; damage += damage * 10 / 100;
@ -2722,7 +2733,7 @@ static bool is_attack_critical(struct Damage* wd, struct block_list *src, struct
#ifdef RENEWAL #ifdef RENEWAL
case ASC_BREAKER: case ASC_BREAKER:
#endif #endif
case RK_IGNITIONBREAK: case LG_CANNONSPEAR:
case GC_CROSSIMPACT: case GC_CROSSIMPACT:
cri /= 2; cri /= 2;
break; break;
@ -3213,7 +3224,6 @@ static void battle_calc_element_damage(struct Damage* wd, struct block_list *src
case MC_CARTREVOLUTION: case MC_CARTREVOLUTION:
case HW_MAGICCRASHER: case HW_MAGICCRASHER:
case SR_FALLENEMPIRE: case SR_FALLENEMPIRE:
case SR_TIGERCANNON:
case SR_CRESCENTELBOW_AUTOSPELL: case SR_CRESCENTELBOW_AUTOSPELL:
case SR_GATEOFHELL: case SR_GATEOFHELL:
wd->damage = battle_attr_fix(src, target, wd->damage, ELE_NEUTRAL, tstatus->def_ele, tstatus->ele_lv); wd->damage = battle_attr_fix(src, target, wd->damage, ELE_NEUTRAL, tstatus->def_ele, tstatus->ele_lv);
@ -3526,9 +3536,9 @@ static void battle_calc_skill_base_damage(struct Damage* wd, struct block_list *
int damagevalue = (sstatus->hp / 50 + status_get_max_sp(src) / 4) * skill_lv; int damagevalue = (sstatus->hp / 50 + status_get_max_sp(src) / 4) * skill_lv;
if(status_get_lv(src) > 100) if(status_get_lv(src) > 100)
damagevalue = damagevalue * status_get_lv(src) / 150; damagevalue = damagevalue * status_get_lv(src) / 100;
if(sd) if(sd)
damagevalue = damagevalue * (100 + 5 * (pc_checkskill(sd,RK_DRAGONTRAINING) - 1)) / 100; damagevalue = damagevalue * (90 + 10 * pc_checkskill(sd, RK_DRAGONTRAINING)) / 100;
ATK_ADD(wd->damage, wd->damage2, damagevalue); ATK_ADD(wd->damage, wd->damage2, damagevalue);
#ifdef RENEWAL #ifdef RENEWAL
ATK_ADD(wd->weaponAtk, wd->weaponAtk2, damagevalue); ATK_ADD(wd->weaponAtk, wd->weaponAtk2, damagevalue);
@ -3742,9 +3752,6 @@ static void battle_calc_multi_attack(struct Damage* wd, struct block_list *src,s
if (sd && sd->weapontype1 == W_2HSWORD) if (sd && sd->weapontype1 == W_2HSWORD)
wd->div_ = 2; wd->div_ = 2;
break; break;
case RA_AIMEDBOLT:
wd->div_ = 2 + tstatus->size + rnd()%2;
break;
case SC_FATALMENACE: case SC_FATALMENACE:
if (sd && sd->weapontype1 == W_DAGGER) if (sd && sd->weapontype1 == W_DAGGER)
wd->div_++; wd->div_++;
@ -4131,7 +4138,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
// Fall through // Fall through
case MA_SHARPSHOOTING: case MA_SHARPSHOOTING:
#ifdef RENEWAL #ifdef RENEWAL
skillratio += 50 + 200 * skill_lv; skillratio += -100 + 300 + 300 * skill_lv;
RE_LVL_DMOD(100); RE_LVL_DMOD(100);
#else #else
skillratio += 100 + 50 * skill_lv; skillratio += 100 + 50 * skill_lv;
@ -4164,7 +4171,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
break; break;
case ASC_BREAKER: case ASC_BREAKER:
#ifdef RENEWAL #ifdef RENEWAL
skillratio += -100 + 140 * skill_lv + sstatus->str + sstatus->int_; // !TODO: Confirm stat modifier skillratio += -100 + 150 * skill_lv + sstatus->str + sstatus->int_; // !TODO: Confirm stat modifier
RE_LVL_DMOD(100); RE_LVL_DMOD(100);
#else #else
// Pre-Renewal: skill ratio for weapon part of damage [helvetica] // Pre-Renewal: skill ratio for weapon part of damage [helvetica]
@ -4318,7 +4325,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
skillratio += ((skill_lv - 1) % 5 + 1) * 100; skillratio += ((skill_lv - 1) % 5 + 1) * 100;
break; break;
case RK_SONICWAVE: case RK_SONICWAVE:
skillratio += -100 + 500 + 100 * skill_lv; skillratio += -100 + 1050 + 150 * skill_lv;
RE_LVL_DMOD(100); RE_LVL_DMOD(100);
break; break;
case RK_HUNDREDSPEAR: case RK_HUNDREDSPEAR:
@ -4340,7 +4347,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
RE_LVL_DMOD(100); RE_LVL_DMOD(100);
break; break;
case RK_IGNITIONBREAK: case RK_IGNITIONBREAK:
skillratio += -100 + 400 * skill_lv; skillratio += -100 + 450 * skill_lv;
RE_LVL_DMOD(100); RE_LVL_DMOD(100);
break; break;
case NPC_IGNITIONBREAK: case NPC_IGNITIONBREAK:
@ -4356,7 +4363,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
skillratio += -100 + 500 * skill_lv; skillratio += -100 + 500 * skill_lv;
break; break;
case RK_STORMBLAST: case RK_STORMBLAST:
skillratio += -100 + (((sd) ? pc_checkskill(sd,RK_RUNEMASTERY) : 0) + status_get_str(src) / 8) * 100; // ATK = [{Rune Mastery Skill Level + (Caster's STR / 8)} x 100] % skillratio += -100 + (((sd) ? pc_checkskill(sd,RK_RUNEMASTERY) : 0) + sstatus->str / 6) * 100; // ATK = [{Rune Mastery Skill Level + (Caster's STR / 6)} x 100] %
RE_LVL_DMOD(100); RE_LVL_DMOD(100);
break; break;
case RK_PHANTOMTHRUST: // ATK = [{(Skill Level x 50) + (Spear Master Level x 10)} x Caster's Base Level / 150] % case RK_PHANTOMTHRUST: // ATK = [{(Skill Level x 50) + (Spear Master Level x 10)} x Caster's Base Level / 150] %
@ -4365,7 +4372,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
break; break;
// case NPC_PHANTOMTHRUST: // ATK = 100% for all level // case NPC_PHANTOMTHRUST: // ATK = 100% for all level
case GC_CROSSIMPACT: case GC_CROSSIMPACT:
skillratio += -100 + 1000 + 150 * skill_lv; skillratio += -100 + 1400 + 150 * skill_lv;
RE_LVL_DMOD(100); RE_LVL_DMOD(100);
break; break;
case GC_COUNTERSLASH: case GC_COUNTERSLASH:
@ -4395,13 +4402,21 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
case AB_DUPLELIGHT_MELEE: case AB_DUPLELIGHT_MELEE:
skillratio += 50 + 15 * skill_lv; skillratio += 50 + 15 * skill_lv;
break; break;
case RA_ARROWSTORM:
case NPC_ARROWSTORM: case NPC_ARROWSTORM:
skillratio += 900 + 80 * skill_lv; skillratio += 900 + 80 * skill_lv;
break;
case RA_ARROWSTORM:
if (sc && sc->data[SC_FEARBREEZE])
skillratio += -100 + 200 + 250 * skill_lv;
else
skillratio += -100 + 200 + 180 * skill_lv;
RE_LVL_DMOD(100); RE_LVL_DMOD(100);
break; break;
case RA_AIMEDBOLT: case RA_AIMEDBOLT:
skillratio += 100 + 20 * skill_lv + 500; if (sc && sc->data[SC_FEARBREEZE])
skillratio += -100 + 800 + 35 * skill_lv;
else
skillratio += -100 + 500 + 20 * skill_lv;
RE_LVL_DMOD(100); RE_LVL_DMOD(100);
break; break;
case RA_CLUSTERBOMB: case RA_CLUSTERBOMB:
@ -4422,16 +4437,16 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
skillratio += 50 * skill_lv; skillratio += 50 * skill_lv;
break; break;
case NC_BOOSTKNUCKLE: case NC_BOOSTKNUCKLE:
skillratio += 100 + 100 * skill_lv + status_get_dex(src); skillratio += 200 * skill_lv + sstatus->dex / 6; // !TODO: What's the DEX bonus?
RE_LVL_DMOD(120); RE_LVL_DMOD(100);
break; break;
case NC_PILEBUNKER: case NC_PILEBUNKER:
skillratio += 200 + 100 * skill_lv + status_get_str(src); skillratio += 200 + 100 * skill_lv + status_get_str(src);
RE_LVL_DMOD(100); RE_LVL_DMOD(100);
break; break;
case NC_VULCANARM: case NC_VULCANARM:
skillratio += -100 + 70 * skill_lv + status_get_dex(src); skillratio += -100 + 140 * skill_lv + sstatus->dex / 6; // !TODO: What's the DEX bonus?
RE_LVL_DMOD(120); RE_LVL_DMOD(100);
break; break;
case NC_FLAMELAUNCHER: case NC_FLAMELAUNCHER:
case NC_COLDSLOWER: case NC_COLDSLOWER:
@ -4439,12 +4454,8 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
RE_LVL_DMOD(150); RE_LVL_DMOD(150);
break; break;
case NC_ARMSCANNON: case NC_ARMSCANNON:
switch( tstatus->size ) { skillratio += -100 + 400 + 300 * skill_lv;
case SZ_SMALL: skillratio += 200 + 400 * skill_lv; break;// Small RE_LVL_DMOD(100);
case SZ_MEDIUM: skillratio += 200 + 350 * skill_lv; break;// Medium
case SZ_BIG: skillratio += 200 + 300 * skill_lv; break;// Large
}
RE_LVL_DMOD(120);
break; break;
case NC_AXEBOOMERANG: case NC_AXEBOOMERANG:
skillratio += 150 + 50 * skill_lv; skillratio += 150 + 50 * skill_lv;
@ -4457,37 +4468,34 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
RE_LVL_DMOD(100); RE_LVL_DMOD(100);
break; break;
case NC_POWERSWING: // According to current sources, only the str + dex gets modified by level [Akinari] case NC_POWERSWING: // According to current sources, only the str + dex gets modified by level [Akinari]
skillratio += -100 + status_get_str(src) + status_get_dex(src); skillratio += -100 + ((sstatus->str + sstatus->dex)/ 2) + 300 + 100 * skill_lv;
RE_LVL_DMOD(100); RE_LVL_DMOD(100);
skillratio += 300 + 100 * skill_lv;
break; break;
case NC_MAGMA_ERUPTION: // 'Slam' damage case NC_MAGMA_ERUPTION: // 'Slam' damage
skillratio += 350 + 50 * skill_lv; skillratio += 350 + 50 * skill_lv;
break; break;
case NC_AXETORNADO: case NC_AXETORNADO:
skillratio += 100 + 100 * skill_lv + status_get_vit(src); skillratio += -100 + 200 + 180 * skill_lv + sstatus->vit / 6; // !TODO: What's the VIT bonus?
RE_LVL_DMOD(100); RE_LVL_DMOD(100);
if (distance_bl(src, target) > 2) // Will deal 75% damage outside of 5x5 area.
skillratio = skillratio * 75 / 100;
break; break;
case SC_FATALMENACE: case SC_FATALMENACE:
skillratio += 100 * skill_lv; skillratio += 120 * skill_lv + sstatus->agi / 6; // !TODO: What's the AGI bonus?
RE_LVL_DMOD(100); RE_LVL_DMOD(100);
break; break;
case SC_TRIANGLESHOT: case SC_TRIANGLESHOT:
skillratio += 200 + (skill_lv - 1) * status_get_agi(src) / 2; skillratio += -100 + 230 * skill_lv + 3 * sstatus->agi;
RE_LVL_DMOD(120); RE_LVL_DMOD(100);
break; break;
case SC_FEINTBOMB: case SC_FEINTBOMB:
skillratio += -100 + (skill_lv + 1) * status_get_dex(src) / 2 * ((sd) ? sd->status.job_level / 10 : 1); skillratio += -100 + (skill_lv + 1) * sstatus->dex / 2 * ((sd) ? sd->status.job_level / 10 : 1);
RE_LVL_DMOD(120); RE_LVL_DMOD(120);
break; break;
case LG_CANNONSPEAR: case LG_CANNONSPEAR:
skillratio += -100 + skill_lv * (50 + status_get_str(src)); skillratio += -100 + skill_lv * (50 + sstatus->str);
RE_LVL_DMOD(100); RE_LVL_DMOD(100);
break; break;
case LG_BANISHINGPOINT: case LG_BANISHINGPOINT:
skillratio += -100 + (50 * skill_lv) + ((sd) ? pc_checkskill(sd,SM_BASH) * 30 : 0); skillratio += -100 + (80 * skill_lv) + ((sd) ? pc_checkskill(sd,SM_BASH) * 30 : 0);
RE_LVL_DMOD(100); RE_LVL_DMOD(100);
break; break;
case LG_SHIELDPRESS: case LG_SHIELDPRESS:
@ -4511,51 +4519,29 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
skillratio += 2900 + (status_get_max_hp(src) - status_get_hp(src)); skillratio += 2900 + (status_get_max_hp(src) - status_get_hp(src));
RE_LVL_DMOD(100); RE_LVL_DMOD(100);
break; break;
case LG_SHIELDSPELL:
if (sd && skill_lv == 1) { // [(Casters Base Level x 4) + (Shield DEF x 10) + (Casters VIT x 2)] %
short index = sd->equip_index[EQI_HAND_L];
skillratio += -100 + status_get_lv(src) * 4 + status_get_vit(src) * 2;
if (index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->type == IT_ARMOR)
skillratio += sd->inventory_data[index]->def * 10;
} else
skillratio = 0; // Prevent damage since level 2 is MATK. [Aleos]
break;
case LG_MOONSLASHER: case LG_MOONSLASHER:
skillratio += -100 + 120 * skill_lv + ((sd) ? pc_checkskill(sd,LG_OVERBRAND) * 80 : 0); skillratio += -100 + 120 * skill_lv + ((sd) ? pc_checkskill(sd,LG_OVERBRAND) * 80 : 0);
RE_LVL_DMOD(100); RE_LVL_DMOD(100);
break; break;
case LG_OVERBRAND: case LG_OVERBRAND:
skillratio += -100 + 400 * skill_lv + ((sd) ? pc_checkskill(sd,CR_SPEARQUICKEN) * 50 : 0); if(sc && sc->data[SC_OVERBRANDREADY])
skillratio += -100 + 450 * skill_lv;
else
skillratio += -100 + 300 * skill_lv;
skillratio += ((sd) ? pc_checkskill(sd, CR_SPEARQUICKEN) * 50 : 0);
RE_LVL_DMOD(100); RE_LVL_DMOD(100);
break; break;
case LG_OVERBRAND_BRANDISH:
skillratio += -100 + 300 * skill_lv + status_get_str(src) + status_get_dex(src);
RE_LVL_DMOD(100);
break;
case LG_OVERBRAND_PLUSATK: // Only Piercing and Swing damage get RE_LVL_DMOD bonus damage
skillratio += -100 + 200 * skill_lv + rnd()%90 + 10;
break;
case LG_EARTHDRIVE: case LG_EARTHDRIVE:
if (sd) { skillratio += -100 + 380 * skill_lv + ((sstatus->str + sstatus->vit) / 6); // !TODO: What's the STR/VIT bonus?
short index = sd->equip_index[EQI_HAND_L];
if (index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->type == IT_ARMOR)
skillratio += -100 + (skill_lv + 1) * sd->inventory_data[index]->weight / 10;
}
RE_LVL_DMOD(100); RE_LVL_DMOD(100);
break; break;
case LG_HESPERUSLIT: case LG_HESPERUSLIT:
if (sc) { if (sc && sc->data[SC_INSPIRATION])
if (sc->data[SC_INSPIRATION]) skillratio += -100 + 450 * skill_lv;
skillratio += 1100; else
if (sc->data[SC_BANDING]) { skillratio += -100 + 300 * skill_lv;
skillratio += -100 + 120 * skill_lv + 200 * sc->data[SC_BANDING]->val2; skillratio += sstatus->vit / 6; // !TODO: What's the VIT bonus?
if (sc->data[SC_BANDING]->val2 > 5)
skillratio = skillratio * 150 / 100;
}
RE_LVL_DMOD(100); RE_LVL_DMOD(100);
}
break; break;
case SR_EARTHSHAKER: case SR_EARTHSHAKER:
if (tsc && ((tsc->option&(OPTION_HIDE|OPTION_CLOAK|OPTION_CHASEWALK)) || tsc->data[SC_CAMOUFLAGE] || tsc->data[SC_STEALTHFIELD] || tsc->data[SC__SHADOWFORM])) { if (tsc && ((tsc->option&(OPTION_HIDE|OPTION_CLOAK|OPTION_CHASEWALK)) || tsc->data[SC_CAMOUFLAGE] || tsc->data[SC_STEALTHFIELD] || tsc->data[SC__SHADOWFORM])) {
@ -4571,12 +4557,12 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
break; break;
case SR_DRAGONCOMBO: case SR_DRAGONCOMBO:
skillratio += 40 * skill_lv; skillratio += 100 + 80 * skill_lv;
RE_LVL_DMOD(100); RE_LVL_DMOD(100);
break; break;
case SR_FALLENEMPIRE: case SR_FALLENEMPIRE:
// ATK [(Skill Level x 250 + 100) x Caster Base Level / 150] % // ATK [(Skill Level x 300 + 100) x Caster Base Level / 150] %
skillratio += -100 + 250 * skill_lv + 100; skillratio += 300 * skill_lv;
RE_LVL_DMOD(150); RE_LVL_DMOD(150);
break; break;
case SR_TIGERCANNON: case SR_TIGERCANNON:
@ -4596,8 +4582,8 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
skillratio += skillratio * 30 / 100; skillratio += skillratio * 30 / 100;
break; break;
case SR_SKYNETBLOW: case SR_SKYNETBLOW:
//ATK [{(Skill Level x 80) + (Caster AGI)} x Caster Base Level / 100] % //ATK [{(Skill Level x 200) + (Caster AGI)} x Caster Base Level / 100] %
skillratio += -100 + 80 * skill_lv + sstatus->agi; skillratio += -100 + 200 * skill_lv + sstatus->agi / 6; // !TODO: Confirm AGI bonus
RE_LVL_DMOD(100); RE_LVL_DMOD(100);
break; break;
@ -4629,7 +4615,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
skillratio += skillratio * 30 / 100; skillratio += skillratio * 30 / 100;
break; break;
case SR_WINDMILL: // ATK [(Caster Base Level + Caster DEX) x Caster Base Level / 100] % case SR_WINDMILL: // ATK [(Caster Base Level + Caster DEX) x Caster Base Level / 100] %
skillratio += -100 + status_get_lv(src) + status_get_dex(src); skillratio += -100 + status_get_lv(src) + sstatus->dex;
RE_LVL_DMOD(100); RE_LVL_DMOD(100);
break; break;
case SR_GATEOFHELL: case SR_GATEOFHELL:
@ -4642,24 +4628,24 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
skillratio += skillratio * 30 / 100; skillratio += skillratio * 30 / 100;
break; break;
case SR_GENTLETOUCH_QUIET: case SR_GENTLETOUCH_QUIET:
skillratio += -100 + 100 * skill_lv + status_get_dex(src); skillratio += -100 + 100 * skill_lv + sstatus->dex;
RE_LVL_DMOD(100); RE_LVL_DMOD(100);
break; break;
case SR_HOWLINGOFLION: case SR_HOWLINGOFLION:
skillratio += -100 + 300 * skill_lv; skillratio += -100 + 500 * skill_lv;
RE_LVL_DMOD(150); RE_LVL_DMOD(100);
break; break;
case SR_RIDEINLIGHTNING: // ATK [{(Skill Level x 40) + Additional Damage} x Caster Base Level / 100] % case SR_RIDEINLIGHTNING:
skillratio += -100 + 40 * skill_lv; skillratio += -100 + 40 * skill_lv;
if (sd && sd->status.weapon == W_KNUCKLE) if (sd && sd->status.weapon == W_KNUCKLE)
skillratio += skillratio * 25 / 100; skillratio += 50 * skill_lv;
RE_LVL_DMOD(100); RE_LVL_DMOD(100);
break; break;
case WM_SEVERE_RAINSTORM_MELEE: case WM_SEVERE_RAINSTORM_MELEE:
//ATK [{(Caster DEX + AGI) x (Skill Level / 5)} x Caster Base Level / 100] % //ATK [{(Caster DEX / 300 + AGI / 200)} x Caster Base Level / 100] %
skillratio = (status_get_dex(src) + status_get_agi(src)) * skill_lv / 5; skillratio += -100 + 100 * skill_lv + (sstatus->dex / 300 + sstatus->agi / 200);
if (wd->miscflag&4) // Whip/Instrument equipped if (wd->miscflag&4) // Whip/Instrument equipped
skillratio += 100; // !TODO: What's the weapon bonus? skillratio += 20 * skill_lv;
RE_LVL_DMOD(100); RE_LVL_DMOD(100);
break; break;
case WM_GREAT_ECHO: case WM_GREAT_ECHO:
@ -4671,21 +4657,18 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
} }
RE_LVL_DMOD(100); RE_LVL_DMOD(100);
break; break;
case GN_CART_TORNADO: { // ATK [( Skill Level x 100 ) + ( Cart Weight / ( 150 - Caster Base STR ))] + ( Cart Remodeling Skill Level x 50 )] % case GN_CART_TORNADO: { // ATK [( Skill Level x 200 ) + ( Cart Weight / ( 150 - Caster Base STR ))] + ( Cart Remodeling Skill Level x 50 )] %
skillratio += -100 + 100 * skill_lv; skillratio += -100 + 200 * skill_lv;
if(sd && sd->cart_weight) if(sd && sd->cart_weight)
skillratio += sd->cart_weight / 10 / (150 - min(sd->status.str,120)) + pc_checkskill(sd,GN_REMODELING_CART) * 50; skillratio += sd->cart_weight / 10 / (150 - min(sd->status.str,120)) + pc_checkskill(sd,GN_REMODELING_CART) * 50;
} }
break; break;
case GN_CARTCANNON: case GN_CARTCANNON:
// ATK [{( INT / (6 - ( Cart Remodeling Skill Level ) )} + ( Cart Cannon Skill Level x 350 )] % skillratio += -100 + (250 + 20 * pc_checkskill(sd, GN_REMODELING_CART)) * skill_lv + 2 * sstatus->int_ / (6 - pc_checkskill(sd, GN_REMODELING_CART));
skillratio += -100 + 350 * skill_lv + sstatus->int_ / (6 - (sd ? pc_checkskill(sd, GN_REMODELING_CART) : 1));
RE_LVL_DMOD(100); RE_LVL_DMOD(100);
break; break;
case GN_SPORE_EXPLOSION: case GN_SPORE_EXPLOSION:
skillratio += -100 + 180 * skill_lv; skillratio += -100 + 400 + 200 * skill_lv;
if (wd->miscflag & 8)
skillratio += 200 + sstatus->int_; // Target receives extra damage
RE_LVL_DMOD(100); RE_LVL_DMOD(100);
break; break;
case GN_WALLOFTHORN: case GN_WALLOFTHORN:
@ -4791,22 +4774,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 += -100 + 300 * skill_lv * status_get_lv(src) / 100 + sstatus->dex; // !TODO: Confirm Base Level and DEX bonus skillratio += -100 + 450 * skill_lv * status_get_lv(src) / 100 + sstatus->dex / 6; // !TODO: Confirm Base Level and DEX bonus
break; break;
case MH_STAHL_HORN: case MH_STAHL_HORN:
skillratio += 900 + 100 * skill_lv * status_get_lv(src) / 150 + sstatus->vit; // !TODO: Confirm VIT bonus skillratio += -100 + 1000 + 300 * skill_lv * status_get_lv(src) / 150 + sstatus->vit / 6; // !TODO: Confirm VIT bonus
break; break;
case MH_LAVA_SLIDE: case MH_LAVA_SLIDE:
skillratio += -100 + 70 * skill_lv; skillratio += -100 + 50 * skill_lv;
break; break;
case MH_SONIC_CRAW: case MH_SONIC_CRAW:
skillratio += -100 + 60 * 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 + 250 * skill_lv * status_get_lv(src) / 100 + sstatus->str; // !TODO: Confirm STR bonus skillratio += -100 + 250 * skill_lv * status_get_lv(src) / 100 + sstatus->str / 6; // !TODO: Confirm STR bonus
break; break;
case MH_MIDNIGHT_FRENZY: case MH_MIDNIGHT_FRENZY:
skillratio += -100 + 350 * skill_lv * status_get_lv(src) / 150 + sstatus->str; // !TODO: Confirm STR bonus skillratio += -100 + 450 * skill_lv * status_get_lv(src) / 150 + sstatus->str / 6; // !TODO: Confirm STR bonus
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;
@ -4979,14 +4962,6 @@ static int64 battle_calc_skill_constant_addition(struct Damage* wd, struct block
atk = damagevalue; atk = damagevalue;
} }
break; break;
case SR_FALLENEMPIRE:
// [(Target Size value + Skill Level - 1) x Caster STR] + [(Target current weight x Caster DEX / 120)]
atk = ( ((tstatus->size+1)*2 + skill_lv - 1) * sstatus->str);
if( tsd && tsd->weight )
atk += ( (tsd->weight/10) * sstatus->dex / 120 );
else
atk += ( status_get_lv(target) * 50 ); //mobs
break;
} }
return atk; return atk;
} }
@ -5395,11 +5370,6 @@ static void battle_calc_attack_post_defense(struct Damage* wd, struct block_list
if(sd && pc_checkskill(sd,AS_SONICACCEL)>0) if(sd && pc_checkskill(sd,AS_SONICACCEL)>0)
ATK_ADDRATE(wd->damage, wd->damage2, 10); ATK_ADDRATE(wd->damage, wd->damage2, 10);
break; break;
case NC_AXETORNADO:
if( (sstatus->rhw.ele) == ELE_WIND || (sstatus->lhw.ele) == ELE_WIND )
ATK_ADDRATE(wd->damage, wd->damage2, 25);
break;
} }
} }
@ -5807,13 +5777,6 @@ static struct Damage initialize_weapon_data(struct block_list *src, struct block
case RK_WINDCUTTER: case RK_WINDCUTTER:
if (sd && (sd->status.weapon == W_1HSPEAR || sd->status.weapon == W_2HSPEAR)) if (sd && (sd->status.weapon == W_1HSPEAR || sd->status.weapon == W_2HSPEAR))
wd.flag |= BF_LONG; wd.flag |= BF_LONG;
// The number of hits is set to 3 by default for use in Inspiration status.
// When in Banding, the number of hits is equal to the number of Royal Guards in Banding.
case LG_HESPERUSLIT:
if( sc && sc->data[SC_BANDING] && sc->data[SC_BANDING]->val2 > 3 )
wd.div_ = sc->data[SC_BANDING]->val2;
break;
} }
} else { } else {
wd.flag |= is_skill_using_arrow(src, skill_id)?BF_LONG:BF_SHORT; wd.flag |= is_skill_using_arrow(src, skill_id)?BF_LONG:BF_SHORT;
@ -6037,9 +6000,16 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl
#ifdef RENEWAL #ifdef RENEWAL
if (is_attack_critical(&wd, src, target, skill_id, skill_lv, false)) { if (is_attack_critical(&wd, src, target, skill_id, skill_lv, false)) {
if (sd) { //Check for player so we don't crash out, monsters don't have bonus crit rates [helvetica] if (sd) { //Check for player so we don't crash out, monsters don't have bonus crit rates [helvetica]
if (skill_id > 0)
wd.damage = (int64)floor((float)((wd.damage * 140) / 100 * (100 + (sd->bonus.crit_atk_rate / 2))) / 100);
else
wd.damage = (int64)floor((float)((wd.damage * 140) / 100 * (100 + sd->bonus.crit_atk_rate)) / 100); wd.damage = (int64)floor((float)((wd.damage * 140) / 100 * (100 + sd->bonus.crit_atk_rate)) / 100);
if (is_attack_left_handed(src, skill_id)) if (is_attack_left_handed(src, skill_id)) {
if (skill_id > 0)
wd.damage2 = (int64)floor((float)((wd.damage2 * 140) / 100 * (100 + (sd->bonus.crit_atk_rate / 2))) / 100);
else
wd.damage2 = (int64)floor((float)((wd.damage2 * 140) / 100 * (100 + sd->bonus.crit_atk_rate)) / 100); wd.damage2 = (int64)floor((float)((wd.damage2 * 140) / 100 * (100 + sd->bonus.crit_atk_rate)) / 100);
}
} else } else
wd.damage = (int64)floor((float)(wd.damage * 140) / 100); wd.damage = (int64)floor((float)(wd.damage * 140) / 100);
@ -6251,10 +6221,6 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
case NPC_EARTHQUAKE: case NPC_EARTHQUAKE:
s_ele = ELE_NEUTRAL; s_ele = ELE_NEUTRAL;
break; break;
case LG_SHIELDSPELL:
if (skill_lv == 2)
s_ele = ELE_HOLY;
break;
case WL_HELLINFERNO: case WL_HELLINFERNO:
if (mflag & 2) { // ELE_DARK if (mflag & 2) { // ELE_DARK
s_ele = ELE_DARK; s_ele = ELE_DARK;
@ -6266,6 +6232,8 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
s_ele = sd->bonus.arrow_ele; s_ele = sd->bonus.arrow_ele;
break; break;
case SO_PSYCHIC_WAVE: case SO_PSYCHIC_WAVE:
if (sd && (sd->weapontype1 == W_STAFF || sd->weapontype1 == W_2HSTAFF || sd->weapontype1 == W_BOOK))
ad.div_ = 2;
if( sc && sc->count ) { if( sc && sc->count ) {
if( sc->data[SC_HEATER_OPTION] ) if( sc->data[SC_HEATER_OPTION] )
s_ele = sc->data[SC_HEATER_OPTION]->val3; s_ele = sc->data[SC_HEATER_OPTION]->val3;
@ -6281,6 +6249,14 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
if(sd && sd->spiritcharm_type != CHARM_TYPE_NONE && sd->spiritcharm > 0) if(sd && sd->spiritcharm_type != CHARM_TYPE_NONE && sd->spiritcharm > 0)
s_ele = sd->spiritcharm_type; s_ele = sd->spiritcharm_type;
break; break;
case AB_ADORAMUS:
if (sc && sc->data[SC_ANCILLA])
s_ele = ELE_NEUTRAL;
break;
case LG_RAYOFGENESIS:
if (sc && sc->data[SC_INSPIRATION])
s_ele = ELE_NEUTRAL;
break;
} }
//Set miscellaneous data that needs be filled //Set miscellaneous data that needs be filled
@ -6427,7 +6403,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
case MG_COLDBOLT: case MG_COLDBOLT:
case MG_LIGHTNINGBOLT: case MG_LIGHTNINGBOLT:
if (sc && sc->data[SC_SPELLFIST] && mflag&BF_SHORT) { if (sc && sc->data[SC_SPELLFIST] && mflag&BF_SHORT) {
skillratio += (sc->data[SC_SPELLFIST]->val4 * 100) + (sc->data[SC_SPELLFIST]->val1 * 50) - 100;// val4 = used bolt level, val2 = used spellfist level. [Rytech] skillratio += (sc->data[SC_SPELLFIST]->val3 * 100) + (sc->data[SC_SPELLFIST]->val1 * 50 - 50) - 100; // val3 = used bolt level, val1 = used spellfist level. [Rytech]
ad.div_ = 1; // ad mods, to make it work similar to regular hits [Xazax] ad.div_ = 1; // ad mods, to make it work similar to regular hits [Xazax]
ad.flag = BF_WEAPON|BF_SHORT; ad.flag = BF_WEAPON|BF_SHORT;
ad.type = DMG_NORMAL; ad.type = DMG_NORMAL;
@ -6570,7 +6546,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
skillratio += 3 * pc_checkskill(sd, BA_MUSICALLESSON); skillratio += 3 * pc_checkskill(sd, BA_MUSICALLESSON);
break; break;
case HW_GRAVITATION: case HW_GRAVITATION:
skillratio += -100 + 50 * skill_lv; skillratio += -100 + 100 * skill_lv;
RE_LVL_DMOD(100); RE_LVL_DMOD(100);
break; break;
case PA_PRESSURE: case PA_PRESSURE:
@ -6583,18 +6559,18 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
break; break;
#endif #endif
case AB_JUDEX: case AB_JUDEX:
skillratio += -100 + 300 + 40 * skill_lv; skillratio += -100 + 300 + 70 * skill_lv;
RE_LVL_DMOD(100); RE_LVL_DMOD(100);
break; break;
case AB_ADORAMUS: case AB_ADORAMUS:
skillratio += 230 + 70 * skill_lv; skillratio += - 100 + 300 + 250 * skill_lv;
RE_LVL_DMOD(100); RE_LVL_DMOD(100);
break; break;
case AB_DUPLELIGHT_MAGIC: case AB_DUPLELIGHT_MAGIC:
skillratio += 300 + 40 * skill_lv; skillratio += 300 + 40 * skill_lv;
break; break;
case WL_SOULEXPANSION: case WL_SOULEXPANSION:
skillratio += -100 + 750 + skill_lv * 150 + sstatus->int_; skillratio += -100 + 1000 + skill_lv * 200 + sstatus->int_ / 6; // !TODO: Confirm INT bonus
RE_LVL_DMOD(100); RE_LVL_DMOD(100);
break; break;
case WL_FROSTMISTY: case WL_FROSTMISTY:
@ -6632,7 +6608,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
RE_LVL_DMOD(100); RE_LVL_DMOD(100);
break; break;
case WL_COMET: case WL_COMET:
skillratio += -100 + 2500 + 500 * skill_lv; skillratio += -100 + 2500 + 700 * skill_lv;
RE_LVL_DMOD(100); RE_LVL_DMOD(100);
break; break;
case WL_CHAINLIGHTNING_ATK: case WL_CHAINLIGHTNING_ATK:
@ -6649,10 +6625,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
case WL_TETRAVORTEX_WATER: case WL_TETRAVORTEX_WATER:
case WL_TETRAVORTEX_WIND: case WL_TETRAVORTEX_WIND:
case WL_TETRAVORTEX_GROUND: case WL_TETRAVORTEX_GROUND:
if (skill_lv < 6) skillratio += -100 + 800 + 400 * skill_lv;
skillratio += -100 + 500 + 500 * skill_lv;
else
skillratio += -100 + 3000 + 200 * (skill_lv - 5);
break; break;
case WL_SUMMON_ATK_FIRE: case WL_SUMMON_ATK_FIRE:
case WL_SUMMON_ATK_WATER: case WL_SUMMON_ATK_WATER:
@ -6662,17 +6635,11 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
RE_LVL_DMOD(100); // ! TODO: Confirm new formula RE_LVL_DMOD(100); // ! TODO: Confirm new formula
break; break;
case LG_RAYOFGENESIS: case LG_RAYOFGENESIS:
skillratio += -100 + 200 * skill_lv; skillratio += -100 + 230 * skill_lv + sstatus->int_ / 6; // !TODO: What's the INT bonus?
if (sc && sc->data[SC_INSPIRATION]) if (sc && sc->data[SC_INSPIRATION])
skillratio += 1400; skillratio += 70 * skill_lv;
RE_LVL_DMOD(100); RE_LVL_DMOD(100);
break; break;
case LG_SHIELDSPELL: // [(Casters Base Level x 4) + (Shield MDEF x 100) + (Casters INT x 2)] %
if (sd && skill_lv == 2)
skillratio += -100 + status_get_lv(src) * 4 + sd->bonus.shieldmdef * 100 + status_get_int(src) * 2;
else
skillratio = 0;
break;
case WM_METALICSOUND: case WM_METALICSOUND:
skillratio += -100 + 120 * skill_lv + 60 * ((sd) ? pc_checkskill(sd, WM_LESSON) : 1); skillratio += -100 + 120 * skill_lv + 60 * ((sd) ? pc_checkskill(sd, WM_LESSON) : 1);
if (tsc && tsc->data[SC_SLEEP]) if (tsc && tsc->data[SC_SLEEP])
@ -6700,21 +6667,23 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
case NPC_ELECTRICWALK: case NPC_ELECTRICWALK:
skillratio += -100 + 100 * skill_lv; skillratio += -100 + 100 * skill_lv;
break; break;
case SO_EARTHGRAVE: case SO_EARTHGRAVE: // !TODO: Confirm formula
skillratio += -100 + sstatus->int_ * skill_lv + ((sd) ? pc_checkskill(sd, SA_SEISMICWEAPON) * 200 : 0); skillratio += -100 + sstatus->int_ / 6 * skill_lv + ((sd) ? pc_checkskill(sd, SA_SEISMICWEAPON) * 200 : 0);
RE_LVL_DMOD(100); RE_LVL_DMOD(100);
if( sc && sc->data[SC_CURSED_SOIL_OPTION] ) if( sc && sc->data[SC_CURSED_SOIL_OPTION] )
skillratio += (sd ? sd->status.job_level * 5 : 0); skillratio += (sd ? sd->status.job_level * 5 : 0);
break; break;
case SO_DIAMONDDUST: case SO_DIAMONDDUST: // !TODO: Confirm formula
skillratio = ( 200 * ((sd) ? pc_checkskill(sd, SA_FROSTWEAPON) : 0) + sstatus->int_ * skill_lv ); skillratio += -100 + 200 * ((sd) ? pc_checkskill(sd, SA_FROSTWEAPON) : 0) + sstatus->int_ / 6 * skill_lv;
RE_LVL_DMOD(100); RE_LVL_DMOD(100);
if( sc && sc->data[SC_COOLER_OPTION] ) if( sc && sc->data[SC_COOLER_OPTION] )
skillratio += (sd ? sd->status.job_level * 5 : 0); skillratio += (sd ? sd->status.job_level * 5 : 0);
break; break;
case SO_POISON_BUSTER: case SO_POISON_BUSTER:
skillratio += 900 + 300 * skill_lv; skillratio += -100 + 1000 + 300 * skill_lv + sstatus->int_ / 6; // !TODO: Confirm INT bonus
RE_LVL_DMOD(120); if( tsc && tsc->data[SC_CLOUD_POISON] )
skillratio += 200 * skill_lv;
RE_LVL_DMOD(100);
if( sc && sc->data[SC_CURSED_SOIL_OPTION] ) if( sc && sc->data[SC_CURSED_SOIL_OPTION] )
skillratio += (sd ? sd->status.job_level * 5 : 0); skillratio += (sd ? sd->status.job_level * 5 : 0);
break; break;
@ -6738,7 +6707,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
skillratio += -100 + 50 * skill_lv; skillratio += -100 + 50 * skill_lv;
break; break;
case SO_VARETYR_SPEAR: //MATK [{( Endow Tornado skill level x 50 ) + ( Caster INT x Varetyr Spear Skill level )} x Caster Base Level / 100 ] % case SO_VARETYR_SPEAR: //MATK [{( Endow Tornado skill level x 50 ) + ( Caster INT x Varetyr Spear Skill level )} x Caster Base Level / 100 ] %
skillratio += -100 + status_get_int(src) * skill_lv + ((sd) ? pc_checkskill(sd, SA_LIGHTNINGLOADER) * 50 : 0); skillratio += -100 + sstatus->int_ / 6 * skill_lv + ((sd) ? pc_checkskill(sd, SA_LIGHTNINGLOADER) * 50 : 0); // !TODO: Confirm new formula
RE_LVL_DMOD(100); RE_LVL_DMOD(100);
if (sc && sc->data[SC_BLAST_OPTION]) if (sc && sc->data[SC_BLAST_OPTION])
skillratio += (sd ? sd->status.job_level * 5 : 0); skillratio += (sd ? sd->status.job_level * 5 : 0);
@ -6779,13 +6748,13 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
break; break;
case MH_ERASER_CUTTER: case MH_ERASER_CUTTER:
case MH_XENO_SLASHER: case MH_XENO_SLASHER:
skillratio += -100 + 350 * skill_lv * status_get_lv(src) / 100 + sstatus->int_; // !TODO: Confirm Base Level and INT bonus skillratio += -100 + 450 * skill_lv * status_get_lv(src) / 100 + sstatus->int_ / 6; // !TODO: Confirm Base Level and INT bonus
break; break;
case MH_HEILIGE_STANGE: case MH_HEILIGE_STANGE:
skillratio += -100 + 1000 + 250 * skill_lv * status_get_lv(src) / 150 + sstatus->vit; // !TODO: Confirm VIT bonus skillratio += -100 + 1500 + 250 * skill_lv * status_get_lv(src) / 150 + sstatus->vit / 6; // !TODO: Confirm VIT bonus
break; break;
case MH_POISON_MIST: case MH_POISON_MIST:
skillratio += -100 + 40 * skill_lv * status_get_lv(src) / 100; skillratio += -100 + 200 * skill_lv * status_get_lv(src) / 100 + sstatus->dex / 6; // ! TODO: Confirm DEX bonus
break; break;
case SU_SV_STEMSPEAR: case SU_SV_STEMSPEAR:
skillratio += 600; skillratio += 600;
@ -7446,8 +7415,7 @@ int64 battle_calc_return_damage(struct block_list* bl, struct block_list *src, i
ssc = status_get_sc(src); ssc = status_get_sc(src);
if (sc) { // These statuses do not reflect any damage (off the target) if (sc) { // These statuses do not reflect any damage (off the target)
if (sc->data[SC_WHITEIMPRISON] || sc->data[SC_DARKCROW] || if (sc->data[SC_WHITEIMPRISON] || sc->data[SC_DARKCROW] || sc->data[SC_KYOMU])
(sc->data[SC_KYOMU] && (!ssc || !ssc->data[SC_SHIELDSPELL_DEF]))) // Nullify reflecting ability except for Shield Spell - Def
return 0; return 0;
} }
@ -7474,14 +7442,6 @@ int64 battle_calc_return_damage(struct block_list* bl, struct block_list *src, i
return 0; return 0;
} }
} }
if( sc->data[SC_REFLECTDAMAGE] && !skill_get_inf2(skill_id, INF2_ISTRAP)) {
if( rnd()%100 <= sc->data[SC_REFLECTDAMAGE]->val1*10 + 30 ){
max_damage = (int64)max_damage * status_get_lv(bl) / 100;
rdamage = (*dmg) * sc->data[SC_REFLECTDAMAGE]->val2 / 100;
if( --(sc->data[SC_REFLECTDAMAGE]->val3) < 1)
status_change_end(bl,SC_REFLECTDAMAGE,INVALID_TIMER);
}
} else {
if ( sc->data[SC_REFLECTSHIELD] && skill_id != WS_CARTTERMINATION ) { if ( sc->data[SC_REFLECTSHIELD] && skill_id != WS_CARTTERMINATION ) {
// Don't reflect non-skill attack if has SC_REFLECTSHIELD from Devotion bonus inheritance // Don't reflect non-skill attack if has SC_REFLECTSHIELD from Devotion bonus inheritance
if (!skill_id && battle_config.devotion_rdamage_skill_only && sc->data[SC_REFLECTSHIELD]->val4) if (!skill_id && battle_config.devotion_rdamage_skill_only && sc->data[SC_REFLECTSHIELD]->val4)
@ -7494,9 +7454,8 @@ int64 battle_calc_return_damage(struct block_list* bl, struct block_list *src, i
if (sc->data[SC_DEATHBOUND] && skill_id != WS_CARTTERMINATION && skill_id != GN_HELLS_PLANT_ATK && !status_bl_has_mode(src,MD_STATUSIMMUNE)) { if (sc->data[SC_DEATHBOUND] && skill_id != WS_CARTTERMINATION && skill_id != GN_HELLS_PLANT_ATK && !status_bl_has_mode(src,MD_STATUSIMMUNE)) {
if (distance_bl(src,bl) <= 0 || !map_check_dir(map_calc_dir(bl,src->x,src->y), unit_getdir(bl))) { if (distance_bl(src,bl) <= 0 || !map_check_dir(map_calc_dir(bl,src->x,src->y), unit_getdir(bl))) {
int64 rd1 = 0; int64 rd1 = min(damage, status_get_max_hp(bl)) * sc->data[SC_DEATHBOUND]->val2 / 100; // Amplify damage.
rd1 = min(damage,status_get_max_hp(bl)) * sc->data[SC_DEATHBOUND]->val2 / 100; // Amplify damage.
*dmg = rd1 * 30 / 100; // Received damage = 30% of amplified damage. *dmg = rd1 * 30 / 100; // Received damage = 30% of amplified damage.
clif_skill_damage(src, bl, gettick(), status_get_amotion(src), 0, -30000, 1, RK_DEATHBOUND, sc->data[SC_DEATHBOUND]->val1, DMG_SINGLE); clif_skill_damage(src, bl, gettick(), status_get_amotion(src), 0, -30000, 1, RK_DEATHBOUND, sc->data[SC_DEATHBOUND]->val1, DMG_SINGLE);
skill_blown(bl, src, skill_get_blewcount(RK_DEATHBOUND, 1), unit_getdir(src), BLOWN_NONE); skill_blown(bl, src, skill_get_blewcount(RK_DEATHBOUND, 1), unit_getdir(src), BLOWN_NONE);
@ -7504,12 +7463,6 @@ int64 battle_calc_return_damage(struct block_list* bl, struct block_list *src, i
rdamage += rd1 * 70 / 100; // Target receives 70% of the amplified damage. [Rytech] rdamage += rd1 * 70 / 100; // Target receives 70% of the amplified damage. [Rytech]
} }
} }
if( sc->data[SC_SHIELDSPELL_DEF] && sc->data[SC_SHIELDSPELL_DEF]->val1 == 2 && !status_bl_has_mode(src,MD_STATUSIMMUNE) ){
rdamage += damage * sc->data[SC_SHIELDSPELL_DEF]->val2 / 100;
rdamage = i64max(rdamage, 1);
}
}
} }
} else { } else {
if (!status_reflect && sd && sd->bonus.long_weapon_damage_return) { if (!status_reflect && sd && sd->bonus.long_weapon_damage_return) {
@ -7527,13 +7480,10 @@ int64 battle_calc_return_damage(struct block_list* bl, struct block_list *src, i
} }
if (ssc) { if (ssc) {
if (ssc->data[SC_INSPIRATION]) { if (ssc->data[SC_REFLECTDAMAGE]) {
rdamage += damage / 100; rdamage -= damage * ssc->data[SC_REFLECTDAMAGE]->val2 / 100;
#ifdef RENEWAL if (--(ssc->data[SC_REFLECTDAMAGE]->val3) < 1) // TODO: Confirm if reflect count still exists
rdamage = cap_value(rdamage, 1, max_damage); status_change_end(bl, SC_REFLECTDAMAGE, INVALID_TIMER);
#else
rdamage = i64max(rdamage, 1);
#endif
} }
if (ssc->data[SC_VENOMBLEED] && ssc->data[SC_VENOMBLEED]->val3 == 0) if (ssc->data[SC_VENOMBLEED] && ssc->data[SC_VENOMBLEED]->val3 == 0)
rdamage -= damage * ssc->data[SC_VENOMBLEED]->val2 / 100; rdamage -= damage * ssc->data[SC_VENOMBLEED]->val2 / 100;
@ -7901,10 +7851,10 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
if( sc && sc->count ) { if( sc && sc->count ) {
if (sc->data[SC_EXEEDBREAK]) if (sc->data[SC_EXEEDBREAK])
status_change_end(src, SC_EXEEDBREAK, INVALID_TIMER); status_change_end(src, SC_EXEEDBREAK, INVALID_TIMER);
if( sc->data[SC_SPELLFIST] ) { if( sc->data[SC_SPELLFIST] && !vellum_damage ){
if( --(sc->data[SC_SPELLFIST]->val1) >= 0 && !vellum_damage ){ if (status_charge(src, 0, 20)) {
if (!is_infinite_defense(target, wd.flag)) { if (!is_infinite_defense(target, wd.flag)) {
struct Damage ad = battle_calc_attack(BF_MAGIC, src, target, sc->data[SC_SPELLFIST]->val3, sc->data[SC_SPELLFIST]->val4, flag | BF_SHORT); struct Damage ad = battle_calc_attack(BF_MAGIC, src, target, sc->data[SC_SPELLFIST]->val2, sc->data[SC_SPELLFIST]->val3, flag | BF_SHORT);
wd.damage = ad.damage; wd.damage = ad.damage;
DAMAGE_DIV_FIX(wd.damage, wd.div_); // Double the damage for multiple hits. DAMAGE_DIV_FIX(wd.damage, wd.div_); // Double the damage for multiple hits.
@ -8058,10 +8008,9 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
(r_skill = (uint16)sc->data[SC__AUTOSHADOWSPELL]->val1) && (sk_idx = skill_get_index(r_skill)) && (r_skill = (uint16)sc->data[SC__AUTOSHADOWSPELL]->val1) && (sk_idx = skill_get_index(r_skill)) &&
sd->status.skill[sk_idx].id != 0 && sd->status.skill[sk_idx].flag == SKILL_FLAG_PLAGIARIZED ) sd->status.skill[sk_idx].id != 0 && sd->status.skill[sk_idx].flag == SKILL_FLAG_PLAGIARIZED )
{ {
int r_lv = sc->data[SC__AUTOSHADOWSPELL]->val2;
if (r_skill != AL_HOLYLIGHT && r_skill != PR_MAGNUS) { if (r_skill != AL_HOLYLIGHT && r_skill != PR_MAGNUS) {
int type; int r_lv = sc->data[SC__AUTOSHADOWSPELL]->val2, type;
if( (type = skill_get_casttype(r_skill)) == CAST_GROUND ) { if( (type = skill_get_casttype(r_skill)) == CAST_GROUND ) {
int maxcount = 0; int maxcount = 0;
std::shared_ptr<s_skill_db> skill = skill_db.find(r_skill); std::shared_ptr<s_skill_db> skill = skill_db.find(r_skill);
@ -9106,7 +9055,6 @@ static const struct _battle_data {
{ "death_penalty_maxlv", &battle_config.death_penalty_maxlv, 0, 0, 3, }, { "death_penalty_maxlv", &battle_config.death_penalty_maxlv, 0, 0, 3, },
{ "exp_cost_redemptio", &battle_config.exp_cost_redemptio, 1, 0, 100, }, { "exp_cost_redemptio", &battle_config.exp_cost_redemptio, 1, 0, 100, },
{ "exp_cost_redemptio_limit", &battle_config.exp_cost_redemptio_limit, 5, 0, MAX_PARTY, }, { "exp_cost_redemptio_limit", &battle_config.exp_cost_redemptio_limit, 5, 0, MAX_PARTY, },
{ "exp_cost_inspiration", &battle_config.exp_cost_inspiration, 1, 0, 100, },
{ "mvp_exp_reward_message", &battle_config.mvp_exp_reward_message, 0, 0, 1, }, { "mvp_exp_reward_message", &battle_config.mvp_exp_reward_message, 0, 0, 1, },
{ "can_damage_skill", &battle_config.can_damage_skill, 1, 0, BL_ALL, }, { "can_damage_skill", &battle_config.can_damage_skill, 1, 0, BL_ALL, },
{ "atcommand_levelup_events", &battle_config.atcommand_levelup_events, 0, 0, 1, }, { "atcommand_levelup_events", &battle_config.atcommand_levelup_events, 0, 0, 1, },

View File

@ -625,7 +625,6 @@ struct Battle_Config
int death_penalty_maxlv; int death_penalty_maxlv;
int exp_cost_redemptio; int exp_cost_redemptio;
int exp_cost_redemptio_limit; int exp_cost_redemptio_limit;
int exp_cost_inspiration;
int mvp_exp_reward_message; int mvp_exp_reward_message;
int can_damage_skill; //Which BL types can damage traps int can_damage_skill; //Which BL types can damage traps
int atcommand_levelup_events; int atcommand_levelup_events;

View File

@ -210,6 +210,11 @@ int hom_dead(struct homun_data *hd)
return 3; return 3;
clif_emotion(&sd->bl, ET_CRY); clif_emotion(&sd->bl, ET_CRY);
#ifdef RENEWAL
status_change_end(&sd->bl, status_skill2sc(AM_CALLHOMUN), INVALID_TIMER);
#endif
//Remove from map (if it has no intimacy, it is auto-removed from memory) //Remove from map (if it has no intimacy, it is auto-removed from memory)
return 3; return 3;
} }
@ -245,6 +250,11 @@ int hom_vaporize(struct map_session_data *sd, int flag)
} }
clif_hominfo(sd, sd->hd, 0); clif_hominfo(sd, sd->hd, 0);
hom_save(hd); hom_save(hd);
#ifdef RENEWAL
status_change_end(&sd->bl, status_skill2sc(AM_CALLHOMUN), INVALID_TIMER);
#endif
return unit_remove_map(&hd->bl, CLR_OUTSIGHT); return unit_remove_map(&hd->bl, CLR_OUTSIGHT);
} }
@ -1113,6 +1123,11 @@ bool hom_call(struct map_session_data *sd)
} else } else
//Warp him to master. //Warp him to master.
unit_warp(&hd->bl,sd->bl.m, sd->bl.x, sd->bl.y,CLR_OUTSIGHT); unit_warp(&hd->bl,sd->bl.m, sd->bl.x, sd->bl.y,CLR_OUTSIGHT);
#ifdef RENEWAL
sc_start(&sd->bl, &sd->bl, status_skill2sc(AM_CALLHOMUN), 100, 1, skill_get_time(AM_CALLHOMUN, 1));
#endif
return true; return true;
} }
@ -1168,6 +1183,11 @@ int hom_recv_data(uint32 account_id, struct s_homunculus *sh, int flag)
clif_homskillinfoblock(sd); clif_homskillinfoblock(sd);
hom_init_timers(hd); hom_init_timers(hd);
} }
#ifdef RENEWAL
sc_start(&sd->bl, &sd->bl, status_skill2sc(AM_CALLHOMUN), 100, 1, skill_get_time(AM_CALLHOMUN, 1));
#endif
return 1; return 1;
} }
@ -1252,6 +1272,11 @@ int hom_ressurect(struct map_session_data* sd, unsigned char per, short x, short
return 0; return 0;
clif_spawn(&hd->bl); clif_spawn(&hd->bl);
} }
#ifdef RENEWAL
sc_start(&sd->bl, &sd->bl, status_skill2sc(AM_CALLHOMUN), 100, 1, skill_get_time(AM_CALLHOMUN, 1));
#endif
return status_revive(&hd->bl, per, 0); return status_revive(&hd->bl, per, 0);
} }

View File

@ -124,6 +124,7 @@ enum item_itemid : t_itemid
ITEMID_WOB_LOCAL = 14585, ITEMID_WOB_LOCAL = 14585,
ITEMID_SIEGE_TELEPORT_SCROLL = 14591, ITEMID_SIEGE_TELEPORT_SCROLL = 14591,
ITEMID_WL_MB_SG = 100065, ITEMID_WL_MB_SG = 100065,
ITEMID_HOMUNCULUS_SUPPLEMENT = 100371,
}; };
///Rune Knight ///Rune Knight

View File

@ -1249,35 +1249,6 @@ int party_sub_count_class(struct block_list *bl, va_list ap)
return 1; return 1;
} }
/**
* Special check for Royal Guard's Banding skill.
* @param bl: Object invoking the counter
* @param ap: List of parameters: Check Type
* @return 1 or total HP on success or 0 otherwise
*/
int party_sub_count_banding(struct block_list *bl, va_list ap)
{
struct map_session_data *sd = (TBL_PC *)bl;
int type = va_arg(ap, int); // 0 = Banding Count, 1 = HP Check
if (sd->state.autotrade)
return 0;
if (battle_config.idle_no_share && pc_isidle_party(sd))
return 0;
if ((sd->class_&MAPID_THIRDMASK) != MAPID_ROYAL_GUARD)
return 0;
if (!sd->sc.data[SC_BANDING])
return 0;
if (type == 1)
return status_get_hp(bl);
return 1;
}
/// Executes 'func' for each party member on the same map and in range (0:whole map) /// Executes 'func' for each party member on the same map and in range (0:whole map)
int party_foreachsamemap(int (*func)(struct block_list*,va_list),struct map_session_data *sd,int range,...) int party_foreachsamemap(int (*func)(struct block_list*,va_list),struct map_session_data *sd,int range,...)
{ {

View File

@ -89,7 +89,6 @@ int party_share_loot(struct party_data* p, struct map_session_data* sd, struct i
int party_send_dot_remove(struct map_session_data *sd); int party_send_dot_remove(struct map_session_data *sd);
int party_sub_count(struct block_list *bl, va_list ap); int party_sub_count(struct block_list *bl, va_list ap);
int party_sub_count_class(struct block_list *bl, va_list ap); int party_sub_count_class(struct block_list *bl, va_list ap);
int party_sub_count_banding(struct block_list *bl, va_list ap);
int party_foreachsamemap(int (*func)(struct block_list *,va_list),struct map_session_data *sd,int range,...); int party_foreachsamemap(int (*func)(struct block_list *,va_list),struct map_session_data *sd,int range,...);
/*========================================== /*==========================================

View File

@ -15111,6 +15111,27 @@ BUILDIN_FUNC(gethominfo)
return SCRIPT_CMD_SUCCESS; return SCRIPT_CMD_SUCCESS;
} }
BUILDIN_FUNC(addhomintimacy)
{
map_session_data *sd;
homun_data *hd;
if (!script_charid2sd(3, sd) || !(hd = sd->hd))
return SCRIPT_CMD_FAILURE;
int32 value = script_getnum(st, 2);
if (value == 0) // Nothing to change
return SCRIPT_CMD_SUCCESS;
if (value > 0)
hom_increase_intimacy(hd, (uint32)value);
else
hom_decrease_intimacy(hd, (uint32)abs(value));
clif_send_homdata(sd, SP_INTIMATE, hd->homunculus.intimacy / 100);
return SCRIPT_CMD_SUCCESS;
}
/// Retrieves information about character's mercenary /// Retrieves information about character's mercenary
/// getmercinfo <type>[,<char id>]; /// getmercinfo <type>[,<char id>];
BUILDIN_FUNC(getmercinfo) BUILDIN_FUNC(getmercinfo)
@ -25405,6 +25426,7 @@ struct script_function buildin_func[] = {
BUILDIN_DEF(recovery,"i???"), BUILDIN_DEF(recovery,"i???"),
BUILDIN_DEF(getpetinfo,"i?"), BUILDIN_DEF(getpetinfo,"i?"),
BUILDIN_DEF(gethominfo,"i?"), BUILDIN_DEF(gethominfo,"i?"),
BUILDIN_DEF(addhomintimacy,"i?"),
BUILDIN_DEF(getmercinfo,"i?"), BUILDIN_DEF(getmercinfo,"i?"),
BUILDIN_DEF(checkequipedcard,"i"), BUILDIN_DEF(checkequipedcard,"i"),
BUILDIN_DEF(jump_zero,"il"), //for future jA script compatibility BUILDIN_DEF(jump_zero,"il"), //for future jA script compatibility

View File

@ -1240,9 +1240,9 @@
export_constant(SC_LEECHESEND); export_constant(SC_LEECHESEND);
export_constant(SC_REFLECTDAMAGE); export_constant(SC_REFLECTDAMAGE);
export_constant(SC_FORCEOFVANGUARD); export_constant(SC_FORCEOFVANGUARD);
export_constant(SC_SHIELDSPELL_DEF); export_constant(SC_SHIELDSPELL_HP);
export_constant(SC_SHIELDSPELL_MDEF); export_constant(SC_SHIELDSPELL_SP);
export_constant(SC_SHIELDSPELL_REF); export_constant(SC_SHIELDSPELL_ATK);
export_constant(SC_EXEEDBREAK); export_constant(SC_EXEEDBREAK);
export_constant(SC_PRESTIGE); export_constant(SC_PRESTIGE);
export_constant(SC_BANDING); export_constant(SC_BANDING);
@ -1612,6 +1612,11 @@
export_constant(SC_EMERGENCY_MOVE); export_constant(SC_EMERGENCY_MOVE);
export_constant(SC_MADOGEAR); export_constant(SC_MADOGEAR);
export_constant(SC_NPC_HALLUCINATIONWALK); export_constant(SC_NPC_HALLUCINATIONWALK);
export_constant(SC_OVERBRANDREADY);
export_constant(SC_POISON_MIST);
export_constant(SC_STONE_WALL);
export_constant(SC_CLOUD_POISON);
export_constant(SC_HOMUN_TIME);
#ifdef RENEWAL #ifdef RENEWAL
export_constant(SC_EXTREMITYFIST2); export_constant(SC_EXTREMITYFIST2);
#endif #endif

View File

@ -113,8 +113,6 @@ int firerain_unit_pos;
int wallofthorn_unit_pos; int wallofthorn_unit_pos;
struct s_skill_nounit_layout skill_nounit_layout[MAX_SKILL_UNIT_LAYOUT2]; struct s_skill_nounit_layout skill_nounit_layout[MAX_SKILL_UNIT_LAYOUT2];
int overbrand_nounit_pos;
int overbrand_brandish_nounit_pos;
static char dir_ka = -1; // Holds temporary direction to the target for SR_KNUCKLEARROW static char dir_ka = -1; // Holds temporary direction to the target for SR_KNUCKLEARROW
@ -1148,17 +1146,6 @@ struct s_skill_unit_layout *skill_get_unit_layout(uint16 skill_id, uint16 skill_
return &skill_unit_layout[0]; // default 1x1 layout return &skill_unit_layout[0]; // default 1x1 layout
} }
struct s_skill_nounit_layout* skill_get_nounit_layout(uint16 skill_id, uint16 skill_lv, struct block_list* src, int x, int y, int dir)
{
if( skill_id == LG_OVERBRAND )
return &skill_nounit_layout[overbrand_nounit_pos + dir];
else if( skill_id == LG_OVERBRAND_BRANDISH )
return &skill_nounit_layout[overbrand_brandish_nounit_pos + dir];
ShowError("skill_get_nounit_layout: unknown no-unit layout for skill %d (level %d)\n", skill_id, skill_lv);
return &skill_nounit_layout[0];
}
/** Stores temporary values. /** Stores temporary values.
* Common usages: * Common usages:
* [0] holds number of targets in area * [0] holds number of targets in area
@ -1334,8 +1321,6 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1
else else
clif_skill_fail(sd,RG_SNATCHER,USESKILL_FAIL_LEVEL,0); clif_skill_fail(sd,RG_SNATCHER,USESKILL_FAIL_LEVEL,0);
} }
if(sc && sc->data[SC_PYROCLASTIC] && ((rnd()%100)<=sc->data[SC_PYROCLASTIC]->val3) )
skill_castend_pos2(src, bl->x, bl->y, BS_HAMMERFALL,sc->data[SC_PYROCLASTIC]->val1, tick, 0);
} }
if (sc) { if (sc) {
@ -1762,9 +1747,6 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1
break; break;
case NC_POWERSWING: case NC_POWERSWING:
sc_start(src,bl, SC_STUN, 10, skill_lv, skill_get_time(skill_id, skill_lv)); sc_start(src,bl, SC_STUN, 10, skill_lv, skill_get_time(skill_id, skill_lv));
skill = pc_checkskill(sd, NC_AXEBOOMERANG);
if (sd && skill > 0 && (sd->status.weapon == W_1HAXE || sd->status.weapon == W_2HAXE) && rnd() % 100 < 5 * skill_lv)
skill_castend_damage_id(src, bl, NC_AXEBOOMERANG, skill, tick, 1);
break; break;
case GC_WEAPONCRUSH: case GC_WEAPONCRUSH:
skill_castend_nodamage_id(src,bl,skill_id,skill_lv,tick,BCT_ENEMY); skill_castend_nodamage_id(src,bl,skill_id,skill_lv,tick,BCT_ENEMY);
@ -1789,33 +1771,21 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1
break; break;
} }
break; break;
case LG_MOONSLASHER: case LG_MOONSLASHER:
rate = 32 + 8 * skill_lv; sc_start(src,src,SC_OVERBRANDREADY,100,skill_lv,skill_get_time2(skill_id,skill_lv));
if( rnd()%100 < rate && dstsd ) // Uses skill_addtimerskill to avoid damage and setsit packet overlaping. Officially clif_setsit is received about 500 ms after damage packet.
skill_addtimerskill(src,tick+500,bl->id,0,0,skill_id,skill_lv,BF_WEAPON,0);
else if( dstmd )
sc_start(src,bl,SC_STOP,100,skill_lv,skill_get_time(skill_id,skill_lv) + 1000 * (rnd()%3));
break; break;
case LG_RAYOFGENESIS: // 50% chance to cause Blind on Undead and Demon monsters. case LG_RAYOFGENESIS: // 50% chance to cause Blind on Undead and Demon monsters.
if ( battle_check_undead(status_get_race(bl), status_get_element(bl)) || status_get_race(bl) == RC_DEMON ) if ( battle_check_undead(tstatus->race, tstatus->def_ele) || tstatus->race == RC_DEMON )
sc_start(src,bl, SC_BLIND, 50, skill_lv, skill_get_time(skill_id,skill_lv)); sc_start(src,bl, SC_BLIND, 50, skill_lv, skill_get_time(skill_id,skill_lv));
break; break;
case LG_EARTHDRIVE:
skill_break_equip(src,src, EQP_SHIELD, 100 * skill_lv, BCT_SELF);
sc_start(src,bl, SC_EARTHDRIVE, 100, skill_lv, skill_get_time(skill_id, skill_lv));
break;
case LG_HESPERUSLIT: case LG_HESPERUSLIT:
if( sc && sc->data[SC_BANDING] && sc->data[SC_BANDING]->val2 > 3 )
status_change_start(src,bl, SC_STUN, 10000, skill_lv, 0, 0, 0, rnd_value(4000, 8000), SCSTART_NOTICKDEF);
if( pc_checkskill(sd,LG_PINPOINTATTACK) > 0 && sc && sc->data[SC_BANDING] && sc->data[SC_BANDING]->val2 > 5 ) if( pc_checkskill(sd,LG_PINPOINTATTACK) > 0 && sc && sc->data[SC_BANDING] && sc->data[SC_BANDING]->val2 > 5 )
skill_castend_damage_id(src,bl,LG_PINPOINTATTACK,rnd_value(1, pc_checkskill(sd,LG_PINPOINTATTACK)),tick,0); skill_castend_damage_id(src,bl,LG_PINPOINTATTACK,rnd_value(1, pc_checkskill(sd,LG_PINPOINTATTACK)),tick,0);
break; break;
case SR_DRAGONCOMBO: case SR_DRAGONCOMBO:
sc_start(src,bl, SC_STUN, 1 + skill_lv, skill_lv, skill_get_time(skill_id, skill_lv)); sc_start(src,bl, SC_STUN, 1 + skill_lv, skill_lv, skill_get_time(skill_id, skill_lv));
break; break;
case SR_FALLENEMPIRE:
sc_start(src,bl, SC_STOP, 100, skill_lv, skill_get_time(skill_id, skill_lv));
break;
case SR_WINDMILL: case SR_WINDMILL:
if( dstsd ) if( dstsd )
skill_addtimerskill(src,tick+status_get_amotion(src),bl->id,0,0,skill_id,skill_lv,BF_WEAPON,0); skill_addtimerskill(src,tick+status_get_amotion(src),bl->id,0,0,skill_id,skill_lv,BF_WEAPON,0);
@ -1830,9 +1800,6 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1
sc_start(src, bl, SC_EARTHSHAKER, 100, skill_lv, skill_get_time2(skill_id, skill_lv)); sc_start(src, bl, SC_EARTHSHAKER, 100, skill_lv, skill_get_time2(skill_id, skill_lv));
status_change_end(bl, SC_SV_ROOTTWIST, INVALID_TIMER); status_change_end(bl, SC_SV_ROOTTWIST, INVALID_TIMER);
break; break;
case SR_HOWLINGOFLION:
sc_start(src,bl, SC_FEAR, 5 + 5 * skill_lv, skill_lv, skill_get_time(skill_id, skill_lv));
break;
case SO_EARTHGRAVE: case SO_EARTHGRAVE:
sc_start2(src,bl, SC_BLEEDING, 5 * skill_lv, skill_lv, src->id, skill_get_time2(skill_id, skill_lv)); // Need official rate. [LimitLine] sc_start2(src,bl, SC_BLEEDING, 5 * skill_lv, skill_lv, src->id, skill_get_time2(skill_id, skill_lv)); // Need official rate. [LimitLine]
break; break;
@ -1845,6 +1812,12 @@ 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 SO_POISON_BUSTER:
sc_start(src,bl, SC_POISON, 5 * skill_lv, skill_lv, skill_get_time(skill_id, skill_lv));
break;
case GN_SPORE_EXPLOSION:
sc_start(src, bl, status_skill2sc(skill_id), 100, skill_lv, skill_get_time(skill_id, skill_lv));
break;
case GN_SLINGITEM_RANGEMELEEATK: case GN_SLINGITEM_RANGEMELEEATK:
if( sd ) { if( sd ) {
switch( sd->itemid ) { // Starting SCs here instead of do it in skill_additional_effect to simplify the code. switch( sd->itemid ) { // Starting SCs here instead of do it in skill_additional_effect to simplify the code.
@ -1909,9 +1882,6 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1
} }
} }
break; break;
case MH_LAVA_SLIDE:
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: case MH_STAHL_HORN:
sc_start(src,bl, SC_STUN, 20 + 2 * skill_lv, 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;
@ -2033,7 +2003,7 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1
case SC_ENTRY_QUEUE_APPLY_DELAY: case SC_ENTRY_QUEUE_NOTIFY_ADMISSION_TIME_OUT: case SC_ENTRY_QUEUE_APPLY_DELAY: case SC_ENTRY_QUEUE_NOTIFY_ADMISSION_TIME_OUT:
case SC_REUSE_LIMIT_LUXANIMA: case SC_LUXANIMA: case SC_SOULENERGY: case SC_REUSE_LIMIT_LUXANIMA: case SC_LUXANIMA: case SC_SOULENERGY:
case SC_EP16_2_BUFF_SS: case SC_EP16_2_BUFF_SC: case SC_EP16_2_BUFF_AC: case SC_EP16_2_BUFF_SS: case SC_EP16_2_BUFF_SC: case SC_EP16_2_BUFF_AC:
case SC_EMERGENCY_MOVE: case SC_MADOGEAR: case SC_EMERGENCY_MOVE: case SC_MADOGEAR: case SC_HOMUN_TIME:
continue; continue;
case SC_WHISTLE: case SC_ASSNCROS: case SC_POEMBRAGI: case SC_WHISTLE: case SC_ASSNCROS: case SC_POEMBRAGI:
case SC_APPLEIDUN: case SC_HUMMING: case SC_DONTFORGETME: case SC_APPLEIDUN: case SC_HUMMING: case SC_DONTFORGETME:
@ -2242,7 +2212,9 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1
sd->state.autocast = 1; sd->state.autocast = 1;
skill_consume_requirement(sd,skill,autospl_skill_lv,1); skill_consume_requirement(sd,skill,autospl_skill_lv,1);
#ifndef RENEWAL
skill_toggle_magicpower(src, skill); skill_toggle_magicpower(src, skill);
#endif
switch (type) { switch (type) {
case CAST_GROUND: case CAST_GROUND:
skill_castend_pos2(src, tbl->x, tbl->y, skill, autospl_skill_lv, tick, 0); skill_castend_pos2(src, tbl->x, tbl->y, skill, autospl_skill_lv, tick, 0);
@ -2438,8 +2410,9 @@ int skill_counter_additional_effect (struct block_list* src, struct block_list *
break; break;
case LG_HESPERUSLIT: case LG_HESPERUSLIT:
{ {
struct status_change *sc = status_get_sc(src); status_change *sc = status_get_sc(src);
if( sc && sc->data[SC_FORCEOFVANGUARD] && sc->data[SC_BANDING] && sc->data[SC_BANDING]->val2 > 6 ) {
if( sc && sc->data[SC_FORCEOFVANGUARD]) {
for(int i = 0; i < sc->data[SC_FORCEOFVANGUARD]->val3; i++ ) for(int i = 0; i < sc->data[SC_FORCEOFVANGUARD]->val3; i++ )
pc_addspiritball(sd, skill_get_time(LG_FORCEOFVANGUARD,1),sc->data[SC_FORCEOFVANGUARD]->val3); pc_addspiritball(sd, skill_get_time(LG_FORCEOFVANGUARD,1),sc->data[SC_FORCEOFVANGUARD]->val3);
} }
@ -3236,11 +3209,6 @@ void skill_attack_blow(struct block_list *src, struct block_list *dsrc, struct b
// Blown-specific handling // Blown-specific handling
switch( skill_id ) { switch( skill_id ) {
case LG_OVERBRAND_BRANDISH:
// Give knockback damage bonus only hits the wall. (bugreport:9096)
if (skill_blown(dsrc,target,blewcount,dir,(enum e_skill_blown)(BLOWN_NO_KNOCKBACK_MAP|BLOWN_MD_KNOCKBACK_IMMUNE|BLOWN_TARGET_NO_KNOCKBACK|BLOWN_TARGET_BASILICA)) < blewcount)
skill_addtimerskill(src, tick + status_get_amotion(src), target->id, 0, 0, LG_OVERBRAND_PLUSATK, skill_lv, BF_WEAPON, flag|SD_ANIMATION);
break;
case SR_KNUCKLEARROW: case SR_KNUCKLEARROW:
// Ignore knockback damage bonus if in WOE (player cannot be knocked in WOE) // Ignore knockback damage bonus if in WOE (player cannot be knocked in WOE)
// Boss & Immune Knockback stay in place and don't get bonus damage // Boss & Immune Knockback stay in place and don't get bonus damage
@ -3565,12 +3533,6 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
case LG_SHIELDPRESS: case LG_SHIELDPRESS:
dmg.dmotion = clif_skill_damage(dsrc, bl, tick, status_get_amotion(src), dmg.dmotion, damage, dmg.div_, skill_id, -1, DMG_SINGLE); dmg.dmotion = clif_skill_damage(dsrc, bl, tick, status_get_amotion(src), dmg.dmotion, damage, dmg.div_, skill_id, -1, DMG_SINGLE);
break; break;
case LG_OVERBRAND:
case LG_OVERBRAND_BRANDISH:
dmg.amotion = status_get_amotion(src) * 2;
case LG_OVERBRAND_PLUSATK:
dmg.dmotion = clif_skill_damage(dsrc,bl,tick,status_get_amotion(src),dmg.dmotion,damage,dmg.div_,skill_id,-1,DMG_SPLASH);
break;
case NPC_EARTHQUAKE: case NPC_EARTHQUAKE:
dmg.dmotion = clif_skill_damage(src, bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -1, DMG_ENDURE); dmg.dmotion = clif_skill_damage(src, bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -1, DMG_ENDURE);
break; break;
@ -3608,9 +3570,6 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
case WM_SEVERE_RAINSTORM_MELEE: case WM_SEVERE_RAINSTORM_MELEE:
dmg.dmotion = clif_skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,WM_SEVERE_RAINSTORM,-2,DMG_SPLASH); dmg.dmotion = clif_skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,WM_SEVERE_RAINSTORM,-2,DMG_SPLASH);
break; break;
case SR_TIGERCANNON:
dmg.dmotion = clif_skill_damage(src, bl, tick, status_get_amotion(bl), dmg.dmotion, damage, dmg.div_, skill_id, skill_lv, DMG_SINGLE);
break;
case HT_CLAYMORETRAP: case HT_CLAYMORETRAP:
case HT_BLASTMINE: case HT_BLASTMINE:
case HT_FLASHER: case HT_FLASHER:
@ -4217,7 +4176,6 @@ static TIMER_FUNC(skill_timerskill){
case SR_DRAGONCOMBO: case SR_DRAGONCOMBO:
case SR_FALLENEMPIRE: case SR_FALLENEMPIRE:
case SR_TIGERCANNON: case SR_TIGERCANNON:
case SR_SKYNETBLOW:
if (src->type != BL_PC) if (src->type != BL_PC)
continue; continue;
break; // Exceptions break; // Exceptions
@ -4295,7 +4253,9 @@ static TIMER_FUNC(skill_timerskill){
} }
break; break;
case WL_CHAINLIGHTNING_ATK: { case WL_CHAINLIGHTNING_ATK: {
#ifndef RENEWAL
skill_toggle_magicpower(src, skl->skill_id); // Only the first hit will be amplified skill_toggle_magicpower(src, skl->skill_id); // Only the first hit will be amplified
#endif
skill_attack(BF_MAGIC,src,src,target,skl->skill_id,skl->skill_lv,tick,9 - skl->type); // Hit a Lightning on the current Target skill_attack(BF_MAGIC,src,src,target,skl->skill_id,skl->skill_lv,tick,9 - skl->type); // Hit a Lightning on the current Target
if( skl->type < (4 + skl->skill_lv - 1) && skl->x < 3 ) if( skl->type < (4 + skl->skill_lv - 1) && skl->x < 3 )
{ // Remaining Chains Hit { // Remaining Chains Hit
@ -4338,7 +4298,6 @@ static TIMER_FUNC(skill_timerskill){
case NPC_REVERBERATION_ATK: case NPC_REVERBERATION_ATK:
skill_castend_damage_id(src,target,skl->skill_id,skl->skill_lv,tick,skl->flag|SD_LEVEL|SD_ANIMATION); skill_castend_damage_id(src,target,skl->skill_id,skl->skill_lv,tick,skl->flag|SD_LEVEL|SD_ANIMATION);
break; break;
case LG_MOONSLASHER:
case SR_WINDMILL: case SR_WINDMILL:
if( target->type == BL_PC ) { if( target->type == BL_PC ) {
struct map_session_data *tsd = NULL; struct map_session_data *tsd = NULL;
@ -4368,7 +4327,6 @@ static TIMER_FUNC(skill_timerskill){
case SR_DRAGONCOMBO: case SR_DRAGONCOMBO:
case SR_FALLENEMPIRE: case SR_FALLENEMPIRE:
case SR_TIGERCANNON: case SR_TIGERCANNON:
case SR_SKYNETBLOW:
if( src->type == BL_PC ) { if( src->type == BL_PC ) {
if( distance_xy(src->x, src->y, target->x, target->y) >= 3 ) if( distance_xy(src->x, src->y, target->x, target->y) >= 3 )
break; break;
@ -4404,15 +4362,6 @@ static TIMER_FUNC(skill_timerskill){
case WL_EARTHSTRAIN: case WL_EARTHSTRAIN:
skill_unitsetting(src,skl->skill_id,skl->skill_lv,skl->x,skl->y,(skl->type<<16)|skl->flag); skill_unitsetting(src,skl->skill_id,skl->skill_lv,skl->x,skl->y,(skl->type<<16)|skl->flag);
break; break;
case LG_OVERBRAND_BRANDISH: {
int i, dir = map_calc_dir(src,skl->x,skl->y);
int x = src->x, y = src->y;
struct s_skill_nounit_layout *layout = skill_get_nounit_layout(skl->skill_id,skl->skill_lv,src,x,y,dir);
for( i = 0; i < layout->count; i++ )
map_foreachincell(skill_area_sub,src->m,x+layout->dx[i],y+layout->dy[i],BL_CHAR,src,skl->skill_id,skl->skill_lv,tick,skl->flag|BCT_ENEMY|SD_ANIMATION|1,skill_castend_damage_id);
}
break;
case RL_FIRE_RAIN: { case RL_FIRE_RAIN: {
int dummy = 1, i = skill_get_splash(skl->skill_id,skl->skill_lv); int dummy = 1, i = skill_get_splash(skl->skill_id,skl->skill_lv);
@ -4484,7 +4433,6 @@ int skill_cleartimerskill (struct block_list *src)
case SR_DRAGONCOMBO: case SR_DRAGONCOMBO:
case SR_FALLENEMPIRE: case SR_FALLENEMPIRE:
case SR_TIGERCANNON: case SR_TIGERCANNON:
case SR_SKYNETBLOW:
if (src->type != BL_PC) if (src->type != BL_PC)
break; break;
continue; continue;
@ -4836,8 +4784,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
case LG_SHIELDPRESS: case LG_SHIELDPRESS:
case LG_RAGEBURST: case LG_RAGEBURST:
case LG_HESPERUSLIT: case LG_HESPERUSLIT:
case LG_OVERBRAND: case SR_DRAGONCOMBO:
case LG_OVERBRAND_BRANDISH:
case SR_FALLENEMPIRE: case SR_FALLENEMPIRE:
case SR_CRESCENTELBOW_AUTOSPELL: case SR_CRESCENTELBOW_AUTOSPELL:
case SR_GATEOFHELL: case SR_GATEOFHELL:
@ -4916,9 +4863,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
break; break;
case NC_FLAMELAUNCHER: case NC_FLAMELAUNCHER:
case LG_CANNONSPEAR:
if(skill_id == LG_CANNONSPEAR)
clif_skill_damage(src, bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE);
skill_area_temp[1] = bl->id; skill_area_temp[1] = bl->id;
if (battle_config.skill_eightpath_algorithm) { if (battle_config.skill_eightpath_algorithm) {
//Use official AoE algorithm //Use official AoE algorithm
@ -4932,8 +4876,10 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
} }
break; break;
#ifndef RENEWAL
case SN_SHARPSHOOTING: case SN_SHARPSHOOTING:
flag |= 2; // Flag for specific mob damage formula flag |= 2; // Flag for specific mob damage formula
#endif
case MA_SHARPSHOOTING: case MA_SHARPSHOOTING:
case NJ_KAMAITACHI: case NJ_KAMAITACHI:
case NPC_DARKPIERCING: case NPC_DARKPIERCING:
@ -4948,8 +4894,10 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
if (!(map_foreachindir(skill_attack_area, src->m, src->x, src->y, bl->x, bl->y, if (!(map_foreachindir(skill_attack_area, src->m, src->x, src->y, bl->x, bl->y,
skill_get_splash(skill_id, skill_lv), skill_get_maxcount(skill_id, skill_lv), 0, splash_target(src), skill_get_splash(skill_id, skill_lv), skill_get_maxcount(skill_id, skill_lv), 0, splash_target(src),
skill_get_type(skill_id), src, src, skill_id, skill_lv, tick, flag, BCT_ENEMY))) { skill_get_type(skill_id), src, src, skill_id, skill_lv, tick, flag, BCT_ENEMY))) {
#ifndef RENEWAL
if (skill_id == SN_SHARPSHOOTING) if (skill_id == SN_SHARPSHOOTING)
flag &= ~2; // Only targets in the splash area are affected flag &= ~2; // Only targets in the splash area are affected
#endif
//These skills hit at least the target if the AoE doesn't hit //These skills hit at least the target if the AoE doesn't hit
skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, flag); skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, flag);
@ -4959,8 +4907,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
skill_get_splash(skill_id, skill_lv), skill_get_maxcount(skill_id, skill_lv), splash_target(src), skill_get_splash(skill_id, skill_lv), skill_get_maxcount(skill_id, skill_lv), splash_target(src),
skill_get_type(skill_id), src, src, skill_id, skill_lv, tick, flag, BCT_ENEMY); skill_get_type(skill_id), src, src, skill_id, skill_lv, tick, flag, BCT_ENEMY);
} }
if (skill_id == SN_SHARPSHOOTING)
status_change_end(src, SC_CAMOUFLAGE, INVALID_TIMER);
break; break;
case MO_INVESTIGATE: case MO_INVESTIGATE:
@ -5103,6 +5049,9 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
case MG_NAPALMBEAT: case MG_NAPALMBEAT:
case MG_FIREBALL: case MG_FIREBALL:
case RG_RAID: case RG_RAID:
#ifdef RENEWAL
case SN_SHARPSHOOTING:
#endif
case HW_NAPALMVULCAN: case HW_NAPALMVULCAN:
case NJ_HUUMA: case NJ_HUUMA:
case ASC_METEORASSAULT: case ASC_METEORASSAULT:
@ -5130,13 +5079,17 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
case NC_AXETORNADO: case NC_AXETORNADO:
case GC_ROLLINGCUTTER: case GC_ROLLINGCUTTER:
case GC_COUNTERSLASH: case GC_COUNTERSLASH:
case LG_CANNONSPEAR:
case LG_OVERBRAND:
case LG_MOONSLASHER: case LG_MOONSLASHER:
case LG_RAYOFGENESIS:
case LG_EARTHDRIVE: case LG_EARTHDRIVE:
case SR_RAMPAGEBLASTER: case SR_RAMPAGEBLASTER:
case SR_SKYNETBLOW: case SR_SKYNETBLOW:
case SR_WINDMILL: case SR_WINDMILL:
case SR_RIDEINLIGHTNING: case SR_RIDEINLIGHTNING:
case SO_VARETYR_SPEAR: case SO_VARETYR_SPEAR:
case SO_POISON_BUSTER:
case GN_CART_TORNADO: case GN_CART_TORNADO:
case GN_CARTCANNON: case GN_CARTCANNON:
case GN_SPORE_EXPLOSION: case GN_SPORE_EXPLOSION:
@ -5186,13 +5139,23 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
break; break;
heal = (int)skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, sflag); heal = (int)skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, sflag);
if( skill_id == NPC_VAMPIRE_GIFT && heal > 0 ) {
switch (skill_id) {
case NPC_VAMPIRE_GIFT:
if (heal > 0) {
clif_skill_nodamage(NULL, src, AL_HEAL, heal, 1); clif_skill_nodamage(NULL, src, AL_HEAL, heal, 1);
status_heal(src, heal, 0, 0); status_heal(src, heal, 0, 0);
} }
break;
if (skill_id == SJ_PROMINENCEKICK) // Trigger the 2nd hit. (100% fire damage.) #ifdef RENEWAL
case SN_SHARPSHOOTING:
status_change_end(src, SC_CAMOUFLAGE, INVALID_TIMER);
break;
#endif
case SJ_PROMINENCEKICK: // Trigger the 2nd hit. (100% fire damage.)
skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, sflag|8|SD_ANIMATION); skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, sflag|8|SD_ANIMATION);
break;
}
} else { } else {
int starget = BL_CHAR|BL_SKILL; int starget = BL_CHAR|BL_SKILL;
@ -5449,7 +5412,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
case NJ_HUUJIN: case NJ_HUUJIN:
case AB_HIGHNESSHEAL: case AB_HIGHNESSHEAL:
case AB_DUPLELIGHT_MAGIC: case AB_DUPLELIGHT_MAGIC:
case LG_RAYOFGENESIS:
case WM_METALICSOUND: case WM_METALICSOUND:
case KO_KAIHOU: case KO_KAIHOU:
case MH_ERASER_CUTTER: case MH_ERASER_CUTTER:
@ -5802,7 +5764,9 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
if (sd) { if (sd) {
int i; int i;
#ifndef RENEWAL
skill_toggle_magicpower(src, skill_id); // No hit will be amplified skill_toggle_magicpower(src, skill_id); // No hit will be amplified
#endif
if (skill_lv == 1) { // SpellBook if (skill_lv == 1) { // SpellBook
if (sc->data[SC_FREEZE_SP] == nullptr) if (sc->data[SC_FREEZE_SP] == nullptr)
break; break;
@ -5964,17 +5928,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag); skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag);
break; break;
case LG_SHIELDSPELL:
if (skill_lv == 1)
skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag);
else if (skill_lv == 2)
skill_attack(BF_MAGIC,src,src,bl,skill_id,skill_lv,tick,flag);
break;
case SR_DRAGONCOMBO:
skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag);
break;
case SR_KNUCKLEARROW: case SR_KNUCKLEARROW:
// Holds current direction of bl/target to src/attacker before the src is moved to bl location // Holds current direction of bl/target to src/attacker before the src is moved to bl location
dir_ka = map_calc_dir(bl, src->x, src->y); dir_ka = map_calc_dir(bl, src->x, src->y);
@ -6021,14 +5974,10 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
case SR_TIGERCANNON: case SR_TIGERCANNON:
if (flag & 1) { if (flag & 1) {
if (skill_area_temp[1] != bl->id && skill_area_temp[3] == skill_id)
skill_attack(BF_WEAPON, src, src, bl, skill_id, skill_lv, tick, flag); skill_attack(BF_WEAPON, src, src, bl, skill_id, skill_lv, tick, flag);
} else if (sd) { } else if (sd) {
skill_area_temp[1] = bl->id;
skill_area_temp[3] = skill_id;
if (sc && sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == SR_FALLENEMPIRE && !sc->data[SC_FLASHCOMBO]) if (sc && sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == SR_FALLENEMPIRE && !sc->data[SC_FLASHCOMBO])
flag |= 8; // Only apply Combo bonus when Tiger Cannon is not used through Flash Combo flag |= 8; // Only apply Combo bonus when Tiger Cannon is not used through Flash Combo
skill_attack(BF_WEAPON, src, src, bl, skill_id, skill_lv, tick, flag);
map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR | BL_SKILL, 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), BL_CHAR | BL_SKILL, src, skill_id, skill_lv, tick, flag | BCT_ENEMY | SD_SPLASH | 1, skill_castend_damage_id);
} }
break; break;
@ -6044,7 +5993,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
break; break;
case NPC_POISON_BUSTER: case NPC_POISON_BUSTER:
case SO_POISON_BUSTER:
if( tsc && tsc->data[SC_POISON] ) { if( tsc && tsc->data[SC_POISON] ) {
skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, flag); skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, flag);
status_change_end(bl, SC_POISON, INVALID_TIMER); status_change_end(bl, SC_POISON, INVALID_TIMER);
@ -7091,9 +7039,11 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
case SC_DEADLYINFECT: case SC_DEADLYINFECT:
case LG_EXEEDBREAK: case LG_EXEEDBREAK:
case LG_PRESTIGE: case LG_PRESTIGE:
case LG_INSPIRATION:
case SR_CRESCENTELBOW: case SR_CRESCENTELBOW:
case SR_LIGHTNINGWALK: case SR_LIGHTNINGWALK:
case GN_CARTBOOST: case GN_CARTBOOST:
case GN_BLOOD_SUCKER:
case GN_HELLS_PLANT: case GN_HELLS_PLANT:
case KO_MEIKYOUSISUI: case KO_MEIKYOUSISUI:
case ALL_ODINS_POWER: case ALL_ODINS_POWER:
@ -7117,6 +7067,18 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv))); sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv)));
break; break;
case LG_SHIELDSPELL:
if (skill_lv == 1)
type = SC_SHIELDSPELL_HP;
else if (skill_lv == 2)
type = SC_SHIELDSPELL_SP;
else
type = SC_SHIELDSPELL_ATK;
clif_skill_nodamage(src, bl, skill_id, skill_lv,
sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv)));
break;
case SJ_GRAVITYCONTROL: { case SJ_GRAVITYCONTROL: {
int fall_damage = sstatus->batk + sstatus->rhw.atk - tstatus->def2; int fall_damage = sstatus->batk + sstatus->rhw.atk - tstatus->def2;
@ -7149,10 +7111,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
short index = dstsd->equip_index[EQI_HAND_R]; short index = dstsd->equip_index[EQI_HAND_R];
if (index >= 0 && dstsd->inventory_data[index] && dstsd->inventory_data[index]->type == IT_WEAPON) if (index >= 0 && dstsd->inventory_data[index] && dstsd->inventory_data[index]->type == IT_WEAPON)
bonus = (8 + 2 * skill_lv) * dstsd->inventory_data[index]->wlv; bonus = (20 * skill_lv) * dstsd->inventory_data[index]->wlv;
} }
if (sd)
bonus += (pc_checkskill(sd, SA_FLAMELAUNCHER) + pc_checkskill(sd, SA_FROSTWEAPON) + pc_checkskill(sd, SA_LIGHTNINGLOADER) + pc_checkskill(sd, SA_SEISMICWEAPON)) * 5;
clif_skill_nodamage(src, bl, skill_id, skill_lv, sc_start2(src,bl, type, 100, skill_lv, bonus, skill_get_time(skill_id, skill_lv))); clif_skill_nodamage(src, bl, skill_id, skill_lv, sc_start2(src,bl, type, 100, skill_lv, bonus, skill_get_time(skill_id, skill_lv)));
} else if (sd) } else if (sd)
@ -7519,6 +7479,9 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
case SR_SKYNETBLOW: case SR_SKYNETBLOW:
case SR_RAMPAGEBLASTER: case SR_RAMPAGEBLASTER:
case SR_HOWLINGOFLION: case SR_HOWLINGOFLION:
case LG_CANNONSPEAR:
case LG_OVERBRAND:
case LG_RAYOFGENESIS:
case KO_HAPPOKUNAI: case KO_HAPPOKUNAI:
case RL_FIREDANCE: case RL_FIREDANCE:
case RL_R_TRIP: case RL_R_TRIP:
@ -7555,7 +7518,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
clif_skill_nodamage(src,bl,skill_id,skill_lv,1); clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
i = map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), starget, i = 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); src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill_castend_damage_id);
if( !i && ( skill_id == RK_WINDCUTTER || skill_id == NC_AXETORNADO || skill_id == SR_SKYNETBLOW || skill_id == KO_HAPPOKUNAI ) ) if( !i && ( skill_id == RK_WINDCUTTER || skill_id == NC_AXETORNADO || skill_id == LG_CANNONSPEAR || skill_id == SR_SKYNETBLOW || skill_id == KO_HAPPOKUNAI ) )
clif_skill_damage(src,src,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE); clif_skill_damage(src,src,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE);
} }
break; break;
@ -7571,6 +7534,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR|BL_SKILL, 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), BL_CHAR|BL_SKILL, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill_castend_damage_id);
break; break;
case SR_TIGERCANNON:
case SR_WINDMILL: case SR_WINDMILL:
case GN_CART_TORNADO: case GN_CART_TORNADO:
clif_skill_nodamage(src,bl,skill_id,skill_lv,1); clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
@ -8323,6 +8287,12 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
sp -= sp * penalty / 100; sp -= sp * penalty / 100;
} }
} }
#ifdef RENEWAL
if (bl->type == BL_HOM)
hp *= 3; // Heal effectiveness is 3x for Homunculus
#endif
clif_skill_nodamage(src,bl,skill_id,skill_lv,1); clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
if( hp > 0 || (skill_id == AM_POTIONPITCHER && sp <= 0) ) if( hp > 0 || (skill_id == AM_POTIONPITCHER && sp <= 0) )
clif_skill_nodamage(NULL,bl,AL_HEAL,hp,1); clif_skill_nodamage(NULL,bl,AL_HEAL,hp,1);
@ -8509,7 +8479,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
case SC_LHZ_DUN_N1: case SC_LHZ_DUN_N2: case SC_LHZ_DUN_N3: case SC_LHZ_DUN_N4: case SC_LHZ_DUN_N1: case SC_LHZ_DUN_N2: case SC_LHZ_DUN_N3: case SC_LHZ_DUN_N4:
case SC_REUSE_LIMIT_LUXANIMA: case SC_LUXANIMA: case SC_SOULENERGY: case SC_REUSE_LIMIT_LUXANIMA: case SC_LUXANIMA: case SC_SOULENERGY:
case SC_EP16_2_BUFF_SS: case SC_EP16_2_BUFF_SC: case SC_EP16_2_BUFF_AC: case SC_EP16_2_BUFF_SS: case SC_EP16_2_BUFF_SC: case SC_EP16_2_BUFF_AC:
case SC_EMERGENCY_MOVE: case SC_EMERGENCY_MOVE: case SC_HOMUN_TIME:
continue; continue;
case SC_WHISTLE: case SC_WHISTLE:
case SC_ASSNCROS: case SC_ASSNCROS:
@ -8591,7 +8561,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
if(sd) { if(sd) {
int sp = skill_get_sp(sd->skill_id_old,sd->skill_lv_old); int sp = skill_get_sp(sd->skill_id_old,sd->skill_lv_old);
if( skill_id == SO_SPELLFIST ){ if( skill_id == SO_SPELLFIST ){
sc_start4(src,src,type,100,skill_lv * 3,skill_lv,sd->skill_id_old,sd->skill_lv_old,skill_get_time(skill_id,skill_lv)); sc_start4(src,src,type,100,skill_lv,sd->skill_id_old,sd->skill_lv_old,0,skill_get_time(skill_id,skill_lv));
sd->skill_id_old = sd->skill_lv_old = 0; sd->skill_id_old = sd->skill_lv_old = 0;
break; break;
} }
@ -9531,6 +9501,10 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
case AM_CALLHOMUN: //[orn] case AM_CALLHOMUN: //[orn]
if (sd && !hom_call(sd)) if (sd && !hom_call(sd))
clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
#ifdef RENEWAL
else if (sd && hom_is_active(sd->hd))
skill_area_temp[0] = 1; // Already passed pre-cast checks
#endif
break; break;
case AM_REST: case AM_REST:
@ -10039,7 +10013,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
case SC_ENTRY_QUEUE_APPLY_DELAY: case SC_ENTRY_QUEUE_NOTIFY_ADMISSION_TIME_OUT: case SC_ENTRY_QUEUE_APPLY_DELAY: case SC_ENTRY_QUEUE_NOTIFY_ADMISSION_TIME_OUT:
case SC_REUSE_LIMIT_LUXANIMA: case SC_LUXANIMA: case SC_SOULENERGY: case SC_REUSE_LIMIT_LUXANIMA: case SC_LUXANIMA: case SC_SOULENERGY:
case SC_EP16_2_BUFF_SS: case SC_EP16_2_BUFF_SC: case SC_EP16_2_BUFF_AC: case SC_EP16_2_BUFF_SS: case SC_EP16_2_BUFF_SC: case SC_EP16_2_BUFF_AC:
case SC_EMERGENCY_MOVE: case SC_MADOGEAR: case SC_EMERGENCY_MOVE: case SC_MADOGEAR: case SC_HOMUN_TIME:
continue; continue;
case SC_ASSUMPTIO: case SC_ASSUMPTIO:
if( bl->type == BL_MOB ) if( bl->type == BL_MOB )
@ -10436,124 +10410,6 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
clif_skill_nodamage(src,bl,skill_id,skill_lv,1); clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
break; break;
case LG_SHIELDSPELL:
if (sd) {
int opt = 0;
short index = sd->equip_index[EQI_HAND_L], shield_def = 0, shield_mdef = 0, shield_refine = 0;
struct item_data *shield_data = NULL;
if (index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->type == IT_ARMOR)
shield_data = sd->inventory_data[index];
if (!shield_data || shield_data->type != IT_ARMOR) // Group with 'skill_unconditional' gets these as default
shield_def = shield_mdef = shield_refine = 10;
else {
shield_def = shield_data->def;
shield_mdef = sd->bonus.shieldmdef;
shield_refine = sd->inventory.u.items_inventory[sd->equip_index[EQI_HAND_L]].refine;
}
if (flag&1) {
sc_start(src,bl,SC_SILENCE,100,skill_lv,shield_mdef * 30000);
break;
}
opt = rnd()%3 + 1; // Generates a number between 1 - 3. The number generated will determine which effect will be triggered.
switch(skill_lv) {
case 1: { // DEF Based
int splashrange = 0;
#ifdef RENEWAL
if (shield_def >= 0 && shield_def <= 40)
#else
if (shield_def >= 0 && shield_def <= 4)
#endif
splashrange = 1;
#ifdef RENEWAL
else if (shield_def >= 41 && shield_def <= 80)
#else
else if (shield_def >= 5 && shield_def <= 9)
#endif
splashrange = 2;
else
splashrange = 3;
switch(opt) {
case 1: // Splash AoE ATK
sc_start(src,bl,SC_SHIELDSPELL_DEF,100,opt,INFINITE_TICK);
clif_skill_damage(src,src,tick,status_get_amotion(src),0,-30000,1,skill_id,skill_lv,DMG_SINGLE);
map_foreachinrange(skill_area_sub,src,splashrange,BL_CHAR,src,skill_id,skill_lv,tick,flag|BCT_ENEMY|1,skill_castend_damage_id);
status_change_end(bl,SC_SHIELDSPELL_DEF,INVALID_TIMER);
break;
case 2: // % Damage Reflecting Increase
#ifdef RENEWAL
sc_start2(src,bl,SC_SHIELDSPELL_DEF,100,opt,shield_def / 10,shield_def * 1000);
#else
sc_start2(src,bl,SC_SHIELDSPELL_DEF,100,opt,shield_def,shield_def * 1000 * 10);
#endif
break;
case 3: // Equipment Attack Increase
#ifdef RENEWAL
sc_start2(src,bl,SC_SHIELDSPELL_DEF,100,opt,shield_def,shield_def * 3000);
#else
sc_start2(src,bl,SC_SHIELDSPELL_DEF,100,opt,shield_def * 10,shield_def * 3000 * 10);
#endif
break;
}
}
break;
case 2: { // MDEF Based
int splashrange = 0;
if (shield_mdef >= 1 && shield_mdef <= 3)
splashrange = 1;
else if (shield_mdef >= 4 && shield_mdef <= 5)
splashrange = 2;
else
splashrange = 3;
switch(opt) {
case 1: // Splash AoE MATK
sc_start(src,bl,SC_SHIELDSPELL_MDEF,100,opt,INFINITE_TICK);
clif_skill_damage(src,src,tick,status_get_amotion(src),0,-30000,1,skill_id,skill_lv,DMG_SINGLE);
map_foreachinrange(skill_area_sub,src,splashrange,BL_CHAR,src,skill_id,skill_lv,tick,flag|BCT_ENEMY|1,skill_castend_damage_id);
status_change_end(bl,SC_SHIELDSPELL_MDEF,INVALID_TIMER);
break;
case 2: // Splash AoE Lex Divina
sc_start(src,bl,SC_SHIELDSPELL_MDEF,100,opt,shield_mdef * 2000);
clif_skill_damage(src,src,tick,status_get_amotion(src),0,-30000,1,skill_id,skill_lv,DMG_SINGLE);
map_foreachinallrange(skill_area_sub,src,splashrange,BL_CHAR,src,skill_id,skill_lv,tick,flag|BCT_ENEMY|1,skill_castend_nodamage_id);
break;
case 3: // Casts Magnificat.
if (sc_start(src,bl,SC_SHIELDSPELL_MDEF,100,opt,shield_mdef * 30000))
clif_skill_nodamage(src,bl,PR_MAGNIFICAT,skill_lv,
sc_start(src,bl,SC_MAGNIFICAT,100,1,shield_mdef * 30000));
break;
}
}
break;
case 3: // Refine Based
switch(opt) {
case 1: // Allows you to break armor at a 100% rate when you do damage.
sc_start(src,bl,SC_SHIELDSPELL_REF,100,opt,shield_refine * 30000);
break;
case 2: // Increases DEF and Status Effect resistance depending on Shield refine rate.
#ifdef RENEWAL
sc_start4(src,bl,SC_SHIELDSPELL_REF,100,opt,shield_refine * 10 * status_get_lv(src) / 100,(shield_refine * 2) + (sstatus->luk / 10),0,shield_refine * 20000);
#else
sc_start4(src,bl,SC_SHIELDSPELL_REF,100,opt,shield_refine,(shield_refine * 2) + (sstatus->luk / 10),0,shield_refine * 20000);
#endif
break;
case 3: // Recovers HP depending on Shield refine rate.
sc_start(src,bl,SC_SHIELDSPELL_REF,100,opt,INFINITE_TICK); //HP Recovery.
status_heal(bl,sstatus->max_hp * ((status_get_lv(src) / 10) + (shield_refine + 1)) / 100,0,2);
status_change_end(bl,SC_SHIELDSPELL_REF,INVALID_TIMER);
break;
}
break;
}
clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
}
break;
case LG_PIETY: case LG_PIETY:
if( flag&1 ) if( flag&1 )
sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv)); sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv));
@ -10564,11 +10420,6 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
} }
break; break;
case LG_INSPIRATION:
if( sd && !map_getmapflag(sd->bl.m, MF_NOEXPPENALTY) && battle_config.exp_cost_inspiration )
pc_lostexp(sd, u64min(sd->status.base_exp, pc_nextbaseexp(sd) * battle_config.exp_cost_inspiration / 100), 0); // 1% penalty.
clif_skill_nodamage(bl,src,skill_id,skill_lv, sc_start(src,bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv)));
break;
case SR_CURSEDCIRCLE: case SR_CURSEDCIRCLE:
if( flag&1 ) { if( flag&1 ) {
if( status_get_class_(bl) == CLASS_BOSS ) if( status_get_class_(bl) == CLASS_BOSS )
@ -10666,11 +10517,11 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv))); sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv)));
break; break;
case SR_FLASHCOMBO: { case SR_FLASHCOMBO: {
const int combo[] = { SR_DRAGONCOMBO, SR_FALLENEMPIRE, SR_TIGERCANNON, SR_SKYNETBLOW }; const int combo[] = { SR_DRAGONCOMBO, SR_FALLENEMPIRE, SR_TIGERCANNON };
const int delay[] = { 0, 250, 500, 2000 }; const int delay[] = { 0, 750, 1250 };
if (sd) // Disable attacking/acting/moving for skill's duration. if (sd) // Disable attacking/acting/moving for skill's duration.
sd->ud.attackabletime = sd->canuseitem_tick = sd->ud.canact_tick = tick + delay[3]; sd->ud.attackabletime = sd->canuseitem_tick = sd->ud.canact_tick = tick + delay[2];
clif_skill_nodamage(src,bl,skill_id,skill_lv, clif_skill_nodamage(src,bl,skill_id,skill_lv,
sc_start(src,src,type,100,skill_lv,skill_get_time(skill_id,skill_lv))); sc_start(src,src,type,100,skill_lv,skill_get_time(skill_id,skill_lv)));
for (i = 0; i < ARRAYLENGTH(combo); i++) for (i = 0; i < ARRAYLENGTH(combo); i++)
@ -11023,29 +10874,6 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
} }
break; break;
case GN_BLOOD_SUCKER:
{
struct status_change *sc = status_get_sc(src);
if( sc && sc->bs_counter < skill_get_maxcount( skill_id , skill_lv) ) {
if( tsc && tsc->data[type] ){
sc->bs_counter--;
status_change_end(src, type, INVALID_TIMER); // the first one cancels and the last one will take effect resetting the timer
}
clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);
sc_start2(src,bl, type, 100, skill_lv, src->id, skill_get_time(skill_id,skill_lv));
sc->bs_counter++;
} else if( sd ) {
clif_skill_fail(sd, skill_id, USESKILL_FAIL_LEVEL, 0);
break;
}
}
break;
case GN_SPORE_EXPLOSION:
clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);
skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, flag|8);
sc_start4(src, bl, type, 100, skill_lv, skill_id, src->id, 0, skill_get_time(skill_id, skill_lv));
break;
case GN_MANDRAGORA: case GN_MANDRAGORA:
if( flag&1 ) { if( flag&1 ) {
int rate = 25 + (10 * skill_lv) - (tstatus->vit + tstatus->luk) / 5; int rate = 25 + (10 * skill_lv) - (tstatus->vit + tstatus->luk) / 5;
@ -11382,8 +11210,14 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
else sc_start(&hd->bl,&hd->bl, SC_STYLE_CHANGE, 100, MH_MD_FIGHTING, INFINITE_TICK); else sc_start(&hd->bl,&hd->bl, SC_STYLE_CHANGE, 100, MH_MD_FIGHTING, INFINITE_TICK);
} }
break; break;
case MH_MAGMA_FLOW:
case MH_PAIN_KILLER: case MH_PAIN_KILLER:
bl = battle_get_master(src);
if (bl != nullptr)
sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv));
if (hd)
skill_blockhomun_start(hd, skill_id, skill_get_cooldown(skill_id, skill_lv));
break;
case MH_MAGMA_FLOW:
sc_start(src,bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv)); sc_start(src,bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv));
if (hd) if (hd)
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));
@ -12914,17 +12748,6 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
flag |= 1; flag |= 1;
break; break;
case LG_OVERBRAND: {
int dir = map_calc_dir(src,x,y);
int sx = src->x, sy = src->y;
struct s_skill_nounit_layout *layout = skill_get_nounit_layout(skill_id,skill_lv,src,sx,sy,dir);
for( i = 0; i < layout->count; i++ )
map_foreachincell(skill_area_sub,src->m,sx+layout->dx[i],sy+layout->dy[i],BL_CHAR,src,skill_id,skill_lv,tick,flag|BCT_ENEMY|SD_ANIMATION|1,skill_castend_damage_id);
skill_addtimerskill(src,gettick() + status_get_amotion(src),0,x,y,LG_OVERBRAND_BRANDISH,skill_lv,dir,flag);
}
break;
case LG_BANDING: case LG_BANDING:
if( sc && sc->data[SC_BANDING] ) if( sc && sc->data[SC_BANDING] )
status_change_end(src,SC_BANDING,INVALID_TIMER); status_change_end(src,SC_BANDING,INVALID_TIMER);
@ -12933,11 +12756,6 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
clif_skill_nodamage(src,src,skill_id,skill_lv,1); clif_skill_nodamage(src,src,skill_id,skill_lv,1);
break; break;
case LG_RAYOFGENESIS:
i = skill_get_splash(skill_id,skill_lv);
map_foreachinarea(skill_area_sub,src->m,x-i,y-i,x+i,y+i,BL_CHAR|BL_SKILL,src,skill_id,skill_lv,tick,flag|BCT_ENEMY|1,skill_castend_damage_id);
break;
case WM_DOMINION_IMPULSE: case WM_DOMINION_IMPULSE:
i = skill_get_splash(skill_id, skill_lv); i = skill_get_splash(skill_id, skill_lv);
map_foreachinallarea(skill_active_reverberation, src->m, x-i, y-i, x+i,y+i,BL_SKILL); map_foreachinallarea(skill_active_reverberation, src->m, x-i, y-i, x+i,y+i,BL_SKILL);
@ -13728,6 +13546,10 @@ struct skill_unit_group *skill_unitsetting(struct block_list *src, uint16 skill_
val2 = y; val2 = y;
val3 = 0; // Suck target at n seconds. val3 = 0; // Suck target at n seconds.
break; break;
case MH_POISON_MIST:
case MH_LAVA_SLIDE:
skill_clear_group(src, 1);
break;
case MH_VOLCANIC_ASH: case MH_VOLCANIC_ASH:
if (!map_flag_vs(src->m)) if (!map_flag_vs(src->m))
target = BCT_ENEMY; target = BCT_ENEMY;
@ -14339,6 +14161,7 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, t_t
case UNT_FIREWALK: case UNT_FIREWALK:
case UNT_ELECTRICWALK: case UNT_ELECTRICWALK:
case UNT_PSYCHIC_WAVE: case UNT_PSYCHIC_WAVE:
case UNT_LAVA_SLIDE:
case UNT_MAKIBISHI: case UNT_MAKIBISHI:
case UNT_VENOMFOG: case UNT_VENOMFOG:
case UNT_ICEMINE: case UNT_ICEMINE:
@ -14807,14 +14630,8 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, t_t
break; break;
case UNT_SEVERE_RAINSTORM: case UNT_SEVERE_RAINSTORM:
if( battle_check_target(&unit->bl, bl, BCT_ENEMY) > 0 ) { if( battle_check_target(&unit->bl, bl, BCT_ENEMY) > 0 )
struct map_session_data *sd = BL_CAST(BL_PC, ss); skill_attack(BF_WEAPON,ss,&unit->bl,bl,WM_SEVERE_RAINSTORM_MELEE,sg->skill_lv,tick,0);
int weapon_flag = 0;
if (sd && (sd->status.weapon == W_MUSICAL || sd->status.weapon == W_WHIP))
weapon_flag = 4;
skill_attack(BF_WEAPON,ss,&unit->bl,bl,WM_SEVERE_RAINSTORM_MELEE,sg->skill_lv,tick,weapon_flag);
}
break; break;
case UNT_NETHERWORLD: case UNT_NETHERWORLD:
if (!status_bl_has_mode(bl,MD_STATUSIMMUNE) || (!map_flag_gvg2(ss->m) && battle_check_target(&unit->bl,bl,BCT_PARTY) < 0)) { if (!status_bl_has_mode(bl,MD_STATUSIMMUNE) || (!map_flag_gvg2(ss->m) && battle_check_target(&unit->bl,bl,BCT_PARTY) < 0)) {
@ -14871,7 +14688,7 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, t_t
case UNT_CLOUD_KILL: case UNT_CLOUD_KILL:
if (tsc && !tsc->data[type]) if (tsc && !tsc->data[type])
status_change_start(ss, bl, type, 10000, sg->skill_lv, ss->id, 0, 0, skill_get_time2(sg->skill_id, sg->skill_lv), SCSTART_NOTICKDEF); status_change_start(ss, bl, type, 10000, sg->skill_lv, ss->id, 0, 0, skill_get_time(sg->skill_id, sg->skill_lv), SCSTART_NOTICKDEF);
skill_attack(skill_get_type(sg->skill_id), ss, &unit->bl, bl, sg->skill_id, sg->skill_lv, tick, 0); skill_attack(skill_get_type(sg->skill_id), ss, &unit->bl, bl, sg->skill_id, sg->skill_lv, tick, 0);
break; break;
@ -14941,14 +14758,9 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, t_t
sc_start2(ss, bl,type,100,sg->val1,sg->val2,skill_get_time(sg->skill_id, sg->skill_lv)); sc_start2(ss, bl,type,100,sg->val1,sg->val2,skill_get_time(sg->skill_id, sg->skill_lv));
break; break;
case UNT_LAVA_SLIDE:
skill_attack(BF_WEAPON, ss, &unit->bl, bl, sg->skill_id, sg->skill_lv, tick, 0);
if(++sg->val1 > 4) //after 5 stop hit and destroy me
sg->limit = DIFF_TICK(tick, sg->tick);
break;
case UNT_POISON_MIST: case UNT_POISON_MIST:
skill_attack(BF_MAGIC, ss, &unit->bl, bl, sg->skill_id, sg->skill_lv, tick, 0); skill_attack(BF_MAGIC, ss, &unit->bl, bl, sg->skill_id, sg->skill_lv, tick, 0);
status_change_start(ss, bl, SC_BLIND, (10 + 10 * sg->skill_lv)*100, sg->skill_lv, sg->skill_id, 0, 0, skill_get_time2(sg->skill_id, sg->skill_lv), SCSTART_NOTICKDEF|SCSTART_NORATEDEF); status_change_start(ss, bl, SC_POISON_MIST, (10 + 10 * sg->skill_lv)*100, sg->skill_lv, sg->skill_id, 0, 0, skill_get_time2(sg->skill_id, sg->skill_lv), SCSTART_NOTICKDEF|SCSTART_NORATEDEF);
break; break;
case UNT_CHAOSPANIC: case UNT_CHAOSPANIC:
@ -15886,19 +15698,11 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i
} }
break; break;
case PR_REDEMPTIO: case PR_REDEMPTIO:
case LG_INSPIRATION:
{ {
t_exp exp; t_exp exp = pc_nextbaseexp(sd);
uint32 exp_needp; uint32 exp_needp = battle_config.exp_cost_redemptio;
switch (skill_id) {
case PR_REDEMPTIO: if (exp_needp && (exp > 0 && get_percentage_exp(sd->status.base_exp, exp) < exp_needp)) {
exp_needp = battle_config.exp_cost_redemptio;
break;
case LG_INSPIRATION:
exp_needp = battle_config.exp_cost_inspiration;
break;
}
if (exp_needp && ((exp = pc_nextbaseexp(sd)) > 0 && get_percentage_exp(sd->status.base_exp, exp) < exp_needp)) {
clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); //Not enough exp. clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); //Not enough exp.
return false; return false;
} }
@ -16144,14 +15948,15 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i
} }
} }
break; break;
case LG_RAYOFGENESIS:
case LG_BANDING: case LG_BANDING:
if( sc && sc->data[SC_INSPIRATION] ) { if( sc && sc->data[SC_INSPIRATION] )
clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); return true; // Don't check for partner.
return false;
}
break; break;
case LG_PRESTIGE: case LG_PRESTIGE:
if( sc && (sc->data[SC_BANDING] || sc->data[SC_INSPIRATION]) ) { if( sc && sc->data[SC_INSPIRATION] )
return true; // Don't check for partner.
if( sc && sc->data[SC_BANDING] ) {
clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
return false; return false;
} }
@ -16163,32 +15968,6 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i
} }
sd->spiritball_old = require.spiritball = sd->spiritball; sd->spiritball_old = require.spiritball = sd->spiritball;
break; break;
case LG_SHIELDSPELL: {
short index = sd->equip_index[EQI_HAND_L];
struct item_data *shield_data = NULL;
if (index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->type == IT_ARMOR)
shield_data = sd->inventory_data[index];
if (!shield_data || shield_data->type != IT_ARMOR) { // Skill will first check if a shield is equipped. If none is found the skill will fail.
clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
break;
}
}
break;
case LG_HESPERUSLIT:
if (sc && sc->data[SC_INSPIRATION])
return true; // Don't check for partner.
if (!(sc && sc->data[SC_BANDING])) {
clif_skill_fail(sd,skill_id,USESKILL_FAIL,0);
return false;
}
if (sc->data[SC_BANDING] && sc->data[SC_BANDING]->val2 < 3)
return false; // Just fails, no msg here.
break;
case LG_RAYOFGENESIS:
if (sc && sc->data[SC_INSPIRATION])
return true; // Don't check for partner.
break;
case SR_FALLENEMPIRE: case SR_FALLENEMPIRE:
if( !(sc && sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == SR_DRAGONCOMBO) ) if( !(sc && sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == SR_DRAGONCOMBO) )
return false; return false;
@ -17046,10 +16825,30 @@ struct s_skill_condition skill_get_requirement(struct map_session_data* sd, uint
if (i != skill_lv%11 - 1) if (i != skill_lv%11 - 1)
continue; continue;
break; break;
#ifdef RENEWAL
case AM_CALLHOMUN:
// Player has no homunculus, only requires first item
if (i > 0 && sd->hd == nullptr) {
i = MAX_SKILL_ITEM_REQUIRE;
continue;
}
// Recalling from Rest state has a different consume item (stored as second item)
if (skill_area_temp[0] == 1 || (sd->hd != nullptr && sd->hd->homunculus.vaporize == HOM_ST_REST)) {
req.itemid[0] = skill->require.itemid[1];
req.amount[0] = skill->require.amount[1];
if (skill_area_temp[0] == 1 && hom_is_active(sd->hd))
skill_area_temp[0] = 0;
i = MAX_SKILL_ITEM_REQUIRE;
continue;
}
break;
#else
case AM_CALLHOMUN: case AM_CALLHOMUN:
if (sd->status.hom_id) //Don't delete items when hom is already out. if (sd->status.hom_id) //Don't delete items when hom is already out.
continue; continue;
break; break;
#endif
case AB_ADORAMUS: case AB_ADORAMUS:
if( itemdb_group_item_exists(IG_GEMSTONE, skill->require.itemid[i]) && (sd->special_state.no_gemstone == 2 || skill_check_pc_partner(sd,skill_id,&skill_lv, 1, 2)) ) if( itemdb_group_item_exists(IG_GEMSTONE, skill->require.itemid[i]) && (sd->special_state.no_gemstone == 2 || skill_check_pc_partner(sd,skill_id,&skill_lv, 1, 2)) )
continue; continue;
@ -18017,13 +17816,8 @@ int skill_attack_area(struct block_list *bl, va_list ap)
type = va_arg(ap,int); type = va_arg(ap,int);
if (skill_area_temp[1] == bl->id) { //This is the target of the skill, do a full attack and skip target checks. if (skill_area_temp[1] == bl->id) { //This is the target of the skill, do a full attack and skip target checks.
switch (skill_id) {
case LG_CANNONSPEAR:
return (int)skill_attack(atk_type,src,dsrc,bl,skill_id,skill_lv,tick,flag|SD_ANIMATION);
default:
return (int)skill_attack(atk_type,src,dsrc,bl,skill_id,skill_lv,tick,flag); return (int)skill_attack(atk_type,src,dsrc,bl,skill_id,skill_lv,tick,flag);
} }
}
if(battle_check_target(dsrc,bl,type) <= 0 || if(battle_check_target(dsrc,bl,type) <= 0 ||
!status_check_skilluse(NULL, bl, skill_id, 2)) !status_check_skilluse(NULL, bl, skill_id, 2))
@ -18072,6 +17866,8 @@ int skill_clear_group(struct block_list *bl, int flag)
case NJ_SUITON: case NJ_SUITON:
case NJ_KAENSIN: case NJ_KAENSIN:
case SC_CHAOSPANIC: case SC_CHAOSPANIC:
case MH_POISON_MIST:
case MH_LAVA_SLIDE:
if (flag&1) if (flag&1)
group[count++] = ud->skillunit[i]; group[count++] = ud->skillunit[i];
break; break;
@ -18122,6 +17918,8 @@ struct skill_unit_group *skill_locate_element_field(struct block_list *bl)
case NPC_CLOUD_KILL: case NPC_CLOUD_KILL:
case SO_WARMER: case SO_WARMER:
case SC_CHAOSPANIC: case SC_CHAOSPANIC:
case MH_POISON_MIST:
case MH_LAVA_SLIDE:
return ud->skillunit[i]; return ud->skillunit[i];
} }
} }
@ -18228,22 +18026,7 @@ int skill_banding_count(struct map_session_data *sd)
{ {
nullpo_ret(sd); nullpo_ret(sd);
int range = skill_get_splash(LG_BANDING, 1); return cap_value(party_foreachsamemap(party_sub_count, sd, skill_get_splash(LG_BANDING, 1)), 0, MAX_PARTY);
uint8 count = party_foreachsamemap(party_sub_count_banding, sd, range, 0);
unsigned int group_hp = party_foreachsamemap(party_sub_count_banding, sd, range, 1);
// HP is set to the average HP of the Banding group
if (count > 1)
status_set_hp(&sd->bl, group_hp / count, 0);
// Royal Guard count check for Banding
if (sd && sd->status.party_id) {
if (count > MAX_PARTY)
return MAX_PARTY;
else if (count > 1)
return count; // Effect bonus from additional Royal Guards if not above the max
}
return 0;
} }
/** /**
@ -19864,6 +19647,11 @@ short skill_can_produce_mix(struct map_session_data *sd, t_itemid nameid, int tr
} }
} }
if (nameid == ITEMID_HOMUNCULUS_SUPPLEMENT) { // Temporary check since the produce_db specifically wants the Pharmacy skill to use
if (pc_checkskill(sd, AM_BIOETHICS) == 0)
return 0;
}
if (i >= MAX_SKILL_PRODUCE_DB) if (i >= MAX_SKILL_PRODUCE_DB)
return 0; return 0;
@ -20636,6 +20424,11 @@ int skill_poisoningweapon(struct map_session_data *sd, t_itemid nameid)
return 0; return 0;
} }
/**
* Toggles the effect of Mystical Amplifcation (Pre-renewal).
* @param bl: Object
* @param skill_id: Skill invoking to determine if Magic type
*/
void skill_toggle_magicpower(struct block_list *bl, uint16 skill_id) void skill_toggle_magicpower(struct block_list *bl, uint16 skill_id)
{ {
struct status_change *sc = status_get_sc(bl); struct status_change *sc = status_get_sc(bl);
@ -20650,16 +20443,14 @@ void skill_toggle_magicpower(struct block_list *bl, uint16 skill_id)
} else { } else {
sc->data[SC_MAGICPOWER]->val4 = 1; sc->data[SC_MAGICPOWER]->val4 = 1;
status_calc_bl(bl, status_sc2scb_flag(SC_MAGICPOWER)); status_calc_bl(bl, status_sc2scb_flag(SC_MAGICPOWER));
#ifndef RENEWAL
if(bl->type == BL_PC){// update current display. if(bl->type == BL_PC){// update current display.
clif_updatestatus(((TBL_PC *)bl),SP_MATK1); clif_updatestatus(((TBL_PC *)bl),SP_MATK1);
clif_updatestatus(((TBL_PC *)bl),SP_MATK2); clif_updatestatus(((TBL_PC *)bl),SP_MATK2);
} }
#endif
}
}
}
}
}
}
int skill_magicdecoy(struct map_session_data *sd, t_itemid nameid) { int skill_magicdecoy(struct map_session_data *sd, t_itemid nameid) {
int x, y, i, class_, skill; int x, y, i, class_, skill;
@ -20747,7 +20538,7 @@ void skill_spellbook(struct map_session_data *sd, t_itemid nameid) {
int points = spell->points; int points = spell->points;
if (sc && sc->data[SC_FREEZE_SP]) { if (sc && sc->data[SC_FREEZE_SP]) {
if ((sc->data[SC_FREEZE_SP]->val2 + points) > 4 * pc_checkskill(sd, WL_FREEZE_SP) + status_get_int(&sd->bl) / 10 + sd->status.base_level / 10) { if ((sc->data[SC_FREEZE_SP]->val2 + points) > 8 * pc_checkskill(sd, WL_FREEZE_SP) + status_get_int(&sd->bl) / 10 + sd->status.base_level / 10) {
clif_skill_fail(sd, WL_READING_SB, USESKILL_FAIL_SPELLBOOK_PRESERVATION_POINT, 0); clif_skill_fail(sd, WL_READING_SB, USESKILL_FAIL_SPELLBOOK_PRESERVATION_POINT, 0);
return; return;
} }
@ -20788,7 +20579,7 @@ int skill_select_menu(struct map_session_data *sd,uint16 skill_id) {
lv = (aslvl + 5) / 2; // The level the skill will be autocasted lv = (aslvl + 5) / 2; // The level the skill will be autocasted
lv = min(lv,sd->status.skill[sk_idx].lv); lv = min(lv,sd->status.skill[sk_idx].lv);
prob = (aslvl >= 10) ? 15 : (30 - 2 * aslvl); // Probability at level 10 was increased to 15. prob = (aslvl >= 10) ? 15 : (30 - 2 * aslvl); // Probability at level 10 was increased to 15.
sc_start4(&sd->bl,&sd->bl,SC__AUTOSHADOWSPELL,100,id,lv,prob,0,skill_get_time(SC_AUTOSHADOWSPELL,aslvl)); sc_start4(&sd->bl,&sd->bl,SC__AUTOSHADOWSPELL,100,id,lv,prob,aslvl,skill_get_time(SC_AUTOSHADOWSPELL,aslvl));
return 0; return 0;
} }
@ -21478,7 +21269,6 @@ void skill_init_nounit_layout (void) {
memset(skill_nounit_layout,0,sizeof(skill_nounit_layout)); memset(skill_nounit_layout,0,sizeof(skill_nounit_layout));
overbrand_nounit_pos = pos;
for( i = 0; i < 8; i++ ) { for( i = 0; i < 8; i++ ) {
if( i&1 ) { if( i&1 ) {
skill_nounit_layout[pos].count = 33; skill_nounit_layout[pos].count = 33;
@ -21546,7 +21336,6 @@ void skill_init_nounit_layout (void) {
pos++; pos++;
} }
overbrand_brandish_nounit_pos = pos;
for( i = 0; i < 8; i++ ) { for( i = 0; i < 8; i++ ) {
if( i&1 ) { if( i&1 ) {
skill_nounit_layout[pos].count = 74; skill_nounit_layout[pos].count = 74;

View File

@ -27,7 +27,7 @@ struct skill_unit;
struct skill_unit_group; struct skill_unit_group;
struct status_change_entry; struct status_change_entry;
#define MAX_SKILL_PRODUCE_DB 281 /// Max Produce DB #define MAX_SKILL_PRODUCE_DB 282 /// Max Produce DB
#define MAX_PRODUCE_RESOURCE 12 /// Max Produce requirements #define MAX_PRODUCE_RESOURCE 12 /// Max Produce requirements
#define MAX_SKILL_ARROW_DB 150 /// Max Arrow Creation DB #define MAX_SKILL_ARROW_DB 150 /// Max Arrow Creation DB
#define MAX_ARROW_RESULT 5 /// Max Arrow results/created #define MAX_ARROW_RESULT 5 /// Max Arrow results/created

View File

@ -800,6 +800,9 @@ void initChangeTables(void)
set_sc( AM_CP_SHIELD , SC_CP_SHIELD , EFST_PROTECTSHIELD, SCB_NONE ); set_sc( AM_CP_SHIELD , SC_CP_SHIELD , EFST_PROTECTSHIELD, SCB_NONE );
set_sc( AM_CP_ARMOR , SC_CP_ARMOR , EFST_PROTECTARMOR, SCB_NONE ); set_sc( AM_CP_ARMOR , SC_CP_ARMOR , EFST_PROTECTARMOR, SCB_NONE );
set_sc( AM_CP_HELM , SC_CP_HELM , EFST_PROTECTHELM, SCB_NONE ); set_sc( AM_CP_HELM , SC_CP_HELM , EFST_PROTECTHELM, SCB_NONE );
#ifdef RENEWAL
set_sc( AM_CALLHOMUN , SC_HOMUN_TIME , EFST_HOMUN_TIME, SCB_NONE );
#endif
set_sc( CR_AUTOGUARD , SC_AUTOGUARD , EFST_AUTOGUARD , SCB_NONE ); set_sc( CR_AUTOGUARD , SC_AUTOGUARD , EFST_AUTOGUARD , SCB_NONE );
add_sc( CR_SHIELDCHARGE , SC_STUN ); add_sc( CR_SHIELDCHARGE , SC_STUN );
set_sc( CR_REFLECTSHIELD , SC_REFLECTSHIELD , EFST_REFLECTSHIELD , SCB_NONE ); set_sc( CR_REFLECTSHIELD , SC_REFLECTSHIELD , EFST_REFLECTSHIELD , SCB_NONE );
@ -1083,17 +1086,16 @@ void initChangeTables(void)
add_sc(MH_STAHL_HORN , SC_STUN ); add_sc(MH_STAHL_HORN , SC_STUN );
set_sc(MH_ANGRIFFS_MODUS , SC_ANGRIFFS_MODUS , EFST_ANGRIFFS_MODUS , SCB_BATK|SCB_DEF|SCB_FLEE|SCB_MAXHP ); set_sc(MH_ANGRIFFS_MODUS , SC_ANGRIFFS_MODUS , EFST_ANGRIFFS_MODUS , SCB_BATK|SCB_DEF|SCB_FLEE|SCB_MAXHP );
set_sc(MH_GOLDENE_FERSE , SC_GOLDENE_FERSE , EFST_GOLDENE_FERSE , SCB_ASPD|SCB_FLEE ); set_sc(MH_GOLDENE_FERSE , SC_GOLDENE_FERSE , EFST_GOLDENE_FERSE , SCB_ASPD|SCB_FLEE );
add_sc(MH_STEINWAND , SC_SAFETYWALL ); set_sc(MH_STEINWAND , SC_STONE_WALL , EFST_STONE_WALL , SCB_DEF|SCB_MDEF );
set_sc(MH_OVERED_BOOST , SC_OVERED_BOOST , EFST_OVERED_BOOST , SCB_FLEE|SCB_ASPD|SCB_DEF ); set_sc(MH_OVERED_BOOST , SC_OVERED_BOOST , EFST_OVERED_BOOST , SCB_FLEE|SCB_ASPD|SCB_DEF );
set_sc(MH_LIGHT_OF_REGENE , SC_LIGHT_OF_REGENE, EFST_LIGHT_OF_REGENE, SCB_NONE); set_sc(MH_LIGHT_OF_REGENE , SC_LIGHT_OF_REGENE, EFST_LIGHT_OF_REGENE, SCB_NONE);
set_sc(MH_VOLCANIC_ASH , SC_ASH , EFST_VOLCANIC_ASH , SCB_DEF|SCB_DEF2|SCB_HIT|SCB_BATK|SCB_FLEE ); set_sc(MH_VOLCANIC_ASH , SC_ASH , EFST_VOLCANIC_ASH , SCB_DEF|SCB_DEF2|SCB_HIT|SCB_BATK|SCB_FLEE );
set_sc(MH_GRANITIC_ARMOR , SC_GRANITIC_ARMOR , EFST_GRANITIC_ARMOR , SCB_NONE ); set_sc(MH_GRANITIC_ARMOR , SC_GRANITIC_ARMOR , EFST_GRANITIC_ARMOR , SCB_NONE );
set_sc(MH_MAGMA_FLOW , SC_MAGMA_FLOW , EFST_MAGMA_FLOW , SCB_NONE ); set_sc(MH_MAGMA_FLOW , SC_MAGMA_FLOW , EFST_MAGMA_FLOW , SCB_NONE );
set_sc(MH_PYROCLASTIC , SC_PYROCLASTIC , EFST_PYROCLASTIC , SCB_BATK|SCB_ATK_ELE ); set_sc(MH_PYROCLASTIC , SC_PYROCLASTIC , EFST_PYROCLASTIC , SCB_BATK|SCB_WATK|SCB_ATK_ELE );
set_sc(MH_LAVA_SLIDE , SC_BURNING , EFST_BURNT , SCB_MDEF );
set_sc(MH_NEEDLE_OF_PARALYZE , SC_PARALYSIS , EFST_NEEDLE_OF_PARALYZE , SCB_DEF2 ); set_sc(MH_NEEDLE_OF_PARALYZE , SC_PARALYSIS , EFST_NEEDLE_OF_PARALYZE , SCB_DEF2 );
add_sc(MH_POISON_MIST , SC_BLIND ); set_sc(MH_POISON_MIST , SC_POISON_MIST , EFST_POISON_MIST , SCB_FLEE );
set_sc(MH_PAIN_KILLER , SC_PAIN_KILLER , EFST_PAIN_KILLER , SCB_ASPD ); set_sc(MH_PAIN_KILLER , SC_PAIN_KILLER , EFST_PAIN_KILLER , SCB_NONE );
add_sc(MH_STYLE_CHANGE , SC_STYLE_CHANGE ); add_sc(MH_STYLE_CHANGE , SC_STYLE_CHANGE );
set_sc(MH_TINDER_BREAKER , SC_TINDER_BREAKER2 , EFST_TINDER_BREAKER , SCB_FLEE ); set_sc(MH_TINDER_BREAKER , SC_TINDER_BREAKER2 , EFST_TINDER_BREAKER , SCB_FLEE );
@ -1197,7 +1199,7 @@ void initChangeTables(void)
set_sc( RA_CAMOUFLAGE , SC_CAMOUFLAGE , EFST_CAMOUFLAGE , SCB_SPEED ); set_sc( RA_CAMOUFLAGE , SC_CAMOUFLAGE , EFST_CAMOUFLAGE , SCB_SPEED );
set_sc( RA_FIRINGTRAP , SC_BURNING , EFST_BURNT , SCB_MDEF ); set_sc( RA_FIRINGTRAP , SC_BURNING , EFST_BURNT , SCB_MDEF );
set_sc_with_vfx( RA_ICEBOUNDTRAP, SC_FREEZING , EFST_FROSTMISTY , SCB_SPEED|SCB_ASPD|SCB_DEF ); set_sc_with_vfx( RA_ICEBOUNDTRAP, SC_FREEZING , EFST_FROSTMISTY , SCB_SPEED|SCB_ASPD|SCB_DEF );
set_sc( RA_UNLIMIT , SC_UNLIMIT , EFST_UNLIMIT , SCB_DEF|SCB_DEF2|SCB_MDEF|SCB_MDEF2 ); set_sc( RA_UNLIMIT , SC_UNLIMIT , EFST_UNLIMIT , SCB_NONE );
/* Mechanic */ /* Mechanic */
set_sc( NC_ACCELERATION , SC_ACCELERATION , EFST_ACCELERATION , SCB_SPEED ); set_sc( NC_ACCELERATION , SC_ACCELERATION , EFST_ACCELERATION , SCB_SPEED );
@ -1218,13 +1220,13 @@ void initChangeTables(void)
set_sc( LG_PRESTIGE , SC_PRESTIGE , EFST_PRESTIGE , SCB_DEF ); set_sc( LG_PRESTIGE , SC_PRESTIGE , EFST_PRESTIGE , SCB_DEF );
set_sc( LG_BANDING , SC_BANDING , EFST_BANDING , SCB_DEF|SCB_WATK|SCB_REGEN ); set_sc( LG_BANDING , SC_BANDING , EFST_BANDING , SCB_DEF|SCB_WATK|SCB_REGEN );
set_sc( LG_PIETY , SC_BENEDICTIO , EFST_BENEDICTIO , SCB_DEF_ELE ); set_sc( LG_PIETY , SC_BENEDICTIO , EFST_BENEDICTIO , SCB_DEF_ELE );
set_sc( LG_EARTHDRIVE , SC_EARTHDRIVE , EFST_EARTHDRIVE , SCB_DEF|SCB_ASPD );
set_sc( LG_INSPIRATION , SC_INSPIRATION , EFST_INSPIRATION , SCB_WATK|SCB_STR|SCB_AGI|SCB_VIT|SCB_INT|SCB_DEX|SCB_LUK|SCB_HIT|SCB_MAXHP); set_sc( LG_INSPIRATION , SC_INSPIRATION , EFST_INSPIRATION , SCB_WATK|SCB_STR|SCB_AGI|SCB_VIT|SCB_INT|SCB_DEX|SCB_LUK|SCB_HIT|SCB_MAXHP);
set_sc( LG_KINGS_GRACE , SC_KINGS_GRACE , EFST_KINGS_GRACE , SCB_NONE ); set_sc( LG_KINGS_GRACE , SC_KINGS_GRACE , EFST_KINGS_GRACE , SCB_NONE );
set_sc( LG_MOONSLASHER , SC_OVERBRANDREADY , EFST_OVERBRANDREADY , SCB_NONE );
/* Shadow Chaser */ /* Shadow Chaser */
set_sc( SC_REPRODUCE , SC__REPRODUCE , EFST_REPRODUCE , SCB_NONE ); set_sc( SC_REPRODUCE , SC__REPRODUCE , EFST_REPRODUCE , SCB_NONE );
set_sc( SC_AUTOSHADOWSPELL , SC__AUTOSHADOWSPELL , EFST_AUTOSHADOWSPELL , SCB_NONE ); set_sc( SC_AUTOSHADOWSPELL , SC__AUTOSHADOWSPELL , EFST_AUTOSHADOWSPELL , SCB_MATK );
set_sc( SC_SHADOWFORM , SC__SHADOWFORM , EFST_SHADOWFORM , SCB_NONE ); set_sc( SC_SHADOWFORM , SC__SHADOWFORM , EFST_SHADOWFORM , SCB_NONE );
set_sc( SC_BODYPAINT , SC__BODYPAINT , EFST_BODYPAINT , SCB_ASPD ); set_sc( SC_BODYPAINT , SC__BODYPAINT , EFST_BODYPAINT , SCB_ASPD );
set_sc( SC_INVISIBILITY , SC__INVISIBILITY , EFST_INVISIBILITY , SCB_ASPD|SCB_CRI|SCB_ATK_ELE ); set_sc( SC_INVISIBILITY , SC__INVISIBILITY , EFST_INVISIBILITY , SCB_ASPD|SCB_CRI|SCB_ATK_ELE );
@ -1248,7 +1250,7 @@ void initChangeTables(void)
set_sc( SR_CRESCENTELBOW , SC_CRESCENTELBOW , EFST_CRESCENTELBOW , SCB_NONE ); set_sc( SR_CRESCENTELBOW , SC_CRESCENTELBOW , EFST_CRESCENTELBOW , SCB_NONE );
set_sc_with_vfx( SR_CURSEDCIRCLE , SC_CURSEDCIRCLE_TARGET, EFST_CURSEDCIRCLE_TARGET , SCB_NONE ); set_sc_with_vfx( SR_CURSEDCIRCLE , SC_CURSEDCIRCLE_TARGET, EFST_CURSEDCIRCLE_TARGET , SCB_NONE );
set_sc( SR_LIGHTNINGWALK , SC_LIGHTNINGWALK , EFST_LIGHTNINGWALK , SCB_NONE ); set_sc( SR_LIGHTNINGWALK , SC_LIGHTNINGWALK , EFST_LIGHTNINGWALK , SCB_NONE );
set_sc( SR_RAISINGDRAGON , SC_RAISINGDRAGON , EFST_RAISINGDRAGON , SCB_REGEN|SCB_MAXHP|SCB_MAXSP ); set_sc( SR_RAISINGDRAGON , SC_RAISINGDRAGON , EFST_RAISINGDRAGON , SCB_MAXHP|SCB_MAXSP );
set_sc( SR_GENTLETOUCH_ENERGYGAIN , SC_GT_ENERGYGAIN , EFST_GENTLETOUCH_ENERGYGAIN , SCB_NONE ); set_sc( SR_GENTLETOUCH_ENERGYGAIN , SC_GT_ENERGYGAIN , EFST_GENTLETOUCH_ENERGYGAIN , SCB_NONE );
set_sc( SR_GENTLETOUCH_CHANGE , SC_GT_CHANGE , EFST_GENTLETOUCH_CHANGE , SCB_WATK|SCB_ASPD ); set_sc( SR_GENTLETOUCH_CHANGE , SC_GT_CHANGE , EFST_GENTLETOUCH_CHANGE , SCB_WATK|SCB_ASPD );
set_sc( SR_GENTLETOUCH_REVITALIZE , SC_GT_REVITALIZE , EFST_GENTLETOUCH_REVITALIZE , SCB_MAXHP|SCB_REGEN ); set_sc( SR_GENTLETOUCH_REVITALIZE , SC_GT_REVITALIZE , EFST_GENTLETOUCH_REVITALIZE , SCB_MAXHP|SCB_REGEN );
@ -1281,8 +1283,9 @@ void initChangeTables(void)
set_sc( SO_ELECTRICWALK , SC_PROPERTYWALK , EFST_PROPERTYWALK , SCB_NONE ); set_sc( SO_ELECTRICWALK , SC_PROPERTYWALK , EFST_PROPERTYWALK , SCB_NONE );
set_sc( SO_SPELLFIST , SC_SPELLFIST , EFST_SPELLFIST , SCB_NONE ); set_sc( SO_SPELLFIST , SC_SPELLFIST , EFST_SPELLFIST , SCB_NONE );
set_sc_with_vfx( SO_DIAMONDDUST , SC_CRYSTALIZE , EFST_COLD , SCB_NONE ); set_sc_with_vfx( SO_DIAMONDDUST , SC_CRYSTALIZE , EFST_COLD , SCB_NONE );
set_sc( SO_CLOUD_KILL , SC_POISON , EFST_CLOUD_KILL, SCB_NONE ); set_sc( SO_CLOUD_KILL , SC_CLOUD_POISON , EFST_CLOUD_POISON, SCB_NONE );
set_sc( SO_STRIKING , SC_STRIKING , EFST_STRIKING , SCB_WATK|SCB_CRI ); add_sc( SO_POISON_BUSTER , SC_POISON );
set_sc( SO_STRIKING , SC_STRIKING , EFST_STRIKING , SCB_ALL );
set_sc( SO_WARMER , SC_WARMER , EFST_WARMER , SCB_NONE ); set_sc( SO_WARMER , SC_WARMER , EFST_WARMER , SCB_NONE );
set_sc( SO_VACUUM_EXTREME , SC_VACUUM_EXTREME , EFST_VACUUM_EXTREME , SCB_NONE ); set_sc( SO_VACUUM_EXTREME , SC_VACUUM_EXTREME , EFST_VACUUM_EXTREME , SCB_NONE );
set_sc( SO_ARRULLO , SC_DEEPSLEEP , EFST_HANDICAPSTATE_DEEP_SLEEP, SCB_NONE ); set_sc( SO_ARRULLO , SC_DEEPSLEEP , EFST_HANDICAPSTATE_DEEP_SLEEP, SCB_NONE );
@ -1294,8 +1297,8 @@ void initChangeTables(void)
/* Genetic */ /* Genetic */
set_sc( GN_CARTBOOST , SC_GN_CARTBOOST , EFST_GN_CARTBOOST , SCB_SPEED ); set_sc( GN_CARTBOOST , SC_GN_CARTBOOST , EFST_GN_CARTBOOST , SCB_SPEED );
set_sc( GN_THORNS_TRAP , SC_THORNSTRAP , EFST_THORNS_TRAP, SCB_NONE ); set_sc( GN_THORNS_TRAP , SC_THORNSTRAP , EFST_THORNS_TRAP, SCB_NONE );
set_sc_with_vfx( GN_BLOOD_SUCKER , SC_BLOODSUCKER , EFST_BLOOD_SUCKER, SCB_NONE ); set_sc( GN_BLOOD_SUCKER , SC_BLOODSUCKER , EFST_BLOOD_SUCKER, SCB_NONE );
set_sc( GN_SPORE_EXPLOSION , SC_SPORE_EXPLOSION , EFST_SPORE_EXPLOSION, SCB_NONE ); set_sc( GN_SPORE_EXPLOSION , SC_SPORE_EXPLOSION , EFST_SPORE_EXPLOSION_DEBUFF, 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 );
set_sc_with_vfx( GN_HELLS_PLANT , SC_HELLS_PLANT , EFST_HELLS_PLANT_ARMOR , SCB_NONE ); set_sc_with_vfx( GN_HELLS_PLANT , SC_HELLS_PLANT , EFST_HELLS_PLANT_ARMOR , SCB_NONE );
@ -1546,9 +1549,9 @@ void initChangeTables(void)
StatusIconChangeTable[SC_OBLIVIONCURSE] = EFST_OBLIVIONCURSE; StatusIconChangeTable[SC_OBLIVIONCURSE] = EFST_OBLIVIONCURSE;
StatusIconChangeTable[SC_LEECHESEND] = EFST_LEECHESEND; StatusIconChangeTable[SC_LEECHESEND] = EFST_LEECHESEND;
StatusIconChangeTable[SC_BANDING_DEFENCE] = EFST_BANDING_DEFENCE; StatusIconChangeTable[SC_BANDING_DEFENCE] = EFST_BANDING_DEFENCE;
StatusIconChangeTable[SC_SHIELDSPELL_DEF] = EFST_SHIELDSPELL_DEF; StatusIconChangeTable[SC_SHIELDSPELL_HP] = EFST_SHIELDSPELL;
StatusIconChangeTable[SC_SHIELDSPELL_MDEF] = EFST_SHIELDSPELL_MDEF; StatusIconChangeTable[SC_SHIELDSPELL_SP] = EFST_SHIELDSPELL;
StatusIconChangeTable[SC_SHIELDSPELL_REF] = EFST_SHIELDSPELL_REF; StatusIconChangeTable[SC_SHIELDSPELL_ATK] = EFST_SHIELDSPELL;
StatusIconChangeTable[SC_GLOOMYDAY_SK] = EFST_GLOOMYDAY; StatusIconChangeTable[SC_GLOOMYDAY_SK] = EFST_GLOOMYDAY;
StatusIconChangeTable[SC_CURSEDCIRCLE_ATKER] = EFST_CURSEDCIRCLE_ATKER; StatusIconChangeTable[SC_CURSEDCIRCLE_ATKER] = EFST_CURSEDCIRCLE_ATKER;
@ -1821,8 +1824,7 @@ void initChangeTables(void)
StatusChangeFlagTable[SC_PYREXIA] |= SCB_ALL; StatusChangeFlagTable[SC_PYREXIA] |= SCB_ALL;
StatusChangeFlagTable[SC_OBLIVIONCURSE] |= SCB_REGEN; StatusChangeFlagTable[SC_OBLIVIONCURSE] |= SCB_REGEN;
StatusChangeFlagTable[SC_BANDING_DEFENCE] |= SCB_SPEED; StatusChangeFlagTable[SC_BANDING_DEFENCE] |= SCB_SPEED;
StatusChangeFlagTable[SC_SHIELDSPELL_DEF] |= SCB_WATK; StatusChangeFlagTable[SC_SHIELDSPELL_ATK] |= SCB_WATK|SCB_MATK;
StatusChangeFlagTable[SC_SHIELDSPELL_REF] |= SCB_DEF;
StatusChangeFlagTable[SC_STOMACHACHE] |= SCB_STR|SCB_AGI|SCB_VIT|SCB_DEX|SCB_INT|SCB_LUK; StatusChangeFlagTable[SC_STOMACHACHE] |= SCB_STR|SCB_AGI|SCB_VIT|SCB_DEX|SCB_INT|SCB_LUK;
StatusChangeFlagTable[SC_MYSTERIOUS_POWDER] |= SCB_MAXHP; StatusChangeFlagTable[SC_MYSTERIOUS_POWDER] |= SCB_MAXHP;
StatusChangeFlagTable[SC_MELON_BOMB] |= SCB_SPEED|SCB_ASPD; StatusChangeFlagTable[SC_MELON_BOMB] |= SCB_SPEED|SCB_ASPD;
@ -1950,7 +1952,6 @@ void initChangeTables(void)
StatusDisplayType[SC_CURSEDCIRCLE_TARGET] = BL_PC; StatusDisplayType[SC_CURSEDCIRCLE_TARGET] = BL_PC;
StatusDisplayType[SC_NETHERWORLD] = BL_PC; StatusDisplayType[SC_NETHERWORLD] = BL_PC;
StatusDisplayType[SC_VOICEOFSIREN] = BL_PC; StatusDisplayType[SC_VOICEOFSIREN] = BL_PC;
StatusDisplayType[SC_BLOODSUCKER] = BL_PC;
StatusDisplayType[SC__SHADOWFORM] = BL_PC; StatusDisplayType[SC__SHADOWFORM] = BL_PC;
StatusDisplayType[SC__MANHOLE] = BL_PC; StatusDisplayType[SC__MANHOLE] = BL_PC;
StatusDisplayType[SC_JYUMONJIKIRI] = BL_PC; StatusDisplayType[SC_JYUMONJIKIRI] = BL_PC;
@ -3697,8 +3698,6 @@ static int status_get_hpbonus(struct block_list *bl, enum e_status_bonus type) {
bonus += 500; bonus += 500;
if (sc->data[SC_PROMOTE_HEALTH_RESERCH]) if (sc->data[SC_PROMOTE_HEALTH_RESERCH])
bonus += sc->data[SC_PROMOTE_HEALTH_RESERCH]->val3; bonus += sc->data[SC_PROMOTE_HEALTH_RESERCH]->val3;
if(sc->data[SC_INSPIRATION])
bonus += (600 * sc->data[SC_INSPIRATION]->val1);
if(sc->data[SC_SOLID_SKIN_OPTION]) if(sc->data[SC_SOLID_SKIN_OPTION])
bonus += 2000; bonus += 2000;
if(sc->data[SC_MTF_MHP]) if(sc->data[SC_MTF_MHP])
@ -3745,9 +3744,9 @@ static int status_get_hpbonus(struct block_list *bl, enum e_status_bonus type) {
if(sc->data[SC_FORCEOFVANGUARD]) if(sc->data[SC_FORCEOFVANGUARD])
bonus += (3 * sc->data[SC_FORCEOFVANGUARD]->val1); bonus += (3 * sc->data[SC_FORCEOFVANGUARD]->val1);
if(sc->data[SC_INSPIRATION]) if(sc->data[SC_INSPIRATION])
bonus += (5 * sc->data[SC_INSPIRATION]->val1); bonus += (4 * sc->data[SC_INSPIRATION]->val1);
if(sc->data[SC_RAISINGDRAGON]) if(sc->data[SC_RAISINGDRAGON])
bonus += (2 + sc->data[SC_RAISINGDRAGON]->val1); bonus += sc->data[SC_RAISINGDRAGON]->val1;
if(sc->data[SC_GT_REVITALIZE]) if(sc->data[SC_GT_REVITALIZE])
bonus += sc->data[SC_GT_REVITALIZE]->val2; bonus += sc->data[SC_GT_REVITALIZE]->val2;
if(sc->data[SC_ANGRIFFS_MODUS]) if(sc->data[SC_ANGRIFFS_MODUS])
@ -3905,7 +3904,7 @@ static int status_get_spbonus(struct block_list *bl, enum e_status_bonus type) {
if(sc->data[SC_INCMSPRATE]) if(sc->data[SC_INCMSPRATE])
bonus += sc->data[SC_INCMSPRATE]->val1; bonus += sc->data[SC_INCMSPRATE]->val1;
if(sc->data[SC_RAISINGDRAGON]) if(sc->data[SC_RAISINGDRAGON])
bonus += (2 + sc->data[SC_RAISINGDRAGON]->val1); bonus += sc->data[SC_RAISINGDRAGON]->val1;
if(sc->data[SC_SERVICE4U]) if(sc->data[SC_SERVICE4U])
bonus += sc->data[SC_SERVICE4U]->val2; bonus += sc->data[SC_SERVICE4U]->val2;
if(sc->data[SC_MERC_SPUP]) if(sc->data[SC_MERC_SPUP])
@ -5027,6 +5026,8 @@ int status_calc_pc_sub(struct map_session_data* sd, enum e_status_calc_opt opt)
sd->bonus.short_attack_atk_rate += sc->data[SC_LUXANIMA]->val3; sd->bonus.short_attack_atk_rate += sc->data[SC_LUXANIMA]->val3;
sd->bonus.long_attack_atk_rate += sc->data[SC_LUXANIMA]->val3; sd->bonus.long_attack_atk_rate += sc->data[SC_LUXANIMA]->val3;
} }
if (sc->data[SC_STRIKING])
sd->bonus.perfect_hit += 20 + 10 * pc_checkskill(sd, SO_STRIKING);
} }
status_cpy(&sd->battle_status, base_status); status_cpy(&sd->battle_status, base_status);
@ -5484,8 +5485,6 @@ void status_calc_regen_rate(struct block_list *bl, struct regen_data *regen, str
} else } else
regen->flag &= ~sce->val4; // Remove regen as specified by val4 regen->flag &= ~sce->val4; // Remove regen as specified by val4
} }
if (sc->data[SC_BANDING] && sc->data[SC_BANDING]->val2 > 1)
regen->hp += cap_value(regen->hp * 50 / 100, 1, SHRT_MAX);
if(sc->data[SC_GT_REVITALIZE]) { if(sc->data[SC_GT_REVITALIZE]) {
regen->hp += cap_value(regen->hp * sc->data[SC_GT_REVITALIZE]->val3/100, 1, SHRT_MAX); regen->hp += cap_value(regen->hp * sc->data[SC_GT_REVITALIZE]->val3/100, 1, SHRT_MAX);
regen->state.walk = 1; regen->state.walk = 1;
@ -6913,12 +6912,10 @@ static unsigned short status_calc_watk(struct block_list *bl, struct status_chan
watk -= watk * sc->data[SC_STRIPWEAPON]->val2/100; watk -= watk * sc->data[SC_STRIPWEAPON]->val2/100;
if(sc->data[SC_FIGHTINGSPIRIT]) if(sc->data[SC_FIGHTINGSPIRIT])
watk += sc->data[SC_FIGHTINGSPIRIT]->val1; watk += sc->data[SC_FIGHTINGSPIRIT]->val1;
if(sc->data[SC_SHIELDSPELL_DEF] && sc->data[SC_SHIELDSPELL_DEF]->val1 == 3) if (sc->data[SC_SHIELDSPELL_ATK])
watk += sc->data[SC_SHIELDSPELL_DEF]->val2; watk += sc->data[SC_SHIELDSPELL_ATK]->val2;
if(sc->data[SC_BANDING] && sc->data[SC_BANDING]->val2 > 1)
watk += (10 + 10 * sc->data[SC_BANDING]->val1) * sc->data[SC_BANDING]->val2;
if(sc->data[SC_INSPIRATION]) if(sc->data[SC_INSPIRATION])
watk += 40 * sc->data[SC_INSPIRATION]->val1 + 3 * sc->data[SC_INSPIRATION]->val2; watk += sc->data[SC_INSPIRATION]->val2;
if(sc->data[SC_GT_CHANGE]) if(sc->data[SC_GT_CHANGE])
watk += sc->data[SC_GT_CHANGE]->val2; watk += sc->data[SC_GT_CHANGE]->val2;
if(sc->data[SC__ENERVATION]) if(sc->data[SC__ENERVATION])
@ -7017,6 +7014,10 @@ static unsigned short status_calc_ematk(struct block_list *bl, struct status_cha
matk += sc->data[SC_DORAM_MATK]->val1; matk += sc->data[SC_DORAM_MATK]->val1;
if (sc->data[SC_SOULFAIRY]) if (sc->data[SC_SOULFAIRY])
matk += sc->data[SC_SOULFAIRY]->val2; matk += sc->data[SC_SOULFAIRY]->val2;
if (sc->data[SC__AUTOSHADOWSPELL])
matk += sc->data[SC__AUTOSHADOWSPELL]->val4 * 5;
if (sc->data[SC_INSPIRATION])
matk += sc->data[SC_INSPIRATION]->val2;
return (unsigned short)cap_value(matk,0,USHRT_MAX); return (unsigned short)cap_value(matk,0,USHRT_MAX);
} }
@ -7066,7 +7067,11 @@ static unsigned short status_calc_matk(struct block_list *bl, struct status_chan
matk += sc->data[SC_QUEST_BUFF2]->val1; matk += sc->data[SC_QUEST_BUFF2]->val1;
if (sc->data[SC_QUEST_BUFF3]) if (sc->data[SC_QUEST_BUFF3])
matk += sc->data[SC_QUEST_BUFF3]->val1; matk += sc->data[SC_QUEST_BUFF3]->val1;
if (sc->data[SC_MAGICPOWER] && sc->data[SC_MAGICPOWER]->val4) if (sc->data[SC_MAGICPOWER]
#ifndef RENEWAL
&& sc->data[SC_MAGICPOWER]->val4
#endif
)
matk += matk * sc->data[SC_MAGICPOWER]->val3/100; matk += matk * sc->data[SC_MAGICPOWER]->val3/100;
if (sc->data[SC_MINDBREAKER]) if (sc->data[SC_MINDBREAKER])
matk += matk * sc->data[SC_MINDBREAKER]->val2/100; matk += matk * sc->data[SC_MINDBREAKER]->val2/100;
@ -7086,6 +7091,8 @@ static unsigned short status_calc_matk(struct block_list *bl, struct status_chan
if (sc->data[SC_NIBELUNGEN] && sc->data[SC_NIBELUNGEN]->val2 == RINGNBL_MATKRATE) if (sc->data[SC_NIBELUNGEN] && sc->data[SC_NIBELUNGEN]->val2 == RINGNBL_MATKRATE)
matk += matk * 20 / 100; matk += matk * 20 / 100;
#endif #endif
if (sc->data[SC_SHIELDSPELL_ATK])
matk += sc->data[SC_SHIELDSPELL_ATK]->val2;
return (unsigned short)cap_value(matk,0,USHRT_MAX); return (unsigned short)cap_value(matk,0,USHRT_MAX);
} }
@ -7116,8 +7123,6 @@ static signed short status_calc_critical(struct block_list *bl, struct status_ch
critical += sc->data[SC_TRUESIGHT]->val2; critical += sc->data[SC_TRUESIGHT]->val2;
if (sc->data[SC_CLOAKING]) if (sc->data[SC_CLOAKING])
critical += critical; critical += critical;
if (sc->data[SC_STRIKING])
critical += critical * sc->data[SC_STRIKING]->val1 / 100;
#ifdef RENEWAL #ifdef RENEWAL
if (sc->data[SC_SPEARQUICKEN]) if (sc->data[SC_SPEARQUICKEN])
critical += 3*sc->data[SC_SPEARQUICKEN]->val1*10; critical += 3*sc->data[SC_SPEARQUICKEN]->val1*10;
@ -7159,7 +7164,7 @@ static signed short status_calc_hit(struct block_list *bl, struct status_change
if(sc->data[SC_CONCENTRATION]) if(sc->data[SC_CONCENTRATION])
hit += sc->data[SC_CONCENTRATION]->val3; hit += sc->data[SC_CONCENTRATION]->val3;
if(sc->data[SC_INSPIRATION]) if(sc->data[SC_INSPIRATION])
hit += 5 * sc->data[SC_INSPIRATION]->val1 + sc->data[SC_INSPIRATION]->val2 / 2; hit += 12 * sc->data[SC_INSPIRATION]->val1;
if(sc->data[SC_ADJUSTMENT]) if(sc->data[SC_ADJUSTMENT])
hit -= 30; hit -= 30;
if(sc->data[SC_INCREASING]) if(sc->data[SC_INCREASING])
@ -7224,6 +7229,8 @@ static signed short status_calc_flee(struct block_list *bl, struct status_change
if(!sc || !sc->count) if(!sc || !sc->count)
return cap_value(flee,1,SHRT_MAX); return cap_value(flee,1,SHRT_MAX);
if (sc->data[SC_POISON_MIST])
return 0;
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;
@ -7412,16 +7419,12 @@ static defType status_calc_def(struct block_list *bl, struct status_change *sc,
def -= def * (14 * sc->data[SC_ANALYZE]->val1) / 100; def -= def * (14 * sc->data[SC_ANALYZE]->val1) / 100;
if( sc->data[SC_NEUTRALBARRIER] ) if( sc->data[SC_NEUTRALBARRIER] )
def += def * sc->data[SC_NEUTRALBARRIER]->val2 / 100; def += def * sc->data[SC_NEUTRALBARRIER]->val2 / 100;
if( sc->data[SC_SHIELDSPELL_REF] && sc->data[SC_SHIELDSPELL_REF]->val1 == 2 )
def += sc->data[SC_SHIELDSPELL_REF]->val2;
if( sc->data[SC_PRESTIGE] ) if( sc->data[SC_PRESTIGE] )
def += sc->data[SC_PRESTIGE]->val3; def += sc->data[SC_PRESTIGE]->val3;
if( sc->data[SC_BANDING] && sc->data[SC_BANDING]->val2 > 1 ) if( sc->data[SC_BANDING] && sc->data[SC_BANDING]->val2 > 1 )
def += (5 + sc->data[SC_BANDING]->val1) * sc->data[SC_BANDING]->val2 / 10; def += 6 * sc->data[SC_BANDING]->val1;
if( sc->data[SC_ECHOSONG] ) if( sc->data[SC_ECHOSONG] )
def += sc->data[SC_ECHOSONG]->val3; def += sc->data[SC_ECHOSONG]->val3;
if( sc->data[SC_EARTHDRIVE] )
def -= def * 25 / 100;
if( sc->data[SC_CAMOUFLAGE] ) if( sc->data[SC_CAMOUFLAGE] )
def -= def * 5 * sc->data[SC_CAMOUFLAGE]->val3 / 100; def -= def * 5 * sc->data[SC_CAMOUFLAGE]->val3 / 100;
if( sc->data[SC_SOLID_SKIN_OPTION] ) if( sc->data[SC_SOLID_SKIN_OPTION] )
@ -7438,6 +7441,8 @@ static defType status_calc_def(struct block_list *bl, struct status_change *sc,
def += sc->data[SC_GLASTHEIM_ITEMDEF]->val1; def += sc->data[SC_GLASTHEIM_ITEMDEF]->val1;
if (sc->data[SC_SOULGOLEM]) if (sc->data[SC_SOULGOLEM])
def += sc->data[SC_SOULGOLEM]->val2; def += sc->data[SC_SOULGOLEM]->val2;
if (sc->data[SC_STONE_WALL])
def += sc->data[SC_STONE_WALL]->val2;
return (defType)cap_value(def,DEFTYPE_MIN,DEFTYPE_MAX); return (defType)cap_value(def,DEFTYPE_MIN,DEFTYPE_MAX);
} }
@ -7564,6 +7569,8 @@ static defType status_calc_mdef(struct block_list *bl, struct status_change *sc,
mdef += sc->data[SC_GLASTHEIM_ITEMDEF]->val2; mdef += sc->data[SC_GLASTHEIM_ITEMDEF]->val2;
if (sc->data[SC_SOULGOLEM]) if (sc->data[SC_SOULGOLEM])
mdef += sc->data[SC_SOULGOLEM]->val3; mdef += sc->data[SC_SOULGOLEM]->val3;
if (sc->data[SC_STONE_WALL])
mdef += sc->data[SC_STONE_WALL]->val3;
return (defType)cap_value(mdef,DEFTYPE_MIN,DEFTYPE_MAX); return (defType)cap_value(mdef,DEFTYPE_MIN,DEFTYPE_MAX);
} }
@ -7712,8 +7719,6 @@ static unsigned short status_calc_speed(struct block_list *bl, struct status_cha
val = max( val, 20 ); val = max( val, 20 );
if( sc->data[SC__LAZINESS] ) if( sc->data[SC__LAZINESS] )
val = max( val, 25 ); val = max( val, 25 );
if( sc->data[SC_BANDING_DEFENCE] )
val = max( val, sc->data[SC_BANDING_DEFENCE]->val1 ); // +90% walking speed.
if( sc->data[SC_ROCK_CRUSHER_ATK] ) if( sc->data[SC_ROCK_CRUSHER_ATK] )
val = max( val, sc->data[SC_ROCK_CRUSHER_ATK]->val2 ); val = max( val, sc->data[SC_ROCK_CRUSHER_ATK]->val2 );
if( sc->data[SC_POWER_OF_GAIA] ) if( sc->data[SC_POWER_OF_GAIA] )
@ -7921,14 +7926,10 @@ static short status_calc_aspd(struct block_list *bl, struct status_change *sc, b
bonus += sc->data[SC_DANCEWITHWUG]->val3; bonus += sc->data[SC_DANCEWITHWUG]->val3;
if (sc->data[SC_GLOOMYDAY]) if (sc->data[SC_GLOOMYDAY])
bonus -= sc->data[SC_GLOOMYDAY]->val3; bonus -= sc->data[SC_GLOOMYDAY]->val3;
if (sc->data[SC_EARTHDRIVE])
bonus -= 25;
if (sc->data[SC_GT_CHANGE]) if (sc->data[SC_GT_CHANGE])
bonus += sc->data[SC_GT_CHANGE]->val3; bonus += sc->data[SC_GT_CHANGE]->val3;
if (sc->data[SC_MELON_BOMB]) if (sc->data[SC_MELON_BOMB])
bonus -= sc->data[SC_MELON_BOMB]->val3; bonus -= sc->data[SC_MELON_BOMB]->val3;
if (sc->data[SC_PAIN_KILLER])
bonus -= sc->data[SC_PAIN_KILLER]->val2;
if (sc->data[SC_BOOST500]) if (sc->data[SC_BOOST500])
bonus += sc->data[SC_BOOST500]->val1; bonus += sc->data[SC_BOOST500]->val1;
if (sc->data[SC_EXTRACT_SALAMINE_JUICE]) if (sc->data[SC_EXTRACT_SALAMINE_JUICE])
@ -8126,8 +8127,6 @@ static short status_calc_aspd_rate(struct block_list *bl, struct status_change *
aspd_rate -= sc->data[SC_DANCEWITHWUG]->val3 * 10; aspd_rate -= sc->data[SC_DANCEWITHWUG]->val3 * 10;
if( sc->data[SC_GLOOMYDAY] ) if( sc->data[SC_GLOOMYDAY] )
aspd_rate += sc->data[SC_GLOOMYDAY]->val3 * 10; aspd_rate += sc->data[SC_GLOOMYDAY]->val3 * 10;
if( sc->data[SC_EARTHDRIVE] )
aspd_rate += 250;
if( sc->data[SC_GT_CHANGE] ) if( sc->data[SC_GT_CHANGE] )
aspd_rate -= sc->data[SC_GT_CHANGE]->val3 * 10; aspd_rate -= sc->data[SC_GT_CHANGE]->val3 * 10;
if( sc->data[SC_MELON_BOMB] ) if( sc->data[SC_MELON_BOMB] )
@ -8138,8 +8137,6 @@ static short status_calc_aspd_rate(struct block_list *bl, struct status_change *
aspd_rate -= sc->data[SC_EXTRACT_SALAMINE_JUICE]->val1 * 10; aspd_rate -= sc->data[SC_EXTRACT_SALAMINE_JUICE]->val1 * 10;
if( sc->data[SC_INCASPDRATE] ) if( sc->data[SC_INCASPDRATE] )
aspd_rate -= sc->data[SC_INCASPDRATE]->val1 * 10; aspd_rate -= sc->data[SC_INCASPDRATE]->val1 * 10;
if( sc->data[SC_PAIN_KILLER])
aspd_rate += sc->data[SC_PAIN_KILLER]->val2 * 10;
if( sc->data[SC_GOLDENE_FERSE]) if( sc->data[SC_GOLDENE_FERSE])
aspd_rate -= sc->data[SC_GOLDENE_FERSE]->val3 * 10; aspd_rate -= sc->data[SC_GOLDENE_FERSE]->val3 * 10;
if (sc->data[SC_WIND_INSIGNIA] && sc->data[SC_WIND_INSIGNIA]->val1 == 2) if (sc->data[SC_WIND_INSIGNIA] && sc->data[SC_WIND_INSIGNIA]->val1 == 2)
@ -8305,8 +8302,6 @@ unsigned char status_calc_attack_element(struct block_list *bl, struct status_ch
return ELE_GHOST; return ELE_GHOST;
if(sc->data[SC_TIDAL_WEAPON_OPTION] || sc->data[SC_TIDAL_WEAPON] ) if(sc->data[SC_TIDAL_WEAPON_OPTION] || sc->data[SC_TIDAL_WEAPON] )
return ELE_WATER; return ELE_WATER;
if(sc->data[SC_PYROCLASTIC])
return ELE_FIRE;
return (unsigned char)cap_value(element,0,UCHAR_MAX); return (unsigned char)cap_value(element,0,UCHAR_MAX);
} }
@ -9197,8 +9192,6 @@ t_tick status_get_sc_def(struct block_list *src, struct block_list *bl, enum sc_
else if (sc->data[SC_SIEGFRIED]) else if (sc->data[SC_SIEGFRIED])
sc_def += sc->data[SC_SIEGFRIED]->val3*100; // Status resistance. sc_def += sc->data[SC_SIEGFRIED]->val3*100; // Status resistance.
#endif #endif
else if (sc->data[SC_SHIELDSPELL_REF] && sc->data[SC_SHIELDSPELL_REF]->val1 == 2)
sc_def += sc->data[SC_SHIELDSPELL_REF]->val3*100;
else if (sc->data[SC_LEECHESEND] && sc->data[SC_LEECHESEND]->val3 == 0) { else if (sc->data[SC_LEECHESEND] && sc->data[SC_LEECHESEND]->val3 == 0) {
switch (type) { switch (type) {
case SC_BLIND: case SC_BLIND:
@ -10300,16 +10293,15 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
case SC_REFLECTDAMAGE: case SC_REFLECTDAMAGE:
status_change_end(bl, SC_REFLECTSHIELD, INVALID_TIMER); status_change_end(bl, SC_REFLECTSHIELD, INVALID_TIMER);
break; break;
case SC_SHIELDSPELL_DEF: case SC_SHIELDSPELL_HP:
case SC_SHIELDSPELL_MDEF: case SC_SHIELDSPELL_SP:
case SC_SHIELDSPELL_REF: case SC_SHIELDSPELL_ATK:
status_change_end(bl, SC_MAGNIFICAT, INVALID_TIMER); if( type != SC_SHIELDSPELL_HP )
if( type != SC_SHIELDSPELL_DEF ) status_change_end(bl, SC_SHIELDSPELL_HP, INVALID_TIMER);
status_change_end(bl, SC_SHIELDSPELL_DEF, INVALID_TIMER); if( type != SC_SHIELDSPELL_SP )
if( type != SC_SHIELDSPELL_MDEF ) status_change_end(bl, SC_SHIELDSPELL_SP, INVALID_TIMER);
status_change_end(bl, SC_SHIELDSPELL_MDEF, INVALID_TIMER); if( type != SC_SHIELDSPELL_ATK )
if( type != SC_SHIELDSPELL_REF ) status_change_end(bl, SC_SHIELDSPELL_ATK, INVALID_TIMER);
status_change_end(bl, SC_SHIELDSPELL_REF, INVALID_TIMER);
break; break;
case SC_BANDING: case SC_BANDING:
status_change_end(bl, SC_PRESTIGE, INVALID_TIMER); status_change_end(bl, SC_PRESTIGE, INVALID_TIMER);
@ -10653,14 +10645,13 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
} }
break; break;
case SC_MAGICPOWER: case SC_MAGICPOWER:
// val1: Skill lv
val2 = 1; // Lasts 1 invocation
#ifdef RENEWAL #ifdef RENEWAL
val3 = 10 * val1; // Matk% increase
#else
val3 = 5 * val1; // Matk% increase val3 = 5 * val1; // Matk% increase
#endif #else
val2 = 1; // Lasts 1 invocation
val3 = 10 * val1; // Matk% increase
val4 = 0; // 0 = ready to be used, 1 = activated and running val4 = 0; // 0 = ready to be used, 1 = activated and running
#endif
break; break;
case SC_SACRIFICE: case SC_SACRIFICE:
val2 = 5; // Lasts 5 hits val2 = 5; // Lasts 5 hits
@ -11763,10 +11754,6 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
tick = INFINITE_TICK; // Duration sent to the client should be infinite tick = INFINITE_TICK; // Duration sent to the client should be infinite
tick_time = 3000; tick_time = 3000;
break; break;
case SC_BLOODSUCKER:
val4 = tick / 1000;
tick_time = 1000; // [GodLesZ] tick time
break;
case SC_HELLS_PLANT: case SC_HELLS_PLANT:
tick_time = 333; tick_time = 333;
val4 = tick / tick_time; val4 = tick / tick_time;
@ -11848,7 +11835,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
val3 = 4 * val1 + min(3 * val2, 15); // !TODO: What's the Lesson bonus? val3 = 4 * val1 + min(3 * val2, 15); // !TODO: What's the Lesson bonus?
break; break;
case SC_REFLECTDAMAGE: case SC_REFLECTDAMAGE:
val2 = 15 + 5 * val1; // Reflect amount val2 = 10 * val1; // Reflect reduction amount
val3 = val1*5 + 25; // Number of reflects val3 = val1*5 + 25; // Number of reflects
val4 = tick/1000; // Number of SP cycles (duration) val4 = tick/1000; // Number of SP cycles (duration)
tick_time = 1000; // [GodLesZ] tick time tick_time = 1000; // [GodLesZ] tick time
@ -11873,6 +11860,19 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
val2 = (status->int_ + status->luk) * val1 / 20 * status_get_lv(bl) / 200 + val1; // Chance to evade magic damage. val2 = (status->int_ + status->luk) * val1 / 20 * status_get_lv(bl) / 200 + val1; // Chance to evade magic damage.
val3 = ((val1 * 15) + (10 * (sd?pc_checkskill(sd,CR_DEFENDER):skill_get_max(CR_DEFENDER)))) * status_get_lv(bl) / 100; // Defence added val3 = ((val1 * 15) + (10 * (sd?pc_checkskill(sd,CR_DEFENDER):skill_get_max(CR_DEFENDER)))) * status_get_lv(bl) / 100; // Defence added
break; break;
case SC_SHIELDSPELL_HP:
val2 = 3; // 3% HP every 3 seconds
tick_time = 3000;
val4 = tick / tick_time;
break;
case SC_SHIELDSPELL_SP:
val2 = 3; // 3% SP every 5 seconds
tick_time = 5000;
val4 = tick / tick_time;
break;
case SC_SHIELDSPELL_ATK:
val2 = 150; // WATK/MATK bonus
break;
case SC_BANDING: case SC_BANDING:
val2 = (sd ? skill_banding_count(sd) : 1); val2 = (sd ? skill_banding_count(sd) : 1);
tick_time = 5000; // [GodLesZ] tick time tick_time = 5000; // [GodLesZ] tick time
@ -11882,11 +11882,11 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
val4 = tick / tick_time; val4 = tick / tick_time;
break; break;
case SC_INSPIRATION: case SC_INSPIRATION:
val2 = (sd?sd->status.job_level:50); val2 = 40 * val1; // ATK/MATK
val3 = status_get_lv(bl) / 10 + val2 / 5; //All stat bonus val3 = 6 * val1; //All stat bonus
val4 = tick / 5000; val4 = tick / 5000;
tick_time = 5000; // [GodLesZ] tick time tick_time = 5000; // [GodLesZ] tick time
status_change_clear_buffs(bl, SCCB_BUFFS|SCCB_DEBUFFS); // Remove buffs/debuffs status_change_clear_buffs(bl, SCCB_DEBUFFS); // Remove debuffs
break; break;
case SC_CRESCENTELBOW: case SC_CRESCENTELBOW:
val2 = (sd?sd->status.job_level:50) / 2 + (50 + 5 * val1); val2 = (sd?sd->status.job_level:50) / 2 + (50 + 5 * val1);
@ -11894,10 +11894,6 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
case SC_LIGHTNINGWALK: // [(Job Level / 2) + (40 + 5 * Skill Level)] % case SC_LIGHTNINGWALK: // [(Job Level / 2) + (40 + 5 * Skill Level)] %
val1 = (sd?sd->status.job_level:2)/2 + 40 + 5 * val1; val1 = (sd?sd->status.job_level:2)/2 + 40 + 5 * val1;
break; break;
case SC_RAISINGDRAGON:
val3 = tick / 5000;
tick_time = 5000; // [GodLesZ] tick time
break;
case SC_GT_ENERGYGAIN: case SC_GT_ENERGYGAIN:
val2 = 10 + 5 * val1; // Sphere gain chance. val2 = 10 + 5 * val1; // Sphere gain chance.
break; break;
@ -12102,6 +12098,10 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
val3 = 6 + 4 * val1; // Aspd Bonus val3 = 6 + 4 * val1; // Aspd Bonus
val4 = 2 + 2 * val1; // Chance of holy attack val4 = 2 + 2 * val1; // Chance of holy attack
break; break;
case SC_STONE_WALL:
val2 = 100 * val1; // DEF bonus
val3 = 30 * val1; // MDEF bonus
break;
case SC_OVERED_BOOST: case SC_OVERED_BOOST:
val2 = 400 + 40 * val1; // flee bonus val2 = 400 + 40 * val1; // flee bonus
val3 = 180 + 2 * val1; // aspd bonus val3 = 180 + 2 * val1; // aspd bonus
@ -12116,8 +12116,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
val2 = 3*val1; // Activation chance val2 = 3*val1; // Activation chance
break; break;
case SC_PYROCLASTIC: case SC_PYROCLASTIC:
val2 += 10*val1; // atk bonus val2 += 100 + 10*val1; // atk bonus // !TODO: Confirm formula
val3 = 2*val1; // Chance To AutoCast Hammer Fall %
break; break;
case SC_PARALYSIS: // [Lighta] need real info case SC_PARALYSIS: // [Lighta] need real info
val2 = 2*val1; // def reduction val2 = 2*val1; // def reduction
@ -12127,8 +12126,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
val2 = 20 * val1; // hp reco on death % val2 = 20 * val1; // hp reco on death %
break; break;
case SC_PAIN_KILLER: // Yommy leak need confirm case SC_PAIN_KILLER: // Yommy leak need confirm
val2 = 10 * val1; // aspd reduction % val2 = min((( 200 * val1 ) * status_get_lv(src)) / 150, 1000); // dmg reduction linear. upto a maximum of 1000 [iRO Wiki]
val3 = min((( 200 * val1 ) * status_get_lv(src)) / 150, 1000); // dmg reduction linear. upto a maximum of 1000 [iRO Wiki]
if(sc->data[SC_PARALYSIS]) if(sc->data[SC_PARALYSIS])
sc_start(src,bl, SC_ENDURE, 100, val1, tick); // Start endure for same duration sc_start(src,bl, SC_ENDURE, 100, val1, tick); // Start endure for same duration
break; break;
@ -12194,8 +12192,6 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
break; break;
case SC_UNLIMIT: case SC_UNLIMIT:
val2 = 50 * val1; val2 = 50 * val1;
status_change_start(bl, bl, SC_DEFSET, 10000, 1, 0, 0, 0, tick, SCSTART_NOTICKDEF);
status_change_start(bl, bl, SC_MDEFSET, 10000, 1, 0, 0, 0, tick, SCSTART_NOTICKDEF);
break; break;
case SC_MONSTER_TRANSFORM: case SC_MONSTER_TRANSFORM:
case SC_ACTIVE_MONSTER_TRANSFORM: case SC_ACTIVE_MONSTER_TRANSFORM:
@ -12607,9 +12603,6 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
case SC__WEAKNESS: case SC__WEAKNESS:
case SC_PROPERTYWALK: case SC_PROPERTYWALK:
case SC_PRESTIGE: case SC_PRESTIGE:
case SC_SHIELDSPELL_DEF:
case SC_SHIELDSPELL_MDEF:
case SC_SHIELDSPELL_REF:
case SC_CRESCENTELBOW: case SC_CRESCENTELBOW:
case SC_CHILLY_AIR_OPTION: case SC_CHILLY_AIR_OPTION:
case SC_GUST_OPTION: case SC_GUST_OPTION:
@ -13079,9 +13072,6 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
break; break;
} }
break; break;
case SC_RAISINGDRAGON:
sce->val2 = status->max_hp / 100; // Officially tested its 1%hp drain. [Jobbie]
break;
case SC_C_MARKER: case SC_C_MARKER:
//Send mini-map, don't wait for first timer triggered //Send mini-map, don't wait for first timer triggered
if (src->type == BL_PC && (sd = map_id2sd(src->id))) if (src->type == BL_PC && (sd = map_id2sd(src->id)))
@ -13134,7 +13124,6 @@ int status_change_clear(struct block_list* bl, int type)
#ifndef RENEWAL #ifndef RENEWAL
sc->sg_counter = 0; sc->sg_counter = 0;
#endif #endif
sc->bs_counter = 0;
if (!sc->count) if (!sc->count)
return 0; return 0;
@ -13243,6 +13232,7 @@ int status_change_clear(struct block_list* bl, int type)
case SC_REUSE_LIMIT_LUXANIMA: case SC_REUSE_LIMIT_LUXANIMA:
case SC_SOULENERGY: case SC_SOULENERGY:
case SC_MADOGEAR: case SC_MADOGEAR:
case SC_HOMUN_TIME:
// Costumes // Costumes
case SC_MOONSTAR: case SC_MOONSTAR:
case SC_SUPER_STAR: case SC_SUPER_STAR:
@ -13280,6 +13270,7 @@ int status_change_clear(struct block_list* bl, int type)
case SC_ENTRY_QUEUE_APPLY_DELAY: case SC_ENTRY_QUEUE_APPLY_DELAY:
case SC_ENTRY_QUEUE_NOTIFY_ADMISSION_TIME_OUT: case SC_ENTRY_QUEUE_NOTIFY_ADMISSION_TIME_OUT:
case SC_MADOGEAR: case SC_MADOGEAR:
case SC_HOMUN_TIME:
// Costumes // Costumes
case SC_MOONSTAR: case SC_MOONSTAR:
case SC_SUPER_STAR: case SC_SUPER_STAR:
@ -13594,7 +13585,6 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const
} }
break; break;
case SC_SPLASHER: case SC_SPLASHER:
case SC_SPORE_EXPLOSION:
{ {
struct block_list *src=map_id2bl(sce->val3); struct block_list *src=map_id2bl(sce->val3);
if(src && tid != INVALID_TIMER) if(src && tid != INVALID_TIMER)
@ -13780,7 +13770,7 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const
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());
break; break;
case SC_RAISINGDRAGON: case SC_RAISINGDRAGON:
if( sd && sce->val2 && !pc_isdead(sd) ) { if( sd && !pc_isdead(sd) ) {
int i = min(sd->spiritball,5); int i = min(sd->spiritball,5);
pc_delspiritball(sd, sd->spiritball, 0); pc_delspiritball(sd, sd->spiritball, 0);
status_change_end(bl, SC_EXPLOSIONSPIRITS, INVALID_TIMER); status_change_end(bl, SC_EXPLOSIONSPIRITS, INVALID_TIMER);
@ -13801,18 +13791,6 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const
} }
} }
break; break;
case SC_BLOODSUCKER:
if( sce->val2 ) {
struct block_list *src = map_id2bl(sce->val2);
if (src && !status_isdead(src)) {
struct status_change *sc2 = status_get_sc(src);
if (sc2)
sc2->bs_counter--;
}
}
break;
case SC_TEARGAS: case SC_TEARGAS:
status_change_end(bl,SC_TEARGAS_SOB,INVALID_TIMER); status_change_end(bl,SC_TEARGAS_SOB,INVALID_TIMER);
break; break;
@ -13949,6 +13927,10 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const
if (sd) if (sd)
pc_bonus_script_clear(sd, BSF_REM_ON_MADOGEAR); pc_bonus_script_clear(sd, BSF_REM_ON_MADOGEAR);
break; break;
case SC_HOMUN_TIME:
if (sd && hom_is_active(sd->hd))
hom_vaporize(sd, HOM_ST_REST);
break;
} }
opt_flag = 1; opt_flag = 1;
@ -14168,15 +14150,13 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const
} }
} }
if (calc_flag) { if (calc_flag) {
switch (type) { #ifndef RENEWAL
case SC_MAGICPOWER: if (type == SC_MAGICPOWER) {
//If Mystical Amplification ends, MATK is immediately recalculated //If Mystical Amplification ends, MATK is immediately recalculated
status_calc_bl_(bl, calc_flag, SCO_FORCE); status_calc_bl_(bl, calc_flag, SCO_FORCE);
break; } else
default: #endif
status_calc_bl(bl, calc_flag); status_calc_bl(bl, calc_flag);
break;
}
} }
if(opt_flag&4) // Out of hiding, invoke on place. if(opt_flag&4) // Out of hiding, invoke on place.
@ -14735,28 +14715,6 @@ TIMER_FUNC(status_change_timer){
return 0; return 0;
} }
case SC_BLOODSUCKER:
if( --(sce->val4) >= 0 ) {
struct block_list *src = map_id2bl(sce->val2);
int damage;
if( !src || (src && (status_isdead(src) || src->m != bl->m || distance_bl(src, bl) >= 12)) )
break;
map_freeblock_lock();
if (is_infinite_defense(bl, BF_MISC)) // Only does 1 damage to infinte defense type.
damage = 1;
else
damage = 200 + 100 * sce->val1 + status_get_int(src);
status_damage(src, bl, damage, 0, clif_damage(bl,bl,tick,status->amotion,status->dmotion+200,damage,1,DMG_NORMAL,0,false), 0, 0);
unit_skillcastcancel(bl,1);
if ( sc->data[type] ) {
sc_timer_next(1000 + tick);
}
map_freeblock_unlock();
status_heal(src, damage*(5 + 5 * sce->val1)/100, 0, 0); // 5 + 5% per level
return 0;
}
break;
case SC_HELLS_PLANT: case SC_HELLS_PLANT:
if (--(sce->val4) > 0) { if (--(sce->val4) > 0) {
skill_castend_damage_id(bl, bl, GN_HELLS_PLANT_ATK, sce->val1, tick, 0); skill_castend_damage_id(bl, bl, GN_HELLS_PLANT_ATK, sce->val1, tick, 0);
@ -14870,20 +14828,27 @@ TIMER_FUNC(status_change_timer){
case SC_INSPIRATION: case SC_INSPIRATION:
if(--(sce->val4) >= 0) { if(--(sce->val4) >= 0) {
int hp = status->max_hp * (35 - 5 * sce->val1) / 1000; if (!status_charge(bl, status->max_hp * (35 - 5 * sce->val1) / 1000, status->max_sp * (45 - 5 * sce->val1) / 1000))
int sp = status->max_sp * (45 - 5 * sce->val1) / 1000; break;
if( !status_charge(bl,hp,sp) ) break;
sc_timer_next(5000+tick); sc_timer_next(5000+tick);
return 0; return 0;
} }
break; break;
case SC_RAISINGDRAGON: case SC_SHIELDSPELL_HP:
// 1% every 5 seconds [Jobbie] if (sce->val4 >= 0) {
if( --(sce->val3)>0 && status_charge(bl, sce->val2, 0) ) { if (status->hp < status->max_hp)
if( !sc->data[type] ) return 0; status_heal(bl, status->max_hp * sce->val2 / 100, 0, 1);
sc_timer_next(3000 + tick);
return 0;
}
break;
case SC_SHIELDSPELL_SP:
if (sce->val4 >= 0) {
if (status->sp < status->max_sp)
status_heal(bl, 0, status->max_sp * sce->val2 / 100, 1);
sc_timer_next(5000 + tick); sc_timer_next(5000 + tick);
return 0; return 0;
} }
@ -15423,6 +15388,7 @@ void status_change_clear_buffs(struct block_list* bl, uint8 type)
case SC_EP16_2_BUFF_SS: case SC_EP16_2_BUFF_SS:
case SC_EP16_2_BUFF_SC: case SC_EP16_2_BUFF_SC:
case SC_EP16_2_BUFF_AC: case SC_EP16_2_BUFF_AC:
case SC_HOMUN_TIME:
// Clans // Clans
case SC_CLAN_INFO: case SC_CLAN_INFO:
case SC_SWORDCLAN: case SC_SWORDCLAN:
@ -15527,7 +15493,6 @@ void status_change_clear_buffs(struct block_list* bl, uint8 type)
#ifndef RENEWAL #ifndef RENEWAL
sc->sg_counter = 0; sc->sg_counter = 0;
#endif #endif
sc->bs_counter = 0;
return; return;
} }

View File

@ -521,9 +521,9 @@ enum sc_type : int16 {
**/ **/
SC_REFLECTDAMAGE, SC_REFLECTDAMAGE,
SC_FORCEOFVANGUARD, SC_FORCEOFVANGUARD,
SC_SHIELDSPELL_DEF, SC_SHIELDSPELL_HP,
SC_SHIELDSPELL_MDEF, SC_SHIELDSPELL_SP,
SC_SHIELDSPELL_REF,//380 SC_SHIELDSPELL_ATK,//380
SC_EXEEDBREAK, SC_EXEEDBREAK,
SC_PRESTIGE, SC_PRESTIGE,
SC_BANDING, SC_BANDING,
@ -976,6 +976,13 @@ enum sc_type : int16 {
SC_EP16_2_BUFF_SC, SC_EP16_2_BUFF_SC,
SC_EP16_2_BUFF_AC, SC_EP16_2_BUFF_AC,
// Job Improvement Bundle
SC_OVERBRANDREADY,
SC_POISON_MIST,
SC_STONE_WALL,
SC_CLOUD_POISON,
SC_HOMUN_TIME,
SC_EMERGENCY_MOVE, SC_EMERGENCY_MOVE,
SC_MADOGEAR, SC_MADOGEAR,
@ -2665,7 +2672,6 @@ struct status_change {
#ifndef RENEWAL #ifndef RENEWAL
unsigned char sg_counter; //Storm gust counter (previous hits from storm gust) unsigned char sg_counter; //Storm gust counter (previous hits from storm gust)
#endif #endif
unsigned char bs_counter; // Blood Sucker counter
struct status_change_entry *data[SC_MAX]; struct status_change_entry *data[SC_MAX];
}; };

View File

@ -1955,7 +1955,9 @@ int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, ui
unit_stop_walking(src, 1); // Even though this is not how official works but this will do the trick. bugreport:6829 unit_stop_walking(src, 1); // Even though this is not how official works but this will do the trick. bugreport:6829
// SC_MAGICPOWER needs to switch states at start of cast // SC_MAGICPOWER needs to switch states at start of cast
#ifndef RENEWAL
skill_toggle_magicpower(src, skill_id); skill_toggle_magicpower(src, skill_id);
#endif
// In official this is triggered even if no cast time. // In official this is triggered even if no cast time.
clif_skillcasting(src, src->id, target_id, 0,0, skill_id, skill_lv, skill_get_ele(skill_id, skill_lv), casttime); clif_skillcasting(src, src->id, target_id, 0,0, skill_id, skill_lv, skill_get_ele(skill_id, skill_lv), casttime);
@ -2214,7 +2216,9 @@ int unit_skilluse_pos2( struct block_list *src, short skill_x, short skill_y, ui
unit_stop_walking(src,1); unit_stop_walking(src,1);
// SC_MAGICPOWER needs to switch states at start of cast // SC_MAGICPOWER needs to switch states at start of cast
#ifndef RENEWAL
skill_toggle_magicpower(src, skill_id); skill_toggle_magicpower(src, skill_id);
#endif
// In official this is triggered even if no cast time. // In official this is triggered even if no cast time.
clif_skillcasting(src, src->id, 0, skill_x, skill_y, skill_id, skill_lv, skill_get_ele(skill_id, skill_lv), casttime); clif_skillcasting(src, src->id, 0, skill_x, skill_y, skill_id, skill_lv, skill_get_ele(skill_id, skill_lv), casttime);
@ -3515,6 +3519,10 @@ int unit_free(struct block_list *bl, clr_type clrtype)
if( sd ) if( sd )
sd->status.hom_id = 0; sd->status.hom_id = 0;
#ifdef RENEWAL
status_change_end(&sd->bl, status_skill2sc(AM_CALLHOMUN), INVALID_TIMER);
#endif
} }
if( sd ) if( sd )