summaryrefslogtreecommitdiff
path: root/src/map/status.c
diff options
context:
space:
mode:
authorskotlex <skotlex@54d463be-8e91-2dee-dedb-b68131a5f0ec>2007-09-03 20:00:33 +0000
committerskotlex <skotlex@54d463be-8e91-2dee-dedb-b68131a5f0ec>2007-09-03 20:00:33 +0000
commit7689b26c216bb9de59d7ddfcbe9c45c18cfb7cc4 (patch)
tree38fc970c9b971dae33515eaff4fea45192a8d44e /src/map/status.c
parent7bb91031c6b244781f6637dc87dafa5835326888 (diff)
downloadhercules-7689b26c216bb9de59d7ddfcbe9c45c18cfb7cc4.tar.gz
hercules-7689b26c216bb9de59d7ddfcbe9c45c18cfb7cc4.tar.bz2
hercules-7689b26c216bb9de59d7ddfcbe9c45c18cfb7cc4.tar.xz
hercules-7689b26c216bb9de59d7ddfcbe9c45c18cfb7cc4.zip
- Added bonuses bSPRegenRate, bHPRegenRate. They behave like the opposite of bHPLossRate/bSPLossRate, making you gain x Hp/Sp every y ms.
- Added bonus bIgnoreMdefRate, used to ignore a % of the target's mdef when using magic attacks (bonus2 will ignore part of the mdef of all targets, bonus3 receives a race argument) - You can now use bonus2 bCastRate to adjust the cast rate of a single skill. - Cleaned the code for bleeding (hp-loss) and extended it to handle regen as well. - Some small cleanups in the pc_bonus functions - Removed bonus3 bHpLossRate since it was doing nothing and is not used. - Corrected bGetZeny bonus to be like in Aegis. The amount received is from 1 to the given amount, you can use negative zeny values to use an amount dependant on mob's level (amount*lv). - Updated doc/item_bonus.txt with all these changes - Anti-Magic/Stone-Skin now increase/decrease def/mdef only and in an absolute mode (+20*lv rather than +20%*lv). Also the duration is greatly decreased (x/15) when used on players. - Now when a player uses a strip skill without having it in the skill tree (auto-casted) the duration will be 0, the equipment will be stripped without causing the status change that blocks reequipping. git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@11112 54d463be-8e91-2dee-dedb-b68131a5f0ec
Diffstat (limited to 'src/map/status.c')
-rw-r--r--src/map/status.c33
1 files changed, 19 insertions, 14 deletions
diff --git a/src/map/status.c b/src/map/status.c
index 3b62cfe81..7fe903c2d 100644
--- a/src/map/status.c
+++ b/src/map/status.c
@@ -384,7 +384,7 @@ void initChangeTables(void)
add_sc(NPC_MAGICMIRROR, SC_MAGICMIRROR);
set_sc(NPC_SLOWCAST, SC_SLOWCAST, SI_SLOWCAST, SCB_NONE);
set_sc(NPC_CRITICALWOUND, SC_CRITICALWOUND, SI_CRITICALWOUND, SCB_NONE);
- set_sc(NPC_STONESKIN, SC_ARMORCHANGE, SI_BLANK, SCB_DEF|SCB_MDEF|SCB_DEF2|SCB_MDEF2);
+ set_sc(NPC_STONESKIN, SC_ARMORCHANGE, SI_BLANK, SCB_DEF|SCB_MDEF);
add_sc(NPC_ANTIMAGIC, SC_ARMORCHANGE);
add_sc(NPC_WIDECURSE, SC_CURSE);
add_sc(NPC_WIDESTUN, SC_STUN);
@@ -1657,6 +1657,7 @@ int status_calc_pc(struct map_session_data* sd,int first)
+ sizeof(sd->magic_addsize)
+ sizeof(sd->critaddrace)
+ sizeof(sd->expaddrace)
+ + sizeof(sd->ignore_mdef)
+ sizeof(sd->itemgrouphealrate)
+ sizeof(sd->sp_gain_race)
);
@@ -1697,6 +1698,7 @@ int status_calc_pc(struct map_session_data* sd,int first)
+ sizeof(sd->skillatk)
+ sizeof(sd->skillheal)
+ sizeof(sd->skillblown)
+ + sizeof(sd->skillcast)
+ sizeof(sd->add_def)
+ sizeof(sd->add_mdef)
+ sizeof(sd->add_dmg)
@@ -1734,8 +1736,6 @@ int status_calc_pc(struct map_session_data* sd,int first)
+ sizeof(sd->break_weapon_rate)
+ sizeof(sd->break_armor_rate)
+ sizeof(sd->crit_atk_rate)
- + sizeof(sd->hp_loss_rate)
- + sizeof(sd->sp_loss_rate)
+ sizeof(sd->classchange)
+ sizeof(sd->speed_add_rate)
+ sizeof(sd->aspd_add)
@@ -1745,9 +1745,6 @@ int status_calc_pc(struct map_session_data* sd,int first)
+ sizeof(sd->splash_range)
+ sizeof(sd->splash_add_range)
+ sizeof(sd->add_steal_rate)
- + sizeof(sd->hp_loss_value)
- + sizeof(sd->sp_loss_value)
- + sizeof(sd->hp_loss_type)
+ sizeof(sd->hp_gain_value)
+ sizeof(sd->sp_gain_value)
+ sizeof(sd->sp_vanish_rate)
@@ -3556,7 +3553,7 @@ static signed char status_calc_def(struct block_list *bl, struct status_change *
if(sc->data[SC_STEELBODY].timer!=-1)
return 90;
if(sc->data[SC_ARMORCHANGE].timer!=-1)
- def += def * sc->data[SC_ARMORCHANGE].val2/100;
+ def += sc->data[SC_ARMORCHANGE].val2;
if(sc->data[SC_DRUMBATTLE].timer!=-1)
def += sc->data[SC_DRUMBATTLE].val3;
if(sc->data[SC_DEFENCE].timer != -1) //[orn]
@@ -3592,8 +3589,6 @@ static signed short status_calc_def2(struct block_list *bl, struct status_change
return 0;
if(sc->data[SC_ETERNALCHAOS].timer!=-1)
return 0;
- if(sc->data[SC_ARMORCHANGE].timer!=-1)
- def2 += def2 * sc->data[SC_ARMORCHANGE].val2/100;
if(sc->data[SC_SUN_COMFORT].timer!=-1)
def2 += sc->data[SC_SUN_COMFORT].val2;
if(sc->data[SC_ANGELUS].timer!=-1)
@@ -3633,7 +3628,7 @@ static signed char status_calc_mdef(struct block_list *bl, struct status_change
if(sc->data[SC_SKA].timer != -1) // [marquis007]
return 90;
if(sc->data[SC_ARMORCHANGE].timer!=-1)
- mdef += mdef * sc->data[SC_ARMORCHANGE].val3/100;
+ mdef += sc->data[SC_ARMORCHANGE].val3;
if(sc->data[SC_STONE].timer!=-1 && sc->opt1 == OPT1_STONE)
mdef += 25*mdef/100;
if(sc->data[SC_FREEZE].timer!=-1)
@@ -3651,8 +3646,6 @@ static signed short status_calc_mdef2(struct block_list *bl, struct status_chang
if(sc->data[SC_BERSERK].timer!=-1)
return 0;
- if(sc->data[SC_ARMORCHANGE].timer!=-1)
- mdef2 += mdef2 * sc->data[SC_ARMORCHANGE].val3/100;
if(sc->data[SC_MINDBREAKER].timer!=-1)
mdef2 -= mdef2 * sc->data[SC_MINDBREAKER].val3/100;
@@ -4466,6 +4459,10 @@ int status_get_sc_def(struct block_list *bl, int type, int rate, int tick, int f
tick /= 5;
sc_def = status->agi;
break;
+ case SC_ARMORCHANGE:
+ if (sd) //Duration greatly reduced for players.
+ tick /= 15;
+ //No defense against it.
default:
//Effect that cannot be reduced? Likely a buff.
if (!(rand()%10000 < rate))
@@ -4711,6 +4708,7 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val
}
if (!opt_flag) return 0;
}
+ if (tick == 1) return 1; //Minimal duration: Only strip without causing the SC
break;
case SC_STRIPSHIELD:
if (sd) {
@@ -4723,6 +4721,7 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val
return 0;
pc_unequipitem(sd,i,3);
}
+ if (tick == 1) return 1; //Minimal duration: Only strip without causing the SC
break;
case SC_STRIPARMOR:
if (sd) {
@@ -4734,6 +4733,7 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val
return 0;
pc_unequipitem(sd,i,3);
}
+ if (tick == 1) return 1; //Minimal duration: Only strip without causing the SC
break;
case SC_STRIPHELM:
if (sd) {
@@ -4745,6 +4745,7 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val
return 0;
pc_unequipitem(sd,i,3);
}
+ if (tick == 1) return 1; //Minimal duration: Only strip without causing the SC
break;
}
@@ -7132,8 +7133,8 @@ static int status_natural_heal(DBKey key,void * data,va_list ap)
))
flag=0;
- if (sd && (sd->hp_loss_value > 0 || sd->sp_loss_value > 0))
- pc_bleeding(sd, natural_heal_diff_tick);
+ if (sd && (sd->hp_loss.value || sd->sp_loss.value))
+ pc_bleeding(sd, natural_heal_diff_tick);
if(flag&(RGN_SHP|RGN_SSP) && regen->ssregen &&
(vd = status_get_viewdata(bl)) && vd->dead_sit == 2)
@@ -7236,6 +7237,10 @@ static int status_natural_heal(DBKey key,void * data,va_list ap)
}
}
+ //Bonus skill-like regen
+ if (sd && (sd->hp_regen.value || sd->sp_regen.value))
+ pc_regen(sd, natural_heal_diff_tick, (flag&RGN_SHP?1:0)|(flag&RGN_SSP?2:0));
+
if (!regen->sregen)
return flag;