refactor(monster): 统一怪物与英雄的数值设定体系

1. 重构怪物配置,使用HERO_ROLE_BASE作为基础属性基准,通过card_lv应用品质系数
2. 新增怪物设计原则文档,明确数值平衡与成长逻辑
3. 修复Mon.ts中怪物属性计算,适配新的品质缩放规则与12级职业属性加成
4. 更新UI预制体的属性图标与文字显示,适配新的属性展示逻辑
This commit is contained in:
panFD
2026-09-01 23:23:53 +08:00
parent f08b0794fd
commit 2cfc2308b3
4 changed files with 96 additions and 80 deletions

View File

@@ -7161,8 +7161,8 @@
}, },
"_contentSize": { "_contentSize": {
"__type__": "cc.Size", "__type__": "cc.Size",
"width": 30, "width": 35,
"height": 30 "height": 35
}, },
"_anchorPoint": { "_anchorPoint": {
"__type__": "cc.Vec2", "__type__": "cc.Vec2",
@@ -7198,7 +7198,7 @@
"a": 255 "a": 255
}, },
"_spriteFrame": { "_spriteFrame": {
"__uuid__": "cb93c900-b440-4571-91d1-7da1636e3d73@a8a88", "__uuid__": "cb93c900-b440-4571-91d1-7da1636e3d73@c6c69",
"__expectedType__": "cc.SpriteFrame" "__expectedType__": "cc.SpriteFrame"
}, },
"_type": 0, "_type": 0,
@@ -7354,7 +7354,7 @@
}, },
"_contentSize": { "_contentSize": {
"__type__": "cc.Size", "__type__": "cc.Size",
"width": 49.576171875, "width": 44,
"height": 41.8 "height": 41.8
}, },
"_anchorPoint": { "_anchorPoint": {
@@ -7385,12 +7385,12 @@
"_dstBlendFactor": 4, "_dstBlendFactor": 4,
"_color": { "_color": {
"__type__": "cc.Color", "__type__": "cc.Color",
"r": 202, "r": 194,
"g": 202, "g": 194,
"b": 202, "b": 194,
"a": 255 "a": 255
}, },
"_string": "label", "_string": "攻速",
"_horizontalAlign": 0, "_horizontalAlign": 0,
"_verticalAlign": 1, "_verticalAlign": 1,
"_actualFontSize": 20, "_actualFontSize": 20,
@@ -7410,9 +7410,9 @@
"_enableOutline": true, "_enableOutline": true,
"_outlineColor": { "_outlineColor": {
"__type__": "cc.Color", "__type__": "cc.Color",
"r": 0, "r": 41,
"g": 0, "g": 41,
"b": 0, "b": 41,
"a": 255 "a": 255
}, },
"_outlineWidth": 2, "_outlineWidth": 2,
@@ -8168,8 +8168,8 @@
}, },
"_contentSize": { "_contentSize": {
"__type__": "cc.Size", "__type__": "cc.Size",
"width": 30, "width": 35,
"height": 30 "height": 35
}, },
"_anchorPoint": { "_anchorPoint": {
"__type__": "cc.Vec2", "__type__": "cc.Vec2",
@@ -8205,7 +8205,7 @@
"a": 255 "a": 255
}, },
"_spriteFrame": { "_spriteFrame": {
"__uuid__": "cb93c900-b440-4571-91d1-7da1636e3d73@a8a88", "__uuid__": "cb93c900-b440-4571-91d1-7da1636e3d73@3e14b",
"__expectedType__": "cc.SpriteFrame" "__expectedType__": "cc.SpriteFrame"
}, },
"_type": 0, "_type": 0,
@@ -8361,7 +8361,7 @@
}, },
"_contentSize": { "_contentSize": {
"__type__": "cc.Size", "__type__": "cc.Size",
"width": 49.576171875, "width": 44,
"height": 41.8 "height": 41.8
}, },
"_anchorPoint": { "_anchorPoint": {
@@ -8392,12 +8392,12 @@
"_dstBlendFactor": 4, "_dstBlendFactor": 4,
"_color": { "_color": {
"__type__": "cc.Color", "__type__": "cc.Color",
"r": 202, "r": 194,
"g": 202, "g": 194,
"b": 202, "b": 194,
"a": 255 "a": 255
}, },
"_string": "label", "_string": "攻击",
"_horizontalAlign": 0, "_horizontalAlign": 0,
"_verticalAlign": 1, "_verticalAlign": 1,
"_actualFontSize": 20, "_actualFontSize": 20,
@@ -8417,9 +8417,9 @@
"_enableOutline": true, "_enableOutline": true,
"_outlineColor": { "_outlineColor": {
"__type__": "cc.Color", "__type__": "cc.Color",
"r": 0, "r": 41,
"g": 0, "g": 41,
"b": 0, "b": 41,
"a": 255 "a": 255
}, },
"_outlineWidth": 2, "_outlineWidth": 2,
@@ -9175,8 +9175,8 @@
}, },
"_contentSize": { "_contentSize": {
"__type__": "cc.Size", "__type__": "cc.Size",
"width": 30, "width": 35,
"height": 30 "height": 35
}, },
"_anchorPoint": { "_anchorPoint": {
"__type__": "cc.Vec2", "__type__": "cc.Vec2",
@@ -9212,7 +9212,7 @@
"a": 255 "a": 255
}, },
"_spriteFrame": { "_spriteFrame": {
"__uuid__": "cb93c900-b440-4571-91d1-7da1636e3d73@a8a88", "__uuid__": "cb93c900-b440-4571-91d1-7da1636e3d73@08dd6",
"__expectedType__": "cc.SpriteFrame" "__expectedType__": "cc.SpriteFrame"
}, },
"_type": 0, "_type": 0,
@@ -9368,7 +9368,7 @@
}, },
"_contentSize": { "_contentSize": {
"__type__": "cc.Size", "__type__": "cc.Size",
"width": 49.576171875, "width": 44,
"height": 41.8 "height": 41.8
}, },
"_anchorPoint": { "_anchorPoint": {
@@ -9399,12 +9399,12 @@
"_dstBlendFactor": 4, "_dstBlendFactor": 4,
"_color": { "_color": {
"__type__": "cc.Color", "__type__": "cc.Color",
"r": 202, "r": 194,
"g": 202, "g": 194,
"b": 202, "b": 194,
"a": 255 "a": 255
}, },
"_string": "label", "_string": "生命",
"_horizontalAlign": 0, "_horizontalAlign": 0,
"_verticalAlign": 1, "_verticalAlign": 1,
"_actualFontSize": 20, "_actualFontSize": 20,
@@ -9424,9 +9424,9 @@
"_enableOutline": true, "_enableOutline": true,
"_outlineColor": { "_outlineColor": {
"__type__": "cc.Color", "__type__": "cc.Color",
"r": 0, "r": 41,
"g": 0, "g": 41,
"b": 0, "b": 41,
"a": 255 "a": 255
}, },
"_outlineWidth": 2, "_outlineWidth": 2,
@@ -10182,8 +10182,8 @@
}, },
"_contentSize": { "_contentSize": {
"__type__": "cc.Size", "__type__": "cc.Size",
"width": 30, "width": 35,
"height": 30 "height": 35
}, },
"_anchorPoint": { "_anchorPoint": {
"__type__": "cc.Vec2", "__type__": "cc.Vec2",
@@ -10219,7 +10219,7 @@
"a": 255 "a": 255
}, },
"_spriteFrame": { "_spriteFrame": {
"__uuid__": "cb93c900-b440-4571-91d1-7da1636e3d73@a8a88", "__uuid__": "cb93c900-b440-4571-91d1-7da1636e3d73@b4af4",
"__expectedType__": "cc.SpriteFrame" "__expectedType__": "cc.SpriteFrame"
}, },
"_type": 0, "_type": 0,
@@ -10375,7 +10375,7 @@
}, },
"_contentSize": { "_contentSize": {
"__type__": "cc.Size", "__type__": "cc.Size",
"width": 49.576171875, "width": 44,
"height": 41.8 "height": 41.8
}, },
"_anchorPoint": { "_anchorPoint": {
@@ -10406,12 +10406,12 @@
"_dstBlendFactor": 4, "_dstBlendFactor": 4,
"_color": { "_color": {
"__type__": "cc.Color", "__type__": "cc.Color",
"r": 202, "r": 194,
"g": 202, "g": 194,
"b": 202, "b": 194,
"a": 255 "a": 255
}, },
"_string": "label", "_string": "防御",
"_horizontalAlign": 0, "_horizontalAlign": 0,
"_verticalAlign": 1, "_verticalAlign": 1,
"_actualFontSize": 20, "_actualFontSize": 20,
@@ -10431,9 +10431,9 @@
"_enableOutline": true, "_enableOutline": true,
"_outlineColor": { "_outlineColor": {
"__type__": "cc.Color", "__type__": "cc.Color",
"r": 0, "r": 41,
"g": 0, "g": 41,
"b": 0, "b": 41,
"a": 255 "a": 255
}, },
"_outlineWidth": 2, "_outlineWidth": 2,
@@ -12730,7 +12730,7 @@
}, },
"_lpos": { "_lpos": {
"__type__": "cc.Vec3", "__type__": "cc.Vec3",
"x": 25, "x": 40,
"y": 0, "y": 0,
"z": 0 "z": 0
}, },
@@ -12880,7 +12880,7 @@
}, },
"_contentSize": { "_contentSize": {
"__type__": "cc.Size", "__type__": "cc.Size",
"width": 144.36865234375, "width": 174.36865234375,
"height": 30 "height": 30
}, },
"_anchorPoint": { "_anchorPoint": {
@@ -13621,7 +13621,7 @@
], ],
"value": { "value": {
"__type__": "cc.Vec3", "__type__": "cc.Vec3",
"x": 25, "x": 40,
"y": 0, "y": 0,
"z": 0 "z": 0
} }
@@ -13642,7 +13642,7 @@
], ],
"value": { "value": {
"__type__": "cc.Size", "__type__": "cc.Size",
"width": 144.36865234375, "width": 174.36865234375,
"height": 30 "height": 30
} }
}, },

