refactor: 移除lv12职业专项属性机制,改用bonus配置接管

1.  从heroSet.ts中删除HERO_LV12_SPECIAL_ATTR等相关常量和计算逻辑
2.  移除各业务代码中基于lv12专项的属性加成逻辑
3.  更新文档说明与英雄配置,将职业专项加成改为lv12级bonus配置
4.  同步更新服务器端英雄数据配置示例
This commit is contained in:
panFD
2026-09-07 23:21:56 +08:00
parent ed738d2e30
commit 771b0aad26
7 changed files with 141 additions and 126 deletions

View File

@@ -129,17 +129,11 @@ export function getHeroQualityCoef(rarity: number): number {
}
/**
* lv12 职业属性专项:英雄等级达到 12 级时,按职业对单项基础属性 +50%。
* 基数为 lv11 当前等级有效值(基础 + 成长 + lv9 bonus,不含 lv12 自身)。
* Why: 坦克堆防、战士/辅助堆血、输出位堆攻,强化职业特色。
* lv12 职业属性专项已移除:单项属性强化统一由英雄配置的 bonus 档位注入
* (如 { lv: 12, attrs: { ap: 50 } }),机制与展示口径保持一致。
*/
export const HERO_LV12_SPECIAL_LV = 12;
/** lv12 专项提升的档位等级(基数取 LV12 - 1 = 11 级有效值) */
export const HERO_LV12_BASE_LV = HERO_LV12_SPECIAL_LV - 1;
/**
* 英雄位置类型(职业定位)。
/** 英雄位置类型(职业定位)。
* Why: grow_type 仅驱动数值成长曲线,无法表达"这个英雄在阵容里干什么";
* role 面向 UI 展示与阵容推荐(如 HeroComboSet 的铁三角校验),与成长解耦。
*/
@@ -161,15 +155,7 @@ export const HRoleName: Record<HRole, string> = {
[HRole.Support]: "辅助",
};
/** lv12 各职业专项属性映射(坦克堆防、战士/辅助堆血、输出位堆攻) */
export const HERO_LV12_SPECIAL_ATTR: Record<HRole, "def" | "hp" | "ap"> = {
[HRole.Tank]: "def",
[HRole.Warrior]: "hp",
[HRole.Assassin]: "ap",
[HRole.Archer]: "ap",
[HRole.Mage]: "ap",
[HRole.Support]: "hp",
};
/** lv12 职业专项已移除:单项强化由 bonus 配置接管,此处不再保留职业→属性映射 */
/**
* 职业基础属性模板(仅英雄使用,怪物无 role 直接手写 hp/ap/def)。
@@ -1130,34 +1116,16 @@ export function getEffectiveStats(hero: heroInfo, targetLv: number): { hp: numbe
}
/**
* 计算英雄展示用最终属性(含品质系数与 lv12 职业专项),供 UI 面板与运行时对齐口径。
* 公式:基础值 × 品质系数 + 成长 + bonus,再叠加 lv12 专项(基数取 lv11 有效值)。
* 计算英雄展示用最终属性(含品质系数),供 UI 面板与运行时对齐口径。
* 公式:基础值 × 品质系数 + 成长 + bonus(lv12 专项已移除,由 bonus 配置接管)。
* @param hero 英雄配置
* @param targetLv 目标等级(≥1)
* @returns 含品质与专项的最终 hp/ap/def(已取整)
* @returns 含品质的最终 hp/ap/def(已取整)
*/
export function getHeroDisplayStats(hero: heroInfo, targetLv: number): { hp: number, ap: number, def: number } {
const lv = Math.max(1, Math.floor(targetLv));
const coef = getHeroQualityCoef(hero.rarity ?? 1);
const eff = getEffectiveStats(hero, lv);
const stats = {
hp: Math.round(hero.hp * coef) + (eff.hp - hero.hp),
ap: Math.round(hero.ap * coef) + (eff.ap - hero.ap),
def: Math.round(hero.def * coef) + (eff.def - hero.def),
};
// lv12 职业专项:基数为 lv11 展示有效值
if (lv >= HERO_LV12_SPECIAL_LV && hero.role !== undefined) {
const base11 = getHeroDisplayStatsBase(hero, HERO_LV12_BASE_LV);
const attr = HERO_LV12_SPECIAL_ATTR[hero.role];
stats[attr] += Math.round(base11[attr] * 0.5);
}
return stats;
}
/** 内部:lv12 专项基数(不含 lv12 自身)的展示有效值 */
function getHeroDisplayStatsBase(hero: heroInfo, targetLv: number): { hp: number, ap: number, def: number } {
const coef = getHeroQualityCoef(hero.rarity ?? 1);
const eff = getEffectiveStats(hero, targetLv);
return {
hp: Math.round(hero.hp * coef) + (eff.hp - hero.hp),
ap: Math.round(hero.ap * coef) + (eff.ap - hero.ap),