diff options
-rw-r--r-- | Changelog-Trunk.txt | 1 | ||||
-rw-r--r-- | db/skill_cast_db.txt | 8 | ||||
-rw-r--r-- | db/skill_db.txt | 2 | ||||
-rw-r--r-- | src/map/battle.c | 29 | ||||
-rw-r--r-- | src/map/skill.c | 28 | ||||
-rw-r--r-- | src/map/status.c | 10 | ||||
-rw-r--r-- | src/map/status.h | 9 |
7 files changed, 66 insertions, 21 deletions
diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt index 81243d025..7193d854a 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/02
+ * Merged Mpeg's work on Ninja skills [Toms]
* Fixed Martyr's Reckoning having a cap damage of 32k. [Skotlex]
* Now you can teleport in Thanatos Boss room, but you can't respawn there [Playtester]
* Fixed Defender Raising Walk speed instead of diminishing it. [Skotlex]
diff --git a/db/skill_cast_db.txt b/db/skill_cast_db.txt index 707babeda..b4afd4299 100644 --- a/db/skill_cast_db.txt +++ b/db/skill_cast_db.txt @@ -893,10 +893,10 @@ 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
-531,0,0,0,20000:30000:40000:50000:60000,0
-//-- NJ_BUNSINJYUTSU // Cast and Delay unknown
-532,0,0,0,60000:80000:100000:120000:140000:160000:180000:200000:220000:240000,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)
+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
534,700:1400:2100:2800:3500:4200:4900:5600:6300:7000,1000:1200:1400:1600:1800:2000:2200:2400:2600:2800,0,0,0
diff --git a/db/skill_db.txt b/db/skill_db.txt index f2942ce3d..16ad2c9b3 100644 --- a/db/skill_db.txt +++ b/db/skill_db.txt @@ -557,7 +557,7 @@ 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,1,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#
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
|