Browse Source

- Applied most of Mpeg's work on Ninja Skills. For information see: http://gpegon.free.fr/ea/ninja_10-15-06_mpeg.txt

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@8999 54d463be-8e91-2dee-dedb-b68131a5f0ec
skotlex 18 years ago
parent
commit
d99bf3c795
10 changed files with 111 additions and 112 deletions
  1. 2 0
      Changelog-Trunk.txt
  2. 2 0
      db/Changelog.txt
  3. 1 1
      db/job_db1.txt
  4. 23 21
      db/skill_cast_db.txt
  5. 6 6
      db/skill_db.txt
  6. 0 1
      db/skill_nocast_db.txt
  7. 1 1
      db/skill_require_db.txt
  8. 39 34
      src/map/battle.c
  9. 28 21
      src/map/skill.c
  10. 9 27
      src/map/status.c

+ 2 - 0
Changelog-Trunk.txt

@@ -4,6 +4,8 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK.  ALL UNTESTED BUGFIXES/FEATURES GO
 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/10/16
 2006/10/16
+	* Applied most of Mpeg's work on Ninja Skills. For information see:
+	  http://gpegon.free.fr/ea/ninja_10-15-06_mpeg.txt [Skotlex]
 	* When reinvoking a combo-time, the previous combo time will be terminated.
 	* When reinvoking a combo-time, the previous combo time will be terminated.
 	  This could fix the ongoing difficulties pulling off Monk combos. [Skotlex]
 	  This could fix the ongoing difficulties pulling off Monk combos. [Skotlex]
 	* Fixed Esma-state not ending after casting it. [Skotlex]
 	* Fixed Esma-state not ending after casting it. [Skotlex]

+ 2 - 0
db/Changelog.txt

@@ -20,6 +20,8 @@
 
 
 ========================
 ========================
 10/16
 10/16
+	* Applied most of Mpeg's work on Ninja Skills. For information see:
+	  http://gpegon.free.fr/ea/ninja_10-15-06_mpeg.txt [Skotlex]
 	* Small Kiel MVP drop rate increase [Playtester]
 	* Small Kiel MVP drop rate increase [Playtester]
 10/14
 10/14
 	* Fixed Bacsojin's and Chung E's stats [Playtester]
 	* Fixed Bacsojin's and Chung E's stats [Playtester]

+ 1 - 1
db/job_db1.txt

@@ -54,7 +54,7 @@
 // Gunslinger
 // Gunslinger
 24,	27000,75   ,300  ,600,  500  ,2000, 2000, 2000, 2000, 2000, 2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 700 , 750 ,1500 , 700 ,1500 ,2000
 24,	27000,75   ,300  ,600,  500  ,2000, 2000, 2000, 2000, 2000, 2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 700 , 750 ,1500 , 700 ,1500 ,2000
 // Ninja
 // Ninja
-25,	24000,60   ,700  ,400  ,400  ,500  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000, 750
+25,	26000,80   ,150  ,500  ,400  ,500  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000, 550
 // Novice High
 // Novice High
 4001,	20000,0    ,500  ,100  ,500  ,650  ,700  ,2000 ,2000 ,2000 ,800  ,2000 ,700  ,700  ,650  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
 4001,	20000,0    ,500  ,100  ,500  ,650  ,700  ,2000 ,2000 ,2000 ,800  ,2000 ,700  ,700  ,650  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
 // Swordman High
 // Swordman High

+ 23 - 21
db/skill_cast_db.txt

@@ -878,45 +878,47 @@
 
 
 
 
 //===== Ninja ==============================
 //===== Ninja ==============================
-//-- NJ_HUUMA // Unknown casting time. temp value (taken from jA)
-525,1000,1000,0,0,0
+//-- NJ_KUNAI
+525,0,1000,0,0,0
+//-- NJ_HUUMA
+525,3000,2000,0,0,0
 //-- NJ_ZENYNAGE
 //-- NJ_ZENYNAGE
 526,0,5000,0,0,0
 526,0,5000,0,0,0
-//-- NJ_TATAMIGAESHI // Duration1 is land-effect, Duration2 is range-inmunity effect.
+//-- NJ_TATAMIGAESHI
 527,0,3000,0,3000,3000
 527,0,3000,0,3000,3000
-//-- NJ_KASUMIKIRI // Delay unknown (if there is one)
-528,0,0,0,30000:60000:90000:120000:150000:180000:210000:240000:270000:300000,0
-//-- NJ_SHADOWJUMP // Delay unknown (if there is one)
-529,0,0,0,0,0
+//-- NJ_KASUMIKIRI
+528,0,1000,0,30000:60000:90000:120000:150000:180000:210000:240000:270000:300000,0
+//-- NJ_SHADOWJUMP
+529,0,1000,0,0,0
 //-- NJ_KIRIKAGE // Seems to have no delay (English Translation Project)
 //-- NJ_KIRIKAGE // Seems to have no delay (English Translation Project)
 530,0,0,0,0,0
 530,0,0,0,0,0
 //-- NJ_UTSUSEMI
 //-- NJ_UTSUSEMI
