Ver código fonte

Fixes Brandish Spear from renewal balance (#4711)

* Fixes #4707.
* Follow up to ea8da71.
* Skill now applies long range damage.
* Skill now does 3 hits.
* Target's placement in the AoE does not affect damage; it's all the same for each target.
* Updates strength bonus.
* Reverts Mercenary Brandish Spear to pre-renewal effects.
Thanks to @violent01 and @mrjnumber1!
Aleos 5 anos atrás
pai
commit
24ecebcaf3
3 arquivos alterados com 47 adições e 27 exclusões
  1. 2 2
      db/re/skill_db.yml
  2. 13 5
      src/map/battle.cpp
  3. 32 20
      src/map/skill.cpp

+ 2 - 2
db/re/skill_db.yml

@@ -2113,8 +2113,8 @@ Body:
     Flags:
       IncreaseGloomyDayDamage: true
     Range: -2
-    Hit: Single
-    HitCount: 1
+    Hit: Multi_Hit
+    HitCount: 3
     Element: Weapon
     SplashArea: 2
     ActiveInstance: 5

+ 13 - 5
src/map/battle.cpp

@@ -3630,13 +3630,16 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
 		case KN_SPEARBOOMERANG:
 			skillratio += 50 * skill_lv;
 			break;
-		case KN_BRANDISHSPEAR:
-		case ML_BRANDISH: {
 #ifdef RENEWAL
-				int ratio = 100 + 20 * skill_lv + sstatus->str; // !TODO: Confirm STR role
+		case KN_BRANDISHSPEAR:
+			skillratio += -100 + 400 + 100 * skill_lv + sstatus->str * 3;
+			break;
 #else
-				int ratio = 100 + 20 * skill_lv;
+		case KN_BRANDISHSPEAR:
 #endif
+		case ML_BRANDISH:
+			{
+				int ratio = 100 + 20 * skill_lv;
 
 				skillratio += -100 + ratio;
 				if(skill_lv > 3 && wd->miscflag == 0)
@@ -3651,8 +3654,8 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
 					skillratio += ratio / 4;
 				if(skill_lv > 9 && wd->miscflag == 2)
 					skillratio += ratio / 2;
-				break;
 			}
+			break;
 		case KN_BOWLINGBASH:
 		case MS_BOWLINGBASH:
 			skillratio += 40 * skill_lv;
@@ -5487,6 +5490,11 @@ static struct Damage initialize_weapon_data(struct block_list *src, struct block
 				wd.blewcount = 0;
 				break;
 
+#ifdef RENEWAL
+			case KN_BRANDISHSPEAR:
+				wd.flag |= BF_LONG;
+				break;
+#endif
 			case KN_AUTOCOUNTER:
 				wd.flag = (wd.flag&~BF_SKILLMASK)|BF_NORMAL;
 				break;

+ 32 - 20
src/map/skill.cpp

@@ -5328,7 +5328,13 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
 		}
 		break;
 
+#ifndef RENEWAL
+	case KN_BRANDISHSPEAR:
+		skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, flag);
+		break;
+#else
 	case KN_BRANDISHSPEAR:
+#endif
 	case ML_BRANDISH:
 		//Coded apart for it needs the flag passed to the damage calculation.
 		if (skill_area_temp[1] != bl->id)
@@ -7618,31 +7624,37 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 		skill_castend_damage_id(src, src, skill_id, skill_lv, tick, flag);
 		break;
 
+#ifdef RENEWAL
+	case KN_BRANDISHSPEAR:
+		map_foreachindir(skill_area_sub, src->m, src->x, src->y, bl->x, bl->y,
+			skill_get_splash(skill_id, skill_lv), skill_get_maxcount(skill_id, skill_lv), 0, splash_target(src),
+			src, skill_id, skill_lv, tick, flag | BCT_ENEMY | 0,
+			skill_castend_damage_id);
+#else
 	case KN_BRANDISHSPEAR:
+#endif
 	case ML_BRANDISH:
-		{
-			skill_area_temp[1] = bl->id;
+		skill_area_temp[1] = bl->id;
 
-			if(skill_lv >= 10)
-				map_foreachindir(skill_area_sub, src->m, src->x, src->y, bl->x, bl->y,
-					skill_get_splash(skill_id, skill_lv), 1, skill_get_maxcount(skill_id, skill_lv)-1, splash_target(src),
-					src, skill_id, skill_lv, tick, flag | BCT_ENEMY | (sd?3:0),
-					skill_castend_damage_id);
-			if(skill_lv >= 7)
-				map_foreachindir(skill_area_sub, src->m, src->x, src->y, bl->x, bl->y,
-					skill_get_splash(skill_id, skill_lv), 1, skill_get_maxcount(skill_id, skill_lv)-2, splash_target(src),
-					src, skill_id, skill_lv, tick, flag | BCT_ENEMY | (sd?2:0),
-					skill_castend_damage_id);
-			if(skill_lv >= 4)
-				map_foreachindir(skill_area_sub, src->m, src->x, src->y, bl->x, bl->y,
-					skill_get_splash(skill_id, skill_lv), 1, skill_get_maxcount(skill_id, skill_lv)-3, splash_target(src),
-					src, skill_id, skill_lv, tick, flag | BCT_ENEMY | (sd?1:0),
-					skill_castend_damage_id);
+		if(skill_lv >= 10)
 			map_foreachindir(skill_area_sub, src->m, src->x, src->y, bl->x, bl->y,
-				skill_get_splash(skill_id, skill_lv), skill_get_maxcount(skill_id, skill_lv)-3, 0, splash_target(src),
-				src, skill_id, skill_lv, tick, flag | BCT_ENEMY | 0,
+				skill_get_splash(skill_id, skill_lv), 1, skill_get_maxcount(skill_id, skill_lv)-1, splash_target(src),
+				src, skill_id, skill_lv, tick, flag | BCT_ENEMY | (sd?3:0),
 				skill_castend_damage_id);
-		}
+		if(skill_lv >= 7)
+			map_foreachindir(skill_area_sub, src->m, src->x, src->y, bl->x, bl->y,
+				skill_get_splash(skill_id, skill_lv), 1, skill_get_maxcount(skill_id, skill_lv)-2, splash_target(src),
+				src, skill_id, skill_lv, tick, flag | BCT_ENEMY | (sd?2:0),
+				skill_castend_damage_id);
+		if(skill_lv >= 4)
+			map_foreachindir(skill_area_sub, src->m, src->x, src->y, bl->x, bl->y,
+				skill_get_splash(skill_id, skill_lv), 1, skill_get_maxcount(skill_id, skill_lv)-3, splash_target(src),
+				src, skill_id, skill_lv, tick, flag | BCT_ENEMY | (sd?1:0),
+				skill_castend_damage_id);
+		map_foreachindir(skill_area_sub, src->m, src->x, src->y, bl->x, bl->y,
+			skill_get_splash(skill_id, skill_lv), skill_get_maxcount(skill_id, skill_lv)-3, 0, splash_target(src),
+			src, skill_id, skill_lv, tick, flag | BCT_ENEMY | 0,
+			skill_castend_damage_id);
 		break;
 
 	case WZ_SIGHTRASHER: