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:
Atemo 2023-08-16 22:21:26 +02:00 committed by GitHub
parent 6611aa731c
commit eadfa053f6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 94 additions and 57 deletions

View File

@ -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

View File

@ -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;

View File

@ -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

View File

@ -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);