Browse Source

mpeg's ninja work
http://gpegon.free.fr/ea/ninja_08-07-06_mpeg.txt

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

Vicious 19 years ago
parent
commit
6cb68e6f4a
13 changed files with 114 additions and 166 deletions
  1. 1 0
      Changelog-Trunk.txt
  2. 3 3
      db/job_db1.txt
  3. 1 1
      db/job_db2.txt
  4. 11 11
      db/skill_cast_db.txt
  5. 8 8
      db/skill_db.txt
  6. 1 1
      db/skill_nocast_db.txt
  7. 5 5
      db/skill_tree.txt
  8. 4 6
      db/skill_unit_db.txt
  9. 7 5
      src/map/battle.c
  10. 67 121
      src/map/skill.c
  11. 4 3
      src/map/skill.h
  12. 1 1
      src/map/status.c
  13. 1 1
      src/map/status.h

+ 1 - 0
Changelog-Trunk.txt

@@ -4,6 +4,7 @@ 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/08/07
 2006/08/07
+	* mpeg's Ninja work [Vicious]
 	* Adjusted Battle_check_target so that alchemist summoned mobs are
 	* Adjusted Battle_check_target so that alchemist summoned mobs are
 	  targetted by everyone as long as 1. The top-level master is a player and 2.
 	  targetted by everyone as long as 1. The top-level master is a player and 2.
 	  the actual attacker is not a mob-type. [Skotlex]
 	  the actual attacker is not a mob-type. [Skotlex]

+ 3 - 3
db/job_db1.txt

@@ -1,7 +1,7 @@
 // Job-specific Values Database
 // Job-specific Values Database
 //
 //
 // Structure of Database:
 // Structure of Database:
-// JobID,Weight,HPFactor,HPMultiplicator,SPFactor,BareFist,Dagger,1HSword,2HSword,1HSpear,2HSpear,1HAxe,2HAxe,1HMace,2HMace(unused),Rod,Bow,Knuckle,Instrument,Whip,Book,Katar,Revolver,Rifle,Shotgun,Gatling Gun,Grenade Launcher
+// JobID,Weight,HPFactor,HPMultiplicator,SPFactor,BareFist,Dagger,1HSword,2HSword,1HSpear,2HSpear,1HAxe,2HAxe,1HMace,2HMace(unused),Rod,Bow,Knuckle,Instrument,Whip,Book,Katar,Revolver,Rifle,Shotgun,Gatling Gun,Grenade Launcher,Fuuma Shuriken
 //
 //
 // Novice
 // Novice
 0,	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
 0,	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
@@ -53,8 +53,8 @@
 23,	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
 23,	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
 // Gunslinger
 // Gunslinger
 24,	27000,75   ,300  ,600,  400  ,2000, 2000, 2000, 2000, 2000, 2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 700 , 800 ,1200 ,200  ,1400 ,2000
 24,	27000,75   ,300  ,600,  400  ,2000, 2000, 2000, 2000, 2000, 2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 700 , 800 ,1200 ,200  ,1400 ,2000
-// Ninja
-25,	24000,110  ,500  ,400  ,400  ,500  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000, 500
+// Ninja // Dagger is a bit faster than Fuuma Shuriken > temp value
+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, 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

+ 1 - 1
db/job_db2.txt

@@ -62,7 +62,7 @@
 // Gunslinger
 // Gunslinger
 24,5,6,0,6,0,5,0,0,0,5,5,6,2,0,0,0,5,0,0,0,6,0,0,0,5,0,0,0,0,0,6,1,0,0,5,0,0,0,0,0,1,0,0,0,5,0,0,0,0,1,6,4,0,0,5,0,0,0,2,3,0,5,6,1,0,0,0,0,0,0
 24,5,6,0,6,0,5,0,0,0,5,5,6,2,0,0,0,5,0,0,0,6,0,0,0,5,0,0,0,0,0,6,1,0,0,5,0,0,0,0,0,1,0,0,0,5,0,0,0,0,1,6,4,0,0,5,0,0,0,2,3,0,5,6,1,0,0,0,0,0,0
 // Ninja
 // Ninja
-25,2,2,0,0,0,0,0,0,0,5,0,0,2,0,0,0,0,0,0,2,4,5,0,0,0,0,0,0,4,6,2,5,0,0,0,0,0,0,0,6,2,4,5,0,0,0,0,0,0,4,2,6,5,0,0,0,0,0,1,3,2,0,5,6,0,0,0,0,0,0
+25,2,2,0,0,0,0,0,0,0,5,2,0,0,0,0,0,0,0,0,4,2,5,0,0,0,0,0,0,4,6,2,5,0,0,0,0,0,0,0,6,2,4,5,0,0,0,0,0,0,4,2,6,5,0,0,0,0,0,1,3,2,4,5,6,0,0,0,0,0,0
 // Novice High
 // Novice High
 4001,0,0,0,0,0,0,0,0,0,0
 4001,0,0,0,0,0,0,0,0,0,0
 // Swordman High
 // Swordman High

+ 11 - 11
db/skill_cast_db.txt

@@ -885,20 +885,20 @@
 525,1000,1000,0,0,0
 525,1000,1000,0,0,0
 //-- NJ_ZENYNAGE
 //-- NJ_ZENYNAGE
 526,0,5000,0,0,0
 526,0,5000,0,0,0
-//-- NJ_TATAMIGAESHI
-527,0,0,0,3000,3000
+//-- NJ_TATAMIGAESHI // Duration1 used for SC_TATAMIGAESHI and ground visual effect and Duration2 for "damage-can-be-done" duration
+527,0,3000,0,3000,200 // ex> Skill will only hit during 200 first ticks (concretely do only 1 hit just after being casted)
 //-- NJ_KASUMIKIRI // Delay unknown (if there is one)
 //-- NJ_KASUMIKIRI // Delay unknown (if there is one)
 528,0,0,0,30000:60000:90000:120000:150000:180000:210000:240000:270000:300000,0
 528,0,0,0,30000:60000:90000:120000:150000:180000:210000:240000:270000:300000,0
 //-- NJ_SHADOWJUMP // Delay unknown (if there is one)
 //-- NJ_SHADOWJUMP // Delay unknown (if there is one)
 529,0,0,0,0,0
 529,0,0,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 // Cast and Delay unknown (temp : NJ_NEN cast time)