-531,0,0,0,20000:30000:40000:50000:60000,0
-//-- NJ_BUNSINJYUTSU // Cast and Delay unknown (temp > random cast)
-532,4000:3500:3000:2500:2000:3000:2500:2000:1500:1000,0,0,60000:80000:100000:120000:140000:160000:180000:200000:220000:240000,0
+531,0,1000,0,20000:30000:40000:50000:60000,0
+//-- NJ_BUNSINJYUTSU
+532,4000:3500:3000:2500:2000:1500:1000:1000:1000:1000,1000,0,60000:80000:100000:120000:140000:160000:180000:200000:220000:240000,0
 
 
 //-- NJ_KOUENKA
 //-- NJ_KOUENKA
 534,700:1400:2100:2800:3500:4200:4900:5600:6300:7000,0,0,0,0
 534,700:1400:2100:2800:3500:4200:4900:5600:6300:7000,0,0,0,0
 //-- NJ_KAENSIN
 //-- NJ_KAENSIN
 535,6000:5500:5000:4500:4000:3500:3000:2500:2000:1500,1000,0,20000,0,
 535,6000:5500:5000:4500:4000:3500:3000:2500:2000:1500,1000,0,20000,0,
-//-- NJ_BAKUENRYU // Cast and Delay taken from lvl5 (need to confirm it's not influenced by lvl)
+//-- NJ_BAKUENRYU
 536,3000,2000,0,0,0
 536,3000,2000,0,0,0
 //-- NJ_HYOUSENSOU
 //-- NJ_HYOUSENSOU
 537,700:1400:2100:2800:3500:4200:4900:5600:6300:7000,0,0,0,0
 537,700:1400:2100:2800:3500:4200:4900:5600:6300:7000,0,0,0,0
-//-- NJ_SUITON // Delay unknown (if there is one)
+//-- NJ_SUITON
 538,3000,0,0,15000:20000:25000:30000:35000:40000:45000:50000:55000:60000,15000:20000:25000:30000:35000:40000:45000:50000:55000:60000
 538,3000,0,0,15000:20000:25000:30000:35000:40000:45000:50000:55000:60000,15000:20000:25000:30000:35000:40000:45000:50000:55000:60000
-//-- NJ_HYOUSYOURAKU // Cast time and Delay taken from jA (not reliable, must be checked)
-539,3000,1000:1200:1400:1600:1800:2000:2200:2400:2600:2800,0,0,10000:11000:12000:13000:14000:15000:16000:17000:18000:19000
+//-- NJ_HYOUSYOURAKU
+539,2000:2500:3000:3500:4000,2000,0,0,10000:11000:12000:13000:14000:15000:16000:17000:18000:19000
 //-- NJ_HUUJIN
 //-- NJ_HUUJIN
-540,700:1400:2100:2800:3500:4200:4900:5600:6300:7000,0,0,0,0
-//-- NJ_RAIGEKISAI // Cast and Delay must be checked (Seems to be more 4s at lvl1. Don't have other lvls)
-541,3700:3400:3100:2800:2500,0,0,0,0
-//-- NJ_KAMAITACHI // Cast and delay unknown > temp values taken from NJ_BAKUENRYU
-542,3000,2000,0,0,0
+540,1000:1500:2000:2500:3000:3500:4000:5000:5500:6000,1000,0,0,0
+//-- NJ_RAIGEKISAI
+541,4000,0,0,0,0
+//-- NJ_KAMAITACHI
+542,4000,0,0,0,0
 //-- NJ_NEN
 //-- NJ_NEN
 543,5000:4000:3000:2000:1000,0,0,30000:45000:60000:75000:90000,30000:45000:60000:75000:90000
 543,5000:4000:3000:2000:1000,0,0,30000:45000:60000:75000:90000,30000:45000:60000:75000:90000
-//-- NJ_ISSEN // cast and delay unknown > temp values taken from MO_EXTREMITYFIST
-544,4000:3500:3000:2500:2000:3000:2500:2000:1500:1000,0,0,0,0
+//-- NJ_ISSEN
+544,0,3000,0,0,0
 //==========================================
 //==========================================
 
 
 
 

+ 6 - 6
db/skill_db.txt

@@ -549,14 +549,14 @@
 522,0,0,0,0,0,0,10,1,no,0,0,0,weapon,0	//NJ_TOBIDOUGU#NJ_TOBIDOUGU#
 522,0,0,0,0,0,0,10,1,no,0,0,0,weapon,0	//NJ_TOBIDOUGU#NJ_TOBIDOUGU#
 523,9,6,1,-1,0,0,10,1,no,0,0,0,weapon,0	//NJ_SYURIKEN#NJ_SYURIKEN#
 523,9,6,1,-1,0,0,10,1,no,0,0,0,weapon,0	//NJ_SYURIKEN#NJ_SYURIKEN#
 524,9,8,1,-1,0,0,5,3,no,0,0,0,weapon,0	//NJ_KUNAI#NJ_KUNAI#
 524,9,8,1,-1,0,0,5,3,no,0,0,0,weapon,0	//NJ_KUNAI#NJ_KUNAI#
