Ver Fonte

Implemented new item bonuses bRegenPercentHP and bRegenPercentHP

Jittapan Pluemsumran há 8 anos atrás
pai
commit
a79d065973
5 ficheiros alterados com 34 adições e 2 exclusões
  1. 2 0
      doc/item_bonus.txt
  2. 1 1
      src/map/map.h
  3. 28 0
      src/map/pc.c
  4. 1 1
      src/map/pc.h
  5. 2 0
      src/map/script_constants.h

+ 2 - 0
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%

+ 1 - 1
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 {

+ 28 - 0
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);
 }

+ 1 - 1
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];

+ 2 - 0
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);