summaryrefslogtreecommitdiff
path: root/src/map/status.c
diff options
context:
space:
mode:
authorskotlex <skotlex@54d463be-8e91-2dee-dedb-b68131a5f0ec>2006-09-13 18:51:07 +0000
committerskotlex <skotlex@54d463be-8e91-2dee-dedb-b68131a5f0ec>2006-09-13 18:51:07 +0000
commitac6843412fa60d589a5d468ae293a895e55dd149 (patch)
tree2d5d63354a5d257753712b7bd9e4c883e60d3f9b /src/map/status.c
parentee9d44305dd2eb9283bfdf0b7ee8a9ffd08f620a (diff)
downloadhercules-ac6843412fa60d589a5d468ae293a895e55dd149.tar.gz
hercules-ac6843412fa60d589a5d468ae293a895e55dd149.tar.bz2
hercules-ac6843412fa60d589a5d468ae293a895e55dd149.tar.xz
hercules-ac6843412fa60d589a5d468ae293a895e55dd149.zip
- Changed a bit the dnsbl lookup in the login servers to make it faster.
- Moved the pc rate modifiers from items (hp/sp/matk/hit/flee/cri/flee2/def2/mdef2/def/def2/speed) from status_calc_bl_sub_pc to status_calc_pc, as it simplifies code vastly, and also fixes Osiris card not applying to said bonuses. - Fixed pc_damage_delay_rate not working, thanks to Orn. git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@8736 54d463be-8e91-2dee-dedb-b68131a5f0ec
Diffstat (limited to 'src/map/status.c')
-rw-r--r--src/map/status.c202
1 files changed, 98 insertions, 104 deletions
diff --git a/src/map/status.c b/src/map/status.c
index 341e7e85e..96c2215c6 100644
--- a/src/map/status.c
+++ b/src/map/status.c
@@ -1956,6 +1956,19 @@ int status_calc_pc(struct map_session_data* sd,int first)
if((skill=pc_checkskill(sd,CR_TRUST))>0)
status->max_hp += skill*200;
+ // Apply relative modifiers from equipment
+ if(sd->hprate < 0)
+ sd->hprate = 0;
+ if(sd->hprate!=100)
+ status->max_hp = status->max_hp * sd->hprate/100;
+ if(battle_config.hp_rate != 100)
+ status->max_hp = status->max_hp * battle_config.hp_rate/100;
+
+ if(status->max_hp > (unsigned int)battle_config.max_hp)
+ status->max_hp = battle_config.max_hp;
+ else if(!status->max_hp)
+ status->max_hp = 1;
+
// ----- SP MAX CALCULATION -----
// Basic MaxSP value
@@ -1965,9 +1978,23 @@ int status_calc_pc(struct map_session_data* sd,int first)
// Absolute modifiers from passive skills
if((skill=pc_checkskill(sd,SL_KAINA))>0)
status->max_sp += 30*skill;
+ if((skill=pc_checkskill(sd,HP_MEDITATIO))>0)
+ status->max_sp += status->max_sp * skill/100;
+ if((skill=pc_checkskill(sd,HW_SOULDRAIN))>0)
+ status->max_sp += status->max_sp * 2*skill/100;
- if(status->sp>status->max_sp)
- status->sp=status->max_sp;
+ // Apply relative modifiers from equipment
+ if(sd->sprate < 0)
+ sd->sprate = 0;
+ if(sd->sprate!=100)
+ status->max_sp = status->max_sp * sd->sprate/100;
+ if(battle_config.sp_rate != 100)
+ status->max_sp = status->max_sp * battle_config.sp_rate/100;
+
+ if(status->max_sp > (unsigned int)battle_config.max_sp)
+ status->max_sp = battle_config.max_sp;
+ else if(!status->max_sp)
+ status->max_sp = 1;
// ----- RESPAWN HP/SP -----
//
@@ -1991,6 +2018,53 @@ int status_calc_pc(struct map_session_data* sd,int first)
// ----- MISC CALCULATION -----
status_calc_misc(&sd->bl, status, sd->status.base_level);
+ //Equipment modifiers for misc settings
+ if(sd->matk_rate < 0)
+ sd->matk_rate = 0;
+ if(sd->matk_rate != 100){
+ status->matk_max = status->matk_max * sd->matk_rate/100;
+ status->matk_min = status->matk_min * sd->matk_rate/100;
+ }
+
+ if(sd->hit_rate < 0)
+ sd->hit_rate = 0;
+ if(sd->hit_rate != 100)
+ status->hit = status->hit * sd->hit_rate/100;
+
+ if(sd->flee_rate < 0)
+ sd->flee_rate = 0;
+ if(sd->flee_rate != 100)
+ status->flee = status->flee * sd->flee_rate/100;
+
+ if(sd->def2_rate < 0)
+ sd->def2_rate = 0;
+ if(sd->def2_rate != 100)
+ status->def2 = status->def2 * sd->def2_rate/100;
+
+ if(sd->mdef2_rate < 0)
+ sd->mdef2_rate = 0;
+ if(sd->mdef2_rate != 100)
+ status->mdef2 = status->mdef2 * sd->mdef2_rate/100;
+
+ if(sd->critical_rate < 0)
+ sd->critical_rate = 0;
+ if(sd->critical_rate != 100)
+ status->cri = status->cri * sd->critical_rate/100;
+
+ if(sd->flee2_rate < 0)
+ sd->flee2_rate = 0;
+ if(sd->flee2_rate != 100)
+ status->flee2 = status->flee2 * sd->flee2_rate/100;
+
+ if(sd->speed_rate < 0)
+ sd->speed_rate = 0;
+ if(sd->speed_rate != 100)
+ status->speed = status->speed*sd->speed_rate/100;
+
+ if(status->speed < battle_config.max_walk_speed)
+ status->speed = battle_config.max_walk_speed;
+
+
// ----- HIT CALCULATION -----
// Absolute modifiers from passive skills
@@ -2022,6 +2096,8 @@ int status_calc_pc(struct map_session_data* sd,int first)
// ----- EQUIPMENT-DEF CALCULATION -----
// Apply relative modifiers from equipment
+ if(sd->def_rate < 0)
+ sd->def_rate = 0;
if(sd->def_rate != 100) {
i = status->def * sd->def_rate/100;
status->def = cap_value(i, CHAR_MIN, CHAR_MAX);
@@ -2036,6 +2112,8 @@ int status_calc_pc(struct map_session_data* sd,int first)
// ----- EQUIPMENT-MDEF CALCULATION -----
// Apply relative modifiers from equipment
+ if(sd->mdef_rate < 0)
+ sd->mdef_rate = 0;
if(sd->mdef_rate != 100) {
i = status->mdef * sd->mdef_rate/100;
status->mdef = cap_value(i, CHAR_MIN, CHAR_MAX);
@@ -2093,6 +2171,8 @@ int status_calc_pc(struct map_session_data* sd,int first)
//
i = 800-status->agi*4;
status->dmotion = cap_value(i, 400, 800);
+ if(battle_config.pc_damage_delay_rate != 100)
+ status->dmotion = status->dmotion*battle_config.pc_damage_delay_rate/100;
// ----- MISC CALCULATIONS -----
@@ -2119,42 +2199,16 @@ int status_calc_pc(struct map_session_data* sd,int first)
}
//Underflow protections.
- if(sd->sprate < 0)
- sd->sprate = 0;
if(sd->dsprate < 0)
sd->dsprate = 0;
- if(sd->hprate < 0)
- sd->hprate = 0;
- if(sd->sprate < 0)
- sd->sprate = 0;
if(sd->castrate < 0)
sd->castrate = 0;
if(sd->delayrate < 0)
sd->delayrate = 0;
- if(sd->speed_rate < 0)
- sd->speed_rate = 0;
if(sd->hprecov_rate < 0)
sd->hprecov_rate = 0;
if(sd->sprecov_rate < 0)
sd->sprecov_rate = 0;
- if(sd->matk_rate < 0)
- sd->matk_rate = 0;
- if(sd->critical_rate < 0)
- sd->critical_rate = 0;
- if(sd->hit_rate < 0)
- sd->hit_rate = 0;
- if(sd->flee_rate < 0)
- sd->flee_rate = 0;
- if(sd->flee2_rate < 0)
- sd->flee2_rate = 0;
- if(sd->def_rate < 0)
- sd->def_rate = 0;
- if(sd->def2_rate < 0)
- sd->def2_rate = 0;
- if(sd->mdef_rate < 0)
- sd->mdef_rate = 0;
- if(sd->mdef2_rate < 0)
- sd->mdef2_rate = 0;
// Anti-element and anti-race
if((skill=pc_checkskill(sd,CR_TRUST))>0)
@@ -2542,11 +2596,6 @@ void status_calc_bl_sub_pc(struct map_session_data *sd, unsigned long flag)
status->max_hp += b_status->max_hp - sd->status.max_hp;
status->max_hp = status_calc_maxhp(&sd->bl, &sd->sc, status->max_hp);
- // Apply relative modifiers from equipment
- if(sd->hprate!=100)
- status->max_hp = status->max_hp * sd->hprate/100;
- if(battle_config.hp_rate != 100)
- status->max_hp = status->max_hp * battle_config.hp_rate/100;
if(status->max_hp > (unsigned int)battle_config.max_hp)
status->max_hp = battle_config.max_hp;
@@ -2566,19 +2615,8 @@ void status_calc_bl_sub_pc(struct map_session_data *sd, unsigned long flag)
status->max_sp = status_base_pc_maxsp(sd,status);
status->max_sp += b_status->max_sp - sd->status.max_sp;
- if((skill=pc_checkskill(sd,HP_MEDITATIO))>0)
- status->max_sp += status->max_sp * skill/100;
- if((skill=pc_checkskill(sd,HW_SOULDRAIN))>0)
- status->max_sp += status->max_sp * 2*skill/100;
-
status->max_sp = status_calc_maxsp(&sd->bl, &sd->sc, status->max_sp);
- // Apply relative modifiers from equipment
- if(sd->sprate!=100)
- status->max_sp = status->max_sp * sd->sprate/100;
- if(battle_config.sp_rate != 100)
- status->max_sp = status->max_sp * battle_config.sp_rate/100;
-
if(status->max_sp > (unsigned int)battle_config.max_sp)
status->max_sp = battle_config.max_sp;
else if(!status->max_sp)
@@ -2601,49 +2639,14 @@ void status_calc_bl_sub_pc(struct map_session_data *sd, unsigned long flag)
status->matk_min = status_calc_matk(&sd->bl, &sd->sc, status->matk_min);
status->matk_max = status_calc_matk(&sd->bl, &sd->sc, status->matk_max);
- if(sd->matk_rate != 100){
- status->matk_max = status->matk_max * sd->matk_rate/100;
- status->matk_min = status->matk_min * sd->matk_rate/100;
- }
if(sd->sc.data[SC_MAGICPOWER].timer!=-1) { //Store current matk values
sd->sc.data[SC_MAGICPOWER].val3 = status->matk_min;
sd->sc.data[SC_MAGICPOWER].val4 = status->matk_max;
}
}
-
- if(flag&SCB_HIT) {
- if(sd->hit_rate != 100)
- status->hit = status->hit * sd->hit_rate/100;
-
- if(status->hit < 1) status->hit = 1;
- }
-
- if(flag&SCB_FLEE) {
- if(sd->flee_rate != 100)
- status->flee = status->flee * sd->flee_rate/100;
-
- if(status->flee < 1) status->flee = 1;
- }
-
- if(flag&SCB_DEF2) {
- if(sd->def2_rate != 100)
- status->def2 = status->def2 * sd->def2_rate/100;
-
- if(status->def2 < 1) status->def2 = 1;
- }
-
- if(flag&SCB_MDEF2) {
- if(sd->mdef2_rate != 100)
- status->mdef2 = status->mdef2 * sd->mdef2_rate/100;
-
- if(status->mdef2 < 1) status->mdef2 = 1;
- }
if(flag&SCB_SPEED) {
- if(sd->speed_rate != 100)
- status->speed = status->speed*sd->speed_rate/100;
-
if(status->speed < battle_config.max_walk_speed)
status->speed = battle_config.max_walk_speed;
@@ -2693,29 +2696,16 @@ void status_calc_bl_sub_pc(struct map_session_data *sd, unsigned long flag)
}
if(flag&(SCB_AGI|SCB_DSPD)) {
- //Even though people insist this is too slow, packet data reports this is the actual real equation.
- skill = 800-status->agi*4;
- status->dmotion = cap_value(skill, 400, 800);
-
- if(battle_config.pc_damage_delay_rate != 100)
- status->dmotion = status->dmotion*battle_config.pc_damage_delay_rate/100;
- status->dmotion = status_calc_dmotion(&sd->bl, &sd->sc, b_status->dmotion);
- }
-
-
- if(flag&SCB_CRI)
- {
- if(sd->critical_rate != 100)
- status->cri = status->cri * sd->critical_rate/100;
-
- if(status->cri < 10) status->cri = 10;
- }
-
- if(flag&SCB_FLEE2) {
- if(sd->flee2_rate != 100)
- status->flee2 = status->flee2 * sd->flee2_rate/100;
-
- if(status->flee2 < 10) status->flee2 = 10;
+ if (b_status->agi == status->agi)
+ status->dmotion = status_calc_dmotion(&sd->bl, &sd->sc, b_status->dmotion);
+ else {
+ skill = 800-status->agi*4;
+ status->dmotion = cap_value(skill, 400, 800);
+ if(battle_config.pc_damage_delay_rate != 100)
+ status->dmotion = status->dmotion*battle_config.pc_damage_delay_rate/100;
+ //It's safe to ignore b_status->dmotion since no bonus affects it.
+ status->dmotion = status_calc_dmotion(&sd->bl, &sd->sc, status->dmotion);
+ }
}
if(flag&SCB_SPEED) {
@@ -3037,12 +3027,16 @@ void status_calc_bl(struct block_list *bl, unsigned long flag)
if(flag&SCB_MAXHP) {
status->max_hp = status_calc_maxhp(bl, sc, b_status->max_hp);
+ if (status->max_hp < 1)
+ status->max_hp = 1;
if (status->hp > status->max_hp) //FIXME: Should perhaps a status_zap should be issued?
status->hp = status->max_hp;
}
if(flag&SCB_MAXSP) {
status->max_sp = status_calc_maxsp(bl, sc, b_status->max_sp);
+ if (status->max_sp < 1)
+ status->max_sp = 1;
if (status->sp > status->max_sp)
status->sp = status->max_sp;
}
@@ -3593,14 +3587,14 @@ static signed char status_calc_mdef(struct block_list *bl, struct status_change
static signed short status_calc_mdef2(struct block_list *bl, struct status_change *sc, int mdef2)
{
if(!sc || !sc->count)
- return cap_value(mdef2,0,SHRT_MAX);
+ return cap_value(mdef2,1,SHRT_MAX);
if(sc->data[SC_BERSERK].timer!=-1)
return 0;
if(sc->data[SC_MINDBREAKER].timer!=-1)
mdef2 -= mdef2 * sc->data[SC_MINDBREAKER].val3/100;
- return cap_value(mdef2,0,SHRT_MAX);
+ return cap_value(mdef2,1,SHRT_MAX);
}
static unsigned short status_calc_speed(struct block_list *bl, struct status_change *sc, int speed)