-525,9,8,1,-1,4,1,5,-1:-2:-3:-4:-5,yes,0,0,0,weapon,0	//NJ_HUUMA#NJ_HUUMA#
+525,9,8,1,-1,4,1,5,-3:-3:-4:-4:-5,yes,0,0,0,weapon,0	//NJ_HUUMA#NJ_HUUMA#
 526,9,6,1,0,0,0,10,1,no,0,0,0,misc,0	//NJ_ZENYNAGE#NJ_ZENYNAGE#
 526,9,6,1,0,0,0,10,1,no,0,0,0,misc,0	//NJ_ZENYNAGE#NJ_ZENYNAGE#
 527,0,6,4,-1,0,0,5,1,no,0,0,0,weapon,3	//NJ_TATAMIGAESHI#NJ_TATAMIGAESHI#
 527,0,6,4,-1,0,0,5,1,no,0,0,0,weapon,3	//NJ_TATAMIGAESHI#NJ_TATAMIGAESHI#
 528,-1,6,1,-1,0,0,10,1,no,0,0,0,weapon,0	//NJ_KASUMIKIRI#NJ_KASUMIKIRI#
 528,-1,6,1,-1,0,0,10,1,no,0,0,0,weapon,0	//NJ_KASUMIKIRI#NJ_KASUMIKIRI#
 529,7:9:11:13:15,6,2,0,1,0,5,1,no,0,0,0,none,0	//NJ_SHADOWJUMP#NJ_SHADOWJUMP#
 529,7:9:11:13:15,6,2,0,1,0,5,1,no,0,0,0,none,0	//NJ_SHADOWJUMP#NJ_SHADOWJUMP#
 530,-1,6,1,-1,0,0,5,1,no,0,0,0,weapon,0	//NJ_KIRIKAGE#NJ_KIRIKAGE#
 530,-1,6,1,-1,0,0,5,1,no,0,0,0,weapon,0	//NJ_KIRIKAGE#NJ_KIRIKAGE#
 531,0,6,4,0,1,0,5,1,no,0,0,0,none,7	//NJ_UTSUSEMI#NJ_UTSUSEMI#
 531,0,6,4,0,1,0,5,1,no,0,0,0,none,7	//NJ_UTSUSEMI#NJ_UTSUSEMI#
-532,0,6,4,0,1,0,10,1,no,0,0,0,none,0	//NJ_BUNSINJYUTSU#NJ_BUNSINJYUTSU#
+532,0,6,4,0,1,0,10,1,yes,0,0,0,magic,0	//NJ_BUNSINJYUTSU#NJ_BUNSINJYUTSU#
 533,0,0,0,0,0,0,10,0,no,0,0,0,none,0	//NJ_NINPOU#NJ_NINPOU#
 533,0,0,0,0,0,0,10,0,no,0,0,0,none,0	//NJ_NINPOU#NJ_NINPOU#
 534,9,8,1,3,0,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0,0,magic,0	//NJ_KOUENKA#NJ_KOUENKA#
 534,9,8,1,3,0,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0,0,magic,0	//NJ_KOUENKA#NJ_KOUENKA#
 535,0,8,4,3,0,0,10,1,yes,0,0,0,magic,0	//NJ_KAENSIN#NJ_KAENSIN#
 535,0,8,4,3,0,0,10,1,yes,0,0,0,magic,0	//NJ_KAENSIN#NJ_KAENSIN#
@@ -564,11 +564,11 @@
 537,9,8,1,1,0,0,10,3:4:5:6:7:8:9:10:11:12,yes,0,0,0,magic,0	//NJ_HYOUSENSOU#NJ_HYOUSENSOU#
 537,9,8,1,1,0,0,10,3:4:5:6:7:8:9:10:11:12,yes,0,0,0,magic,0	//NJ_HYOUSENSOU#NJ_HYOUSENSOU#
 538,9,6,2,0,1,0,10,1,yes,0,0,0,magic,0	//NJ_SUITON#NJ_SUITON#
 538,9,6,2,0,1,0,10,1,yes,0,0,0,magic,0	//NJ_SUITON#NJ_SUITON#
 539,0,6,4,1,2,3,5,1,yes,0,0,0,magic,0	//NJ_HYOUSYOURAKU#NJ_HYOUSYOURAKU#
 539,0,6,4,1,2,3,5,1,yes,0,0,0,magic,0	//NJ_HYOUSYOURAKU#NJ_HYOUSYOURAKU#
