Rebalance Troubadour & Trouvere 20220608 (3rd) (#7898)
* Sound Blend - Reduces SP consumption from 128 to 80 based on level 5. * Metallic Fury - Reduces cooldown from 0.5 seconds to 0.3 seconds. - Reduces SP consumption from 168 to 94 based on level 5. - Reduces AP recovery rate from 3 to 2 based on level 5. - Increases damage from 4500%/4950~6750%(area damage according to number of branded target)Matk to 11000%/12500~18500%(area damage according to number of branded target)Matk based on level 5. * Rhythm Shooting - Adds 0.15 seconds cooldown. - Removes 0.15 seconds delay after skill. - Reduces SP consumption from 90 to 52 based on level 5. - Increases damage from 600%/780%(branded target)Atk to 800%/1400%(branded target)Atk based on level 5. - Increases factor weight of CON in skill formula from 2 to 3. * Rose Blossom - Reduces variable casting time from 2 seconds to 1 second. - Increases cooldown from 0.5 seconds to 0.7 seconds. - Reduces SP consumption from 125 to 94 based on level 5. - Increases damage from 3750%/1750%(area damage)Atk to 11200%/15250%(area damage)Atk based on level 5. - Increases factor weight of CON in skill formula from 3/2(area damage) to 3/3(area damage). Checked against https://github.com/rathena/rathena/pull/7024 Credit to @datawulf for Metallic Fury update
This commit is contained in:
parent
6611aa731c
commit
eadfa053f6
@ -40229,20 +40229,20 @@ Body:
|
|||||||
CastTime: 1000
|
CastTime: 1000
|
||||||
AfterCastActDelay: 500
|
AfterCastActDelay: 500
|
||||||
Duration1: 500
|
Duration1: 500
|
||||||
Cooldown: 500
|
Cooldown: 700
|
||||||
FixedCastTime: 1000
|
FixedCastTime: 1000
|
||||||
Requires:
|
Requires:
|
||||||
SpCost:
|
SpCost:
|
||||||
- Level: 1
|
- Level: 1
|
||||||
Amount: 105
|
Amount: 70
|
||||||
- Level: 2
|
- Level: 2
|
||||||
Amount: 110
|
Amount: 76
|
||||||
- Level: 3
|
- Level: 3
|
||||||
Amount: 115
|
Amount: 82
|
||||||
- Level: 4
|
- Level: 4
|
||||||
Amount: 120
|
Amount: 88
|
||||||
- Level: 5
|
- Level: 5
|
||||||
Amount: 125
|
Amount: 94
|
||||||
Weapon:
|
Weapon:
|
||||||
Bow: true
|
Bow: true
|
||||||
Musical: true
|
Musical: true
|
||||||
@ -40299,21 +40299,21 @@ Body:
|
|||||||
Amount: 2
|
Amount: 2
|
||||||
CastCancel: true
|
CastCancel: true
|
||||||
CastTime: 1000
|
CastTime: 1000
|
||||||
AfterCastActDelay: 500
|
AfterCastActDelay: 350
|
||||||
Cooldown: 1000
|
Cooldown: 1150
|
||||||
FixedCastTime: 1000
|
FixedCastTime: 1000
|
||||||
Requires:
|
Requires:
|
||||||
SpCost:
|
SpCost:
|
||||||
- Level: 1
|
- Level: 1
|
||||||
Amount: 66
|
Amount: 36
|
||||||
- Level: 2
|
- Level: 2
|
||||||
Amount: 72
|
Amount: 40
|
||||||
- Level: 3
|
- Level: 3
|
||||||
Amount: 78
|
Amount: 44
|
||||||
- Level: 4
|
- Level: 4
|
||||||
Amount: 84
|
Amount: 48
|
||||||
- Level: 5
|
- Level: 5
|
||||||
Amount: 90
|
Amount: 52
|
||||||
Weapon:
|
Weapon:
|
||||||
Bow: true
|
Bow: true
|
||||||
Musical: true
|
Musical: true
|
||||||
@ -40344,31 +40344,21 @@ Body:
|
|||||||
Area: 3
|
Area: 3
|
||||||
- Level: 5
|
- Level: 5
|
||||||
Area: 3
|
Area: 3
|
||||||
GiveAp:
|
GiveAp: 2
|
||||||
- Level: 1
|
|
||||||
Amount: 2
|
|
||||||
- Level: 2
|
|
||||||
Amount: 2
|
|
||||||
- Level: 3
|
|
||||||
Amount: 2
|
|
||||||
- Level: 4
|
|
||||||
Amount: 3
|
|
||||||
- Level: 5
|
|
||||||
Amount: 3
|
|
||||||
CastCancel: true
|
CastCancel: true
|
||||||
Cooldown: 500
|
Cooldown: 300
|
||||||
Requires:
|
Requires:
|
||||||
SpCost:
|
SpCost:
|
||||||
- Level: 1
|
- Level: 1
|
||||||
Amount: 120
|
Amount: 70
|
||||||
- Level: 2
|
- Level: 2
|
||||||
Amount: 132
|
Amount: 76
|
||||||
- Level: 3
|
- Level: 3
|
||||||
Amount: 144
|
Amount: 82
|
||||||
- Level: 4
|
- Level: 4
|
||||||
Amount: 156
|
Amount: 88
|
||||||
- Level: 5
|
- Level: 5
|
||||||
Amount: 168
|
Amount: 94
|
||||||
Weapon:
|
Weapon:
|
||||||
Musical: true
|
Musical: true
|
||||||
Whip: true
|
Whip: true
|
||||||
@ -40436,15 +40426,15 @@ Body:
|
|||||||
Requires:
|
Requires:
|
||||||
SpCost:
|
SpCost:
|
||||||
- Level: 1
|
- Level: 1
|
||||||
Amount: 80
|
Amount: 40
|
||||||
- Level: 2
|
- Level: 2
|
||||||
Amount: 92
|
Amount: 50
|
||||||
- Level: 3
|
- Level: 3
|
||||||
Amount: 104
|
Amount: 60
|
||||||
- Level: 4
|
- Level: 4
|
||||||
Amount: 116
|
Amount: 70
|
||||||
- Level: 5
|
- Level: 5
|
||||||
Amount: 128
|
Amount: 80
|
||||||
Weapon:
|
Weapon:
|
||||||
Musical: true
|
Musical: true
|
||||||
Whip: true
|
Whip: true
|
||||||
|
@ -5626,46 +5626,57 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
|
|||||||
RE_LVL_DMOD(100);
|
RE_LVL_DMOD(100);
|
||||||
break;
|
break;
|
||||||
case TR_ROSEBLOSSOM:
|
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 ) ){
|
if( tsc != nullptr && tsc->getSCE( SC_SOUNDBLEND ) ){
|
||||||
skillratio += 250 * skill_lv;
|
skillratio += 200 * skill_lv;
|
||||||
}
|
}
|
||||||
|
|
||||||
RE_LVL_DMOD(100);
|
RE_LVL_DMOD(100);
|
||||||
if (sc && sc->getSCE(SC_MYSTIC_SYMPHONY)) {
|
if (sc && sc->getSCE(SC_MYSTIC_SYMPHONY)) {
|
||||||
skillratio += skillratio * 100 / 100;
|
skillratio *= 2;
|
||||||
|
|
||||||
if (tstatus->race == RC_FISH || tstatus->race == RC_DEMIHUMAN)
|
if (tstatus->race == RC_FISH || tstatus->race == RC_DEMIHUMAN)
|
||||||
skillratio += skillratio * 50 / 100;
|
skillratio += skillratio * 50 / 100;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case TR_ROSEBLOSSOM_ATK:
|
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 ) ){
|
if( tsc != nullptr && tsc->getSCE( SC_SOUNDBLEND ) ){
|
||||||
skillratio += 400 * skill_lv;
|
skillratio += 200 * skill_lv;
|
||||||
}
|
}
|
||||||
|
|
||||||
RE_LVL_DMOD(100);
|
RE_LVL_DMOD(100);
|
||||||
if (sc && sc->getSCE(SC_MYSTIC_SYMPHONY)) {
|
if (sc && sc->getSCE(SC_MYSTIC_SYMPHONY)) {
|
||||||
skillratio += skillratio * 100 / 100;
|
skillratio *= 2;
|
||||||
|
|
||||||
if (tstatus->race == RC_FISH || tstatus->race == RC_DEMIHUMAN)
|
if (tstatus->race == RC_FISH || tstatus->race == RC_DEMIHUMAN)
|
||||||
skillratio += skillratio * 50 / 100;
|
skillratio += skillratio * 50 / 100;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case TR_RHYTHMSHOOTING:
|
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);
|
RE_LVL_DMOD(100);
|
||||||
if (sc && sc->getSCE(SC_MYSTIC_SYMPHONY)) {
|
if (sc && sc->getSCE(SC_MYSTIC_SYMPHONY)) {
|
||||||
skillratio += skillratio * 100 / 100;
|
skillratio *= 2;
|
||||||
|
|
||||||
if (tstatus->race == RC_FISH || tstatus->race == RC_DEMIHUMAN)
|
if (tstatus->race == RC_FISH || tstatus->race == RC_DEMIHUMAN)
|
||||||
skillratio += skillratio * 50 / 100;
|
skillratio += skillratio * 50 / 100;
|
||||||
}
|
}
|
||||||
if (tsc && tsc->getSCE(SC_SOUNDBLEND))
|
|
||||||
skillratio += skillratio * 50 / 100;
|
|
||||||
break;
|
break;
|
||||||
case ABR_BATTLE_BUSTER:// Need official formula.
|
case ABR_BATTLE_BUSTER:// Need official formula.
|
||||||
case ABR_DUAL_CANNON_FIRE:// 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)
|
if (mflag == 2)
|
||||||
ad.div_ = 2;
|
ad.div_ = 2;
|
||||||
break;
|
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:
|
case AG_CRIMSON_ARROW_ATK:
|
||||||
if( sc != nullptr && sc->getSCE( SC_CLIMAX ) ){
|
if( sc != nullptr && sc->getSCE( SC_CLIMAX ) ){
|
||||||
ad.div_ = 2;
|
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;
|
skillratio += -100 + ( 570 + 20 * pc_checkskill( sd, ABC_MAGIC_SWORD_M ) ) * skill_lv + 5 * sstatus->spl;
|
||||||
RE_LVL_DMOD(100);
|
RE_LVL_DMOD(100);
|
||||||
break;
|
break;
|
||||||
case TR_METALIC_FURY:
|
case TR_METALIC_FURY: {
|
||||||
skillratio += -100 + 900 * skill_lv + 5 * sstatus->spl;
|
int area = skill_get_splash(skill_id, skill_lv);
|
||||||
RE_LVL_DMOD(100);
|
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;
|
break;
|
||||||
case TR_SOUNDBLEND:
|
case TR_SOUNDBLEND:
|
||||||
skillratio += -100 + 120 * skill_lv + 5 * sstatus->spl;
|
skillratio += -100 + 120 * skill_lv + 5 * sstatus->spl;
|
||||||
|
@ -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_WIND:
|
||||||
case BO_ACIDIFIED_ZONE_FIRE:
|
case BO_ACIDIFIED_ZONE_FIRE:
|
||||||
case TR_ROSEBLOSSOM_ATK:
|
case TR_ROSEBLOSSOM_ATK:
|
||||||
case TR_METALIC_FURY:
|
|
||||||
case ABC_FROM_THE_ABYSS_ATK:
|
case ABC_FROM_THE_ABYSS_ATK:
|
||||||
case EM_ELEMENTAL_BUSTER_FIRE:
|
case EM_ELEMENTAL_BUSTER_FIRE:
|
||||||
case EM_ELEMENTAL_BUSTER_WATER:
|
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.
|
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);
|
skill_castend_pos2(src, bl->x, bl->y, skill_id, skill_lv, tick, 0);
|
||||||
break;
|
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:
|
case MT_RUSH_QUAKE:
|
||||||
// Jump to the target before attacking.
|
// Jump to the target before attacking.
|
||||||
if( skill_check_unit_movepos( 5, src, bl->x, bl->y, 0, 1 ) ){
|
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;
|
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
|
//Place units around target
|
||||||
case NJ_BAKUENRYU:
|
case NJ_BAKUENRYU:
|
||||||
@ -16994,6 +17006,28 @@ static bool skill_check_condition_sc_required(map_session_data *sd, unsigned sho
|
|||||||
return true;
|
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
|
* Check skill condition when cast begin
|
||||||
* For ammo, only check if the skill need ammo
|
* For ammo, only check if the skill need ammo
|
||||||
|
@ -587,6 +587,8 @@ int skill_vfcastfix(struct block_list *bl, double time, uint16 skill_id, uint16
|
|||||||
#endif
|
#endif
|
||||||
int skill_delayfix(struct block_list *bl, uint16 skill_id, uint16 skill_lv);
|
int skill_delayfix(struct block_list *bl, uint16 skill_id, uint16 skill_lv);
|
||||||
void skill_toggle_magicpower(struct block_list *bl, uint16 skill_id);
|
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]
|
// Skill conditions check and remove [Inkfish]
|
||||||
bool skill_check_condition_castbegin(map_session_data *sd, uint16 skill_id, uint16 skill_lv);
|
bool skill_check_condition_castbegin(map_session_data *sd, uint16 skill_id, uint16 skill_lv);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user