View File

@@ -1,4 +1,4 @@
import { v3 } from "cc" import { v3 } from "cc"
import { BoxSet, FacSet, FightSet } from "./GameSet" import { BoxSet, FacSet, FightSet } from "./GameSet"
import { SkillOverrides, TGroup, SkillSet, FieldSkillSet, SkillConfig, SkillKind, FieldSkillConfig, FieldSkillType, mergeSkillParams } from "./SkillSet" import { SkillOverrides, TGroup, SkillSet, FieldSkillSet, SkillConfig, SkillKind, FieldSkillConfig, FieldSkillType, mergeSkillParams } from "./SkillSet"
import { BuffList, BuffConfig, ModOp } from "./BuffSet" import { BuffList, BuffConfig, ModOp } from "./BuffSet"
@@ -736,77 +736,74 @@ export const HeroInfo: Record<number, heroInfo> = {
/* /*
*=============怪物配置列表================ *=============怪物配置列表================
* 性能基准:1 级怪物与 1 级英雄单体性能持平 —— * 怪物与英雄采用同一套设定体系:基础值 = HERO_ROLE_BASE[role],品质(card_lv)
* 近战怪基准 hp300/ap22/cd1.20,远程怪基准 hp160/ap28/cd1.20, * 相邻基础属性差 5%,成长系数走 HERO_GROW_COEF[grow_type]。
* 重型/Boss 以更高 hp 换取更低 DPS,承担"墙"与"压场"定位。
* 怪物普攻统一使用 SkillSet 基础单体攻击(6001~6012 段), * 怪物普攻统一使用 SkillSet 基础单体攻击(6001~6012 段),
* 并通过 overrides.ap=100 显式声明伤害为攻击力的 100%。 * 并通过 overrides.ap=100 显式声明伤害为攻击力的 100%。
* 运行时最终属性 = 本表基础值 × RogueConfig.MON_HP_MUL / MON_AP_MUL * 怪物按等级成长由后续肉鸽配置驱动,当前配置承担"职业基准 + 品质差异"的静态表达。
* (Boss 额外 × BOSS_HP_BONUS_MUL),校准目标:整场战斗双方对砍 ≈ 30s。
*/ */
// 基础怪物 (全部固定点位站桩攻击,HType仅决定是前排还是后排) // 基础怪物 (全部固定点位站桩攻击,HType仅决定是前排还是后排)
// 前排怪物 — 近战镜像 1 级英雄基准(hp300/ap22/cd1.20),变体微分定位 // 前排怪物 — 战士系基准(Warrior 模板),变体按品质微分定位
6001: { 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, 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: "基础前排怪, 与1级近战英雄持平" skills: { 6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: { ap: 100 } } }, info: "基础前排怪, 战士系基准"
}, },
6002: { 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, 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: "进阶前排怪, 更快更痛" skills: { 6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0 } }, info: "进阶前排怪, 品质2更快更痛"
}, },
6003: { 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低攻承伤位" skills: { 6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.VerySlow].cd, ccd: 0, overrides: { ap: 100 } } }, info: "重型坦克怪, 高HP低攻承伤位"
}, },
// 后排怪物 — 远程镜像 1 级法师基准(hp160/ap28/cd1.20),变体微分定位 // 后排怪物 — 射手/刺客/法系基准,变体按品质微分定位
6004: { 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, 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: "后排输出怪, 与1级远程英雄持平" skills: { 6006: { uuid: 6006, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: { ap: 100 } } }, info: "后排输出怪, 射手系基准"
}, },
6005: { 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刺客" skills: { 6002: { uuid: 6002, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Normal].cd, ccd: 0, overrides: { ap: 100, hit_count: 2 } } }, info: "高攻速低HP刺客"
}, },
// 特殊位怪物 // 特殊位怪物
6006: { 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级坦克" skills: { 6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.VerySlow].cd, ccd: 0, overrides: { ap: 100 } } }, info: "前排MiniBoss级坦克"
}, },
6007: { 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: "后排辅助法师怪" skills: { 6009: { uuid: 6009, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: { ap: 100, hit_count: 2 } } }, info: "后排辅助法师怪"
}, },
6008: { 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: "后排召唤系法师怪" 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怪物 — 与英雄同一套设定(role 模板 + 品质系数),高品质承伤/输出位
// BOSS_BASE_HP / BOSS_BASE_AP(初始英雄 2 倍强度)统一决定,不读取本表数值
6101: { 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, 攻速型" skills: { 6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: { ap: 100 } } }, info: "前排Boss, 攻速型"
}, },
6102: { 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" skills: { 6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.VerySlow].cd, ccd: 0, overrides: { ap: 100 } } }, info: "前排Boss, 超高HP"
}, },
6103: { 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" skills: { 6009: { uuid: 6009, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: { ap: 100, hit_count: 2 } } }, info: "后排法系Boss"
}, },
6104: { 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, 均衡型" skills: { 6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: { ap: 100 } } }, info: "后排位Boss, 均衡型"
}, },
6105: { 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" 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: { 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+高速" skills: { 6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.VerySlow].cd, ccd: 0, overrides: { ap: 100 } } }, info: "前排终极Boss, 最高HP+高速"
}, },

