From a79d065973a9bf27a6b32a9247c7cba45daad26f Mon Sep 17 00:00:00 2001 From: Jittapan Pluemsumran Date: Wed, 31 Aug 2016 23:37:57 +0700 Subject: [PATCH] Implemented new item bonuses bRegenPercentHP and bRegenPercentHP --- doc/item_bonus.txt | 2 ++ src/map/map.h | 2 +- src/map/pc.c | 28 ++++++++++++++++++++++++++++ src/map/pc.h | 2 +- src/map/script_constants.h | 2 ++ 5 files changed, 34 insertions(+), 2 deletions(-) diff --git a/doc/item_bonus.txt b/doc/item_bonus.txt index 04e6c6ec57e..24b4adf5a55 100644 --- a/doc/item_bonus.txt +++ b/doc/item_bonus.txt @@ -155,6 +155,8 @@ bonus2 bHPRegenRate,n,t; Gain n HP every t milliseconds bonus2 bHPLossRate,n,t; Lose n HP every t milliseconds bonus2 bSPRegenRate,n,t; Gain n SP every t milliseconds bonus2 bSPLossRate,n,t; Lose n SP every t milliseconds +bonus2 bRegenPercentHP,n,t; Gain n% of max HP every t milliseconds +bonus2 bRegenPercentSP,n,t; Gain n% of max SP every t milliseconds bonus bNoRegen,x; Stops HP or SP regeneration (x: 1=HP, 2=SP) bonus bUseSPrate,n; SP consumption + n% diff --git a/src/map/map.h b/src/map/map.h index 96bbfaead44..ab691425792 100644 --- a/src/map/map.h +++ b/src/map/map.h @@ -469,7 +469,7 @@ enum _sp { 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_WEAPON_ATK_RATE, SP_WEAPON_MATK_RATE, SP_DROP_ADDRACE, SP_DROP_ADDCLASS, SP_NO_MADO_FUEL, // 2083-2087 - SP_IGNORE_DEF_CLASS_RATE, //2088 + SP_IGNORE_DEF_CLASS_RATE, SP_REGEN_PERCENT_HP, SP_REGEN_PERCENT_SP, //2088-2091 }; enum _look { diff --git a/src/map/pc.c b/src/map/pc.c index 2ee5c6462a9..daa42222b60 100755 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -3413,6 +3413,18 @@ void pc_bonus2(struct map_session_data *sd,int type,int type2,int val) sd->hp_regen.rate = val; } break; + case SP_REGEN_PERCENT_HP: // bonus2 bRegenPercentHP,n,t; + if (sd->state.lr_flag != 2) { + sd->percent_hp_regen.value = type2; + sd->percent_hp_regen.rate = val; + } + break; + case SP_REGEN_PERCENT_SP: // bonus2 bRegenPercentSP,n,t; + if (sd->state.lr_flag != 2) { + sd->percent_sp_regen.value = type2; + sd->percent_sp_regen.rate = val; + } + break; case SP_ADDRACE2: // bonus2 bAddRace2,mr,x; PC_BONUS_CHK_RACE2(type2,SP_ADDRACE2); if(sd->state.lr_flag != 2) @@ -10301,6 +10313,22 @@ void pc_regen (struct map_session_data *sd, unsigned int diff_tick) } } + if (sd->percent_hp_regen.value) { + sd->percent_hp_regen.tick += diff_tick; + while (sd->percent_hp_regen.tick >= sd->percent_hp_regen.rate) { + hp += (sd->percent_hp_regen.value * sd->status.max_hp); + sd->percent_hp_regen.tick -= sd->percent_hp_regen.rate; + } + } + + if (sd->percent_sp_regen.value) { + sd->percent_sp_regen.tick += diff_tick; + while (sd->percent_sp_regen.tick >= sd->percent_sp_regen.rate) { + sp += (sd->percent_sp_regen.value * sd->status.max_sp); + sd->percent_sp_regen.tick -= sd->percent_sp_regen.rate; + } + } + if (hp > 0 || sp > 0) status_heal(&sd->bl, hp, sp, 0); } diff --git a/src/map/pc.h b/src/map/pc.h index e5520c2b6bf..418bd633a3c 100644 --- a/src/map/pc.h +++ b/src/map/pc.h @@ -395,7 +395,7 @@ struct map_session_data { short value; int rate; int tick; - } hp_loss, sp_loss, hp_regen, sp_regen; + } hp_loss, sp_loss, hp_regen, sp_regen, percent_hp_regen, percent_sp_regen; struct { short class_, rate; } add_def[MAX_PC_BONUS], add_mdef[MAX_PC_BONUS], add_mdmg[MAX_PC_BONUS]; diff --git a/src/map/script_constants.h b/src/map/script_constants.h index 48989fcf2b5..f15c804f607 100644 --- a/src/map/script_constants.h +++ b/src/map/script_constants.h @@ -664,6 +664,8 @@ script_set_constant("bDropAddClass", SP_DROP_ADDCLASS, false); script_set_constant("bNoMadoFuel", SP_NO_MADO_FUEL, false); script_set_constant("bIgnoreDefClassRate", SP_IGNORE_DEF_CLASS_RATE, false); + script_set_constant("bRegenPercentHP", SP_REGEN_PERCENT_HP, false); + script_set_constant("bRegenPercentSP", SP_REGEN_PERCENT_SP, false); /* equip indices */ export_constant(EQI_HEAD_TOP);