Skip to content

Commit

Permalink
调整 bStatusAddDamage 和 bStatusAddDamageRate 的计算顺序
Browse files Browse the repository at this point in the history
  • Loading branch information
CairoLee committed Dec 31, 2023
1 parent 47adb8f commit 453c861
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 57 deletions.
41 changes: 14 additions & 27 deletions doc/pandas_bonus.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
//= 此文档对熊猫模拟器添加的效果调整器进行说明.
//============================================================

bonus bNoFieldGemStone;
*bonus bNoFieldGemStone;

使火, 水, 风, 地四大元素领域技能无需消耗魔力矿石

Expand All @@ -17,7 +17,7 @@ bonus bNoFieldGemStone;

--------------------------------------------------------------

bonus3 bRebirthWithHeal,r,h,s;
*bonus3 bRebirthWithHeal,r,h,s;

当玩家死亡时有 r/100% 的机率复活并恢复 h% 的 HP 和 s% 的 SP [聽風]

Expand All @@ -44,7 +44,7 @@ bonus3 bRebirthWithHeal,r,h,s;

--------------------------------------------------------------

bonus2 bAddSkillRange,sk,n;
*bonus2 bAddSkillRange,sk,n;

增加 sk 技能 n 格攻击距离 [聽風]

Expand All @@ -63,7 +63,7 @@ bonus2 bAddSkillRange,sk,n;

--------------------------------------------------------------

bonus2 bSkillNoRequire,sk,n;
*bonus2 bSkillNoRequire,sk,n;

解除 sk 技能中由 n 指定的前置施法条件限制 [聽風]

Expand Down Expand Up @@ -161,7 +161,7 @@ bonus2 bSkillNoRequire,sk,n;

--------------------------------------------------------------

bonus4 bStatusAddDamage,sc,n,r,bf;
*bonus4 bStatusAddDamage,sc,n,r,bf;

攻击拥有 sc 状态的目标时, 使用 bf 攻击有 r/100% 的概率使伤害增加 n [聽風]

Expand Down Expand Up @@ -200,10 +200,14 @@ bonus4 bStatusAddDamage,sc,n,r,bf;
此效果调整器每个角色最多只能定义 50 条 (源码中可通过 MAX_PC_BONUS 修改).
若希望普通攻击和技能攻击都有效, 应该使用 BF_NORMAL| BF_SKILL
多条规则之间的触发概率各自判定.

此效果调整器的计算优先级比 bStatusAddDamageRate 更高,
若您同时使用了这两个调整器, 程序将会先计算 bStatusAddDamage 对伤害
进行固定值加成, 再使用 bStatusAddDamageRate 增加伤害比例.

--------------------------------------------------------------

bonus4 bStatusAddDamageRate,sc,n,r,bf;
*bonus4 bStatusAddDamageRate,sc,n,r,bf;

攻击拥有 sc 状态的目标时, 使用 bf 攻击有 r/100% 的概率使伤害增加 n% [聽風]

Expand Down Expand Up @@ -243,6 +247,10 @@ bonus4 bStatusAddDamageRate,sc,n,r,bf;
此效果调整器每个角色最多只能定义 50 条 (源码中可通过 MAX_PC_BONUS 修改).
若希望普通攻击和技能攻击都有效, 应该使用 BF_NORMAL| BF_SKILL
多条规则之间的触发概率各自判定.

此效果调整器的计算优先级比 bStatusAddDamage 更低,
若您同时使用了这两个调整器, 程序将会先计算 bStatusAddDamage 对伤害
进行固定值加成, 再使用 bStatusAddDamageRate 增加伤害比例.

--------------------------------------------------------------

Expand Down Expand Up @@ -320,27 +328,6 @@ bonus4 bStatusAddDamageRate,sc,n,r,bf;

--------------------------------------------------------------

*bonus bAbsorbDmgMaxHP2,n;

受到超过自己总血量 n% 的伤害时只会受到总血量 n% 的伤害

参数说明:
n% 单次承伤不超过总血量的百分比
最终生效值的有效区间 0 ~ 100
不可叠加, 只会保留 n 最大的那次设定.

提示信息:
总血量是指承伤单位的 MaxHP

注意事项:
结算优先级如下, 越靠前优先级越高.
高优先级的调整器将会覆盖低优先级调整器的伤害修正结果.
- bonus2 bAbsorbDmgMaxHP,n,x;
- bonus bAbsorbDmgMaxHP2,n;
- bonus bAbsorbDmgMaxHP,n;

--------------------------------------------------------------

*bonus2 bAbsorbDmgMaxHP,n,x;

