Implemented Soul Ascetic

Taken from #7024
This commit is contained in:
munkrej 2024-03-11 00:17:23 +01:00 committed by Lemongrass3110
parent 3b6c3b61c0
commit ddf9270967
10 changed files with 1199 additions and 4 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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
};

View File

@ -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

View File

@ -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;

View File

@ -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

View File

@ -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<e_element> 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

View File

@ -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