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),
|
||||
|
||||
@@ -5,7 +5,7 @@ import { smc } from "../common/SingletonModuleComp";
|
||||
import { HeroAttrsComp } from "./HeroAttrsComp";
|
||||
import { HeroViewComp } from "./HeroViewComp";
|
||||
import { BoxSet, FacSet, FightSet, IndexSet } from "../common/config/GameSet";
|
||||
import { HeroInfo, resolveFormationTargetX, resolveTriggerByLv, resolveFieldByLv, resolveSkillOverrides, calcGrowBonus, HeroDisVal, getHeroQualityCoef, getEffectiveStats, HERO_LV12_SPECIAL_LV, HERO_LV12_BASE_LV, HERO_LV12_SPECIAL_ATTR } from "../common/config/heroSet";
|
||||
import { HeroInfo, resolveFormationTargetX, resolveTriggerByLv, resolveFieldByLv, resolveSkillOverrides, calcGrowBonus, HeroDisVal, getHeroQualityCoef } from "../common/config/heroSet";
|
||||
import { GameEvent } from "../common/config/GameEvent";
|
||||
import { SkillTriggerType, HType } from "../common/config/heroSet";
|
||||
import { SkillTriggerHelper } from "./SkillTriggerHelper";
|
||||
@@ -208,15 +208,7 @@ export class Hero extends ecs.Entity {
|
||||
model.defense += Math.round(snapDef * defP / 100);
|
||||
}
|
||||
|
||||
// lv12 职业属性专项:达到 12 级时按职业对单项基础属性 +50%
|
||||
// 基数为 lv11 当前等级有效值(基础 + 成长 + lv9 bonus,不含 lv12 自身),仅英雄生效
|
||||
if (model.fac === FacSet.HERO && hero_lv >= HERO_LV12_SPECIAL_LV && model.role !== undefined) {
|
||||
const lv11 = getEffectiveStats(hero, HERO_LV12_BASE_LV);
|
||||
const attr = HERO_LV12_SPECIAL_ATTR[model.role];
|
||||
if (attr === "def") model.defense += Math.round(lv11.def * 0.5);
|
||||
else if (attr === "hp") { const add = Math.round(lv11.hp * 0.5); model.hp += add; model.hp_max += add; }
|
||||
else if (attr === "ap") model.ap += Math.round(lv11.ap * 0.5);
|
||||
}
|
||||
// lv12 职业专项已移除:单项属性强化统一由 bonus 配置(如 attrs: { ap: 50 })按等级注入
|
||||
|
||||
// 天赋加成层:全局天赋(一阶基础/三阶超强全局)全局生效,职业天赋(二阶专精/三阶超强职业)按 role 过滤(仅英雄生效,怪物跳过)
|
||||
// Why: 放在成长/bonus 之后、光环乘区之后,以基础快照为基数叠加,避免与乘区叠加成乘法膨胀
|
||||
|
||||
@@ -3,7 +3,7 @@ import { oops } from "../../../../extensions/oops-plugin-framework/assets/core/O
|
||||
import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
|
||||
import { smc } from "../common/SingletonModuleComp";
|
||||
import { BoxSet, FacSet, FightSet, IndexSet } from "../common/config/GameSet";
|
||||
import { HeroInfo, resolveTriggerByLv, resolveSkillOverrides, HeroDisVal, getHeroQualityCoef, HERO_LV12_SPECIAL_ATTR } from "../common/config/heroSet";
|
||||
import { HeroInfo, resolveTriggerByLv, resolveSkillOverrides, HeroDisVal, getHeroQualityCoef } from "../common/config/heroSet";
|
||||
import { HeroAttrsComp } from "./HeroAttrsComp";
|
||||
import { HeroViewComp } from "./HeroViewComp";
|
||||
import { MoveComp } from "./MoveComp";
|
||||
@@ -181,14 +181,7 @@ export class Monster extends ecs.Entity {
|
||||
model.accuracy = hero.accuracy ?? FightSet.DEFAULT_ACCURACY;
|
||||
model.type = hero.type;
|
||||
model.fac = FacSet.MON;
|
||||
// lv12 职业属性专项:按 11 级当前有效值追加 50%(怪物无局内升级,初始超档直接补齐)
|
||||
if (mon_lv >= 12 && hero.role) {
|
||||
const sp = HERO_LV12_SPECIAL_ATTR[hero.role];
|
||||
// 怪物成长由 RogueConfig 按系数全局缩放,lv11 有效值此处按品质系数后的基础值近似
|
||||
if (sp === "ap") model.ap = Math.round(model.ap * 1.5);
|
||||
else if (sp === "hp") { model.hp = Math.round(model.hp * 1.5); model.hp_max = model.hp; }
|
||||
else model.defense = Math.round(model.defense * 1.5);
|
||||
}
|
||||
// lv12 职业专项已移除:怪物单项强化由 RogueConfig 系数或 bonus 配置接管
|
||||
// 攻击距离:配置优先;未配置按攻击定位取默认值(近战100 / 中程300 / 远程450)
|
||||
model.dis = hero.dis ?? HeroDisVal[hero.type as HType.Melee | HType.Mid | HType.Long];
|
||||
model.posIndex = laneIndex;
|
||||
|
||||
@@ -54,7 +54,7 @@ import { MissSkillsComp } from "./MissSkillsComp";
|
||||
import { oops } from "db://oops-framework/core/Oops";
|
||||
import { HeroAttrsComp } from "../hero/HeroAttrsComp";
|
||||
import { smc } from "../common/SingletonModuleComp";
|
||||
import { HeroInfo, HType, resolveTriggerByLv, resolveFieldByLv, resolveSkillOverrides, calcGrowBonus, getHeroQualityCoef, getEffectiveStats, HERO_LV12_SPECIAL_LV, HERO_LV12_BASE_LV, HERO_LV12_SPECIAL_ATTR } from "../common/config/heroSet";
|
||||
import { HeroInfo, HType, resolveTriggerByLv, resolveFieldByLv, resolveSkillOverrides, calcGrowBonus, getHeroQualityCoef } from "../common/config/heroSet";
|
||||
import { applyTalentBonuses } from "../common/config/TalentSet";
|
||||
import { HeroViewComp } from "../hero/HeroViewComp";
|
||||
import { FacSet, FightSet } from "../common/config/GameSet";
|
||||
@@ -2200,14 +2200,7 @@ export class MissionCardComp extends CCComp {
|
||||
bonusPara += e.attrs.para ?? 0;
|
||||
}
|
||||
}
|
||||
// lv12 职业属性专项:达到 12 级时按职业对单项基础属性 +50%(基数为 lv11 有效值)
|
||||
if (nextLv >= HERO_LV12_SPECIAL_LV && model.role !== undefined) {
|
||||
const lv11 = getEffectiveStats(hero, HERO_LV12_BASE_LV);
|
||||
const attr = HERO_LV12_SPECIAL_ATTR[model.role];
|
||||
if (attr === "def") base_def += Math.round(lv11.def * 0.5);
|
||||
else if (attr === "hp") model.hp_max += Math.round(lv11.hp * 0.5);
|
||||
else if (attr === "ap") model.ap += Math.round(lv11.ap * 0.5);
|
||||
}
|
||||
// lv12 职业专项已移除:单项强化统一由 bonus 配置按等级注入
|
||||
model.defense = base_def;
|
||||
model.critical = bonusCrt;
|
||||
model.critical_damage = 0;
|
||||
|
||||
Reference in New Issue
Block a user