View File

@@ -301,6 +301,16 @@ revive[0]:无
> 本批复刻英雄直接占用 5001\~5009 段位(按用户要求从 5001 起连续编号,不遵循 card\_lv 段位规则),已在 [heroSet.ts](./heroSet.ts) 落地。 > 本批复刻英雄直接占用 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` 显式写出 - [ ] `skills` 引用的 uuid 在 SkillSet 中存在,`overrides.ap` 显式写出

View File

@@ -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 { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
import { smc } from "../common/SingletonModuleComp"; import { smc } from "../common/SingletonModuleComp";
import { BoxSet, FacSet, FightSet, IndexSet } from "../common/config/GameSet"; 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 { HeroAttrsComp } from "./HeroAttrsComp";
import { HeroViewComp } from "./HeroViewComp"; import { HeroViewComp } from "./HeroViewComp";
import { MoveComp } from "./MoveComp"; import { MoveComp } from "./MoveComp";
@@ -167,16 +167,25 @@ export class Monster extends ecs.Entity {
// 视图层参数:朝向与碰撞阵营 // 视图层参数:朝向与碰撞阵营
view.scale = scale; view.scale = scale;
view.box_group = BoxSet.MONSTER; view.box_group = BoxSet.MONSTER;
// 模型层参数:身份、阵营、基础数值 // 模型层参数:身份、阵营、基础数值(基础值按品质系数缩放,与英雄同一套设定)
model.hero_uuid = uuid; model.hero_uuid = uuid;
model.hero_name = hero.name; model.hero_name = hero.name;
model.hp = model.hp_max = hero.hp; const coef = getHeroQualityCoef(hero.card_lv ?? 1);
model.ap = hero.ap; model.hp = model.hp_max = Math.round(hero.hp * coef);
model.ap = Math.round(hero.ap * coef);
// TODO: 局外升级机制落地后,此处基础值将与存档强化累加重算 // TODO: 局外升级机制落地后,此处基础值将与存档强化累加重算
model.defense = hero.def; model.defense = Math.round(hero.def * coef);
model.speed = hero.speed ?? 800; model.speed = hero.speed ?? 800;
model.type = hero.type; model.type = hero.type;
model.fac = FacSet.MON; 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) // 攻击距离:配置优先;未配置按攻击定位取默认值(近战100 / 中程300 / 远程450)
model.dis = hero.dis ?? HeroDisVal[hero.type as HType.Melee | HType.Mid | HType.Long]; model.dis = hero.dis ?? HeroDisVal[hero.type as HType.Melee | HType.Mid | HType.Long];
model.posIndex = laneIndex; model.posIndex = laneIndex;