From e1e19a6d0661bc90657ccce426c5b77abac6eed7 Mon Sep 17 00:00:00 2001 From: munkrej Date: Sat, 15 Apr 2023 17:31:19 +0200 Subject: [PATCH] 4th Improvement - Meister (#7712) --- db/re/skill_db.yml | 73 ++++++++++++++++++++++++------------ db/re/status.yml | 11 ++++++ src/map/battle.cpp | 21 +++++++---- src/map/script_constants.hpp | 2 + src/map/skill.cpp | 14 ++++++- src/map/status.cpp | 12 ++++-- src/map/status.hpp | 3 ++ 7 files changed, 101 insertions(+), 35 deletions(-) diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index 0d4b0d07b2..d72faa1704 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -22460,15 +22460,15 @@ Body: Element: Weapon CastTime: - Level: 1 - Time: 100 + Time: 40 - Level: 2 - Time: 200 + Time: 80 - Level: 3 - Time: 300 + Time: 120 - Level: 4 - Time: 400 + Time: 160 - Level: 5 - Time: 500 + Time: 200 Requires: SpCost: - Level: 1 @@ -22645,11 +22645,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 @@ -22661,18 +22661,18 @@ Body: Time: 1800 - Level: 5 Time: 2000 - AfterCastActDelay: 1000 + AfterCastActDelay: 500 Cooldown: - Level: 1 - Time: 100 + Time: 50 - Level: 2 - Time: 150 + Time: 75 - Level: 3 - Time: 200 + Time: 100 - Level: 4 - Time: 250 + Time: 125 - Level: 5 - Time: 300 + Time: 150 FixedCastTime: - Level: 1 Time: 500 @@ -38025,11 +38025,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 @@ -38084,9 +38084,32 @@ Body: CastCancel: true AfterCastActDelay: 500 Cooldown: 60000 + Duration1: 30000 + Duration2: + - 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 Requires: SpCost: 150 ApCost: 150 + Status: Rush_Quake2 - Id: 5297 Name: MT_M_MACHINE Description: Manufacture Machine @@ -38234,6 +38257,7 @@ Body: ActiveInstance: 1 GiveAp: 20 CastCancel: true + CastTime: 1000 AfterCastActDelay: 500 Duration1: - Level: 1 @@ -38244,8 +38268,8 @@ Body: Time: 240000 - Level: 4 Time: 300000 - Cooldown: 60000 - FixedCastTime: 3000 + Cooldown: 30000 + FixedCastTime: 1000 Requires: SpCost: - Level: 1 @@ -38274,6 +38298,7 @@ Body: ActiveInstance: 1 GiveAp: 20 CastCancel: true + CastTime: 1000 AfterCastActDelay: 500 Duration1: - Level: 1 @@ -38284,8 +38309,8 @@ Body: Time: 240000 - Level: 4 Time: 300000 - Cooldown: 60000 - FixedCastTime: 3000 + Cooldown: 30000 + FixedCastTime: 1000 Requires: SpCost: - Level: 1 @@ -38314,6 +38339,7 @@ Body: ActiveInstance: 1 GiveAp: 20 CastCancel: true + CastTime: 1000 AfterCastActDelay: 500 Duration1: - Level: 1 @@ -38324,8 +38350,8 @@ Body: Time: 240000 - Level: 4 Time: 300000 - Cooldown: 60000 - FixedCastTime: 3000 + Cooldown: 30000 + FixedCastTime: 1000 Requires: SpCost: - Level: 1 @@ -38353,6 +38379,7 @@ Body: HitCount: 1 ActiveInstance: 1 CastCancel: true + CastTime: 1000 AfterCastActDelay: 500 Duration1: - Level: 1 @@ -38364,7 +38391,7 @@ Body: - Level: 4 Time: 300000 Cooldown: 60000 - FixedCastTime: 3000 + FixedCastTime: 1000 Requires: SpCost: - Level: 1 diff --git a/db/re/status.yml b/db/re/status.yml index 63f12706ae..0aebb2845a 100644 --- a/db/re/status.yml +++ b/db/re/status.yml @@ -8761,3 +8761,14 @@ Body: NoClearance: true EndOnStart: Relieve_on: true + - Status: Rush_Quake1 + Icon: EFST_RUSH_QUAKE1 + DurationLookup: MT_RUSH_QUAKE + Flags: + BlEffect: true + Debuff: true + - Status: Rush_Quake2 + Icon: EFST_RUSH_QUAKE2 + DurationLookup: MT_RUSH_QUAKE + CalcFlags: + All: true diff --git a/src/map/battle.cpp b/src/map/battle.cpp index e18eb03e3b..a6d92072c3 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -1638,6 +1638,11 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam } if (tsc->getSCE(SC_HOLY_OIL) && (flag&(BF_LONG|BF_WEAPON)) == (BF_LONG|BF_WEAPON)) damage += damage * 50 / 100;// Need official adjustment. [Rytech] + + if( tsc->getSCE( SC_RUSH_QUAKE1 ) && ( flag&BF_WEAPON ) == BF_WEAPON ){ + damage += damage * 50 / 100; + } + if (tsc->getSCE(SC_SHADOW_SCAR)) // !TODO: Need official adjustment for this too. damage += damage * (3 * tsc->getSCE(SC_SHADOW_SCAR)->val1) / 100; @@ -4825,7 +4830,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 += -100 + 260 * skill_lv + sstatus->dex; // !TODO: What's the DEX bonus? RE_LVL_DMOD(100); break; case NC_PILEBUNKER: @@ -4833,7 +4838,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; // !TODO: What's the DEX bonus? RE_LVL_DMOD(100); break; case NC_FLAMELAUNCHER: @@ -4842,7 +4847,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: @@ -4865,10 +4870,10 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * skillratio += 350 + 50 * skill_lv; break; case NC_AXETORNADO: - skillratio += -100 + 200 + 180 * skill_lv + sstatus->vit / 6; // !TODO: What's the VIT bonus? + skillratio += -100 + 200 + 180 * skill_lv + sstatus->vit * 2; + if (sc && sc->getSCE(SC_AXE_STOMP)) + skillratio += 380; RE_LVL_DMOD(100); - if (sc && sc->getSCE(SC_AXE_STOMP))// Whats the official increase? [Rytech] - skillratio += skillratio * 50 / 100; break; case SC_FATALMENACE: skillratio += 120 * skill_lv + sstatus->agi / 6; // !TODO: What's the AGI bonus? @@ -5496,7 +5501,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: @@ -6573,7 +6578,7 @@ 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; } } else { diff --git a/src/map/script_constants.hpp b/src/map/script_constants.hpp index 6913aaa175..a2d01b5afb 100644 --- a/src/map/script_constants.hpp +++ b/src/map/script_constants.hpp @@ -1888,6 +1888,8 @@ export_constant(SC_IMMUNE_PROPERTY_UNDEAD); export_constant(SC_RELIEVE_ON); export_constant(SC_RELIEVE_OFF); + 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 4a16fc461d..e33456b980 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -2209,6 +2209,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_time( 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) @@ -5751,7 +5754,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint skill_id = SU_LUNATICCARROTBEAT2; break; case DK_SERVANT_W_PHANTOM: - 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); @@ -5828,6 +5830,16 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint if (tsc && tsc->getSCE(SC_SOUNDBLEND)) skill_area_temp[0] = 1 + rnd()%4; break; + 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, direction_opposite( static_cast( map_calc_dir( bl, src->x, src->y ) ) ), BLOWN_NONE); + } + clif_skill_nodamage( src, bl, skill_id, skill_lv, 1 ); // Trigger animation + clif_blown( src ); + // TODO: does this buff start before or after dealing damage? [Muh] + sc_start( src, src, SC_RUSH_QUAKE2, 100, skill_lv, skill_get_time2( skill_id, skill_lv ) ); + break; } // if skill damage should be split among targets, count them diff --git a/src/map/status.cpp b/src/map/status.cpp index 0348b72a07..dac8a724da 100644 --- a/src/map/status.cpp +++ b/src/map/status.cpp @@ -2864,9 +2864,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; @@ -4723,6 +4723,12 @@ int status_calc_pc_sub(map_session_data* sd, uint8 opt) sd->right_weapon.addrace[RC_DEMIHUMAN] += 50; sd->left_weapon.addrace[RC_ANGEL] += 50; } + + if( sc->getSCE( SC_RUSH_QUAKE2 ) ){ + sd->bonus.short_attack_atk_rate += 5 * sc->getSCE( SC_RUSH_QUAKE2 )->val1; + sd->bonus.long_attack_atk_rate += 5 * sc->getSCE( SC_RUSH_QUAKE2 )->val1; + } + if (sc->getSCE(SC_DEADLY_DEFEASANCE)) sd->special_state.no_magic_damage = 0; if (sc->getSCE(SC_CLIMAX_DES_HU)) diff --git a/src/map/status.hpp b/src/map/status.hpp index e77b50d9b9..e5f36c1284 100644 --- a/src/map/status.hpp +++ b/src/map/status.hpp @@ -1280,6 +1280,9 @@ enum sc_type : int16 { SC_RELIEVE_ON, SC_RELIEVE_OFF, + 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