受到超过自己总血量 n% 的伤害时只会受到总血量 x% 的伤害
Expand Down
30 changes: 15 additions & 15 deletions src/map/battle.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9431,10 +9431,9 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
}
}

#ifdef Pandas_Bonus4_bStatusAddDamageRate
#ifdef Pandas_Bonus4_bStatusAddDamage
if (sd && src && src->type == BL_PC && tsc) {
int total_rate = 100;
for (auto& it : sd->status_damagerate_adjust) {
for (auto& it : sd->status_damage_adjust) {
if (!tsc->getSCE(it.type))
continue;

Expand All @@ -9444,22 +9443,17 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
continue;

if (rnd() % 10000 < it.rate) {
total_rate += it.val;
wd.damage = rathena::util::safe_addition_cap(wd.damage, (int64)it.val, INT64_MAX);
}
}

if (total_rate != 100) {
total_rate = cap_value(total_rate, -100, INT_MAX);
wd.damage = (int64)(wd.damage / 100.0 * total_rate);
}

damage = wd.damage + wd.damage2;
}
#endif // Pandas_Bonus4_bStatusAddDamageRate
#endif // Pandas_Bonus4_bStatusAddDamage

#ifdef Pandas_Bonus4_bStatusAddDamage
#ifdef Pandas_Bonus4_bStatusAddDamageRate
if (sd && src && src->type == BL_PC && tsc) {
for (auto& it : sd->status_damage_adjust) {
int total_rate = 100;
for (auto& it : sd->status_damagerate_adjust) {
if (!tsc->getSCE(it.type))
continue;

Expand All @@ -9469,12 +9463,18 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
continue;

if (rnd() % 10000 < it.rate) {
wd.damage += it.val;
total_rate = rathena::util::safe_addition_cap(total_rate, it.val, INT_MAX);
}
}

if (total_rate != 100) {
total_rate = cap_value(total_rate, -100, INT_MAX);
wd.damage = (int64)(wd.damage / 100.0 * total_rate);
}

damage = wd.damage + wd.damage2;
}
#endif // Pandas_Bonus4_bStatusAddDamage
#endif // Pandas_Bonus4_bStatusAddDamageRate

#ifdef Pandas_Bonus3_bFinalAddRace
if (sd && tstatus) {
Expand Down
30 changes: 15 additions & 15 deletions src/map/skill.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3859,10 +3859,9 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
//combo handling
skill_combo(src,dsrc,bl,skill_id,skill_lv,tick);

#ifdef Pandas_Bonus4_bStatusAddDamageRate
#ifdef Pandas_Bonus4_bStatusAddDamage
if (sd && src && src->type == BL_PC && tsc) {
int total_rate = 100;
for (auto& it : sd->status_damagerate_adjust) {
for (auto& it : sd->status_damage_adjust) {
if (!tsc->getSCE(it.type))
continue;

Expand All @@ -3872,22 +3871,17 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
continue;

if (rnd() % 10000 < it.rate) {
total_rate = rathena::util::safe_addition_cap(total_rate, it.val, INT_MAX);
dmg.damage = rathena::util::safe_addition_cap(dmg.damage, (int64)it.val, INT64_MAX);
}
}

if (total_rate != 100) {
total_rate = cap_value(total_rate, -100, INT_MAX);
dmg.damage = (int64)(dmg.damage / 100.0 * total_rate);
}

damage = dmg.damage + dmg.damage2;
}
#endif // Pandas_Bonus4_bStatusAddDamageRate
#endif // Pandas_Bonus4_bStatusAddDamage

#ifdef Pandas_Bonus4_bStatusAddDamage
#ifdef Pandas_Bonus4_bStatusAddDamageRate
if (sd && src && src->type == BL_PC && tsc) {
for (auto& it : sd->status_damage_adjust) {
int total_rate = 100;
for (auto& it : sd->status_damagerate_adjust) {
if (!tsc->getSCE(it.type))
continue;

Expand All @@ -3897,12 +3891,18 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
continue;

if (rnd() % 10000 < it.rate) {
dmg.damage = rathena::util::safe_addition_cap(dmg.damage, (int64)it.val, INT64_MAX);
total_rate = rathena::util::safe_addition_cap(total_rate, it.val, INT_MAX);
}
}

if (total_rate != 100) {
total_rate = cap_value(total_rate, -100, INT_MAX);
dmg.damage = (int64)(dmg.damage / 100.0 * total_rate);
}

damage = dmg.damage + dmg.damage2;
}
#endif // Pandas_Bonus4_bStatusAddDamage
#endif // Pandas_Bonus4_bStatusAddDamageRate

#ifdef Pandas_Bonus3_bFinalAddRace
if (sd && tstatus) {
Expand Down

0 comments on commit 453c861

Please sign in to comment.