Renewal Spiral Pierce, Element vs. Status Attack (#8411)

- When using Spiral Pierce the base damage will now be multiplied with 0.7
- Weight bonus of Spiral Pierce is no longer affected by elemental adjustments
- Size modifiers updated: Small 130%, Medium 115%, Large 100%
- Spiral Pierce will now store its base damage in equipAtk to prevent rounding errors (temporary solution)
- Status Attack will now first apply the elemental table before doubling the right-hand damage
- Fixes #8410
This commit is contained in:
Playtester 2024-06-10 16:56:59 +02:00 committed by GitHub
parent 17a6d039d9
commit 6daa032144
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -2389,15 +2389,6 @@ static int battle_calc_sizefix(int64 damage, map_session_data *sd, unsigned char
return (int)cap_value(damage, INT_MIN, INT_MAX); return (int)cap_value(damage, INT_MIN, INT_MAX);
} }
static int battle_calc_status_attack(struct status_data *status, short hand)
{
//left-hand penalty on sATK is always 50% [Baalberith]
if (hand == EQI_HAND_L)
return status->batk;
else
return 2 * status->batk;
}
/** /**
* Calculates renewal Variance, OverUpgradeBonus, and SizePenaltyMultiplier of weapon damage parts for player * Calculates renewal Variance, OverUpgradeBonus, and SizePenaltyMultiplier of weapon damage parts for player
* @param src Block list of attacker * @param src Block list of attacker
@ -3401,10 +3392,12 @@ static bool battle_skill_stacks_masteries_vvs(uint16 skill_id, e_bonus_chk_flag
case LG_EARTHDRIVE: case LG_EARTHDRIVE:
case NPC_DRAGONBREATH: case NPC_DRAGONBREATH:
return false; return false;
#ifndef RENEWAL
case LK_SPIRALPIERCE: case LK_SPIRALPIERCE:
// Spiral Pierce is influenced only by refine bonus and Star Crumbs for players // In Pre-Renewal Spiral Pierce is influenced only by refine bonus and Star Crumbs for players
if (chk_flag != BCHK_REFINE && chk_flag != BCHK_STAR) if (chk_flag != BCHK_REFINE && chk_flag != BCHK_STAR)
return false; return false;
#endif
break; break;
} }
@ -3959,8 +3952,8 @@ static void battle_calc_damage_parts(struct Damage* wd, struct block_list *src,s
int right_element = battle_get_weapon_element(wd, src, target, skill_id, skill_lv, EQI_HAND_R, false); int right_element = battle_get_weapon_element(wd, src, target, skill_id, skill_lv, EQI_HAND_R, false);
int left_element = battle_get_weapon_element(wd, src, target, skill_id, skill_lv, EQI_HAND_L, false); int left_element = battle_get_weapon_element(wd, src, target, skill_id, skill_lv, EQI_HAND_L, false);
wd->statusAtk += battle_calc_status_attack(sstatus, EQI_HAND_R); wd->statusAtk += sstatus->batk;
wd->statusAtk2 += battle_calc_status_attack(sstatus, EQI_HAND_L); wd->statusAtk2 += sstatus->batk;
if (sd && sd->sc.getSCE(SC_SEVENWIND)) { // Mild Wind applies element to status ATK as well as weapon ATK [helvetica] if (sd && sd->sc.getSCE(SC_SEVENWIND)) { // Mild Wind applies element to status ATK as well as weapon ATK [helvetica]
wd->statusAtk = battle_attr_fix(src, target, wd->statusAtk, right_element, tstatus->def_ele, tstatus->ele_lv); wd->statusAtk = battle_attr_fix(src, target, wd->statusAtk, right_element, tstatus->def_ele, tstatus->ele_lv);
@ -3970,6 +3963,9 @@ static void battle_calc_damage_parts(struct Damage* wd, struct block_list *src,s
wd->statusAtk2 = battle_attr_fix(src, target, wd->statusAtk2, ELE_NEUTRAL, tstatus->def_ele, tstatus->ele_lv); wd->statusAtk2 = battle_attr_fix(src, target, wd->statusAtk2, ELE_NEUTRAL, tstatus->def_ele, tstatus->ele_lv);
} }
// Right-hand status attack is doubled after elemental adjustments
wd->statusAtk *= 2;
// Check critical // Check critical
if (wd->type == DMG_MULTI_HIT_CRITICAL || wd->type == DMG_CRITICAL) if (wd->type == DMG_MULTI_HIT_CRITICAL || wd->type == DMG_CRITICAL)
critical = true; critical = true;
@ -4047,26 +4043,34 @@ static void battle_calc_skill_base_damage(struct Damage* wd, struct block_list *
case LK_SPIRALPIERCE: case LK_SPIRALPIERCE:
case ML_SPIRALPIERCE: case ML_SPIRALPIERCE:
if (sd) { if (sd) {
short index = sd->equip_index[EQI_HAND_R]; battle_calc_damage_parts(wd, src, target, skill_id, skill_lv);
// Officially statusAtk + weaponAtk + equipAtk make base attack
// We simulate this here by adding them all into equip attack
ATK_ADD2(wd->equipAtk, wd->equipAtk2, wd->statusAtk + wd->weaponAtk, wd->statusAtk2 + wd->weaponAtk2);
// Set statusAtk and weaponAtk to 0
ATK_RATE(wd->statusAtk, wd->statusAtk2, 0);
ATK_RATE(wd->weaponAtk, wd->weaponAtk2, 0);
// Add weight
short index = sd->equip_index[EQI_HAND_R];
if (index >= 0 && if (index >= 0 &&
sd->inventory_data[index] && sd->inventory_data[index] &&
sd->inventory_data[index]->type == IT_WEAPON) sd->inventory_data[index]->type == IT_WEAPON)
wd->equipAtk += sd->inventory_data[index]->weight*7/100; // weight from spear is treated as equipment ATK on official [helvetica] wd->equipAtk += sd->inventory_data[index]->weight / 10;
battle_calc_damage_parts(wd, src, target, skill_id, skill_lv); // 70% damage modifier is applied to base attack + weight
wd->masteryAtk = 0; // weapon mastery is ignored for spiral ATK_RATE(wd->equipAtk, wd->equipAtk2, 70);
switch (tstatus->size) { //Size-fix. Is this modified by weapon perfection? // Additional skill-specific size fix
case SZ_SMALL: //Small: 115% switch (tstatus->size) {
ATK_RATE(wd->damage, wd->damage2, 115); case SZ_SMALL: //Small: 130%
RE_ALLATK_RATE(wd, 115); ATK_RATE(wd->equipAtk, wd->equipAtk2, 130);
break; break;
//case SZ_MEDIUM: //Medium: 100% case SZ_MEDIUM: //Medium: 115%
case SZ_BIG: //Large: 85% ATK_RATE(wd->equipAtk, wd->equipAtk2, 115);
ATK_RATE(wd->damage, wd->damage2, 85);
RE_ALLATK_RATE(wd, 85);
break; break;
//case SZ_BIG: //Large: 100%
} }
} else { } else {
wd->damage = battle_calc_base_damage(src, sstatus, &sstatus->rhw, sc, tstatus->size, 0); //Monsters have no weight and use ATK instead wd->damage = battle_calc_base_damage(src, sstatus, &sstatus->rhw, sc, tstatus->size, 0); //Monsters have no weight and use ATK instead