浏览代码

Rebalance Troubadour & Trouvere 20220608 (3rd) (#7898)

* Sound Blend
- Reduces SP consumption from 128 to 80 based on level 5.

* Metallic Fury
- Reduces cooldown from 0.5 seconds to 0.3 seconds.
- Reduces SP consumption from 168 to 94 based on level 5.
- Reduces AP recovery rate from 3 to 2 based on level 5.
- Increases damage from 4500%/4950~6750%(area damage according to number of branded target)Matk to 11000%/12500~18500%(area damage according to number of branded target)Matk based on level 5.

* Rhythm Shooting
- Adds 0.15 seconds cooldown.
- Removes 0.15 seconds delay after skill.
- Reduces SP consumption from 90 to 52 based on level 5.
- Increases damage from 600%/780%(branded target)Atk to 800%/1400%(branded target)Atk based on level 5.
- Increases factor weight of CON in skill formula from 2 to 3.

* Rose Blossom
- Reduces variable casting time from 2 seconds to 1 second.
- Increases cooldown from 0.5 seconds to 0.7 seconds.
- Reduces SP consumption from 125 to 94 based on level 5.
- Increases damage from 3750%/1750%(area damage)Atk to 11200%/15250%(area damage)Atk based on level 5.
- Increases factor weight of CON in skill formula from 3/2(area damage) to 3/3(area damage).

Checked against https://github.com/rathena/rathena/pull/7024
Credit to @datawulf for Metallic Fury update
Atemo 1 年之前
父节点
当前提交
eadfa053f6
共有 4 个文件被更改,包括 94 次插入57 次删除
  1. 25 35
      db/re/skill_db.yml
  2. 27 16
      src/map/battle.cpp
  3. 40 6
      src/map/skill.cpp
  4. 2 0
      src/map/skill.hpp

+ 25 - 35
db/re/skill_db.yml

@@ -40229,20 +40229,20 @@ Body:
     CastTime: 1000
     AfterCastActDelay: 500
     Duration1: 500
-    Cooldown: 500
+    Cooldown: 700
     FixedCastTime: 1000
     Requires:
       SpCost:
         - Level: 1
-          Amount: 105
+          Amount: 70
         - Level: 2
-          Amount: 110
+          Amount: 76
         - Level: 3
-          Amount: 115
+          Amount: 82
         - Level: 4
-          Amount: 120
+          Amount: 88
         - Level: 5
-          Amount: 125
+          Amount: 94
       Weapon:
         Bow: true
         Musical: true
@@ -40299,21 +40299,21 @@ Body:
         Amount: 2
     CastCancel: true
     CastTime: 1000
-    AfterCastActDelay: 500
-    Cooldown: 1000
+    AfterCastActDelay: 350
+    Cooldown: 1150
     FixedCastTime: 1000
     Requires:
       SpCost:
         - Level: 1
-          Amount: 66
+          Amount: 36
         - Level: 2
-          Amount: 72
+          Amount: 40
         - Level: 3
-          Amount: 78
+          Amount: 44
         - Level: 4
-          Amount: 84
+          Amount: 48
         - Level: 5
-          Amount: 90
+          Amount: 52
       Weapon:
         Bow: true
         Musical: true
@@ -40344,31 +40344,21 @@ Body:
         Area: 3
       - Level: 5
         Area: 3
-    GiveAp:
-      - Level: 1
-        Amount: 2
-      - Level: 2
-        Amount: 2
-      - Level: 3
-        Amount: 2
-      - Level: 4
-        Amount: 3
-      - Level: 5
-        Amount: 3
+    GiveAp: 2
     CastCancel: true
-    Cooldown: 500
+    Cooldown: 300
     Requires:
       SpCost:
         - Level: 1
-          Amount: 120
+          Amount: 70
         - Level: 2
-          Amount: 132
+          Amount: 76
         - Level: 3
-          Amount: 144
+          Amount: 82
         - Level: 4
-          Amount: 156
+          Amount: 88
         - Level: 5
-          Amount: 168
+          Amount: 94
       Weapon:
         Musical: true
         Whip: true
@@ -40436,15 +40426,15 @@ Body:
     Requires:
       SpCost:
         - Level: 1
-          Amount: 80
+          Amount: 40
         - Level: 2
-          Amount: 92
+          Amount: 50
         - Level: 3
-          Amount: 104
+          Amount: 60
         - Level: 4
-          Amount: 116
+          Amount: 70
         - Level: 5
-          Amount: 128
+          Amount: 80
       Weapon:
         Musical: true
         Whip: true

+ 27 - 16
src/map/battle.cpp

@@ -5626,46 +5626,57 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
 			RE_LVL_DMOD(100);
 			break;
 		case TR_ROSEBLOSSOM:
-			skillratio += -100 + 750 * skill_lv + (sd ? pc_checkskill(sd, TR_STAGE_MANNER) : 5) * sstatus->con;
+			skillratio += -100 + 200 + 2000 * skill_lv;
+
+			if (sd && pc_checkskill(sd, TR_STAGE_MANNER) > 0)
+				skillratio += 3 * sstatus->con;
 
 			if( tsc != nullptr && tsc->getSCE( SC_SOUNDBLEND ) ){
-				skillratio += 250 * skill_lv;
+				skillratio += 200 * skill_lv;
 			}
 
 			RE_LVL_DMOD(100);
 			if (sc && sc->getSCE(SC_MYSTIC_SYMPHONY)) {
-				skillratio += skillratio * 100 / 100;
+				skillratio *= 2;
 
 				if (tstatus->race == RC_FISH || tstatus->race == RC_DEMIHUMAN)
 					skillratio += skillratio * 50 / 100;
 			}
 			break;
 		case TR_ROSEBLOSSOM_ATK:
-			skillratio += -100 + 350 * skill_lv + (sd ? pc_checkskill(sd, TR_STAGE_MANNER) : 5) * sstatus->con;
+			skillratio += -100 + 250 + 2800 * skill_lv;
+
+			if (sd && pc_checkskill(sd, TR_STAGE_MANNER) > 0)
+				skillratio += 3 * sstatus->con;
 
 			if( tsc != nullptr && tsc->getSCE( SC_SOUNDBLEND ) ){
-				skillratio += 400 * skill_lv;
+				skillratio += 200 * skill_lv;
 			}
 
 			RE_LVL_DMOD(100);
 			if (sc && sc->getSCE(SC_MYSTIC_SYMPHONY)) {
-				skillratio += skillratio * 100 / 100;
+				skillratio *= 2;
 
 				if (tstatus->race == RC_FISH || tstatus->race == RC_DEMIHUMAN)
 					skillratio += skillratio * 50 / 100;
 			}
 			break;
 		case TR_RHYTHMSHOOTING:
-			skillratio += -100 + 120 * skill_lv + (sd ? pc_checkskill(sd, TR_STAGE_MANNER) : 5) * sstatus->con;
+			skillratio += -100 + 200 + 120 * skill_lv;
+
+			if (sd && pc_checkskill(sd, TR_STAGE_MANNER) > 0)
+				skillratio += 3 * sstatus->con;
+
+			if (tsc && tsc->getSCE(SC_SOUNDBLEND))
+				skillratio += 100 + 100 * skill_lv;
+
 			RE_LVL_DMOD(100);
 			if (sc && sc->getSCE(SC_MYSTIC_SYMPHONY)) {
-				skillratio += skillratio * 100 / 100;
+				skillratio *= 2;
 
 				if (tstatus->race == RC_FISH || tstatus->race == RC_DEMIHUMAN)
 					skillratio += skillratio * 50 / 100;
 			}
-			if (tsc && tsc->getSCE(SC_SOUNDBLEND))
-				skillratio += skillratio * 50 / 100;
 			break;
 		case ABR_BATTLE_BUSTER:// Need official formula.
 		case ABR_DUAL_CANNON_FIRE:// Need official formula.
@@ -7172,9 +7183,6 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
 			if (mflag == 2)
 				ad.div_ = 2;
 			break;
-		case TR_METALIC_FURY:// Deals up to 5 additional hits. But what affects the number of hits? [Rytech]
-			ad.div_ = min(ad.div_ + mflag, 5); // Number of hits doesn't go above 5.
-			break;
 		case AG_CRIMSON_ARROW_ATK:
 			if( sc != nullptr && sc->getSCE( SC_CLIMAX ) ){
 				ad.div_ = 2;
@@ -7942,9 +7950,12 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
 						skillratio += -100 + ( 570 + 20 * pc_checkskill( sd, ABC_MAGIC_SWORD_M ) ) * skill_lv + 5 * sstatus->spl;
 						RE_LVL_DMOD(100);
 						break;
-					case TR_METALIC_FURY:
-						skillratio += -100 + 900 * skill_lv + 5 * sstatus->spl;
-						RE_LVL_DMOD(100);
+					case TR_METALIC_FURY: {
+							int area = skill_get_splash(skill_id, skill_lv);
+							int count = map_forcountinarea(skill_check_bl_sc,target->m,target->x - area,target->y - area,target->x + area,target->y + area,5,BL_MOB,SC_SOUNDBLEND);
+							skillratio += -100 + (2200 + 300 * count) * skill_lv + 5 * sstatus->spl;
+							RE_LVL_DMOD(100);
+						}
 						break;
 					case TR_SOUNDBLEND:
 						skillratio += -100 + 120 * skill_lv + 5 * sstatus->spl;

+ 40 - 6
src/map/skill.cpp

@@ -5652,7 +5652,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
 	case BO_ACIDIFIED_ZONE_WIND:
 	case BO_ACIDIFIED_ZONE_FIRE:
 	case TR_ROSEBLOSSOM_ATK:
-	case TR_METALIC_FURY:
 	case ABC_FROM_THE_ABYSS_ATK:
 	case EM_ELEMENTAL_BUSTER_FIRE:
 	case EM_ELEMENTAL_BUSTER_WATER:
@@ -5847,11 +5846,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
 					if (bl->type == BL_PC)// Place single cell AoE if hitting a player.
 						skill_castend_pos2(src, bl->x, bl->y, skill_id, skill_lv, tick, 0);
 					break;
-				case TR_METALIC_FURY:
-					clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);
-					if (tsc && tsc->getSCE(SC_SOUNDBLEND))
-						skill_area_temp[0] = 1 + rnd()%4;
-					break;
 				case MT_RUSH_QUAKE:
 					// Jump to the target before attacking.
 					if( skill_check_unit_movepos( 5, src, bl->x, bl->y, 0, 1 ) ){
@@ -5881,6 +5875,24 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
 			}
 		}
 		break;