-531,5000:4000:3000:2000:1000,0,0,20000:30000:40000:50000:60000,0
-//-- NJ_BUNSINJYUTSU // Cast and Delay unknown (temp : random cast :p)
+//-- 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
 532,4000:3500:3000:2500:2000:3000:2500:2000:1500:1000,0,0,60000:80000:100000:120000:140000:160000:180000:200000:220000:240000,0
 
 
-//-- NJ_KOUENKA
+//-- NJ_KOUENKA // Should there really be a delay ?
 534,700:1400:2100:2800:3500:4200:4900:5600:6300:7000,1000:1200:1400:1600:1800:2000:2200:2400:2600:2800,0,0,0
 534,700:1400:2100:2800:3500:4200:4900:5600:6300:7000,1000:1200:1400:1600:1800:2000:2200:2400:2600:2800,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,
@@ -908,17 +908,17 @@
 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
 //-- NJ_SUITON
 538,3300:3200:3100:3000:2900:2800:2700:2600:2500:2400,0,0,15000:20000:25000:30000:35000:40000:45000:50000:55000:60000,15000:20000:25000:30000:35000:40000:45000:50000:55000:60000
 538,3300:3200:3100:3000:2900:2800:2700:2600:2500:2400,0,0,15000:20000:25000:30000:35000:40000:45000:50000:55000:60000,15000:20000:25000:30000:35000:40000:45000:50000:55000:60000
-//-- NJ_HYOUSYOURAKU
-539,3000,1000:1200:1400:1600:1800:2000:2200:2400:2600:2800,0,0,10000:11000:12000:13000:14000:15000:16000:17000:18000:19000 // converted from jAthena
+//-- NJ_HYOUSYOURAKU // Cast time 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_HUUJIN
 //-- NJ_HUUJIN
 540,700:1400:2100:2800:3500:4200:4900:5600:6300:7000,0,0,0,0
 540,700:1400:2100:2800:3500:4200:4900:5600:6300:7000,0,0,0,0
 //-- NJ_RAIGEKISAI
 //-- NJ_RAIGEKISAI
-541,3700:3400:3100:2800:2500,0,0,0,0 // not sure of cast but very litely to be correct (English Translation Project)
+541,3700:3400:3100:2800:2500,0,0,0,0 // Not sure of cast but very litely to be correct (English Translation Project)
 //-- NJ_KAMAITACHI
 //-- NJ_KAMAITACHI
-542,3000,2000,0,0,0 // cast and delay unknown. temp values (I put the same as bakuenryu)
+542,3000,2000,0,0,0 // Cast and delay unknown > temp values taken from NJ_BAKUENRYU
 //-- 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 (same as MO_EXTREMITYFIST)
+//-- 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
 544,4000:3500:3000:2500:2000:3000:2500:2000:1500:1000,0,0,0,0
 //==========================================
 //==========================================
 
 

+ 8 - 8
db/skill_db.txt

@@ -4,7 +4,7 @@
 // 03 hit (8- repeated hitting, 6- single-hit)
 // 03 hit (8- repeated hitting, 6- single-hit)
 // 04 inf (0- passive, 1- enemy, 2- place, 4- self, 16- friend, 32- trap)
 // 04 inf (0- passive, 1- enemy, 2- place, 4- self, 16- friend, 32- trap)
 // 05 pl attributes (0- nothing, 1- water, 2- earth, 3- fire, 4- wind, 5- poison, 6- saint, 7- darkness, 8- sense, 9- immortality)
 // 05 pl attributes (0- nothing, 1- water, 2- earth, 3- fire, 4- wind, 5- poison, 6- saint, 7- darkness, 8- sense, 9- immortality)
-// 06 nk (0- normal skill, 1-no damage skill, 2-splash damage skill, 3-no damage area skill)
+// 06 nk (0- normal skill, 1-no damage skill, 2-splash damage skill, 3-no damage area skill, 4-splash and split damage skill)
 // 07 splash/effect range (-1 for screen-wide)
 // 07 splash/effect range (-1 for screen-wide)
 // 08 MaxLv
 // 08 MaxLv
 // 09 Number of hits (when positive, damage is increased by hits, 
 // 09 Number of hits (when positive, damage is increased by hits, 
@@ -31,7 +31,7 @@
 8,0,6,4,0,1,0,10,1,no,0,0,0,weapon,0	//SM_ENDURE#Endure#
 8,0,6,4,0,1,0,10,1,no,0,0,0,weapon,0	//SM_ENDURE#Endure#
 9,0,0,0,0,0,0,10,0,no,0,0,0,none,0	//MG_SRECOVERY#Increase SP Recovery#
 9,0,0,0,0,0,0,10,0,no,0,0,0,none,0	//MG_SRECOVERY#Increase SP Recovery#
 10,0,6,4,3,3,3,1,1,yes,0,0,0,magic,0	//MG_SIGHT#Sight#
 10,0,6,4,3,3,3,1,1,yes,0,0,0,magic,0	//MG_SIGHT#Sight#
-11,9,6,1,8,0,1,10,1,yes,0,0,0,magic,0	//MG_NAPALMBEAT#Napalm Beat#
+11,9,6,1,8,4,1,10,1,yes,0,0,0,magic,0	//MG_NAPALMBEAT#Napalm Beat#
 12,9,8,2,8,1,0,10,1,yes,0,0,0,magic,0	//MG_SAFETYWALL#Safety Wall#
 12,9,8,2,8,1,0,10,1,yes,0,0,0,magic,0	//MG_SAFETYWALL#Safety Wall#
 13,9,8,1,8,0,0,10,1:1:2:2:3:3:4:4:5:5,yes,0,0,0,magic,0	//MG_SOULSTRIKE#Soul Strike#
 13,9,8,1,8,0,0,10,1:1:2:2:3:3:4:4:5:5,yes,0,0,0,magic,0	//MG_SOULSTRIKE#Soul Strike#
 14,9,8,1,1,0,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0,0,magic,0	//MG_COLDBOLT#Cold Bolt#
 14,9,8,1,1,0,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0,0,magic,0	//MG_COLDBOLT#Cold Bolt#
