From ddf9270967da6a81e852dc4468f7a1bacd9efa7f Mon Sep 17 00:00:00 2001 From: munkrej Date: Mon, 11 Mar 2024 00:17:23 +0100 Subject: [PATCH] Implemented Soul Ascetic Taken from #7024 --- db/re/skill_db.yml | 719 +++++++++++++++++++++++++++++++++++ db/re/skill_tree.yml | 110 ++++++ db/re/status.yml | 71 ++++ src/map/battle.cpp | 60 +++ src/map/clif.hpp | 28 +- src/map/script_constants.hpp | 13 + src/map/skill.cpp | 126 ++++++ src/map/skill.hpp | 4 +- src/map/status.cpp | 59 +++ src/map/status.hpp | 13 + 10 files changed, 1199 insertions(+), 4 deletions(-) diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index e3bf3005b5..4eadacb113 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -41846,6 +41846,725 @@ Body: Flag: NoOverlap: true PathCheck: true + - Id: 5416 + Name: SOA_TALISMAN_MASTERY + Description: Talisman Mastery + MaxLevel: 10 + - Id: 5417 + Name: SOA_SOUL_MASTERY + Description: Soul Mastery + MaxLevel: 10 + - Id: 5418 + Name: SOA_TALISMAN_OF_PROTECTION + Description: Talisman Of Protection + MaxLevel: 5 + TargetType: Support + DamageFlags: + NoDamage: true + Flags: + PartyOnly: true + Range: 9 + Hit: Single + HitCount: 1 + CastCancel: true + CastTime: 1500 + AfterCastActDelay: 500 + Duration1: + - Level: 1 + Time: 180000 + - Level: 2 + Time: 210000 + - Level: 3 + Time: 240000 + - Level: 4 + Time: 270000 + - Level: 5 + Time: 300000 + Duration2: + - Level: 1 + Time: 180000 + - Level: 2 + Time: 210000 + - Level: 3 + Time: 240000 + - Level: 4 + Time: 270000 + - Level: 5 + Time: 300000 + FixedCastTime: 1000 + Requires: + SpCost: + - Level: 1 + Amount: 50 + - Level: 2 + Amount: 55 + - Level: 3 + Amount: 60 + - Level: 4 + Amount: 65 + - Level: 5 + Amount: 70 + ItemCost: + - Item: Soa_Charm + Amount: 1 + Status: Talisman_of_Protection + - Id: 5419 + Name: SOA_TALISMAN_OF_WARRIOR + Description: Talisman Of Warrior + MaxLevel: 5 + TargetType: Support + DamageFlags: + NoDamage: true + Flags: + PartyOnly: true + Range: 9 + Hit: Single + HitCount: 1 + GiveAp: 2 + CastCancel: true + CastTime: 1500 + AfterCastActDelay: 500 + Duration1: + - Level: 1 + Time: 180000 + - Level: 2 + Time: 210000 + - Level: 3 + Time: 240000 + - Level: 4 + Time: 270000 + - Level: 5 + Time: 300000 + FixedCastTime: 1000 + Requires: + SpCost: + - Level: 1 + Amount: 50 + - Level: 2 + Amount: 55 + - Level: 3 + Amount: 60 + - Level: 4 + Amount: 65 + - Level: 5 + Amount: 70 + ItemCost: + - Item: Soa_Charm + Amount: 1 + Status: Talisman_of_Warrior + - Id: 5420 + Name: SOA_TALISMAN_OF_MAGICIAN + Description: Talisman Of Magician + MaxLevel: 5 + TargetType: Support + DamageFlags: + NoDamage: true + Flags: + PartyOnly: true + Range: 9 + Hit: Single + HitCount: 1 + GiveAp: 2 + CastCancel: true + CastTime: 1500 + AfterCastActDelay: 500 + Duration1: + - Level: 1 + Time: 180000 + - Level: 2 + Time: 210000 + - Level: 3 + Time: 240000 + - Level: 4 + Time: 270000 + - Level: 5 + Time: 300000 + FixedCastTime: 1000 + Requires: + SpCost: + - Level: 1 + Amount: 50 + - Level: 2 + Amount: 55 + - Level: 3 + Amount: 60 + - Level: 4 + Amount: 65 + - Level: 5 + Amount: 70 + ItemCost: + - Item: Soa_Charm + Amount: 1 + Status: Talisman_of_Magician + - Id: 5421 + Name: SOA_SOUL_GATHERING + Description: Soul Gathering + MaxLevel: 5 + TargetType: Self + DamageFlags: + NoDamage: true + Hit: Single + HitCount: 1 + CastCancel: true + FixedCastTime: 1000 + CastTime: 1500 + Cooldown: + - Level: 1 + Time: 5000 + - Level: 2 + Time: 4000 + - Level: 3 + Time: 3000 + - Level: 4 + Time: 2000 + - Level: 5 + Time: 1000 + Requires: + SpCost: + - Level: 1 + Amount: 70 + - Level: 2 + Amount: 75 + - Level: 3 + Amount: 80 + - Level: 4 + Amount: 85 + - Level: 5 + Amount: 90 + - Id: 5422 + Name: SOA_TOTEM_OF_TUTELARY + Description: Totem Of Tutelary + MaxLevel: 5 + Type: Magic + TargetType: Ground + DamageFlags: + NoDamage: true + Range: 11 + Hit: Single + HitCount: 1 + SplashArea: 2 + ActiveInstance: 1 + CastCancel: true + CastTime: 3500 + Duration1: + - Level: 1 + Time: 18000 + - Level: 2 + Time: 21000 + - Level: 3 + Time: 24000 + - Level: 4 + Time: 27000 + - Level: 5 + Time: 30000 + Cooldown: 15000 + FixedCastTime: 1000 + Requires: + SpCost: + - Level: 1 + Amount: 76 + - Level: 2 + Amount: 92 + - Level: 3 + Amount: 108 + - Level: 4 + Amount: 124 + - Level: 5 + Amount: 140 + ItemCost: + - Item: Soa_Charm + Amount: 10 + Unit: + Id: Totem_Of_Tutelary + Range: + - Level: 1 + Size: 2 + - Level: 2 + Size: 2 + - Level: 3 + Size: 3 + - Level: 4 + Size: 3 + - Level: 5 + Size: 4 + Interval: 1000 + Flag: + NoOverlap: true + PathCheck: true + Status: Totem_of_Tutelary + - Id: 5423 + Name: SOA_TALISMAN_OF_FIVE_ELEMENTS + Description: Talisman Of Five Elements + MaxLevel: 5 + TargetType: Support + DamageFlags: + NoDamage: true + Flags: + PartyOnly: true + Range: 9 + Hit: Single + HitCount: 1 + CastCancel: true + CastTime: 1500 + AfterCastActDelay: 500 + Duration1: + - Level: 1 + Time: 180000 + - Level: 2 + Time: 210000 + - Level: 3 + Time: 240000 + - Level: 4 + Time: 270000 + - Level: 5 + Time: 300000 + FixedCastTime: 1000 + Requires: + SpCost: + - Level: 1 + Amount: 50 + - Level: 2 + Amount: 55 + - Level: 3 + Amount: 60 + - Level: 4 + Amount: 65 + - Level: 5 + Amount: 70 + ItemCost: + - Item: Soa_Charm + Amount: 5 + Status: Talisman_of_five_Elements + - Id: 5424 + Name: SOA_TALISMAN_OF_SOUL_STEALING + Description: Talisman Of Soul Stealing + MaxLevel: 5 + Type: Magic + TargetType: Attack + Range: 9 + Hit: Single + HitCount: 1 + Element: Endowed + CastCancel: true + CastTime: 2200 + Cooldown: 1000 + FixedCastTime: 1500 + Requires: + SpCost: 84 + ItemCost: + - Item: Soa_Charm + Amount: 1 + - Id: 5425 + Name: SOA_EXORCISM_OF_MALICIOUS_SOUL + Description: Exorcism Of Malicious Soul + MaxLevel: 5 + Type: Magic + TargetType: Self + DamageFlags: + Splash: true + Hit: Multi_Hit + GiveAp: 2 + HitCount: -5 + Element: Endowed + SplashArea: + - Level: 1 + Area: 5 + - Level: 2 + Area: 5 + - Level: 3 + Area: 5 + - Level: 4 + Area: 6 + - Level: 5 + Area: 6 + CastCancel: true + CastTime: 2200 + AfterCastActDelay: 500 + FixedCastTime: 1500 + Cooldown: 1000 + Requires: + SpCost: + - Level: 1 + Amount: 70 + - Level: 2 + Amount: 80 + - Level: 3 + Amount: 90 + - Level: 4 + Amount: 100 + - Level: 5 + Amount: 110 + SpiritSphereCost: 1 + - Id: 5426 + Name: SOA_TALISMAN_OF_BLUE_DRAGON + Description: Talisman Of Blue Dragon + MaxLevel: 5 + Type: Magic + TargetType: Attack + Range: 9 + Hit: Single + HitCount: 1 + Element: Endowed + GiveAp: 2 + CastCancel: true + CastTime: 1000 + FixedCastTime: 1500 + Cooldown: 300 + Duration1: + - Level: 1 + Time: 30000 + - Level: 2 + Time: 60000 + - Level: 3 + Time: 90000 + - Level: 4 + Time: 120000 + - Level: 5 + Time: 150000 + Requires: + SpCost: + - Level: 1 + Amount: 54 + - Level: 2 + Amount: 58 + - Level: 3 + Amount: 62 + - Level: 4 + Amount: 66 + - Level: 5 + Amount: 70 + ItemCost: + - Item: Soa_Charm + Amount: 1 + Status: T_First_God + - Id: 5427 + Name: SOA_TALISMAN_OF_WHITE_TIGER + Description: Talisman Of White Tiger + MaxLevel: 5 + Type: Magic + TargetType: Self + DamageFlags: + Splash: true + Hit: Multi_Hit + HitCount: -2 + Element: Endowed + GiveAp: 2 + SplashArea: + - Level: 1 + Area: 5 + - Level: 2 + Area: 5 + - Level: 3 + Area: 6 + - Level: 4 + Area: 6 + - Level: 5 + Area: 7 + CastCancel: true + CastTime: 1000 + FixedCastTime: 1500 + Cooldown: 400 + Duration1: + - Level: 1 + Time: 30000 + - Level: 2 + Time: 60000 + - Level: 3 + Time: 90000 + - Level: 4 + Time: 120000 + - Level: 5 + Time: 150000 + Requires: + SpCost: + - Level: 1 + Amount: 80 + - Level: 2 + Amount: 83 + - Level: 3 + Amount: 86 + - Level: 4 + Amount: 89 + - Level: 5 + Amount: 92 + ItemCost: + - Item: Soa_Charm + Amount: 1 + Status: T_Second_God + - Id: 5428 + Name: SOA_TALISMAN_OF_RED_PHOENIX + Description: Talisman Of Red Phoenix + MaxLevel: 5 + Type: Magic + TargetType: Attack + DamageFlags: + Splash: true + Range: 9 + Hit: Multi_Hit + HitCount: -3 + Element: Endowed + GiveAp: 3 + SplashArea: + - Level: 1 + Area: 1 + - Level: 2 + Area: 1 + - Level: 3 + Area: 2 + - Level: 4 + Area: 2 + - Level: 5 + Area: 3 + Duration1: + - Level: 1 + Time: 30000 + - Level: 2 + Time: 60000 + - Level: 3 + Time: 90000 + - Level: 4 + Time: 120000 + - Level: 5 + Time: 150000 + CastCancel: true + CastTime: 1000 + FixedCastTime: 1500 + Cooldown: 450 + Requires: + SpCost: + - Level: 1 + Amount: 72 + - Level: 2 + Amount: 76 + - Level: 3 + Amount: 80 + - Level: 4 + Amount: 84 + - Level: 5 + Amount: 88 + ItemCost: + - Item: Soa_Charm + Amount: 1 + Status: T_Third_God + - Id: 5429 + Name: SOA_TALISMAN_OF_BLACK_TORTOISE + Description: Talisman Of Black Tortoise + MaxLevel: 5 + Type: Magic + TargetType: Ground + DamageFlags: + Splash: true + Range: 9 + Hit: Multi_Hit + HitCount: -4 + Element: Endowed + GiveAp: 3 + Duration1: 100 + Duration2: + - Level: 1 + Time: 30000 + - Level: 2 + Time: 60000 + - Level: 3 + Time: 90000 + - Level: 4 + Time: 120000 + - Level: 5 + Time: 150000 + CastCancel: true + CastTime: 1000 + FixedCastTime: 1500 + Cooldown: 700 + Requires: + SpCost: + - Level: 1 + Amount: 72 + - Level: 2 + Amount: 77 + - Level: 3 + Amount: 82 + - Level: 4 + Amount: 87 + - Level: 5 + Amount: 92 + ItemCost: + - Item: Soa_Charm + Amount: 1 + Unit: + Id: Dummyskill + Range: + - Level: 1 + Size: 3 + - Level: 2 + Size: 3 + - Level: 3 + Size: 4 + - Level: 4 + Size: 4 + - Level: 5 + Size: 5 + Interval: 1000 + Target: Enemy + Flag: + PathCheck: true + Status: T_Fourth_God + - Id: 5430 + Name: SOA_TALISMAN_OF_FOUR_BEARING_GOD + Description: Talisman Of Four Bearing God + MaxLevel: 5 + Type: Magic + TargetType: Attack + DamageFlags: + Splash: true + Range: 9 + Hit: Single + HitCount: 1 + Element: Endowed + GiveAp: 3 + SplashArea: + - Level: 1 + Area: 3 + - Level: 2 + Area: 3 + - Level: 3 + Area: 4 + - Level: 4 + Area: 4 + - Level: 5 + Area: 5 + CastCancel: true + CastTime: 1500 + FixedCastTime: 1500 + Cooldown: 1000 + Requires: + SpCost: + - Level: 1 + Amount: 86 + - Level: 2 + Amount: 88 + - Level: 3 + Amount: 90 + - Level: 4 + Amount: 92 + - Level: 5 + Amount: 94 + ItemCost: + - Item: Soa_Charm + Amount: 3 + - Id: 5431 + Name: SOA_CIRCLE_OF_DIRECTIONS_AND_ELEMENTALS + Description: Circle Of Directions And Elementals + MaxLevel: 5 + Type: Magic + TargetType: Attack + DamageFlags: + Splash: true + Range: 9 + Hit: Multi_Hit + HitCount: 5 + Element: Endowed + SplashArea: + - Level: 1 + Area: 3 + - Level: 2 + Area: 3 + - Level: 3 + Area: 4 + - Level: 4 + Area: 4 + - Level: 5 + Area: 5 + Duration1: + - Level: 1 + Time: 30000 + - Level: 2 + Time: 60000 + - Level: 3 + Time: 90000 + - Level: 4 + Time: 120000 + - Level: 5 + Time: 150000 + CastCancel: true + Cooldown: 5000 + AfterCastActDelay: 500 + CastTime: 1500 + FixedCastTime: 1500 + Requires: + SpCost: + - Level: 1 + Amount: 120 + - Level: 2 + Amount: 140 + - Level: 3 + Amount: 160 + - Level: 4 + Amount: 180 + - Level: 5 + Amount: 200 + ApCost: 25 + Status: T_Fifth_God + - Id: 5432 + Name: SOA_SOUL_OF_HEAVEN_AND_EARTH + Description: Soul Of Heaven And Earth + MaxLevel: 10 + Type: Magic + TargetType: Self + DamageFlags: + NoDamage: true + Splash: true + Range: 11 + Hit: Single + HitCount: 1 + SplashArea: 11 + CastCancel: true + AfterCastActDelay: 1000 + Duration1: 300000 + Cooldown: + - Level: 2 + Time: 30000 + - Level: 3 + Time: 60000 + - Level: 4 + Time: 90000 + - Level: 5 + Time: 120000 + - Level: 6 + Time: 150000 + - Level: 7 + Time: 180000 + - Level: 8 + Time: 210000 + - Level: 9 + Time: 270000 + - Level: 10 + Time: 300000 + CastTime: 3000 + FixedCastTime: 2000 + Requires: + SpCost: + - Level: 1 + Amount: 90 + - Level: 2 + Amount: 100 + - Level: 3 + Amount: 110 + - Level: 4 + Amount: 120 + - Level: 5 + Amount: 130 + - Level: 6 + Amount: 140 + - Level: 7 + Amount: 150 + - Level: 8 + Amount: 160 + - Level: 9 + Amount: 170 + - Level: 10 + Amount: 180 + ApCost: 180 + Status: Heaven_and_Earth - Id: 5449 Name: HN_SELFSTUDY_TATICS Description: Self Study Tactics diff --git a/db/re/skill_tree.yml b/db/re/skill_tree.yml index d9213f46bd..564b9f3ec1 100644 --- a/db/re/skill_tree.yml +++ b/db/re/skill_tree.yml @@ -7864,6 +7864,116 @@ Body: Royal_Guard: true Royal_Guard_T: true Imperial_Guard: true + - Job: Soul_Ascetic + Inherit: + Novice: true + Taekwon: true + Soul_Linker: true + Soul_Reaper: true + Tree: + - Name: SOA_SOUL_MASTERY + MaxLevel: 10 + - Name: SOA_TALISMAN_MASTERY + MaxLevel: 10 + - Name: SOA_SOUL_GATHERING + MaxLevel: 5 + Requires: + - Name: SP_SOULENERGY + Level: 5 + - Name: SOA_SOUL_MASTERY + Level: 3 + - Name: SOA_TALISMAN_OF_PROTECTION + MaxLevel: 5 + Requires: + - Name: SOA_TALISMAN_MASTERY + Level: 1 + - Name: SOA_TALISMAN_OF_WARRIOR + MaxLevel: 5 + Requires: + - Name: SOA_TALISMAN_MASTERY + Level: 1 + - Name: SOA_TALISMAN_OF_MAGICIAN + MaxLevel: 5 + Requires: + - Name: SOA_TALISMAN_MASTERY + Level: 1 + - Name: SOA_EXORCISM_OF_MALICIOUS_SOUL + MaxLevel: 5 + Requires: + - Name: SOA_SOUL_GATHERING + Level: 1 + - Name: SP_SOULCURSE + Level: 5 + - Name: SOA_TALISMAN_OF_SOUL_STEALING + MaxLevel: 5 + Requires: + - Name: SOA_TALISMAN_MASTERY + Level: 1 + - Name: SOA_SOUL_MASTERY + Level: 1 + - Name: SOA_TOTEM_OF_TUTELARY + MaxLevel: 5 + Requires: + - Name: SOA_TALISMAN_MASTERY + Level: 3 + - Name: SOA_SOUL_MASTERY + Level: 3 + - Name: SOA_TALISMAN_OF_FIVE_ELEMENTS + MaxLevel: 5 + Requires: + - Name: SOA_TALISMAN_MASTERY + Level: 1 + - Name: SOA_TALISMAN_OF_BLUE_DRAGON + MaxLevel: 5 + Requires: + - Name: SOA_TALISMAN_OF_SOUL_STEALING + Level: 1 + - Name: SOA_TALISMAN_OF_WHITE_TIGER + MaxLevel: 5 + Requires: + - Name: SOA_TALISMAN_OF_BLUE_DRAGON + Level: 1 + - Name: SOA_TALISMAN_OF_RED_PHOENIX + MaxLevel: 5 + Requires: + - Name: SOA_TALISMAN_OF_WHITE_TIGER + Level: 1 + - Name: SOA_TALISMAN_OF_BLACK_TORTOISE + MaxLevel: 5 + Requires: + - Name: SOA_TALISMAN_OF_RED_PHOENIX + Level: 1 + - Name: SOA_TALISMAN_OF_FOUR_BEARING_GOD + MaxLevel: 5 + Requires: + - Name: SOA_TALISMAN_OF_BLUE_DRAGON + Level: 1 + - Name: SOA_TALISMAN_OF_WHITE_TIGER + Level: 1 + - Name: SOA_TALISMAN_OF_RED_PHOENIX + Level: 1 + - Name: SOA_TALISMAN_OF_BLACK_TORTOISE + Level: 1 + - Name: SOA_CIRCLE_OF_DIRECTIONS_AND_ELEMENTALS + MaxLevel: 5 + Requires: + - Name: SOA_SOUL_MASTERY + Level: 3 + - Name: SOA_TALISMAN_OF_FIVE_ELEMENTS + Level: 1 + - Name: SOA_TALISMAN_OF_FOUR_BEARING_GOD + Level: 1 + - Name: SOA_SOUL_OF_HEAVEN_AND_EARTH + MaxLevel: 10 + Requires: + - Name: SOA_TALISMAN_OF_PROTECTION + Level: 5 + - Name: SOA_TALISMAN_OF_WARRIOR + Level: 5 + - Name: SOA_TALISMAN_OF_MAGICIAN + Level: 5 + - Name: SOA_TALISMAN_OF_FIVE_ELEMENTS + Level: 5 - Job: Night_Watch Inherit: Novice: true diff --git a/db/re/status.yml b/db/re/status.yml index e3eab6f6cf..2bf37fecab 100644 --- a/db/re/status.yml +++ b/db/re/status.yml @@ -8876,3 +8876,74 @@ Body: DurationLookup: NW_HIDDEN_CARD CalcFlags: All: true + - Status: Talisman_of_Protection + Icon: EFST_TALISMAN_OF_PROTECTION + DurationLookup: SOA_TALISMAN_OF_PROTECTION + Flags: + BlEffect: true + DisplayPc: true + - Status: Talisman_of_Warrior + Icon: EFST_TALISMAN_OF_WARRIOR + DurationLookup: SOA_TALISMAN_OF_WARRIOR + CalcFlags: + Patk: true + Flags: + BlEffect: true + DisplayPc: true + - Status: Talisman_of_Magician + Icon: EFST_TALISMAN_OF_MAGICIAN + DurationLookup: SOA_TALISMAN_OF_MAGICIAN + CalcFlags: + Smatk: true + Flags: + BlEffect: true + DisplayPc: true + - Status: Talisman_of_five_Elements + Icon: EFST_TALISMAN_OF_FIVE_ELEMENTS + DurationLookup: SOA_TALISMAN_OF_FIVE_ELEMENTS + CalcFlags: + All: true + Flags: + BlEffect: true + DisplayPc: true + - Status: Totem_of_Tutelary + Icon: EFST_BLANK + DurationLookup: SOA_TOTEM_OF_TUTELARY + CalcFlags: + Regen: true + - Status: T_First_God + Icon: EFST_T_FIRST_GOD + DurationLookup: SOA_TALISMAN_OF_BLUE_DRAGON + - Status: T_Second_God + Icon: EFST_T_SECOND_GOD + DurationLookup: SOA_TALISMAN_OF_WHITE_TIGER + Fail: + T_Second_God: true + EndOnStart: + T_First_God: true + - Status: T_Third_God + Icon: EFST_T_THIRD_GOD + DurationLookup: SOA_TALISMAN_OF_RED_PHOENIX + Fail: + T_Third_God: true + EndOnStart: + T_Second_God: true + - Status: T_Fourth_God + Icon: EFST_T_FOURTH_GOD + DurationLookup: SOA_TALISMAN_OF_BLACK_TORTOISE + Fail: + T_Fourth_God: true + EndOnStart: + T_Third_God: true + - Status: T_Fifth_God + Icon: EFST_T_FIVETH_GOD + DurationLookup: SOA_CIRCLE_OF_DIRECTIONS_AND_ELEMENTALS + CalcFlags: + Smatk: true + EndOnStart: + T_Fourth_God: true + - Status: Heaven_and_Earth + Icon: EFST_HEAVEN_AND_EARTH + DurationLookup: SOA_SOUL_OF_HEAVEN_AND_EARTH + CalcFlags: + Smatk: true diff --git a/src/map/battle.cpp b/src/map/battle.cpp index e723511f5d..67c856c5bc 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -7552,6 +7552,20 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list ad.div_ = 2; } break; + case SOA_TALISMAN_OF_FOUR_BEARING_GOD: + if (sc){ + if (sc->getSCE(SC_T_FIRST_GOD)) + ad.div_ = 2; + else if (sc->getSCE(SC_T_SECOND_GOD)) + ad.div_ = 3; + else if (sc->getSCE(SC_T_THIRD_GOD)) + ad.div_ = 4; + else if (sc->getSCE(SC_T_FOURTH_GOD)) + ad.div_ = 5; + else if (sc->getSCE(SC_T_FIFTH_GOD)) + ad.div_ = 7; + } + break; } //Set miscellaneous data that needs be filled @@ -7742,6 +7756,52 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list case WZ_WATERBALL: skillratio += 30 * skill_lv; break; + case SOA_EXORCISM_OF_MALICIOUS_SOUL: + skillratio += -100 + 150 * skill_lv + 5 * sstatus->spl; + if (tsc && tsc->getSCE(SC_SOULCURSE)) + skillratio += 100 * skill_lv; + if (sd) + skillratio = (skillratio + pc_checkskill(sd, SOA_SOUL_MASTERY) * 2) * sd->soulball_old; + if (sc && sc->getSCE(SC_TOTEM_OF_TUTELARY)) // needs confirmation if this bonus is extra and how high it actually is [munkrej] + skillratio += skillratio * 50 / 100; + RE_LVL_DMOD(100); + break; + case SOA_TALISMAN_OF_BLUE_DRAGON: + skillratio += -100 + 250 + (1450 + pc_checkskill(sd, SOA_TALISMAN_MASTERY) * 15) * skill_lv + 5 * sstatus->spl; + if (sc && sc->getSCE(SC_T_FIFTH_GOD) ) + skillratio += 100 + 200 * skill_lv; + RE_LVL_DMOD(100); + break; + case SOA_TALISMAN_OF_WHITE_TIGER: + skillratio += -100 + 350 + (950 + pc_checkskill(sd, SOA_TALISMAN_MASTERY) * 15) * skill_lv + 5 * sstatus->spl; + if (sc && sc->getSCE(SC_T_FIFTH_GOD)) + skillratio += 400 * skill_lv; + RE_LVL_DMOD(100); + break; + case SOA_TALISMAN_OF_RED_PHOENIX: + skillratio += -100 + 1000 + (900 + pc_checkskill(sd, SOA_TALISMAN_MASTERY) * 15) * skill_lv + 5 * sstatus->spl; + if (sc && sc->getSCE(SC_T_FIFTH_GOD)) + skillratio += 200 + 400 * skill_lv; + RE_LVL_DMOD(100); + break; + case SOA_TALISMAN_OF_BLACK_TORTOISE: + skillratio += -100 + 2150 + (1450 + pc_checkskill(sd, SOA_TALISMAN_MASTERY) * 15) * skill_lv + 5 * sstatus->spl; + if (sc && sc->getSCE(SC_T_FIFTH_GOD)) + skillratio += 150 + 400 * skill_lv; + RE_LVL_DMOD(100); + break; + case SOA_CIRCLE_OF_DIRECTIONS_AND_ELEMENTALS: + skillratio += -100 + 500 + (2000 + (pc_checkskill(sd, SOA_TALISMAN_MASTERY) + pc_checkskill(sd, SOA_SOUL_MASTERY)) * 15) * skill_lv + 5 * sstatus->spl; + RE_LVL_DMOD(100); + break; + case SOA_TALISMAN_OF_FOUR_BEARING_GOD: + skillratio += -100 + 50 + (250 + pc_checkskill(sd, SOA_TALISMAN_MASTERY) * 15) * skill_lv + 5 * sstatus->spl; + RE_LVL_DMOD(100); + break; + case SOA_TALISMAN_OF_SOUL_STEALING: + skillratio += -100 + 500 + (1250 + (pc_checkskill(sd, SOA_TALISMAN_MASTERY) + pc_checkskill(sd, SOA_SOUL_MASTERY)) * 7) * skill_lv + 5 * sstatus->spl; + RE_LVL_DMOD(100); + break; case WZ_STORMGUST: #ifdef RENEWAL skillratio -= 30; // Offset only once diff --git a/src/map/clif.hpp b/src/map/clif.hpp index b94acdca55..02d28e30af 100644 --- a/src/map/clif.hpp +++ b/src/map/clif.hpp @@ -484,8 +484,32 @@ enum useskill_fail_cause : uint8_t USESKILL_FAIL_THERE_ARE_NPC_AROUND = 83, USESKILL_FAIL_NEED_MORE_BULLET = 84, USESKILL_FAIL_COINS = 85, - // 86-99 unknown - USESKILL_FAIL_AP_INSUFFICIENT = 100, + // 86 unknown + USESKILL_FAIL_MAP = 87, + USESKILL_FAIL_NEED_SUMMON_SP, + USESKILL_FAIL_SAME_VEND, + USESKILL_FAIL_NEED_BULLETS, + USESKILL_FAIL_NEED_ARROWS, + USESKILL_FAIL_NEED_PARTY, + USESKILL_FAIL_NEED_PARTY_LEADER, + USESKILL_FAIL_NEED_PARTNER_SP, + USESKILL_FAIL_NEED_WEAPON, + USESKILL_FAIL_NEED_ENERGY_SPHERE, + USESKILL_FAIL_NEED_WEAPON_BLOCKING, + USESKILL_FAIL_MAX_TRAPS, + USESKILL_FAIL_NEED_MAGIC_SPELLBOOK, + USESKILL_FAIL_AP_INSUFFICIENT, + USESKILL_FAIL_NEED_SERVANT_WEAPON, + USESKILL_FAIL_NEED_TWINKLING_GALAXY, + USESKILL_FAIL_NEED_SOUL_ENGERY, + USESKILL_FAIL_NEED_AMULET, + USESKILL_FAIL_NEED_GATLING_SHOTGUT, + USESKILL_FAIL_NEED_RIFLE_REVOLVER, + USESKILL_FAIL_NEED_GLAUNCHER_RIFLE, + USESKILL_FAIL_NEED_GATLING_REVOLVER, + USESKILL_FAIL_NEED_SHOTGUN_GLAUNCHER, + USESKILL_FAIL_NEED_SHIELD, + USESKILL_FAIL_TARGET_SHADOW_SPACE, USESKILL_FAIL_MAX }; diff --git a/src/map/script_constants.hpp b/src/map/script_constants.hpp index c739b58c7a..da17fa0c15 100644 --- a/src/map/script_constants.hpp +++ b/src/map/script_constants.hpp @@ -1911,6 +1911,19 @@ export_constant(SC_AUTO_FIRING_LAUNCHER); export_constant(SC_HIDDEN_CARD); + // Soul Ascetic + export_constant(SC_TALISMAN_OF_PROTECTION); + export_constant(SC_TALISMAN_OF_WARRIOR); + export_constant(SC_TALISMAN_OF_MAGICIAN); + export_constant(SC_TALISMAN_OF_FIVE_ELEMENTS); + export_constant(SC_TOTEM_OF_TUTELARY); + export_constant(SC_T_FIRST_GOD); + export_constant(SC_T_SECOND_GOD); + export_constant(SC_T_THIRD_GOD); + export_constant(SC_T_FOURTH_GOD); + export_constant(SC_T_FIFTH_GOD); + export_constant(SC_HEAVEN_AND_EARTH); + #ifdef RENEWAL export_constant(SC_EXTREMITYFIST2); #endif diff --git a/src/map/skill.cpp b/src/map/skill.cpp index 293616f267..18c132d9ce 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -5721,6 +5721,11 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint case TR_METALIC_FURY: case IG_GRAND_JUDGEMENT: case HN_JUPITEL_THUNDER_STORM: + case SOA_EXORCISM_OF_MALICIOUS_SOUL: + case SOA_TALISMAN_OF_WHITE_TIGER: + case SOA_TALISMAN_OF_RED_PHOENIX: + case SOA_TALISMAN_OF_FOUR_BEARING_GOD: + case SOA_CIRCLE_OF_DIRECTIONS_AND_ELEMENTALS: if( flag&1 ) {//Recursive invocation int sflag = skill_area_temp[0] & 0xFFF; int heal = 0; @@ -5792,6 +5797,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint case DK_HACKANDSLASHER: case MT_SPARK_BLASTER: case HN_JUPITEL_THUNDER_STORM: + case SOA_TALISMAN_OF_FOUR_BEARING_GOD: clif_skill_nodamage(src,bl,skill_id,skill_lv,1); break; #ifdef RENEWAL @@ -5924,6 +5930,18 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); sc_start(src, src, skill_get_sc(skill_id), 100, skill_lv, skill_get_time(skill_id, skill_lv)); break; + case SOA_TALISMAN_OF_RED_PHOENIX: + clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + skill_area_temp[0] = map_foreachinallrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR, src, skill_id, skill_lv, tick, BCT_ENEMY, skill_area_sub_count); + if (sc && (sc->getSCE(SC_T_SECOND_GOD) && !sc->getSCE(SC_T_THIRD_GOD) && !sc->getSCE(SC_T_FIFTH_GOD))){ + sc_start(src, src, skill_get_sc(skill_id), 100, skill_lv, skill_get_time(skill_id, skill_lv)); + } + break; + case SOA_CIRCLE_OF_DIRECTIONS_AND_ELEMENTALS: + clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + skill_area_temp[0] = map_foreachinallrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR, src, skill_id, skill_lv, tick, BCT_ENEMY, skill_area_sub_count); + sc_start(src,src,SC_T_FIFTH_GOD,100,skill_lv,skill_get_time(skill_id,skill_lv)); + break; } // if skill damage should be split among targets, count them @@ -7129,6 +7147,24 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint status_change_end(src, SC_INTENSIVE_AIM_COUNT); break; + case SOA_TALISMAN_OF_BLUE_DRAGON: + clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + skill_attack(BF_MAGIC,src,src,bl,skill_id,skill_lv,tick,flag); + if (!(sc && (sc->getSCE(SC_T_SECOND_GOD) || sc->getSCE(SC_T_THIRD_GOD) || sc->getSCE(SC_T_FOURTH_GOD) || sc->getSCE(SC_T_FIFTH_GOD) ))){ + sc_start(src,src,SC_T_FIRST_GOD,100,1,skill_get_time(skill_id,skill_lv)); + } + break; + + case SOA_TALISMAN_OF_SOUL_STEALING: + skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, flag); + if( bl->type != BL_SKILL ){ + int64 sp = 100 * skill_lv + status_get_lv(src); + + status_heal(src, 0, sp, 0, 0); + clif_skill_nodamage(src, src, MG_SRECOVERY, (int)sp, 1); + } + break; + default: ShowWarning("skill_castend_damage_id: Unknown skill used:%d\n",skill_id); clif_skill_damage(src, bl, tick, status_get_amotion(src), tstatus->dmotion, @@ -8616,6 +8652,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case MT_MIGHTY_SMASH: case ABC_ABYSS_DAGGER: case BO_EXPLOSIVE_POWDER: + case SOA_EXORCISM_OF_MALICIOUS_SOUL: + case SOA_TALISMAN_OF_WHITE_TIGER: { int starget = BL_CHAR|BL_SKILL; @@ -8643,6 +8681,18 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if (skill_id == MH_THE_ONE_FIGHTER_RISES) { hom_addspiritball(hd, MAX_SPIRITBALL); } + if (skill_id == SOA_EXORCISM_OF_MALICIOUS_SOUL ) { + if (sd) { + // Remove old souls if any exist. + sd->soulball_old = sd->soulball; + pc_delsoulball(sd, sd->soulball, 0); + } + } + if (skill_id == SOA_TALISMAN_OF_WHITE_TIGER ) { + if (sc && (sc->getSCE(SC_T_FIRST_GOD) && !sc->getSCE(SC_T_SECOND_GOD) && !sc->getSCE(SC_T_FIFTH_GOD))){ + sc_start(src, src, skill_get_sc(skill_id), 100, skill_lv, skill_get_time(skill_id, skill_lv)); + } + } skill_area_temp[1] = 0; clif_skill_nodamage(src,bl,skill_id,skill_lv,1); @@ -8839,12 +8889,19 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui #endif case PR_MAGNIFICAT: case PR_GLORIA: + case SOA_SOUL_OF_HEAVEN_AND_EARTH: if (sd == NULL || sd->status.party_id == 0 || (flag & 1)) { // Animations don't play when outside visible range if (check_distance_bl(src, bl, AREA_SIZE)) clif_skill_nodamage(bl, bl, skill_id, skill_lv, 1); + if ( src != bl) { + if( skill_id == SOA_SOUL_OF_HEAVEN_AND_EARTH && tsc && tsc->getSCE(SC_TOTEM_OF_TUTELARY) ){ + status_heal(bl, 0, 0, 3 * skill_lv, 0); + } + } + sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv)); } else if (sd) @@ -10906,6 +10963,37 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui } break; + case SOA_SOUL_GATHERING: + if(sd) { + int limit = 5 + pc_checkskill(sd, SP_SOULENERGY) * 3; + + clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + for (i = 0; i < limit; i++) + pc_addsoulball(sd,limit); + } + break; + case SOA_TALISMAN_OF_PROTECTION: + if (flag&1) { + int heal_amount = (500 + pc_checkskill(sd,SOA_TALISMAN_MASTERY) * 50) * skill_lv + (status_get_lv(src) + status_get_crt(src)) * 20; + clif_skill_nodamage(nullptr, bl, AL_HEAL, heal_amount, 1); + status_heal(bl, heal_amount, 0, 0, 0); + } else + 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 SOA_TALISMAN_OF_WARRIOR: + case SOA_TALISMAN_OF_MAGICIAN: + case SOA_TALISMAN_OF_FIVE_ELEMENTS: + if (dstsd) { + short index = dstsd->equip_index[EQI_HAND_R]; + if (index >= 0 && dstsd->inventory_data[index] && dstsd->inventory_data[index]->type == IT_WEAPON) { + 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; + } + } + clif_skill_fail(sd, skill_id, USESKILL_FAIL_NEED_WEAPON, 0); + break; + case GC_WEAPONBLOCKING: if( tsc && tsc->getSCE(SC_WEAPONBLOCKING) ) status_change_end(bl, SC_WEAPONBLOCKING); @@ -13906,6 +13994,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui case BO_ACIDIFIED_ZONE_GROUND: case BO_ACIDIFIED_ZONE_WIND: case BO_ACIDIFIED_ZONE_FIRE: + case SOA_TOTEM_OF_TUTELARY: case EM_DIAMOND_STORM: case EM_LIGHTNING_LAND: case EM_VENOM_SWAMP: @@ -13919,6 +14008,13 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui skill_unitsetting(src,skill_id,skill_lv,x,y,0); break; + case SOA_TALISMAN_OF_BLACK_TORTOISE: + if (sc && (sc->getSCE(SC_T_THIRD_GOD) && !sc->getSCE(SC_T_FOURTH_GOD) && !sc->getSCE(SC_T_FIFTH_GOD))){ + sc_start(src, src, skill_get_sc(skill_id), 100, skill_lv, skill_get_time2(skill_id, skill_lv)); + } + skill_unitsetting(src,skill_id,skill_lv,x,y,0); + break; + case WZ_ICEWALL: flag|=1; if(skill_unitsetting(src,skill_id,skill_lv,x,y,0)) @@ -16675,6 +16771,22 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, t_t skill_attack(skill_get_type(sg->skill_id), ss, &unit->bl, bl, sg->skill_id, sg->skill_lv, tick, flag); } break; + + case UNT_TOTEM_OF_TUTELARY: + ++sg->val1; + if( bl->type == BL_PC ) { + if (sg->val1 % 3 == 0) { + int hp = (500 + (500 + 50 * pc_checkskill(tsd, SOA_TALISMAN_MASTERY) + 50 * status_get_crt(ss)) * sg->skill_lv) * status_get_lv(ss)/100, + sp = (50 + 5 * tstatus->crt + 5 * pc_checkskill(tsd, SOA_TALISMAN_MASTERY)) * sg->skill_lv * (100+status_get_lv(bl))/150 ; + + clif_skill_nodamage(&unit->bl, bl, AL_HEAL, hp, 1); + clif_skill_nodamage(&unit->bl, bl, MG_SRECOVERY, sp, 1); + + status_heal(bl, hp, sp, 0, 0); + } + sc_start(ss, bl, SC_TOTEM_OF_TUTELARY, 100, sg->skill_lv, sg->interval + 100); + } + break; } if (bl->type == BL_MOB && ss != bl) @@ -18080,6 +18192,19 @@ bool skill_check_condition_castbegin(map_session_data* sd, uint16 skill_id, uint if (!(sc && sc->getSCE(SC_THIRD_EXOR_FLAME))) return false; break; + + case SOA_SOUL_GATHERING: + if (!(sc && sc->getSCE(SC_SOULCOLLECT))){ + clif_skill_fail(sd,skill_id,USESKILL_FAIL_CONDITION,0); + return false; + } + break; + case SOA_CIRCLE_OF_DIRECTIONS_AND_ELEMENTALS: + if (!(sc && sc->getSCE(SC_T_FOURTH_GOD))) { + clif_skill_fail(sd,skill_id,USESKILL_FAIL_CONDITION,0); + return false; + } + break; } /* check state required */ @@ -18333,6 +18458,7 @@ bool skill_check_condition_castbegin(map_session_data* sd, uint16 skill_id, uint case SP_SOULREAPER: case SP_SOULEXPLOSION: case SP_KAUTE: + case SOA_EXORCISM_OF_MALICIOUS_SOUL: if (sd->soulball < require.spiritball) { clif_skill_fail(sd, skill_id, USESKILL_FAIL_SPIRITS, 0); return false; diff --git a/src/map/skill.hpp b/src/map/skill.hpp index 16c6132392..8deaa1e88c 100644 --- a/src/map/skill.hpp +++ b/src/map/skill.hpp @@ -33,8 +33,8 @@ class status_change; #define MAX_SKILL_LEVEL 13 /// Max Skill Level (for skill_db storage) #define MAX_MOBSKILL_LEVEL 100 /// Max monster skill level (on skill usage) #define MAX_SKILL_CRIMSON_MARKER 3 /// Max Crimson Marker targets (RL_C_MARKER) -#define SKILL_NAME_LENGTH 31 /// Max Skill Name length -#define SKILL_DESC_LENGTH 31 /// Max Skill Desc length +#define SKILL_NAME_LENGTH 40 /// Max Skill Name length +#define SKILL_DESC_LENGTH 40 /// Max Skill Desc length /// Used with tracking the hitcount of Earthquake for skills that can avoid the first attack #define NPC_EARTHQUAKE_FLAG 0x800 diff --git a/src/map/status.cpp b/src/map/status.cpp index 06621064ee..013721ee92 100644 --- a/src/map/status.cpp +++ b/src/map/status.cpp @@ -4173,6 +4173,10 @@ int status_calc_pc_sub(map_session_data* sd, uint8 opt) if ((skill = pc_checkskill(sd, NW_GRENADE_MASTERY)) > 0) base_status->con += skill; +// ----- SPELL CALCULATION ----- + if ((skill = pc_checkskill(sd, SOA_SOUL_MASTERY)) > 0) + base_status->spl += skill; + // ------ ATTACK CALCULATION ------ // Base batk value is set in status_calc_misc @@ -4389,6 +4393,8 @@ int status_calc_pc_sub(map_session_data* sd, uint8 opt) base_status->smatk += skill; if ((skill = pc_checkskill(sd, NW_P_F_I)) > 0 && (sd->status.weapon >= W_REVOLVER && sd->status.weapon <= W_GRENADE)) base_status->patk += skill + 2; + if ((skill = pc_checkskill(sd, SOA_TALISMAN_MASTERY)) > 0) + base_status->smatk += skill; // 2-Handed Staff Mastery if( sd->status.weapon == W_2HSTAFF && ( skill = pc_checkskill( sd, AG_TWOHANDSTAFF ) ) > 0 ){ @@ -4864,6 +4870,28 @@ int status_calc_pc_sub(map_session_data* sd, uint8 opt) } if (sc->getSCE(SC_PORK_RIB_STEW)) sd->dsprate -= 2; + if( sc->getSCE(SC_TALISMAN_OF_FIVE_ELEMENTS) ) { + const std::vector elements = { ELE_FIRE, ELE_WATER, ELE_WIND, ELE_EARTH, ELE_NEUTRAL }; + int bonus = sc->getSCE(SC_TALISMAN_OF_FIVE_ELEMENTS)->val2; + + for( const auto &element : elements ){ + sd->indexed_bonus.magic_atk_ele[element] += bonus; + sd->right_weapon.addele[element] += bonus; + if( !battle_config.left_cardfix_to_right ){ + sd->left_weapon.addele[element] += bonus; + } + } + } + if( sc->getSCE(SC_HEAVEN_AND_EARTH) ) { + i = sc->getSCE(SC_HEAVEN_AND_EARTH)->val2; + sd->right_weapon.addele[ELE_ALL] += i; + if( !battle_config.left_cardfix_to_right ){ + sd->left_weapon.addele[ELE_ALL] += i; + } + sd->indexed_bonus.magic_atk_ele[ELE_ALL] += i; + sd->bonus.short_attack_atk_rate += i; + sd->bonus.long_attack_atk_rate += i; + } } status_cpy(&sd->battle_status, base_status); @@ -8534,6 +8562,8 @@ static signed short status_calc_patk(struct block_list *bl, status_change *sc, i } if (sc->getSCE(SC_HIDDEN_CARD)) patk += sc->getSCE(SC_HIDDEN_CARD)->val2; + if (sc->getSCE(SC_TALISMAN_OF_WARRIOR)) + patk += sc->getSCE(SC_TALISMAN_OF_WARRIOR)->val2; return (short)cap_value(patk, 0, SHRT_MAX); } @@ -8561,6 +8591,10 @@ static signed short status_calc_smatk(struct block_list *bl, status_change *sc, if( sc->getSCE( SC_ATTACK_STANCE ) ){ smatk += sc->getSCE( SC_ATTACK_STANCE )->val3; } + if (sc->getSCE(SC_TALISMAN_OF_MAGICIAN)) + smatk += sc->getSCE(SC_TALISMAN_OF_MAGICIAN)->val2; + if (sc->getSCE(SC_T_FIFTH_GOD)) + smatk += sc->getSCE(SC_T_FIFTH_GOD)->val2; return (short)cap_value(smatk, 0, SHRT_MAX); } @@ -12764,6 +12798,24 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty val2 = 3 * val1; val3 = 10 * val1; break; + case SC_TALISMAN_OF_PROTECTION: + val2 = 2 * val1; + val4 = tick / 3000; + tick_time = 3000; + break; + case SC_TALISMAN_OF_WARRIOR: + case SC_TALISMAN_OF_MAGICIAN: + val2 = 2 * val1; + break; + case SC_T_FIFTH_GOD: + val2 = 5 * val1; + break; + case SC_TALISMAN_OF_FIVE_ELEMENTS: + val2 = 4 * val1; + break; + case SC_HEAVEN_AND_EARTH: + val2 = 5 + 2 * val1; + break; default: if (calc_flag.none() && scdb->skill_id == 0 && scdb->icon == EFST_BLANK && scdb->opt1 == OPT1_NONE && scdb->opt2 == OPT2_NONE && scdb->state.none() && scdb->flag.none() && scdb->endonstart.empty() && scdb->endreturn.empty() && scdb->fail.empty() && scdb->endonend.empty()) { @@ -14923,6 +14975,13 @@ TIMER_FUNC(status_change_timer){ } sc_timer_next(500 + tick); return 0; + case SC_TALISMAN_OF_PROTECTION: + if (--(sce->val4) >= 0) { + skill_castend_nodamage_id(bl, bl, SOA_TALISMAN_OF_PROTECTION, sce->val1, tick, 1); + sc_timer_next(3000 + tick); + return 0; + } + break; } // If status has an interval and there is at least 100ms remaining time, wait for next interval diff --git a/src/map/status.hpp b/src/map/status.hpp index 16b7cc6381..e347cc1055 100644 --- a/src/map/status.hpp +++ b/src/map/status.hpp @@ -1305,6 +1305,19 @@ enum sc_type : int16 { SC_AUTO_FIRING_LAUNCHER, SC_HIDDEN_CARD, + // Soul Ascetic + SC_TALISMAN_OF_PROTECTION, + SC_TALISMAN_OF_WARRIOR, + SC_TALISMAN_OF_MAGICIAN, + SC_TALISMAN_OF_FIVE_ELEMENTS, + SC_T_FIRST_GOD, + SC_T_SECOND_GOD, + SC_T_THIRD_GOD, + SC_T_FOURTH_GOD, + SC_T_FIFTH_GOD, + SC_HEAVEN_AND_EARTH, + SC_TOTEM_OF_TUTELARY, + #ifdef RENEWAL SC_EXTREMITYFIST2, //! NOTE: This SC should be right before SC_MAX, so it doesn't disturb if RENEWAL is disabled #endif