From 2cfc2308b3e14ebf162d3e91f5cb6c84d4d95a08 Mon Sep 17 00:00:00 2001 From: panFD Date: Tue, 1 Sep 2026 23:23:53 +0800 Subject: [PATCH] =?UTF-8?q?refactor(monster):=20=E7=BB=9F=E4=B8=80?= =?UTF-8?q?=E6=80=AA=E7=89=A9=E4=B8=8E=E8=8B=B1=E9=9B=84=E7=9A=84=E6=95=B0?= =?UTF-8?q?=E5=80=BC=E8=AE=BE=E5=AE=9A=E4=BD=93=E7=B3=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 重构怪物配置,使用HERO_ROLE_BASE作为基础属性基准,通过card_lv应用品质系数 2. 新增怪物设计原则文档,明确数值平衡与成长逻辑 3. 修复Mon.ts中怪物属性计算,适配新的品质缩放规则与12级职业属性加成 4. 更新UI预制体的属性图标与文字显示,适配新的属性展示逻辑 --- assets/resources/gui/element/heros.prefab | 96 +++++++++---------- assets/script/game/common/config/heroSet.ts | 51 +++++----- .../script/game/common/config/英雄设计指引.md | 10 ++ assets/script/game/hero/Mon.ts | 19 +++- 4 files changed, 96 insertions(+), 80 deletions(-) diff --git a/assets/resources/gui/element/heros.prefab b/assets/resources/gui/element/heros.prefab index 52b19a5b..e29fef73 100644 --- a/assets/resources/gui/element/heros.prefab +++ b/assets/resources/gui/element/heros.prefab @@ -7161,8 +7161,8 @@ }, "_contentSize": { "__type__": "cc.Size", - "width": 30, - "height": 30 + "width": 35, + "height": 35 }, "_anchorPoint": { "__type__": "cc.Vec2", @@ -7198,7 +7198,7 @@ "a": 255 }, "_spriteFrame": { - "__uuid__": "cb93c900-b440-4571-91d1-7da1636e3d73@a8a88", + "__uuid__": "cb93c900-b440-4571-91d1-7da1636e3d73@c6c69", "__expectedType__": "cc.SpriteFrame" }, "_type": 0, @@ -7354,7 +7354,7 @@ }, "_contentSize": { "__type__": "cc.Size", - "width": 49.576171875, + "width": 44, "height": 41.8 }, "_anchorPoint": { @@ -7385,12 +7385,12 @@ "_dstBlendFactor": 4, "_color": { "__type__": "cc.Color", - "r": 202, - "g": 202, - "b": 202, + "r": 194, + "g": 194, + "b": 194, "a": 255 }, - "_string": "label", + "_string": "攻速", "_horizontalAlign": 0, "_verticalAlign": 1, "_actualFontSize": 20, @@ -7410,9 +7410,9 @@ "_enableOutline": true, "_outlineColor": { "__type__": "cc.Color", - "r": 0, - "g": 0, - "b": 0, + "r": 41, + "g": 41, + "b": 41, "a": 255 }, "_outlineWidth": 2, @@ -8168,8 +8168,8 @@ }, "_contentSize": { "__type__": "cc.Size", - "width": 30, - "height": 30 + "width": 35, + "height": 35 }, "_anchorPoint": { "__type__": "cc.Vec2", @@ -8205,7 +8205,7 @@ "a": 255 }, "_spriteFrame": { - "__uuid__": "cb93c900-b440-4571-91d1-7da1636e3d73@a8a88", + "__uuid__": "cb93c900-b440-4571-91d1-7da1636e3d73@3e14b", "__expectedType__": "cc.SpriteFrame" }, "_type": 0, @@ -8361,7 +8361,7 @@ }, "_contentSize": { "__type__": "cc.Size", - "width": 49.576171875, + "width": 44, "height": 41.8 }, "_anchorPoint": { @@ -8392,12 +8392,12 @@ "_dstBlendFactor": 4, "_color": { "__type__": "cc.Color", - "r": 202, - "g": 202, - "b": 202, + "r": 194, + "g": 194, + "b": 194, "a": 255 }, - "_string": "label", + "_string": "攻击", "_horizontalAlign": 0, "_verticalAlign": 1, "_actualFontSize": 20, @@ -8417,9 +8417,9 @@ "_enableOutline": true, "_outlineColor": { "__type__": "cc.Color", - "r": 0, - "g": 0, - "b": 0, + "r": 41, + "g": 41, + "b": 41, "a": 255 }, "_outlineWidth": 2, @@ -9175,8 +9175,8 @@ }, "_contentSize": { "__type__": "cc.Size", - "width": 30, - "height": 30 + "width": 35, + "height": 35 }, "_anchorPoint": { "__type__": "cc.Vec2", @@ -9212,7 +9212,7 @@ "a": 255 }, "_spriteFrame": { - "__uuid__": "cb93c900-b440-4571-91d1-7da1636e3d73@a8a88", + "__uuid__": "cb93c900-b440-4571-91d1-7da1636e3d73@08dd6", "__expectedType__": "cc.SpriteFrame" }, "_type": 0, @@ -9368,7 +9368,7 @@ }, "_contentSize": { "__type__": "cc.Size", - "width": 49.576171875, + "width": 44, "height": 41.8 }, "_anchorPoint": { @@ -9399,12 +9399,12 @@ "_dstBlendFactor": 4, "_color": { "__type__": "cc.Color", - "r": 202, - "g": 202, - "b": 202, + "r": 194, + "g": 194, + "b": 194, "a": 255 }, - "_string": "label", + "_string": "生命", "_horizontalAlign": 0, "_verticalAlign": 1, "_actualFontSize": 20, @@ -9424,9 +9424,9 @@ "_enableOutline": true, "_outlineColor": { "__type__": "cc.Color", - "r": 0, - "g": 0, - "b": 0, + "r": 41, + "g": 41, + "b": 41, "a": 255 }, "_outlineWidth": 2, @@ -10182,8 +10182,8 @@ }, "_contentSize": { "__type__": "cc.Size", - "width": 30, - "height": 30 + "width": 35, + "height": 35 }, "_anchorPoint": { "__type__": "cc.Vec2", @@ -10219,7 +10219,7 @@ "a": 255 }, "_spriteFrame": { - "__uuid__": "cb93c900-b440-4571-91d1-7da1636e3d73@a8a88", + "__uuid__": "cb93c900-b440-4571-91d1-7da1636e3d73@b4af4", "__expectedType__": "cc.SpriteFrame" }, "_type": 0, @@ -10375,7 +10375,7 @@ }, "_contentSize": { "__type__": "cc.Size", - "width": 49.576171875, + "width": 44, "height": 41.8 }, "_anchorPoint": { @@ -10406,12 +10406,12 @@ "_dstBlendFactor": 4, "_color": { "__type__": "cc.Color", - "r": 202, - "g": 202, - "b": 202, + "r": 194, + "g": 194, + "b": 194, "a": 255 }, - "_string": "label", + "_string": "防御", "_horizontalAlign": 0, "_verticalAlign": 1, "_actualFontSize": 20, @@ -10431,9 +10431,9 @@ "_enableOutline": true, "_outlineColor": { "__type__": "cc.Color", - "r": 0, - "g": 0, - "b": 0, + "r": 41, + "g": 41, + "b": 41, "a": 255 }, "_outlineWidth": 2, @@ -12730,7 +12730,7 @@ }, "_lpos": { "__type__": "cc.Vec3", - "x": 25, + "x": 40, "y": 0, "z": 0 }, @@ -12880,7 +12880,7 @@ }, "_contentSize": { "__type__": "cc.Size", - "width": 144.36865234375, + "width": 174.36865234375, "height": 30 }, "_anchorPoint": { @@ -13621,7 +13621,7 @@ ], "value": { "__type__": "cc.Vec3", - "x": 25, + "x": 40, "y": 0, "z": 0 } @@ -13642,7 +13642,7 @@ ], "value": { "__type__": "cc.Size", - "width": 144.36865234375, + "width": 174.36865234375, "height": 30 } }, diff --git a/assets/script/game/common/config/heroSet.ts b/assets/script/game/common/config/heroSet.ts index 5b7fdce9..9a97a8d4 100644 --- a/assets/script/game/common/config/heroSet.ts +++ b/assets/script/game/common/config/heroSet.ts @@ -1,4 +1,4 @@ -import { v3 } from "cc" +import { v3 } from "cc" import { BoxSet, FacSet, FightSet } from "./GameSet" import { SkillOverrides, TGroup, SkillSet, FieldSkillSet, SkillConfig, SkillKind, FieldSkillConfig, FieldSkillType, mergeSkillParams } from "./SkillSet" import { BuffList, BuffConfig, ModOp } from "./BuffSet" @@ -736,77 +736,74 @@ export const HeroInfo: Record = { /* *=============怪物配置列表================ - * 性能基准:1 级怪物与 1 级英雄单体性能持平 —— - * 近战怪基准 hp300/ap22/cd1.20,远程怪基准 hp160/ap28/cd1.20, - * 重型/Boss 以更高 hp 换取更低 DPS,承担"墙"与"压场"定位。 + * 怪物与英雄采用同一套设定体系:基础值 = HERO_ROLE_BASE[role],品质(card_lv) + * 相邻基础属性差 5%,成长系数走 HERO_GROW_COEF[grow_type]。 * 怪物普攻统一使用 SkillSet 基础单体攻击(6001~6012 段), * 并通过 overrides.ap=100 显式声明伤害为攻击力的 100%。 - * 运行时最终属性 = 本表基础值 × RogueConfig.MON_HP_MUL / MON_AP_MUL - * (Boss 额外 × BOSS_HP_BONUS_MUL),校准目标:整场战斗双方对砍 ≈ 30s。 + * 怪物按等级成长由后续肉鸽配置驱动,当前配置承担"职业基准 + 品质差异"的静态表达。 */ // 基础怪物 (全部固定点位站桩攻击,HType仅决定是前排还是后排) - // 前排怪物 — 近战镜像 1 级英雄基准(hp300/ap22/cd1.20),变体微分定位 + // 前排怪物 — 战士系基准(Warrior 模板),变体按品质微分定位 6001: { - uuid: 6001, name: "兽人战士", path: "m1", fac: FacSet.MON, lv: 1, type: HType.Melee, monType: MonType.Melee, hp: 300, ap: 22, def: 20, speed: 70, - skills: { 6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: { ap: 100 } } }, info: "基础前排怪, 与1级近战英雄持平" + uuid: 6001, name: "兽人战士", path: "m1", fac: FacSet.MON, lv: 1, card_lv: 1, type: HType.Melee, grow_type: HGrowType.Warrior, role: HRole.Warrior, monType: MonType.Melee, hp: HERO_ROLE_BASE[HRole.Warrior].hp, ap: HERO_ROLE_BASE[HRole.Warrior].ap, def: HERO_ROLE_BASE[HRole.Warrior].def, speed: 70, + skills: { 6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: { ap: 100 } } }, info: "基础前排怪, 战士系基准" }, 6002: { - uuid: 6002, name: "兽人精锐战士", path: "m2", fac: FacSet.MON, lv: 1, type: HType.Melee, monType: MonType.Melee, hp: 340, ap: 26, def: 25, speed: 110, - skills: { 6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0 } }, info: "进阶前排怪, 更快更痛" + uuid: 6002, name: "兽人精锐战士", path: "m2", fac: FacSet.MON, lv: 1, card_lv: 2, type: HType.Melee, grow_type: HGrowType.Warrior, role: HRole.Warrior, monType: MonType.Melee, hp: HERO_ROLE_BASE[HRole.Warrior].hp, ap: HERO_ROLE_BASE[HRole.Warrior].ap, def: HERO_ROLE_BASE[HRole.Warrior].def, speed: 110, + skills: { 6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0 } }, info: "进阶前排怪, 品质2更快更痛" }, 6003: { - uuid: 6003, name: "兽人重装兵", path: "m3", fac: FacSet.MON, lv: 1, type: HType.Melee, monType: MonType.Heavy, hp: 800, ap: 14, def: 60, speed: 50, + uuid: 6003, name: "兽人重装兵", path: "m3", fac: FacSet.MON, lv: 1, card_lv: 2, type: HType.Melee, grow_type: HGrowType.Tank, role: HRole.Tank, monType: MonType.Heavy, hp: HERO_ROLE_BASE[HRole.Tank].hp, ap: HERO_ROLE_BASE[HRole.Tank].ap, def: HERO_ROLE_BASE[HRole.Tank].def, speed: 50, skills: { 6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.VerySlow].cd, ccd: 0, overrides: { ap: 100 } } }, info: "重型坦克怪, 高HP低攻承伤位" }, - // 后排怪物 — 远程镜像 1 级法师基准(hp160/ap28/cd1.20),变体微分定位 + // 后排怪物 — 射手/刺客/法系基准,变体按品质微分定位 6004: { - uuid: 6004, name: "兽人射手", path: "m4", fac: FacSet.MON, lv: 1, type: HType.Long, monType: MonType.Long, hp: 160, ap: 28, def: 8, speed: 70, - skills: { 6006: { uuid: 6006, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: { ap: 100 } } }, info: "后排输出怪, 与1级远程英雄持平" + uuid: 6004, name: "兽人射手", path: "m4", fac: FacSet.MON, lv: 1, card_lv: 1, type: HType.Long, grow_type: HGrowType.Archer, role: HRole.Archer, monType: MonType.Long, hp: HERO_ROLE_BASE[HRole.Archer].hp, ap: HERO_ROLE_BASE[HRole.Archer].ap, def: HERO_ROLE_BASE[HRole.Archer].def, speed: 70, + skills: { 6006: { uuid: 6006, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: { ap: 100 } } }, info: "后排输出怪, 射手系基准" }, 6005: { - uuid: 6005, name: "兽人刺客", path: "m5", fac: FacSet.MON, lv: 1, type: HType.Long, monType: MonType.Assassin, hp: 130, ap: 26, def: 5, speed: 130, + uuid: 6005, name: "兽人刺客", path: "m5", fac: FacSet.MON, lv: 1, card_lv: 1, type: HType.Long, grow_type: HGrowType.Assassin, role: HRole.Assassin, monType: MonType.Assassin, hp: HERO_ROLE_BASE[HRole.Assassin].hp, ap: HERO_ROLE_BASE[HRole.Assassin].ap, def: HERO_ROLE_BASE[HRole.Assassin].def, speed: 130, skills: { 6002: { uuid: 6002, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Normal].cd, ccd: 0, overrides: { ap: 100, hit_count: 2 } } }, info: "高攻速低HP刺客" }, // 特殊位怪物 6006: { - uuid: 6006, name: "骷髅领主", path: "m6", fac: FacSet.MON, lv: 1, type: HType.Melee, monType: MonType.MeleeBoss, hp: 900, ap: 20, def: 40, speed: 60, + uuid: 6006, name: "骷髅领主", path: "m6", fac: FacSet.MON, lv: 1, card_lv: 3, type: HType.Melee, grow_type: HGrowType.Tank, role: HRole.Tank, monType: MonType.MeleeBoss, hp: HERO_ROLE_BASE[HRole.Tank].hp, ap: HERO_ROLE_BASE[HRole.Tank].ap, def: HERO_ROLE_BASE[HRole.Tank].def, speed: 60, skills: { 6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.VerySlow].cd, ccd: 0, overrides: { ap: 100 } } }, info: "前排MiniBoss级坦克" }, 6007: { - uuid: 6007, name: "兽人术士", path: "m7", fac: FacSet.MON, lv: 1, type: HType.Long, monType: MonType.Support, hp: 240, ap: 18, def: 10, speed: 70, + uuid: 6007, name: "兽人术士", path: "m7", fac: FacSet.MON, lv: 1, card_lv: 1, type: HType.Long, grow_type: HGrowType.Support, role: HRole.Support, monType: MonType.Support, hp: HERO_ROLE_BASE[HRole.Support].hp, ap: HERO_ROLE_BASE[HRole.Support].ap, def: HERO_ROLE_BASE[HRole.Support].def, speed: 70, skills: { 6009: { uuid: 6009, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: { ap: 100, hit_count: 2 } } }, info: "后排辅助法师怪" }, 6008: { - uuid: 6008, name: "兽人火法", path: "m8", fac: FacSet.MON, lv: 1, type: HType.Long, monType: MonType.Summoner, hp: 220, ap: 24, def: 10, speed: 70, + uuid: 6008, name: "兽人火法", path: "m8", fac: FacSet.MON, lv: 1, card_lv: 1, type: HType.Long, grow_type: HGrowType.Mage, role: HRole.Mage, monType: MonType.Summoner, hp: HERO_ROLE_BASE[HRole.Mage].hp, ap: HERO_ROLE_BASE[HRole.Mage].ap, def: HERO_ROLE_BASE[HRole.Mage].def, speed: 70, skills: { 6010: { uuid: 6010, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: { ap: 100, hit_count: 2 } } }, info: "后排召唤系法师怪" }, - // BOSS怪物 — 本表 hp/ap 仅作外观/技能档位参考,运行时面板由 RogueConfig 的 - // BOSS_BASE_HP / BOSS_BASE_AP(初始英雄 2 倍强度)统一决定,不读取本表数值 + // BOSS怪物 — 与英雄同一套设定(role 模板 + 品质系数),高品质承伤/输出位 6101: { - uuid: 6101, name: "兽人首领-双刀战士", path: "mb1", fac: FacSet.MON, lv: 6, type: HType.Melee, monType: MonType.MeleeBoss, hp: 1200, ap: 24, def: 45, speed: 120, + uuid: 6101, name: "兽人首领-双刀战士", path: "mb1", fac: FacSet.MON, lv: 6, card_lv: 4, type: HType.Melee, grow_type: HGrowType.Warrior, role: HRole.Warrior, monType: MonType.MeleeBoss, hp: HERO_ROLE_BASE[HRole.Warrior].hp, ap: HERO_ROLE_BASE[HRole.Warrior].ap, def: HERO_ROLE_BASE[HRole.Warrior].def, speed: 120, skills: { 6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: { ap: 100 } } }, info: "前排Boss, 攻速型" }, 6102: { - uuid: 6102, name: "兽人首领-斧头战士", path: "mb2", fac: FacSet.MON, lv: 6, type: HType.Melee, monType: MonType.MeleeBoss, hp: 1500, ap: 18, def: 55, speed: 60, + uuid: 6102, name: "兽人首领-斧头战士", path: "mb2", fac: FacSet.MON, lv: 6, card_lv: 5, type: HType.Melee, grow_type: HGrowType.Tank, role: HRole.Tank, monType: MonType.MeleeBoss, hp: HERO_ROLE_BASE[HRole.Tank].hp, ap: HERO_ROLE_BASE[HRole.Tank].ap, def: HERO_ROLE_BASE[HRole.Tank].def, speed: 60, skills: { 6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.VerySlow].cd, ccd: 0, overrides: { ap: 100 } } }, info: "前排Boss, 超高HP" }, 6103: { - uuid: 6103, name: "兽人首领-魔法师", path: "mb3", fac: FacSet.MON, lv: 6, type: HType.Long, monType: MonType.LongBoss, hp: 1000, ap: 28, def: 25, speed: 110, + uuid: 6103, name: "兽人首领-魔法师", path: "mb3", fac: FacSet.MON, lv: 6, card_lv: 4, type: HType.Long, grow_type: HGrowType.Mage, role: HRole.Mage, monType: MonType.LongBoss, hp: HERO_ROLE_BASE[HRole.Mage].hp, ap: HERO_ROLE_BASE[HRole.Mage].ap, def: HERO_ROLE_BASE[HRole.Mage].def, speed: 110, skills: { 6009: { uuid: 6009, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: { ap: 100, hit_count: 2 } } }, info: "后排法系Boss" }, 6104: { - uuid: 6104, name: "兽人首领-射手", path: "mb4", fac: FacSet.MON, lv: 6, type: HType.Long, monType: MonType.LongBoss, hp: 1100, ap: 24, def: 25, speed: 70, + uuid: 6104, name: "兽人首领-射手", path: "mb4", fac: FacSet.MON, lv: 6, card_lv: 4, type: HType.Long, grow_type: HGrowType.Archer, role: HRole.Archer, monType: MonType.LongBoss, hp: HERO_ROLE_BASE[HRole.Archer].hp, ap: HERO_ROLE_BASE[HRole.Archer].ap, def: HERO_ROLE_BASE[HRole.Archer].def, speed: 70, skills: { 6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: { ap: 100 } } }, info: "后排位Boss, 均衡型" }, 6105: { - uuid: 6105, name: "亡灵首领-法师", path: "mb5", fac: FacSet.MON, lv: 6, type: HType.Long, monType: MonType.LongBoss, hp: 1000, ap: 30, def: 20, speed: 110, + uuid: 6105, name: "亡灵首领-法师", path: "mb5", fac: FacSet.MON, lv: 6, card_lv: 5, type: HType.Long, grow_type: HGrowType.Mage, role: HRole.Mage, monType: MonType.LongBoss, hp: HERO_ROLE_BASE[HRole.Mage].hp, ap: HERO_ROLE_BASE[HRole.Mage].ap, def: HERO_ROLE_BASE[HRole.Mage].def, speed: 110, skills: { 6011: { uuid: 6011, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: { ap: 100, hit_count: 2, timed_buff_id: 7002 } } }, info: "后排高AP Boss" }, 6106: { - uuid: 6106, name: "亡灵首领-骑马战士", path: "mb6", fac: FacSet.MON, lv: 6, type: HType.Melee, monType: MonType.MeleeBoss, hp: 1800, ap: 20, def: 60, speed: 130, + uuid: 6106, name: "亡灵首领-骑马战士", path: "mb6", fac: FacSet.MON, lv: 6, card_lv: 5, type: HType.Melee, grow_type: HGrowType.Tank, role: HRole.Tank, monType: MonType.MeleeBoss, hp: HERO_ROLE_BASE[HRole.Tank].hp, ap: HERO_ROLE_BASE[HRole.Tank].ap, def: HERO_ROLE_BASE[HRole.Tank].def, speed: 130, skills: { 6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.VerySlow].cd, ccd: 0, overrides: { ap: 100 } } }, info: "前排终极Boss, 最高HP+高速" }, diff --git a/assets/script/game/common/config/英雄设计指引.md b/assets/script/game/common/config/英雄设计指引.md index 5af627e9..6a561d7b 100644 --- a/assets/script/game/common/config/英雄设计指引.md +++ b/assets/script/game/common/config/英雄设计指引.md @@ -301,6 +301,16 @@ revive[0]:无 > 本批复刻英雄直接占用 5001\~5009 段位(按用户要求从 5001 起连续编号,不遵循 card\_lv 段位规则),已在 [heroSet.ts](./heroSet.ts) 落地。 +## 怪物设计原则 + +怪物与英雄采用同一套设定体系: + +- **基础值与品质**:基础属性取 `HERO_ROLE_BASE[role]`,`card_lv` 决定品质(相邻品质基础属性差 5%,仅作用 lv1 初始 AP/HP/DEF) +- **成长系数**:走 `HERO_GROW_COEF[grow_type]`(含 hp/ap/def),与英雄一致 +- **数值平衡**:怪物与英雄仅通过**品质差异**(`card_lv`)拉开数值,高难波次用更高 `card_lv` 的怪物变体承担压场 +- **Boss**:同体系,通过高 `card_lv`(4/5)实现承伤/输出压制 +- **成长驱动**:怪物按等级成长由后续肉鸽配置驱动;当前配置承担“职业基准 + 品质差异”的静态表达,运行时按品质系数缩放基础值 + ## 配置检查清单 - [ ] `skills` 引用的 uuid 在 SkillSet 中存在,`overrides.ap` 显式写出 diff --git a/assets/script/game/hero/Mon.ts b/assets/script/game/hero/Mon.ts index 4d124489..d2402158 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, resolveReviveByLv, resolveSkillOverrides, HeroDisVal } from "../common/config/heroSet"; +import { HeroInfo, resolveTriggerByLv, resolveReviveByLv, resolveSkillOverrides, HeroDisVal, getHeroQualityCoef, HERO_LV12_SPECIAL_ATTR } from "../common/config/heroSet"; import { HeroAttrsComp } from "./HeroAttrsComp"; import { HeroViewComp } from "./HeroViewComp"; import { MoveComp } from "./MoveComp"; @@ -167,16 +167,25 @@ export class Monster extends ecs.Entity { // 视图层参数:朝向与碰撞阵营 view.scale = scale; view.box_group = BoxSet.MONSTER; - // 模型层参数:身份、阵营、基础数值 + // 模型层参数:身份、阵营、基础数值(基础值按品质系数缩放,与英雄同一套设定) model.hero_uuid = uuid; model.hero_name = hero.name; - model.hp = model.hp_max = hero.hp; - model.ap = hero.ap; + const coef = getHeroQualityCoef(hero.card_lv ?? 1); + model.hp = model.hp_max = Math.round(hero.hp * coef); + model.ap = Math.round(hero.ap * coef); // TODO: 局外升级机制落地后,此处基础值将与存档强化累加重算 - model.defense = hero.def; + model.defense = Math.round(hero.def * coef); model.speed = hero.speed ?? 800; 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); + } // 攻击距离:配置优先;未配置按攻击定位取默认值(近战100 / 中程300 / 远程450) model.dis = hero.dis ?? HeroDisVal[hero.type as HType.Melee | HType.Mid | HType.Long]; model.posIndex = laneIndex;