@@ -420,7 +420,7 @@
 397,5,8,1,-1,0,0,5,5,no,0,0,0,weapon,0	//LK_SPIRALPIERCE#Spiral Pierce#
 397,5,8,1,-1,0,0,5,5,no,0,0,0,weapon,0	//LK_SPIRALPIERCE#Spiral Pierce#
 398,4,6,1,-1,0,0,5,1,no,0,0,0,weapon,0	//LK_HEADCRUSH#Traumatic Blow#
 398,4,6,1,-1,0,0,5,1,no,0,0,0,weapon,0	//LK_HEADCRUSH#Traumatic Blow#
 399,4,6,1,-1,0,0,10,1,no,0,0,0,weapon,0	//LK_JOINTBEAT#Vital Strike#
 399,4,6,1,-1,0,0,10,1,no,0,0,0,weapon,0	//LK_JOINTBEAT#Vital Strike#
-400,9,8,1,8,0,1,5,1:2:3:4:5,yes,0,0,0,magic,0	//HW_NAPALMVULCAN#Napalm Vulcan#
+400,9,8,1,8,4,1,5,1:2:3:4:5,yes,0,0,0,magic,0	//HW_NAPALMVULCAN#Napalm Vulcan#
 401,0,6,4,0,1,0,1,1,yes,0,0,0,none,0	//CH_SOULCOLLECT#Zen#
 401,0,6,4,0,1,0,1,1,yes,0,0,0,none,0	//CH_SOULCOLLECT#Zen#
 402,9,6,1,0,1,0,5,1,no,0,0,0,none,0	//PF_MINDBREAKER#Mind Breaker#
 402,9,6,1,0,1,0,5,1,no,0,0,0,none,0	//PF_MINDBREAKER#Mind Breaker#
 403,0,0,4,0,1,0,1,1,yes,0,0,0,magic,0	//PF_MEMORIZE#Foresight#
 403,0,0,4,0,1,0,1,1,yes,0,0,0,magic,0	//PF_MEMORIZE#Foresight#
@@ -546,9 +546,9 @@
 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,0,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,-1:-2:-3:-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,3,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#
@@ -557,12 +557,12 @@
 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#
-536,9,8,1,3,2,1,5,3,yes,0,0,0,magic,0	//NJ_BAKUENRYU#NJ_BAKUENRYU#
+536,9,8,1,3,2,2,5,3,yes,0,0,0,magic,0	//NJ_BAKUENRYU#NJ_BAKUENRYU#
 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,1,0,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,1,0,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#
 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#
 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#
 544,-2,6,1,0,0,0,10,1,yes,0,0,0,weapon,0	//NJ_ISSEN#NJ_ISSEN#

+ 1 - 1
db/skill_nocast_db.txt

@@ -55,4 +55,4 @@
 //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#

+ 5 - 5
db/skill_tree.txt

@@ -678,10 +678,10 @@
 25,525,5,522,5,524,5,0,0,0,0,0,0 //NJ_HUUMA#NJ_HUUMA#
 25,525,5,522,5,524,5,0,0,0,0,0,0 //NJ_HUUMA#NJ_HUUMA#
 25,526,10,522,10,525,5,0,0,0,0,0,0 //NJ_ZENYNAGE#NJ_ZENYNAGE#
 25,526,10,522,10,525,5,0,0,0,0,0,0 //NJ_ZENYNAGE#NJ_ZENYNAGE#
 25,527,5,0,0,0,0,0,0,0,0,0,0 //NJ_TATAMIGAESHI#NJ_TATAMIGAESHI#
 25,527,5,0,0,0,0,0,0,0,0,0,0 //NJ_TATAMIGAESHI#NJ_TATAMIGAESHI#
-25,528,10,0,0,0,0,0,0,0,0,0,0 //NJ_KASUMIKIRI#NJ_KASUMIKIRI#
-25,529,10,0,0,0,0,0,0,0,0,0,0 //NJ_SHADOWJUMP#NJ_SHADOWJUMP#
-25,530,5,0,0,0,0,0,0,0,0,0,0 //NJ_KIRIKAGE#NJ_KIRIKAGE#
-25,531,5,0,0,0,0,0,0,0,0,0,0 //NJ_UTSUSEMI#NJ_UTSUSEMI#
+25,528,10,529,1,0,0,0,0,0,0,0,0 //NJ_KASUMIKIRI#NJ_KASUMIKIRI#
+25,529,10,527,1,0,0,0,0,0,0,0,0 //NJ_SHADOWJUMP#NJ_SHADOWJUMP#
+25,530,5,528,5,0,0,0,0,0,0,0,0 //NJ_KIRIKAGE#NJ_KIRIKAGE#
+25,531,5,529,5,0,0,0,0,0,0,0,0 //NJ_UTSUSEMI#NJ_UTSUSEMI#
 25,532,10,531,4,530,3,543,1,0,0,0,0 //NJ_BUNSINJYUTSU#NJ_BUNSINJYUTSU#
 25,532,10,531,4,530,3,543,1,0,0,0,0 //NJ_BUNSINJYUTSU#NJ_BUNSINJYUTSU#
 25,533,10,0,0,0,0,0,0,0,0,0,0 //NJ_NINPOU#NJ_NINPOU#
 25,533,10,0,0,0,0,0,0,0,0,0,0 //NJ_NINPOU#NJ_NINPOU#
 25,534,10,533,1,0,0,0,0,0,0,0,0 //NJ_KOUENKA#NJ_KOUENKA#
 25,534,10,533,1,0,0,0,0,0,0,0,0 //NJ_KOUENKA#NJ_KOUENKA#
