Browse Source

- Updated Poison React
- Added Soul Change, Soul Burn
- Added a somewhat crude timer for Venom splasher
- Added a fix for Guild Skills causing crashes

git-svn-id: https://svn.code.sf.net/p/rathena/svn/branches/stable@431 54d463be-8e91-2dee-dedb-b68131a5f0ec

celest 20 years ago
parent
commit
5e8f67eb9d
9 changed files with 107 additions and 21 deletions
  1. 5 0
      Changelog.txt
  2. 2 0
      db/Changelog.txt
  3. 1 1
      db/skill_cast_db.txt
  4. 3 3
      db/skill_db.txt
  5. 1 1
      db/skill_require_db.txt
  6. 16 4
      src/map/battle.c
  7. 2 1
      src/map/map.c
  8. 1 0
      src/map/map.h
  9. 76 11
      src/map/skill.c

+ 5 - 0
Changelog.txt

@@ -1,6 +1,11 @@
 Date	Added
 12/1
 	- Changed #define MAX_PET_DB to 300, it's easier for people adding new pets like this. [Nas]
+        * Skill Updates [celest]
+          - Updated Poison React
+          - Added Soul Change, Soul Burn
+          - Added a somewhat crude timer for Venom splasher
+          - Added a fix for Guild Skills causing crashes by Sara, thanks!
 
 11/30
         * Fixed client crash when disguised characters die [celest]

+ 2 - 0
db/Changelog.txt

@@ -5,6 +5,8 @@
 	Ayathoya items == Added but no effect ( all are "ect" itens)
 	Skill databases == celest working on them i believe.
 
+12/1    * Updated Poison React, Soul Change, Soul Burn [celest]
+
 11/30   * Corrected bUnbreakable value in const.txt [celest]
         * updated skill_cast_db for Meltdown and Tiger Knuckle Fist [celest]
 

+ 1 - 1
db/skill_cast_db.txt

@@ -239,7 +239,7 @@
 372,0,800:800:800:800:800:1000:1000:1000:1000:1000,0,0	//CH_CHAINCRUSH#連柱崩撃#
 373,0,2000:2500:3000:3500:4000,0,0	//PF_HPCONVERSION#ライフ置き換え#
 374,3000,5000,0,0	//PF_SOULCHANGE#ソウルチェンジ#
-375,0,10000:10000:10000:10000:15000,0,0	//PF_SOULBURN#ソウルバーン#
+//375,0,10000:10000:10000:10000:15000,0,0	//PF_SOULBURN#ソウルバーン#
 
 378,0,2000,20000:30000:40000:50000:60000,20000:30000:40000:50000:60000	//ASC_EDP#エンチャントデッドリーポイズン#
 379,0,1000:1200:1400:1600:1800:2000:2200:2400:2600:2800,0,0	//ASC_BREAKER

+ 3 - 3
db/skill_db.txt

@@ -138,7 +138,7 @@
 136,-1,8,1,0,0,10,8,no,0,0,0,weapon,0	//AS_SONICBLOW#?ニックブロ?#
 137,3:4:5:6:7,6,1,0,0,5,1,no,0,0,0,weapon,0	//AS_GRIMTOOTH#グリ?トゥ?ス#
 138,8,6,16,5,1,10,1,no,0,1024,0,weapon,0	//AS_ENCHANTPOISON#エン?ャント?イズン#
-139,0,6,16,5,1,10,1,no,0,0,0,weapon,0	//AS_POISONREACT#?イズンリアクト#
+139,0,6,4,5,1,10,1,no,0,0,0,weapon,0	//AS_POISONREACT#?イズンリアクト#
 140,2,6,2,5,1,10,1,no,0,0,0,weapon,0	//AS_VENOMDUST#ベナ??スト#
 141,2,6,1,0,1,10,1,yes,0,0,0,weapon,0	//AS_SPLASHER#ベナ?スプラッシャ?#
 142,0,6,4,0,1,1,1,no,0,1,0,none,0	//NV_FIRSTAID#応?手当#
