From c8db7d3aa1fef25dfe7137f9842f9ce9f74a2063 Mon Sep 17 00:00:00 2001 From: aleos Date: Tue, 12 Apr 2022 12:04:57 -0400 Subject: [PATCH] 4th Class Job Improvement Bundle * This includes several updates in accordance to Gravity's patch for 4th classes. * Changelog: https://ro.gnjoy.com/news/notice/View.asp?BBSMode=10001&seq=7462&curpage=1 * Additional Changelog: https://ro.gnjoy.com/news/notice/View.asp?BBSMode=10001&seq=7468&curpage=1 --- db/re/skill_db.yml | 487 +++++++++++++++++++---------------- db/re/status.yml | 11 +- src/map/battle.cpp | 214 +++++++++------ src/map/script_constants.hpp | 2 + src/map/skill.cpp | 28 +- src/map/status.cpp | 26 +- src/map/status.hpp | 3 + 7 files changed, 456 insertions(+), 315 deletions(-) diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index 2fabc229fe..6a33b93d69 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -21984,15 +21984,15 @@ Body: Element: Weapon CastTime: - Level: 1 - Time: 100 + Time: 120 - Level: 2 - Time: 200 + Time: 140 - Level: 3 - Time: 300 + Time: 160 - Level: 4 - Time: 400 + Time: 180 - Level: 5 - Time: 500 + Time: 200 Requires: SpCost: - Level: 1 @@ -22169,11 +22169,11 @@ Body: - Level: 2 Area: 1 - Level: 3 - Area: 1 + Area: 2 - Level: 4 Area: 2 - Level: 5 - Area: 2 + Area: 3 CastTime: - Level: 1 Time: 1000 @@ -22185,18 +22185,18 @@ Body: Time: 1800 - Level: 5 Time: 2000 - AfterCastActDelay: 1000 + AfterCastActDelay: 500 Cooldown: - Level: 1 - Time: 100 + Time: 110 - Level: 2 - Time: 150 + Time: 120 - Level: 3 - Time: 200 + Time: 130 - Level: 4 - Time: 250 + Time: 140 - Level: 5 - Time: 300 + Time: 150 FixedCastTime: - Level: 1 Time: 500 @@ -22982,7 +22982,7 @@ Body: TargetType: Attack DamageFlags: Splash: true - Range: 1 + Range: 2 Hit: Single HitCount: 1 Element: Weapon @@ -23931,13 +23931,13 @@ Body: - Level: 2 Area: 1 - Level: 3 - Area: 1 + Area: 2 - Level: 4 Area: 2 - Level: 5 - Area: 2 + Area: 3 ActiveInstance: 11 - Cooldown: 2000 + Cooldown: 1700 Requires: SpCost: - Level: 1 @@ -23968,23 +23968,23 @@ Body: - Level: 1 Amount: 20 - Level: 2 - Amount: 20 + Amount: 22 - Level: 3 - Amount: 20 + Amount: 24 - Level: 4 - Amount: 20 + Amount: 26 - Level: 5 - Amount: 20 + Amount: 28 - Level: 6 - Amount: 25 + Amount: 30 - Level: 7 - Amount: 25 + Amount: 32 - Level: 8 - Amount: 25 + Amount: 34 - Level: 9 - Amount: 25 + Amount: 36 - Level: 10 - Amount: 25 + Amount: 38 Weapon: 1hSpear: true 2hSpear: true @@ -24384,25 +24384,25 @@ Body: Requires: SpCost: - Level: 1 - Amount: 30 + Amount: 45 - Level: 2 - Amount: 40 - - Level: 3 Amount: 50 + - Level: 3 + Amount: 55 - Level: 4 Amount: 60 - Level: 5 - Amount: 70 + Amount: 65 - Level: 6 - Amount: 80 + Amount: 70 - Level: 7 - Amount: 90 + Amount: 75 - Level: 8 - Amount: 100 + Amount: 80 - Level: 9 - Amount: 110 + Amount: 85 - Level: 10 - Amount: 120 + Amount: 90 - Id: 2322 Name: LG_PIETY Description: Piety @@ -24496,15 +24496,15 @@ Body: Time: 15000 Cooldown: - Level: 1 - Time: 7000 + Time: 6500 - Level: 2 - Time: 6000 + Time: 5500 - Level: 3 - Time: 5000 + Time: 4500 - Level: 4 - Time: 4000 + Time: 3500 - Level: 5 - Time: 3000 + Time: 2500 Requires: SpCost: - Level: 1 @@ -24529,9 +24529,8 @@ Body: HitCount: 3 Element: Weapon CastCancel: true - CastTime: 1000 - AfterCastActDelay: 3000 - Cooldown: 20000 + AfterCastActDelay: 500 + Cooldown: 200 Requires: SpCost: - Level: 1 @@ -34412,6 +34411,8 @@ Body: TargetType: Attack DamageFlags: Critical: true + Splash: true + SplashArea: 4 Range: 1 Hit: Single HitCount: 1 @@ -34574,6 +34575,7 @@ Body: Element: Weapon CastCancel: true AfterCastActDelay: 500 + Cooldown: 350 Requires: SpCost: - Level: 1 @@ -34619,19 +34621,19 @@ Body: - Level: 3 Area: 1 - Level: 4 - Area: 1 + Area: 2 - Level: 5 Area: 2 - Level: 6 Area: 2 - Level: 7 - Area: 2 + Area: 3 - Level: 8 - Area: 2 + Area: 3 - Level: 9 Area: 3 - Level: 10 - Area: 3 + Area: 4 Requires: SpCost: 1 - Id: 5210 @@ -34678,7 +34680,7 @@ Body: GiveAp: 2 CastCancel: true AfterCastActDelay: 500 - Cooldown: 2000 + Cooldown: 350 FixedCastTime: 500 Requires: SpCost: @@ -34756,19 +34758,19 @@ Body: GiveAp: 1 CastCancel: true AfterCastActDelay: 500 - Cooldown: 1000 + Cooldown: 350 Requires: SpCost: - Level: 1 - Amount: 30 - - Level: 2 - Amount: 35 - - Level: 3 Amount: 40 - - Level: 4 + - Level: 2 Amount: 45 - - Level: 5 + - Level: 3 Amount: 50 + - Level: 4 + Amount: 55 + - Level: 5 + Amount: 60 Weapon: 2hSword: true 2hAxe: true @@ -34909,6 +34911,7 @@ Body: Hit: Single HitCount: 1 Element: Dark + GiveAp: 4 CastCancel: true CastTime: 4000 AfterCastActDelay: 1000 @@ -35497,7 +35500,7 @@ Body: FixedCastTime: 4000 Requires: SpCost: 60 - ApCost: 200 + ApCost: 150 Status: Climax - Id: 5233 Name: AG_ROCK_DOWN @@ -35511,12 +35514,22 @@ Body: Hit: Multi_Hit HitCount: -5 Element: Earth - SplashArea: 1 - GiveAp: 4 + SplashArea: + - Level: 1 + Area: 2 + - Level: 2 + Area: 2 + - Level: 3 + Area: 2 + - Level: 4 + Area: 3 + - Level: 5 + Area: 3 + GiveAp: 1 CastCancel: true CastTime: 4000 - AfterCastActDelay: 1000 - Cooldown: 4000 + AfterCastActDelay: 500 + Cooldown: 300 FixedCastTime: 1500 Requires: SpCost: @@ -35542,11 +35555,11 @@ Body: Element: Wind SplashArea: 1 ActiveInstance: 14 - GiveAp: 4 + GiveAp: 1 CastCancel: true CastTime: 4000 - AfterCastActDelay: 1000 - Cooldown: 4000 + AfterCastActDelay: 500 + Cooldown: 300 FixedCastTime: 1500 Requires: SpCost: @@ -35572,11 +35585,11 @@ Body: Element: Fire SplashArea: 1 ActiveInstance: 14 - GiveAp: 4 + GiveAp: 1 CastCancel: true CastTime: 4000 - AfterCastActDelay: 1000 - Cooldown: 4000 + AfterCastActDelay: 500 + Cooldown: 300 FixedCastTime: 1500 Requires: SpCost: @@ -35596,10 +35609,23 @@ Body: MaxLevel: 5 Type: Magic TargetType: Attack + DamageFlags: + Splash: true Range: 9 Hit: Multi_Hit - HitCount: -2 + HitCount: 1 Element: Fire + SplashArea: + - Level: 1 + Area: 2 + - Level: 2 + Area: 2 + - Level: 3 + Area: 2 + - Level: 4 + Area: 3 + - Level: 5 + Area: 3 Requires: SpCost: 1 - Id: 5237 @@ -35615,20 +35641,20 @@ Body: Element: Water SplashArea: - Level: 1 - Area: 2 - - Level: 2 - Area: 2 - - Level: 3 - Area: 3 - - Level: 4 - Area: 3 - - Level: 5 Area: 4 - GiveAp: 4 + - Level: 2 + Area: 4 + - Level: 3 + Area: 5 + - Level: 4 + Area: 5 + - Level: 5 + Area: 6 + GiveAp: 1 CastCancel: true CastTime: 4000 - AfterCastActDelay: 1000 - Cooldown: 4000 + AfterCastActDelay: 500 + Cooldown: 300 FixedCastTime: 1500 Requires: SpCost: @@ -35759,7 +35785,7 @@ Body: Time: 6000 - Level: 5 Time: 7000 - Cooldown: 5000 + Cooldown: 3000 Requires: SpCost: - Level: 1 @@ -35822,6 +35848,7 @@ Body: TargetType: Self DamageFlags: Splash: true + Critical: true Range: 9 Hit: Single HitCount: 1 @@ -35843,6 +35870,7 @@ Body: TargetType: Self DamageFlags: Splash: true + Critical: true Range: 9 Hit: Single HitCount: 1 @@ -35858,10 +35886,9 @@ Body: Area: 3 - Level: 5 Area: 4 - GiveAp: 5 + GiveAp: 4 CastCancel: true - AfterCastActDelay: 500 - Cooldown: 5000 + Cooldown: 4000 Requires: SpCost: - Level: 1 @@ -35978,7 +36005,7 @@ Body: FixedCastTime: 1000 Requires: SpCost: 60 - ApCost: 100 + ApCost: 50 Status: First_Faith_Power: true Status: Second_Judge @@ -36110,9 +36137,10 @@ Body: TargetType: Attack DamageFlags: Splash: true + Critical: true Range: 3 Hit: Multi_Hit - HitCount: -2 + HitCount: 2 Element: Weapon SplashArea: - Level: 1 @@ -36187,7 +36215,7 @@ Body: Splash: true Range: 3 Hit: Multi_Hit - HitCount: -3 + HitCount: 5 Element: Weapon SplashArea: - Level: 1 @@ -36241,7 +36269,7 @@ Body: FixedCastTime: 1000 Requires: SpCost: 60 - ApCost: 150 + ApCost: 100 Status: Second_Judge: true Status: Third_Exor_Flame @@ -36275,6 +36303,7 @@ Body: Hit: Single HitCount: 1 SplashArea: 10 + GiveAp: 15 CastCancel: true CastTime: 2000 AfterCastActDelay: 500 @@ -36469,7 +36498,7 @@ Body: CastTime: 500 AfterCastActDelay: 500 Duration1: 10000 - Cooldown: 2000 + Cooldown: 1000 FixedCastTime: 500 Requires: SpCost: @@ -36495,17 +36524,17 @@ Body: TargetType: Attack DamageFlags: Splash: true - Range: 1 + Range: 3 Hit: Multi_Hit HitCount: 2 Element: Weapon SplashArea: 3 - GiveAp: 3 + GiveAp: 2 CastCancel: true CastTime: 1000 AfterCastActDelay: 500 - Cooldown: 3000 - FixedCastTime: 1000 + Cooldown: 1000 + FixedCastTime: 500 Requires: SpCost: - Level: 1 @@ -36546,7 +36575,7 @@ Body: AfterCastActDelay: 500 Duration1: 4500 Cooldown: 5000 - FixedCastTime: 1000 + FixedCastTime: 1500 Requires: SpCost: - Level: 1 @@ -36767,7 +36796,7 @@ Body: CastTime: 2000 AfterCastActDelay: 500 Duration1: 20000 - Cooldown: 3000 + Cooldown: 2000 FixedCastTime: 1000 Requires: SpCost: @@ -37097,6 +37126,7 @@ Body: TargetType: Attack DamageFlags: Splash: true + Critical: true Range: 2 Hit: Single HitCount: 1 @@ -37125,7 +37155,7 @@ Body: GiveAp: 2 CastCancel: true AfterCastActDelay: 500 - Cooldown: 2000 + Cooldown: 1000 Requires: SpCost: - Level: 1 @@ -37175,11 +37205,11 @@ Body: Area: 3 - Level: 5 Area: 3 - GiveAp: 3 + GiveAp: 1 CastCancel: true CastTime: 2000 AfterCastActDelay: 500 - Cooldown: 3000 + Cooldown: 300 FixedCastTime: 1000 Requires: SpCost: @@ -37276,12 +37306,12 @@ Body: Critical: true Range: 7 Hit: Multi_Hit - HitCount: -8 + HitCount: 3 Element: Weapon SplashArea: 1 CastCancel: true - AfterCastActDelay: 500 - Cooldown: 3000 + AfterCastActDelay: 300 + Cooldown: 1000 Requires: SpCost: - Level: 1 @@ -37306,7 +37336,6 @@ Body: Amount: 55 Weapon: Katar: true - State: Hidden - Id: 5288 Name: SHC_SHADOW_SENSE Description: Shadow Sense @@ -37326,7 +37355,7 @@ Body: CastCancel: true AfterCastActDelay: 500 Duration1: 3000 - Cooldown: 1500 + Cooldown: 750 Requires: SpCost: 40 Status: @@ -37402,10 +37431,10 @@ Body: Hit: Multi_Hit HitCount: 1 Element: Weapon - GiveAp: 3 + GiveAp: 1 CastCancel: true AfterCastActDelay: 500 - Cooldown: 3000 + Cooldown: 1000 Requires: SpCost: - Level: 1 @@ -37538,11 +37567,11 @@ Body: Area: 2 - Level: 5 Area: 3 - GiveAp: 2 + GiveAp: 3 CastCancel: true AfterCastActDelay: 500 - Duration1: 5000 - Cooldown: 2000 + Duration1: 10000 + Cooldown: 1000 Requires: SpCost: - Level: 1 @@ -37596,10 +37625,33 @@ Body: Area: 3 CastCancel: true AfterCastActDelay: 500 + Duration1: + - Level: 1 + Time: 30000 + - Level: 2 + Time: 60000 + - Level: 3 + Time: 90000 + - Level: 4 + Time: 120000 + - Level: 5 + Time: 150000 + - Level: 6 + Time: 180000 + - Level: 7 + Time: 210000 + - Level: 8 + Time: 240000 + - Level: 9 + Time: 270000 + - Level: 10 + Time: 300000 + Duration2: 30000 Cooldown: 60000 Requires: SpCost: 150 ApCost: 150 + Status: Rush_Quake1 - Id: 5297 Name: MT_M_MACHINE Description: Manufacture Machine @@ -37747,6 +37799,7 @@ Body: ActiveInstance: 1 GiveAp: 20 CastCancel: true + CastTime: 1000 AfterCastActDelay: 500 Duration1: - Level: 1 @@ -37757,8 +37810,8 @@ Body: Time: 240000 - Level: 4 Time: 300000 - Cooldown: 60000 - FixedCastTime: 3000 + Cooldown: 30000 + FixedCastTime: 1000 Requires: SpCost: - Level: 1 @@ -37787,6 +37840,7 @@ Body: ActiveInstance: 1 GiveAp: 20 CastCancel: true + CastTime: 1000 AfterCastActDelay: 500 Duration1: - Level: 1 @@ -37797,8 +37851,8 @@ Body: Time: 240000 - Level: 4 Time: 300000 - Cooldown: 60000 - FixedCastTime: 3000 + Cooldown: 30000 + FixedCastTime: 1000 Requires: SpCost: - Level: 1 @@ -37827,6 +37881,7 @@ Body: ActiveInstance: 1 GiveAp: 20 CastCancel: true + CastTime: 1000 AfterCastActDelay: 500 Duration1: - Level: 1 @@ -37837,8 +37892,8 @@ Body: Time: 240000 - Level: 4 Time: 300000 - Cooldown: 60000 - FixedCastTime: 3000 + Cooldown: 30000 + FixedCastTime: 1000 Requires: SpCost: - Level: 1 @@ -37866,6 +37921,7 @@ Body: HitCount: 1 ActiveInstance: 1 CastCancel: true + CastTime: 1000 AfterCastActDelay: 500 Duration1: - Level: 1 @@ -37877,7 +37933,7 @@ Body: - Level: 4 Time: 300000 Cooldown: 60000 - FixedCastTime: 3000 + FixedCastTime: 1000 Requires: SpCost: - Level: 1 @@ -38009,24 +38065,24 @@ Body: TargetType: Self DamageFlags: Splash: true - Hit: Single - HitCount: 1 + Hit: Multi_Hit + HitCount: 2 Element: Weapon - SplashArea: 2 + SplashArea: 3 CastCancel: true AfterCastActDelay: 500 Duration1: - Level: 1 - Time: 2000 + Time: 3000 - Level: 2 - Time: 4000 - - Level: 3 Time: 6000 + - Level: 3 + Time: 9000 - Level: 4 - Time: 8000 + Time: 12000 - Level: 5 - Time: 10000 - Cooldown: 3000 + Time: 15000 + Cooldown: 300 Requires: SpCost: - Level: 1 @@ -38054,11 +38110,9 @@ Body: HitCount: 1 Element: Weapon CastCancel: true - CastTime: 1000 AfterCastActDelay: 500 Duration1: 20000 - Cooldown: 2000 - FixedCastTime: 1000 + Cooldown: 250 Requires: SpCost: - Level: 1 @@ -38098,7 +38152,7 @@ Body: CastCancel: true CastTime: 1000 AfterCastActDelay: 500 - Cooldown: 3000 + Cooldown: 1500 FixedCastTime: 1000 Requires: SpCost: @@ -38126,6 +38180,7 @@ Body: NoDamage: true Hit: Single HitCount: 1 + GiveAp: 20 CastCancel: true Duration1: - Level: 1 @@ -38140,15 +38195,15 @@ Body: Time: 150000 Duration2: - Level: 1 - Time: 10000 + Time: 3000 - Level: 2 - Time: 8000 + Time: 2500 - Level: 3 - Time: 6000 - - Level: 4 - Time: 4000 - - Level: 5 Time: 2000 + - Level: 4 + Time: 1500 + - Level: 5 + Time: 1000 Cooldown: 60000 Requires: SpCost: @@ -38175,7 +38230,7 @@ Body: CastCancel: true CastTime: 2000 AfterCastActDelay: 500 - Duration1: 60000 + Duration1: 300000 Cooldown: 60000 FixedCastTime: 1000 Requires: @@ -38243,7 +38298,7 @@ Body: GiveAp: 2 CastCancel: true AfterCastActDelay: 500 - Cooldown: 2000 + Cooldown: 300 Requires: SpCost: - Level: 1 @@ -38279,8 +38334,8 @@ Body: CastCancel: true CastTime: 2000 AfterCastActDelay: 500 - Duration1: 4000 - Cooldown: 4000 + Duration1: 3000 + Cooldown: 3000 FixedCastTime: 1000 Requires: SpCost: @@ -38297,7 +38352,7 @@ Body: Unit: Id: Abyss_Square Range: 3 - Interval: 700 + Interval: 300 Target: Enemy Flag: NoOverlap: true @@ -38311,40 +38366,40 @@ Body: DamageFlags: Critical: true Range: 9 - Hit: Multi_Hit - HitCount: -10 + Hit: Single + HitCount: 1 Element: Weapon - GiveAp: 2 + GiveAp: 1 CastCancel: true AfterCastActDelay: 500 - Cooldown: 2000 + Cooldown: 200 Requires: SpCost: - Level: 1 - Amount: 40 + Amount: 35 - Level: 2 Amount: 45 - Level: 3 - Amount: 50 - - Level: 4 Amount: 55 - - Level: 5 - Amount: 60 - - Level: 6 + - Level: 4 Amount: 65 - - Level: 7 - Amount: 70 - - Level: 8 + - Level: 5 Amount: 75 - - Level: 9 - Amount: 80 - - Level: 10 + - Level: 6 Amount: 85 + - Level: 7 + Amount: 95 + - Level: 8 + Amount: 105 + - Level: 9 + Amount: 115 + - Level: 10 + Amount: 125 Weapon: Bow: true Ammo: Arrow: true - AmmoAmount: 10 + AmmoAmount: 3 - Id: 5323 Name: WH_ADVANCED_TRAP Description: Advanced Trap @@ -38464,11 +38519,10 @@ Body: CastCancel: true CastTime: 800 AfterCastActDelay: 500 - Cooldown: 30000 FixedCastTime: 200 Requires: SpCost: 120 - ApCost: 50 + ApCost: 15 Weapon: Bow: true State: Falcon @@ -38922,7 +38976,7 @@ Body: Splash: true Range: 7 Hit: Multi_Hit - HitCount: -3 + HitCount: 5 Element: Water SplashArea: - Level: 1 @@ -38950,7 +39004,7 @@ Body: CastTime: 1000 AfterCastActDelay: 500 Duration1: 10000 - Cooldown: 2000 + Cooldown: 1000 FixedCastTime: 500 Requires: SpCost: @@ -38984,7 +39038,7 @@ Body: Splash: true Range: 7 Hit: Multi_Hit - HitCount: -3 + HitCount: 5 Element: Earth SplashArea: - Level: 1 @@ -39012,7 +39066,7 @@ Body: CastTime: 1000 AfterCastActDelay: 500 Duration1: 10000 - Cooldown: 2000 + Cooldown: 1000 FixedCastTime: 500 Requires: SpCost: @@ -39046,7 +39100,7 @@ Body: Splash: true Range: 7 Hit: Multi_Hit - HitCount: -3 + HitCount: 5 Element: Wind SplashArea: - Level: 1 @@ -39074,7 +39128,7 @@ Body: CastTime: 1000 AfterCastActDelay: 500 Duration1: 10000 - Cooldown: 2000 + Cooldown: 1000 FixedCastTime: 500 Requires: SpCost: @@ -39108,7 +39162,7 @@ Body: Splash: true Range: 7 Hit: Multi_Hit - HitCount: -3 + HitCount: 5 Element: Fire SplashArea: - Level: 1 @@ -39136,7 +39190,7 @@ Body: CastTime: 1000 AfterCastActDelay: 500 Duration1: 10000 - Cooldown: 2000 + Cooldown: 1000 FixedCastTime: 500 Requires: SpCost: @@ -39172,6 +39226,7 @@ Body: ActiveInstance: 1 GiveAp: 20 CastCancel: true + CastTime: 1000 AfterCastActDelay: 500 Duration1: - Level: 1 @@ -39185,7 +39240,7 @@ Body: - Level: 5 Time: 360000 Cooldown: 30000 - FixedCastTime: 4000 + FixedCastTime: 1000 Requires: SpCost: - Level: 1 @@ -39214,6 +39269,7 @@ Body: ActiveInstance: 1 GiveAp: 20 CastCancel: true + CastTime: 1000 AfterCastActDelay: 500 Duration1: - Level: 1 @@ -39227,7 +39283,7 @@ Body: - Level: 5 Time: 360000 Cooldown: 30000 - FixedCastTime: 4000 + FixedCastTime: 1000 Requires: SpCost: - Level: 1 @@ -39256,6 +39312,7 @@ Body: ActiveInstance: 1 GiveAp: 10 CastCancel: true + CastTime: 1000 AfterCastActDelay: 500 Duration1: - Level: 1 @@ -39269,7 +39326,7 @@ Body: - Level: 5 Time: 360000 Cooldown: 30000 - FixedCastTime: 4000 + FixedCastTime: 1000 Requires: SpCost: - Level: 1 @@ -39316,6 +39373,7 @@ Body: HitCount: 1 ActiveInstance: 1 CastCancel: true + CastTime: 1000 AfterCastActDelay: 500 Duration1: - Level: 1 @@ -39329,10 +39387,10 @@ Body: - Level: 5 Time: 180000 Cooldown: 60000 - FixedCastTime: 4000 + FixedCastTime: 1000 Requires: SpCost: 100 - ApCost: 100 + ApCost: 60 ItemCost: - Item: High_Plant_Bottle Amount: 3 @@ -39366,12 +39424,12 @@ Body: CastCancel: true CastTime: 2000 AfterCastActDelay: 500 - Duration1: 60000 - Cooldown: 120000 + Duration1: 150000 + Cooldown: 60000 FixedCastTime: 1000 Requires: SpCost: 250 - ApCost: 100 + ApCost: 125 Weapon: Bow: true Musical: true @@ -39410,25 +39468,25 @@ Body: Hit: Multi_Hit HitCount: -2 Element: Weapon - GiveAp: 5 + GiveAp: 3 CastCancel: true CastTime: 1000 AfterCastActDelay: 500 Duration1: 500 - Cooldown: 3000 + Cooldown: 500 FixedCastTime: 1000 Requires: SpCost: - Level: 1 - Amount: 215 + Amount: 105 - Level: 2 - Amount: 230 + Amount: 110 - Level: 3 - Amount: 245 + Amount: 115 - Level: 4 - Amount: 260 + Amount: 120 - Level: 5 - Amount: 275 + Amount: 125 Weapon: Bow: true Musical: true @@ -39491,15 +39549,15 @@ Body: Requires: SpCost: - Level: 1 - Amount: 80 + Amount: 66 - Level: 2 - Amount: 92 + Amount: 72 - Level: 3 - Amount: 104 + Amount: 78 - Level: 4 - Amount: 116 + Amount: 84 - Level: 5 - Amount: 128 + Amount: 90 Weapon: Bow: true Musical: true @@ -39529,20 +39587,20 @@ Body: - Level: 4 Area: 3 - Level: 5 - Area: 3 + Area: 4 GiveAp: - Level: 1 - Amount: 4 + Amount: 2 - Level: 2 - Amount: 4 + Amount: 2 - Level: 3 - Amount: 4 + Amount: 2 - Level: 4 - Amount: 5 + Amount: 3 - Level: 5 - Amount: 5 + Amount: 3 CastCancel: true - Cooldown: 1000 + Cooldown: 500 Requires: SpCost: - Level: 1 @@ -39575,15 +39633,15 @@ Body: Element: Weapon GiveAp: - Level: 1 - Amount: 2 + Amount: 1 - Level: 2 - Amount: 2 + Amount: 1 - Level: 3 - Amount: 2 + Amount: 1 - Level: 4 - Amount: 3 + Amount: 2 - Level: 5 - Amount: 3 + Amount: 2 CastCancel: true CastTime: 1000 Duration1: @@ -39598,7 +39656,6 @@ Body: - Level: 5 Time: 20000 Cooldown: 1000 - FixedCastTime: 1000 Requires: SpCost: - Level: 1 @@ -40029,7 +40086,7 @@ Body: CastCancel: true CastTime: 2000 AfterCastActDelay: 500 - Cooldown: 5000 + Cooldown: 2500 FixedCastTime: 1000 Requires: SpCost: @@ -40054,13 +40111,13 @@ Body: Hit: Multi_Hit HitCount: -5 Element: Water - GiveAp: 4 + GiveAp: 5 CastCancel: true CastTime: 4000 AfterCastActDelay: 500 Duration1: 100 Duration2: 10000 - Cooldown: 4000 + Cooldown: 2000 FixedCastTime: 1000 Requires: SpCost: @@ -40092,13 +40149,13 @@ Body: Hit: Single HitCount: 1 Element: Wind - GiveAp: 4 + GiveAp: 5 CastCancel: true CastTime: 4000 AfterCastActDelay: 500 - Duration1: 4000 + Duration1: 3000 Duration2: 10000 - Cooldown: 4000 + Cooldown: 2000 FixedCastTime: 1000 Requires: SpCost: @@ -40115,7 +40172,7 @@ Body: Unit: Id: Lightning_Land Range: 4 - Interval: 500 + Interval: 300 Target: Enemy Flag: NoOverlap: true @@ -40131,13 +40188,13 @@ Body: Hit: Single HitCount: 1 Element: Poison - GiveAp: 4 + GiveAp: 5 CastCancel: true CastTime: 4000 AfterCastActDelay: 500 - Duration1: 4000 + Duration1: 3000 Duration2: 20000 - Cooldown: 4000 + Cooldown: 2000 FixedCastTime: 1000 Requires: SpCost: @@ -40154,7 +40211,7 @@ Body: Unit: Id: Venom_Swamp Range: 4 - Interval: 500 + Interval: 300 Target: Enemy Flag: NoOverlap: true @@ -40170,13 +40227,13 @@ Body: Hit: Single HitCount: 1 Element: Fire - GiveAp: 4 + GiveAp: 5 CastCancel: true CastTime: 4000 AfterCastActDelay: 500 - Duration1: 4000 + Duration1: 3000 Duration2: 20000 - Cooldown: 4000 + Cooldown: 2000 FixedCastTime: 1000 Requires: SpCost: @@ -40193,7 +40250,7 @@ Body: Unit: Id: Conflagration Range: 4 - Interval: 500 + Interval: 300 Target: Enemy Flag: NoOverlap: true @@ -40209,13 +40266,13 @@ Body: Hit: Multi_Hit HitCount: -5 Element: Earth - GiveAp: 4 + GiveAp: 5 CastCancel: true CastTime: 4000 AfterCastActDelay: 500 Duration1: 100 Duration2: 10000 - Cooldown: 4000 + Cooldown: 2000 FixedCastTime: 1000 Requires: SpCost: @@ -40425,7 +40482,7 @@ Body: Range: 1 Hit: Single HitCount: 1 - SplashArea: 3 + SplashArea: 4 Requires: SpCost: 1 - Id: 5384 diff --git a/db/re/status.yml b/db/re/status.yml index 1da2ef2a1f..beb2b8c25f 100644 --- a/db/re/status.yml +++ b/db/re/status.yml @@ -7764,7 +7764,8 @@ Body: Icon: EFST_ATTACK_STANCE DurationLookup: IG_ATTACK_STANCE CalcFlags: - Watk: true + Patk: true + Smatk: true Def: true Flags: NoRemoveOnDead: true @@ -8109,3 +8110,11 @@ Body: All: true Flags: RemoveElementalOption: true + - Status: Rush_Quake1 + Icon: EFST_RUSH_QUAKE1 + DurationLookup: MT_RUSH_QUAKE + Flags: + BlEffect: true + - Status: Rush_Quake2 + Icon: EFST_RUSH_QUAKE2 + DurationLookup: MT_RUSH_QUAKE diff --git a/src/map/battle.cpp b/src/map/battle.cpp index 84bb235523..45000f2c8f 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -693,8 +693,6 @@ int battle_calc_cardfix(int attack_type, struct block_list *src, struct block_li } cardfix = cardfix * (100 + sd->indexed_bonus.magic_addsize[tstatus->size] + sd->indexed_bonus.magic_addsize[SZ_ALL]) / 100; cardfix = cardfix * (100 + sd->indexed_bonus.magic_addclass[tstatus->class_] + sd->indexed_bonus.magic_addclass[CLASS_ALL]) / 100; - if (sd->status.weapon == W_2HSTAFF)// 2-Handed Staff Mastery - cardfix = cardfix * (100 + pc_checkskill(sd, AG_TWOHANDSTAFF)) / 100; for (const auto &it : sd->add_mdmg) { if (it.id == t_class) { cardfix = cardfix * (100 + it.val) / 100; @@ -1537,6 +1535,9 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam if (sc->data[SC_SHADOW_SCAR])// Need official adjustment for this too. damage += damage * (10 * sc->data[SC_SHADOW_SCAR]->val1) / 100; + if (sc->data[SC_RUSH_QUAKE1] && (flag & BF_WEAPONMASK) == BF_WEAPON) + damage += damage * 50 / 100; + // Damage reductions // Assumptio increases DEF on RE mode, otherwise gives a reduction on the final damage. [Igniz] #ifndef RENEWAL @@ -1805,6 +1806,18 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam pc_addsoulball(tsd, 5 + 3 * pc_checkskill(tsd, SP_SOULENERGY)); } } + + if (sc->data[SC_RUSH_QUAKE2] && (flag & BF_WEAPONMASK) == BF_WEAPON) + damage += damage * (5 * sc->data[SC_RUSH_QUAKE2]->val1) / 100; + + if (sc->data[SC_SHADOW_EXCEED]) { + switch (skill_id) { + case SHC_ETERNAL_SLASH: + case SHC_SAVAGE_IMPACT: + damage += damage / 4; // !TODO: What's the damage increase? + break; + } + } } //End of caster SC_ check //PK damage rates @@ -2446,7 +2459,6 @@ static int battle_range_type(struct block_list *src, struct block_list *target, // Renewal changes to ranged physical damage #endif case SR_RAMPAGEBLASTER: - case DK_HACKANDSLASHER_ATK: // 2 cell cast range. return BF_LONG; case NJ_KIRIKAGE: // Cast range mimics NJ_SHADOWJUMP but damage is considered melee case GC_CROSSIMPACT: // Cast range is 7 cells and player jumps to target but skill is considered melee @@ -2463,6 +2475,17 @@ static int battle_range_type(struct block_list *src, struct block_list *target, if (sd && (sd->status.weapon == W_MACE || sd->status.weapon == W_2HMACE)) return BF_LONG; } + case DK_HACKANDSLASHER: + case DK_HACKANDSLASHER_ATK: { // Range depends on weapon type. + map_session_data *sd = BL_CAST(BL_PC, src); + + if (sd) { + if (sd->status.weapon == W_2HSWORD) + return BF_SHORT; + if (sd->status.weapon == W_2HSPEAR) + return BF_LONG; + } + } } //Skill Range Criteria @@ -2799,7 +2822,6 @@ static bool is_attack_critical(struct Damage* wd, struct block_list *src, struct #ifdef RENEWAL case ASC_BREAKER: #endif - case LG_CANNONSPEAR: case GC_CROSSIMPACT: case SHC_SAVAGE_IMPACT: case SHC_ETERNAL_SLASH: @@ -3012,7 +3034,7 @@ static bool is_attack_hitting(struct Damage* wd, struct block_list *src, struct hitrate += pc_checkskill(sd, GN_REMODELING_CART) * 4; break; case LG_BANISHINGPOINT: - hitrate += 3 * skill_lv; + hitrate += 5 * skill_lv; break; case GC_VENOMPRESSURE: hitrate += 10 + 4 * skill_lv; @@ -3611,6 +3633,8 @@ static void battle_calc_skill_base_damage(struct Damage* wd, struct block_list * damagevalue = damagevalue * (90 + 10 * pc_checkskill(sd, RK_DRAGONTRAINING)) / 100; if (sc && sc->data[SC_DRAGONIC_AURA])// Need official damage increase. [Rytech] damagevalue += damagevalue * 50 / 100; + if (pc_checkskill(sd, DK_DRAGONIC_AURA)) // !TODO: Confirm + damagevalue += damagevalue * (sstatus->patk + sstatus->pow) / 500; ATK_ADD(wd->damage, wd->damage2, damagevalue); #ifdef RENEWAL ATK_ADD(wd->weaponAtk, wd->weaponAtk2, damagevalue); @@ -4271,8 +4295,8 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * #else skillratio += 30 * skill_lv; #endif - if (sc && sc->data[SC_SHIELD_POWER])// Whats the official increase? [Rytech] - skillratio += skillratio * 50 / 100; + if (sc && sc->data[SC_SHIELD_POWER]) + skillratio += 50 + ((sd) ? pc_checkskill(sd, IG_SHIELD_MASTERY) * 60 : 0); break; case WS_CARTTERMINATION: i = 10 * (16 - skill_lv); @@ -4437,7 +4461,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * if (sc->data[SC_CHARGINGPIERCE_COUNT] && sc->data[SC_CHARGINGPIERCE_COUNT]->val1 >= 10) skillratio *= 2; if (sc->data[SC_DRAGONIC_AURA])// Need official damage increase. [Rytech] - skillratio += skillratio * 50 / 100; + skillratio += 280 * skill_lv; } break; case RK_WINDCUTTER: @@ -4552,7 +4576,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * skillratio += 50 * skill_lv; break; case NC_BOOSTKNUCKLE: - skillratio += 200 * skill_lv + sstatus->dex / 6; // !TODO: What's the DEX bonus? + skillratio += 240 * skill_lv + sstatus->dex / 6; // !TODO: What's the DEX bonus? RE_LVL_DMOD(100); break; case NC_PILEBUNKER: @@ -4560,7 +4584,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * RE_LVL_DMOD(100); break; case NC_VULCANARM: - skillratio += -100 + 140 * skill_lv + sstatus->dex / 6; // !TODO: What's the DEX bonus? + skillratio += -100 + 230 * skill_lv + sstatus->dex / 6; // !TODO: What's the DEX bonus? RE_LVL_DMOD(100); break; case NC_FLAMELAUNCHER: @@ -4569,7 +4593,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * RE_LVL_DMOD(150); break; case NC_ARMSCANNON: - skillratio += -100 + 400 + 300 * skill_lv; + skillratio += -100 + 400 + 350 * skill_lv; RE_LVL_DMOD(100); break; case NC_AXEBOOMERANG: @@ -4594,14 +4618,14 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * case NC_AXETORNADO: skillratio += -100 + 200 + 180 * skill_lv + sstatus->vit / 6; // !TODO: What's the VIT bonus? RE_LVL_DMOD(100); - if (sc && sc->data[SC_AXE_STOMP])// Whats the official increase? [Rytech] - skillratio += skillratio * 50 / 100; + if (sc && sc->data[SC_AXE_STOMP]) + skillratio += 120 * skill_lv; break; case SC_FATALMENACE: - skillratio += 120 * skill_lv + sstatus->agi / 6; // !TODO: What's the AGI bonus? + skillratio += -100 + 120 * skill_lv + sstatus->agi / 6; // !TODO: What's the AGI bonus? RE_LVL_DMOD(100); if (sc && sc->data[SC_ABYSS_DAGGER]) - skillratio += skillratio * 50 / 100; + skillratio += 300; break; case SC_TRIANGLESHOT: skillratio += -100 + 230 * skill_lv + 3 * sstatus->agi; @@ -4612,19 +4636,19 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * RE_LVL_DMOD(120); break; case LG_CANNONSPEAR: - skillratio += -100 + skill_lv * (50 + sstatus->str); + skillratio += -100 + 120 * skill_lv + (skill_lv * sstatus->str); RE_LVL_DMOD(100); if (sc && sc->data[SC_SPEAR_SCAR])// Whats the official increase? [Rytech] skillratio += skillratio * 50 / 100; break; case LG_BANISHINGPOINT: - skillratio += -100 + (80 * skill_lv) + ((sd) ? pc_checkskill(sd,SM_BASH) * 30 : 0); + skillratio += -100 + (100 * skill_lv) + ((sd) ? pc_checkskill(sd,SM_BASH) * 70 : 0); RE_LVL_DMOD(100); if (sc && sc->data[SC_SPEAR_SCAR])// Whats the official increase? [Rytech] skillratio += skillratio * 50 / 100; break; case LG_SHIELDPRESS: - skillratio += -100 + 200 * skill_lv + sstatus->str; + skillratio += -100 + 200 * skill_lv + sstatus->str + sstatus->vit; // !TODO: What's the STR/VIT bonus? if (sd) { short index = sd->equip_index[EQI_HAND_L]; @@ -4632,8 +4656,8 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * skillratio += sd->inventory_data[index]->weight / 10; } RE_LVL_DMOD(100); - if (sc && sc->data[SC_SHIELD_POWER])// Whats the official increase? [Rytech] - skillratio += skillratio * 50 / 100; + if (sc && sc->data[SC_SHIELD_POWER]) + skillratio += 100 + ((sd) ? pc_checkskill(sd, IG_SHIELD_MASTERY) * 200 : 0); break; case LG_PINPOINTATTACK: skillratio += -100 + 100 * skill_lv + 5 * status_get_agi(src); @@ -4652,17 +4676,18 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * break; case LG_OVERBRAND: if(sc && sc->data[SC_OVERBRANDREADY]) - skillratio += -100 + 450 * skill_lv; + skillratio += -100 + 500 * skill_lv; else skillratio += -100 + 300 * skill_lv; + skillratio += sstatus->dex / 2 + sstatus->str / 2; // !TODO: What's the STR/DEX bonus? skillratio += ((sd) ? pc_checkskill(sd, CR_SPEARQUICKEN) * 50 : 0); RE_LVL_DMOD(100); break; case LG_EARTHDRIVE: skillratio += -100 + 380 * skill_lv + ((sstatus->str + sstatus->vit) / 6); // !TODO: What's the STR/VIT bonus? RE_LVL_DMOD(100); - if (sc && sc->data[SC_SHIELD_POWER])// Whats the official increase? [Rytech] - skillratio += skillratio * 50 / 100; + if (sc && sc->data[SC_SHIELD_POWER]) + skillratio += 150 + ((sd) ? pc_checkskill(sd, IG_SHIELD_MASTERY) * 180 : 0); break; case LG_HESPERUSLIT: if (sc && sc->data[SC_INSPIRATION]) @@ -5041,7 +5066,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * skillratio += skillratio * sc->data[SC_LIGHTOFSTAR]->val2 / 100; break; case DK_SERVANTWEAPON_ATK: - skillratio += 50 + 50 * skill_lv + 5 * sstatus->pow; + skillratio += 100 + 50 * skill_lv + 5 * sstatus->pow; RE_LVL_DMOD(100); break; case DK_SERVANT_W_PHANTOM: @@ -5072,11 +5097,19 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * skillratio += 450 * skill_lv; RE_LVL_DMOD(100); break; - case DK_MADNESS_CRUSHER:// How does weight affect the damage? [Rytech] - skillratio += -100 + 450 * skill_lv + 5 * sstatus->pow; + case DK_MADNESS_CRUSHER: + skillratio += -100 + 600 * skill_lv + 5 * sstatus->pow; RE_LVL_DMOD(100); if (sc && sc->data[SC_CHARGINGPIERCE_COUNT] && sc->data[SC_CHARGINGPIERCE_COUNT]->val1 >= 10) skillratio *= 2; + if (sd && (sd->status.weapon == W_2HSWORD || sd->status.weapon == W_2HSPEAR)) { + short index = sd->equip_index[EQI_HAND_L]; + + if (index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->type == IT_WEAPON) { + skillratio += sd->inventory_data[index]->weight / 10; // !TODO: What's the bonus? + skillratio += sd->inventory_data[index]->weapon_level * 50; // !TODO: What's the bonus? + } + } break; case DK_STORMSLASH: skillratio += -100 + 120 * skill_lv + 5 * sstatus->pow; @@ -5095,10 +5128,10 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * RE_LVL_DMOD(100); break; case IQ_EXPOSION_BLASTER: - skillratio += -100 + 450 * skill_lv + 5 * sstatus->pow; + skillratio += -100 + 650 * skill_lv + 5 * sstatus->pow; RE_LVL_DMOD(100); if (tsc && tsc->data[SC_HOLY_OIL]) - skillratio += skillratio * 50 / 100; + skillratio += 200 * skill_lv; break; case IQ_FIRST_BRAND: skillratio += -100 + 450 * skill_lv + 5 * sstatus->pow; @@ -5117,11 +5150,12 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * RE_LVL_DMOD(100); break; case IQ_THIRD_PUNISH: - skillratio += -100 + 550 * skill_lv + 5 * sstatus->pow; + skillratio += -100 + 650 * skill_lv + 5 * sstatus->pow; RE_LVL_DMOD(100); break; case IQ_THIRD_FLAME_BOMB: skillratio += -100 + 650 * skill_lv + 5 * sstatus->pow; + skillratio += sstatus->max_hp * 20 / 100; RE_LVL_DMOD(100); break; case IQ_THIRD_CONSECRATION: @@ -5145,8 +5179,8 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * skillratio += sd->inventory_data[index]->weight / 20 * sd->inventory.u.items_inventory[index].refine; } RE_LVL_DMOD(100); - if ((i = pc_checkskill_imperial_guard(sd, 3)) > 0) - skillratio += skillratio * i / 100; + if ((i = pc_checkskill_imperial_guard(sd, 1)) > 0) + skillratio += skill_lv * i * 15; break; case IG_OVERSLASH: skillratio += -100 + 60 * skill_lv + 5 * sstatus->pow; @@ -5169,7 +5203,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * RE_LVL_DMOD(100); break; case SHC_SAVAGE_IMPACT: - skillratio += -100 + 350 * skill_lv + 5 * sstatus->pow; + skillratio += -100 + 60 * skill_lv + 5 * sstatus->pow; RE_LVL_DMOD(100); break; case SHC_ETERNAL_SLASH: @@ -5191,7 +5225,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * RE_LVL_DMOD(100); break; case MT_AXE_STOMP: - skillratio += -100 + 350 * skill_lv + 5 * sstatus->pow; + skillratio += -100 + 400 * skill_lv + 5 * sstatus->pow; RE_LVL_DMOD(100); break; case MT_RUSH_QUAKE: @@ -5205,18 +5239,21 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * RE_LVL_DMOD(100); break; case ABC_ABYSS_DAGGER: - skillratio += -100 + 550 * skill_lv + 5 * sstatus->pow; + skillratio += -100 + 350 * skill_lv + 5 * sstatus->pow; RE_LVL_DMOD(100); break; case ABC_UNLUCKY_RUSH: - skillratio += -100 + 500 * skill_lv + 5 * sstatus->crt; + skillratio += -100 + 100 + 300 * skill_lv + 5 * sstatus->pow; RE_LVL_DMOD(100); break; case ABC_CHAIN_REACTION_SHOT: - case ABC_CHAIN_REACTION_SHOT_ATK:// Same damage formula? [Rytech] skillratio += -100 + 600 * skill_lv + 5 * sstatus->con; RE_LVL_DMOD(100); break; + case ABC_CHAIN_REACTION_SHOT_ATK: + skillratio += -100 + 950 * skill_lv + 5 * sstatus->con; + RE_LVL_DMOD(100); + break; case ABC_DEFT_STAB: skillratio += -100 + 360 * skill_lv + 5 * sstatus->pow; RE_LVL_DMOD(100); @@ -5226,7 +5263,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * RE_LVL_DMOD(100); break; case WH_HAWKRUSH: - skillratio += -100 + 100 * skill_lv + 5 * sstatus->con; + skillratio += -100 + 200 * skill_lv + 5 * sstatus->con; RE_LVL_DMOD(100); break; case WH_HAWKBOOMERANG:// Affected by trait stats??? CON for sure but the other one unknown. Likely POW. [Rytech] @@ -5236,7 +5273,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * RE_LVL_DMOD(100); break; case WH_GALESTORM: - skillratio += -100 + 250 * skill_lv + 5 * sstatus->con; + skillratio += -100 + 250 * skill_lv + 7 * sstatus->con; RE_LVL_DMOD(100); if (sc && sc->data[SC_CALAMITYGALE] && (tstatus->race == RC_BRUTE || tstatus->race == RC_FISH)) skillratio += skillratio * 50 / 100; @@ -5272,7 +5309,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * case BO_ACIDIFIED_ZONE_GROUND_ATK: case BO_ACIDIFIED_ZONE_WIND_ATK: case BO_ACIDIFIED_ZONE_FIRE_ATK: - skillratio += -100 + 250 * skill_lv + 5 * sstatus->pow; + skillratio += -100 + 400 * skill_lv + 5 * sstatus->pow; RE_LVL_DMOD(100); if (sc && sc->data[SC_RESEARCHREPORT]) { // Does this also affect skills like acid demo? [Rytech] skillratio += skillratio * 50 / 100; @@ -5287,23 +5324,34 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * } break; case TR_ROSEBLOSSOM: - case TR_ROSEBLOSSOM_ATK:// Same damage formula? [Rytech] - skillratio += -100 + 500 * skill_lv + (sd ? pc_checkskill(sd, TR_STAGE_MANNER) : 5) * sstatus->con; + skillratio += -100 + 750 * skill_lv + (sd ? pc_checkskill(sd, TR_STAGE_MANNER) : 5) * sstatus->con; RE_LVL_DMOD(100); if (sc && sc->data[SC_MYSTIC_SYMPHONY]) { - skillratio += skillratio * 40 / 100; + skillratio *= 2; if (tstatus->race == RC_FISH || tstatus->race == RC_DEMIHUMAN) skillratio += skillratio * 50 / 100; } if (tsc && tsc->data[SC_SOUNDBLEND]) - skillratio += skillratio * 50 / 100; + skillratio += 250 * skill_lv; + break; + case TR_ROSEBLOSSOM_ATK: + skillratio += -100 + 350 * skill_lv + (sd ? pc_checkskill(sd, TR_STAGE_MANNER) : 5) * sstatus->con; + RE_LVL_DMOD(100); + if (sc && sc->data[SC_MYSTIC_SYMPHONY]) { + skillratio *= 2; + + if (tstatus->race == RC_FISH || tstatus->race == RC_DEMIHUMAN) + skillratio += skillratio * 50 / 100; + } + if (tsc && tsc->data[SC_SOUNDBLEND]) + skillratio += 400 * skill_lv; break; case TR_RHYTHMSHOOTING: skillratio += -100 + 120 * skill_lv + (sd ? pc_checkskill(sd, TR_STAGE_MANNER) : 5) * sstatus->con; RE_LVL_DMOD(100); if (sc && sc->data[SC_MYSTIC_SYMPHONY]) { - skillratio += skillratio * 40 / 100; + skillratio *= 2; if (tstatus->race == RC_FISH || tstatus->race == RC_DEMIHUMAN) skillratio += skillratio * 50 / 100; @@ -6219,7 +6267,11 @@ static struct Damage initialize_weapon_data(struct block_list *src, struct block wd.div_ = min(wd.div_ + wd.miscflag, 3); // Number of hits doesn't go above 3. break; case IG_OVERSLASH: - wd.div_ = min(wd.div_ + wd.miscflag, 5); // Number of hits doesn't appear to go above 5. + wd.div_ = min(wd.div_ + wd.miscflag, 7); // Number of hits doesn't appear to go above 5. + break; + case SHC_SAVAGE_IMPACT: + if (sc && sc->data[SC_CLOAKINGEXCEED]) + wd.div_ = 5; break; case SHC_ETERNAL_SLASH: if (sc && sc->data[SC_E_SLASH_COUNT]) @@ -6235,7 +6287,11 @@ static struct Damage initialize_weapon_data(struct block_list *src, struct block break; case MT_AXE_STOMP: if (sd && sd->status.weapon == W_2HAXE) - wd.div_ = 2; + wd.div_ = 3; + break; + case ABC_FRENZY_SHOT: + if (rnd() % 100 < 5 * skill_lv) + wd.div_ = 3; break; } } else { @@ -7172,7 +7228,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list RE_LVL_DMOD(100); // ! TODO: Confirm new formula break; case LG_RAYOFGENESIS: - skillratio += -100 + 230 * skill_lv + sstatus->int_ / 6; // !TODO: What's the INT bonus? + skillratio += -100 + 350 * skill_lv + sstatus->int_ / 6; // !TODO: What's the INT bonus? if (sc && sc->data[SC_INSPIRATION]) skillratio += 70 * skill_lv; RE_LVL_DMOD(100); @@ -7372,7 +7428,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list RE_LVL_DMOD(100); break; case AG_MYSTERY_ILLUSION: - skillratio += -100 + 250 * skill_lv + 5 * sstatus->spl; + skillratio += -100 + 500 * skill_lv + 5 * sstatus->spl; RE_LVL_DMOD(100); break; case AG_VIOLENT_QUAKE_ATK: @@ -7447,21 +7503,22 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list RE_LVL_DMOD(100); break; case AG_ROCK_DOWN: - skillratio += -100 + 750 * skill_lv + 5 * sstatus->spl; - RE_LVL_DMOD(100); - break; case AG_STORM_CANNON: + case AG_FROZEN_SLASH: skillratio += -100 + 600 * skill_lv + 5 * sstatus->spl; RE_LVL_DMOD(100); + if (sc && sc->data[SC_CLIMAX]) + skillratio += 250 * skill_lv; break; case AG_CRIMSON_ARROW: - case AG_CRIMSON_ARROW_ATK: skillratio += -100 + 300 * skill_lv + 5 * sstatus->spl; RE_LVL_DMOD(100); break; - case AG_FROZEN_SLASH: - skillratio += -100 + 750 * skill_lv + 5 * sstatus->spl; + case AG_CRIMSON_ARROW_ATK: + skillratio += -100 + 400 * skill_lv + 5 * sstatus->spl; RE_LVL_DMOD(100); + if (sc && sc->data[SC_CLIMAX]) + skillratio *= 2; break; case IG_JUDGEMENT_CROSS: skillratio += -100 + 750 * skill_lv + 10 * sstatus->spl; @@ -7471,17 +7528,24 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list if ((i = pc_checkskill_imperial_guard(sd, 3)) > 0) skillratio += skillratio * i / 100; break; - case IG_CROSS_RAIN:// Need official damage increase from Spear and Sword Mastery. [Rytech] - skillratio += -100 + 30 * skill_lv + 5 * sstatus->spl + 5 * pc_checkskill(sd, IG_SPEAR_SWORD_M); + case IG_CROSS_RAIN: + skillratio += -100 + 30 * skill_lv + 5 * sstatus->spl + (skill_lv * 5 * pc_checkskill(sd, IG_SPEAR_SWORD_M)); RE_LVL_DMOD(100); if ((i = pc_checkskill_imperial_guard(sd, 3)) > 0) skillratio += skillratio * i / 100; if (sc && sc->data[SC_HOLY_S]) - skillratio += 20 * skill_lv; + skillratio += 20 * skill_lv + (skill_lv * 5 * pc_checkskill(sd, IG_SPEAR_SWORD_M)); break; case CD_ARBITRIUM: + skillratio += -100 + 400 * skill_lv + 5 * sstatus->spl; + if (sd) + skillratio += 100 * pc_checkskill(sd, CD_FIDUS_ANIMUS); + RE_LVL_DMOD(100); + break; case CD_ARBITRIUM_ATK: - skillratio += -100 + 200 * skill_lv + 5 * sstatus->spl; + skillratio += -100 + 550 * skill_lv + 5 * sstatus->spl; + if (sd) + skillratio += 100 * pc_checkskill(sd, CD_FIDUS_ANIMUS); RE_LVL_DMOD(100); break; case CD_PNEUMATICUS_PROCELLA: @@ -7508,51 +7572,53 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list break; case ABC_ABYSS_SQUARE: skillratio += -100 + 140 * skill_lv + 5 * sstatus->spl; + if (sd) + skillratio += pc_checkskill(sd, ABC_MAGIC_SWORD_M) * 130; RE_LVL_DMOD(100); break; case TR_METALIC_FURY: - skillratio += -100 + 600 * skill_lv + 5 * sstatus->spl; + skillratio += -100 + 900 * skill_lv + 5 * sstatus->spl; RE_LVL_DMOD(100); break; case TR_SOUNDBLEND: skillratio += -100 + 120 * skill_lv + 5 * sstatus->spl; RE_LVL_DMOD(100); if (sc && sc->data[SC_MYSTIC_SYMPHONY]) { - skillratio += skillratio * 40 / 100; + skillratio *= 2; if (tstatus->race == RC_FISH || tstatus->race == RC_DEMIHUMAN) skillratio += skillratio * 50 / 100; } break; case EM_DIAMOND_STORM: - skillratio += -100 + 700 * skill_lv + 5 * sstatus->spl; + skillratio += -100 + 1250 * skill_lv + 5 * sstatus->spl; RE_LVL_DMOD(100); if (sc && sc->data[SC_SUMMON_ELEMENTAL_DILUVIO]) - skillratio += skillratio * 30 / 100; + skillratio += 3500 + 500 * skill_lv; break; case EM_LIGHTNING_LAND: - skillratio += -100 + 150 * skill_lv + 5 * sstatus->spl; + skillratio += -100 + 400 * skill_lv + 5 * sstatus->spl; RE_LVL_DMOD(100); if (sc && sc->data[SC_SUMMON_ELEMENTAL_PROCELLA]) - skillratio += skillratio * 30 / 100; + skillratio += 400 * skill_lv; break; case EM_VENOM_SWAMP: - skillratio += -100 + 150 * skill_lv + 5 * sstatus->spl; + skillratio += -100 + 400 * skill_lv + 5 * sstatus->spl; RE_LVL_DMOD(100); if (sc && sc->data[SC_SUMMON_ELEMENTAL_SERPENS]) - skillratio += skillratio * 30 / 100; + skillratio += 400 * skill_lv; break; case EM_CONFLAGRATION: - skillratio += -100 + 150 * skill_lv + 5 * sstatus->spl; + skillratio += -100 + 400 * skill_lv + 5 * sstatus->spl; RE_LVL_DMOD(100); if (sc && sc->data[SC_SUMMON_ELEMENTAL_ARDOR]) - skillratio += skillratio * 30 / 100; + skillratio += 400 * skill_lv; break; case EM_TERRA_DRIVE: - skillratio += -100 + 700 * skill_lv + 5 * sstatus->spl; + skillratio += -100 + 1250 * skill_lv + 5 * sstatus->spl; RE_LVL_DMOD(100); if (sc && sc->data[SC_SUMMON_ELEMENTAL_TERREMOTUS]) - skillratio += skillratio * 30 / 100; + skillratio += 3500 + 500 * skill_lv; break; case ABC_FROM_THE_ABYSS_ATK: skillratio += 50 + 70 * skill_lv + 5 * sstatus->spl; @@ -8968,9 +9034,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t } if( sc ){ - // It has a success chance of triggering even tho the description says nothing about it. - // TODO: Need to find out what the official success chance is. [Rytech] - if( sc->data[SC_SERVANTWEAPON] && sd->servantball > 0 && rnd() % 100 < 20 ){ + if( sc->data[SC_SERVANTWEAPON] && sd->servantball > 0 && rnd() % 100 < 15) { uint16 skill_id = DK_SERVANTWEAPON_ATK; uint16 skill_lv = sc->data[SC_SERVANTWEAPON]->val1; @@ -8992,9 +9056,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t sd->state.autocast = 0; } - // It has a success chance of triggering even tho the description says nothing about it. - // TODO: Need to find out what the official success chance is. [Rytech] - if( sc->data[SC_ABYSSFORCEWEAPON] && sd->abyssball > 0 && rnd() % 100 < 20 ){ + if( sc->data[SC_ABYSSFORCEWEAPON] && sd->abyssball > 0 && rnd() % 100 < 15 ){ uint16 skill_id = ABC_FROM_THE_ABYSS_ATK; uint16 skill_lv = sc->data[SC_ABYSSFORCEWEAPON]->val1; diff --git a/src/map/script_constants.hpp b/src/map/script_constants.hpp index edbe4f32e1..f5dc5b7d86 100644 --- a/src/map/script_constants.hpp +++ b/src/map/script_constants.hpp @@ -1839,6 +1839,8 @@ export_constant(SC_DEEP_POISONING_OPTION); export_constant(SC_POISON_SHIELD); export_constant(SC_POISON_SHIELD_OPTION); + export_constant(SC_RUSH_QUAKE1); + export_constant(SC_RUSH_QUAKE2); #ifdef RENEWAL export_constant(SC_EXTREMITYFIST2); diff --git a/src/map/skill.cpp b/src/map/skill.cpp index bd5c0bd238..9468baee72 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -2119,6 +2119,9 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1 case AG_CRYSTAL_IMPACT:// Targets hit are dealt aftershock damage. skill_castend_damage_id(src, bl, AG_CRYSTAL_IMPACT_ATK, skill_lv, tick, SD_LEVEL); break; + case AG_CRIMSON_ARROW: + skill_castend_damage_id(src, bl, AG_CRIMSON_ARROW_ATK, skill_lv, tick, SD_LEVEL); + break; case IQ_OLEUM_SANCTUM: sc_start(src, bl, SC_HOLY_OIL, 100, skill_lv, skill_get_time(skill_id, skill_lv)); break; @@ -2183,6 +2186,9 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1 case EM_TERRA_DRIVE: sc_start(src, bl, SC_HANDICAPSTATE_CRYSTALLIZATION, 40 + 10 * skill_lv, skill_lv, skill_get_time2(skill_id, skill_lv)); break; + case MT_RUSH_QUAKE: + sc_start(src, bl, SC_RUSH_QUAKE1, 100, skill_lv, skill_get_time2(skill_id, skill_lv)); + break; } //end switch skill_id if (md && battle_config.summons_trigger_autospells && md->master_id && md->special_state.ai && md->special_state.ai != AI_ABR && md->special_state.ai != AI_BIONIC) @@ -4014,10 +4020,6 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list * if (skill_area_temp[1] == bl->id && rnd()%100 < 4 * skill_lv)// Need official autocast chance. [Rytech] skill_addtimerskill(src, tick + dmg.amotion, bl->id, 0, 0, skill_id, skill_lv, BF_WEAPON, 2); break; - case ABC_FRENZY_SHOT: - if (rnd()%100 < 4 * skill_lv)// Need official autocast chance. [Rytech] - skill_addtimerskill(src, tick + dmg.amotion, bl->id, 0, 0, skill_id, skill_lv, BF_WEAPON, 2); - break; } } @@ -4603,11 +4605,8 @@ static TIMER_FUNC(skill_timerskill){ } break; case NPC_PULSESTRIKE2: - skill_castend_damage_id(src,target,skl->skill_id,skl->skill_lv,tick,skl->flag); - break; case ABC_DEFT_STAB: - case ABC_FRENZY_SHOT: - skill_castend_damage_id(src, target, skl->skill_id, skl->skill_lv, tick, skl->flag); + skill_castend_damage_id(src,target,skl->skill_id,skl->skill_lv,tick,skl->flag); break; default: skill_attack(skl->type,src,src,target,skl->skill_id,skl->skill_lv,tick,skl->flag); @@ -5258,8 +5257,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint skill_get_splash(skill_id, skill_lv), skill_get_maxcount(skill_id, skill_lv), splash_target(src), skill_get_type(skill_id), src, src, skill_id, skill_lv, tick, flag, BCT_ENEMY); } - if (skill_id == AG_CRIMSON_ARROW) - skill_attack(skill_get_type(AG_CRIMSON_ARROW_ATK), src, src, bl, AG_CRIMSON_ARROW_ATK, skill_lv, tick, flag|SD_LEVEL|SD_ANIMATION); break; case MO_INVESTIGATE: @@ -5480,6 +5477,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint case AG_SOUL_VC_STRIKE: case AG_CRYSTAL_IMPACT: case AG_CRYSTAL_IMPACT_ATK: + case AG_CRIMSON_ARROW_ATK: case AG_ROCK_DOWN: case AG_FROZEN_SLASH: case IQ_OLEUM_SANCTUM: @@ -5539,6 +5537,10 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint if (skill_id == DK_SERVANT_W_DEMOL && !(tsc && tsc->data[SC_SERVANT_SIGN] && tsc->data[SC_SERVANT_SIGN]->val1 == src->id)) break; + // Over Slash - Appears to deal a number of hits equal to 2 + Number of Enemys In AoE. Max of 7 hits. + if (skill_id == IG_OVERSLASH) + sflag |= skill_area_temp[0]; + // Deft Stab - Make sure the flag of 2 is passed on when the skill is double casted. if (skill_id == ABC_DEFT_STAB && flag&2) sflag |= 2; @@ -5612,10 +5614,12 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint if (sd && pc_search_inventory(sd, skill_db.find(SU_LUNATICCARROTBEAT)->require.itemid[0]) >= 0) skill_id = SU_LUNATICCARROTBEAT2; break; + case MT_RUSH_QUAKE: + sc_start(src, src, SC_RUSH_QUAKE2, 100, skill_lv, skill_get_time(skill_id, skill_lv)); + // Fallthrough case DK_SERVANT_W_PHANTOM: case SHC_SAVAGE_IMPACT: case SHC_FATAL_SHADOW_CROW: - case MT_RUSH_QUAKE: // Jump to the target before attacking. if (skill_check_unit_movepos(5, src, bl->x, bl->y, 0, 1)) skill_blown(src, src, 1, (map_calc_dir(bl, src->x, src->y) + 4) % 8, BLOWN_NONE); @@ -7768,7 +7772,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case EM_INCREASING_ACTIVITY: if (bl->type == BL_PC) { clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); - status_heal(bl, 0, 0, 20 + 5 * skill_lv, 0); + status_heal(bl, 0, 0, 10 + 10 * skill_lv, 0); } else clif_skill_fail(sd, skill_id, USESKILL_FAIL, 0); break; diff --git a/src/map/status.cpp b/src/map/status.cpp index 66c8450521..e7663e5c62 100644 --- a/src/map/status.cpp +++ b/src/map/status.cpp @@ -2365,9 +2365,9 @@ int status_calc_mob_(struct mob_data* md, uint8 opt) // Its unknown how the summoner's stats affects the ABR's stats. // I decided to do something similar to elementals for now until I know. // Also added hit increase from ABR-Mastery for balance reasons. [Rytech] - status->max_hp = (5000 + 2000 * abr_mastery) * mstatus->vit / 100; - status->rhw.atk = (2 * mstatus->batk + 500 + 200 * abr_mastery) * 70 / 100; - status->rhw.atk2 = 2 * mstatus->batk + 500 + 200 * abr_mastery; + status->max_hp = (5000 + 40000 * abr_mastery) * mstatus->vit / 100; + status->rhw.atk = (2 * mstatus->batk + 200 + 600 * abr_mastery) * 70 / 100; + status->rhw.atk2 = 2 * mstatus->batk + 200 + 600 * abr_mastery; status->def = mstatus->def + 20 * abr_mastery; status->mdef = mstatus->mdef + 4 * abr_mastery; status->hit = mstatus->hit + 5 * abr_mastery / 2; @@ -2400,10 +2400,10 @@ int status_calc_mob_(struct mob_data* md, uint8 opt) // Its unknown how the summoner's stats affects the bionic's stats. // I decided to do something similar to elementals for now until I know. // Also added hit increase from Bionic-Mastery for balance reasons. [Rytech] - status->max_hp = (5000 + 2000 * bionic_mastery) * mstatus->vit / 100; + status->max_hp = (5000 + 40000 * bionic_mastery) * mstatus->vit / 100; //status->max_sp = (50 + 20 * bionic_mastery) * mstatus->int_ / 100;// Wait what??? Bionic Mastery increases MaxSP? They have SP??? - status->rhw.atk = (2 * mstatus->batk + 200 * bionic_mastery) * 70 / 100; - status->rhw.atk2 = 2 * mstatus->batk + 200 * bionic_mastery; + status->rhw.atk = (2 * mstatus->batk + 600 * bionic_mastery) * 70 / 100; + status->rhw.atk2 = 2 * mstatus->batk + 600 * bionic_mastery; status->def = mstatus->def + 20 * bionic_mastery; status->mdef = mstatus->mdef + 4 * bionic_mastery; status->hit = mstatus->hit + 5 * bionic_mastery / 2; @@ -2415,7 +2415,7 @@ int status_calc_mob_(struct mob_data* md, uint8 opt) // costing summon. [Rytech] if (ud->skill_id == BO_HELLTREE) { status->max_hp += 20000; - status->rhw.atk += 1400; // 70% of 2000 + status->rhw.atk += 5600; // 70% of 2000 status->rhw.atk2 += 2000; } } @@ -3827,6 +3827,8 @@ int status_calc_pc_sub(struct map_session_data* sd, uint8 opt) base_status->patk += skill * 3; base_status->smatk += skill * 3; } + if (sd->status.weapon == W_2HSTAFF && (skill = pc_checkskill(sd, AG_TWOHANDSTAFF)) > 0) + base_status->smatk += skill * 2; // ----- PHYSICAL RESISTANCE CALCULATION ----- if ((skill = pc_checkskill_imperial_guard(sd, 1)) > 0)// IG_SHIELD_MASTERY @@ -6488,8 +6490,6 @@ static unsigned short status_calc_watk(struct block_list *bl, struct status_chan watk += sc->data[SC_POWERFUL_FAITH]->val2; if (sc->data[SC_GUARD_STANCE]) watk -= sc->data[SC_GUARD_STANCE]->val3; - if (sc->data[SC_ATTACK_STANCE]) - watk += sc->data[SC_ATTACK_STANCE]->val3; return (unsigned short)cap_value(watk,0,USHRT_MAX); } @@ -7762,6 +7762,8 @@ static signed short status_calc_patk(struct block_list *bl, struct status_change patk += sc->data[SC_ABYSS_SLAYER]->val2; if (sc->data[SC_PRON_MARCH]) patk += sc->data[SC_PRON_MARCH]->val2; + if (sc->data[SC_ATTACK_STANCE]) + patk += sc->data[SC_ATTACK_STANCE]->val3; return (short)cap_value(patk, 0, SHRT_MAX); } @@ -7786,6 +7788,8 @@ static signed short status_calc_smatk(struct block_list *bl, struct status_chang smatk += sc->data[SC_JAWAII_SERENADE]->val2; if (sc->data[SC_SPELL_ENCHANTING]) smatk += sc->data[SC_SPELL_ENCHANTING]->val2; + if (sc->data[SC_ATTACK_STANCE]) + smatk += sc->data[SC_ATTACK_STANCE]->val3; return (short)cap_value(smatk, 0, SHRT_MAX); } @@ -11764,7 +11768,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty tick = INFINITE_TICK; break; case SC_GUARDIAN_S: - val2 = status->max_hp * (50 * val1) / 100;// Barrier HP + val2 = (status->max_hp / 2) * (50 * val1 + status_get_lv(src) + status->sta * 15) / 100;// Barrier HP break; case SC_REBOUND_S: val2 = 10 * val1;// Reduced Damage From Devotion @@ -11773,7 +11777,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty break; case SC_ATTACK_STANCE: val2 = 40 * val1;// DEF Decrease - val3 = 5 + 5 * val1;// ATK Increase + val3 = 3 * val1;// P.ATK/S.MATK Increase tick = INFINITE_TICK; break; case SC_HOLY_S: diff --git a/src/map/status.hpp b/src/map/status.hpp index 79989de7ab..ee3b336adf 100644 --- a/src/map/status.hpp +++ b/src/map/status.hpp @@ -1174,6 +1174,9 @@ enum sc_type : int16 { SC_POISON_SHIELD, SC_POISON_SHIELD_OPTION, + SC_RUSH_QUAKE1, + SC_RUSH_QUAKE2, + #ifdef RENEWAL SC_EXTREMITYFIST2, //! NOTE: This SC should be right before SC_MAX, so it doesn't disturb if RENEWAL is disabled #endif