@@ -2174,4 +2174,4 @@
 4049,471,3,452,1,0,0,0,0,0,0,0,0	//SL_SKE#Esk#
 4049,471,3,452,1,0,0,0,0,0,0,0,0	//SL_SKE#Esk#
 4049,472,3,447,1,0,0,0,0,0,0,0,0	//SL_SKA#Eska#
 4049,472,3,447,1,0,0,0,0,0,0,0,0	//SL_SKA#Eska#
 4049,494,5,451,1,0,0,0,0,0,0,0,0	//SL_HIGH#Spirit of Rebirth#
 4049,494,5,451,1,0,0,0,0,0,0,0,0	//SL_HIGH#Spirit of Rebirth#
-4049,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
+4049,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#

+ 4 - 6
db/skill_unit_db.txt

@@ -87,10 +87,8 @@
 430,0x86,    ,  0, 1, 500,enemy, 0x000	//SG_STAR_WARM
 430,0x86,    ,  0, 1, 500,enemy, 0x000	//SG_STAR_WARM
 484,0xb8,    ,  2, 0,1000,enemy, 0x808	//HW_GRAVITATION
 484,0xb8,    ,  2, 0,1000,enemy, 0x808	//HW_GRAVITATION
 488,0xb9,    ,  3, 0,  -1,all,   0x200	//CG_HERMODE
 488,0xb9,    ,  3, 0,  -1,all,   0x200	//CG_HERMODE
-527,0xba,    , -1, 0,2500,enemy, 0x000	//NJ_TATAMIGAESHI
-535,0xbd,    ,  2, 0, 100,enemy, 0x008	//NJ_KAENSIN
-541,0x86,,0,2:2:3:3:4,1000,enemy,0x000 //NJ_RAIGEKISAI
-538,0xbb,,1:1:1:2:2:2:3:3:3:4,0,-1,all,0x002	//NJ_SUITON
-516,0xbc,    ,  0, 3, 100,enemy, 0x000	//GS_DESPERADO
+516,0xba,    ,  0, 3, 100,enemy, 0x000	//GS_DESPERADO
 521,0xc2,    ,  0, 1,1000,enemy, 0x006	//GS_GROUNDDRIFT
 521,0xc2,    ,  0, 1,1000,enemy, 0x006	//GS_GROUNDDRIFT
-539,0x86,    ,  0, 3,1000,enemy, 0x000	//NJ_HYOUSYOURAKU
+527,0xbc,    , -1, 0,2500,enemy, 0x000	//NJ_TATAMIGAESHI
+535,0xbd,    , -1, 0, 200,enemy, 0x008	//NJ_KAENSIN
+538,0xbb,,1:1:1:2:2:2:3:3:3:4,0,-1,all,0x000	//NJ_SUITON

+ 7 - 5
src/map/battle.c

