소스 검색

Ninja Skills vs Land Protector (fixes #971)
* Exploding Dragon, Lightning Jolt and Snowflake Draft are now unit skills
-- They no longer can deal damage on Land Protector
-- They will deal damage instantly, regardless of your ASPD
* Exploding Dragon now deals 150%+150%*level damage divided by number of hits, it can no longer damage plants
* Snowflake Draft's freeze base duration is now 2500ms+5000ms*level
* Renewal: Lightning Jolt's AoE is now 3x3 on level 1-2, 5x5 on level 3-4 and 7x7 on level 5
* Pre-Renewal: Cast time of Wind Blade level 8-10 is now 500ms shorter
* Watery Evasion now makes non-Ninja enemies stop when they walk on it and are not knock-back immune

Playtester 9 년 전
부모
커밋
8d20393b10
10개의 변경된 파일37개의 추가작업 그리고 24개의 파일을 삭제
  1. 4 4
      db/pre-re/skill_cast_db.txt
  2. 3 3
      db/pre-re/skill_db.txt
  3. 3 0
      db/pre-re/skill_unit_db.txt
  4. 3 3
      db/re/skill_cast_db.txt
  5. 3 3
      db/re/skill_db.txt
  6. 3 1
      db/re/skill_unit_db.txt
  7. 2 2
      src/map/battle.c
  8. 6 4
      src/map/skill.c
  9. 3 0
      src/map/status.c
  10. 7 4
      src/map/unit.c

+ 4 - 4
db/pre-re/skill_cast_db.txt

@@ -886,17 +886,17 @@
 //-- NJ_KAENSIN
 535,6000:5500:5000:4500:4000:3500:3000:2500:2000:1500,1000,0,20000,0,0
 //-- NJ_BAKUENRYU
-536,3000,2000,0,0,0,0
+536,3000,2000,0,500,0,0
 //-- NJ_HYOUSENSOU
 537,700:1400:2100:2800:3500:4200:4900:5600:6300:7000,0,0,0,0,0
 //-- 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,0
 //-- NJ_HYOUSYOURAKU
-539,2000:2500:3000:3500:4000,2000,0,0,10000:11000:12000:13000:14000:15000:16000:17000:18000:19000,0
+539,2000:2500:3000:3500:4000,2000,0,500,7500:12500:17500:22500:27500,0
 //-- NJ_HUUJIN
-540,1000:1500:2000:2500:3000:3500:4000:5000:5500:6000,1000,0,0,0,0
+540,1000:1500:2000:2500:3000:3500:4000:4500:5000:5500,1000,0,0,0,0
 //-- NJ_RAIGEKISAI
-541,4000,0,0,0,0,0
+541,4000,0,0,500,0,0
 //-- NJ_KAMAITACHI
 542,4000,0,0,0,0,0
 //-- NJ_NEN

+ 3 - 3
db/pre-re/skill_db.txt

@@ -761,12 +761,12 @@
 533,0,0,0,0,0,0,10,0,no,0,0,0,none,0,0x0,		NJ_NINPOU,Spirit of the Blade
 534,9,8,1,3,0,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0,0,magic,0,0x0,	NJ_KOUENKA,Crimson Fire Petal
 535,0,8,4,3,0,0,10,1,yes,0,0,0,magic,0,0x0,		NJ_KAENSIN,Crimson Fire Formation
-536,9,8,1,3,0x2,2,5,3,yes,0,0,0,magic,0,0x0,		NJ_BAKUENRYU,Raging Fire Dragon
+536,9,8,1,3,0,0,5,-3,yes,0,0,0,magic,0,0x0,		NJ_BAKUENRYU,Raging Fire Dragon
 537,9,8,1,1,0,0,10,3:4:5:6:7:8:9:10:11:12,yes,0,0,0,magic,0,0x0,	NJ_HYOUSENSOU,Spear of Ice
 538,9,6,2,1,0x1,0,10,1,yes,0,0,0,magic,0,0x1000,	NJ_SUITON,Hidden Water
-539,0,6,4,1,0x2,3,5,1,yes,0,0,0,magic,0,0x0,		NJ_HYOUSYOURAKU,Ice Meteor
+539,0,6,4,1,0,0,5,1,yes,0,0,0,magic,0,0x0,		NJ_HYOUSYOURAKU,Ice Meteor
 540,9,8,1,4,0,0,10,1:2:2:3:3:4:4:5:5:6,yes,0,0,0,magic,0,0x0,	NJ_HUUJIN,Wind Blade
-541,9,6,4,4,0x2,2:2:3:3:4,5,1,yes,0,0,0,magic,0,0x0,	NJ_RAIGEKISAI,Lightning Strike of Destruction
+541,9,6,4,4,0,0,5,1,yes,0,0,0,magic,0,0x0,	NJ_RAIGEKISAI,Lightning Strike of Destruction
 542,5:6:7:8:9,8,1,4,0,1,5,1,yes,0,0,5:6:7:8:9,magic,0,0x0,	NJ_KAMAITACHI,Kamaitachi
 543,0,6,4,0,0x1,0,5,1,yes,0,0,0,none,0,0x0,		NJ_NEN,Soul
 544,-5,6,1,0,0x40,0,10,1,no,0,0,0,weapon,0,0x0,	NJ_ISSEN,Final Strike

+ 3 - 0
db/pre-re/skill_unit_db.txt

@@ -101,7 +101,10 @@
 521,0xbe,    ,  0, 1,1000,enemy, 0x000	//GS_GROUNDDRIFT
 527,0xbc,    , -1, 0,2000,enemy, 0x018	//NJ_TATAMIGAESHI
 535,0xbd,    , -1, 0, 100,enemy, 0x8010	//NJ_KAENSIN
+536,0x86,    ,  2, 0,1000,enemy, 0x018	//NJ_BAKUENRYU
 538,0xbb,    ,  1:1:1:2:2:2:3:3:3:4,0,-1,all,0x8010	//NJ_SUITON
+539,0x86,    ,  3, 0,1000,enemy, 0x018	//NJ_HYOUSYOURAKU
+541,0x86,    ,  2:2:3:3:4, 0,1000,enemy, 0x018	//NJ_RAIGEKISAI
 670,0xc7,    ,  1, 5:5:5:5:5:5:5:5:5:13,1000,all,0x008	//NPC_EVILLAND
 
 //706,0xfd,    ,  0, 0,1000,all, 0x000	//NPC_VENOMFOG

+ 3 - 3
db/re/skill_cast_db.txt

@@ -899,17 +899,17 @@
 //-- NJ_KAENSIN
 535,4800:4400:4000:3600:3200:2800:2400:2000:1600:1200,1000,0,20000,0,0,1200:1100:1000:900:800:700:600:500:400:300
 //-- NJ_BAKUENRYU
-536,2400,2000,0,0,0,0,600
+536,2400,2000,0,500,0,0,600
 //-- NJ_HYOUSENSOU
 537,560:1120:1680:2240:2800:3360:3840:4480:5040:5600,0,0,0,0,0,140:280:420:560:700:840:960:1120:1260:1400
 //-- NJ_SUITON
 538,2400,2000,0,15000:20000:25000:30000:35000:40000:45000:50000:55000:60000,15000:20000:25000:30000:35000:40000:45000:50000:55000:60000,0,600
 //-- NJ_HYOUSYOURAKU
-539,1600:2000:2400:2800:3200,2000,0,0,10000:11000:12000:13000:14000:15000:16000:17000:18000:19000,0,400:500:600:700:800
+539,1600:2000:2400:2800:3200,2000,0,500,7500:12500:17500:22500:27500,0,400:500:600:700:800
 //-- NJ_HUUJIN
 540,800:1200:1600:2000:2400:2800:3200:3600:4000:4400,1000,0,0,0,0,200:300:400:500:600:700:800:900:1000:1100
 //-- NJ_RAIGEKISAI
-541,3200,0,0,100,0,0,800
+541,3200,0,0,500,0,0,800
 //-- NJ_KAMAITACHI
 542,3200,0,0,0,0,0,800
 //-- NJ_NEN

+ 3 - 3
db/re/skill_db.txt

@@ -761,12 +761,12 @@
 533,0,0,0,0,0,0,10,0,no,0,0,0,none,0,0x0,		NJ_NINPOU,Spirit of the Blade
 534,9,8,1,3,0,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0,0,magic,0,0x0,	NJ_KOUENKA,Crimson Fire Petal
 535,0,8,4,3,0,0,10,1,yes,0,0,0,magic,0,0x0,		NJ_KAENSIN,Crimson Fire Formation
-536,9,8,1,3,0x2,2,5,3,yes,0,0,0,magic,0,0x0,		NJ_BAKUENRYU,Raging Fire Dragon
+536,9,8,1,3,0,0,5,-3,yes,0,0,0,magic,0,0x0,		NJ_BAKUENRYU,Raging Fire Dragon
 537,9,8,1,1,0,0,10,3:4:5:6:7:8:9:10:11:12,yes,0,0,0,magic,0,0x0,	NJ_HYOUSENSOU,Spear of Ice
 538,9,6,2,1,0x1,0,10,1,yes,0,0,0,magic,0,0x1000,	NJ_SUITON,Hidden Water
-539,0,6,4,1,0x2,3,5,1,yes,0,0,0,magic,0,0x0,		NJ_HYOUSYOURAKU,Ice Meteor
+539,0,6,4,1,0,0,5,1,yes,0,0,0,magic,0,0x0,		NJ_HYOUSYOURAKU,Ice Meteor
 540,9,8,1,4,0,0,10,1:2:2:3:3:4:4:5:5:6,yes,0,0,0,magic,0,0x0,	NJ_HUUJIN,Wind Blade
-541,9,6,2,4,0x2,2:2:3:3:4,5,1,yes,0,0,0,magic,0,0x0,	NJ_RAIGEKISAI,Lightning Strike of Destruction
+541,9,6,2,4,0,0,5,1,yes,0,0,0,magic,0,0x0,	NJ_RAIGEKISAI,Lightning Strike of Destruction
 542,5:6:7:8:9,8,1,4,0,1,5,1,yes,0,0,5:6:7:8:9,magic,0,0x0,	NJ_KAMAITACHI,Kamaitachi
 543,0,6,4,0,0x1,0,5,1,yes,0,0,0,none,0,0x0,		NJ_NEN,Soul
 544,-5,8,1,0,0x40,0,10,1,no,0,0,0,misc,0,0x0,	NJ_ISSEN,Final Strike

+ 3 - 1
db/re/skill_unit_db.txt

@@ -102,8 +102,10 @@
 525,0x86,    ,  0, 2,1000,enemy, 0x018	//NJ_HUUMA
 527,0xbc,    , -1, 0,2000,enemy, 0x018	//NJ_TATAMIGAESHI
 535,0xbd,    , -1, 0, 100,enemy, 0x8010	//NJ_KAENSIN
+536,0x86,    ,  2, 0,1000,enemy, 0x018	//NJ_BAKUENRYU
 538,0xbb,    ,  1:1:1:2:2:2:3:3:3:4,0,-1,all,0x8010	//NJ_SUITON
-541,0x86,    ,  0, 3:3:4:4:5,1000,enemy, 0x018	//NJ_RAIGEKISAI
+539,0x86,    ,  3, 0,1000,enemy, 0x018	//NJ_HYOUSYOURAKU
+541,0x86,    ,  1:1:2:2:3, 0,1000,enemy, 0x018	//NJ_RAIGEKISAI
 670,0xc7,    ,  1, 5:5:5:5:5:5:5:5:5:13,1000,all,0x008	//NPC_EVILLAND
 
 //706,0xfd,    ,  0, 0,1000,all, 0x000	//NPC_VENOMFOG

+ 2 - 2
src/map/battle.c

@@ -5745,9 +5745,9 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
 							skillratio += 10 * sd->spiritcharm;
 						break;
 					case NJ_BAKUENRYU:
-						skillratio += 50 * (skill_lv - 1);
+						skillratio += 50 + 150 * skill_lv;
 						if(sd && sd->spiritcharm_type == CHARM_TYPE_FIRE && sd->spiritcharm > 0)
-							skillratio += 15 * sd->spiritcharm;
+							skillratio += 45 * sd->spiritcharm;
 						break;
 					case NJ_HYOUSENSOU:
 #ifdef RENEWAL

+ 6 - 4
src/map/skill.c

@@ -4592,7 +4592,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
 	case RG_RAID:
 	case HW_NAPALMVULCAN:
 	case NJ_HUUMA:
-	case NJ_BAKUENRYU:
 	case ASC_METEORASSAULT:
 	case GS_DESPERADO:
 	case GS_SPREADATTACK:
@@ -4660,7 +4659,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
 			skill_area_temp[2] = 0;
 
 			switch ( skill_id ) {
-				case NJ_BAKUENRYU:
 				case LG_EARTHDRIVE:
 				case GN_CARTCANNON:
 					clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
@@ -4703,6 +4701,12 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
 		}
 		break;
 
+	//Place units around target
+	case NJ_BAKUENRYU:
+		clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);
+		skill_unitsetting(src, skill_id, skill_lv, bl->x, bl->y, 0);
+		break;
+
 	case WL_COMET:
 		if(!map_getcell(bl->m, bl->x, bl->y, CELL_CHKLANDPROTECTOR)) // Nothing should happen if the target is on Land Protector
 			skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, flag);
