summaryrefslogtreecommitdiff
path: root/src/map/status.c
diff options
context:
space:
mode:
authorskotlex <skotlex@54d463be-8e91-2dee-dedb-b68131a5f0ec>2006-08-18 16:43:20 +0000
committerskotlex <skotlex@54d463be-8e91-2dee-dedb-b68131a5f0ec>2006-08-18 16:43:20 +0000
commitaff8dade6593463301abee054981a4ea21fff273 (patch)
treecaacd036116e75a315e95302871e2f23718e5c03 /src/map/status.c
parent39292f6f6a30287d2a4ffdd035f80616a8e6e8a4 (diff)
downloadhercules-aff8dade6593463301abee054981a4ea21fff273.tar.gz
hercules-aff8dade6593463301abee054981a4ea21fff273.tar.bz2
hercules-aff8dade6593463301abee054981a4ea21fff273.tar.xz
hercules-aff8dade6593463301abee054981a4ea21fff273.zip
- Made HLIF_HEAL a self skill that auto-selects target to caster's master.
- Implemented SC_BLOODLUST and SC_CHANGE, cleaned up HLIF_CHANGE - Applied a correction to HVAN_EXPLOSION - Fixed Homun ASPD calculation being able to underflow and give you min speed. - Added monster_ai&128 to make aggressive mobs ignore that behaviour of always picking Homun targets above player targets regardless of who is closer. - Fixed homun info packet being unable to display HP/SP correctly once the values are above 32k. git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@8349 54d463be-8e91-2dee-dedb-b68131a5f0ec
Diffstat (limited to 'src/map/status.c')
-rw-r--r--src/map/status.c39
1 files changed, 31 insertions, 8 deletions
diff --git a/src/map/status.c b/src/map/status.c
index 99449554b..f40e39c9b 100644
--- a/src/map/status.c
+++ b/src/map/status.c
@@ -376,7 +376,7 @@ void initChangeTables(void) {
add_sc(SA_ELEMENTWIND, SC_ELEMENTALCHANGE);
set_sc(HLIF_AVOID, SC_AVOID, SI_BLANK, SCB_SPEED);
- set_sc(HLIF_CHANGE, SC_CHANGE, SI_BLANK, SCB_INT);
+ set_sc(HLIF_CHANGE, SC_CHANGE, SI_BLANK, SCB_MAXHP|SCB_MAXSP);
set_sc(HFLI_FLEET, SC_FLEET, SI_BLANK, SCB_ASPD|SCB_BATK|SCB_WATK);
set_sc(HFLI_SPEED, SC_SPEED, SI_BLANK, SCB_FLEE); //[orn]
set_sc(HAMI_DEFENCE, SC_DEFENCE, SI_BLANK, SCB_DEF); //[orn]
@@ -2255,6 +2255,14 @@ int status_calc_homunculus(struct homun_data *hd, int first)
status->rhw.atk = status->dex;
status->rhw.atk2 = status->str + hom->level;
+ status->aspd_rate = 1000;
+
+ skill = (1000 -4*status->agi -status->dex)
+ *hd->homunculusDB->baseASPD/1000;
+
+ status->amotion = cap_value(skill,battle_config.max_aspd,2000);
+ status->adelay = 2*status->amotion;
+
status_calc_misc(status, BL_HOM, hom->level);
status_calc_bl(&hd->bl, SCB_ALL); //Status related changes.
@@ -2725,14 +2733,15 @@ void status_calc_bl_sub_hom(struct homun_data *hd, unsigned long flag) //[orn]
if(flag&(SCB_ASPD|SCB_AGI|SCB_DEX)) {
flag|=SCB_ASPD;
- status->amotion = hd->homunculusDB->baseASPD - ((status->agi*4+status->dex)* hd->homunculusDB->baseASPD / 1000);
+ skill = (1000 -4*status->agi -status->dex)
+ *hd->homunculusDB->baseASPD/1000;
+
status->aspd_rate = status_calc_aspd_rate(&hd->bl, &hd->sc , b_status->aspd_rate);
if(status->aspd_rate != 1000)
- status->amotion = status->amotion *status->aspd_rate/1000;
-
- status->amotion = cap_value(status->amotion,battle_config.max_aspd,2000);
+ skill = skill*status->aspd_rate/1000;
+ status->amotion = cap_value(skill,battle_config.max_aspd,2000);
status->adelay = 2*status->amotion;
}
@@ -3109,8 +3118,6 @@ static unsigned short status_calc_int(struct block_list *bl, struct status_chang
int_ -= int_ * sc->data[SC_STRIPHELM].val2/100;
if(sc->data[SC_NEN].timer!=-1)
int_ += sc->data[SC_NEN].val1;
- if(sc->data[SC_CHANGE].timer!=-1)
- int_ += 60;
if(sc->data[SC_MARIONETTE].timer!=-1)
int_ -= (sc->data[SC_MARIONETTE].val4>>16)&0xFF;
if(sc->data[SC_MARIONETTE2].timer!=-1)
@@ -3686,6 +3693,8 @@ static unsigned int status_calc_maxhp(struct block_list *bl, struct status_chang
if(!sc || !sc->count)
return cap_value(maxhp,1,UINT_MAX);
+ if(sc->data[SC_CHANGE].timer!=-1)
+ maxhp = sc->data[SC_CHANGE].val3;
if(sc->data[SC_INCMHPRATE].timer!=-1)
maxhp += maxhp * sc->data[SC_INCMHPRATE].val1/100;
if(sc->data[SC_APPLEIDUN].timer!=-1)
@@ -3703,6 +3712,8 @@ static unsigned int status_calc_maxsp(struct block_list *bl, struct status_chang
if(!sc || !sc->count)
return cap_value(maxsp,1,UINT_MAX);
+ if(sc->data[SC_CHANGE].timer!=-1)
+ maxsp = sc->data[SC_CHANGE].val2;
if(sc->data[SC_INCMSPRATE].timer!=-1)
maxsp += maxsp * sc->data[SC_INCMSPRATE].val1/100;
if(sc->data[SC_SERVICE4U].timer!=-1)
@@ -5459,6 +5470,8 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val
break;
case SC_BLOODLUST:
val2 = 20+10*val1; //Atk rate change.
+ val3 = 3*val1; //Leech chance
+ val4 = 20; //Leech percent
break;
case SC_FLEET:
val2 = 30*val1; //Aspd change
@@ -5494,6 +5507,14 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val
case SC_BUNSINJYUTSU:
val2=(val1+1)/2; // number of hits blocked
break;
+ case SC_CHANGE:
+ {
+ struct status_data *status = status_get_base_status(bl);
+ if (!status) return 0;
+ val2= status->max_hp; //Base Max HP
+ val3= status->max_sp; //Base Max SP
+ }
+ break;
default:
if (calc_flag == SCB_NONE && StatusSkillChangeTable[type]==0)
{ //Status change with no calc, and no skill associated...? unknown?
@@ -5717,7 +5738,9 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val
sc->data[type].val2 = 5*status->max_hp/100;
status_heal(bl, status->max_hp, 0, 1); //Do not use percent_heal as this healing must override BERSERK's block.
status_set_sp(bl, 0, 0); //Damage all SP
- }
+ } else if (type==SC_CHANGE) //Heal all HP
+ status_percent_heal(bl, 100, 0);
+
if (type==SC_RUN) {
struct unit_data *ud = unit_bl2ud(bl);