Removes the 100% rate cap for SC defense (#6926)

* Status changes are simply not capped to 100%.
* Adjusts to utilize util::safe_addition_cap.
Thanks to @Playtester!
This commit is contained in:
Aleos 2022-05-09 17:12:59 -04:00 committed by GitHub
parent cfa9776a28
commit 0615b843d7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 18 additions and 25 deletions

View File

@ -2677,7 +2677,7 @@ static void pc_bonus_autospell(std::vector<s_autospell> &spell, uint16 id, uint1
if ((it.card_id == card_id || it.rate < 0 || rate < 0) && it.id == id && it.lv == lv && it.battle_flag == battle_flag && it.flag == flag) {
if (!battle_config.autospell_stacking && it.rate > 0 && rate > 0) // Stacking disabled
return;
it.rate = cap_value(it.rate + rate, -10000, 10000);
it.rate = util::safe_addition_cap(it.rate, rate, (short)10000);
return;
}
}
@ -2743,7 +2743,7 @@ static void pc_bonus_autospell_onskill(std::vector<s_autospell> &spell, uint16 s
* @param flag: Target flag
* @param duration: Duration. If 0 use default duration lookup for associated skill with level 7
*/
static void pc_bonus_addeff(std::vector<s_addeffect> &effect, enum sc_type sc, short rate, short arrow_rate, unsigned char flag, unsigned int duration)
static void pc_bonus_addeff(std::vector<s_addeffect> &effect, enum sc_type sc, int rate, short arrow_rate, unsigned char flag, unsigned int duration)
{
if (effect.size() == MAX_PC_BONUS) {
ShowWarning("pc_bonus_addeff: Reached max (%d) number of add effects per character!\n", MAX_PC_BONUS);
@ -2762,8 +2762,8 @@ static void pc_bonus_addeff(std::vector<s_addeffect> &effect, enum sc_type sc, s
for (auto &it : effect) {
if (it.sc == sc && it.flag == flag) {
it.rate = cap_value(it.rate + rate, -10000, 10000);
it.arrow_rate += arrow_rate;
it.rate = util::safe_addition_cap(it.rate, rate, INT_MAX);
it.arrow_rate = util::safe_addition_cap(it.arrow_rate, arrow_rate, (short)SHRT_MAX);
it.duration = umax(it.duration, duration);
return;
}
@ -2771,11 +2771,8 @@ static void pc_bonus_addeff(std::vector<s_addeffect> &effect, enum sc_type sc, s
struct s_addeffect entry = {};
if (rate < -10000 || rate > 10000)
ShowWarning("pc_bonus_addeff: Item bonus rate %d exceeds -10000~10000 range, capping.\n", rate);
entry.sc = sc;
entry.rate = cap_value(rate, -10000, 10000);
entry.rate = rate;
entry.arrow_rate = arrow_rate;
entry.flag = flag;
entry.duration = duration;
@ -2792,7 +2789,7 @@ static void pc_bonus_addeff(std::vector<s_addeffect> &effect, enum sc_type sc, s
* @param target: Target type
* @param duration: Duration. If 0 use default duration lookup for associated skill with level 7
*/
static void pc_bonus_addeff_onskill(std::vector<s_addeffectonskill> &effect, enum sc_type sc, short rate, short skill_id, unsigned char target, unsigned int duration)
static void pc_bonus_addeff_onskill(std::vector<s_addeffectonskill> &effect, enum sc_type sc, int rate, short skill_id, unsigned char target, unsigned int duration)
{
if (effect.size() == MAX_PC_BONUS) {
ShowWarning("pc_bonus_addeff_onskill: Reached max (%d) number of add effects per character!\n", MAX_PC_BONUS);
@ -2804,7 +2801,7 @@ static void pc_bonus_addeff_onskill(std::vector<s_addeffectonskill> &effect, enu
for (auto &it : effect) {
if (it.sc == sc && it.skill_id == skill_id && it.target == target) {
it.rate = cap_value(it.rate + rate, -10000, 10000);
it.rate = util::safe_addition_cap(it.rate, rate, INT_MAX);
it.duration = umax(it.duration, duration);
return;
}
@ -2812,11 +2809,8 @@ static void pc_bonus_addeff_onskill(std::vector<s_addeffectonskill> &effect, enu
struct s_addeffectonskill entry = {};
if (rate < -10000 || rate > 10000)
ShowWarning("pc_bonus_addeff_onskill: Item bonus rate %d exceeds -10000~10000 range, capping.\n", rate);
entry.sc = sc;
entry.rate = cap_value(rate, -10000, 10000);
entry.rate = rate;
entry.skill_id = skill_id;
entry.target = target;
entry.duration = duration;
@ -2871,7 +2865,7 @@ static void pc_bonus_item_drop(std::vector<s_add_drop> &drop, t_itemid nameid, u
for (auto &it : drop) {
if (it.nameid == nameid && it.group == group && it.race == race && it.class_ == class_) {
if ((rate < 0 && it.rate < 0) || (rate > 0 && it.rate > 0)) //Adjust the rate if it has same classification
it.rate = cap_value(it.rate + rate, -10000, 10000);
it.rate = util::safe_addition_cap(it.rate, rate, 10000);
return;
}
}
@ -3081,7 +3075,7 @@ static void pc_bonus_addele(struct map_session_data* sd, unsigned char ele, shor
for (auto &it : wd->addele2) {
if (it.ele == ele && it.flag == flag) {
it.rate = cap_value(it.rate + rate, -10000, 10000);
it.rate = util::safe_addition_cap(it.rate, rate, (short)10000);
return;
}
}
@ -3127,7 +3121,7 @@ static void pc_bonus_subele(struct map_session_data* sd, unsigned char ele, shor
for (auto &it : sd->subele2) {
if (it.ele == ele && it.flag == flag) {
it.rate = cap_value(it.rate + rate, -10000, 10000);
it.rate = util::safe_addition_cap(it.rate, rate, (short)10000);
return;
}
}
@ -3171,7 +3165,7 @@ static void pc_bonus_subrace(struct map_session_data* sd, unsigned char race, sh
for (auto &it : sd->subrace3) {
if (it.race == race && it.flag == flag) {
it.rate = cap_value(it.rate + rate, -10000, 10000);
it.rate = util::safe_addition_cap(it.rate, rate, (short)10000);
return;
}
}
@ -3199,7 +3193,7 @@ static void pc_bonus_itembonus(std::vector<s_item_bonus> &bonus, uint16 id, int
for (auto &it : bonus) {
if (it.id == id) {
if (cap_rate)
it.val = cap_value(it.val + val, -10000, 10000);
it.val = util::safe_addition_cap(it.val, val, 10000);
else
it.val += val;
return;
@ -3245,7 +3239,7 @@ static void pc_bonus_addvanish(std::vector<s_vanish_bonus> &bonus, int16 rate, i
for (auto &it : bonus) {
if (it.flag == flag) {
it.rate = cap_value(it.rate + rate, -10000, 10000);
it.rate = util::safe_addition_cap(it.rate, rate, (int16)10000);
it.per += per;
return;
}

View File

@ -245,8 +245,8 @@ struct s_autospell {
/// AddEff and AddEff2 bonus struct
struct s_addeffect {
enum sc_type sc; /// SC type/effect
short rate, /// Rate
arrow_rate; /// Arrow rate
int rate; /// Rate
short arrow_rate; /// Arrow rate
unsigned char flag; /// Flag
unsigned int duration; /// Duration the effect applied
};
@ -254,8 +254,8 @@ struct s_addeffect {
/// AddEffOnSkill bonus struct
struct s_addeffectonskill {
enum sc_type sc; /// SC type/effect
short rate, /// Rate
skill_id; /// Skill ID
int rate; /// Rate
short skill_id; /// Skill ID
unsigned char target; /// Target
unsigned int duration; /// Duration the effect applied
};

View File

@ -8733,7 +8733,6 @@ t_tick status_get_sc_def(struct block_list *src, struct block_list *bl, enum sc_
return 0;
}
rate = cap_value(rate, 0, 10000);
sd = BL_CAST(BL_PC,bl);
status = status_get_status_data(bl);
status_src = status_get_status_data(src);