Implemented item bonuses bWeaponAtkRate and bWeaponMatkRate (fixes #1161)
* Increases an equipped weapon's ATK/MATK by given rate. * bWeaponMatkRate does not work in pre-renewal as there is no MATK for weapons in pre-renewal. * Renamed 'bonus2 bWeaponAtkRate' to 'bonus2 bWeaponDamageRate'. - Seems to be unused in the current item database. - Damage fits the bonus name better as it increased the final damage, not the weapon's attack specifically.
This commit is contained in:
parent
af8524aa7d
commit
952b072468
@ -109,8 +109,10 @@ bonus bBaseAtk,n; Basic attack power + n
|
|||||||
bonus bAtk,n; ATK + n (unofficial)
|
bonus bAtk,n; ATK + n (unofficial)
|
||||||
bonus bAtk2,n; ATK2 + n
|
bonus bAtk2,n; ATK2 + n
|
||||||
bonus bAtkRate,n; Attack power + n%
|
bonus bAtkRate,n; Attack power + n%
|
||||||
|
bonus bWeaponAtkRate,n; Weapon ATK + n%
|
||||||
bonus bMatk,n; Magical attack power + n
|
bonus bMatk,n; Magical attack power + n
|
||||||
bonus bMatkRate,n; Magical attack power + n%
|
bonus bMatkRate,n; Magical attack power + n%
|
||||||
|
bonus bWeaponMatkRate,n; Weapon Magical ATK + n% (renewal mode only)
|
||||||
bonus bDef,n; Equipment DEF + n
|
bonus bDef,n; Equipment DEF + n
|
||||||
bonus bDefRate,n; Equipment DEF + n%
|
bonus bDefRate,n; Equipment DEF + n%
|
||||||
bonus bDef2,n; VIT based DEF + n
|
bonus bDef2,n; VIT based DEF + n
|
||||||
@ -166,7 +168,7 @@ bonus bLongAtkRate,n; Increases damage of ranged attacks by n%
|
|||||||
bonus bCritAtkRate,n; Increases critical damage by +n%
|
bonus bCritAtkRate,n; Increases critical damage by +n%
|
||||||
bonus bCriticalDef,n; Decreases the chance of being hit by critical hits by n%
|
bonus bCriticalDef,n; Decreases the chance of being hit by critical hits by n%
|
||||||
bonus2 bWeaponAtk,w,n; Adds n ATK when weapon of type w is equipped
|
bonus2 bWeaponAtk,w,n; Adds n ATK when weapon of type w is equipped
|
||||||
bonus2 bWeaponAtkRate,w,n; Adds n% damage to normal attacks when weapon of type w is equipped
|
bonus2 bWeaponDamageRate,w,n; Adds n% damage to normal attacks when weapon of type w is equipped
|
||||||
|
|
||||||
bonus bNearAtkDef,n; Adds n% damage reduction against melee physical attacks
|
bonus bNearAtkDef,n; Adds n% damage reduction against melee physical attacks
|
||||||
bonus bLongAtkDef,n; Adds n% damage reduction against ranged physical attacks
|
bonus bLongAtkDef,n; Adds n% damage reduction against ranged physical attacks
|
||||||
|
@ -1942,18 +1942,18 @@ static int64 battle_calc_base_damage(struct status_data *status, struct weapon_a
|
|||||||
damage += status->batk;
|
damage += status->batk;
|
||||||
|
|
||||||
//rodatazone says that Overrefine bonuses are part of baseatk
|
//rodatazone says that Overrefine bonuses are part of baseatk
|
||||||
//Here we also apply the weapon_atk_rate bonus so it is correctly applied on left/right hands.
|
//Here we also apply the weapon_damage_rate bonus so it is correctly applied on left/right hands.
|
||||||
if(sd) {
|
if(sd) {
|
||||||
if (type == EQI_HAND_L) {
|
if (type == EQI_HAND_L) {
|
||||||
if(sd->left_weapon.overrefine)
|
if(sd->left_weapon.overrefine)
|
||||||
damage += rnd()%sd->left_weapon.overrefine+1;
|
damage += rnd()%sd->left_weapon.overrefine+1;
|
||||||
if (sd->weapon_atk_rate[sd->weapontype2])
|
if (sd->weapon_damage_rate[sd->weapontype2])
|
||||||
damage += damage * sd->weapon_atk_rate[sd->weapontype2] / 100;
|
damage += damage * sd->weapon_damage_rate[sd->weapontype2] / 100;
|
||||||
} else { //Right hand
|
} else { //Right hand
|
||||||
if(sd->right_weapon.overrefine)
|
if(sd->right_weapon.overrefine)
|
||||||
damage += rnd()%sd->right_weapon.overrefine+1;
|
damage += rnd()%sd->right_weapon.overrefine+1;
|
||||||
if (sd->weapon_atk_rate[sd->weapontype1])
|
if (sd->weapon_damage_rate[sd->weapontype1])
|
||||||
damage += damage * sd->weapon_atk_rate[sd->weapontype1] / 100;
|
damage += damage * sd->weapon_damage_rate[sd->weapontype1] / 100;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -439,7 +439,7 @@ enum _sp {
|
|||||||
SP_MAGIC_DAMAGE_RETURN,SP_ALL_STATS=1073,SP_AGI_VIT,SP_AGI_DEX_STR,SP_PERFECT_HIDE, // 1071-1076
|
SP_MAGIC_DAMAGE_RETURN,SP_ALL_STATS=1073,SP_AGI_VIT,SP_AGI_DEX_STR,SP_PERFECT_HIDE, // 1071-1076
|
||||||
SP_NO_KNOCKBACK,SP_CLASSCHANGE, // 1077-1078
|
SP_NO_KNOCKBACK,SP_CLASSCHANGE, // 1077-1078
|
||||||
SP_HP_DRAIN_VALUE,SP_SP_DRAIN_VALUE, // 1079-1080
|
SP_HP_DRAIN_VALUE,SP_SP_DRAIN_VALUE, // 1079-1080
|
||||||
SP_WEAPON_ATK,SP_WEAPON_ATK_RATE, // 1081-1082
|
SP_WEAPON_ATK,SP_WEAPON_DAMAGE_RATE, // 1081-1082
|
||||||
SP_DELAYRATE,SP_HP_DRAIN_VALUE_RACE, SP_SP_DRAIN_VALUE_RACE, // 1083-1085
|
SP_DELAYRATE,SP_HP_DRAIN_VALUE_RACE, SP_SP_DRAIN_VALUE_RACE, // 1083-1085
|
||||||
SP_IGNORE_MDEF_RACE_RATE,SP_IGNORE_DEF_RACE_RATE,SP_SKILL_HEAL2,SP_ADDEFF_ONSKILL, //1086-1089
|
SP_IGNORE_MDEF_RACE_RATE,SP_IGNORE_DEF_RACE_RATE,SP_SKILL_HEAL2,SP_ADDEFF_ONSKILL, //1086-1089
|
||||||
SP_ADD_HEAL_RATE,SP_ADD_HEAL2_RATE, SP_EQUIP_ATK, //1090-1092
|
SP_ADD_HEAL_RATE,SP_ADD_HEAL2_RATE, SP_EQUIP_ATK, //1090-1092
|
||||||
@ -465,7 +465,8 @@ enum _sp {
|
|||||||
SP_WEAPON_COMA_CLASS, SP_IGNORE_MDEF_CLASS_RATE, SP_EXP_ADDCLASS, SP_ADD_CLASS_DROP_ITEM, //2067-2070
|
SP_WEAPON_COMA_CLASS, SP_IGNORE_MDEF_CLASS_RATE, SP_EXP_ADDCLASS, SP_ADD_CLASS_DROP_ITEM, //2067-2070
|
||||||
SP_ADD_CLASS_DROP_ITEMGROUP, SP_ADDMAXWEIGHT, SP_ADD_ITEMGROUP_HEAL_RATE, // 2071-2073
|
SP_ADD_CLASS_DROP_ITEMGROUP, SP_ADDMAXWEIGHT, SP_ADD_ITEMGROUP_HEAL_RATE, // 2071-2073
|
||||||
SP_HP_VANISH_RACE_RATE, SP_SP_VANISH_RACE_RATE, SP_ABSORB_DMG_MAXHP, SP_SUB_SKILL, SP_SUBDEF_ELE, // 2074-2078
|
SP_HP_VANISH_RACE_RATE, SP_SP_VANISH_RACE_RATE, SP_ABSORB_DMG_MAXHP, SP_SUB_SKILL, SP_SUBDEF_ELE, // 2074-2078
|
||||||
SP_STATE_NORECOVER_RACE, SP_CRITICAL_RANGEATK, SP_MAGIC_ADDRACE2, SP_IGNORE_MDEF_RACE2_RATE // 2079-2082
|
SP_STATE_NORECOVER_RACE, SP_CRITICAL_RANGEATK, SP_MAGIC_ADDRACE2, SP_IGNORE_MDEF_RACE2_RATE, // 2079-2082
|
||||||
|
SP_WEAPON_ATK_RATE, SP_WEAPON_MATK_RATE, // 2083-2084
|
||||||
};
|
};
|
||||||
|
|
||||||
enum _look {
|
enum _look {
|
||||||
|
12
src/map/pc.c
12
src/map/pc.c
@ -3036,6 +3036,14 @@ void pc_bonus(struct map_session_data *sd,int type,int val)
|
|||||||
else
|
else
|
||||||
sd->bonus.arrow_cri += val*10;
|
sd->bonus.arrow_cri += val*10;
|
||||||
break;
|
break;
|
||||||
|
case SP_WEAPON_ATK_RATE:
|
||||||
|
if (sd->state.lr_flag != 2)
|
||||||
|
sd->bonus.weapon_atk_rate += val;
|
||||||
|
break;
|
||||||
|
case SP_WEAPON_MATK_RATE:
|
||||||
|
if (sd->state.lr_flag != 2)
|
||||||
|
sd->bonus.weapon_matk_rate += val;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
ShowWarning("pc_bonus: unknown type %d %d !\n",type,val);
|
ShowWarning("pc_bonus: unknown type %d %d !\n",type,val);
|
||||||
break;
|
break;
|
||||||
@ -3292,9 +3300,9 @@ void pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
|
|||||||
if(sd->state.lr_flag != 2)
|
if(sd->state.lr_flag != 2)
|
||||||
sd->weapon_atk[type2]+=val;
|
sd->weapon_atk[type2]+=val;
|
||||||
break;
|
break;
|
||||||
case SP_WEAPON_ATK_RATE: // bonus2 bWeaponAtkRate,w,n;
|
case SP_WEAPON_DAMAGE_RATE: // bonus2 bWeaponDamageRate,w,n;
|
||||||
if(sd->state.lr_flag != 2)
|
if(sd->state.lr_flag != 2)
|
||||||
sd->weapon_atk_rate[type2]+=val;
|
sd->weapon_damage_rate[type2]+=val;
|
||||||
break;
|
break;
|
||||||
case SP_CRITICAL_ADDRACE: // bonus2 bCriticalAddRace,r,n;
|
case SP_CRITICAL_ADDRACE: // bonus2 bCriticalAddRace,r,n;
|
||||||
PC_BONUS_CHK_RACE(type2,SP_CRITICAL_ADDRACE);
|
PC_BONUS_CHK_RACE(type2,SP_CRITICAL_ADDRACE);
|
||||||
|
@ -348,7 +348,7 @@ struct map_session_data {
|
|||||||
short weapon_coma_race[RC_MAX];
|
short weapon_coma_race[RC_MAX];
|
||||||
short weapon_coma_class[CLASS_MAX];
|
short weapon_coma_class[CLASS_MAX];
|
||||||
int weapon_atk[16];
|
int weapon_atk[16];
|
||||||
int weapon_atk_rate[16];
|
int weapon_damage_rate[16];
|
||||||
int arrow_addele[ELE_MAX];
|
int arrow_addele[ELE_MAX];
|
||||||
int arrow_addrace[RC_MAX];
|
int arrow_addrace[RC_MAX];
|
||||||
int arrow_addclass[CLASS_MAX];
|
int arrow_addclass[CLASS_MAX];
|
||||||
@ -458,6 +458,7 @@ struct map_session_data {
|
|||||||
int eatk; // atk bonus from equipment
|
int eatk; // atk bonus from equipment
|
||||||
uint8 absorb_dmg_maxhp; // [Cydh]
|
uint8 absorb_dmg_maxhp; // [Cydh]
|
||||||
short critical_rangeatk;
|
short critical_rangeatk;
|
||||||
|
short weapon_atk_rate, weapon_matk_rate;
|
||||||
} bonus;
|
} bonus;
|
||||||
// zeroed vars end here.
|
// zeroed vars end here.
|
||||||
|
|
||||||
|
@ -509,9 +509,11 @@
|
|||||||
script_set_constant("bDoubleAddRate",SP_DOUBLE_ADD_RATE,false);
|
script_set_constant("bDoubleAddRate",SP_DOUBLE_ADD_RATE,false);
|
||||||
script_set_constant("bSkillHeal",SP_SKILL_HEAL,false);
|
script_set_constant("bSkillHeal",SP_SKILL_HEAL,false);
|
||||||
script_set_constant("bMatkRate",SP_MATK_RATE,false);
|
script_set_constant("bMatkRate",SP_MATK_RATE,false);
|
||||||
|
script_set_constant("bWeaponMatkRate",SP_WEAPON_MATK_RATE,false);
|
||||||
script_set_constant("bIgnoreDefEle",SP_IGNORE_DEF_ELE,false);
|
script_set_constant("bIgnoreDefEle",SP_IGNORE_DEF_ELE,false);
|
||||||
script_set_constant("bIgnoreDefRace",SP_IGNORE_DEF_RACE,false);
|
script_set_constant("bIgnoreDefRace",SP_IGNORE_DEF_RACE,false);
|
||||||
script_set_constant("bAtkRate",SP_ATK_RATE,false);
|
script_set_constant("bAtkRate",SP_ATK_RATE,false);
|
||||||
|
script_set_constant("bWeaponAtkRate",SP_WEAPON_ATK_RATE,false);
|
||||||
script_set_constant("bSpeedAddRate",SP_SPEED_ADDRATE,false);
|
script_set_constant("bSpeedAddRate",SP_SPEED_ADDRATE,false);
|
||||||
script_set_constant("bSPRegenRate",SP_SP_REGEN_RATE,false);
|
script_set_constant("bSPRegenRate",SP_SP_REGEN_RATE,false);
|
||||||
script_set_constant("bMagicAtkDef",SP_MAGIC_ATK_DEF,false);
|
script_set_constant("bMagicAtkDef",SP_MAGIC_ATK_DEF,false);
|
||||||
@ -564,7 +566,7 @@
|
|||||||
script_set_constant("bHPDrainValue",SP_HP_DRAIN_VALUE,false);
|
script_set_constant("bHPDrainValue",SP_HP_DRAIN_VALUE,false);
|
||||||
script_set_constant("bSPDrainValue",SP_SP_DRAIN_VALUE,false);
|
script_set_constant("bSPDrainValue",SP_SP_DRAIN_VALUE,false);
|
||||||
script_set_constant("bWeaponAtk",SP_WEAPON_ATK,false);
|
script_set_constant("bWeaponAtk",SP_WEAPON_ATK,false);
|
||||||
script_set_constant("bWeaponAtkRate",SP_WEAPON_ATK_RATE,false);
|
script_set_constant("bWeaponDamageRate",SP_WEAPON_DAMAGE_RATE,false);
|
||||||
script_set_constant("bDelayrate",SP_DELAYRATE,false);
|
script_set_constant("bDelayrate",SP_DELAYRATE,false);
|
||||||
script_set_constant("bHPDrainValueRace",SP_HP_DRAIN_VALUE_RACE,false);
|
script_set_constant("bHPDrainValueRace",SP_HP_DRAIN_VALUE_RACE,false);
|
||||||
script_set_constant("bSPDrainValueRace",SP_SP_DRAIN_VALUE_RACE,false);
|
script_set_constant("bSPDrainValueRace",SP_SP_DRAIN_VALUE_RACE,false);
|
||||||
|
@ -2303,13 +2303,17 @@ unsigned short status_base_atk(const struct block_list *bl, const struct status_
|
|||||||
* @param status: Player status
|
* @param status: Player status
|
||||||
* @return weapon attack
|
* @return weapon attack
|
||||||
*/
|
*/
|
||||||
unsigned int status_weapon_atk(struct weapon_atk wa, struct status_data *status)
|
unsigned int status_weapon_atk(struct weapon_atk wa, struct map_session_data *sd)
|
||||||
{
|
{
|
||||||
float str = status->str;
|
float str = sd->base_status.str;
|
||||||
|
int weapon_atk_bonus = 0;
|
||||||
|
|
||||||
if (wa.range > 3)
|
if (wa.range > 3)
|
||||||
str = status->dex;
|
str = sd->base_status.dex;
|
||||||
// wa.at2 = refinement, wa.atk = base equip atk, wa.atk*str/200 = bonus str
|
if (sd->bonus.weapon_atk_rate)
|
||||||
return wa.atk + wa.atk2 + (int)(wa.atk * (str/200));
|
weapon_atk_bonus = wa.atk * sd->bonus.weapon_atk_rate / 100;
|
||||||
|
// wa.atk2 = refinement, wa.atk = base equip atk, wa.atk*str/200 = bonus str
|
||||||
|
return wa.atk + wa.atk2 + (int)(wa.atk * (str/200) + weapon_atk_bonus);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -3097,7 +3101,7 @@ int status_calc_pc_(struct map_session_data* sd, enum e_status_calc_opt opt)
|
|||||||
+ sizeof(sd->weapon_coma_race)
|
+ sizeof(sd->weapon_coma_race)
|
||||||
+ sizeof(sd->weapon_coma_class)
|
+ sizeof(sd->weapon_coma_class)
|
||||||
+ sizeof(sd->weapon_atk)
|
+ sizeof(sd->weapon_atk)
|
||||||
+ sizeof(sd->weapon_atk_rate)
|
+ sizeof(sd->weapon_damage_rate)
|
||||||
+ sizeof(sd->arrow_addele)
|
+ sizeof(sd->arrow_addele)
|
||||||
+ sizeof(sd->arrow_addrace)
|
+ sizeof(sd->arrow_addrace)
|
||||||
+ sizeof(sd->arrow_addclass)
|
+ sizeof(sd->arrow_addclass)
|
||||||
@ -3246,6 +3250,8 @@ int status_calc_pc_(struct map_session_data* sd, enum e_status_calc_opt opt)
|
|||||||
wa->atk2 = refine_info[wlv].bonus[r-1] / 100;
|
wa->atk2 = refine_info[wlv].bonus[r-1] / 100;
|
||||||
#ifdef RENEWAL
|
#ifdef RENEWAL
|
||||||
wa->matk += sd->inventory_data[index]->matk;
|
wa->matk += sd->inventory_data[index]->matk;
|
||||||
|
if (sd->bonus.weapon_matk_rate)
|
||||||
|
wa->matk += sd->inventory_data[index]->matk * sd->bonus.weapon_matk_rate / 100;
|
||||||
wa->wlv = wlv;
|
wa->wlv = wlv;
|
||||||
if(r && sd->weapontype1 != W_BOW) // Renewal magic attack refine bonus
|
if(r && sd->weapontype1 != W_BOW) // Renewal magic attack refine bonus
|
||||||
wa->matk += refine_info[wlv].bonus[r-1] / 100;
|
wa->matk += refine_info[wlv].bonus[r-1] / 100;
|
||||||
@ -3496,8 +3502,8 @@ int status_calc_pc_(struct map_session_data* sd, enum e_status_calc_opt opt)
|
|||||||
if((skill=pc_checkskill(sd,BS_HILTBINDING))>0)
|
if((skill=pc_checkskill(sd,BS_HILTBINDING))>0)
|
||||||
base_status->batk += 4;
|
base_status->batk += 4;
|
||||||
#else
|
#else
|
||||||
base_status->watk = status_weapon_atk(base_status->rhw, base_status);
|
base_status->watk = status_weapon_atk(base_status->rhw, sd);
|
||||||
base_status->watk2 = status_weapon_atk(base_status->lhw, base_status);
|
base_status->watk2 = status_weapon_atk(base_status->lhw, sd);
|
||||||
base_status->eatk = max(sd->bonus.eatk,0);
|
base_status->eatk = max(sd->bonus.eatk,0);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -4468,6 +4474,8 @@ void status_calc_bl_main(struct block_list *bl, /*enum scb_flag*/int flag)
|
|||||||
if (!sd) // Should not affect weapon refine bonus
|
if (!sd) // Should not affect weapon refine bonus
|
||||||
status->rhw.atk2 = status_calc_watk(bl, sc, b_status->rhw.atk2);
|
status->rhw.atk2 = status_calc_watk(bl, sc, b_status->rhw.atk2);
|
||||||
|
|
||||||
|
if (sd && sd->bonus.weapon_atk_rate)
|
||||||
|
status->rhw.atk += status->rhw.atk * sd->bonus.weapon_atk_rate / 100;
|
||||||
if(b_status->lhw.atk) {
|
if(b_status->lhw.atk) {
|
||||||
if (sd) {
|
if (sd) {
|
||||||
sd->state.lr_flag = 1;
|
sd->state.lr_flag = 1;
|
||||||
|
@ -2250,7 +2250,7 @@ int status_change_spread(struct block_list *src, struct block_list *bl, bool typ
|
|||||||
unsigned short status_base_matk_min(const struct status_data* status);
|
unsigned short status_base_matk_min(const struct status_data* status);
|
||||||
unsigned short status_base_matk_max(const struct status_data* status);
|
unsigned short status_base_matk_max(const struct status_data* status);
|
||||||
#else
|
#else
|
||||||
unsigned int status_weapon_atk(struct weapon_atk wa, struct status_data *status);
|
unsigned int status_weapon_atk(struct weapon_atk wa, struct map_session_data *sd);
|
||||||
unsigned short status_base_matk(struct block_list *bl, const struct status_data* status, int level);
|
unsigned short status_base_matk(struct block_list *bl, const struct status_data* status, int level);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user