@@ -408,8 +408,8 @@
 371,-2,8,4,0,0,5,1,no,0,0,0,weapon,0	//CH_TIGERFIST#伏虎拳#
 372,-2,8,4,0,0,10,1:1:2:2:3:3:4:4:5:5,no,0,0,0,weapon,0	//CH_CHAINCRUSH#連柱崩撃#
 373,0,6,4,0,1,5,1,no,0,0,0,magic,0	//PF_HPCONVERSION#ライフ置き換え#
-374,0,0,4,0,1,1,1,yes,0,0,0,magic,0	//PF_SOULCHANGE#?ウル?ェンジ#
-375,0,0,4,0,1,1,1,yes,0,0,0,magic,0	//PF_SOULBURN#?ウルバ?ン#
+374,4,6,16,0,1,1,1,yes,0,0,0,magic,0	//PF_SOULCHANGE#?ウル?ェンジ#
+375,4,6,1,0,0,5,1,yes,0,0,0,magic,0	//PF_SOULBURN#?ウルバ?ン#
 376,0,0,0,0,1,5,1,no,0,0,0,weapon,0	//ASC_KATAR#アドバンスドカ??ル研究#
 377,0,0,4,0,1,10,1,no,0,0,0,misc,0	//ASC_HALLUCINATION#ハルシネ?ションウォ?ク#
 378,0,6,4,5,1,10,1,no,0,1024,0,weapon,0	//ASC_EDP#エン?ャントデッドリ??イズン#

+ 1 - 1
db/skill_require_db.txt

@@ -260,7 +260,7 @@
 372,0,0,12:14:16:18:20:22:24:26:28:30,0,0,0,99,none,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//CH_CHAINCRUSH#連柱崩?#
 373,0,0,1:2:3:4:5,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//PF_HPCONVERSION#???????#
 374,0,0,5,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//PF_SOULCHANGE#ソウルチェンジ#
-375,0,0,80:90:100:110:120,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//PF_HPCONVERSION#ライフ置き換え#
+375,0,0,80:90:100:110:120,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//PF_SOULBURN#?ウルバ?ン#
 
 378,0,0,60:70:80:90:100,0,0,0,99,none,0,678,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//ASC_EDP#エンチャントデッドリ?ポイズン#
 379,0,0,20:20:20:20:20:30:30:30:30:30,0,0,0,99,weapon,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//ASC_BREAKER#ソウルブレ?カ?#

+ 16 - 4
src/map/battle.c