@@ -314,7 +314,7 @@ int battle_calc_damage(struct block_list *src,struct block_list *bl,int damage,i
 			rand()%100 < sc->data[SC_KAUPE].val2 &&
 			rand()%100 < sc->data[SC_KAUPE].val2 &&
 			(src->type == BL_PC || !skill_num))
 			(src->type == BL_PC || !skill_num))
 		{	//Kaupe only blocks all skills of players.
 		{	//Kaupe only blocks all skills of players.
-			clif_skill_nodamage(bl,bl,SL_KAUPE,1,1);
+			clif_specialeffect(bl, 462, AREA);
 			if (--sc->data[SC_KAUPE].val3 <= 0) //We make it work like Safety Wall, even though it only blocks 1 time.
 			if (--sc->data[SC_KAUPE].val3 <= 0) //We make it work like Safety Wall, even though it only blocks 1 time.
 				status_change_end(bl, SC_KAUPE, -1);
 				status_change_end(bl, SC_KAUPE, -1);
 			return 0;
 			return 0;
@@ -322,7 +322,7 @@ int battle_calc_damage(struct block_list *src,struct block_list *bl,int damage,i
 
 
 		if(sc->data[SC_UTSUSEMI].timer != -1 && !skill_num)
 		if(sc->data[SC_UTSUSEMI].timer != -1 && !skill_num)
 		{
 		{
-			clif_skill_nodamage(bl,bl,NJ_UTSUSEMI,1,1);
+			clif_specialeffect(bl, 462, AREA);
 			skill_blown (src, bl, sc->data[SC_UTSUSEMI].val3);
 			skill_blown (src, bl, sc->data[SC_UTSUSEMI].val3);
 			if (--sc->data[SC_UTSUSEMI].val2 <= 0)
 			if (--sc->data[SC_UTSUSEMI].val2 <= 0)
 				status_change_end(bl, SC_UTSUSEMI, -1);
 				status_change_end(bl, SC_UTSUSEMI, -1);
@@ -331,7 +331,6 @@ int battle_calc_damage(struct block_list *src,struct block_list *bl,int damage,i
 
 
 		if(sc->data[SC_BUNSINJYUTSU].timer != -1 && (flag&(BF_WEAPON|BF_MISC)) )
 		if(sc->data[SC_BUNSINJYUTSU].timer != -1 && (flag&(BF_WEAPON|BF_MISC)) )
 		{
 		{
-			clif_skill_nodamage(bl,bl,NJ_BUNSINJYUTSU,1,1);
 			if (--sc->data[SC_BUNSINJYUTSU].val2 <= 0)
 			if (--sc->data[SC_BUNSINJYUTSU].val2 <= 0)
 				status_change_end(bl, SC_BUNSINJYUTSU, -1);
 				status_change_end(bl, SC_BUNSINJYUTSU, -1);
 			return 0;
 			return 0;
@@ -2347,8 +2346,8 @@ struct Damage battle_calc_magic_attack(
 					case NJ_KOUENKA:
 					case NJ_KOUENKA:
 						skillratio -= 10;
 						skillratio -= 10;
 						break;
 						break;
-					case NJ_HUUJIN:
-						skillratio += 50 + 50*skill_lv; // extrapolation from a vid (unsure)
+					case NJ_KAENSIN:
+						skillratio -= 40; // extrapolation from a vid (seems correct +/- 10%)
 						break;
 						break;
 					case NJ_BAKUENRYU:
 					case NJ_BAKUENRYU:
 						skillratio += 50*(skill_lv-1); // recorrected after calculation from vids
 						skillratio += 50*(skill_lv-1); // recorrected after calculation from vids
@@ -2361,6 +2360,9 @@ struct Damage battle_calc_magic_attack(
 					case NJ_HYOUSYOURAKU:
 					case NJ_HYOUSYOURAKU:
 						skillratio += 50*skill_lv; // recorrected after calculation from vids
 						skillratio += 50*skill_lv; // recorrected after calculation from vids
 						break;
 						break;
+					case NJ_HUUJIN:
+						skillratio += 50 + 50*skill_lv; // extrapolation from a vid (unsure)
+						break;
 					case NJ_RAIGEKISAI:
 					case NJ_RAIGEKISAI:
 						skillratio += 60 + 40*skill_lv; // idem
 						skillratio += 60 + 40*skill_lv; // idem
 						break;
 						break;

+ 67 - 121
src/map/skill.c

@@ -1827,11 +1827,12 @@ int skill_attack (int attack_type, struct block_list* src, struct block_list *ds
 
 
 	if (attack_type&BF_MAGIC) {
 	if (attack_type&BF_MAGIC) {
 	 	if(sc && sc->data[SC_KAITE].timer != -1 && (dmg.damage || dmg.damage2)
 	 	if(sc && sc->data[SC_KAITE].timer != -1 && (dmg.damage || dmg.damage2)
-			&& !(sstatus->mode&MD_BOSS) && (sd || status_get_lv(dsrc) <= 80) 
-		) {	//Works on players or mobs with level under 80.
-			clif_skill_nodamage(bl,bl,SL_KAITE,sc->data[SC_KAITE].val1,1);
+			&& !(sstatus->mode&MD_BOSS) && (src->type == BL_PC || status_get_lv(src) <= 80) )
+		{	//Works on players or mobs with level under 80.
+			clif_specialeffect(bl, 438, AREA);
 			if (--sc->data[SC_KAITE].val2 <= 0)
 			if (--sc->data[SC_KAITE].val2 <= 0)
 				status_change_end(bl, SC_KAITE, -1);
 				status_change_end(bl, SC_KAITE, -1);
+			clif_skill_nodamage(bl,src,skillid,skilllv,1);
 			bl = src; //Just make the skill attack yourself @.@
 			bl = src; //Just make the skill attack yourself @.@
 			sc = status_get_sc(bl);
 			sc = status_get_sc(bl);
 			tsd = (bl->type == BL_PC)?(TBL_PC*)bl:NULL;
 			tsd = (bl->type == BL_PC)?(TBL_PC*)bl:NULL;
@@ -2010,7 +2011,7 @@ int skill_attack (int attack_type, struct block_list* src, struct block_list *ds
 			if (ud && ud->skilltarget == bl->id)
 			if (ud && ud->skilltarget == bl->id)
 				dmg.dmotion = clif_skill_damage(dsrc,bl,tick,dmg.amotion,dmg.dmotion, damage, dmg.div_, skillid, (lv!=0)?lv:skilllv, type);
 				dmg.dmotion = clif_skill_damage(dsrc,bl,tick,dmg.amotion,dmg.dmotion, damage, dmg.div_, skillid, (lv!=0)?lv:skilllv, type);
 			else
 			else
-				dmg.dmotion = clif_skill_damage(dsrc,bl,tick,dmg.amotion,dmg.dmotion, damage, dmg.div_, skillid, -1, 5); //TODO: Check whether it's better to send -1 in skilllv or also send 0 as skillid, maybe even change this to a clif_damage packet?
+				dmg.dmotion = clif_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,8,dmg.damage2); // can't know why 8, but it works for all skills...
 			break;
 			break;
 		}
 		}
 	case PA_GOSPEL: //Should look like Holy Cross [Skotlex]
 	case PA_GOSPEL: //Should look like Holy Cross [Skotlex]
@@ -2081,7 +2082,10 @@ int skill_attack (int attack_type, struct block_list* src, struct block_list *ds
 
 
 	//Only knockback if it's still alive, otherwise a "ghost" is left behind. [Skotlex]
 	//Only knockback if it's still alive, otherwise a "ghost" is left behind. [Skotlex]
 	if (dmg.blewcount > 0 && !status_isdead(bl))
 	if (dmg.blewcount > 0 && !status_isdead(bl))
-		skill_blown(dsrc,bl,dmg.blewcount);
+	{
+		if ( skillid != NJ_TATAMIGAESHI ) skill_blown(dsrc,bl,dmg.blewcount);
+		else skill_blown(src,bl,dmg.blewcount);
+	}
 	
 	
 	//Delayed damage must be dealt after the knockback (it needs to know actual position of target)
 	//Delayed damage must be dealt after the knockback (it needs to know actual position of target)
 	if (dmg.amotion)
 	if (dmg.amotion)
@@ -2824,40 +2828,39 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, int
 		break;
 		break;
 
 
 	//Splash attack skills.
 	//Splash attack skills.
+	case AS_SPLASHER:
+		if ( (flag&1) && bl->id != skill_area_temp[1] )
+		{
+			skill_attack(skill_get_type(skillid), src, src, bl, skillid, skilllv, tick, 1);
+			break;
+		}
 	case AS_GRIMTOOTH:
 	case AS_GRIMTOOTH:
 	case MC_CARTREVOLUTION:	
 	case MC_CARTREVOLUTION:	
 	case NPC_SPLASHATTACK:
 	case NPC_SPLASHATTACK:
-	case AC_SHOWER:	//Targetted skill implementation.
+	case AC_SHOWER:	
+	case MG_NAPALMBEAT:
+	case MG_FIREBALL:
+	case HW_NAPALMVULCAN:
+	case HT_BLITZBEAT:
+	case NJ_HUUMA:
 	case NJ_BAKUENRYU:
 	case NJ_BAKUENRYU:
-		if(flag&1){
-			if(bl->id!=skill_area_temp[1]){
-				skill_attack(skill_get_type(skillid),src,src,bl,skillid,skilllv,tick,
-					0x0500);				
-			}
-		} else {
-			skill_area_temp[1]=bl->id;
-			map_foreachinrange(skill_area_sub, bl,
-				skill_get_splash(skillid, skilllv), BL_CHAR,
-				src,skillid,skilllv,tick, flag|BCT_ENEMY|1,
-				skill_castend_damage_id);
-			//Skill-attack at the end in case it has knockback. [Skotlex]
-			skill_attack(skill_get_type(skillid),src,src,bl,skillid,skilllv,tick,0);
-		}
-		break;
-
-	case AS_SPLASHER:
 		if (flag & 1) {	//Invoked from map_foreachinarea, skill_area_temp[0] holds number of targets to divide damage by.
 		if (flag & 1) {	//Invoked from map_foreachinarea, skill_area_temp[0] holds number of targets to divide damage by.
-			if (bl->id != skill_area_temp[0])
-				skill_attack(BF_WEAPON, src, src, bl, skillid, skilllv, tick, 1);
+			skill_attack(skill_get_type(skillid), src, src, bl, skillid, skilllv, tick, skill_area_temp[0]);
 		} else {
 		} else {
-			skill_area_temp[0] = bl->id;
+			if ( skillid == NJ_BAKUENRYU ) clif_skill_nodamage(src,bl,skillid,skilllv,1);
+			skill_area_temp[0] = 0;
+			skill_area_temp[1] = bl->id;
+			if ( (skill_get_nk(skillid)&NK_SPLASHSPLIT) || (skillid==HT_BLITZBEAT && flag&0xf00000) ) //Warning, 0x100000 is currently BCT_NEUTRAL, so don't mix it when asking for the enemy. [Skotlex]
+				map_foreachinrange(skill_area_sub, bl, 
+					skill_get_splash(skillid, skilllv), BL_CHAR,
+					src, skillid, skilllv, tick, flag|BCT_ENEMY, skill_area_sub_count);
 			map_foreachinrange(skill_area_sub, bl,
 			map_foreachinrange(skill_area_sub, bl,
 				skill_get_splash(skillid, skilllv), BL_CHAR,
 				skill_get_splash(skillid, skilllv), BL_CHAR,
-				src, skillid, skilllv, tick, BCT_ENEMY|1,
+				src, skillid, skilllv, tick, flag|BCT_ENEMY|1,
 				skill_castend_damage_id);
 				skill_castend_damage_id);
-			skill_attack(BF_WEAPON, src, src, bl, skillid, skilllv, tick, 0);
 		}
 		}
 		break;
 		break;
+
 	case SM_MAGNUM:
 	case SM_MAGNUM:
 		if(flag&1)
 		if(flag&1)
 			skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
 			skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
@@ -3020,56 +3023,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, int
 			skill_attack(BF_MAGIC, src, src, bl, skillid, skilllv, tick, flag);
 			skill_attack(BF_MAGIC, src, src, bl, skillid, skilllv, tick, flag);
 	break;
 	break;
 
 
-	case MG_NAPALMBEAT:
-	case MG_FIREBALL:
-		if (flag & 1) {
-			if (bl->id == skill_area_temp[1])
-				break;
-			if(skillid == MG_FIREBALL) //Store distance.	
-				skill_area_temp[0] = distance_blxy(bl, skill_area_temp[2], skill_area_temp[3]);
-			skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick, skill_area_temp[0]| 0x0500);
-		} else {
-			skill_area_temp[0]=0;
-			skill_area_temp[1]=bl->id;
-			switch (skillid) {
-				case MG_NAPALMBEAT:
-					map_foreachinrange(skill_area_sub, bl,
-						skill_get_splash(skillid, skilllv),BL_CHAR,
-						src,skillid,skilllv,tick,flag|BCT_ENEMY,
-						skill_area_sub_count);
-					break;
-				case MG_FIREBALL:
-					skill_area_temp[2]=bl->x;
-					skill_area_temp[3]=bl->y;
-					break;
-			}
-			skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick, skill_area_temp[0]);
-			map_foreachinrange(skill_area_sub,bl,
-				skill_get_splash(skillid, skilllv),BL_CHAR,
-				src,skillid,skilllv,tick, flag|BCT_ENEMY|1,
-				skill_castend_damage_id);
-		}
-		break;
-
-	case HW_NAPALMVULCAN: // Fixed By SteelViruZ
-		if (flag & 1) {
-			if (bl->id != skill_area_temp[1])
-				skill_attack(BF_MAGIC, src, src, bl, skillid, skilllv, tick, skill_area_temp[0]);
-		} else {
-			skill_area_temp[0] = 0;
-			skill_area_temp[1] = bl->id;
-			map_foreachinrange(skill_area_sub, bl,
-				skill_get_splash(skillid, skilllv), BL_CHAR,
-				src, skillid, skilllv, tick, flag|BCT_ENEMY,
-				skill_area_sub_count);
-			skill_attack(BF_MAGIC, src, src, bl, skillid, skilllv, tick, skill_area_temp[0]);
-			map_foreachinrange(skill_area_sub, bl,
-				skill_get_splash(skillid, skilllv), BL_CHAR,
-				src, skillid, skilllv, tick, flag|BCT_ENEMY|1,
-				skill_castend_damage_id);
-		}
-		break;
-
 	case SL_STIN:
 	case SL_STIN:
 	case SL_STUN:
 	case SL_STUN:
 	case SL_SMA:
 	case SL_SMA:
@@ -3080,22 +3033,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, int
 		}
 		}
 		skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag);
 		skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag);
 		break;
 		break;
-		
-	case HT_BLITZBEAT:
-		if (flag & 1) {	//Invoked from map_foreachinarea, skill_area_temp[0] holds number of targets to divide damage by.
-			skill_attack(BF_MISC, src, src, bl, skillid, skilllv, tick, skill_area_temp[0]);
-		} else {
-			skill_area_temp[0] = 0;
-			if (flag & 0xf00000) //Warning, 0x100000 is currently BCT_NEUTRAL, so don't mix it when asking for the enemy. [Skotlex]
-				map_foreachinrange(skill_area_sub, bl, 
-					skill_get_splash(skillid, skilllv), BL_CHAR,
-					src, skillid, skilllv, tick, BCT_ENEMY, skill_area_sub_count);
-			map_foreachinrange(skill_area_sub, bl,
-				skill_get_splash(skillid, skilllv), BL_CHAR,
-				src, skillid, skilllv, tick, BCT_ENEMY|1,
-				skill_castend_damage_id);
-		}
-		break;
 
 
 	case NPC_DARKBREATH:
 	case NPC_DARKBREATH:
 		clif_emotion(src,7);
 		clif_emotion(src,7);
@@ -3162,33 +3099,18 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, int
 				skill_castend_damage_id);
 				skill_castend_damage_id);
 		}
 		}
 		break;
 		break;
-	case NJ_HUUMA:
-		if (flag & 1) {
-			skill_attack(BF_WEAPON, src, src, bl, skillid, skilllv, tick, skill_area_temp[0]);
-		} else {
-			skill_area_temp[0] = 0;
-			map_foreachinrange(skill_area_sub, bl,
-				skill_get_splash(skillid, skilllv), BL_CHAR,
-				src, skillid, skilllv, tick, flag|BCT_ENEMY,
-				skill_area_sub_count);
-			map_foreachinrange(skill_area_sub, bl,
-				skill_get_splash(skillid, skilllv), BL_CHAR,
-				src, skillid, skilllv, tick, flag|BCT_ENEMY|1,
-				skill_castend_damage_id);
-		}
-		break;
+
 	case NJ_KASUMIKIRI:
 	case NJ_KASUMIKIRI:
 		skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
 		skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
 		sc_start(src,SC_HIDING,100,skilllv,skill_get_time(skillid,skilllv));
 		sc_start(src,SC_HIDING,100,skilllv,skill_get_time(skillid,skilllv));
 		break;
 		break;
 	case NJ_KIRIKAGE:
 	case NJ_KIRIKAGE:
-		status_change_end(src, SC_HIDING, -1);
-		skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
-		if (unit_movepos(src, bl->x, bl->y, 0, 0))
-		{	//FIXME: Why are you sending a packet to LIE about where the character is?
-			//If you want to place yourself adjacent to the target, do the proper coding..?
-			int dir = unit_getdir(src);
-			clif_slide(src,src->x - dirx[dir],src->y - diry[dir]);
+		{
+			int dir = map_calc_dir(src,bl->x,bl->y);
+			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)) // fixed... sorry for this o_O
+				clif_slide(src,bl->x - dirx[dir],bl->y - diry[dir]);
 		}
 		}
 		break;
 		break;
 	case NJ_ISSEN:
 	case NJ_ISSEN:
@@ -4065,6 +3987,9 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
 			skill_castend_damage_id);
 			skill_castend_damage_id);
 		break;
 		break;
 
 