-540,9,8,1,4,0,0,10,-1:-2:-2:-3:-3:-4:-4:-5:-5:-6,yes,0,0,0,magic,0	//NJ_HUUJIN#NJ_HUUJIN#
+540,9,8,1,4,0,0,10,1:2:2:3:3:4:4:5:5:6,yes,0,0,0,magic,0	//NJ_HUUJIN#NJ_HUUJIN#
 541,9,6,4,4,2,2:2:3:3:4,5,1,yes,0,0,0,magic,0	//NJ_RAIGEKISAI#NJ_RAIGEKISAI#
 541,9,6,4,4,2,2:2:3:3:4,5,1,yes,0,0,0,magic,0	//NJ_RAIGEKISAI#NJ_RAIGEKISAI#
-542,5:6:7:8:9,8,1,4,0,2,5,1,yes,0,0,0,magic,0	//NJ_KAMAITACHI#NJ_KAMAITACHI#
-543,0,6,4,0,1,0,5,1,no,0,0,0,none,0	//NJ_NEN#NJ_NEN#
-544,-2,6,1,0,0,0,10,1,yes,0,0,0,weapon,0	//NJ_ISSEN#NJ_ISSEN#
+542,5:6:7:8:9,8,1,4,0,1,5,1,yes,0,0,0,magic,0	//NJ_KAMAITACHI#NJ_KAMAITACHI#
+543,0,6,4,0,1,0,5,1,yes,0,0,0,none,0	//NJ_NEN#NJ_NEN#
+544,-4,6,1,0,0,0,10,1,no,0,0,0,weapon,0	//NJ_ISSEN#NJ_ISSEN#
 
 
 1001,9,6,1,-1,0,0,1,1,no,0,1,0,weapon,0	//KN_CHARGEATK#Charge Attack#
 1001,9,6,1,-1,0,0,1,1,no,0,1,0,weapon,0	//KN_CHARGEATK#Charge Attack#
 1002,0,6,4,0,1,0,1,0,no,0,1,0,weapon,2	//CR_SHRINK#Shrink#
 1002,0,6,4,0,1,0,1,0,no,0,1,0,weapon,2	//CR_SHRINK#Shrink#

+ 0 - 1
db/skill_nocast_db.txt

@@ -56,4 +56,3 @@
 //Zone 2 - Jail
 //Zone 2 - Jail
 421,64 //TK_JUMPKICK#Flying Side Kick#
 421,64 //TK_JUMPKICK#Flying Side Kick#
 426,64 //TK_HIGHJUMP#Taekwon Jump#
 426,64 //TK_HIGHJUMP#Taekwon Jump#
-529,64 //NJ_SHADOWJUMP#NJ_SHADOWJUMP#

+ 1 - 1
db/skill_require_db.txt

@@ -431,7 +431,7 @@
 540,0,0,12:14:16:18:20:22:24:26:28:30,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//NJ_HUUJIN
 540,0,0,12:14:16:18:20:22:24:26:28:30,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//NJ_HUUJIN
 541,0,0,16:20:24:28:32,0,0,0,99,0,0,none,0,7523,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//NJ_RAIGEKISAI
 541,0,0,16:20:24:28:32,0,0,0,99,0,0,none,0,7523,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//NJ_RAIGEKISAI
 542,0,0,24:28:32:36:40,0,0,0,99,0,0,none,0,7523,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//NJ_KAMAITACHI
 542,0,0,24:28:32:36:40,0,0,0,99,0,0,none,0,7523,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//NJ_KAMAITACHI
-543,80,0,20:30:40:50:60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//NJ_NEN
+543,0,0,20:30:40:50:60,-5,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//NJ_NEN
 544,0,0,55:60:65:70:75:80:85:90:95:100,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//NJ_ISSEN
 544,0,0,55:60:65:70:75:80:85:90:95:100,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//NJ_ISSEN
 
 
 1001,0,0,40,0,0,0,99,0,0,move_enable,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//KN_CHARGEATK#ƒ`ƒƒ?[ƒWƒAƒ^ƒbƒN#
 1001,0,0,40,0,0,0,99,0,0,move_enable,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//KN_CHARGEATK#ƒ`ƒƒ?[ƒWƒAƒ^ƒbƒN#

+ 39 - 34
src/map/battle.c

@@ -322,9 +322,31 @@ int battle_calc_damage(struct block_list *src,struct block_list *bl,int damage,i
 			return 0;
 			return 0;
 		}
 		}
 
 
