diff options
Diffstat (limited to 'src/map/pc.c')
-rw-r--r-- | src/map/pc.c | 83 |
1 files changed, 76 insertions, 7 deletions
diff --git a/src/map/pc.c b/src/map/pc.c index c8ab8fae4..78d7102b8 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -1575,6 +1575,16 @@ int pc_bonus(struct map_session_data *sd,int type,int val) if(sd->state.lr_flag != 2) sd->unstripable_equip |= EQP_ARMOR; break; + case SP_SP_GAIN_VALUE: + if(!sd->state.lr_flag) + sd->sp_gain_value += val; + break; + case SP_IGNORE_DEF_MOB: // 0:normal monsters only, 1:affects boss monsters as well + if(!sd->state.lr_flag) + sd->ignore_def_mob |= 1<<val; + else if(sd->state.lr_flag == 1) + sd->ignore_def_mob_ |= 1<<val; + break; default: if(battle_config.error_log) printf("pc_bonus: unknown type %d %d !\n",type,val); @@ -1823,6 +1833,13 @@ int pc_bonus2(struct map_session_data *sd,int type,int type2,int val) } } break; + case SP_HP_LOSS_RATE: + if(sd->state.lr_flag != 2) { + sd->hp_loss_value = type2; + sd->hp_loss_rate = val; + } + break; + default: if(battle_config.error_log) printf("pc_bonus2: unknown type %d %d %d!\n",type,type2,val); @@ -1865,6 +1882,7 @@ int pc_bonus3(struct map_session_data *sd,int type,int type2,int type3,int val) sd->autospell2_id = type2; sd->autospell2_lv = type3; sd->autospell2_rate = val; + sd->autospell2_type = 1; // enemy } break; default: @@ -1876,6 +1894,26 @@ int pc_bonus3(struct map_session_data *sd,int type,int type2,int type3,int val) return 0; } +int pc_bonus4(struct map_session_data *sd,int type,int type2,int type3,int type4,int val) +{ + switch(type){ + case SP_AUTOSPELL_WHENHIT: + if(sd->state.lr_flag != 2){ + sd->autospell2_id = type2; + sd->autospell2_lv = type3; + sd->autospell2_rate = type4; + sd->autospell2_type = val; // 0: self, 1: enemy + } + break; + default: + if(battle_config.error_log) + printf("pc_bonus4: unknown type %d %d %d %d %d!\n",type,type2,type3,type4,val); + break; + } + + return 0; +} + /*========================================== * スクリプトによるスキル所得 *------------------------------------------ @@ -6513,7 +6551,7 @@ static int pc_natural_heal_sp(struct map_session_data *sd) return 0; } -static int pc_spirit_heal_hp(struct map_session_data *sd,int level) +static int pc_spirit_heal_hp(struct map_session_data *sd) { int bonus_hp,interval = battle_config.natural_heal_skill_interval; @@ -6553,7 +6591,7 @@ static int pc_spirit_heal_hp(struct map_session_data *sd,int level) return 0; } -static int pc_spirit_heal_sp(struct map_session_data *sd,int level) +static int pc_spirit_heal_sp(struct map_session_data *sd) { int bonus_sp,interval = battle_config.natural_heal_skill_interval; @@ -6594,6 +6632,30 @@ static int pc_spirit_heal_sp(struct map_session_data *sd,int level) return 0; } +static int pc_bleeding (struct map_session_data *sd) +{ + int interval, hp; + + nullpo_retr(0, sd); + interval = sd->hp_loss_rate; + hp = sd->hp_loss_value; + + sd->hp_loss_tick += natural_heal_diff_tick; + if(sd->hp_loss_tick >= interval) { + while(sd->hp_loss_tick >= interval) { + sd->hp_loss_tick -= interval; + if (sd->status.hp < hp) + hp = sd->status.hp; + if (sd->hp_loss_type == 0) { + pc_heal(sd,-hp,0); + } else if (sd->hp_loss_type == 1) { + } + sd->hp_loss_tick = 0; + } + } + return 0; +} + /*========================================== * HP/SP 自然回復 各クライアント *------------------------------------------ @@ -6601,15 +6663,17 @@ static int pc_spirit_heal_sp(struct map_session_data *sd,int level) static int pc_natural_heal_sub(struct map_session_data *sd,va_list ap) { int skill; + 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 ((battle_config.natural_heal_weight_rate > 100 || sd->weight*100/sd->max_weight < battle_config.natural_heal_weight_rate) && !pc_isdead(sd) && !pc_ishiding(sd) && //-- cannot regen for 5 minutes after using Berserk --- [Celest] - DIFF_TICK (gettick(), sd->canregen_tick)>=0 && + DIFF_TICK (tick, sd->canregen_tick)>=0 && (sd->sc_data && !(sd->sc_data[SC_POISON].timer != -1 && sd->sc_data[SC_SLOWPOISON].timer == -1) && sd->sc_data[SC_BERSERK].timer == -1 )) { pc_natural_heal_hp(sd); @@ -6617,20 +6681,25 @@ static int pc_natural_heal_sub(struct map_session_data *sd,va_list ap) { sd->sc_data[SC_DANCING].timer == -1 && //ダンス?態ではSPが回復しない sd->sc_data[SC_BERSERK].timer == -1 ) //バ?サ?ク?態ではSPが回復しない pc_natural_heal_sp(sd); - sd->canregen_tick = gettick(); + sd->canregen_tick = tick; } else { sd->hp_sub = sd->inchealhptick = 0; sd->sp_sub = sd->inchealsptick = 0; } if((skill = pc_checkskill(sd,MO_SPIRITSRECOVERY)) > 0 && !pc_ishiding(sd) && sd->sc_data[SC_POISON].timer == -1 && sd->sc_data[SC_BERSERK].timer == -1){ - pc_spirit_heal_hp(sd,skill); - pc_spirit_heal_sp(sd,skill); + pc_spirit_heal_hp(sd); + pc_spirit_heal_sp(sd); } else { sd->inchealspirithptick = 0; sd->inchealspiritsptick = 0; } + if (sd->hp_loss_value > 0) + pc_bleeding(sd); + else + sd->hp_loss_tick = 0; + return 0; } @@ -6642,7 +6711,7 @@ int pc_natural_heal(int tid,unsigned int tick,int id,int data) { natural_heal_tick = tick; natural_heal_diff_tick = DIFF_TICK(natural_heal_tick,natural_heal_prev_tick); - clif_foreachclient(pc_natural_heal_sub); + clif_foreachclient(pc_natural_heal_sub, tick); natural_heal_prev_tick = tick; return 0; |