Compare commits

...

23 Commits

Author SHA1 Message Date
Lemongrass3110
9afae11288 Refactor SOA_TALISMAN_OF_PROTECTION 2024-03-11 23:51:28 +01:00
Lemongrass3110
010e6fa2ea Merge branch 'master' into class/soul_ascetic
# Conflicts:
#	db/re/status.yml
2024-03-11 21:31:27 +01:00
Lemongrass3110
73b87c7112 Merge branch 'class/soul_ascetic' of https://github.com/rathena/rathena into class/soul_ascetic 2024-03-11 21:30:36 +01:00
Lemongrass3110
8527156720
Apply suggestions from code review
Confirmed by @datawulf
2024-03-11 11:14:51 +01:00
Lemongrass3110
a8ca35ab32
Apply suggestions from code review
Confirmed by @datawulf
2024-03-11 10:27:08 +01:00
Lemongrass3110
8d4abecbbc Cleaned up script_constants.hpp 2024-03-11 02:15:16 +01:00
Lemongrass3110
0e6f14f5f0 Cleaned up SC_TALISMAN_OF_PROTECTION 2024-03-11 02:07:26 +01:00
Lemongrass3110
693882b2fc Cleaned up UNT_TOTEM_OF_TUTELARY 2024-03-11 02:02:23 +01:00
Lemongrass3110
a008a7fb14 Moved cases to the bottom of the switch in skill_castend_pos2 2024-03-11 02:02:23 +01:00
Lemongrass3110
94e425db96 Moved cases to the bottom of the switch in skill_castend_nodamage_id 2024-03-11 02:02:22 +01:00
Lemongrass3110
15fbec467b Cleaned up SOA_TALISMAN_OF_WARRIOR & MAGICIAN & FIVE_ELEMENTS 2024-03-11 02:02:22 +01:00
Lemongrass3110
528022aaec Cleaned up SOA_TALISMAN_OF_PROTECTION 2024-03-11 02:02:22 +01:00
Lemongrass3110
f71dba456c Cleaned up SOA_SOUL_GATHERING 2024-03-11 02:02:22 +01:00
Lemongrass3110
235e424458 Cleaned up SOA_SOUL_OF_HEAVEN_AND_EARTH 2024-03-11 02:02:21 +01:00
Lemongrass3110
bc393a056b Cleaned up SOA_TALISMAN_OF_WHITE_TIGER 2024-03-11 02:02:21 +01:00
Lemongrass3110
d05e09ad88 Cleaned up SOA_EXORCISM_OF_MALICIOUS_SOUL 2024-03-11 02:02:21 +01:00
Lemongrass3110
9ab262a39e Cleaned up SOA_TALISMAN_OF_SOUL_STEALING 2024-03-11 02:02:21 +01:00
Lemongrass3110
17c56188a3 Cleaned up SOA_TALISMAN_OF_BLUE_DRAGON 2024-03-11 02:02:20 +01:00
Lemongrass3110
25c7fee3f5 Cleaned up SOA_CIRCLE_OF_DIRECTIONS_AND_ELEMENTALS 2024-03-11 02:02:20 +01:00
Lemongrass3110
e0ffe512c3 Cleaned up battle.cpp 2024-03-11 02:02:20 +01:00
Lemongrass3110
2b6de01960 Moved cases to the bottom of the switch in battle_calc_magic_attack 2024-03-11 02:02:20 +01:00
Lemongrass3110
ccb646d12c Added checks for the length of a skill's name and description 2024-03-11 02:02:20 +01:00
munkrej
ddf9270967 Implemented Soul Ascetic
Taken from #7024
2024-03-11 02:02:19 +01:00
10 changed files with 1265 additions and 8 deletions

View File

@ -41847,6 +41847,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

@ -8883,3 +8883,79 @@ Body:
NoBanishingBuster: true
NoDispell: true
NoClearance: 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
Fail:
T_Second_God: true
T_Third_God: true
T_Fourth_God: true
T_Fifth_God: true
- 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

