From ba1a1aec48d0e2bd6b0247f4bd66a15391162794 Mon Sep 17 00:00:00 2001 From: aleos89 Date: Fri, 22 May 2015 10:08:16 -0400 Subject: [PATCH] Bug Fixes * Translated the Kagerou/Oboro skill names in the skill_db. * Added Critical Food type for newer items. * Water Barrier should only reduce Weapon ATK and Flee. * Illusion - Bewitch should not be able to move MVPs. * Spider Web will no longer be deleted when the target escapes from it. (bugreport:1358) * Adjusted Absorb Spirits to work in duels. (bugreport:4085) * Clementia, Canto Candidus, and Praefatio will now cast on the party even if someone is wearing a Holy-type armor. (bugreport:6835) * Masquerade - Gloomy will now remove a Homunculus who have less than 80% HP. (bugreport:8886) * Players under the effect of Illusion - Shock will now be able to move and attack. (bugreport:8903) * Deadly Infection should only pass Guillotine Cross poisons through the Shadow Chaser's attacks only. (bugreport:8968) * Unlimit now gives the proper statuses when reducing DEF and MDEF. (bugreport:9181) * Water Screen will now heal 1,000 HP every 10 seconds. (bugreport:9184) * Tinder Breaker will now properly lock targets. (bugreport:9202) * Corrected Weapon Blocking SP drain timer from every 3 seconds to 5 seconds. Moved Combo timer to skill_cast_db. (bugreport:9203) * Players under the influence of Kaite will receive a flat 400% more damage from melee attacks (renewal only). (bugreport:9231) * Release will now check the preserved skill's SP requirement before releasing. (bugreport:9333) * Fixes #417 - Charge Attack has a range of 14 cells and can do up to 500% damage. * Fixes #419 - Magnum Break should not hit hidden targets. * Fixes #421 - Tension Relax should only increase healing at 1x rate when overweight and 3x when not overweight. Also corrected icon getting removed after a few seconds while sitting. * Fixes #427 - Auto Guard will force a player to stand when being targeted to avoid client desync. * Fixes #436 - Corrected Super Novice Spirit not allowing any headgear to be equipped. * Fixes #438 - Soul Linker's Rebirth Spirit should have a fixed cast of 1 second. --- db/pre-re/skill_cast_db.txt | 2 +- db/pre-re/skill_db.txt | 60 +++++++++--------- db/re/item_db.txt | 2 +- db/re/skill_cast_db.txt | 4 +- db/re/skill_db.txt | 60 +++++++++--------- src/map/battle.c | 41 ++++++++---- src/map/pc.c | 2 +- src/map/skill.c | 49 +++++--------- src/map/status.c | 123 +++++++++++++++++++++--------------- src/map/status.h | 4 +- 10 files changed, 186 insertions(+), 161 deletions(-) diff --git a/db/pre-re/skill_cast_db.txt b/db/pre-re/skill_cast_db.txt index 7cf18d43ed..69eba633b2 100644 --- a/db/pre-re/skill_cast_db.txt +++ b/db/pre-re/skill_cast_db.txt @@ -1117,7 +1117,7 @@ //-- GC_POISONINGWEAPON 2027,0,1000,0,60000:120000:180000:240000:300000,300000,0 //-- GC_WEAPONBLOCKING -2028,0,2000,0,180000,0,0 +2028,0,2000,0,180000,2000,0 //-- GC_COUNTERSLASH 2029,0,2000,0,0,0,0 //-- GC_WEAPONCRUSH diff --git a/db/pre-re/skill_db.txt b/db/pre-re/skill_db.txt index a866d93771..987dd99557 100644 --- a/db/pre-re/skill_db.txt +++ b/db/pre-re/skill_db.txt @@ -865,7 +865,7 @@ //**** // 2nd Quest Skills -1001,9,6,1,-1,0,0,1,1,no,0,0x1,0,weapon,0,0x0, KN_CHARGEATK,Charge Attack +1001,14,6,1,-1,0,0,1,1,no,0,0x1,0,weapon,0,0x0, KN_CHARGEATK,Charge Attack 1002,0,6,4,0,0x1,0,1,0,no,0,0x1,0,weapon,2,0x0, CR_SHRINK,Shrink 1003,0,0,0,0,0,0,1,0,no,0,0x1,0,weapon,0,0x0, AS_SONICACCEL,Sonic Acceleration 1004,9,8,1,0,0x8,0,1,1,no,0,0x1,0,weapon,0,0x0, AS_VENOMKNIFE,Throw Venom Knife @@ -969,11 +969,11 @@ 2038,11,8,1,6,0x2,1,5,-3,yes,0,0,0,magic,0,0x0, AB_JUDEX,Judex 2039,0,6,4,0,0x1,0,1,1,yes,0,0,0,magic,0,0x0, AB_ANCILLA,Ancilla 2040,11,8,1,6,0,0,10,-10,yes,0,0,0,magic,0,0x0, AB_ADORAMUS,Adoramus -2041,0,6,4,6,0x3,3:7:15,3,1,yes,0,0,0,magic,0,0x0, AB_CLEMENTIA,Crementia -2042,0,6,4,6,0x3,3:7:15,3,1,yes,0,0,0,magic,0,0x0, AB_CANTO,Canto Candidus +2041,0,6,4,0,0x3,3:7:15,3,1,yes,0,0,0,magic,0,0x0, AB_CLEMENTIA,Crementia +2042,0,6,4,0,0x3,3:7:15,3,1,yes,0,0,0,magic,0,0x0, AB_CANTO,Canto Candidus 2043,0,6,4,6,0x3,3:7:15,3,1,yes,0,0,0,magic,0,0x0, AB_CHEAL,Coluceo Heal 2044,11,6,2,6,0x1,0,5,1,yes,0,0,1,magic,0,0x0, AB_EPICLESIS,Epiclesis -2045,0,6,4,6,0x3,15,10,1,yes,0,0,0,magic,0,0x0, AB_PRAEFATIO,Praefatio +2045,0,6,4,0,0x3,15,10,1,yes,0,0,0,magic,0,0x0, AB_PRAEFATIO,Praefatio 2046,0,6,4,6,0x3,15,10,1,yes,0,0,0,magic,0,0x0, AB_ORATIO,Oratio 2047,0,6,4,6,0x3,15,4,1,yes,0,0,0,magic,0,0x0, AB_LAUDAAGNUS,Lauda Agnus 2048,0,6,4,6,0x3,15,4,1,yes,0,0,0,magic,0,0x0, AB_LAUDARAMUS,Lauda Ramus @@ -1263,35 +1263,35 @@ //**** // Kagerou & Oboro -3001,0,6,4,0,0,0,1,1,no,0,0,0,none,0,0x4, KO_YAMIKUMO,Yamikumo +3001,0,6,4,0,0,0,1,1,no,0,0,0,none,0,0x4, KO_YAMIKUMO,Shadow Hiding 3002,0,0,0,0,0,0,5,0,no,0,0,0,weapon,0,0x0, KO_RIGHT,Right Hand Mastery 3003,0,0,0,0,0,0,5,0,no,0,0,0,weapon,0,0x0, KO_LEFT,Left Hand Mastery -3004,3:4:5:6:7,8,1,-1,0,0,5,-2,no,0,0,0,weapon,0,0x0, KO_JYUMONJIKIRI,Cross Strike -3005,2,6,1,-1,0,0,5,1,no,0,0,0,weapon,0,0x0, KO_SETSUDAN,Soul Sever -3006,7:8:9:10:11,6,2,-1,0x42,2,5,1,no,0,0,0,weapon,0,0x0, KO_BAKURETSU,Bakuretsu Kunai -3007,5,6,4,-1,0x42,4:4:4:4:5,5,1,no,0,0,0,weapon,0,0x0, KO_HAPPOKUNAI,Happo Kunai -3008,11,8,2,0,0x56,1:1:1:1:1:1:1:1:1:2,10,-10,no,0,0,0,misc,0,0x0, KO_MUCHANAGE,Mucha Nage -3009,9:10:11:12:13,8,2,-1,0x2,3,5,2,no,0,0,0,weapon,0,0x0, KO_HUUMARANKA,Huuma Shuriken Ranka +3004,3:4:5:6:7,8,1,-1,0,0,5,-2,no,0,0,0,weapon,0,0x0, KO_JYUMONJIKIRI,Cross Slash +3005,2,6,1,-1,0,0,5,1,no,0,0,0,weapon,0,0x0, KO_SETSUDAN,Soul Cutter +3006,7:8:9:10:11,6,2,-1,0x42,2,5,1,no,0,0,0,weapon,0,0x0, KO_BAKURETSU,Kunai Explosion +3007,0,6,4,-1,0x42,4:4:4:4:5,5,1,no,0,0,0,weapon,0,0x0, KO_HAPPOKUNAI,Kunai Splash +3008,11,8,2,0,0x56,1:1:1:1:1:1:1:1:1:2,10,-10,no,0,0,0,misc,0,0x0, KO_MUCHANAGE,Rapid Throw +3009,9:10:11:12:13,8,2,-1,0x2,3,5,2,no,0,0,0,weapon,0,0x0, KO_HUUMARANKA,Swirling Petal 3010,3,6,4,0,0x52,0,5,1,no,0,0x80,0,weapon,0,0x10, KO_MAKIBISHI,Makibishi -3011,0,6,4,0,0x1,0,5,0,yes,0,0,0,none,0,0x0, KO_MEIKYOUSISUI,Meikyo Shisui -3012,0,6,4,0,0x1,0,5,0,no,0,0,1,none,3:4:5:6:7,0x0, KO_ZANZOU,Zanzou -3013,5,6,1,0,0x1,0,5,0,no,0,0,0,none,0,0x0, KO_KYOUGAKU,Kyougaku -3014,5,6,1,0,0x1,0,5,0,no,0,0,0,none,0,0x0, KO_JYUSATSU,Jyusatsu -3015,0,6,4,3,0x1,0,1,1,no,0,0,0,none,0,0x0, KO_KAHU_ENTEN,Kahu Enten -3016,0,6,4,1,0x1,0,1,1,no,0,0,0,none,0,0x0, KO_HYOUHU_HUBUKI,Hyouhu Hubuki -3017,0,6,4,4,0x1,0,1,1,no,0,0,0,none,0,0x0, KO_KAZEHU_SEIRAN,Kazehu Seiran -3018,0,6,4,2,0x1,0,1,1,no,0,0,0,none,0,0x0, KO_DOHU_KOUKAI,Dohu Koukai -3019,11,6,1,0,0,0,1,1,no,0,0,0,magic,0,0x0, KO_KAIHOU,Technique Kaihou -3020,7,6,2,0,0,0,1,1,yes,0,0,0,magic,0,0x0, KO_ZENKAI,Zenkai -3021,5:6:7:8:9,6,16,0,0x1,0,5,1,no,0,0,0,none,0,0x0, KO_GENWAKU,Genwaku -3022,0,6,4,0,0x1,0,5,0,no,0,0,0,none,0,0x0, KO_IZAYOI,Izayoi -3023,0,6,4,0,0x3,2:3:4:5:6,5,0,no,0,0,0,none,0,0x0, KG_KAGEHUMI,Kagehumi -3024,7,6,1,0,0x1,0,5,1,no,0,0,0,none,0,0x0, KG_KYOMU,Kyomu -3025,7,6,16,0,0x1,0,5,1,no,0,0,0,none,0,0x0, KG_KAGEMUSYA,Kagemusha -3026,7,6,16,0,0x1,0,5,1,no,0,0,0,none,0,0x0, OB_ZANGETSU,Zangetsu -3027,7,6,16,0,0x1,0,5,1,no,0,0,0,none,0,0x0, OB_OBOROGENSOU,Oboro Gensou -3028,1,6,4,0,0x2,3,1,1,no,0,0,0,weapon,0,0x0, OB_OBOROGENSOU_TRANSITION_ATK,Hazy Moonlight Illusion Transition Attack -3029,7,6,1,0,0x1,0,5,0,no,0,0,0,none,0,0x0, OB_AKAITSUKI,Akaitsuki +3011,0,6,4,0,0x1,0,5,0,yes,0,0,0,none,0,0x0, KO_MEIKYOUSISUI,Pure Soul +3012,0,6,4,0,0x1,0,5,0,no,0,0,1,none,3:4:5:6:7,0x0, KO_ZANZOU,Illusion - Shadow +3013,5,6,1,0,0x1,0,5,0,no,0,0,0,none,0,0x0, KO_KYOUGAKU,Illusion - Shock +3014,5,6,1,0,0x1,0,5,0,no,0,0,0,none,0,0x0, KO_JYUSATSU,Illusion - Death +3015,0,6,4,3,0x1,0,1,1,no,0,0,0,none,0,0x0, KO_KAHU_ENTEN,Fire Charm +3016,0,6,4,1,0x1,0,1,1,no,0,0,0,none,0,0x0, KO_HYOUHU_HUBUKI,Ice Charm +3017,0,6,4,4,0x1,0,1,1,no,0,0,0,none,0,0x0, KO_KAZEHU_SEIRAN,Wind Charm +3018,0,6,4,2,0x1,0,1,1,no,0,0,0,none,0,0x0, KO_DOHU_KOUKAI,Earth Charm +3019,11,6,1,0,0,0,1,1,no,0,0,0,magic,0,0x0, KO_KAIHOU,Release Ninja Spell +3020,7,6,2,0,0,0,1,1,yes,0,0,0,magic,0,0x0, KO_ZENKAI,Cast Ninja Spell +3021,5:6:7:8:9,6,16,0,0x1,0,5,1,no,0,0,0,none,0,0x0, KO_GENWAKU,Illusion - Bewitch +3022,0,6,4,0,0x1,0,5,0,no,0,0,0,none,0,0x0, KO_IZAYOI,16th Night +3023,0,6,4,0,0x3,2:3:4:5:6,5,0,no,0,0,0,none,0,0x0, KG_KAGEHUMI,Shadow Trampling +3024,7,6,1,0,0x1,0,5,1,no,0,0,0,none,0,0x0, KG_KYOMU,Empty Shadow +3025,7,6,16,0,0x1,0,5,1,no,0,0,0,none,0,0x0, KG_KAGEMUSYA,Shadow Warrior +3026,7,6,16,0,0x1,0,5,1,no,0,0,0,none,0,0x0, OB_ZANGETSU,Distorted Crescent +3027,7,6,16,0,0x1,0,5,1,no,0,0,0,none,0,0x0, OB_OBOROGENSOU,Moonlight Fantasy +3028,1,6,4,0,0x2,3,1,1,no,0,0,0,weapon,0,0x0, OB_OBOROGENSOU_TRANSITION_ATK,Moonlight Fantasy Transition Attack +3029,7,6,1,0,0x1,0,5,0,no,0,0,0,none,0,0x0, OB_AKAITSUKI,Ominous Moonlight //**** // Eclage Skills diff --git a/db/re/item_db.txt b/db/re/item_db.txt index d3528e2a05..ef344c0483 100644 --- a/db/re/item_db.txt +++ b/db/re/item_db.txt @@ -8126,7 +8126,7 @@ 14618,AGI_Biscuit_Stick,Bar Cookie Of Agility,18,1,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ sc_start SC_AGIFOOD,1800000,15; sc_start SC_FLEEFOOD,600000,rand(11,33); },{},{} 14619,INT_Biscuit_Stick,Bar Cookie Of Intelligence,18,1,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ sc_start SC_INTFOOD,1800000,15; sc_start SC_INCMATKRATE,600000,rand(11,111); },{},{} 14620,DEX_Biscuit_Stick,Bar Cookie Of Dexterity,18,1,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ sc_start SC_DEXFOOD,1800000,15; sc_start SC_HITFOOD,600000,rand(11,33); },{},{} -14621,LUK_Biscuit_Stick,Bar Cookie Of Lucky,18,1,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ sc_start SC_LUKFOOD,1800000,15; sc_start SC_INCCRI,600000,rand(11,33); },{},{} +14621,LUK_Biscuit_Stick,Bar Cookie Of Lucky,18,1,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ sc_start SC_LUKFOOD,1800000,15; sc_start SC_CRIFOOD,600000,rand(11,33); },{},{} 14623,Golden_Treasure_Box,Golden Treasure Box,18,10,,10,,,,0,0xFFFFFFFF,63,2,,,,,,{ /*Items*/ },{},{} 14624,Blue_Scroll,Blue Scroll,2,20,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ getgroupitem(IG_Blue_Scroll); },{},{} 14626,Indigo_Scroll,Indigo Scroll,2,20,,0,,,,,0xFFFFFFFF,63,2,,,,,,{ getgroupitem(IG_Indigo_Scroll); },{},{} diff --git a/db/re/skill_cast_db.txt b/db/re/skill_cast_db.txt index f68851e1a3..7bcdbaeabb 100644 --- a/db/re/skill_cast_db.txt +++ b/db/re/skill_cast_db.txt @@ -818,7 +818,7 @@ 493,0,0,0,0,0,0,1000 //-- SL_HIGH -494,0,0,0,150000:200000:250000:300000:350000,0,0,0 +494,0,0,0,150000:200000:250000:300000:350000,0,0,1000 //-- KN_ONEHAND 495,0,0,0,300000,0,0,0 @@ -1125,7 +1125,7 @@ //-- GC_POISONINGWEAPON 2027,0,1000,0,60000:120000:180000:240000:300000,300000,0,-1 //-- GC_WEAPONBLOCKING -2028,0,2000,0,180000,0,0,-1 +2028,0,2000,0,180000,2000,0,-1 //-- GC_COUNTERSLASH 2029,0,2000,0,0,0,0,-1 //-- GC_WEAPONCRUSH diff --git a/db/re/skill_db.txt b/db/re/skill_db.txt index ca4bb1bc3c..e7e16a3971 100644 --- a/db/re/skill_db.txt +++ b/db/re/skill_db.txt @@ -865,7 +865,7 @@ //**** // 2nd Quest Skills -1001,9,6,1,-1,0,0,1,1,no,0,0x1,0,weapon,0,0x0, KN_CHARGEATK,Charge Attack +1001,14,6,1,-1,0,0,1,1,no,0,0x1,0,weapon,0,0x0, KN_CHARGEATK,Charge Attack 1002,0,6,4,0,0x1,0,1,0,no,0,0x1,0,weapon,2,0x0, CR_SHRINK,Shrink 1003,0,0,0,0,0,0,1,0,no,0,0x1,0,weapon,0,0x0, AS_SONICACCEL,Sonic Acceleration 1004,9,8,1,0,0x8,0,1,1,no,0,0x1,0,weapon,0,0x0, AS_VENOMKNIFE,Throw Venom Knife @@ -969,11 +969,11 @@ 2038,11,8,1,6,0x2,1,5,-3,yes,0,0,0,magic,0,0x0, AB_JUDEX,Judex 2039,0,6,4,0,0x1,0,1,1,yes,0,0,0,magic,0,0x0, AB_ANCILLA,Ancilla 2040,11,8,1,6,0,0,10,-10,yes,0,0,0,magic,0,0x0, AB_ADORAMUS,Adoramus -2041,0,6,4,6,0x3,3:7:15,3,1,yes,0,0,0,magic,0,0x0, AB_CLEMENTIA,Crementia -2042,0,6,4,6,0x3,3:7:15,3,1,yes,0,0,0,magic,0,0x0, AB_CANTO,Canto Candidus +2041,0,6,4,0,0x3,3:7:15,3,1,yes,0,0,0,magic,0,0x0, AB_CLEMENTIA,Crementia +2042,0,6,4,0,0x3,3:7:15,3,1,yes,0,0,0,magic,0,0x0, AB_CANTO,Canto Candidus 2043,0,6,4,6,0x3,3:7:15,3,1,yes,0,0,0,magic,0,0x0, AB_CHEAL,Coluceo Heal 2044,11,6,2,6,0x1,0,5,1,yes,0,0,1,magic,0,0x0, AB_EPICLESIS,Epiclesis -2045,0,6,4,6,0x3,15,10,1,yes,0,0,0,magic,0,0x0, AB_PRAEFATIO,Praefatio +2045,0,6,4,0,0x3,15,10,1,yes,0,0,0,magic,0,0x0, AB_PRAEFATIO,Praefatio 2046,0,6,4,6,0x3,15,10,1,yes,0,0,0,magic,0,0x0, AB_ORATIO,Oratio 2047,0,6,4,6,0x3,15,4,1,yes,0,0,0,magic,0,0x0, AB_LAUDAAGNUS,Lauda Agnus 2048,0,6,4,6,0x3,15,4,1,yes,0,0,0,magic,0,0x0, AB_LAUDARAMUS,Lauda Ramus @@ -1266,35 +1266,35 @@ //**** // Kagerou & Oboro -3001,0,6,4,0,0,0,1,1,no,0,0,0,none,0,0x4, KO_YAMIKUMO,Yamikumo +3001,0,6,4,0,0,0,1,1,no,0,0,0,none,0,0x4, KO_YAMIKUMO,Shadow Hiding 3002,0,0,0,0,0,0,5,0,no,0,0,0,weapon,0,0x0, KO_RIGHT,Right Hand Mastery 3003,0,0,0,0,0,0,5,0,no,0,0,0,weapon,0,0x0, KO_LEFT,Left Hand Mastery -3004,3:4:5:6:7,8,1,-1,0,0,5,-2,no,0,0,0,weapon,0,0x0, KO_JYUMONJIKIRI,Cross Strike -3005,2,6,1,-1,0,0,5,1,no,0,0,0,weapon,0,0x0, KO_SETSUDAN,Soul Sever -3006,7:8:9:10:11,6,2,-1,0x42,2,5,1,no,0,0,0,weapon,0,0x0, KO_BAKURETSU,Bakuretsu Kunai -3007,0,6,4,-1,0x42,4:4:4:4:5,5,1,no,0,0,0,weapon,0,0x0, KO_HAPPOKUNAI,Happo Kunai -3008,11,8,2,0,0x56,1:1:1:1:1:1:1:1:1:2,10,-10,no,0,0,0,misc,0,0x0, KO_MUCHANAGE,Mucha Nage -3009,9:10:11:12:13,8,2,-1,0x2,3,5,2,no,0,0,0,weapon,0,0x0, KO_HUUMARANKA,Huuma Shuriken Ranka +3004,3:4:5:6:7,8,1,-1,0,0,5,-2,no,0,0,0,weapon,0,0x0, KO_JYUMONJIKIRI,Cross Slash +3005,2,6,1,-1,0,0,5,1,no,0,0,0,weapon,0,0x0, KO_SETSUDAN,Soul Cutter +3006,7:8:9:10:11,6,2,-1,0x42,2,5,1,no,0,0,0,weapon,0,0x0, KO_BAKURETSU,Kunai Explosion +3007,0,6,4,-1,0x42,4:4:4:4:5,5,1,no,0,0,0,weapon,0,0x0, KO_HAPPOKUNAI,Kunai Splash +3008,11,8,2,0,0x56,1:1:1:1:1:1:1:1:1:2,10,-10,no,0,0,0,misc,0,0x0, KO_MUCHANAGE,Rapid Throw +3009,9:10:11:12:13,8,2,-1,0x2,3,5,2,no,0,0,0,weapon,0,0x0, KO_HUUMARANKA,Swirling Petal 3010,3,6,4,0,0x52,0,5,1,no,0,0x80,0,weapon,0,0x10, KO_MAKIBISHI,Makibishi -3011,0,6,4,0,0x1,0,5,0,yes,0,0,0,none,0,0x0, KO_MEIKYOUSISUI,Meikyo Shisui -3012,0,6,4,0,0x1,0,5,0,no,0,0,1,none,3:4:5:6:7,0x0, KO_ZANZOU,Zanzou -3013,5,6,1,0,0x1,0,5,0,no,0,0,0,none,0,0x0, KO_KYOUGAKU,Kyougaku -3014,5,6,1,0,0x1,0,5,0,no,0,0,0,none,0,0x0, KO_JYUSATSU,Jyusatsu -3015,0,6,4,3,0x1,0,1,1,no,0,0,0,none,0,0x0, KO_KAHU_ENTEN,Kahu Enten -3016,0,6,4,1,0x1,0,1,1,no,0,0,0,none,0,0x0, KO_HYOUHU_HUBUKI,Hyouhu Hubuki -3017,0,6,4,4,0x1,0,1,1,no,0,0,0,none,0,0x0, KO_KAZEHU_SEIRAN,Kazehu Seiran -3018,0,6,4,2,0x1,0,1,1,no,0,0,0,none,0,0x0, KO_DOHU_KOUKAI,Dohu Koukai -3019,11,6,1,0,0,0,1,1,no,0,0,0,magic,0,0x0, KO_KAIHOU,Technique Kaihou -3020,7,6,2,0,0,0,1,1,yes,0,0,0,magic,0,0x0, KO_ZENKAI,Zenkai -3021,5:6:7:8:9,6,16,0,0x1,0,5,1,no,0,0,0,none,0,0x0, KO_GENWAKU,Genwaku -3022,0,6,4,0,0x1,0,5,0,no,0,0,0,none,0,0x0, KO_IZAYOI,Izayoi -3023,0,6,4,0,0x3,2:3:4:5:6,5,0,no,0,0,0,none,0,0x0, KG_KAGEHUMI,Kagehumi -3024,7,6,1,0,0x1,0,5,1,no,0,0,0,none,0,0x0, KG_KYOMU,Kyomu -3025,7,6,16,0,0x1,0,5,1,no,0,0,0,none,0,0x0, KG_KAGEMUSYA,Kagemusha -3026,7,6,16,0,0x1,0,5,1,no,0,0,0,none,0,0x0, OB_ZANGETSU,Zangetsu -3027,7,6,16,0,0x1,0,5,1,no,0,0,0,none,0,0x0, OB_OBOROGENSOU,Oboro Gensou -3028,1,6,4,0,0x2,3,1,1,no,0,0,0,weapon,0,0x0, OB_OBOROGENSOU_TRANSITION_ATK,Hazy Moonlight Illusion Transition Attack -3029,7,6,1,0,0x1,0,5,0,no,0,0,0,none,0,0x0, OB_AKAITSUKI,Akaitsuki +3011,0,6,4,0,0x1,0,5,0,yes,0,0,0,none,0,0x0, KO_MEIKYOUSISUI,Pure Soul +3012,0,6,4,0,0x1,0,5,0,no,0,0,1,none,3:4:5:6:7,0x0, KO_ZANZOU,Illusion - Shadow +3013,5,6,1,0,0x1,0,5,0,no,0,0,0,none,0,0x0, KO_KYOUGAKU,Illusion - Shock +3014,5,6,1,0,0x1,0,5,0,no,0,0,0,none,0,0x0, KO_JYUSATSU,Illusion - Death +3015,0,6,4,3,0x1,0,1,1,no,0,0,0,none,0,0x0, KO_KAHU_ENTEN,Fire Charm +3016,0,6,4,1,0x1,0,1,1,no,0,0,0,none,0,0x0, KO_HYOUHU_HUBUKI,Ice Charm +3017,0,6,4,4,0x1,0,1,1,no,0,0,0,none,0,0x0, KO_KAZEHU_SEIRAN,Wind Charm +3018,0,6,4,2,0x1,0,1,1,no,0,0,0,none,0,0x0, KO_DOHU_KOUKAI,Earth Charm +3019,11,6,1,0,0,0,1,1,no,0,0,0,magic,0,0x0, KO_KAIHOU,Release Ninja Spell +3020,7,6,2,0,0,0,1,1,yes,0,0,0,magic,0,0x0, KO_ZENKAI,Cast Ninja Spell +3021,5:6:7:8:9,6,16,0,0x1,0,5,1,no,0,0,0,none,0,0x0, KO_GENWAKU,Illusion - Bewitch +3022,0,6,4,0,0x1,0,5,0,no,0,0,0,none,0,0x0, KO_IZAYOI,16th Night +3023,0,6,4,0,0x3,2:3:4:5:6,5,0,no,0,0,0,none,0,0x0, KG_KAGEHUMI,Shadow Trampling +3024,7,6,1,0,0x1,0,5,1,no,0,0,0,none,0,0x0, KG_KYOMU,Empty Shadow +3025,7,6,16,0,0x1,0,5,1,no,0,0,0,none,0,0x0, KG_KAGEMUSYA,Shadow Warrior +3026,7,6,16,0,0x1,0,5,1,no,0,0,0,none,0,0x0, OB_ZANGETSU,Distorted Crescent +3027,7,6,16,0,0x1,0,5,1,no,0,0,0,none,0,0x0, OB_OBOROGENSOU,Moonlight Fantasy +3028,1,6,4,0,0x2,3,1,1,no,0,0,0,weapon,0,0x0, OB_OBOROGENSOU_TRANSITION_ATK,Moonlight Fantasy Transition Attack +3029,7,6,1,0,0x1,0,5,0,no,0,0,0,none,0,0x0, OB_AKAITSUKI,Ominous Moonlight //**** // Eclage Skills diff --git a/src/map/battle.c b/src/map/battle.c index ecb15fc264..37b9956e50 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -865,12 +865,12 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam if( sc->data[SC_SAFETYWALL] && (flag&(BF_SHORT|BF_MAGIC))==BF_SHORT ) { struct skill_unit_group* group = skill_id2group(sc->data[SC_SAFETYWALL]->val3); uint16 skill_id_val = sc->data[SC_SAFETYWALL]->val2; - if (group) { - d->dmg_lv = ATK_BLOCK; + if (group) { if (skill_id_val == MH_STEINWAND) { if (--group->val2 <= 0) skill_delunitgroup(group); + d->dmg_lv = ATK_BLOCK; if( (group->val3 - damage) > 0 ) group->val3 -= (int)cap_value(damage, INT_MIN, INT_MAX); else @@ -878,6 +878,7 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam return 0; } //in RE, SW possesses a lifetime equal to group val2, (3x caster hp, or homon formula) + d->dmg_lv = ATK_BLOCK; #ifdef RENEWAL if ( ( group->val2 - damage) > 0 ) { group->val2 -= (int)cap_value(damage, INT_MIN, INT_MAX); @@ -908,12 +909,14 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam skill_blown(src,bl,skill_get_blewcount(skill_id,skill_lv),-1,0); return 0; } + if( sc->data[SC_WEAPONBLOCKING] && flag&(BF_SHORT|BF_WEAPON) && rnd()%100 < sc->data[SC_WEAPONBLOCKING]->val2 ) { - clif_skill_nodamage(bl,src,GC_WEAPONBLOCKING,1,1); + clif_skill_nodamage(bl,src,GC_WEAPONBLOCKING,sc->data[SC_WEAPONBLOCKING]->val1,1); + sc_start2(src,bl,SC_COMBO,100,GC_WEAPONBLOCKING,src->id,skill_get_time2(GC_WEAPONBLOCKING,sc->data[SC_WEAPONBLOCKING]->val1)); d->dmg_lv = ATK_BLOCK; - sc_start2(src,bl,SC_COMBO,100,GC_WEAPONBLOCKING,src->id,2000); return 0; } + if( (sce = sc->data[SC_AUTOGUARD]) && flag&BF_WEAPON && !(skill_get_nk(skill_id)&NK_NO_CARDFIX_ATK) && rnd()%100 < sce->val2 ) { int delay; struct status_change_entry *sce_d = sc->data[SC_DEVOTION]; @@ -926,6 +929,8 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam delay = 200; else delay = 100; + if (sd && pc_issit(sd)) + pc_setstand(sd, true); if( sce_d && (d_bl = map_id2bl(sce_d->val1)) && ((d_bl->type == BL_MER && ((TBL_MER*)d_bl)->master && ((TBL_MER*)d_bl)->master->bl.id == bl->id) || (d_bl->type == BL_PC && ((TBL_PC*)d_bl)->devotion[sce_d->val2] == bl->id)) && @@ -1002,6 +1007,11 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam return 0; } +#ifdef RENEWAL // Flat +400% damage from melee + if (sc->data[SC_KAITE] && (flag&(BF_SHORT|BF_MAGIC)) == BF_SHORT) + damage <<= 2; +#endif + if( flag&BF_MAGIC && (sce=sc->data[SC_PRESTIGE]) && rnd()%100 < sce->val2) { clif_specialeffect(bl, 462, AREA); // Still need confirm it. return 0; @@ -1269,7 +1279,7 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam } if( sc->data[SC__DEADLYINFECT] && (flag&(BF_SHORT|BF_MAGIC)) == BF_SHORT && damage > 0 && rnd()%100 < 30 + 10 * sc->data[SC__DEADLYINFECT]->val1 ) - status_change_spread(bl, src); // Deadly infect attacked side + status_change_spread(bl, src, 1); // Deadly infect attacked side } //End of target SC_ check @@ -1316,7 +1326,7 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam sc_start(src,bl,(enum sc_type)sc->data[SC_POISONINGWEAPON]->val2,100,sc->data[SC_POISONINGWEAPON]->val1,skill_get_time2(GC_POISONINGWEAPON, 1)); if( sc->data[SC__DEADLYINFECT] && (flag&(BF_SHORT|BF_MAGIC)) == BF_SHORT && damage > 0 && rnd()%100 < 30 + 10 * sc->data[SC__DEADLYINFECT]->val1 ) - status_change_spread(src, bl); + status_change_spread(src, bl, 0); if (sc->data[SC_STYLE_CHANGE] && sc->data[SC_STYLE_CHANGE]->val1 == MH_MD_FIGHTING) { TBL_HOM *hd = BL_CAST(BL_HOM,src); //when attacking @@ -3509,10 +3519,19 @@ static int battle_calc_attack_skill_ratio(struct Damage wd, struct block_list *s case NJ_KUNAI: skillratio += 200; break; - case KN_CHARGEATK: - { - int k = (wd.miscflag-1)/3; //+100% every 3 cells of distance - if( k > 2 ) k = 2; // ...but hard-limited to 300%. + case KN_CHARGEATK: { // +100% every 3 cells of distance but hard-limited to 500% + unsigned int k = wd.miscflag / 3; + + if (k < 2) + k = 0; + else if (k > 1 && k < 3) + k = 1; + else if (k > 2 && k < 4) + k = 2; + else if (k > 3 && k < 5) + k = 3; + else + k = 4; skillratio += 100 * k; } break; @@ -7225,7 +7244,7 @@ int battle_check_target( struct block_list *src, struct block_list *target,int f return 0; if(((md->special_state.ai == AI_SPHERE || //Marine Spheres (md->special_state.ai == AI_FLORA && battle_config.summon_flora&1)) && s_bl->type == BL_PC && src->type != BL_MOB) || //Floras - (md->special_state.ai == AI_ZANZOU && t_bl->id != s_bl->id) || //Zanzoe + (md->special_state.ai == AI_ZANZOU && t_bl->id != s_bl->id) || //Zanzou (md->special_state.ai == AI_FAW && (t_bl->id != s_bl->id || (s_bl->type == BL_PC && src->type != BL_MOB))) ){ //Targettable by players state |= BCT_ENEMY; diff --git a/src/map/pc.c b/src/map/pc.c index de8f2f5857..674f161ce0 100755 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -1037,7 +1037,7 @@ uint8 pc_isequip(struct map_session_data *sd,int n) if (sd->sc.data[SC_SPIRIT] && sd->sc.data[SC_SPIRIT]->val2 == SL_SUPERNOVICE) { //Spirit of Super Novice equip bonuses. [Skotlex] if (sd->status.base_level > 90 && item->equip & EQP_HELM) - return ITEM_EQUIP_ACK_FAIL; //Can equip all helms + return ITEM_EQUIP_ACK_OK; //Can equip all helms if (sd->status.base_level > 96 && item->equip & EQP_ARMS && item->type == IT_WEAPON && item->wlv == 4) switch(item->look) { //In weapons, the look determines type of weapon. diff --git a/src/map/skill.c b/src/map/skill.c index 26a130085f..b0da0ad2a6 100755 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -1650,8 +1650,8 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1 case SC_STRFOOD: case SC_AGIFOOD: case SC_VITFOOD: case SC_INTFOOD: case SC_DEXFOOD: case SC_LUKFOOD: case SC_HITFOOD: case SC_FLEEFOOD: case SC_BATKFOOD: - case SC_WATKFOOD: case SC_MATKFOOD: case SC_DANCING: - case SC_SPIRIT: case SC_AUTOBERSERK: + case SC_WATKFOOD: case SC_MATKFOOD: case SC_CRIFOOD: + case SC_DANCING: case SC_SPIRIT: case SC_AUTOBERSERK: case SC_CARTBOOST: case SC_MELTDOWN: case SC_SAFETYWALL: case SC_SMA: case SC_SPEEDUP0: case SC_NOCHAT: case SC_ANKLE: case SC_SPIDERWEB: case SC_JAILED: @@ -4289,12 +4289,12 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint uint8 dir = map_calc_dir(bl, src->x, src->y); // teleport to target (if not on WoE grounds) - if( !map_flag_gvg(src->m) && !map[src->m].flag.battleground && unit_movepos(src, bl->x, bl->y, 0, 1) ) + if (!map_flag_gvg(src->m) && !map[src->m].flag.battleground && unit_movepos(src, bl->x, bl->y, 0, 1)) clif_blown(src); // cause damage and knockback if the path to target was a straight one - if( path ) - { + if (path) { + dist = cap_value(dist, 0, 9); skill_attack(BF_WEAPON, src, src, bl, skill_id, skill_lv, tick, dist); skill_blown(src, bl, dist, dir, 0); //HACK: since knockback officially defaults to the left, the client also turns to the left... therefore, @@ -4536,7 +4536,8 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint case MS_MAGNUM: if( flag&1 ) { //Damage depends on distance, so add it to flag if it is > 1 - skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, flag|distance_bl(src, bl)); + // Cannot hit hidden targets + skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, flag|SD_ANIMATION|distance_bl(src, bl)); } break; @@ -5059,6 +5060,8 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint if( !skill_check_condition_castbegin(sd, pres_skill_id, pres_skill_lv) ) break; + // Get the requirement for the preserved skill + skill_consume_requirement(sd, pres_skill_id, pres_skill_lv, 1); // SC_MAGICPOWER needs to switch states before any damage is actually dealt skill_toggle_magicpower(src, pres_skill_id); @@ -6514,12 +6517,11 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case MO_ABSORBSPIRITS: i = 0; - if (dstsd && dstsd->spiritball && (sd == dstsd || map_flag_vs(src->m)) && ((dstsd->class_&MAPID_BASEMASK) != MAPID_GUNSLINGER || (dstsd->class_&MAPID_UPPERMASK) != MAPID_REBELLION)) - { // split the if for readability, and included gunslingers in the check so that their coins cannot be removed [Reddozen] + if (dstsd && (sd == dstsd || map_flag_vs(src->m) || (sd && sd->duel_group && sd->duel_group == dstsd->duel_group)) && + ((dstsd->class_&MAPID_BASEMASK) != MAPID_GUNSLINGER || (dstsd->class_&MAPID_UPPERMASK) != MAPID_REBELLION)) { // split the if for readability, and included gunslingers in the check so that their coins cannot be removed [Reddozen] i = dstsd->spiritball * 7; pc_delspiritball(dstsd,dstsd->spiritball,0); - } else if (dstmd && !(tstatus->mode&MD_BOSS) && rnd() % 100 < 20) - { // check if target is a monster and not a Boss, for the 20% chance to absorb 2 SP per monster's level [Reddozen] + } else if (dstmd && !(tstatus->mode&MD_BOSS) && rnd() % 100 < 20) { // check if target is a monster and not a Boss, for the 20% chance to absorb 2 SP per monster's level [Reddozen] i = 2 * dstmd->level; mob_target(dstmd,src,0); } @@ -7381,8 +7383,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case SC_STRFOOD: case SC_AGIFOOD: case SC_VITFOOD: case SC_INTFOOD: case SC_DEXFOOD: case SC_LUKFOOD: case SC_HITFOOD: case SC_FLEEFOOD: case SC_BATKFOOD: - case SC_WATKFOOD: case SC_MATKFOOD: case SC_DANCING: - case SC_EDP: case SC_AUTOBERSERK: + case SC_WATKFOOD: case SC_MATKFOOD: case SC_CRIFOOD: + case SC_DANCING: case SC_EDP: case SC_AUTOBERSERK: case SC_CARTBOOST: case SC_MELTDOWN: case SC_SAFETYWALL: case SC_SMA: case SC_SPEEDUP0: case SC_NOCHAT: case SC_ANKLE: case SC_SPIDERWEB: case SC_JAILED: @@ -8864,8 +8866,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case SC_STRFOOD: case SC_AGIFOOD: case SC_VITFOOD: case SC_INTFOOD: case SC_DEXFOOD: case SC_LUKFOOD: case SC_HITFOOD: case SC_FLEEFOOD: case SC_BATKFOOD: - case SC_WATKFOOD: case SC_MATKFOOD: case SC_DANCING: - case SC_SPIRIT: case SC_AUTOBERSERK: + case SC_WATKFOOD: case SC_MATKFOOD: case SC_CRIFOOD: + case SC_DANCING: case SC_SPIRIT: case SC_AUTOBERSERK: case SC_CARTBOOST: case SC_MELTDOWN: case SC_SAFETYWALL: case SC_SMA: case SC_SPEEDUP0: case SC_NOCHAT: case SC_ANKLE: case SC_SPIDERWEB: case SC_JAILED: @@ -10122,8 +10124,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui clif_skill_nodamage(src,src,skill_id,skill_lv,1); clif_blown(src); sc_start(src,src,SC_CONFUSION,25,skill_lv,skill_get_time(skill_id,skill_lv)); - if (unit_movepos(bl,x,y,0,0)) { - clif_skill_damage(bl,bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, -1, 6); + if (!is_boss(bl) && unit_movepos(bl,x,y,0,0)) { if( bl->type == BL_PC && pc_issit((TBL_PC*)bl)) clif_sitting(bl); //Avoid sitting sync problem clif_blown(bl); @@ -13585,16 +13586,6 @@ int skill_unit_onout(struct skill_unit *src, struct block_list *bl, unsigned int status_change_end(bl, type, INVALID_TIMER); break; - case UNT_SPIDERWEB: - { - struct block_list *target = map_id2bl(sg->val2); - if (target && target==bl) { - if (sce && sce->val3 == sg->group_id) - status_change_end(bl, type, INVALID_TIMER); - sg->limit = DIFF_TICK(tick,sg->tick)+1000; - } - break; - } case UNT_DISSONANCE: case UNT_UGLYDANCE: //Used for updating timers in song overlap instances { @@ -13971,12 +13962,6 @@ int skill_check_pc_partner(struct map_session_data *sd, uint16 skill_id, uint16 status_charge(&tsd->bl, 0, i); } break; - case WM_GREAT_ECHO: - for( i = 0; i < c; i++ ) { - if( (tsd = map_id2sd(p_sd[i])) != NULL ) - status_zap(&tsd->bl,0,skill_get_sp(skill_id,*skill_lv)/c); - } - break; default: //Warning: Assuming Ensemble skills here (for speed) if( is_chorus ) break;//Chorus skills are not to be parsed as ensambles diff --git a/src/map/status.c b/src/map/status.c index d3429df566..a3b62859a6 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -762,7 +762,7 @@ void initChangeTables(void) set_sc( EL_FIRE_CLOAK , SC_FIRE_CLOAK_OPTION , SI_FIRE_CLOAK_OPTION , SCB_ALL ); set_sc( EL_WATER_SCREEN , SC_WATER_SCREEN_OPTION , SI_WATER_SCREEN_OPTION , SCB_NONE ); set_sc( EL_WATER_DROP , SC_WATER_DROP_OPTION , SI_WATER_DROP_OPTION , SCB_ALL ); - set_sc( EL_WATER_BARRIER , SC_WATER_BARRIER , SI_WATER_BARRIER , SCB_MDEF|SCB_WATK|SCB_MATK|SCB_FLEE ); + set_sc( EL_WATER_BARRIER , SC_WATER_BARRIER , SI_WATER_BARRIER , SCB_WATK|SCB_FLEE ); set_sc( EL_WIND_STEP , SC_WIND_STEP_OPTION , SI_WIND_STEP_OPTION , SCB_SPEED|SCB_FLEE ); set_sc( EL_WIND_CURTAIN , SC_WIND_CURTAIN_OPTION , SI_WIND_CURTAIN_OPTION , SCB_ALL ); set_sc( EL_ZEPHYR , SC_ZEPHYR , SI_ZEPHYR , SCB_FLEE ); @@ -853,8 +853,9 @@ void initChangeTables(void) StatusIconChangeTable[SC_INTFOOD] = SI_FOODINT; StatusIconChangeTable[SC_DEXFOOD] = SI_FOODDEX; StatusIconChangeTable[SC_LUKFOOD] = SI_FOODLUK; - StatusIconChangeTable[SC_FLEEFOOD]= SI_FOODFLEE; + StatusIconChangeTable[SC_FLEEFOOD] = SI_FOODFLEE; StatusIconChangeTable[SC_HITFOOD] = SI_FOODHIT; + StatusIconChangeTable[SC_CRIFOOD] = SI_FOODCRI; StatusIconChangeTable[SC_MANU_ATK] = SI_MANU_ATK; StatusIconChangeTable[SC_MANU_DEF] = SI_MANU_DEF; StatusIconChangeTable[SC_SPL_ATK] = SI_SPL_ATK; @@ -1042,8 +1043,9 @@ void initChangeTables(void) StatusChangeFlagTable[SC_INTFOOD] |= SCB_INT; StatusChangeFlagTable[SC_DEXFOOD] |= SCB_DEX; StatusChangeFlagTable[SC_LUKFOOD] |= SCB_LUK; - StatusChangeFlagTable[SC_HITFOOD] |= SCB_HIT; StatusChangeFlagTable[SC_FLEEFOOD] |= SCB_FLEE; + StatusChangeFlagTable[SC_HITFOOD] |= SCB_HIT; + StatusChangeFlagTable[SC_CRIFOOD] |= SCB_CRI; StatusChangeFlagTable[SC_BATKFOOD] |= SCB_BATK; StatusChangeFlagTable[SC_WATKFOOD] |= SCB_WATK; StatusChangeFlagTable[SC_MATKFOOD] |= SCB_MATK; @@ -1198,7 +1200,6 @@ void initChangeTables(void) StatusChangeStateTable[SC_CAMOUFLAGE] |= SCS_NOMOVE|SCS_NOMOVECOND; StatusChangeStateTable[SC_MEIKYOUSISUI] |= SCS_NOMOVE; StatusChangeStateTable[SC_KAGEHUMI] |= SCS_NOMOVE; - StatusChangeStateTable[SC_KYOUGAKU] |= SCS_NOMOVE; StatusChangeStateTable[SC_PARALYSIS] |= SCS_NOMOVE; StatusChangeStateTable[SC_KINGS_GRACE] |= SCS_NOMOVE; StatusChangeStateTable[SC_VACUUM_EXTREME] |= SCS_NOMOVE; @@ -4128,14 +4129,19 @@ void status_calc_regen_rate(struct block_list *bl, struct regen_data *regen, str sc->data[SC_OBLIVIONCURSE] || sc->data[SC_VITALITYACTIVATION]) regen->flag &= ~RGN_SP; - if(sc->data[SC_TENSIONRELAX]) { - regen->rate.hp += 200; - if (regen->sregen) - regen->sregen->rate.hp += 300; + if (sc->data[SC_TENSIONRELAX]) { + if (sc->data[SC_WEIGHT50] || sc->data[SC_WEIGHT90]) + regen->state.overweight = 0; // 1x HP regen + else { + regen->rate.hp += 200; + if (regen->sregen) + regen->sregen->rate.hp += 200; + } } - if (sc->data[SC_MAGNIFICAT]) { + + if (sc->data[SC_MAGNIFICAT]) regen->rate.sp += 100; - } + if (sc->data[SC_REGENERATION]) { const struct status_change_entry *sce = sc->data[SC_REGENERATION]; if (!sce->val4) { @@ -5383,7 +5389,7 @@ static unsigned short status_calc_watk(struct block_list *bl, struct status_chan if(sc->data[SC_MERC_ATKUP]) watk += sc->data[SC_MERC_ATKUP]->val2; if(sc->data[SC_WATER_BARRIER]) - watk -= sc->data[SC_WATER_BARRIER]->val3; + watk -= sc->data[SC_WATER_BARRIER]->val2; #ifndef RENEWAL if(sc->data[SC_NIBELUNGEN]) { if (bl->type != BL_PC) @@ -5477,8 +5483,6 @@ static unsigned short status_calc_ematk(struct block_list *bl, struct status_cha matk += sc->data[SC_AQUAPLAY_OPTION]->val2; if(sc->data[SC_CHILLY_AIR_OPTION]) matk += sc->data[SC_CHILLY_AIR_OPTION]->val2; - if(sc->data[SC_WATER_BARRIER]) - matk -= sc->data[SC_WATER_BARRIER]->val3; if(sc->data[SC_FIRE_INSIGNIA] && sc->data[SC_FIRE_INSIGNIA]->val1 == 3) matk += 50; if(sc->data[SC_ODINS_POWER]) @@ -5529,8 +5533,6 @@ static unsigned short status_calc_matk(struct block_list *bl, struct status_chan matk += sc->data[SC_CHILLY_AIR_OPTION]->val2; if (sc->data[SC_COOLER_OPTION]) matk += sc->data[SC_COOLER_OPTION]->val2; - if (sc->data[SC_WATER_BARRIER]) - matk -= sc->data[SC_WATER_BARRIER]->val3; if (sc->data[SC_FIRE_INSIGNIA] && sc->data[SC_FIRE_INSIGNIA]->val1 == 3) matk += 50; if (sc->data[SC_ODINS_POWER]) @@ -5580,6 +5582,8 @@ static signed short status_calc_critical(struct block_list *bl, struct status_ch if (sc->data[SC_INCCRI]) critical += sc->data[SC_INCCRI]->val1; + if (sc->data[SC_CRIFOOD]) + critical += sc->data[SC_CRIFOOD]->val1; if (sc->data[SC_EXPLOSIONSPIRITS]) critical += sc->data[SC_EXPLOSIONSPIRITS]->val2; if (sc->data[SC_FORTUNE]) @@ -5711,7 +5715,7 @@ static signed short status_calc_flee(struct block_list *bl, struct status_change if(sc->data[SC_MTF_HITFLEE]) flee += sc->data[SC_MTF_HITFLEE]->val2; if( sc->data[SC_WATER_BARRIER] ) - flee -= sc->data[SC_WATER_BARRIER]->val3; + flee -= sc->data[SC_WATER_BARRIER]->val2; if( sc->data[SC_C_MARKER] ) flee -= sc->data[SC_C_MARKER]->val3; #ifdef RENEWAL @@ -5808,8 +5812,6 @@ static defType status_calc_def(struct block_list *bl, struct status_change *sc, #endif if(sc->data[SC_DEFSET]) return sc->data[SC_DEFSET]->val1; - if(sc->data[SC_UNLIMIT]) - return 1; if(sc->data[SC_DRUMBATTLE]) def += sc->data[SC_DRUMBATTLE]->val3; @@ -5899,8 +5901,6 @@ static signed short status_calc_def2(struct block_list *bl, struct status_change return 0; if(sc->data[SC_DEFSET]) return sc->data[SC_DEFSET]->val1; - if(sc->data[SC_UNLIMIT]) - return 1; if(sc->data[SC_SUN_COMFORT]) def2 += sc->data[SC_SUN_COMFORT]->val2; @@ -5971,8 +5971,6 @@ static defType status_calc_mdef(struct block_list *bl, struct status_change *sc, #endif if(sc->data[SC_MDEFSET]) return sc->data[SC_MDEFSET]->val1; - if(sc->data[SC_UNLIMIT]) - return 1; if(sc->data[SC_EARTH_INSIGNIA] && sc->data[SC_EARTH_INSIGNIA]->val1 == 3) mdef += 50; @@ -5980,8 +5978,6 @@ static defType status_calc_mdef(struct block_list *bl, struct status_change *sc, mdef += (sc->data[SC_ENDURE]->val4 == 0) ? sc->data[SC_ENDURE]->val1 : 1; if(sc->data[SC_STONEHARDSKIN]) mdef += sc->data[SC_STONEHARDSKIN]->val1; - if(sc->data[SC_WATER_BARRIER]) - mdef += sc->data[SC_WATER_BARRIER]->val2; if(sc->data[SC_STONE] && sc->opt1 == OPT1_STONE) mdef += 25 * mdef / 100; if(sc->data[SC_FREEZE]) @@ -6027,8 +6023,6 @@ static signed short status_calc_mdef2(struct block_list *bl, struct status_chang return 90; if(sc->data[SC_MDEFSET]) return sc->data[SC_MDEFSET]->val1; - if(sc->data[SC_UNLIMIT]) - return 1; if(sc->data[SC_MINDBREAKER]) mdef2 -= mdef2 * sc->data[SC_MINDBREAKER]->val3/100; @@ -8992,10 +8986,9 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty clif_sitting(&sd->bl); } val2 = 12; // SP cost - val4 = 10000; // Decrease at 10secs intervals. - val3 = tick/val4; + tick_time = 10000; // Decrease at 10secs intervals. + val3 = tick / tick_time; tick = -1; // Duration sent to the client should be infinite - tick_time = val4; // [GodLesZ] tick time break; case SC_PARRYING: val2 = 20 + val1*3; // Block Chance @@ -9502,8 +9495,8 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty break; case SC_WEAPONBLOCKING: val2 = 10 + 2 * val1; // Chance - val4 = tick / 3000; - tick_time = 3000; // [GodLesZ] tick time + val4 = tick / 5000; + tick_time = 5000; // [GodLesZ] tick time break; case SC_TOXIN: val4 = tick / 10000; @@ -9627,7 +9620,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty if( pc_isridingwug(sd) ) pc_setoption(sd, sd->sc.option&~OPTION_WUGRIDER); if( pc_isfalcon(sd) ) pc_setoption(sd, sd->sc.option&~OPTION_FALCON); if( sd->status.pet_id > 0 ) pet_menu(sd, 3); - if( hom_is_active(sd->hd) ) hom_vaporize(sd,HOM_ST_REST); + if( hom_is_active(sd->hd) ) hom_vaporize(sd, HOM_ST_ACTIVE); //if( sd->md ) mercenary_delete(sd->md,3); // Are Mercenaries removed? [aleos] } break; @@ -9889,6 +9882,9 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty case SC_CIRCLE_OF_FIRE_OPTION: val2 = 300; break; + case SC_WATER_SCREEN_OPTION: + tick_time = 10000; + break; case SC_FIRE_CLOAK_OPTION: case SC_WATER_DROP_OPTION: case SC_WIND_CURTAIN_OPTION: @@ -9924,8 +9920,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty tick_time = val3; // [GodLesZ] tick time break; case SC_WATER_BARRIER: - val2 = 40; // Increasement. Mdef1 ??? - val3 = 30; // Reductions. Atk2, Flee1, Matk1 ???? + val2 = 30; // Reductions. Atk2 and Flee1 break; case SC_ZEPHYR: val2 = 25; // Flee. @@ -10102,6 +10097,8 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty break; case SC_UNLIMIT: 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; case SC_MONSTER_TRANSFORM: if( !mobdb_checkid(val1) ) @@ -10289,7 +10286,9 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty case SC_STUN: case SC_SLEEP: case SC_STONE: + case SC_WHITEIMPRISON: case SC_DEEPSLEEP: + case SC_CRYSTALIZE: if (sd && pc_issit(sd)) // Avoid sprite sync problems. pc_setstand(sd, true); case SC_TRICKDEAD: @@ -10297,28 +10296,33 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty // Cancel cast when get status [LuzZza] if (battle_config.sc_castcancel&bl->type) unit_skillcastcancel(bl, 0); - case SC_WHITEIMPRISON: + // Fall through + case SC_CURSEDCIRCLE_ATKER: unit_stop_attack(bl); + // Fall through case SC_STOP: case SC_CONFUSION: case SC_CLOSECONFINE: case SC_CLOSECONFINE2: case SC_TINDER_BREAKER: case SC_TINDER_BREAKER2: - case SC_SPIDERWEB: - case SC_ELECTRICSHOCKER: case SC_BITE: case SC_THORNSTRAP: - //case SC__CHAOS: - case SC_CRYSTALIZE: - case SC_CURSEDCIRCLE_ATKER: case SC_FEAR: - case SC_NETHERWORLD: case SC_MEIKYOUSISUI: case SC_KYOUGAKU: case SC_PARALYSIS: - case SC_MAGNETICFIELD: + //case SC__CHAOS: + unit_stop_walking(bl,1); + break; + case SC_CURSEDCIRCLE_TARGET: + unit_stop_attack(bl); + // Fall through case SC_ANKLE: + case SC_SPIDERWEB: + case SC_ELECTRICSHOCKER: + case SC_MAGNETICFIELD: + case SC_NETHERWORLD: if (!unit_blown_immune(bl,0x1)) unit_stop_walking(bl,1); break; @@ -11684,8 +11688,8 @@ int status_change_timer(int tid, unsigned int tick, int id, intptr_t data) break; case SC_TENSIONRELAX: - if(status->max_hp > status->hp && --(sce->val3) > 0) { - sc_timer_next(sce->val4+tick, status_change_timer, bl->id, data); + if(status->max_hp > status->hp && --(sce->val3) >= 0) { + sc_timer_next(10000 + tick, status_change_timer, bl->id, data); return 0; } break; @@ -11979,7 +11983,7 @@ int status_change_timer(int tid, unsigned int tick, int id, intptr_t data) if( --(sce->val4) >= 0 ) { if( !status_charge(bl,0,3) ) break; - sc_timer_next(3000+tick,status_change_timer,bl->id,data); + sc_timer_next(5000+tick,status_change_timer,bl->id,data); return 0; } break; @@ -12296,6 +12300,11 @@ int status_change_timer(int tid, unsigned int tick, int id, intptr_t data) sc_timer_next(sce->val3 + tick, status_change_timer, bl->id, data); return 0; + case SC_WATER_SCREEN_OPTION: + status_heal(bl,1000,0,2); + sc_timer_next(10000 + tick,status_change_timer,bl->id,data); + return 0; + case SC_TEARGAS: if( --(sce->val4) >= 0 ) { struct block_list *src = map_id2bl(sce->val3); @@ -12565,8 +12574,9 @@ void status_change_clear_buffs (struct block_list* bl, int type) case SC_INTFOOD: case SC_DEXFOOD: case SC_LUKFOOD: - case SC_HITFOOD: case SC_FLEEFOOD: + case SC_HITFOOD: + case SC_CRIFOOD: case SC_BATKFOOD: case SC_WATKFOOD: case SC_MATKFOOD: @@ -12704,9 +12714,10 @@ void status_change_clear_buffs (struct block_list* bl, int type) * Infect a user with status effects (SC_DEADLYINFECT) * @param src: Object initiating change on bl [PC|MOB|HOM|MER|ELEM] * @param bl: Object to change + * @param type: 0 - Shadow Chaser attacking, 1 - Shadow Chaser being attacked * @return 1: Success 0: Fail */ -int status_change_spread( struct block_list *src, struct block_list *bl ) +int status_change_spread(struct block_list *src, struct block_list *bl, bool type) { int i, flag = 0; struct status_change *sc = status_get_sc(src); @@ -12730,11 +12741,14 @@ int status_change_spread( struct block_list *src, struct block_list *bl ) switch( i ) { // Debuffs that can be spread. // NOTE: We'll add/delete SCs when we are able to confirm it. + case SC_DEATHHURT: + case SC_PARALYSE: + if (type) + continue; case SC_CURSE: case SC_SILENCE: case SC_CONFUSION: case SC_BLIND: - //case SC_NOCHAT: case SC_HALLUCINATION: case SC_SIGNUMCRUCIS: case SC_DECREASEAGI: @@ -12751,8 +12765,6 @@ int status_change_spread( struct block_list *src, struct block_list *bl ) //case SC_BITE: case SC_FREEZING: case SC_VENOMBLEED: - case SC_DEATHHURT: - case SC_PARALYSE: if( sc->data[i]->timer != INVALID_TIMER ) { timer = get_timer(sc->data[i]->timer); if (timer == NULL || timer->func != status_change_timer || DIFF_TICK(timer->tick,tick) < 0) @@ -12766,27 +12778,34 @@ int status_change_spread( struct block_list *src, struct block_list *bl ) case SC_DPOISON: data.tick = sc->data[i]->val3 * 1000; break; - case SC_FEAR: case SC_LEECHESEND: + if (type) + continue; + case SC_FEAR: data.tick = sc->data[i]->val4 * 1000; break; case SC_BURNING: data.tick = sc->data[i]->val4 * 2000; break; case SC_PYREXIA: + if (type) + continue; //case SC_OBLIVIONCURSE: // Players are not affected by Oblivion Curse. data.tick = sc->data[i]->val4 * 3000; break; case SC_MAGICMUSHROOM: + if (type) + continue; data.tick = sc->data[i]->val4 * 4000; break; case SC_TOXIN: + if (type) + continue; case SC_BLEEDING: data.tick = sc->data[i]->val4 * 10000; break; default: continue; - break; } if( i ) { data.val1 = sc->data[i]->val1; diff --git a/src/map/status.h b/src/map/status.h index 3f3d981469..e29884c2e3 100644 --- a/src/map/status.h +++ b/src/map/status.h @@ -716,6 +716,8 @@ typedef enum sc_type { SC_MTF_PUMPKIN, SC_MTF_HITFLEE, + SC_CRIFOOD, + #ifdef RENEWAL SC_EXTREMITYFIST2, //! NOTE: This SC should be right before SC_MAX, so it doesn't disturb if RENEWAL is disabled #endif @@ -2117,7 +2119,7 @@ void status_calc_regen_rate(struct block_list *bl, struct regen_data *regen, str bool status_check_skilluse(struct block_list *src, struct block_list *target, uint16 skill_id, int flag); int status_check_visibility(struct block_list *src, struct block_list *target); -int status_change_spread( struct block_list *src, struct block_list *bl ); +int status_change_spread(struct block_list *src, struct block_list *bl, bool type); #ifndef RENEWAL unsigned short status_base_matk_min(const struct status_data* status);