-		if(sc->data[SC_BUNSINJYUTSU].timer != -1 && (flag&(BF_WEAPON|BF_MISC)) )
+		if ((sc->data[SC_UTSUSEMI].timer != -1 || sc->data[SC_BUNSINJYUTSU].timer != -1)
+		&& (flag&(BF_WEAPON|BF_MISC))
+/* FIXME: This check is awful, there has to be some kind of logic behind this!
+		&& (
+		// there is no rule for that, only some exceptions.. which I listed according to many tests and says
+			skill_num != ASC_BREAKER &&
+			skill_num != NJ_KUNAI &&
+			skill_num != SN_FALCONASSAULT &&
+			skill_num != MO_BALKYOUNG &&
+			skill_num != HT_BLITZBEAT &&
+			skill_num != NJ_SYURIKEN
+			)
+*/
+		)
 		{
 		{
-			if (--sc->data[SC_BUNSINJYUTSU].val2 <= 0)
+			if (sc->data[SC_UTSUSEMI].timer != -1) {
+				clif_specialeffect(bl, 462, AREA);
+				skill_blown (src, bl, sc->data[SC_UTSUSEMI].val3);
+			};
+			//Both need to be consumed if they are active.
+			if (sc->data[SC_UTSUSEMI].timer != -1 &&
+				--sc->data[SC_UTSUSEMI].val2 <= 0)
+				status_change_end(bl, SC_UTSUSEMI, -1);
+			if (sc->data[SC_BUNSINJYUTSU].timer != -1 &&
+				--sc->data[SC_BUNSINJYUTSU].val2 <= 0)
 				status_change_end(bl, SC_BUNSINJYUTSU, -1);
 				status_change_end(bl, SC_BUNSINJYUTSU, -1);
 			return 0;
 			return 0;
 		}
 		}
