refactor: 移除lv12职业专项属性机制,改用bonus配置接管
1. 从heroSet.ts中删除HERO_LV12_SPECIAL_ATTR等相关常量和计算逻辑 2. 移除各业务代码中基于lv12专项的属性加成逻辑 3. 更新文档说明与英雄配置,将职业专项加成改为lv12级bonus配置 4. 同步更新服务器端英雄数据配置示例
This commit is contained in:
@@ -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),
|
||||
|
||||
Reference in New Issue
Block a user