From 0a71eefcf3ff8dd9baecfdf76f2225876334f046 Mon Sep 17 00:00:00 2001 From: Vicious Date: Mon, 7 Aug 2006 15:12:05 +0000 Subject: mpeg's ninja work http://gpegon.free.fr/ea/ninja_08-07-06_mpeg.txt git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@8160 54d463be-8e91-2dee-dedb-b68131a5f0ec --- Changelog-Trunk.txt | 1 + db/job_db1.txt | 6 +- db/job_db2.txt | 2 +- db/skill_cast_db.txt | 22 +++--- db/skill_db.txt | 16 ++--- db/skill_nocast_db.txt | 2 +- db/skill_tree.txt | 10 +-- db/skill_unit_db.txt | 10 ++- src/map/battle.c | 12 ++-- src/map/skill.c | 188 ++++++++++++++++++------------------------------- src/map/skill.h | 7 +- src/map/status.c | 2 +- src/map/status.h | 2 +- 13 files changed, 114 insertions(+), 166 deletions(-) diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt index b40080246..2b3a8f42e 100644 --- a/Changelog-Trunk.txt +++ b/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. 2006/08/07 + * mpeg's Ninja work [Vicious] * 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. the actual attacker is not a mob-type. [Skotlex] diff --git a/db/job_db1.txt b/db/job_db1.txt index f4a05480b..3d3e45f90 100644 --- a/db/job_db1.txt +++ b/db/job_db1.txt @@ -1,7 +1,7 @@ // Job-specific Values 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 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 // 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 -// 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 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 diff --git a/db/job_db2.txt b/db/job_db2.txt index 51f657b15..d3805d144 100644 --- a/db/job_db2.txt +++ b/db/job_db2.txt @@ -62,7 +62,7 @@ // 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 // 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 4001,0,0,0,0,0,0,0,0,0,0 // Swordman High diff --git a/db/skill_cast_db.txt b/db/skill_cast_db.txt index 5ad74815f..27d99c583 100644 --- a/db/skill_cast_db.txt +++ b/db/skill_cast_db.txt @@ -885,20 +885,20 @@ 525,1000,1000,0,0,0 //-- NJ_ZENYNAGE 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) 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_KIRIKAGE // Seems to have no delay (English Translation Project) 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 -//-- 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 //-- NJ_KAENSIN 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 //-- 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 -//-- 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 540,700:1400:2100:2800:3500:4200:4900:5600:6300:7000,0,0,0,0 //-- 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 -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 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 //========================================== diff --git a/db/skill_db.txt b/db/skill_db.txt index bb251f974..298ef3549 100644 --- a/db/skill_db.txt +++ b/db/skill_db.txt @@ -4,7 +4,7 @@ // 03 hit (8- repeated hitting, 6- single-hit) // 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) -// 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) // 08 MaxLv // 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# 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# -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# 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# @@ -420,7 +420,7 @@ 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# 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# 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# @@ -546,9 +546,9 @@ 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# 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# -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# 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# @@ -557,12 +557,12 @@ 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# 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# 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# -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# 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# diff --git a/db/skill_nocast_db.txt b/db/skill_nocast_db.txt index afcc62b91..538933c87 100644 --- a/db/skill_nocast_db.txt +++ b/db/skill_nocast_db.txt @@ -55,4 +55,4 @@ //Zone 2 - Jail 421,64 //TK_JUMPKICK#Flying Side Kick# 426,64 //TK_HIGHJUMP#Taekwon Jump# - +529,64 //NJ_SHADOWJUMP#NJ_SHADOWJUMP# diff --git a/db/skill_tree.txt b/db/skill_tree.txt index 1cb03dc12..b8f066179 100644 --- a/db/skill_tree.txt +++ b/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,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,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,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# @@ -2174,4 +2174,4 @@ 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,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# \ No newline at end of file +4049,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby# diff --git a/db/skill_unit_db.txt b/db/skill_unit_db.txt index 93c384340..6e39ac2a2 100644 --- a/db/skill_unit_db.txt +++ b/db/skill_unit_db.txt @@ -87,10 +87,8 @@ 430,0x86, , 0, 1, 500,enemy, 0x000 //SG_STAR_WARM 484,0xb8, , 2, 0,1000,enemy, 0x808 //HW_GRAVITATION 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 -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 diff --git a/src/map/battle.c b/src/map/battle.c index a1f0e2a90..34ff61ad2 100644 --- a/src/map/battle.c +++ b/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 && (src->type == BL_PC || !skill_num)) { //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. status_change_end(bl, SC_KAUPE, -1); 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) { - clif_skill_nodamage(bl,bl,NJ_UTSUSEMI,1,1); + clif_specialeffect(bl, 462, AREA); skill_blown (src, bl, sc->data[SC_UTSUSEMI].val3); if (--sc->data[SC_UTSUSEMI].val2 <= 0) 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)) ) { - clif_skill_nodamage(bl,bl,NJ_BUNSINJYUTSU,1,1); if (--sc->data[SC_BUNSINJYUTSU].val2 <= 0) status_change_end(bl, SC_BUNSINJYUTSU, -1); return 0; @@ -2347,8 +2346,8 @@ struct Damage battle_calc_magic_attack( case NJ_KOUENKA: skillratio -= 10; 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; case NJ_BAKUENRYU: skillratio += 50*(skill_lv-1); // recorrected after calculation from vids @@ -2361,6 +2360,9 @@ struct Damage battle_calc_magic_attack( 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) + break; case NJ_RAIGEKISAI: skillratio += 60 + 40*skill_lv; // idem break; diff --git a/src/map/skill.c b/src/map/skill.c index 2cd3ff4e6..3de357f22 100644 --- a/src/map/skill.c +++ b/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(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) status_change_end(bl, SC_KAITE, -1); + clif_skill_nodamage(bl,src,skillid,skilllv,1); bl = src; //Just make the skill attack yourself @.@ sc = status_get_sc(bl); 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) dmg.dmotion = clif_skill_damage(dsrc,bl,tick,dmg.amotion,dmg.dmotion, damage, dmg.div_, skillid, (lv!=0)?lv:skilllv, type); 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; } 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] 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) if (dmg.amotion) @@ -2824,40 +2828,39 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, int break; //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 MC_CARTREVOLUTION: 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: - 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 (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 { - 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, 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_attack(BF_WEAPON, src, src, bl, skillid, skilllv, tick, 0); } break; + case SM_MAGNUM: if(flag&1) 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); 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_STUN: 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); 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: 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); } 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: skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag); sc_start(src,SC_HIDING,100,skilllv,skill_get_time(skillid,skilllv)); break; 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; 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); break; + case NJ_HYOUSYOURAKU: + case NJ_RAIGEKISAI: + clif_skill_nodamage(src,bl,skillid,skilllv,1); case WZ_FROSTNOVA: map_foreachinrange(skill_attack_area, src, 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; break; case NJ_KAENSIN: - skill_clear_group(src, 4); //Delete previous Kaensins + skill_clear_group(src, 1); //Delete previous Kaensins val2 = (skilllv+1)/2 + 4; break; @@ -7231,6 +7156,17 @@ int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, uns } 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: skill_attack(BF_WEAPON,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0); break; @@ -9207,11 +9143,8 @@ int skill_clear_group (struct block_list *bl, int flag) case SA_VIOLENTGALE: case SA_LANDPROTECTOR: case NJ_SUITON: - if (flag&1) - group[count++]= ud->skillunit[i]; - break; case NJ_KAENSIN: - if (flag&4) + if (flag&1) group[count++]= ud->skillunit[i]; break; default: @@ -9322,11 +9255,15 @@ int skill_landprotector (struct block_list *bl, va_list ap) case SA_VOLCANO: case SA_DELUGE: case SA_VIOLENTGALE: + case NJ_SUITON: + case NJ_KAENSIN: switch (unit->group->skill_id) { //These override each other. case SA_VOLCANO: case SA_DELUGE: case SA_VIOLENTGALE: + case NJ_SUITON: + case NJ_KAENSIN: (*alive) = 0; return 1; } @@ -10856,6 +10793,15 @@ void skill_init_unit_layout (void) memcpy(skill_unit_layout[pos].dy,dy,sizeof(dy)); 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: { //Level 1 (count 4, cross of 3x3) diff --git a/src/map/skill.h b/src/map/skill.h index 48e88033d..b9e082a76 100644 --- a/src/map/skill.h +++ b/src/map/skill.h @@ -23,7 +23,8 @@ //Constants to identify a skill's nk value. //The NK value applies only to non INF_GROUND_SKILL skills. #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. //Constants to identify a skill's inf2 value. #define INF2_QUEST_SKILL 1 @@ -938,9 +939,9 @@ enum { UNT_SPIDERWEB, UNT_GRAVITATION, 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_DESPERADO, //NJ_TATAMIGAESHI is 0xbc as well? + UNT_TATAMIGAESHI, UNT_KAENSIN, //0xbe, 0xc0, 0xc1 //Maybe the other elements of Ground Drift? UNT_GROUNDDRIFT = 0xc2, diff --git a/src/map/status.c b/src/map/status.c index 5ecb9a93b..9d8d5ac29 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -357,7 +357,7 @@ void initChangeTables(void) { add_sc(NJ_HYOUSYOURAKU, SC_FREEZE); 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_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(RG_CLOSECONFINE, SC_CLOSECONFINE2, SI_CLOSECONFINE2, SCB_NONE); set_sc(RG_CLOSECONFINE, SC_CLOSECONFINE, SI_CLOSECONFINE, SCB_FLEE); diff --git a/src/map/status.h b/src/map/status.h index d35832836..ae30b5415 100644 --- a/src/map/status.h +++ b/src/map/status.h @@ -395,7 +395,7 @@ enum { SI_GATLINGFEVER = 204, SI_TKREST = 205, // 205 = Gloria again (but TK- Happy State looks like it) SI_UTSUSEMI = 206, - // 207 = crash (corresponds to SI_BUNSINJYUTSU). Must be fixed. + SI_BUNSINJYUTSU = 207, SI_NEN = 208, SI_ADJUSTMENT = 209, SI_ACCURACY = 210 -- cgit v1.2.3-60-g2f50