@@ -497,6 +519,7 @@ int battle_calc_gvg_damage(struct block_list *src,struct block_list *bl,int dama
 	//Skills with no damage reduction.
 	//Skills with no damage reduction.
 	case PA_PRESSURE:
 	case PA_PRESSURE:
 	case HW_GRAVITATION:
 	case HW_GRAVITATION:
+	case NJ_ZENYNAGE:
 		break;
 		break;
 	default:
 	default:
 		if (md && md->guardian_data) {
 		if (md && md->guardian_data) {
@@ -877,7 +900,7 @@ static struct Damage battle_calc_weapon_attack(
 			case CR_GRANDCROSS:
 			case CR_GRANDCROSS:
 			case NPC_GRANDDARKNESS:
 			case NPC_GRANDDARKNESS:
 			case NJ_HUUMA:
 			case NJ_HUUMA:
-			case GS_FLING:
+			case NJ_ISSEN:
 			case GS_TRIPLEACTION:
 			case GS_TRIPLEACTION:
 			case GS_BULLSEYE:
 			case GS_BULLSEYE:
 			case GS_MAGICALBULLET:
 			case GS_MAGICALBULLET:
@@ -1048,7 +1071,8 @@ static struct Damage battle_calc_weapon_attack(
 				case NPC_ENERGYDRAIN:
 				case NPC_ENERGYDRAIN:
 				case NPC_MENTALBREAKER:
 				case NPC_MENTALBREAKER:
 				case GS_GROUNDDRIFT:
 				case GS_GROUNDDRIFT:
-				case NJ_TATAMIGAESHI:
+				case NJ_SYURIKEN:
+				case NJ_KUNAI:
 				case NJ_ISSEN:
 				case NJ_ISSEN:
 					flag.hit = 1;
 					flag.hit = 1;
 					break;
 					break;
@@ -1151,7 +1175,7 @@ static struct Damage battle_calc_weapon_attack(
 		switch (skill_num)
 		switch (skill_num)
 		{	//Calc base damage according to skill
 		{	//Calc base damage according to skill
 			case NJ_ISSEN:
 			case NJ_ISSEN:
-				wd.damage = 80*sstatus->str +skill_lv*sstatus->hp*8/100;
+				wd.damage = 40*sstatus->str +skill_lv*(sstatus->hp/10 + 35);
 				wd.damage2 = 0;
 				wd.damage2 = 0;
 				status_set_hp(src, 1, 0);
 				status_set_hp(src, 1, 0);
 				break;
 				break;
@@ -1781,11 +1805,10 @@ static struct Damage battle_calc_weapon_attack(
 					skillratio /= 12-3*skill;
 					skillratio /= 12-3*skill;
 				ATK_ADDRATE(skillratio);
 				ATK_ADDRATE(skillratio);
 			}
 			}
-			// Added Tobidougu bonus on throwing weapon ninja skills if not wearing a Fuuma shuriken (bonus already added in battle_addmastery)
-			if ((skill_num == NJ_SYURIKEN || skill_num == NJ_KUNAI) &&
-				sd->status.weapon != W_HUUMA &&
-			  	(skill = pc_checkskill(sd,NJ_TOBIDOUGU)) > 0)
+			if (skill_num == NJ_SYURIKEN && (skill = pc_checkskill(sd,NJ_TOBIDOUGU)) > 0)
 				ATK_ADD(3*skill);
 				ATK_ADD(3*skill);
+			if (skill_num == NJ_KUNAI)
+				ATK_ADD(60);
 		}
 		}
 	} //Here ends flag.hit section, the rest of the function applies to both hitting and missing attacks
 	} //Here ends flag.hit section, the rest of the function applies to both hitting and missing attacks
   	else if(wd.div_ < 0) //Since the attack missed...
   	else if(wd.div_ < 0) //Since the attack missed...
@@ -2098,7 +2121,6 @@ struct Damage battle_calc_magic_attack(
 
 
 	struct map_session_data *sd, *tsd;
 	struct map_session_data *sd, *tsd;
 	struct Damage ad;
 	struct Damage ad;
-	struct status_change *tsc;
 	struct status_data *sstatus = status_get_status_data(src);
 	struct status_data *sstatus = status_get_status_data(src);
 	struct status_data *tstatus = status_get_status_data(target);
 	struct status_data *tstatus = status_get_status_data(target);
 	struct {
 	struct {
@@ -2212,8 +2234,6 @@ struct Damage battle_calc_magic_attack(
 //Adds an absolute value to damage. 100 = +100 damage
 //Adds an absolute value to damage. 100 = +100 damage
 #define MATK_ADD( a ) { ad.damage+= a; }
 #define MATK_ADD( a ) { ad.damage+= a; }
 
 
-		tsc= status_get_sc(target); // used for NJ_SUITON increasing NJ_HYOUSENSOU damages
-
 		switch (skill_num)
 		switch (skill_num)
 		{	//Calc base damage according to skill
 		{	//Calc base damage according to skill
 			case AL_HEAL:
 			case AL_HEAL:
@@ -2321,27 +2341,19 @@ struct Damage battle_calc_magic_attack(
 						skillratio -= 10;
 						skillratio -= 10;
 						break;
 						break;
 					case NJ_KAENSIN:
 					case NJ_KAENSIN:
-						skillratio -= 40; // extrapolation from a vid (seems correct +/- 10%)
+						skillratio -= 50;
 						break;
 						break;
 					case NJ_BAKUENRYU:
 					case NJ_BAKUENRYU:
-						skillratio += 50*(skill_lv-1); // recorrected after calculation from vids
-						break;
-					case NJ_HYOUSENSOU:
-						skillratio -= 30;
-						if (tsc && tsc->data[SC_SUITON].timer != -1)
-						  	skillratio += tsc->data[SC_SUITON].val4;
+						skillratio += 50*(skill_lv-1);
 						break;
 						break;
 					case NJ_HYOUSYOURAKU:
 					case NJ_HYOUSYOURAKU:
-						skillratio += 50*skill_lv; // recorrected after calculation from vids
-						break;
-					case NJ_HUUJIN:
-						skillratio += 50 + 50*skill_lv; // extrapolation from a vid (unsure)
+						skillratio += 50*skill_lv;
 						break;
 						break;
 					case NJ_RAIGEKISAI:
 					case NJ_RAIGEKISAI:
-						skillratio += 60 + 40*skill_lv; // idem
+						skillratio += 60 + 40*skill_lv;
 						break;
 						break;
 					case NJ_KAMAITACHI:
 					case NJ_KAMAITACHI:
-						skillratio += 100*skill_lv; // idem
+						skillratio += 100*skill_lv;
 						break;
 						break;
 				}
 				}
 
 
@@ -2621,8 +2633,8 @@ struct Damage  battle_calc_misc_attack(
 			pc_payzeny(sd, md.damage);
 			pc_payzeny(sd, md.damage);
 		}
 		}
 
 
-		if(is_boss(target) || tsd)
-			md.damage=md.damage*60/100;
+		if(is_boss(target) || tsd || map_flag_gvg2(target->m))
+			md.damage=md.damage/3;
 		break;
 		break;
 	case GS_FLING:
 	case GS_FLING:
 		md.damage = sd?sd->status.job_level:status_get_lv(src);
 		md.damage = sd?sd->status.job_level:status_get_lv(src);
@@ -2947,13 +2959,6 @@ int battle_weapon_attack( struct block_list *src,struct block_list *target,
 				return 0;
 				return 0;
 			}
 			}
 		}
 		}
-		if (tsc->data[SC_UTSUSEMI].timer != -1) {
-			clif_specialeffect(target, 462, AREA);
-			skill_blown (src, target, tsc->data[SC_UTSUSEMI].val3);
-			if (--tsc->data[SC_UTSUSEMI].val2 <= 0)
-				status_change_end(target, SC_UTSUSEMI, -1);
-			return 0;
-		}
 	}
 	}
 	//Recycled the damage variable rather than use a new one... [Skotlex]
 	//Recycled the damage variable rather than use a new one... [Skotlex]
 	if(sd && (damage = pc_checkskill(sd,MO_TRIPLEATTACK)) > 0)
 	if(sd && (damage = pc_checkskill(sd,MO_TRIPLEATTACK)) > 0)

+ 28 - 21
src/map/skill.c

@@ -2834,8 +2834,15 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, int
 			status_change_end(src,SC_BLADESTOP,-1);
 			status_change_end(src,SC_BLADESTOP,-1);
 		break;
 		break;
 	
 	
+	case NJ_ISSEN:
+		if (sc) {
+		  	if (sc->data[SC_NEN].timer != -1)
+				status_change_end(src,SC_NEN,-1);
+			if (sc->data[SC_HIDING].timer != -1)
+				status_change_end(src,SC_HIDING,-1);
+		}
 	case MO_EXTREMITYFIST:
 	case MO_EXTREMITYFIST:
-		if (sc)
+		if (sc && skillid == MO_EXTREMITYFIST)
 		{
 		{
 			if (sc->data[SC_EXPLOSIONSPIRITS].timer != -1)
 			if (sc->data[SC_EXPLOSIONSPIRITS].timer != -1)
 				status_change_end(src, SC_EXPLOSIONSPIRITS, -1);
 				status_change_end(src, SC_EXPLOSIONSPIRITS, -1);
@@ -2847,13 +2854,13 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, int
 			struct unit_data *ud = unit_bl2ud(src);
 			struct unit_data *ud = unit_bl2ud(src);
 			short dx,dy;
 			short dx,dy;
 			int i,speed;
 			int i,speed;
-
+			i = skillid == MO_EXTREMITYFIST?1:2; //Move 2 cells for Issen, 1 for Asura
 			dx = bl->x - src->x;
 			dx = bl->x - src->x;
 			dy = bl->y - src->y;
 			dy = bl->y - src->y;
-			if (dx < 0) dx--;
-			else if (dx > 0) dx++;
-			if (dy < 0) dy--;
-			else if (dy > 0) dy++;
+			if (dx < 0) dx-=i;
+			else if (dx > 0) dx+=i;
+			if (dy < 0) dy-=i;
+			else if (dy > 0) dy+=i;
 			if (!dx && !dy) dy++;
 			if (!dx && !dy) dy++;
 			if (map_getcell(src->m, src->x+dx, src->y+dy, CELL_CHKNOPASS))
 			if (map_getcell(src->m, src->x+dx, src->y+dy, CELL_CHKNOPASS))
 			{
 			{
@@ -3151,23 +3158,19 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, int
 		break;
 		break;
 
 
 	case NJ_KASUMIKIRI:
 	case NJ_KASUMIKIRI:
-		skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
-		sc_start(src,SC_HIDING,100,skilllv,skill_get_time(skillid,skilllv));
+		if (skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag) > 0)
+			sc_start(src,SC_HIDING,100,skilllv,skill_get_time(skillid,skilllv));
 		break;
 		break;
 	case NJ_KIRIKAGE:
 	case NJ_KIRIKAGE:
 		{
 		{
-			int dir = map_calc_dir(src,bl->x,bl->y);
+			short x, y;
+			map_search_freecell(bl, 0, &x, &y, 1, 1, 0);
 			status_change_end(src, SC_HIDING, -1);
 			status_change_end(src, SC_HIDING, -1);
-			skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
-			if (unit_movepos(src, bl->x - dirx[dir], bl->y - diry[dir], 0, 0))
+			if (unit_movepos(src, x, y, 0, 0))
 				clif_slide(src,src->x,src->y);
 				clif_slide(src,src->x,src->y);
+			skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
 		}
 		}
 		break;
 		break;
-	case NJ_ISSEN:
-		skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
-		if (sc && sc->data[SC_NEN].timer != -1)
-			status_change_end(src,SC_NEN,-1);
-		break;
 	case 0:
 	case 0:
 		if(sd) {
 		if(sd) {
 			if (flag & 3){
 			if (flag & 3){
@@ -6089,7 +6092,6 @@ int skill_castend_pos2 (struct block_list *src, int x, int y, int skillid, int s
 	case NJ_SHADOWJUMP:
 	case NJ_SHADOWJUMP:
 	{
 	{
 		unit_movepos(src, x, y, 1, 0);
 		unit_movepos(src, x, y, 1, 0);
-		unit_setdir(src, (unit_getdir(src) + 4)%8);
 		clif_slide(src,x,y);
 		clif_slide(src,x,y);
 
 
 		if (sc && sc->data[SC_HIDING].timer != -1)
 		if (sc && sc->data[SC_HIDING].timer != -1)
@@ -8304,6 +8306,10 @@ int skill_check_condition (struct map_session_data *sd, int skill, int lv, int t
 		break;
 		break;
 	
 	
 	case NJ_ISSEN:
 	case NJ_ISSEN:
+		if (status->hp < 2) {
+			clif_skill_fail(sd,skill,0,0);
+			return 0;
+		}
 	case NJ_BUNSINJYUTSU:
 	case NJ_BUNSINJYUTSU:
 		if (!sc || sc->data[SC_NEN].timer==-1) {
 		if (!sc || sc->data[SC_NEN].timer==-1) {
 			clif_skill_fail(sd,skill,0,0);
 			clif_skill_fail(sd,skill,0,0);
@@ -9307,15 +9313,16 @@ int skill_landprotector (struct block_list *bl, va_list ap)
 		case SA_VOLCANO:
 		case SA_VOLCANO:
 		case SA_DELUGE:
 		case SA_DELUGE:
 		case SA_VIOLENTGALE:
 		case SA_VIOLENTGALE:
-		case NJ_SUITON:
-		case NJ_KAENSIN:
+// Suiton/Kaensin CAN super-impose on each another.
+//		case NJ_SUITON:
+//		case NJ_KAENSIN:
 			switch (unit->group->skill_id)
 			switch (unit->group->skill_id)
 			{	//These cannot override each other.
 			{	//These cannot override each other.
 				case SA_VOLCANO:
 				case SA_VOLCANO:
 				case SA_DELUGE:
 				case SA_DELUGE:
 				case SA_VIOLENTGALE:
 				case SA_VIOLENTGALE:
-				case NJ_SUITON:
-				case NJ_KAENSIN:
+//				case NJ_SUITON:
+//				case NJ_KAENSIN:
 					(*alive) = 0;
 					(*alive) = 0;
 					return 1;
 					return 1;
 			}
 			}

+ 9 - 27
src/map/status.c

@@ -1060,7 +1060,8 @@ int status_check_skilluse(struct block_list *src, struct block_list *target, int
 	{	
 	{	
 		if(!skill_num && !(status->mode&MD_BOSS) && tsc->data[SC_TRICKDEAD].timer != -1)
 		if(!skill_num && !(status->mode&MD_BOSS) && tsc->data[SC_TRICKDEAD].timer != -1)
 			return 0;
 			return 0;
-		if(skill_num == WZ_STORMGUST && tsc->data[SC_FREEZE].timer != -1)
+		if((skill_num == WZ_STORMGUST || skill_num == NJ_HYOUSYOURAKU)
+			&& tsc->data[SC_FREEZE].timer != -1)
 			return 0;
 			return 0;
 		if(skill_num == PR_LEXAETERNA && (tsc->data[SC_FREEZE].timer != -1 || (tsc->data[SC_STONE].timer != -1 && tsc->opt1 == OPT1_STONE)))
 		if(skill_num == PR_LEXAETERNA && (tsc->data[SC_FREEZE].timer != -1 || (tsc->data[SC_STONE].timer != -1 && tsc->opt1 == OPT1_STONE)))
 			return 0;
 			return 0;
@@ -4923,33 +4924,14 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val
 				val2 = 0;
 				val2 = 0;
 			break;
 			break;
 		case SC_SUITON:
 		case SC_SUITON:
-			val2 = 0;	//Agi penalty
+			val2 = 0; //Agi penalty
 			val3 = 0; //Walk speed penalty
 			val3 = 0; //Walk speed penalty
-			val4 = 2*val1; //NJ_HYOUSENSOU damage bonus.
-
-			if (status_get_class(bl) == JOB_NINJA || ( bl->type == BL_PC && !map_flag_vs(bl->m)) )
-				break;
-			else {
-				val3 = 50;
-
-				switch ((val1+1)/3) {
-				case 3:
-					val2 = 8;
-				break;
-				case 2:
-					val2 = 5;
-				break;
-				case 1:
-					val2 = 3;
+			if (status_get_class(bl) == JOB_NINJA ||
+				(sd && !map_flag_vs(bl->m)))
 				break;
 				break;
-				case 0: 
-					val2 = 0;
-				break;
-				default:
-					val2 = 3*((val1+1)/3);
-				break;
-				}
-			}
+			val3 = 50;
+			val2 = 3*((val1+1)/3);
+			if (val1 > 4) val2--;
 			break;
 			break;
 		case SC_ONEHAND:
 		case SC_ONEHAND:
 		case SC_TWOHANDQUICKEN:
 		case SC_TWOHANDQUICKEN:
@@ -6788,7 +6770,7 @@ int status_change_timer_sub(struct block_list *bl, va_list ap )
 	case SC_SIGHTBLASTER:
 	case SC_SIGHTBLASTER:
 		if (battle_check_target( src, bl, BCT_ENEMY ) > 0 &&
 		if (battle_check_target( src, bl, BCT_ENEMY ) > 0 &&
 			status_check_skilluse(src, bl, WZ_SIGHTBLASTER, 2))
 			status_check_skilluse(src, bl, WZ_SIGHTBLASTER, 2))
-	  	{
+		{
 			skill_attack(BF_MAGIC,src,src,bl,WZ_SIGHTBLASTER,1,tick,0);
 			skill_attack(BF_MAGIC,src,src,bl,WZ_SIGHTBLASTER,1,tick,0);
 			if (sc) sc->data[type].val2 = 0; //This signals it to end.
 			if (sc) sc->data[type].val2 = 0; //This signals it to end.
 		}
 		}