From fb635209b4dff794db3f3df8fdb62478c797b882 Mon Sep 17 00:00:00 2001 From: skotlex Date: Mon, 16 Oct 2006 19:07:24 +0000 Subject: - 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://rathena.svn.sourceforge.net/svnroot/rathena/trunk@8999 54d463be-8e91-2dee-dedb-b68131a5f0ec --- Changelog-Trunk.txt | 2 ++ db/Changelog.txt | 2 ++ db/job_db1.txt | 2 +- db/skill_cast_db.txt | 44 +++++++++++++++-------------- db/skill_db.txt | 12 ++++---- db/skill_nocast_db.txt | 1 - db/skill_require_db.txt | 2 +- src/map/battle.c | 73 ++++++++++++++++++++++++++----------------------- src/map/skill.c | 49 +++++++++++++++++++-------------- src/map/status.c | 36 ++++++------------------ 10 files changed, 111 insertions(+), 112 deletions(-) diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt index 6679e5fdd..40dfaa69f 100644 --- a/Changelog-Trunk.txt +++ b/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. 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. This could fix the ongoing difficulties pulling off Monk combos. [Skotlex] * Fixed Esma-state not ending after casting it. [Skotlex] diff --git a/db/Changelog.txt b/db/Changelog.txt index fcd7bdcc9..a4640b0ca 100644 --- a/db/Changelog.txt +++ b/db/Changelog.txt @@ -20,6 +20,8 @@ ======================== 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] 10/14 * Fixed Bacsojin's and Chung E's stats [Playtester] diff --git a/db/job_db1.txt b/db/job_db1.txt index f486e6414..c002fed87 100644 --- a/db/job_db1.txt +++ b/db/job_db1.txt @@ -54,7 +54,7 @@ // 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 // 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 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/skill_cast_db.txt b/db/skill_cast_db.txt index ad804f3b2..bcc587ea6 100644 --- a/db/skill_cast_db.txt +++ b/db/skill_cast_db.txt @@ -878,45 +878,47 @@ //===== 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 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 -//-- 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) 530,0,0,0,0,0 //-- 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 534,700:1400:2100:2800:3500:4200:4900:5600:6300:7000,0,0,0,0 //-- NJ_KAENSIN 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 //-- NJ_HYOUSENSOU 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 -//-- 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 -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 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 //========================================== diff --git a/db/skill_db.txt b/db/skill_db.txt index 0ddc19ac8..03e93eb96 100644 --- a/db/skill_db.txt +++ b/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# 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,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# 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# 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# 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# @@ -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# 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# -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# -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# 1002,0,6,4,0,1,0,1,0,no,0,1,0,weapon,2 //CR_SHRINK#Shrink# diff --git a/db/skill_nocast_db.txt b/db/skill_nocast_db.txt index bceeb98e6..a126610f3 100644 --- a/db/skill_nocast_db.txt +++ b/db/skill_nocast_db.txt @@ -56,4 +56,3 @@ //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_require_db.txt b/db/skill_require_db.txt index 6320a4d3a..c971c00e7 100644 --- a/db/skill_require_db.txt +++ b/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 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 -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 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#チャ?[ジアタック# diff --git a/src/map/battle.c b/src/map/battle.c index b138e651b..878f9e322 100644 --- a/src/map/battle.c +++ b/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; } - 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); 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. case PA_PRESSURE: case HW_GRAVITATION: + case NJ_ZENYNAGE: break; default: if (md && md->guardian_data) { @@ -877,7 +900,7 @@ static struct Damage battle_calc_weapon_attack( case CR_GRANDCROSS: case NPC_GRANDDARKNESS: case NJ_HUUMA: - case GS_FLING: + case NJ_ISSEN: case GS_TRIPLEACTION: case GS_BULLSEYE: case GS_MAGICALBULLET: @@ -1048,7 +1071,8 @@ static struct Damage battle_calc_weapon_attack( case NPC_ENERGYDRAIN: case NPC_MENTALBREAKER: case GS_GROUNDDRIFT: - case NJ_TATAMIGAESHI: + case NJ_SYURIKEN: + case NJ_KUNAI: case NJ_ISSEN: flag.hit = 1; break; @@ -1151,7 +1175,7 @@ static struct Damage battle_calc_weapon_attack( switch (skill_num) { //Calc base damage according to skill 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; status_set_hp(src, 1, 0); break; @@ -1781,11 +1805,10 @@ static struct Damage battle_calc_weapon_attack( skillratio /= 12-3*skill; 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); + 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 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 Damage ad; - struct status_change *tsc; struct status_data *sstatus = status_get_status_data(src); struct status_data *tstatus = status_get_status_data(target); struct { @@ -2212,8 +2234,6 @@ struct Damage battle_calc_magic_attack( //Adds an absolute value to damage. 100 = +100 damage #define MATK_ADD( a ) { ad.damage+= a; } - tsc= status_get_sc(target); // used for NJ_SUITON increasing NJ_HYOUSENSOU damages - switch (skill_num) { //Calc base damage according to skill case AL_HEAL: @@ -2321,27 +2341,19 @@ struct Damage battle_calc_magic_attack( skillratio -= 10; break; case NJ_KAENSIN: - skillratio -= 40; // extrapolation from a vid (seems correct +/- 10%) + skillratio -= 50; break; 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; 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; case NJ_RAIGEKISAI: - skillratio += 60 + 40*skill_lv; // idem + skillratio += 60 + 40*skill_lv; break; case NJ_KAMAITACHI: - skillratio += 100*skill_lv; // idem + skillratio += 100*skill_lv; break; } @@ -2621,8 +2633,8 @@ struct Damage battle_calc_misc_attack( 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; case GS_FLING: 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; } } - 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] if(sd && (damage = pc_checkskill(sd,MO_TRIPLEATTACK)) > 0) diff --git a/src/map/skill.c b/src/map/skill.c index d60d4c653..5e1a87606 100644 --- a/src/map/skill.c +++ b/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); 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: - if (sc) + if (sc && skillid == MO_EXTREMITYFIST) { if (sc->data[SC_EXPLOSIONSPIRITS].timer != -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); short dx,dy; int i,speed; - + i = skillid == MO_EXTREMITYFIST?1:2; //Move 2 cells for Issen, 1 for Asura dx = bl->x - src->x; 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 (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; 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; 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); - 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); + skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag); } 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: if(sd) { 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: { unit_movepos(src, x, y, 1, 0); - unit_setdir(src, (unit_getdir(src) + 4)%8); clif_slide(src,x,y); 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; case NJ_ISSEN: + if (status->hp < 2) { + clif_skill_fail(sd,skill,0,0); + return 0; + } case NJ_BUNSINJYUTSU: if (!sc || sc->data[SC_NEN].timer==-1) { 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_DELUGE: 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) { //These cannot override each other. case SA_VOLCANO: case SA_DELUGE: case SA_VIOLENTGALE: - case NJ_SUITON: - case NJ_KAENSIN: +// case NJ_SUITON: +// case NJ_KAENSIN: (*alive) = 0; return 1; } diff --git a/src/map/status.c b/src/map/status.c index 246b90817..a31848e94 100644 --- a/src/map/status.c +++ b/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) 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; if(skill_num == PR_LEXAETERNA && (tsc->data[SC_FREEZE].timer != -1 || (tsc->data[SC_STONE].timer != -1 && tsc->opt1 == OPT1_STONE))) return 0; @@ -4923,33 +4924,14 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val val2 = 0; break; case SC_SUITON: - val2 = 0; //Agi penalty + val2 = 0; //Agi 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; - case 0: - val2 = 0; - break; - default: - val2 = 3*((val1+1)/3); - break; - } - } + val3 = 50; + val2 = 3*((val1+1)/3); + if (val1 > 4) val2--; break; case SC_ONEHAND: case SC_TWOHANDQUICKEN: @@ -6788,7 +6770,7 @@ int status_change_timer_sub(struct block_list *bl, va_list ap ) case SC_SIGHTBLASTER: if (battle_check_target( src, bl, BCT_ENEMY ) > 0 && status_check_skilluse(src, bl, WZ_SIGHTBLASTER, 2)) - { + { skill_attack(BF_MAGIC,src,src,bl,WZ_SIGHTBLASTER,1,tick,0); if (sc) sc->data[type].val2 = 0; //This signals it to end. } -- cgit v1.2.3-70-g09d2