summaryrefslogtreecommitdiff
path: root/src/map/pc.c
diff options
context:
space:
mode:
authorskotlex <skotlex@54d463be-8e91-2dee-dedb-b68131a5f0ec>2006-08-18 01:57:08 +0000
committerskotlex <skotlex@54d463be-8e91-2dee-dedb-b68131a5f0ec>2006-08-18 01:57:08 +0000
commit6f51acd64405e1f081e1a54a5c3f5c3b5431bc70 (patch)
treea8bc02495db478fcd7cea8704857de9ab96dc981 /src/map/pc.c
parentd305f53531e7dd0b4c29a677ff829379aac7e890 (diff)
downloadhercules-6f51acd64405e1f081e1a54a5c3f5c3b5431bc70.tar.gz
hercules-6f51acd64405e1f081e1a54a5c3f5c3b5431bc70.tar.bz2
hercules-6f51acd64405e1f081e1a54a5c3f5c3b5431bc70.tar.xz
hercules-6f51acd64405e1f081e1a54a5c3f5c3b5431bc70.zip
- Applied use of structure regen_data for a unified regen module. Natural and skill-heal is handled by this structure, while sitting-skill-heal is still player dependant (mostly because the other object types can't sit)
- Added SCB_REGEN constant to identify status changes which alter regeneration - Modified SC_REGENERATION so that if val4 is set, the status actually blocks regen rather than increase it, this is what now Frenzy uses instead of "canregen_tick" - Cleaned up the status calc code for homun by moving it from status_calc_bl_sub_homun to status_calc_homun (where it should had always been) - Moved the Fleet watk code to status_calc_watk where it belongs. git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@8334 54d463be-8e91-2dee-dedb-b68131a5f0ec
Diffstat (limited to 'src/map/pc.c')
-rw-r--r--src/map/pc.c364
1 files changed, 44 insertions, 320 deletions
diff --git a/src/map/pc.c b/src/map/pc.c
index 0c2973be6..6dc4ad33a 100644
--- a/src/map/pc.c
+++ b/src/map/pc.c
@@ -603,7 +603,6 @@ int pc_authok(struct map_session_data *sd, int login_id2, time_t connect_until_t
sd->skillitemlv = -1;
sd->invincible_timer = -1;
- sd->canregen_tick = tick;
sd->canuseitem_tick = tick;
sd->cantalk_tick = tick;
@@ -1089,6 +1088,8 @@ int pc_checkweighticon(struct map_session_data *sd)
if(sd->sc.data[SC_WEIGHT90].timer!=-1)
status_change_end(&sd->bl,SC_WEIGHT90,-1);
}
+ if (flag != sd->regen.state.overweight)
+ sd->regen.state.overweight = flag;
return 0;
}
@@ -1740,7 +1741,7 @@ int pc_bonus(struct map_session_data *sd,int type,int val)
break;
case SP_NO_REGEN:
if(sd->state.lr_flag != 2)
- sd->no_regen = val;
+ sd->regen.state.block|=val;
break;
case SP_UNSTRIPABLE_WEAPON:
if(sd->state.lr_flag != 2)
@@ -3272,6 +3273,8 @@ int pc_setpos(struct map_session_data *sd,unsigned short mapindex,int x,int y,in
party_send_dot_remove(sd); //minimap dot fix [Kevin]
guild_send_dot_remove(sd);
skill_clear_group(&sd->bl, 1|(battle_config.traps_setting&2));
+ if (sd->regen.state.gc)
+ sd->regen.state.gc = 0;
if (sd->sc.count)
{ //Cancel some map related stuff.
if (sd->sc.data[SC_WARM].timer != -1)
@@ -3351,6 +3354,13 @@ int pc_setpos(struct map_session_data *sd,unsigned short mapindex,int x,int y,in
sd->bl.x = sd->ud.to_x = x;
sd->bl.y = sd->ud.to_y = y;
+ if (sd->status.guild_id > 0 && map[m].flag.gvg_castle)
+ { // Increased guild castle regen [Valaris]
+ struct guild_castle *gc = guild_mapindex2gc(sd->mapindex);
+ if(gc && gc->guild_id == sd->status.guild_id)
+ sd->regen.state.gc = 1;
+ }
+
if(sd->status.pet_id > 0 && sd->pd && sd->pd->pet.intimate > 0) {
sd->pd->bl.m = m;
sd->pd->bl.x = sd->pd->ud.to_x = x;
@@ -4796,7 +4806,9 @@ int pc_dead(struct map_session_data *sd,struct block_list *src)
}
pc_setdead(sd);
- sd->canregen_tick = tick;
+ //Reset ticks.
+ sd->inchealspirithptick = sd->inchealspiritsptick =
+ sd->hp_loss_tick = sd->sp_loss_tick = 0;
pc_setglobalreg(sd,"PC_DIE_COUNTER",++sd->die_counter);
@@ -6742,280 +6754,60 @@ struct map_session_data *pc_get_child (struct map_session_data *sd)
return NULL;
}
-//
-// 自然回復物
-//
-/*==========================================
- * SP回復量計算
- *------------------------------------------
- */
-static unsigned int natural_heal_prev_tick,natural_heal_diff_tick;
-static int pc_spheal(struct map_session_data *sd)
-{
- int a = natural_heal_diff_tick;
-
- if(pc_issit(sd))
- a += a;
- if (sd->sc.count) {
- if (sd->sc.data[SC_MAGNIFICAT].timer!=-1) // マグニフィカ?ト
- a += a;
- if (sd->sc.data[SC_REGENERATION].timer != -1)
- a *= sd->sc.data[SC_REGENERATION].val3;
- }
- // Re-added back to status_calc
- //if((skill = pc_checkskill(sd,HP_MEDITATIO)) > 0) //Increase natural SP regen with Meditatio [DracoRPG]
- //a += a*skill*3/100;
-
- if (sd->status.guild_id > 0) {
- struct guild_castle *gc = guild_mapindex2gc(sd->mapindex); // Increased guild castle regen [Valaris]
- if(gc) {
- struct guild *g = guild_search(sd->status.guild_id);
- if(g && g->guild_id == gc->guild_id)
- a += a;
- } // end addition [Valaris]
- }
-
- if (map_getcell(sd->bl.m,sd->bl.x,sd->bl.y,CELL_CHKREGEN))
- a += a;
-
- return a;
-}
-
-/*==========================================
- * HP回復量計算
- *------------------------------------------
- */
-static int pc_hpheal(struct map_session_data *sd)
-{
- int a = natural_heal_diff_tick;
-
- if(pc_issit(sd))
- a += a;
- if (sd->sc.count) {
- if (sd->sc.data[SC_MAGNIFICAT].timer != -1) // Modified by RoVeRT
- a += a;
- if (sd->sc.data[SC_REGENERATION].timer != -1)
- a *= sd->sc.data[SC_REGENERATION].val2;
- }
- if (sd->status.guild_id > 0) {
- struct guild_castle *gc = guild_mapindex2gc(sd->mapindex); // Increased guild castle regen [Valaris]
- if(gc) {
- struct guild *g = guild_search(sd->status.guild_id);
- if(g && g->guild_id == gc->guild_id)
- a += a;
- } // end addition [Valaris]
- }
-
- if (map_getcell(sd->bl.m,sd->bl.x,sd->bl.y,CELL_CHKREGEN))
- a += a;
-
- return a;
-}
-
-static void pc_natural_heal_hp(struct map_session_data *sd)
-{
- unsigned int hp;
- int inc_num,bonus,hp_flag;
-
- if (sd->no_regen & 1)
- return;
-
- if(pc_checkoverhp(sd)) {
- sd->hp_sub = sd->inchealhptick = 0;
- return;
- }
-
- hp_flag = (pc_checkskill(sd,SM_MOVINGRECOVERY) > 0 && sd->ud.walktimer != -1);
-
- if(sd->ud.walktimer == -1) {
- inc_num = pc_hpheal(sd);
- if(sd->sc.data[SC_TENSIONRELAX].timer!=-1 ){
- sd->hp_sub += 2*inc_num;
- sd->inchealhptick += 3*natural_heal_diff_tick;
- } else {
- sd->hp_sub += inc_num;
- sd->inchealhptick += natural_heal_diff_tick;
- }
- }
- else if(hp_flag) {
- inc_num = pc_hpheal(sd);
- sd->hp_sub += inc_num;
- sd->inchealhptick = 0;
- }
- else {
- sd->hp_sub = sd->inchealhptick = 0;
- return;
- }
-
- if(sd->hp_sub >= battle_config.natural_healhp_interval) {
- hp = 0;
- bonus = sd->nhealhp;
- if(hp_flag) {
- bonus >>= 2;
- if(bonus <= 0) bonus = 1;
- }
- do {
- sd->hp_sub -= battle_config.natural_healhp_interval;
- hp+= bonus;
- } while(sd->hp_sub >= battle_config.natural_healhp_interval);
-
- if ((unsigned int)status_heal(&sd->bl, hp, 0, 1) < hp)
- { //At full.
- sd->inchealhptick = 0;
- return;
- }
- }
-
- if(sd->nshealhp <= 0)
- {
- sd->inchealhptick = 0;
- return;
- }
-
- while(sd->inchealhptick >= battle_config.natural_heal_skill_interval)
- {
- sd->inchealhptick -= battle_config.natural_heal_skill_interval;
- if(status_heal(&sd->bl, sd->nshealhp, 0, 3) < sd->nshealhp)
- {
- sd->hp_sub = sd->inchealhptick = 0;
- break;
- }
- }
-
- return;
-}
-
-static void pc_natural_heal_sp(struct map_session_data *sd)
-{
- int sp;
- int inc_num,bonus;
-
- if (sd->no_regen & 2)
- return;
-
- if(pc_checkoversp(sd)) {
- sd->sp_sub = sd->inchealsptick = 0;
- return;
- }
-
- inc_num = pc_spheal(sd);
- if(sd->sc.data[SC_EXPLOSIONSPIRITS].timer == -1 || (sd->sc.data[SC_SPIRIT].timer!=-1 && sd->sc.data[SC_SPIRIT].val2 == SL_MONK))
- sd->sp_sub += inc_num;
- if(sd->ud.walktimer == -1)
- sd->inchealsptick += natural_heal_diff_tick;
- else
- sd->inchealsptick = 0;
-
- if(sd->sp_sub >= battle_config.natural_healsp_interval){
- bonus = sd->nhealsp;
- sp = 0;
- do {
- sd->sp_sub -= battle_config.natural_healsp_interval;
- sp += bonus;
- } while(sd->sp_sub >= battle_config.natural_healsp_interval);
- if (status_heal(&sd->bl, 0, sp, 1) < sp) {
- sd->inchealsptick = 0;
- return;
- }
- }
-
- if(sd->nshealsp <= 0) {
- sd->inchealsptick = 0;
- return;
- }
- if(sd->inchealsptick >= battle_config.natural_heal_skill_interval)
- {
- sp = 0;
- if(sd->doridori_counter) {
- bonus = sd->nshealsp*2;
- sd->doridori_counter = 0;
- } else
- bonus = sd->nshealsp;
- do {
- sd->inchealsptick -= battle_config.natural_heal_skill_interval;
- if (status_heal(&sd->bl, 0, bonus, 3) < sp) {
- sd->sp_sub = sd->inchealsptick = 0;
- break;
- }
- } while(sd->inchealsptick >= battle_config.natural_heal_skill_interval);
- }
-
- return;
-}
-
-static void pc_spirit_heal_hp(struct map_session_data *sd)
+int pc_spirit_heal_hp(struct map_session_data *sd, unsigned int diff_tick)
{
- int bonus_hp,interval = battle_config.natural_heal_skill_interval;
-
- if(pc_checkoverhp(sd)) {
- sd->inchealspirithptick = 0;
- return;
- }
-
- sd->inchealspirithptick += natural_heal_diff_tick;
+ int interval = battle_config.natural_heal_skill_interval;
- if(sd->weight*100/sd->max_weight >= battle_config.natural_heal_weight_rate)
+ if(!pc_issit(sd))
+ return 0;
+
+ if(sd->regen.state.overweight)
interval += interval;
- if(sd->inchealspirithptick < interval)
- return;
+ sd->inchealspirithptick += diff_tick;
- if(!pc_issit(sd))
+ while(sd->inchealspirithptick >= interval)
{
- sd->inchealspirithptick -= natural_heal_diff_tick;
- return;
- }
- bonus_hp = sd->nsshealhp;
- while(sd->inchealspirithptick >= interval) {
sd->inchealspirithptick -= interval;
- if(status_heal(&sd->bl, bonus_hp, 0, 3) < bonus_hp) {
+ if(status_heal(&sd->bl, sd->nsshealhp, 0, 3) < sd->nsshealhp)
+ {
sd->inchealspirithptick = 0;
- break;
+ return 1;
}
}
- return;
+ return 0;
}
-static void pc_spirit_heal_sp(struct map_session_data *sd)
-{
- int bonus_sp,interval = battle_config.natural_heal_skill_interval;
-
- if(pc_checkoversp(sd)) {
- sd->inchealspiritsptick = 0;
- return;
- }
- sd->inchealspiritsptick += natural_heal_diff_tick;
+int pc_spirit_heal_sp(struct map_session_data *sd, unsigned int diff_tick)
+{
+ int interval = battle_config.natural_heal_skill_interval;
- if(sd->weight*100/sd->max_weight >= battle_config.natural_heal_weight_rate)
+ if(!pc_issit(sd))
+ return 0;
+
+ if(sd->regen.state.overweight)
interval += interval;
- if(sd->inchealspiritsptick < interval)
- return;
+ sd->inchealspiritsptick += diff_tick;
- if(!pc_issit(sd))
+ while(sd->inchealspiritsptick >= interval)
{
- sd->inchealspiritsptick -= natural_heal_diff_tick;
- return;
- }
- bonus_sp = sd->nsshealsp;
- while(sd->inchealspiritsptick >= interval) {
sd->inchealspiritsptick -= interval;
- if(status_heal(&sd->bl, 0, bonus_sp, 3) < bonus_sp)
+ if(status_heal(&sd->bl, 0, sd->nsshealsp, 3) < sd->nsshealsp)
{
sd->inchealspiritsptick = 0;
- break;
+ return 1;
}
}
-
- return;
+ return 0;
}
-static void pc_bleeding (struct map_session_data *sd)
+void pc_bleeding (struct map_session_data *sd, unsigned int diff_tick)
{
int hp = 0, sp = 0;
if (sd->hp_loss_value > 0) {
- sd->hp_loss_tick += natural_heal_diff_tick;
+ sd->hp_loss_tick += diff_tick;
if (sd->hp_loss_tick >= sd->hp_loss_rate) {
do {
hp += sd->hp_loss_value;
@@ -7026,7 +6818,7 @@ static void pc_bleeding (struct map_session_data *sd)
}
if (sd->sp_loss_value > 0) {
- sd->sp_loss_tick += natural_heal_diff_tick;
+ sd->sp_loss_tick += diff_tick;
if (sd->sp_loss_tick >= sd->sp_loss_rate) {
do {
sp += sd->sp_loss_value;
@@ -7043,73 +6835,6 @@ static void pc_bleeding (struct map_session_data *sd)
}
/*==========================================
- * HP/SP 自然回復 各クライアント
- *------------------------------------------
- */
-
-static int pc_natural_heal_sub(struct map_session_data *sd,va_list ap) {
- int tick;
-
- nullpo_retr(0, sd);
- tick = va_arg(ap,int);
-
-// -- moonsoul (if conditions below altered to disallow natural healing if under berserk status)
- if (pc_isdead(sd) || pc_ishiding(sd) ||
- //-- cannot regen for 5 minutes after using Berserk --- [Celest]
- (sd->sc.count && (
- (sd->sc.data[SC_POISON].timer != -1 && sd->sc.data[SC_SLOWPOISON].timer == -1) ||
- (sd->sc.data[SC_DPOISON].timer != -1 && sd->sc.data[SC_SLOWPOISON].timer == -1) ||
- sd->sc.data[SC_BERSERK].timer != -1 ||
- sd->sc.data[SC_TRICKDEAD].timer != -1 ||
- sd->sc.data[SC_BLEEDING].timer != -1
- ))
- ) { //Cannot heal neither natural or special.
- sd->hp_sub = sd->inchealhptick = sd->inchealspirithptick = 0;
- sd->sp_sub = sd->inchealsptick = sd->inchealspiritsptick = 0;
- } else {
- if (DIFF_TICK (tick, sd->canregen_tick)<0 ||
- sd->weight*100/sd->max_weight >= battle_config.natural_heal_weight_rate) { //Cannot heal natural HP/SP
- sd->hp_sub = sd->inchealhptick = 0;
- sd->sp_sub = sd->inchealsptick = 0;
- } else { //natural heal
- pc_natural_heal_hp(sd);
- if(sd->sc.count && (
- sd->sc.data[SC_EXTREMITYFIST].timer != -1 ||
- sd->sc.data[SC_DANCING].timer != -1
- )) //No SP natural heal.
- sd->sp_sub = sd->inchealsptick = 0;
- else
- pc_natural_heal_sp(sd);
- sd->canregen_tick = tick;
- }
- //Sitting Healing
- if (sd->nsshealhp)
- pc_spirit_heal_hp(sd);
- if (sd->nsshealsp)
- pc_spirit_heal_sp(sd);
- }
- if (sd->hp_loss_value > 0 || sd->sp_loss_value > 0)
- pc_bleeding(sd);
- else
- sd->hp_loss_tick = sd->sp_loss_tick = 0;
-
- return 0;
-}
-
-/*==========================================
- * HP/SP自然回復 (interval timer??)
- *------------------------------------------
- */
-int pc_natural_heal(int tid,unsigned int tick,int id,int data)
-{
- natural_heal_diff_tick = DIFF_TICK(tick,natural_heal_prev_tick);
- clif_foreachclient(pc_natural_heal_sub, tick);
-
- natural_heal_prev_tick = tick;
- return 0;
-}
-
-/*==========================================
* セ?ブポイントの保存
*------------------------------------------
*/
@@ -7260,6 +6985,8 @@ void pc_setstand(struct map_session_data *sd){
if(sd->sc.count && sd->sc.data[SC_TENSIONRELAX].timer!=-1)
status_change_end(&sd->bl,SC_TENSIONRELAX,-1);
+ //Reset sitting tick.
+ sd->inchealspirithptick = sd->inchealspiritsptick = 0;
sd->state.dead_sit = sd->vd.dead_sit = 0;
}
@@ -7582,15 +7309,12 @@ int do_init_pc(void) {
pc_readdb();
pc_read_motd(); // Read MOTD [Valaris]
- add_timer_func_list(pc_natural_heal, "pc_natural_heal");
add_timer_func_list(pc_invincible_timer, "pc_invincible_timer");
add_timer_func_list(pc_eventtimer, "pc_eventtimer");
add_timer_func_list(pc_calc_pvprank_timer, "pc_calc_pvprank_timer");
add_timer_func_list(pc_autosave, "pc_autosave");
add_timer_func_list(pc_spiritball_timer, "pc_spiritball_timer");
add_timer_func_list(pc_follow_timer, "pc_follow_timer");
- natural_heal_prev_tick = gettick();
- add_timer_interval(natural_heal_prev_tick + NATURAL_HEAL_INTERVAL, pc_natural_heal, 0, 0, NATURAL_HEAL_INTERVAL);
add_timer(gettick() + autosave_interval, pc_autosave, 0, 0);