|
@@ -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);
|
|
|
}
|
|
|
|
|
|
-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
|
|
|
* @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 NPC_DRAGONBREATH:
|
|
|
return false;
|
|
|
+#ifndef RENEWAL
|
|
|
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)
|
|
|
return false;
|
|
|
+#endif
|
|
|
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 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->statusAtk2 += battle_calc_status_attack(sstatus, EQI_HAND_L);
|
|
|
+ wd->statusAtk += sstatus->batk;
|
|
|
+ wd->statusAtk2 += sstatus->batk;
|
|
|
|
|
|
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);
|
|
@@ -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);
|
|
|
}
|
|
|
|
|
|
+ // Right-hand status attack is doubled after elemental adjustments
|
|
|
+ wd->statusAtk *= 2;
|
|
|
+
|
|
|
// Check critical
|
|
|
if (wd->type == DMG_MULTI_HIT_CRITICAL || wd->type == DMG_CRITICAL)
|
|
|
critical = true;
|
|
@@ -4047,26 +4043,34 @@ static void battle_calc_skill_base_damage(struct Damage* wd, struct block_list *
|
|
|
case LK_SPIRALPIERCE:
|
|
|
case ML_SPIRALPIERCE:
|
|
|
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 &&
|
|
|
sd->inventory_data[index] &&
|
|
|
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);
|
|
|
- wd->masteryAtk = 0; // weapon mastery is ignored for spiral
|
|
|
-
|
|
|
- switch (tstatus->size) { //Size-fix. Is this modified by weapon perfection?
|
|
|
- case SZ_SMALL: //Small: 115%
|
|
|
- ATK_RATE(wd->damage, wd->damage2, 115);
|
|
|
- RE_ALLATK_RATE(wd, 115);
|
|
|
- break;
|
|
|
- //case SZ_MEDIUM: //Medium: 100%
|
|
|
- case SZ_BIG: //Large: 85%
|
|
|
- ATK_RATE(wd->damage, wd->damage2, 85);
|
|
|
- RE_ALLATK_RATE(wd, 85);
|
|
|
+ // 70% damage modifier is applied to base attack + weight
|
|
|
+ ATK_RATE(wd->equipAtk, wd->equipAtk2, 70);
|
|
|
+
|
|
|
+ // Additional skill-specific size fix
|
|
|
+ switch (tstatus->size) {
|
|
|
+ case SZ_SMALL: //Small: 130%
|
|
|
+ ATK_RATE(wd->equipAtk, wd->equipAtk2, 130);
|
|
|
+ break;
|
|
|
+ case SZ_MEDIUM: //Medium: 115%
|
|
|
+ ATK_RATE(wd->equipAtk, wd->equipAtk2, 115);
|
|
|
break;
|
|
|
+ //case SZ_BIG: //Large: 100%
|
|
|
}
|
|
|
} else {
|
|
|
wd->damage = battle_calc_base_damage(src, sstatus, &sstatus->rhw, sc, tstatus->size, 0); //Monsters have no weight and use ATK instead
|