Browse Source

- 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://svn.code.sf.net/p/rathena/svn/trunk@6466 54d463be-8e91-2dee-dedb-b68131a5f0ec

skotlex 19 years ago
parent
commit
6a983290bc
7 changed files with 66 additions and 38 deletions
  1. 6 0
      Changelog-Trunk.txt
  2. 5 0
      db/Changelog.txt
  3. 2 2
      db/skill_cast_db.txt
  4. 1 1
      db/skill_db.txt
  5. 6 8
      src/map/skill.c
  6. 45 27
      src/map/status.c
  7. 1 0
      src/map/status.h

+ 6 - 0
Changelog-Trunk.txt

@@ -3,6 +3,12 @@ Date	Added
 AS OF SVN REV. 5091, WE ARE NOW USING TRUNK.  ALL UNTESTED BUGFIXES/FEATURES GO INTO TRUNK.
 AS OF SVN REV. 5091, WE ARE NOW USING TRUNK.  ALL UNTESTED BUGFIXES/FEATURES GO INTO TRUNK.
 IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
 IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
 
 
+2006/05/04
+	* Rewrote Kaahi to behave as it should. It will heal whatever amount of
+	  damage accumulates in the time2 interval (500ms by default) after being
+	  hit. [Skotlex]
+	* Changed skill_unit_move_unit_group to enable moving of all types of
+	  ground-skills except ensembles (fixes warmth not following you) [Skotlex]
 2006/05/03
 2006/05/03
 	* Kaahi now triggers every 500ms rather than on every hit (but it only
 	* Kaahi now triggers every 500ms rather than on every hit (but it only
 	  heals if in those 500ms an attack that would previously trigger Kaahi has
 	  heals if in those 500ms an attack that would previously trigger Kaahi has

+ 5 - 0
db/Changelog.txt

@@ -26,6 +26,11 @@
 	-----
 	-----
 
 
 =========================
 =========================
+
+05/04
+	* Modified NPC_STUNATTACK: Max level is 5, stun duration is 1+lv seconds
+	  (these duration values are guessed, but they are better than the previous
+	  5+lv seconds) [Skotlex]
 05/03
 05/03
 	* Fusion's cast time reduced to 0. [Skotlex]
 	* Fusion's cast time reduced to 0. [Skotlex]
 	* Removed all Novice Job bonusses [Playtester]
 	* Removed all Novice Job bonusses [Playtester]

+ 2 - 2
db/skill_cast_db.txt

@@ -296,7 +296,7 @@
 //-- NPC_SILENCEATTACK
 //-- NPC_SILENCEATTACK
 178,0,0,0,0,10000:12000:14000:16000:18000:20000:22000:24000:26000:28000
 178,0,0,0,0,10000:12000:14000:16000:18000:20000:22000:24000:26000:28000
 //-- NPC_STUNATTACK
 //-- NPC_STUNATTACK
-179,0,0,0,0,6000:7000:8000:9000:10000:11000:12000:13000:14000:15000
+179,0,0,0,0,2000:3000:4000:5000:6000
 //-- NPC_PETRIFYATTACK
 //-- NPC_PETRIFYATTACK
 180,0,0,0,0,10000:11000:12000:13000:14000:15000:16000:17000:18000:19000
 180,0,0,0,0,10000:11000:12000:13000:14000:15000:16000:17000:18000:19000
 //-- NPC_CURSEATTACK
 //-- NPC_CURSEATTACK
@@ -741,7 +741,7 @@
 //-- SL_KAIZEL
 //-- SL_KAIZEL
 462,4500:4000:3500:3000:2500:2000:1500,0,0,1800000,2000
 462,4500:4000:3500:3000:2500:2000:1500,0,0,1800000,2000
 //-- SL_KAAHI
 //-- SL_KAAHI
-463,0,0,0,1800000,0
+463,0,0,0,1800000,500
 //-- SL_KAUPE
 //-- SL_KAUPE
 464,500,0,0,600000,0
 464,500,0,0,600000,0
 //-- SL_KAITE
 //-- SL_KAITE

+ 1 - 1
db/skill_db.txt

@@ -198,7 +198,7 @@
 176,-1,6,1,-1,0,0,10,1,no,0,2,0,weapon,0	//NPC_POISON#Poison Attack#
 176,-1,6,1,-1,0,0,10,1,no,0,2,0,weapon,0	//NPC_POISON#Poison Attack#
 177,7,6,1,-1,0,0,10,1,no,0,2,0,weapon,0	//NPC_BLINDATTACK#Darkness Attack#
 177,7,6,1,-1,0,0,10,1,no,0,2,0,weapon,0	//NPC_BLINDATTACK#Darkness Attack#
 178,-1,6,1,-1,0,0,10,1,no,0,2,0,weapon,0	//NPC_SILENCEATTACK#Silence Attack#
 178,-1,6,1,-1,0,0,10,1,no,0,2,0,weapon,0	//NPC_SILENCEATTACK#Silence Attack#
-179,-1,6,1,-1,0,0,10,1,no,0,2,0,weapon,0	//NPC_STUNATTACK#Stun Attack#
+179,-1,6,1,-1,0,0,5,1,no,0,2,0,weapon,0	//NPC_STUNATTACK#Stun Attack#
 180,7,6,1,-1,0,0,10,1,no,0,2,0,weapon,0	//NPC_PETRIFYATTACK#Petrify Attack#
 180,7,6,1,-1,0,0,10,1,no,0,2,0,weapon,0	//NPC_PETRIFYATTACK#Petrify Attack#
 181,7,6,1,7,0,0,10,1,no,0,2,0,weapon,0	//NPC_CURSEATTACK#Cursing Attack #
 181,7,6,1,7,0,0,10,1,no,0,2,0,weapon,0	//NPC_CURSEATTACK#Cursing Attack #
 182,-1,6,1,-1,0,0,10,1,no,0,2,0,weapon,0	//NPC_SLEEPATTACK#Sleep attack#
 182,-1,6,1,-1,0,0,10,1,no,0,2,0,weapon,0	//NPC_SLEEPATTACK#Sleep attack#

+ 6 - 8
src/map/skill.c

@@ -1424,8 +1424,10 @@ int skill_counter_additional_effect (struct block_list* src, struct block_list *
 
 
 	switch(skillid){
 	switch(skillid){
 	case 0: //Normal Attack
 	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;
 		break;
 	case MO_EXTREMITYFIST:			/* 阿?C羅覇凰�? */
 	case MO_EXTREMITYFIST:			/* 阿?C羅覇凰�? */
 		//阿?C羅を使うと5分間自然回復しないようになる
 		//阿?C羅を使うと5分間自然回復しないようになる
@@ -9844,13 +9846,9 @@ int skill_unit_move_unit_group( struct skill_unit_group *group, int m,int dx,int
 	if (group->unit==NULL)
 	if (group->unit==NULL)
 		return 0;
 		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;
 		return 0;
-		
+
 	m_flag = (int *) aMalloc(sizeof(int)*group->unit_count);
 	m_flag = (int *) aMalloc(sizeof(int)*group->unit_count);
 	memset(m_flag,0,sizeof(int)*group->unit_count);// 移動フラグ
 	memset(m_flag,0,sizeof(int)*group->unit_count);// 移動フラグ
 	//    m_flag
 	//    m_flag

+ 45 - 27
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.
 				 //Must not override a casting gospel char.
 				if (sc->data[type].val4 == BCT_SELF)
 				if (sc->data[type].val4 == BCT_SELF)
 					return 0;
 					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:
 			default:
 				if(sc->data[type].val1 > val1)
 				if(sc->data[type].val1 > val1)
 					return 1; //Return true to not mess up skill animations. [Skotlex
 					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;
 			calc_flag = 1;
 			break;
 			break;
 		case SC_KAAHI:
 		case SC_KAAHI:
-			if(flag&4)
+			if(flag&4) {
+				val4 = -1;
 				break;
 				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;
 			break;
 		case SC_BLESSING:
 		case SC_BLESSING:
 			if ((!undead_flag && race!=RC_DEMON) || bl->type == BL_PC)
 			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);
 					skill_delunitgroup(bl, group);
 				}
 				}
 				break;
 				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]
 			//gs_something2 [Vicious]
 			case SC_MADNESSCANCEL:
 			case SC_MADNESSCANCEL:
@@ -5327,6 +5345,29 @@ int status_change_end( struct block_list* bl , int type,int tid )
 	return 1;
 	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;
+}
 
 
 /*==========================================
 /*==========================================
  * ステータス異常終了タイマー
  * ステータス異常終了タイマー
@@ -5432,29 +5473,6 @@ int status_change_timer(int tid, unsigned int tick, int id, int data)
 		}
 		}
 		break;
 		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:	/* プロボック/オ?トバ?サ?ク */
 	case SC_PROVOKE:	/* プロボック/オ?トバ?サ?ク */
 		if(sc->data[type].val2!=0){	/* オ?トバ?サ?ク(1秒ごとにHPチェック) */
 		if(sc->data[type].val2!=0){	/* オ?トバ?サ?ク(1秒ごとにHPチェック) */
 			if(sd && sd->status.hp>sd->status.max_hp>>2)	/* 停止 */
 			if(sd && sd->status.hp>sd->status.max_hp>>2)	/* 停止 */

+ 1 - 0
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_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 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(int tid, unsigned int tick, int id, int data);
 int status_change_timer_sub(struct block_list *bl, va_list ap );
 int status_change_timer_sub(struct block_list *bl, va_list ap );
 int status_change_clear(struct block_list *bl,int type);
 int status_change_clear(struct block_list *bl,int type);