@ -7554,6 +7554,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
@ -8487,6 +8501,72 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
skillratio += 5 * sstatus->spl;
RE_LVL_DMOD(100);
break;
case SOA_EXORCISM_OF_MALICIOUS_SOUL:
skillratio += -100 + 150 * skill_lv;
skillratio += 5 * sstatus->spl;
if (tsc && tsc->getSCE(SC_SOULCURSE))
skillratio += 100 * skill_lv;
if( sd ){
skillratio += pc_checkskill(sd, SOA_SOUL_MASTERY) * 2;
skillratio *= sd->soulball_old;
}
// TODO: needs confirmation if this bonus is extra and how high it actually is [munkrej]
if (sc && sc->getSCE(SC_TOTEM_OF_TUTELARY))
skillratio += skillratio * 50 / 100;
RE_LVL_DMOD(100);
break;
case SOA_TALISMAN_OF_BLUE_DRAGON:
skillratio += -100 + 250 + 1450 * skill_lv;
skillratio += pc_checkskill(sd, SOA_TALISMAN_MASTERY) * 15 * skill_lv;
skillratio += 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 * skill_lv;
skillratio += pc_checkskill(sd, SOA_TALISMAN_MASTERY) * 15 * skill_lv;
skillratio += 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 * skill_lv;
skillratio += pc_checkskill(sd, SOA_TALISMAN_MASTERY) * 15 * skill_lv;
skillratio += 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 * skill_lv;
skillratio += pc_checkskill(sd, SOA_TALISMAN_MASTERY) * 15 * skill_lv;
skillratio += 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 * skill_lv;
skillratio += pc_checkskill(sd, SOA_TALISMAN_MASTERY) * 15 * skill_lv;
skillratio += pc_checkskill(sd, SOA_SOUL_MASTERY) * 15 * skill_lv;
skillratio += 5 * sstatus->spl;
RE_LVL_DMOD(100);
break;
case SOA_TALISMAN_OF_FOUR_BEARING_GOD:
skillratio += -100 + 50 + 250 * skill_lv;
skillratio += pc_checkskill(sd, SOA_TALISMAN_MASTERY) * 15 * skill_lv;
skillratio += 5 * sstatus->spl;
RE_LVL_DMOD(100);
break;
case SOA_TALISMAN_OF_SOUL_STEALING:
skillratio += -100 + 500 + 1250 * skill_lv;
skillratio += pc_checkskill(sd, SOA_TALISMAN_MASTERY) * 7 * skill_lv;
skillratio += pc_checkskill(sd, SOA_SOUL_MASTERY) * 7 * skill_lv;
skillratio += 5 * sstatus->spl;
RE_LVL_DMOD(100);
break;
}
if (sc) {// Insignia's increases the damage of offensive magic by a fixed percentage depending on the element.

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

@ -1910,6 +1910,17 @@
export_constant(SC_GRENADE_FRAGMENT_6);
export_constant(SC_AUTO_FIRING_LAUNCHER);
export_constant(SC_HIDDEN_CARD);
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);

View File

