diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index b101e1cb0d..a538a53793 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -40229,20 +40229,20 @@ Body: CastTime: 1000 AfterCastActDelay: 500 Duration1: 500 - Cooldown: 500 + Cooldown: 700 FixedCastTime: 1000 Requires: SpCost: - Level: 1 - Amount: 105 + Amount: 70 - Level: 2 - Amount: 110 + Amount: 76 - Level: 3 - Amount: 115 + Amount: 82 - Level: 4 - Amount: 120 + Amount: 88 - Level: 5 - Amount: 125 + Amount: 94 Weapon: Bow: true Musical: true @@ -40299,21 +40299,21 @@ Body: Amount: 2 CastCancel: true CastTime: 1000 - AfterCastActDelay: 500 - Cooldown: 1000 + AfterCastActDelay: 350 + Cooldown: 1150 FixedCastTime: 1000 Requires: SpCost: - Level: 1 - Amount: 66 + Amount: 36 - Level: 2 - Amount: 72 + Amount: 40 - Level: 3 - Amount: 78 + Amount: 44 - Level: 4 - Amount: 84 + Amount: 48 - Level: 5 - Amount: 90 + Amount: 52 Weapon: Bow: true Musical: true @@ -40344,31 +40344,21 @@ Body: Area: 3 - Level: 5 Area: 3 - GiveAp: - - Level: 1 - Amount: 2 - - Level: 2 - Amount: 2 - - Level: 3 - Amount: 2 - - Level: 4 - Amount: 3 - - Level: 5 - Amount: 3 + GiveAp: 2 CastCancel: true - Cooldown: 500 + Cooldown: 300 Requires: SpCost: - Level: 1 - Amount: 120 + Amount: 70 - Level: 2 - Amount: 132 + Amount: 76 - Level: 3 - Amount: 144 + Amount: 82 - Level: 4 - Amount: 156 + Amount: 88 - Level: 5 - Amount: 168 + Amount: 94 Weapon: Musical: true Whip: true @@ -40436,15 +40426,15 @@ Body: Requires: SpCost: - Level: 1 - Amount: 80 + Amount: 40 - Level: 2 - Amount: 92 + Amount: 50 - Level: 3 - Amount: 104 + Amount: 60 - Level: 4 - Amount: 116 + Amount: 70 - Level: 5 - Amount: 128 + Amount: 80 Weapon: Musical: true Whip: true diff --git a/src/map/battle.cpp b/src/map/battle.cpp index d3ef98b658..0eb42fdb05 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -5626,46 +5626,57 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * RE_LVL_DMOD(100); break; case TR_ROSEBLOSSOM: - skillratio += -100 + 750 * skill_lv + (sd ? pc_checkskill(sd, TR_STAGE_MANNER) : 5) * sstatus->con; + skillratio += -100 + 200 + 2000 * skill_lv; + + if (sd && pc_checkskill(sd, TR_STAGE_MANNER) > 0) + skillratio += 3 * sstatus->con; if( tsc != nullptr && tsc->getSCE( SC_SOUNDBLEND ) ){ - skillratio += 250 * skill_lv; + skillratio += 200 * skill_lv; } RE_LVL_DMOD(100); if (sc && sc->getSCE(SC_MYSTIC_SYMPHONY)) { - skillratio += skillratio * 100 / 100; + skillratio *= 2; if (tstatus->race == RC_FISH || tstatus->race == RC_DEMIHUMAN) skillratio += skillratio * 50 / 100; } break; case TR_ROSEBLOSSOM_ATK: - skillratio += -100 + 350 * skill_lv + (sd ? pc_checkskill(sd, TR_STAGE_MANNER) : 5) * sstatus->con; + skillratio += -100 + 250 + 2800 * skill_lv; + + if (sd && pc_checkskill(sd, TR_STAGE_MANNER) > 0) + skillratio += 3 * sstatus->con; if( tsc != nullptr && tsc->getSCE( SC_SOUNDBLEND ) ){ - skillratio += 400 * skill_lv; + skillratio += 200 * skill_lv; } RE_LVL_DMOD(100); if (sc && sc->getSCE(SC_MYSTIC_SYMPHONY)) { - skillratio += skillratio * 100 / 100; + skillratio *= 2; if (tstatus->race == RC_FISH || tstatus->race == RC_DEMIHUMAN) skillratio += skillratio * 50 / 100; } break; case TR_RHYTHMSHOOTING: - skillratio += -100 + 120 * skill_lv + (sd ? pc_checkskill(sd, TR_STAGE_MANNER) : 5) * sstatus->con; + skillratio += -100 + 200 + 120 * skill_lv; + + if (sd && pc_checkskill(sd, TR_STAGE_MANNER) > 0) + skillratio += 3 * sstatus->con; + + if (tsc && tsc->getSCE(SC_SOUNDBLEND)) + skillratio += 100 + 100 * skill_lv; + RE_LVL_DMOD(100); if (sc && sc->getSCE(SC_MYSTIC_SYMPHONY)) { - skillratio += skillratio * 100 / 100; + skillratio *= 2; if (tstatus->race == RC_FISH || tstatus->race == RC_DEMIHUMAN) skillratio += skillratio * 50 / 100; } - if (tsc && tsc->getSCE(SC_SOUNDBLEND)) - skillratio += skillratio * 50 / 100; break; case ABR_BATTLE_BUSTER:// Need official formula. case ABR_DUAL_CANNON_FIRE:// Need official formula. @@ -7172,9 +7183,6 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list if (mflag == 2) ad.div_ = 2; break; - case TR_METALIC_FURY:// Deals up to 5 additional hits. But what affects the number of hits? [Rytech] - ad.div_ = min(ad.div_ + mflag, 5); // Number of hits doesn't go above 5. - break; case AG_CRIMSON_ARROW_ATK: if( sc != nullptr && sc->getSCE( SC_CLIMAX ) ){ ad.div_ = 2; @@ -7942,9 +7950,12 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list skillratio += -100 + ( 570 + 20 * pc_checkskill( sd, ABC_MAGIC_SWORD_M ) ) * skill_lv + 5 * sstatus->spl; RE_LVL_DMOD(100); break; - case TR_METALIC_FURY: - skillratio += -100 + 900 * skill_lv + 5 * sstatus->spl; - RE_LVL_DMOD(100); + case TR_METALIC_FURY: { + int area = skill_get_splash(skill_id, skill_lv); + int count = map_forcountinarea(skill_check_bl_sc,target->m,target->x - area,target->y - area,target->x + area,target->y + area,5,BL_MOB,SC_SOUNDBLEND); + skillratio += -100 + (2200 + 300 * count) * skill_lv + 5 * sstatus->spl; + RE_LVL_DMOD(100); + } break; case TR_SOUNDBLEND: skillratio += -100 + 120 * skill_lv + 5 * sstatus->spl; diff --git a/src/map/skill.cpp b/src/map/skill.cpp index 88b4b302e0..5c2b1199e5 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -5652,7 +5652,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint case BO_ACIDIFIED_ZONE_WIND: case BO_ACIDIFIED_ZONE_FIRE: case TR_ROSEBLOSSOM_ATK: - case TR_METALIC_FURY: case ABC_FROM_THE_ABYSS_ATK: case EM_ELEMENTAL_BUSTER_FIRE: case EM_ELEMENTAL_BUSTER_WATER: @@ -5847,11 +5846,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint if (bl->type == BL_PC)// Place single cell AoE if hitting a player. skill_castend_pos2(src, bl->x, bl->y, skill_id, skill_lv, tick, 0); break; - case TR_METALIC_FURY: - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); - 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 ) ){ @@ -5881,6 +5875,24 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint } } break; + case TR_METALIC_FURY: + { + if (flag & 1) { + 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); + } else { + int area = skill_get_splash(skill_id, skill_lv); + int count = map_forcountinarea(skill_check_bl_sc,bl->m,bl->x - area,bl->y - area,bl->x + area,bl->y + area,5,BL_MOB,SC_SOUNDBLEND); + if (count > 0){ + map_foreachinarea(skill_area_sub, bl->m, bl->x - area, bl->y - area, bl->x + area, bl->y + area, BL_CHAR, + src, skill_id, skill_lv, tick, flag | BCT_ENEMY | SD_SPLASH | 1, skill_castend_damage_id); + } else{ + 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); + } + } + } + break; //Place units around target case NJ_BAKUENRYU: @@ -16994,6 +17006,28 @@ static bool skill_check_condition_sc_required(map_session_data *sd, unsigned sho return true; } +/** +* Check SC of BL +* @param sc +* @param skill_id +* @return 1 if condition is met, 0 otherwise +**/ + +int skill_check_bl_sc(struct block_list *target, va_list ap) { + + nullpo_ret(target); + + int sc_id = va_arg(ap,int); + + status_change *sc = status_get_sc(target); + + if (sc && sc->getSCE(sc_id)) + return 1; + + return 0; + +} + /** * Check skill condition when cast begin * For ammo, only check if the skill need ammo diff --git a/src/map/skill.hpp b/src/map/skill.hpp index c22e0ad702..4b6c6e2138 100644 --- a/src/map/skill.hpp +++ b/src/map/skill.hpp @@ -587,6 +587,8 @@ int skill_vfcastfix(struct block_list *bl, double time, uint16 skill_id, uint16 #endif int skill_delayfix(struct block_list *bl, uint16 skill_id, uint16 skill_lv); void skill_toggle_magicpower(struct block_list *bl, uint16 skill_id); +//Check sc of bl [Muh] +int skill_check_bl_sc(struct block_list *target, va_list ap); // Skill conditions check and remove [Inkfish] bool skill_check_condition_castbegin(map_session_data *sd, uint16 skill_id, uint16 skill_lv);