From 07e900f02b198bbfec480fceefb4a492f5ca8911 Mon Sep 17 00:00:00 2001 From: skotlex Date: Thu, 4 May 2006 14:17:51 +0000 Subject: - Rewrote Kaahi to behave as it should. It will hear whatever amount of damage accumulates in the time2 interval (500ms by default) after being hit. - Changed skill_unit_move_unit_group to enable moving of all types of ground-skills except ensembles. - Modified NPC_STUNATTACK: Max level is 5, stun duration is 1+lv seconds. git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@6466 54d463be-8e91-2dee-dedb-b68131a5f0ec --- src/map/skill.c | 14 +++++------ src/map/status.c | 72 +++++++++++++++++++++++++++++++++++--------------------- src/map/status.h | 1 + 3 files changed, 52 insertions(+), 35 deletions(-) (limited to 'src') diff --git a/src/map/skill.c b/src/map/skill.c index 25e92e15d..527480a6a 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -1424,8 +1424,10 @@ int skill_counter_additional_effect (struct block_list* src, struct block_list * switch(skillid){ case 0: //Normal Attack - if(tsc && tsc->data[SC_KAAHI].timer != -1) - tsc->data[SC_KAAHI].val4++; //Activate heal. + if(tsc && tsc->data[SC_KAAHI].timer != -1 && tsc->data[SC_KAAHI].val4 == -1) + tsc->data[SC_KAAHI].val4 = add_timer( + tick+skill_get_time2(SL_KAAHI,tsc->data[SC_KAAHI].val1), + kaahi_heal_timer, bl->id, SC_KAAHI); //Activate heal. break; case MO_EXTREMITYFIST: /* ˆ¢?C—…”e™€Œ? */ //ˆ¢?C—…‚ðŽg‚¤‚Æ5•ªŠÔŽ©‘R‰ñ•œ‚µ‚È‚¢‚悤‚ɂȂé @@ -9844,13 +9846,9 @@ int skill_unit_move_unit_group( struct skill_unit_group *group, int m,int dx,int if (group->unit==NULL) return 0; - i = skill_get_unit_flag(group->skill_id); //Check the flag... - if (!( - (i&UF_DANCE && !(i&UF_ENSEMBLE)) || //Only non ensemble dances and traps can be moved. - skill_get_inf2(group->skill_id)&INF2_TRAP - )) + if (skill_get_unit_flag(group->skill_id)&UF_ENSEMBLE) //Ensembles may not be moved around. return 0; - + m_flag = (int *) aMalloc(sizeof(int)*group->unit_count); memset(m_flag,0,sizeof(int)*group->unit_count);// ˆÚ“®ƒtƒ‰ƒO // m_flag diff --git a/src/map/status.c b/src/map/status.c index b1c36fb16..279d2e5f3 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -3915,6 +3915,15 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val //Must not override a casting gospel char. if (sc->data[type].val4 == BCT_SELF) return 0; + case SC_KAAHI: + if(sc->data[type].val1 > val1) + return 1; + //Delete timer if it exists. + if (sc->data[type].val4 != -1) { + delete_timer(sc->data[type].val4,kaahi_heal_timer); + sc->data[type].val4=-1; + } + break; default: if(sc->data[type].val1 > val1) return 1; //Return true to not mess up skill animations. [Skotlex @@ -4438,11 +4447,13 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val calc_flag = 1; break; case SC_KAAHI: - if(flag&4) + if(flag&4) { + val4 = -1; break; - val2 = tick/500; - val3 = 200*val1; //HP heal - tick = 500; + } + val2 = 200*val1; //HP heal + val3 = 5*val2; //SP cost + val4 = -1; //Kaahi Timer. break; case SC_BLESSING: if ((!undead_flag && race!=RC_DEMON) || bl->type == BL_PC) @@ -5192,6 +5203,13 @@ int status_change_end( struct block_list* bl , int type,int tid ) skill_delunitgroup(bl, group); } break; + case SC_KAAHI: + //Delete timer if it exists. + if (sc->data[type].val4 != -1) { + delete_timer(sc->data[type].val4,kaahi_heal_timer); + sc->data[type].val4=-1; + } + break; //gs_something2 [Vicious] case SC_MADNESSCANCEL: @@ -5327,6 +5345,29 @@ int status_change_end( struct block_list* bl , int type,int tid ) return 1; } +int kaahi_heal_timer(int tid, unsigned int tick, int id, int data) +{ + struct block_list *bl; + struct status_change *sc; + int hp; + + bl=map_id2bl(id); + sc=status_get_sc(bl); + if (!sc || data != SC_KAAHI || sc->data[data].timer==-1) + return 0; + + if (bl->type == BL_PC && ((TBL_PC*)bl)->status.sp < sc->data[data].val3) + return 0; + + hp = status_get_max_hp(bl) - status_get_hp(bl); + if (hp > sc->data[data].val2) + hp = sc->data[data].val2; + if (hp) { + battle_heal(bl, bl, hp, -sc->data[data].val3, 1); + clif_skill_nodamage(NULL,bl,AL_HEAL,hp,1); + } + return 1; +} /*========================================== * ƒXƒe[ƒ^ƒXˆÙíI—¹ƒ^ƒCƒ}[ @@ -5432,29 +5473,6 @@ int status_change_timer(int tid, unsigned int tick, int id, int data) } break; - case SC_KAAHI: - if(sc->data[type].val4) { //Heal - sc->data[type].val4 = 0; - if (sd && sd->status.sp < 5*sc->data[SC_KAAHI].val1) - ; //Not enough SP to cast - else { - int hp = status_get_max_hp(bl) - status_get_hp(bl); - if (hp > sc->data[SC_KAAHI].val2) - hp = sc->data[SC_KAAHI].val2; - if (hp) { - battle_heal(bl, bl, hp, -5*sc->data[SC_KAAHI].val1, 1); - clif_skill_nodamage(NULL,bl,AL_HEAL,hp,1); - } - } - } - if( (--sc->data[type].val2)>0 ){ - sc->data[type].timer=add_timer( - 500+tick, status_change_timer, - bl->id, data); - return 0; - } - break; - case SC_PROVOKE: /* ƒvƒƒ{ƒbƒN/ƒI?ƒgƒo?ƒT?ƒN */ if(sc->data[type].val2!=0){ /* ƒI?ƒgƒo?ƒT?ƒNi‚P•b‚²‚Æ‚ÉHPƒ`ƒFƒbƒNj */ if(sd && sd->status.hp>sd->status.max_hp>>2) /* ’âŽ~ */ diff --git a/src/map/status.h b/src/map/status.h index 57db4c937..ad3053df1 100644 --- a/src/map/status.h +++ b/src/map/status.h @@ -508,6 +508,7 @@ int status_get_sc_def(struct block_list *bl, int type); int status_change_start(struct block_list *bl,int type,int rate,int val1,int val2,int val3,int val4,int tick,int flag); int status_change_end( struct block_list* bl , int type,int tid ); +int kaahi_heal_timer(int tid, unsigned int tick, int id, int data); int status_change_timer(int tid, unsigned int tick, int id, int data); int status_change_timer_sub(struct block_list *bl, va_list ap ); int status_change_clear(struct block_list *bl,int type); -- cgit v1.2.3-70-g09d2