@ -570,6 +570,13 @@ int skill_calc_heal(struct block_list *src, struct block_list *target, uint16 sk
hp_bonus += skill * 2;
#endif
break;
case SOA_TALISMAN_OF_PROTECTION:
hp = 500 * skill_lv;
hp += pc_checkskill( sd, SOA_TALISMAN_MASTERY ) * 50 * skill_lv;
hp += ( status_get_lv( src ) + status_get_crt( src ) ) * 20;
break;
default:
if (skill_lv >= battle_config.max_heal_lv)
return battle_config.max_heal;
@ -5721,6 +5728,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 +5804,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 +5937,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_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,skill_get_sc(skill_id),100,skill_lv,skill_get_time(skill_id,skill_lv));
break;
}
// if skill damage should be split among targets, count them
@ -7129,6 +7154,21 @@ 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);
sc_start(src,src,skill_get_sc(skill_id), 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, 2);
}
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,
@ -8058,6 +8098,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
case DK_SERVANTWEAPON:
case ABC_FROM_THE_ABYSS:
case SOA_TALISMAN_OF_PROTECTION:
clif_skill_nodamage(src, bl, skill_id, skill_lv, sc_start2(src, bl, type, 100, skill_lv, src->id, skill_get_time(skill_id, skill_lv)));
break;
@ -8616,6 +8657,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;
@ -8644,6 +8687,24 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
hom_addspiritball(hd, MAX_SPIRITBALL);
}
// TODO: refactor the ifs above into the switch below
switch( skill_id ){
case SOA_EXORCISM_OF_MALICIOUS_SOUL:
if( sd != nullptr ){
// Remove old souls if any exist.
sd->soulball_old = sd->soulball;
pc_delsoulball( sd, sd->soulball, 0 );
}
break;
case SOA_TALISMAN_OF_WHITE_TIGER:
if (sc && sc->getSCE(SC_T_FIRST_GOD)) {
sc_start(src, src, skill_get_sc(skill_id), 100, skill_lv, skill_get_time(skill_id, skill_lv));
}
break;
}
skill_area_temp[1] = 0;
clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
i = map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), starget,
@ -8839,12 +8900,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( skill_id == SOA_SOUL_OF_HEAVEN_AND_EARTH ){
if( src != bl && 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)
@ -12960,6 +13028,34 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
clif_skill_nodamage(src, src, skill_id, skill_lv, 1);
break;
case SOA_SOUL_GATHERING:
clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);
if( sd != nullptr ){
int limit = 5 + pc_checkskill(sd, SP_SOULENERGY) * 3;
for (i = 0; i < limit; i++)
pc_addsoulball(sd,limit);
}
break;
case SOA_TALISMAN_OF_WARRIOR:
case SOA_TALISMAN_OF_MAGICIAN:
case SOA_TALISMAN_OF_FIVE_ELEMENTS:
if( dstsd != nullptr ){
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;
}
}
if( sd != nullptr ){
clif_skill_fail(sd, skill_id, USESKILL_FAIL_NEED_WEAPON, 0);
}
break;
default: {
std::shared_ptr<s_skill_db> skill = skill_db.find(skill_id);
ShowWarning("skill_castend_nodamage_id: missing code case for skill %s(%d)\n", skill ? skill->name : "UNKNOWN", skill_id);
@ -13911,6 +14007,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
case EM_VENOM_SWAMP:
case EM_CONFLAGRATION:
case EM_TERRA_DRIVE:
case SOA_TOTEM_OF_TUTELARY:
flag|=1;//Set flag to 1 to prevent deleting ammo (it will be deleted on group-delete).
[[fallthrough]];
case GS_GROUNDDRIFT: //Ammo should be deleted right away.
@ -14688,6 +14785,13 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
}
break;
case SOA_TALISMAN_OF_BLACK_TORTOISE:
if (sc && sc->getSCE(SC_T_THIRD_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;
default:
ShowWarning("skill_castend_pos2: Unknown skill used:%d\n",skill_id);
return 1;
@ -16675,6 +16779,32 @@ 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;
hp += 500 * sg->skill_lv;
hp += 50 * pc_checkskill( tsd, SOA_TALISMAN_MASTERY ) * sg->skill_lv;
hp += 50 * status_get_crt( ss ) * sg->skill_lv;
hp *= status_get_lv( ss ) / 100;
int sp = 0;
sp += 50 * sg->skill_lv;
sp += 5 * pc_checkskill( BL_CAST( BL_PC, ss ), SOA_TALISMAN_MASTERY ) * sg->skill_lv;
sp += 5 * tstatus->crt * sg->skill_lv;
sp *= 100 + status_get_lv( ss );
sp /= 150;
status_heal( bl, hp, sp, 0, 2 );
}
sc_start( ss, bl, skill_get_sc( sg->skill_id ), 100, sg->skill_lv, sg->interval + 100 );
}
break;
}
if (bl->type == BL_MOB && ss != bl)
@ -18080,6 +18210,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) || sc->getSCE(SC_T_FIFTH_GOD)))) {
clif_skill_fail(sd,skill_id,USESKILL_FAIL_CONDITION,0);
return false;
}
break;
}
/* check state required */
@ -18333,6 +18476,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;
@ -23812,18 +23956,28 @@ uint64 SkillDatabase::parseBodyNode(const ryml::NodeRef& node) {
if (!this->asString(node, "Name", name))
return 0;
if( name.length() > SKILL_NAME_LENGTH ){
this->invalidWarning( node["Name"], "Name \"%s\" exceeds maximum length of %d.\n", name.c_str(), SKILL_NAME_LENGTH );
return 0;
}
name.resize(SKILL_NAME_LENGTH);
memcpy(skill->name, name.c_str(), sizeof(skill->name));
}
if (this->nodeExists(node, "Description")) {
std::string name;
std::string desc;
if (!this->asString(node, "Description", name))
if (!this->asString(node, "Description", desc))
return 0;
name.resize(SKILL_DESC_LENGTH);
memcpy(skill->desc, name.c_str(), sizeof(skill->desc));
if( desc.length() > SKILL_DESC_LENGTH ){
this->invalidWarning( node["Description"], "Description \"%s\" exceeds maximum length of %d.\n", desc.c_str(), SKILL_DESC_LENGTH );
return 0;
}
desc.resize(SKILL_DESC_LENGTH);
memcpy(skill->desc, desc.c_str(), sizeof(skill->desc));
}
if (this->nodeExists(node, "MaxLevel")) {

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);
}
@ -9440,6 +9474,7 @@ static int status_get_sc_interval(enum sc_type type)
return 1000;
case SC_BURNING:
case SC_PYREXIA:
case SC_TALISMAN_OF_PROTECTION:
return 3000;
case SC_MAGICMUSHROOM:
return 4000;
@ -12764,6 +12799,23 @@ 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:
tick_time = status_get_sc_interval(type);
val4 = tick - tick_time; // Remaining time
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,24 @@ TIMER_FUNC(status_change_timer){
}
sc_timer_next(500 + tick);
return 0;
case SC_TALISMAN_OF_PROTECTION:
if( sce->val4 >= 0 ){
// Get the original caster
map_session_data* ssd = map_id2sd( sce->val2 );
// If the caster is offline, dead, on another map or
// if the target is not a player or is in another party
if( ssd == nullptr || status_isdead( &ssd->bl ) || ssd->bl.m != bl->m || sd == nullptr || ssd->status.party_id != sd->status.party_id ){
// End the status change
sce->val4 = 0;
break;
}
int hp = skill_calc_heal( &ssd->bl, bl, SOA_TALISMAN_OF_PROTECTION, sce->val1, true );
status_heal( bl, hp, 0, 0, 2 );
}
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