+	case NJ_HYOUSYOURAKU:
+	case NJ_RAIGEKISAI:
+		clif_skill_nodamage(src,bl,skillid,skilllv,1);
 	case WZ_FROSTNOVA:
 	case WZ_FROSTNOVA:
 		map_foreachinrange(skill_attack_area, src,
 		map_foreachinrange(skill_attack_area, src,
 			skill_get_splash(skillid, skilllv), BL_CHAR,
 			skill_get_splash(skillid, skilllv), BL_CHAR,
@@ -6706,7 +6631,7 @@ struct skill_unit_group *skill_unitsetting (struct block_list *src, int skillid,
 		if (sd) val1 = sd->status.child;
 		if (sd) val1 = sd->status.child;
 		break;
 		break;
 	case NJ_KAENSIN:
 	case NJ_KAENSIN:
-		skill_clear_group(src, 4); //Delete previous Kaensins
+		skill_clear_group(src, 1); //Delete previous Kaensins
 		val2 = (skilllv+1)/2 + 4;
 		val2 = (skilllv+1)/2 + 4;
 		break;
 		break;
 
 
@@ -7231,6 +7156,17 @@ int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, uns
 		}
 		}
 
 
 		case UNT_TATAMIGAESHI:
 		case UNT_TATAMIGAESHI:
+		{
+			struct skill_unit_group *sug; // better name needed :D
+
+			if ( (sug = map_find_skill_unit_oncell(bl,bl->x,bl->y,NJ_TATAMIGAESHI,NULL)->group) != NULL )
+			{
+				if ( DIFF_TICK(gettick(), sug->tick) <= skill_get_time2(sg->skill_id, sg->skill_lv) )
+					skill_attack(BF_WEAPON,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0);
+ 			}
+			break;
+		}
+
 		case UNT_DEMONSTRATION:
 		case UNT_DEMONSTRATION:
 			skill_attack(BF_WEAPON,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0);
 			skill_attack(BF_WEAPON,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0);
 			break;
 			break;
@@ -9207,11 +9143,8 @@ int skill_clear_group (struct block_list *bl, int flag)
 			case SA_VIOLENTGALE:
 			case SA_VIOLENTGALE:
 			case SA_LANDPROTECTOR:
 			case SA_LANDPROTECTOR:
 			case NJ_SUITON:
 			case NJ_SUITON:
-				if (flag&1)
-					group[count++]= ud->skillunit[i];
-				break;
 			case NJ_KAENSIN:
 			case NJ_KAENSIN:
-				if (flag&4)
+				if (flag&1)
 					group[count++]= ud->skillunit[i];
 					group[count++]= ud->skillunit[i];
 				break;
 				break;
 			default:
 			default:
@@ -9322,11 +9255,15 @@ 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:
 			switch (unit->group->skill_id)
 			switch (unit->group->skill_id)
 			{	//These override each other.
 			{	//These 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:
 					(*alive) = 0;
 					(*alive) = 0;
 					return 1;
 					return 1;
 			}
 			}
@@ -10856,6 +10793,15 @@ void skill_init_unit_layout (void)
 				memcpy(skill_unit_layout[pos].dy,dy,sizeof(dy));
 				memcpy(skill_unit_layout[pos].dy,dy,sizeof(dy));
 				break;
 				break;
 			}
 			}