@@ -4008,6 +4008,7 @@ struct Damage battle_calc_magic_attack(
 	struct Damage md;
 	int aflag;
 	int normalmagic_flag=1;
+	int matk_flag = 1;
 	int ele=0,race=7,t_ele=0,t_race=7,t_mode = 0,cardfix,t_class,i;
 	struct map_session_data *sd=NULL,*tsd=NULL;
 	struct mob_data *tmd = NULL;
@@ -4165,15 +4166,26 @@ struct Damage battle_calc_magic_attack(
 					printf("battle_calc_magic_attack(): napalmvulcan enemy count=0 !\n");
 			}
 			break;
+		case PF_SOULBURN: // Celest
+			if (target->type != BL_PC || skill_lv < 5) {
+				memset(&md,0,sizeof(md));
+				return md;
+			} else if (target->type == BL_PC) {
+				damage = ((struct map_session_data *)target)->status.sp * 2;
+				matk_flag = 0; // don't consider matk and matk2
+			}				
+			break;
 		}
 	}
 
 	if(normalmagic_flag){	// ˆê”Ê–‚–@ƒ_ƒ��[ƒWŒvŽZ
 		int imdef_flag=0;
-		if(matk1>matk2)
-			damage= matk2+rand()%(matk1-matk2+1);
-		else
-			damage= matk2;
+		if (matk_flag) {
+			if(matk1>matk2)
+				damage= matk2+rand()%(matk1-matk2+1);
+			else
+				damage= matk2;
+		}
 		if(sd) {
 			if(sd->ignore_mdef_ele & (1<<t_ele) || sd->ignore_mdef_race & (1<<t_race))
 				imdef_flag = 1;

+ 2 - 1
src/map/map.c

@@ -986,7 +986,7 @@ int map_quit(struct map_session_data *sd) {
 		sd->status.hp = 100;
 
 	skill_status_change_clear(&sd->bl,1);	// ステータス異常を解除する
-	skill_clear_unitgroup(&sd->bl);	// スキルユニットグループの削除
+//	skill_clear_unitgroup(&sd->bl);	// スキルユニットグループの削除
 	skill_cleartimerskill(&sd->bl);
 	pc_stop_walking(sd,0);
 	pc_stopattack(sd);
@@ -995,6 +995,7 @@ int map_quit(struct map_session_data *sd) {
 	skill_gangsterparadise(sd,0);
 
 	pc_calcstatus(sd,4);
+	skill_clear_unitgroup(&sd->bl);	// [Sara-chan]
 
 	clif_clearchar_area(&sd->bl,2);
 

+ 1 - 0
src/map/map.h

@@ -398,6 +398,7 @@ struct mob_data {
 		unsigned change_walk_target : 1;
 		unsigned walk_easy : 1;
 		unsigned special_mob_ai : 3;
+		unsigned soul_change_flag : 1; // Celest
 	} state;
 	int timer;
 	short to_x,to_y;

+ 76 - 11
src/map/skill.c

@@ -1,4 +1,4 @@
-// $Id: skill.c,v 1.8 2004/11/30 8:26:49 PM Celestia Exp $
+// $Id: skill.c,v 1.8 2004/12/1 11:59:43 PM Celestia Exp $
 /* スキル?係 */
 
 #include <stdio.h>
@@ -1151,7 +1151,7 @@ int skill_additional_effect( struct block_list* src, struct block_list *bl,int s
 			struct status_change *sc_data = battle_get_sc_data(bl);
 			if(sc_data) {
 				sc_data[SC_FREEZE].val3++;
-				if(sc_data[SC_FREEZE].val3 >= 3 && rand()%100 < skilllv*sc_def_mdef/100)
+				if(sc_data[SC_FREEZE].val3 >= 3 && rand()%1000 < skilllv*sc_def_mdef/100)
 					skill_status_change_start(bl,SC_FREEZE,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
 			}
 		}
@@ -2485,6 +2485,11 @@ int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int s
 				}
 				skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,
 					0x0500|dist  );
+				if (bl->type == BL_MOB && skillid == AS_GRIMTOOTH) {
+					struct status_change *sc_data = battle_get_sc_data(bl);
+					if (sc_data && sc_data[SC_SLOWDOWN].timer == -1)
+						skill_status_change_start(bl,SC_SLOWDOWN,0,0,0,0,1000,0);
+				}
 			}
 		}else{
 			int ar=1;
@@ -2499,9 +2504,8 @@ int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int s
 			else if(skillid==NPC_SPLASHATTACK)	/* スプラッシュアタックは範?7*7 */
 				ar=3;
 
-			// meteor assault cast effect (not sure how else to properly add it =p) [Celest]
 			if (skillid == ASC_METEORASSAULT)
-				clif_specialeffect(&sd->bl,409, 1);
+				clif_skill_nodamage(src,bl,skillid,skilllv,1);
 			
 			skill_area_temp[1]=bl->id;
 			skill_area_temp[2]=x;
@@ -2516,11 +2520,6 @@ int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int s
 			if (skillid == SM_MAGNUM)	// fire element for 10 seconds
 				skill_status_change_start(src,SC_FLAMELAUNCHER,0,0,0,0,10000,0);
 		}
-		if (bl->type == BL_MOB && skillid == AS_GRIMTOOTH) {
-			struct status_change *sc_data = battle_get_sc_data(bl);
-			if (sc_data && sc_data[SC_SLOWDOWN].timer == -1)
-				skill_status_change_start(bl,SC_SLOWDOWN,0,0,0,0,1000,0);
-		}
 		break;
 
 	case KN_BOWLINGBASH:	/* ボウリングバッシュ */
@@ -2721,6 +2720,27 @@ int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int s
 		skill_attack(BF_MISC,src,src,bl,skillid,skilllv,tick,0 );
 		break;
 
+	// Celest
+	case PF_SOULBURN:
+		{
+			int per = skilllv < 5 ? 20+ skilllv*10 : 60;
+			if (rand()%100 < per) {
+				clif_skill_nodamage(src,bl,skillid,skilllv,1);
+				if (skilllv == 5)
+					skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,0 );
+				if (bl->type == BL_PC)
+					((struct map_session_data *)bl)->status.sp = 0;
+			} else {
+				clif_skill_nodamage(src,src,skillid,skilllv,1);
+				if (skilllv == 5)
+					skill_attack(BF_MAGIC,src,src,src,skillid,skilllv,tick,0 );
+				sd->status.sp = 0;
+				clif_updatestatus(sd,SP_SP);
+			}
+			skill_status_change_start(src,SC_BLOCKSKILL,skilllv,0,skillid,0, (skilllv < 5 ? 10000: 15000),0 );
+		}
+		break;
+
 	case NPC_SELFDESTRUCTION:	/* 自爆 */
 	case NPC_SELFDESTRUCTION2:	/* 自爆2 */
 			if(flag&1){
@@ -2783,6 +2803,7 @@ int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int s
 		break;
 
 	default:
+		printf("Unknown skill used:%d\n",skillid);
 		map_freeblock_unlock();
 		return 1;
 	}
