diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index fb6eae7a41..a3777d3b73 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -34872,6 +34872,7 @@ Body: Type: Weapon TargetType: Attack DamageFlags: + Splash: true Critical: true Range: 1 Hit: Single @@ -34879,6 +34880,7 @@ Body: Element: Weapon Requires: SpCost: 1 + SplashArea: 4 - Id: 5203 Name: DK_SERVANT_W_SIGN Description: Servant Weapon Sign @@ -35029,12 +35031,36 @@ Body: MaxLevel: 10 Type: Weapon TargetType: Attack + DamageFlags: + Splash: true Range: 2 Hit: Single HitCount: 1 Element: Weapon + SplashArea: + - Level: 1 + Area: 1 + - Level: 2 + Area: 1 + - Level: 3 + Area: 1 + - Level: 4 + Area: 2 + - Level: 5 + Area: 2 + - Level: 6 + Area: 2 + - Level: 7 + Area: 3 + - Level: 8 + Area: 3 + - Level: 9 + Area: 3 + - Level: 10 + Area: 4 CastCancel: true AfterCastActDelay: 500 + Cooldown: 300 Requires: SpCost: - Level: 1 @@ -35080,19 +35106,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 @@ -35139,7 +35165,7 @@ Body: GiveAp: 2 CastCancel: true AfterCastActDelay: 500 - Cooldown: 2000 + Cooldown: 350 FixedCastTime: 500 Requires: SpCost: @@ -35217,19 +35243,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 diff --git a/src/map/battle.cpp b/src/map/battle.cpp index e7e2e9d7d0..1b35440efe 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -2572,7 +2572,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 @@ -2590,6 +2589,18 @@ 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; + + break; + } + case DK_HACKANDSLASHER: + case DK_HACKANDSLASHER_ATK: { + map_session_data* sd = BL_CAST( BL_PC, src ); + + if( sd != nullptr && ( sd->status.weapon == W_1HSPEAR || sd->status.weapon == W_2HSPEAR ) ){ + return BF_LONG; + } + + break; } } @@ -3845,7 +3856,7 @@ static void battle_calc_skill_base_damage(struct Damage* wd, struct block_list * if(status_get_lv(src) > 100) damagevalue = damagevalue * status_get_lv(src) / 100; if(sd) - damagevalue = damagevalue * (90 + 10 * pc_checkskill(sd, RK_DRAGONTRAINING)) / 100; + damagevalue = damagevalue * ( 90 + 10 * pc_checkskill( sd, RK_DRAGONTRAINING ) + ( pc_checkskill( sd, DK_DRAGONIC_AURA ) >= 1 ? ( sstatus->pow / 4 + sstatus->patk / 2 ) : 0 ) ) / 100; if (sc && sc->getSCE(SC_DRAGONIC_AURA))// Need official damage increase. [Rytech] damagevalue += damagevalue * 50 / 100; ATK_ADD(wd->damage, wd->damage2, damagevalue); @@ -4132,8 +4143,6 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * skillratio += 2 * sc->getSCE(SC_TRUESIGHT)->val1; if (sc->getSCE(SC_CONCENTRATION) && (skill_id != RK_DRAGONBREATH && skill_id != RK_DRAGONBREATH_WATER && skill_id != NPC_DRAGONBREATH)) skillratio += sc->getSCE(SC_CONCENTRATION)->val2; - if (sc && sc->getSCE(SC_VIGOR))// Lacking info on how damage is increased. Guessing for now. [Rytech] - skillratio += skillratio * 50 / 100; #endif if (!skill_id || skill_id == KN_AUTOCOUNTER) { if (sc->getSCE(SC_CRUSHSTRIKE)) { @@ -4680,13 +4689,15 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * skillratio += -100 + 600 + 200 * skill_lv; if (sd) skillratio += 50 * pc_checkskill(sd,LK_SPIRALPIERCE); - RE_LVL_DMOD(100); if (sc) { + if( sc->getSCE( SC_DRAGONIC_AURA ) ){ + skillratio += sc->getSCE( SC_DRAGONIC_AURA )->val1 * 160; + } + if (sc->getSCE(SC_CHARGINGPIERCE_COUNT) && sc->getSCE(SC_CHARGINGPIERCE_COUNT)->val1 >= 10) skillratio *= 2; - if (sc->getSCE(SC_DRAGONIC_AURA))// Need official damage increase. [Rytech] - skillratio += skillratio * 50 / 100; } + RE_LVL_DMOD(100); break; case RK_WINDCUTTER: if (sd) { @@ -5308,7 +5319,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * skillratio += skillratio * sc->getSCE(SC_LIGHTOFSTAR)->val2 / 100; break; case DK_SERVANTWEAPON_ATK: - skillratio += 50 + 50 * skill_lv + 5 * sstatus->pow; + skillratio += -100 + 200 + 50 * skill_lv + 5 * sstatus->pow; RE_LVL_DMOD(100); break; case DK_SERVANT_W_PHANTOM: @@ -5320,18 +5331,10 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * RE_LVL_DMOD(100); break; case DK_HACKANDSLASHER: - skillratio += -100 + 500 + 250 * skill_lv; - if (sd && sd->status.weapon == W_2HSWORD) { - skillratio += 5 * sstatus->pow; - RE_LVL_DMOD(100); // Only takes place with 2h Sword - } - break; case DK_HACKANDSLASHER_ATK: - skillratio += 600 + 120 * skill_lv; - if (sd && sd->status.weapon == W_2HSPEAR) { - skillratio += 5 * sstatus->pow; - RE_LVL_DMOD(100); // Only takes place with 2h Spear - } + skillratio += -100 + 500 + 250 * skill_lv; + skillratio += 5 * sstatus->pow; + RE_LVL_DMOD(100); break; case DK_DRAGONIC_AURA: skillratio += 950 * skill_lv + 10 * sstatus->pow; @@ -5339,8 +5342,15 @@ 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; + if( sd != nullptr ){ + int16 index = sd->equip_index[EQI_HAND_R]; + + if( index >= 0 && sd->inventory_data[index] != nullptr ){ + skillratio += sd->inventory_data[index]->weight / 10 * sd->inventory_data[index]->weapon_level; + } + } RE_LVL_DMOD(100); if (sc && sc->getSCE(SC_CHARGINGPIERCE_COUNT) && sc->getSCE(SC_CHARGINGPIERCE_COUNT)->val1 >= 10) skillratio *= 2; @@ -9098,6 +9108,12 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t if (sc->getSCE(SC_GIANTGROWTH) && (wd.flag&BF_SHORT) && rnd()%100 < sc->getSCE(SC_GIANTGROWTH)->val2 && !is_infinite_defense(target, wd.flag) && !vellum_damage) wd.damage += wd.damage * 150 / 100; // 2.5 times damage + if( sc->getSCE( SC_VIGOR ) && ( wd.flag&BF_SHORT ) && !is_infinite_defense( target, wd.flag ) && !vellum_damage ){ + int mod = 200; + + wd.damage += wd.damage * mod / 100; + } + if( sd && battle_config.arrow_decrement && sc->getSCE(SC_FEARBREEZE) && sc->getSCE(SC_FEARBREEZE)->val4 > 0) { short idx = sd->equip_index[EQI_AMMO]; if (idx >= 0 && sd->inventory.u.items_inventory[idx].amount >= sc->getSCE(SC_FEARBREEZE)->val4) { @@ -9305,9 +9321,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->getSCE(SC_SERVANTWEAPON) && sd->servantball > 0 && rnd() % 100 < 20 ){ + if( sc->getSCE( SC_SERVANTWEAPON ) && sd->servantball > 0 && rnd() % 100 < ( 3 * sc->getSCE( SC_SERVANTWEAPON )->val1 ) ){ uint16 skill_id = DK_SERVANTWEAPON_ATK; uint16 skill_lv = sc->getSCE(SC_SERVANTWEAPON)->val1; diff --git a/src/map/skill.cpp b/src/map/skill.cpp index 93933c401f..4a16fc461d 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -5612,6 +5612,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint case DK_SERVANT_W_PHANTOM: case DK_SERVANT_W_DEMOL: case DK_MADNESS_CRUSHER: + case DK_HACKANDSLASHER: case AG_DESTRUCTIVE_HURRICANE: case AG_SOUL_VC_STRIKE: case AG_CRYSTAL_IMPACT: @@ -5726,6 +5727,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint case LG_EARTHDRIVE: case GN_CARTCANNON: case SU_SCRATCH: + case DK_HACKANDSLASHER: clif_skill_nodamage(src,bl,skill_id,skill_lv,1); break; #ifdef RENEWAL @@ -5846,21 +5848,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint } break; - case DK_HACKANDSLASHER: - case DK_HACKANDSLASHER_ATK: - if (flag & 1) { - skill_addtimerskill(src, tick + (200 + status_get_amotion(src)), bl->id, 0, 0, skill_id, skill_lv, BF_WEAPON, flag); - } else { - skill_area_temp[0] = 0; - skill_area_temp[1] = bl->id; - skill_area_temp[2] = 0; - - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); - skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, flag); - map_foreachinrange(skill_area_sub, bl, skill_get_splash(DK_HACKANDSLASHER_ATK, skill_lv), BL_CHAR|BL_SKILL, src, DK_HACKANDSLASHER_ATK, skill_lv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill_castend_damage_id); - } - break; - //Place units around target case NJ_BAKUENRYU: clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);