瀏覽代碼

Merged Mpeg's work on Ninja skills

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@8068 54d463be-8e91-2dee-dedb-b68131a5f0ec
toms 19 年之前
父節點
當前提交
20da0f1913
共有 7 個文件被更改,包括 66 次插入21 次删除
  1. 1 0
      Changelog-Trunk.txt
  2. 4 4
      db/skill_cast_db.txt
  3. 1 1
      db/skill_db.txt
  4. 23 6
      src/map/battle.c
  5. 24 4
      src/map/skill.c
  6. 8 2
      src/map/status.c
  7. 5 4
      src/map/status.h

+ 1 - 0
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]

+ 4 - 4
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

+ 1 - 1
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#

+ 23 - 6
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;
 				}
 

+ 24 - 4
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;

+ 8 - 2
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;

+ 5 - 4
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