From 771b0aad26a52ac1fcb72afd8463010ba1233089 Mon Sep 17 00:00:00 2001 From: panFD Date: Mon, 7 Sep 2026 23:21:56 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E7=A7=BB=E9=99=A4lv12=E8=81=8C?= =?UTF-8?q?=E4=B8=9A=E4=B8=93=E9=A1=B9=E5=B1=9E=E6=80=A7=E6=9C=BA=E5=88=B6?= =?UTF-8?q?=EF=BC=8C=E6=94=B9=E7=94=A8bonus=E9=85=8D=E7=BD=AE=E6=8E=A5?= =?UTF-8?q?=E7=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 从heroSet.ts中删除HERO_LV12_SPECIAL_ATTR等相关常量和计算逻辑 2. 移除各业务代码中基于lv12专项的属性加成逻辑 3. 更新文档说明与英雄配置,将职业专项加成改为lv12级bonus配置 4. 同步更新服务器端英雄数据配置示例 --- assets/script/game/common/config/heroSet.ts | 46 +---- assets/script/game/hero/Hero.ts | 12 +- assets/script/game/hero/Mon.ts | 11 +- assets/script/game/map/MissionCardComp.ts | 11 +- put/server/data/heroes.json | 184 ++++++++++++++------ put/server/data/heroes.json编辑指引.md | 2 +- put/server/index.js | 1 - 7 files changed, 141 insertions(+), 126 deletions(-) diff --git a/assets/script/game/common/config/heroSet.ts b/assets/script/game/common/config/heroSet.ts index 7e64c6b3..781e30d0 100644 --- a/assets/script/game/common/config/heroSet.ts +++ b/assets/script/game/common/config/heroSet.ts @@ -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.Support]: "辅助", }; -/** lv12 各职业专项属性映射(坦克堆防、战士/辅助堆血、输出位堆攻) */ -export const HERO_LV12_SPECIAL_ATTR: Record = { - [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), diff --git a/assets/script/game/hero/Hero.ts b/assets/script/game/hero/Hero.ts index a59b7b43..eb99cdc3 100644 --- a/assets/script/game/hero/Hero.ts +++ b/assets/script/game/hero/Hero.ts @@ -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 之后、光环乘区之后,以基础快照为基数叠加,避免与乘区叠加成乘法膨胀 diff --git a/assets/script/game/hero/Mon.ts b/assets/script/game/hero/Mon.ts index 09c82591..44ccbbf7 100644 --- a/assets/script/game/hero/Mon.ts +++ b/assets/script/game/hero/Mon.ts @@ -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; diff --git a/assets/script/game/map/MissionCardComp.ts b/assets/script/game/map/MissionCardComp.ts index 0911206c..5f493859 100644 --- a/assets/script/game/map/MissionCardComp.ts +++ b/assets/script/game/map/MissionCardComp.ts @@ -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; diff --git a/put/server/data/heroes.json b/put/server/data/heroes.json index 7da7257a..27ddd092 100644 --- a/put/server/data/heroes.json +++ b/put/server/data/heroes.json @@ -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 + } + } + ] } ] -} \ No newline at end of file +} diff --git a/put/server/data/heroes.json编辑指引.md b/put/server/data/heroes.json编辑指引.md index 12395f63..445602b2 100644 --- a/put/server/data/heroes.json编辑指引.md +++ b/put/server/data/heroes.json编辑指引.md @@ -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`) | diff --git a/put/server/index.js b/put/server/index.js index 9824fc36..c47e1768 100644 --- a/put/server/index.js +++ b/put/server/index.js @@ -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, }