@@ -6800,8 +6804,6 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 			skill_castend_damage_id);
 		break;
 
-	case NJ_HYOUSYOURAKU:
-	case NJ_RAIGEKISAI:
 	case WZ_FROSTNOVA:
 		clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
 		skill_area_temp[1] = 0;

+ 3 - 0
src/map/status.c

@@ -8876,6 +8876,9 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
 			val3 = 50;
 			val2 = 3*((val1+1)/3);
 			if (val1 > 4) val2--;
+			//Suiton is a special case, stop effect is forced and only happens when target enters it
+			if (!unit_blown_immune(bl, 0x1))
+				unit_stop_walking(bl, 9);
 			break;
 		case SC_ONEHAND:
 		case SC_TWOHANDQUICKEN:

+ 7 - 4
src/map/unit.c

@@ -1236,6 +1236,7 @@ int unit_warp(struct block_list *bl,short m,short x,short y,clr_type type)
  *	&0x2: Force the unit to move one cell if it hasn't yet
  *	&0x4: Enable moving to the next cell when unit was already half-way there
  *		(may cause on-touch/place side-effects, such as a scripted map change)
+ *	&0x8: Force stop moving, even if walktimer is currently INVALID_TIMER
  * @return Success(1); Failed(0);
  */
 int unit_stop_walking(struct block_list *bl,int type)
@@ -1248,15 +1249,17 @@ int unit_stop_walking(struct block_list *bl,int type)
 
 	ud = unit_bl2ud(bl);
 
-	if(!ud || ud->walktimer == INVALID_TIMER)
+	if(!ud || (!(type&0x08) && ud->walktimer == INVALID_TIMER))
 		return 0;
 
 	// NOTE: We are using timer data after deleting it because we know the
 	// delete_timer function does not mess with it. If the function's
 	// behaviour changes in the future, this code could break!
-	td = get_timer(ud->walktimer);
-	delete_timer(ud->walktimer, unit_walktoxy_timer);
-	ud->walktimer = INVALID_TIMER;
+	if (ud->walktimer != INVALID_TIMER) {
+		td = get_timer(ud->walktimer);
+		delete_timer(ud->walktimer, unit_walktoxy_timer);
+		ud->walktimer = INVALID_TIMER;
+	}
 	ud->state.change_walk_target = 0;
 	tick = gettick();