@@ -3538,7 +3559,7 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
 		{
 			struct status_change *tsc_data = battle_get_sc_data(bl);
 			int sc=SkillStatusChangeTable[skillid];
-			clif_skill_nodamage(src,bl,skillid,-1,1);
+			clif_skill_nodamage(src,bl,skillid,skilllv,1);
 			if( tsc_data ){
 				if( tsc_data[sc].timer==-1 )
 				/* 付加する */
@@ -4421,7 +4442,7 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
 		if((double)battle_get_max_hp(bl)*2/3 < battle_get_hp(bl)) //HPが2/3以上?っていたら失敗
 			return 1;
 		clif_skill_nodamage(src,bl,skillid,skilllv,1);
-		skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,skillid,src->id,0,skill_get_time(skillid,skilllv),0 );
+		skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,skillid,src->id,skill_get_time(skillid,skilllv),1000,0 );
 		break;
 
 	case PF_MINDBREAKER:		/* プロボック */
@@ -4462,6 +4483,35 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
 		}
 		break;
 
+	case PF_SOULCHANGE:
+		{
+			int sp1 = 0, sp2 = 0;
+			if (sd) {
+				if (dstsd) {
+					sp1 = sd->status.sp > dstsd->status.max_sp ? dstsd->status.max_sp : sd->status.sp;
+					sp2 = dstsd->status.sp > sd->status.max_sp ? sd->status.max_sp : dstsd->status.sp;
+					sd->status.sp = sp2;
+					dstsd->status.sp = sp1;
+					clif_heal(sd->fd,SP_SP,sp2);
+					clif_heal(dstsd->fd,SP_SP,sp1);
+				} else if (dstmd) {
+					if (dstmd->state.soul_change_flag) {
+						clif_skill_fail(sd,skillid,0,0);
+						map_freeblock_unlock();
+						return 0;
+					}
+					sp2 = sd->status.max_sp * 3 /100;
+					if (sd->status.sp + sp2 > sd->status.max_sp)
+						sp2 = sd->status.max_sp - sd->status.sp;
+					sd->status.sp += sp2;
+					clif_heal(sd->fd,SP_SP,sp2);
+					dstmd->state.soul_change_flag = 1;
+				}
+			}
+			clif_skill_nodamage(src,bl,skillid,skilllv,1);
+		}
+		break;
+
 	// Weapon Refining [Celest]
 	case WS_WEAPONREFINE:
 		if(sd)
@@ -4617,6 +4667,7 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
 			}
 		}
 		break;
+
 	default:
 		printf("Unknown skill used:%d\n",skillid);
 		map_freeblock_unlock();
@@ -9072,6 +9123,20 @@ int skill_status_change_timer(int tid, unsigned int tick, int id, int data)
 				return 0;
 		}
 		break;
+
+	case SC_SPLASHER:
+		if (sc_data[type].val4 % 1000 == 0) {
+			char timer[2];
+			sprintf (timer, "%d", sc_data[type].val4/1000);
+			clif_message(bl, timer);
+		}			
+		if((sc_data[type].val4 -= 500) > 0) {
+			sc_data[type].timer = add_timer(
+				500 + tick, skill_status_change_timer,
+				bl->id, data);
+				return 0;
+		}
+		break;
 	case SC_LEADERSHIP:
 	case SC_GLORYWOUNDS:
 	case SC_SOULCOLD: