Added some additional SP heal bonuses (#6292)

Fixes #6076

Thanks to @idk-whoami and @Atemo
This commit is contained in:
Lemongrass3110 2021-10-10 11:17:41 +02:00 committed by GitHub
parent 58bc89d5db
commit d54076d2f6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 84 additions and 21 deletions

View File

@ -187,13 +187,16 @@ bonus bNoMiscDamage,n; Adds n% reduction to received misc damage
Healing
-------
bonus bHealPower,n; Increases heal amount of all heal skills by n%
bonus bHealPower2,n; Increases heal amount if you are healed by any skills by n%
bonus2 bSkillHeal,sk,n; Increases heal amount of skill sk by n%
bonus2 bSkillHeal2,sk,n; Increases heal amount if you are healed by skill sk by n%
bonus bAddItemHealRate,n; Increases HP recovered by n% for healing items
bonus2 bAddItemHealRate,iid,n; Increases HP recovered by n% for item iid
bonus2 bAddItemGroupHealRate,ig,n; Increases HP recovered by n% for items of item group ig
bonus bHealPower,n; Increases heal amount of all heal skills by n%
bonus bHealPower2,n; Increases heal amount if you are healed by any skills by n%
bonus2 bSkillHeal,sk,n; Increases heal amount of skill sk by n%
bonus2 bSkillHeal2,sk,n; Increases heal amount if you are healed by skill sk by n%
bonus bAddItemHealRate,n; Increases HP recovered by n% for healing items
bonus2 bAddItemHealRate,iid,n; Increases HP recovered by n% for item iid
bonus2 bAddItemGroupHealRate,ig,n; Increases HP recovered by n% for items of item group ig
bonus bAddItemSPHealRate,n; Increases SP recovered by n% for healing items
bonus2 bAddItemSPHealRate,iid,n; Increases SP recovered by n% for item iid
bonus2 bAddItemGroupSPHealRate,ig,n; Increases SP recovered by n% for items of item group ig
Cast time/delay
---------------

View File

@ -515,7 +515,7 @@ enum _sp {
SP_WEAPON_ATK_RATE, SP_WEAPON_MATK_RATE, SP_DROP_ADDRACE, SP_DROP_ADDCLASS, SP_NO_MADO_FUEL, // 2083-2087
SP_IGNORE_DEF_CLASS_RATE, SP_REGEN_PERCENT_HP, SP_REGEN_PERCENT_SP, SP_SKILL_DELAY, SP_NO_WALK_DELAY, //2088-2092
SP_LONG_SP_GAIN_VALUE, SP_LONG_HP_GAIN_VALUE, SP_SHORT_ATK_RATE, SP_MAGIC_SUBSIZE, SP_CRIT_DEF_RATE, // 2093-2097
SP_MAGIC_SUBDEF_ELE, SP_REDUCE_DAMAGE_RETURN // 2098-2099
SP_MAGIC_SUBDEF_ELE, SP_REDUCE_DAMAGE_RETURN, SP_ADD_ITEM_SPHEAL_RATE, SP_ADD_ITEMGROUP_SPHEAL_RATE, // 2098-2101
};
enum _look {

View File

@ -3780,6 +3780,10 @@ void pc_bonus(struct map_session_data *sd,int type,int val)
if (sd->state.lr_flag != 2)
sd->special_state.no_walk_delay = 1;
break;
case SP_ADD_ITEM_SPHEAL_RATE:
if(sd->state.lr_flag != 2)
sd->bonus.itemsphealrate2 += val;
break;
default:
if (current_equip_combo_pos > 0) {
ShowWarning("pc_bonus: unknown bonus type %d %d in a combo with item #%u\n", type, val, sd->inventory_data[pc_checkequip( sd, current_equip_combo_pos )]->nameid);
@ -4112,7 +4116,7 @@ void pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
case SP_ADD_ITEM_HEAL_RATE: // bonus2 bAddItemHealRate,iid,n;
if(sd->state.lr_flag == 2)
break;
if (!itemdb_exists(type2)) {
if( !item_db.exists( type2 ) ){
ShowWarning("pc_bonus2: SP_ADD_ITEM_HEAL_RATE Invalid item with id %d\n", type2);
break;
}
@ -4130,7 +4134,7 @@ void pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
ShowWarning("pc_bonus2: SP_ADD_ITEMGROUP_HEAL_RATE: Invalid item group with id %d\n", type2);
break;
}
if (sd->itemhealrate.size() == MAX_PC_BONUS) {
if (sd->itemgrouphealrate.size() == MAX_PC_BONUS) {
ShowWarning("pc_bonus2: SP_ADD_ITEMGROUP_HEAL_RATE: Reached max (%d) number of item heal bonuses per character!\n", MAX_PC_BONUS);
break;
}
@ -4373,6 +4377,40 @@ void pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
PC_BONUS_CHK_ELEMENT(type2, SP_MAGIC_SUBDEF_ELE);
sd->indexed_bonus.magic_subdefele[type2] += val;
break;
case SP_ADD_ITEM_SPHEAL_RATE: // bonus2 bAddItemSPHealRate,iid,n;
if( sd->state.lr_flag == 2 ){
break;
}
if( !item_db.exists( type2 ) ){
ShowWarning( "pc_bonus2: SP_ADD_ITEM_SPHEAL_RATE Invalid item with id %d\n", type2 );
break;
}
if( sd->itemsphealrate.size() == MAX_PC_BONUS ){
ShowWarning( "pc_bonus2: SP_ADD_ITEM_SPHEAL_RATE: Reached max (%d) number of item SP heal bonuses per character!\n", MAX_PC_BONUS );
break;
}
pc_bonus_itembonus( sd->itemsphealrate, type2, val, false );
break;
case SP_ADD_ITEMGROUP_SPHEAL_RATE: // bonus2 bAddItemGroupSPHealRate,ig,n;
if( sd->state.lr_flag == 2 ){
break;
}
if( !type2 || !itemdb_group.exists( type2 ) ){
ShowWarning( "pc_bonus2: SP_ADD_ITEMGROUP_SPHEAL_RATE: Invalid item group with id %d\n", type2 );
break;
}
if( sd->itemgroupsphealrate.size() == MAX_PC_BONUS ){
ShowWarning( "pc_bonus2: SP_ADD_ITEMGROUP_SPHEAL_RATE: Reached max (%d) number of item SP heal bonuses per character!\n", MAX_PC_BONUS );
break;
}
pc_bonus_itembonus( sd->itemgroupsphealrate, type2, val, false );
break;
default:
if (current_equip_combo_pos > 0) {
ShowWarning("pc_bonus2: unknown bonus type %d %d %d in a combo with item #%u\n", type, type2, val, sd->inventory_data[pc_checkequip( sd, current_equip_combo_pos )]->nameid);
@ -8947,6 +8985,7 @@ int64 pc_readparam(struct map_session_data* sd,int64 type)
val = sd->castrate; break;
#endif
case SP_CRIT_DEF_RATE: val = sd->bonus.crit_def_rate; break;
case SP_ADD_ITEM_SPHEAL_RATE: val = sd->bonus.itemsphealrate2; break;
default:
ShowError("pc_readparam: Attempt to read unknown parameter '%lld'.\n", type);
return -1;
@ -9219,7 +9258,7 @@ int pc_itemheal(struct map_session_data *sd, t_itemid itemid, int hp, int sp)
//All item bonuses.
bonus += sd->bonus.itemhealrate2;
//Item Group bonuses
bonus += bonus * pc_get_itemgroup_bonus(sd, itemid) / 100;
bonus += bonus * pc_get_itemgroup_bonus(sd, itemid, sd->itemgrouphealrate) / 100;
//Individual item bonuses.
for(const auto &it : sd->itemhealrate) {
if (it.id == itemid) {
@ -9248,6 +9287,18 @@ int pc_itemheal(struct map_session_data *sd, t_itemid itemid, int hp, int sp)
if (potion_flag == 2)
bonus += bonus * 50 / 100;
// All item bonuses.
bonus += sd->bonus.itemsphealrate2;
// Item Group bonuses
bonus += bonus * pc_get_itemgroup_bonus( sd, itemid, sd->itemgroupsphealrate ) / 100;
// Individual item bonuses.
for( const auto &it : sd->itemsphealrate ){
if( it.id == itemid ){
bonus += bonus * it.val / 100;
break;
}
}
tmp = sp * bonus / 100; // Overflow check
if (bonus != 100 && tmp > sp)
sp = tmp;
@ -13246,13 +13297,13 @@ short pc_maxaspd(struct map_session_data *sd) {
* @param nameid Item ID
* @return Heal rate
**/
short pc_get_itemgroup_bonus(struct map_session_data* sd, t_itemid nameid) {
if (sd->itemgrouphealrate.empty())
short pc_get_itemgroup_bonus(struct map_session_data* sd, t_itemid nameid, std::vector<s_item_bonus>& bonuses) {
if (bonuses.empty())
return 0;
short bonus = 0;
for (const auto &it : sd->itemgrouphealrate) {
for (const auto &it : bonuses) {
uint16 group_id = it.id;
if (group_id == 0)
continue;
@ -13269,14 +13320,15 @@ short pc_get_itemgroup_bonus(struct map_session_data* sd, t_itemid nameid) {
* @param group_id Item Group ID
* @return Heal rate
**/
short pc_get_itemgroup_bonus_group(struct map_session_data* sd, uint16 group_id) {
if (sd->itemgrouphealrate.empty())
short pc_get_itemgroup_bonus_group(struct map_session_data* sd, uint16 group_id, std::vector<s_item_bonus>& bonuses) {
if (bonuses.empty())
return 0;
for (const auto &it : sd->itemgrouphealrate) {
for (const auto &it : bonuses) {
if (it.id == group_id)
return it.val;
}
return 0;
}

View File

@ -487,7 +487,7 @@ struct map_session_data {
std::vector<s_addeffect> addeff, addeff_atked;
std::vector<s_addeffectonskill> addeff_onskill;
std::vector<s_item_bonus> skillatk, skillusesprate, skillusesp, skillheal, skillheal2, skillblown, skillcastrate, skillfixcastrate, subskill, skillcooldown, skillfixcast,
skillvarcast, skilldelay, itemhealrate, add_def, add_mdef, add_mdmg, reseff, itemgrouphealrate;
skillvarcast, skilldelay, itemhealrate, add_def, add_mdef, add_mdmg, reseff, itemgrouphealrate, itemsphealrate, itemgroupsphealrate;
std::vector<s_add_drop> add_drop;
std::vector<s_addele2> subele2;
std::vector<s_vanish_bonus> sp_vanish, hp_vanish;
@ -536,6 +536,7 @@ struct map_session_data {
int classchange; // [Valaris]
int speed_rate, speed_add_rate, aspd_add;
int itemhealrate2; // [Epoque] Increase heal rate of all healing items.
int itemsphealrate2;
int shieldmdef;//royal guard's
unsigned int setitem_hash, setitem_hash2; //Split in 2 because shift operations only work on int ranges. [Skotlex]
@ -1469,8 +1470,8 @@ void pc_bonus_script_clear(struct map_session_data *sd, uint16 flag);
void pc_cell_basilica(struct map_session_data *sd);
short pc_get_itemgroup_bonus(struct map_session_data* sd, t_itemid nameid);
short pc_get_itemgroup_bonus_group(struct map_session_data* sd, uint16 group_id);
short pc_get_itemgroup_bonus(struct map_session_data* sd, t_itemid nameid, std::vector<s_item_bonus>& bonuses);
short pc_get_itemgroup_bonus_group(struct map_session_data* sd, uint16 group_id, std::vector<s_item_bonus>& bonuses);
bool pc_is_same_equip_index(enum equip_index eqi, short *equip_index, short index);
/// Check if player is Taekwon Ranker and the level is >= 90 (battle_config.taekwon_ranker_min_lv)

View File

@ -765,6 +765,8 @@
export_constant2("bCritDefRate",SP_CRIT_DEF_RATE);
export_constant2("bMagicSubDefEle", SP_MAGIC_SUBDEF_ELE);
export_constant2("bReduceDamageReturn",SP_REDUCE_DAMAGE_RETURN);
export_constant2("bAddItemSPHealRate", SP_ADD_ITEM_SPHEAL_RATE);
export_constant2("bAddItemGroupSPHealRate", SP_ADD_ITEMGROUP_SPHEAL_RATE);
/* equip indices */
export_constant(EQI_COMPOUND_ON);

View File

@ -8240,8 +8240,11 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
}
}
if ((bonus = pc_get_itemgroup_bonus_group(sd, IG_POTION))) {
if ((bonus = pc_get_itemgroup_bonus_group(sd, IG_POTION, sd->itemgrouphealrate))) {
hp += hp * bonus / 100;
}
if( ( bonus = pc_get_itemgroup_bonus_group( sd, IG_POTION, sd->itemgroupsphealrate ) ) ){
sp += sp * bonus / 100;
}

View File

@ -4251,6 +4251,8 @@ int status_calc_pc_sub(struct map_session_data* sd, enum e_status_calc_opt opt)
sd->skilldelay.clear();
sd->sp_vanish.clear();
sd->hp_vanish.clear();
sd->itemsphealrate.clear();
sd->itemgroupsphealrate.clear();
// Zero up structures...
memset(&sd->hp_loss, 0, sizeof(sd->hp_loss)