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;
|
||||
|
||||
@@ -94,10 +94,15 @@
|
||||
"dead": {},
|
||||
"field": [],
|
||||
"revive": [],
|
||||
"ap_bonus": [],
|
||||
"hp_bonus": [],
|
||||
"def_bonus": [],
|
||||
"info": "自身强护盾+群体小护盾,强生存"
|
||||
"info": "自身强护盾+群体小护盾,强生存",
|
||||
"bonus": [
|
||||
{
|
||||
"lv": 12,
|
||||
"attrs": {
|
||||
"def": 50
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"uuid": 5002,
|
||||
@@ -189,10 +194,15 @@
|
||||
"dead": {},
|
||||
"field": [],
|
||||
"revive": [],
|
||||
"ap_bonus": [],
|
||||
"hp_bonus": [],
|
||||
"def_bonus": [],
|
||||
"info": "易伤+风怒,近战 dps"
|
||||
"info": "易伤+风怒,近战 dps",
|
||||
"bonus": [
|
||||
{
|
||||
"lv": 12,
|
||||
"attrs": {
|
||||
"hp": 50
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"uuid": 5003,
|
||||
@@ -281,10 +291,15 @@
|
||||
}
|
||||
],
|
||||
"revive": [],
|
||||
"ap_bonus": [],
|
||||
"hp_bonus": [],
|
||||
"def_bonus": [],
|
||||
"info": "必晕爆发+暴击光环,近战收割"
|
||||
"info": "必晕爆发+暴击光环,近战收割",
|
||||
"bonus": [
|
||||
{
|
||||
"lv": 12,
|
||||
"attrs": {
|
||||
"hp": 50
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"uuid": 5004,
|
||||
@@ -375,10 +390,15 @@
|
||||
}
|
||||
],
|
||||
"revive": [],
|
||||
"ap_bonus": [],
|
||||
"hp_bonus": [],
|
||||
"def_bonus": [],
|
||||
"info": "暴击+暴伤双光环,暴击流刺客"
|
||||
"info": "暴击+暴伤双光环,暴击流刺客",
|
||||
"bonus": [
|
||||
{
|
||||
"lv": 12,
|
||||
"attrs": {
|
||||
"ap": 50
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"uuid": 5005,
|
||||
@@ -470,10 +490,15 @@
|
||||
}
|
||||
],
|
||||
"revive": [],
|
||||
"ap_bonus": [],
|
||||
"hp_bonus": [],
|
||||
"def_bonus": [],
|
||||
"info": "普攻出血+大招群体出血,持续消耗"
|
||||
"info": "普攻出血+大招群体出血,持续消耗",
|
||||
"bonus": [
|
||||
{
|
||||
"lv": 12,
|
||||
"attrs": {
|
||||
"ap": 50
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"uuid": 5006,
|
||||
@@ -563,10 +588,15 @@
|
||||
}
|
||||
],
|
||||
"revive": [],
|
||||
"ap_bonus": [],
|
||||
"hp_bonus": [],
|
||||
"def_bonus": [],
|
||||
"info": "冰冻控场+多重箭,远程控制"
|
||||
"info": "冰冻控场+多重箭,远程控制",
|
||||
"bonus": [
|
||||
{
|
||||
"lv": 12,
|
||||
"attrs": {
|
||||
"ap": 50
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"uuid": 5007,
|
||||
@@ -656,10 +686,15 @@
|
||||
}
|
||||
],
|
||||
"revive": [],
|
||||
"ap_bonus": [],
|
||||
"hp_bonus": [],
|
||||
"def_bonus": [],
|
||||
"info": "烈焰击退+易伤光环,法系压场"
|
||||
"info": "烈焰击退+易伤光环,法系压场",
|
||||
"bonus": [
|
||||
{
|
||||
"lv": 12,
|
||||
"attrs": {
|
||||
"ap": 50
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"uuid": 5008,
|
||||
@@ -746,10 +781,15 @@
|
||||
"dead": {},
|
||||
"field": [],
|
||||
"revive": [],
|
||||
"ap_bonus": [],
|
||||
"hp_bonus": [],
|
||||
"def_bonus": [],
|
||||
"info": "全体治疗+攻击附盾,团队续航"
|
||||
"info": "全体治疗+攻击附盾,团队续航",
|
||||
"bonus": [
|
||||
{
|
||||
"lv": 12,
|
||||
"attrs": {
|
||||
"hp": 50
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"uuid": 5009,
|
||||
@@ -843,10 +883,15 @@
|
||||
"fstart": {},
|
||||
"dead": {},
|
||||
"field": [],
|
||||
"ap_bonus": [],
|
||||
"hp_bonus": [],
|
||||
"def_bonus": [],
|
||||
"info": "受击自疗+击退,自愈坦克"
|
||||
"info": "受击自疗+击退,自愈坦克",
|
||||
"bonus": [
|
||||
{
|
||||
"lv": 12,
|
||||
"attrs": {
|
||||
"def": 50
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"uuid": 5010,
|
||||
@@ -938,10 +983,15 @@
|
||||
"fstart": {},
|
||||
"dead": {},
|
||||
"field": [],
|
||||
"ap_bonus": [],
|
||||
"hp_bonus": [],
|
||||
"def_bonus": [],
|
||||
"info": "万箭齐射+高频击退,远程压制"
|
||||
"info": "万箭齐射+高频击退,远程压制",
|
||||
"bonus": [
|
||||
{
|
||||
"lv": 12,
|
||||
"attrs": {
|
||||
"ap": 50
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"uuid": 5011,
|
||||
@@ -1036,10 +1086,15 @@
|
||||
"fstart": {},
|
||||
"dead": {},
|
||||
"field": [],
|
||||
"ap_bonus": [],
|
||||
"hp_bonus": [],
|
||||
"def_bonus": [],
|
||||
"info": "永久和计时生命最大值,控血大师"
|
||||
"info": "永久和计时生命最大值,控血大师",
|
||||
"bonus": [
|
||||
{
|
||||
"lv": 12,
|
||||
"attrs": {
|
||||
"def": 50
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"uuid": 5012,
|
||||
@@ -1153,10 +1208,15 @@
|
||||
"desc": ""
|
||||
}
|
||||
],
|
||||
"ap_bonus": [],
|
||||
"hp_bonus": [],
|
||||
"def_bonus": [],
|
||||
"info": "普攻 大招加速 buff+加速光环,加速大师"
|
||||
"info": "普攻 大招加速 buff+加速光环,加速大师",
|
||||
"bonus": [
|
||||
{
|
||||
"lv": 12,
|
||||
"attrs": {
|
||||
"ap": 50
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"uuid": 5013,
|
||||
@@ -1255,10 +1315,15 @@
|
||||
},
|
||||
"dead": {},
|
||||
"field": [],
|
||||
"ap_bonus": [],
|
||||
"hp_bonus": [],
|
||||
"def_bonus": [],
|
||||
"info": "大招全体反伤 普攻暴击 暴击反伤辅助"
|
||||
"info": "大招全体反伤 普攻暴击 暴击反伤辅助",
|
||||
"bonus": [
|
||||
{
|
||||
"lv": 12,
|
||||
"attrs": {
|
||||
"hp": 50
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"uuid": 5014,
|
||||
@@ -1355,10 +1420,15 @@
|
||||
"desc": ""
|
||||
}
|
||||
],
|
||||
"ap_bonus": [],
|
||||
"hp_bonus": [],
|
||||
"def_bonus": [],
|
||||
"info": ""
|
||||
"info": "",
|
||||
"bonus": [
|
||||
{
|
||||
"lv": 12,
|
||||
"attrs": {
|
||||
"hp": 50
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
| 技能底座(普攻/大招/辅助,含 kind/TGroup/默认数值) | `assets/script/game/common/config/SkillSet.ts` → `SkillSet` |
|
||||
| 驻场光环底座(类型/图标/元数据) | 同文件 → `FieldSkillSet` |
|
||||
| 计时 buff(timed_buff_id 可用值与效果) | `assets/script/game/common/config/BuffSet.ts` → `BuffList` |
|
||||
| 职业属性模板 / 成长系数 / lv12 专项 | `assets/script/game/common/config/heroSet.ts` → `HERO_ROLE_BASE` / `HERO_GROW_COEF` / `HERO_LV12_SPECIAL_ATTR` |
|
||||
| 职业属性模板 / 成长系数 | `assets/script/game/common/config/heroSet.ts` → `HERO_ROLE_BASE` / `HERO_GROW_COEF`(lv12 专项已移除,单项强化由 `bonus` 配置接管) |
|
||||
| 攻速档位表达式 | 同文件 → `AtkSpeedSet` / `AtkSpeedLv` |
|
||||
| 现有英雄写法样例 | 本 JSON 内 5001~5010 条目 |
|
||||
| 编辑器枚举键(职业/成长/类型/底座映射) | `put/web/src/constants.js`(`HERO_ROLES` / `GROW_TYPES` / `H_TYPES` / `ROLE_ATK_SKILL` / `ROLE_ULT_SKILL` / `SUPPORT_ULT` / `OVERRIDE_KEYS`) |
|
||||
|
||||
@@ -54,7 +54,6 @@ async function buildCache() {
|
||||
BuffList: buff.BuffList,
|
||||
HERO_ROLE_BASE: hero.HERO_ROLE_BASE,
|
||||
HERO_GROW_COEF: hero.HERO_GROW_COEF,
|
||||
HERO_LV12_SPECIAL_ATTR: hero.HERO_LV12_SPECIAL_ATTR,
|
||||
AtkSpeedSet: hero.AtkSpeedSet,
|
||||
HeroDisVal: hero.HeroDisVal,
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user