summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortoms <toms@54d463be-8e91-2dee-dedb-b68131a5f0ec>2006-08-02 18:33:34 +0000
committertoms <toms@54d463be-8e91-2dee-dedb-b68131a5f0ec>2006-08-02 18:33:34 +0000
commitc8a5f4e2bbf5dd6d92cb78ab865b8fe0f24bb617 (patch)
treea6ab1216f5ccf4eec0c2ece8a5a1017f41002804 /src
parentd68224a89b2f721a870d85e65667f0ae54cb6ed0 (diff)
downloadhercules-c8a5f4e2bbf5dd6d92cb78ab865b8fe0f24bb617.tar.gz
hercules-c8a5f4e2bbf5dd6d92cb78ab865b8fe0f24bb617.tar.bz2
hercules-c8a5f4e2bbf5dd6d92cb78ab865b8fe0f24bb617.tar.xz
hercules-c8a5f4e2bbf5dd6d92cb78ab865b8fe0f24bb617.zip
Merged Mpeg's work on Ninja skills
git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@8068 54d463be-8e91-2dee-dedb-b68131a5f0ec
Diffstat (limited to 'src')
-rw-r--r--src/map/battle.c29
-rw-r--r--src/map/skill.c28
-rw-r--r--src/map/status.c10
-rw-r--r--src/map/status.h9
4 files changed, 60 insertions, 16 deletions
diff --git a/src/map/battle.c b/src/map/battle.c
index 4e4126831..60f6a1f01 100644
--- a/src/map/battle.c
+++ b/src/map/battle.c
@@ -322,8 +322,25 @@ int battle_calc_damage(struct block_list *src,struct block_list *bl,int damage,i
return 0;
}
+ if(sc->data[SC_UTSUSEMI].timer != -1 && !skill_num)
+ {
+ clif_skill_nodamage(bl,bl,NJ_UTSUSEMI,1,1);
+ skill_blown (src, bl, sc->data[SC_UTSUSEMI].val3|(map_calc_dir(bl,src->x,src->y)<<20));
+ if (--sc->data[SC_UTSUSEMI].val2 <= 0)
+ status_change_end(bl, SC_UTSUSEMI, -1);
+ return 0;
+ }
+
+ if(sc->data[SC_BUNSINJYUTSU].timer != -1 && (flag&BF_WEAPON || flag&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;
+ }
+
//Now damage increasing effects
- if(sc->data[SC_AETERNA].timer!=-1 && skill_num != PA_PRESSURE && skill_num != PF_SOULBURN){
+ if(sc->data[SC_AETERNA].timer!=-1 && skill_num != PA_PRESSURE && skill_num != PF_SOULBURN && skill_num != NJ_ZENYNAGE){
damage<<=1;
status_change_end( bl,SC_AETERNA,-1 );
}
@@ -1518,7 +1535,7 @@ static struct Damage battle_calc_weapon_attack(
skillratio += 10*skill_lv;
break;
case NJ_KIRIKAGE:
- skillratio += 100*skill_lv-100;
+ skillratio += 100*(skill_lv-1);
break;
case KN_CHARGEATK:
skillratio += wflag*15; //FIXME: How much is the actual bonus? [Skotlex]
@@ -2321,7 +2338,7 @@ struct Damage battle_calc_magic_attack(
skillratio += 50 + 50*skill_lv; // extrapolation from a vid (unsure)
break;
case NJ_BAKUENRYU:
- skillratio += 150 + 150*skill_lv; // It has to be MATK +(150+150*SkillLV)% so 1000% at lvl 5, not 900%. Damage is not increased by hits.
+ skillratio += 50*(skill_lv-1); // recorrected after calculation from vids
break;
case NJ_HYOUSENSOU:
skillratio -= 30;
@@ -2329,13 +2346,13 @@ struct Damage battle_calc_magic_attack(
skillratio += sc->data[SC_SUITON].val4;
break;
case NJ_HYOUSYOURAKU:
- skillratio += 100+50*skill_lv; // correct formula (MATK + 350% = 450% at level 5) (kRO and unofficial descriptions)
+ skillratio += 50*skill_lv; // recorrected after calculation from vids
break;
case NJ_RAIGEKISAI:
- skillratio += 160 + 40*skill_lv; // idem
+ skillratio += 60 + 40*skill_lv; // idem
break;
case NJ_KAMAITACHI:
- skillratio += 100 + 100*skill_lv; // idem
+ skillratio += 100*skill_lv; // idem
break;
}
diff --git a/src/map/skill.c b/src/map/skill.c
index 4992cce2c..4965b2de9 100644
--- a/src/map/skill.c
+++ b/src/map/skill.c
@@ -786,6 +786,10 @@ int skill_get_range2 (struct block_list *bl, int id, int lv)
else
range += 10; //Assume level 10?
break;
+ case NJ_KIRIKAGE:
+ if (bl->type == BL_PC)
+ range = skill_get_range(NJ_SHADOWJUMP,pc_checkskill((struct map_session_data *)bl,NJ_SHADOWJUMP));
+ break;
}
if(!range && bl->type != BL_PC)
@@ -1999,6 +2003,7 @@ int skill_attack (int attack_type, struct block_list* src, struct block_list *ds
dmg.dmotion = clif_skill_damage(dsrc,bl,tick,dmg.amotion,dmg.dmotion, damage, dmg.div_, skillid, -1, 5);
break;
case KN_BRANDISHSPEAR:
+ case NJ_KAMAITACHI:
{ //Only display skill animation for skill's target.
struct unit_data *ud = unit_bl2ud(src);
if (ud && ud->skilltarget == bl->id)
@@ -3192,13 +3197,18 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, int
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))
+ {
+ int dir = unit_getdir(src);
+
+ clif_slide(src,src->x - dirx[dir],src->y - diry[dir]);
+ }
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){
@@ -3759,12 +3769,21 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
case GS_CRACKER:
case NJ_KASUMIKIRI:
case NJ_UTSUSEMI:
- case NJ_BUNSINJYUTSU:
case NJ_NEN:
clif_skill_nodamage(src,bl,skillid,skilllv,
sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv)));
break;
+ case NJ_BUNSINJYUTSU:
+ {
+ struct status_change *sc;
+ sc = status_get_sc(bl);
+ clif_skill_nodamage(src,bl,skillid,skilllv,
+ sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv)));
+ if (sc && sc->data[SC_NEN].timer != -1)
+ status_change_end(bl,SC_NEN,-1);
+ }
+ break;
case CG_MOONLIT:
clif_skill_nodamage(src,bl,skillid,skilllv,1);
if (sd && battle_config.player_skill_partner_check &&
@@ -5158,7 +5177,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
}
break;
- // Slim Pitcher
+ // Slim Pitcher (normally Condensed Potion doesn't give SP (Heals party members))
case CR_SLIMPITCHER:
if (potion_hp || potion_sp) {
int hp = potion_hp, sp = potion_sp;
@@ -6172,7 +6191,7 @@ int skill_castend_pos2 (struct block_list *src, int x, int y, int skillid, int s
}
break;
- // Slim Pitcher [Celest]
+ // Slim Pitcher [Celest] (normally Condensed Potion doesn't give SP (Heals party members))
case CR_SLIMPITCHER:
if (sd) {
int i = skilllv%11 - 1;
@@ -8293,6 +8312,7 @@ int skill_check_condition (struct map_session_data *sd, int skill, int lv, int t
break;
case NJ_ISSEN:
+ case NJ_BUNSINJYUTSU:
if (!sc || sc->data[SC_NEN].timer==-1) {
clif_skill_fail(sd,skill,0,0);
return 0;
diff --git a/src/map/status.c b/src/map/status.c
index 56fbaa696..5969cf7c9 100644
--- a/src/map/status.c
+++ b/src/map/status.c
@@ -356,6 +356,8 @@ void initChangeTables(void) {
set_sc(NJ_SUITON, SC_SUITON, SI_BLANK, SCB_AGI|SCB_SPEED);
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(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);
@@ -5406,6 +5408,12 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val
val4 = pos;
}
break;
+ case SC_UTSUSEMI:
+ val2=(val1+1)/2; // number of hits blocked
+ val3=7; // move you back 7 cells
+ break;
+ case SC_BUNSINJYUTSU:
+ val2=(val1+1)/2; // number of hits blocked
default:
if (calc_flag == SCB_NONE && StatusSkillChangeTable[type]==0)
{ //Status change with no calc, and no skill associated...? unknown?
@@ -5506,7 +5514,6 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val
case SC_MAXOVERTHRUST:
case SC_OVERTHRUST:
case SC_SWOO: //Why does it shares the same opt as Overthrust? Perhaps we'll never know...
- case SC_NEN:
sc->opt3 |= 2;
opt_flag = 0;
break;
@@ -6028,7 +6035,6 @@ int status_change_end( struct block_list* bl , int type,int tid )
case SC_OVERTHRUST:
case SC_MAXOVERTHRUST:
case SC_SWOO:
- case SC_NEN:
sc->opt3 &= ~2;
opt_flag = 0;
break;
diff --git a/src/map/status.h b/src/map/status.h
index 71b7a8344..46b16c02b 100644
--- a/src/map/status.h
+++ b/src/map/status.h
@@ -243,13 +243,14 @@ enum {
SC_GATLINGFEVER,
SC_TATAMIGAESHI,
SC_UTSUSEMI,
+ SC_BUNSINJYUTSU,
SC_KAENSIN,
SC_SUITON,
SC_NEN,
SC_KNOWLEDGE,
SC_SMA,
- SC_FLING,
- SC_AVOID, //240
+ SC_FLING, //240
+ SC_AVOID,
SC_CHANGE,
SC_BLOODLUST,
SC_FLEET,
@@ -392,8 +393,8 @@ enum {
SI_MADNESSCANCEL = 203, //[blackhole89]
SI_GATLINGFEVER = 204,
SI_TKREST = 205, // 205 = Gloria again (but TK- Happy State looks like it)
- SI_MAEMI = 206,
- // 207 = crash
+ SI_UTSUSEMI = 206,
+ // 207 = crash (corresponds to SI_BUNSINJYUTSU). Must be fixed.
SI_NEN = 208,
SI_ADJUSTMENT = 209,
SI_ACCURACY = 210