+			case NJ_KAENSIN:
+			{
+				static const int dx[] = {-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,};
+				static const int dy[] = { 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 0, 0, 0, 0,-1,-1,-1,-1,-1,-2,-2,-2,-2,-2,};
+				skill_unit_layout[pos].count = 24;
+				memcpy(skill_unit_layout[pos].dx,dx,sizeof(dx));
+				memcpy(skill_unit_layout[pos].dy,dy,sizeof(dy));
+				break;
+			}
 			case NJ_TATAMIGAESHI:
 			case NJ_TATAMIGAESHI:
 			{
 			{
 				//Level 1 (count 4, cross of 3x3)
 				//Level 1 (count 4, cross of 3x3)

+ 4 - 3
src/map/skill.h

@@ -23,7 +23,8 @@
 //Constants to identify a skill's nk value.
 //Constants to identify a skill's nk value.
 //The NK value applies only to non INF_GROUND_SKILL skills.
 //The NK value applies only to non INF_GROUND_SKILL skills.
 #define NK_NO_DAMAGE 0x1
 #define NK_NO_DAMAGE 0x1
-#define NK_SPLASH 0x2
+#define NK_SPLASH (0x2|0x4) // 0x4 = splash & split
+#define NK_SPLASHSPLIT 0x4
 //A skill with 3 would be no damage + splash: area of effect.
 //A skill with 3 would be no damage + splash: area of effect.
 //Constants to identify a skill's inf2 value.
 //Constants to identify a skill's inf2 value.
 #define INF2_QUEST_SKILL 1
 #define INF2_QUEST_SKILL 1
@@ -938,9 +939,9 @@ enum {
 	UNT_SPIDERWEB,
 	UNT_SPIDERWEB,
 	UNT_GRAVITATION,
 	UNT_GRAVITATION,
 	UNT_HERMODE,
 	UNT_HERMODE,
-	UNT_TATAMIGAESHI, //0xba //Temporary setting until correct value is found.
+	UNT_DESPERADO, //0xba //Temporary setting until correct value is found.
 	UNT_SUITON = 0xbb,
 	UNT_SUITON = 0xbb,
-	UNT_DESPERADO, //NJ_TATAMIGAESHI is 0xbc as well?
+	UNT_TATAMIGAESHI,
 	UNT_KAENSIN,
 	UNT_KAENSIN,
 	//0xbe, 0xc0, 0xc1 //Maybe the other elements of Ground Drift?
 	//0xbe, 0xc0, 0xc1 //Maybe the other elements of Ground Drift?
 	UNT_GROUNDDRIFT = 0xc2,
 	UNT_GROUNDDRIFT = 0xc2,

+ 1 - 1
src/map/status.c

@@ -357,7 +357,7 @@ void initChangeTables(void) {
 	add_sc(NJ_HYOUSYOURAKU, SC_FREEZE);
 	add_sc(NJ_HYOUSYOURAKU, SC_FREEZE);
 	set_sc(NJ_NEN, SC_NEN, SI_NEN, SCB_STR|SCB_INT);
 	set_sc(NJ_NEN, SC_NEN, SI_NEN, SCB_STR|SCB_INT);
 	set_sc(NJ_UTSUSEMI, SC_UTSUSEMI, SI_UTSUSEMI,SCB_NONE);
 	set_sc(NJ_UTSUSEMI, SC_UTSUSEMI, SI_UTSUSEMI,SCB_NONE);
-	set_sc(NJ_BUNSINJYUTSU, SC_BUNSINJYUTSU, SI_BLANK, SCB_NONE);
+	set_sc(NJ_BUNSINJYUTSU, SC_BUNSINJYUTSU, SI_BUNSINJYUTSU, SCB_NONE);
 	set_sc(CR_SHRINK, SC_SHRINK, SI_SHRINK, SCB_NONE);
 	set_sc(CR_SHRINK, SC_SHRINK, SI_SHRINK, SCB_NONE);
 	set_sc(RG_CLOSECONFINE, SC_CLOSECONFINE2, SI_CLOSECONFINE2, SCB_NONE);
 	set_sc(RG_CLOSECONFINE, SC_CLOSECONFINE2, SI_CLOSECONFINE2, SCB_NONE);
 	set_sc(RG_CLOSECONFINE, SC_CLOSECONFINE, SI_CLOSECONFINE, SCB_FLEE);
 	set_sc(RG_CLOSECONFINE, SC_CLOSECONFINE, SI_CLOSECONFINE, SCB_FLEE);

+ 1 - 1
src/map/status.h

@@ -395,7 +395,7 @@ enum {
 	SI_GATLINGFEVER		= 204,
 	SI_GATLINGFEVER		= 204,
 	SI_TKREST = 205, // 205 = Gloria again (but TK- Happy State looks like it)
 	SI_TKREST = 205, // 205 = Gloria again (but TK- Happy State looks like it)
 	SI_UTSUSEMI			= 206,
 	SI_UTSUSEMI			= 206,
-	// 207 = crash (corresponds to SI_BUNSINJYUTSU). Must be fixed.
+	SI_BUNSINJYUTSU		= 207,
 	SI_NEN				= 208,
 	SI_NEN				= 208,
 	SI_ADJUSTMENT		= 209,
 	SI_ADJUSTMENT		= 209,
 	SI_ACCURACY			= 210
 	SI_ACCURACY			= 210