+	case TR_METALIC_FURY:
+	{
+		if (flag & 1) {
+			clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);
+			skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, flag);
+		} else {
+			int area = skill_get_splash(skill_id, skill_lv);
+			int count = map_forcountinarea(skill_check_bl_sc,bl->m,bl->x - area,bl->y - area,bl->x + area,bl->y + area,5,BL_MOB,SC_SOUNDBLEND);
+			if (count > 0){
+				map_foreachinarea(skill_area_sub, bl->m, bl->x - area, bl->y - area, bl->x + area, bl->y + area, BL_CHAR,
+					src, skill_id, skill_lv, tick, flag | BCT_ENEMY | SD_SPLASH | 1, skill_castend_damage_id);
+			} else{
+				clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);
+				skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, flag);
+			}
+		}
+	}
+		break;
 
 	//Place units around target
 	case NJ_BAKUENRYU:
@@ -16994,6 +17006,28 @@ static bool skill_check_condition_sc_required(map_session_data *sd, unsigned sho
 	return true;
 }
 
+/**
+* Check SC of BL
+* @param sc
+* @param skill_id
+* @return 1 if condition is met, 0 otherwise
+**/
+
+int skill_check_bl_sc(struct block_list *target, va_list ap) {
+
+	nullpo_ret(target);
+
+	int sc_id = va_arg(ap,int);
+
+	status_change *sc = status_get_sc(target);
+
+	if (sc && sc->getSCE(sc_id))
+		return 1;
+
+	return 0;
+
+}
+
 /** 
  * Check skill condition when cast begin
  * For ammo, only check if the skill need ammo

+ 2 - 0
src/map/skill.hpp

@@ -587,6 +587,8 @@ int skill_vfcastfix(struct block_list *bl, double time, uint16 skill_id, uint16
 #endif
 int skill_delayfix(struct block_list *bl, uint16 skill_id, uint16 skill_lv);
 void skill_toggle_magicpower(struct block_list *bl, uint16 skill_id);
+//Check sc of bl [Muh]
+int skill_check_bl_sc(struct block_list *target, va_list ap);
 
 // Skill conditions check and remove [Inkfish]
 bool skill_check_condition_castbegin(map_session_data *sd, uint16 skill_id, uint16 skill_lv);