- 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
This commit is contained in:
parent
6326212fda
commit
d99bf3c795
@ -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]
|
||||
|
@ -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]
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
//==========================================
|
||||
|
||||
|
||||
|
@ -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#
|
||||
|
@ -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#
|
||||
|
@ -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#ƒ`ƒƒ?[ƒWƒAƒ^ƒbƒN#
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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)) )
|
||||
if (status_get_class(bl) == JOB_NINJA ||
|
||||
(sd && !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;
|
||||
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.
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user