From 3f73669ba42efb2ce9498e77ed38c67a1594a5c8 Mon Sep 17 00:00:00 2001 From: pan Date: Fri, 12 Jun 2026 16:00:11 +0800 Subject: [PATCH] =?UTF-8?q?feat(rogue=E6=A8=A1=E5=BC=8F):=20=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E5=89=8D=E6=9C=9F=E9=85=8D=E7=BD=AE=E5=B9=B6=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E7=BB=8F=E6=B5=8E=E6=8E=A8=E6=BC=94=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增前20波玩家战力与经济推演估算的详细注释文档,下调各Tier的怪物生成倍率与预算数值,调整所有蓝图模板的怪物生成数量上下限,优化前期游戏体验并平滑开局节奏。 --- assets/script/game/map/RogueConfig.ts | 77 +++++++++++++++++++-------- 1 file changed, 54 insertions(+), 23 deletions(-) diff --git a/assets/script/game/map/RogueConfig.ts b/assets/script/game/map/RogueConfig.ts index dc4645f3..fa46b448 100644 --- a/assets/script/game/map/RogueConfig.ts +++ b/assets/script/game/map/RogueConfig.ts @@ -10,6 +10,37 @@ * GDD: /gdd/rogue-spawning.md */ +/** + * 玩家战力与经济推演估算 (前 20 波) + * 规则:初始 4 金币,每波递增 1 金币,单波基础收益上限 10 金币。基础英雄 3 金币,刷新 1 金币。 + * 合成公式:3个 Lv1 = 1个 Lv2,3个 Lv2 = 1个 Lv3 (满级)。即 1个 Lv3 需要 9 个 Lv1。 + * 注:由于抽卡具有随机性,实际需要消耗部分金币刷新,以下推演假设约 20% 金币用于刷新,80% 用于购买。 + * 6 个坑位满编。 + * + * 波次 | 当波收益 | 累计金币 | 累计购卡数 | 预估阵容 (极限最优) | 预估阵容 (脸黑/平滑型) | 阶段说明 + * ------------------------------------------------------------------------------------------------------------------------- + * W1 | 4 (初始) | 4 | 1 | 1*Lv1 | 1*Lv1 | 初始阶段 + * W2 | 5 | 9 | 2 | 2*Lv1 | 2*Lv1 | 积累英雄 + * W3 | 6 | 15 | 4 | 1*Lv2 + 1*Lv1 | 4*Lv1 | 开始成型 + * W4 | 7 | 22 | 6 | 2*Lv2 | 6*Lv1 | 刚好满编(6坑位) + * W5 | 8 | 30 | 8 | 2*Lv2 + 2*Lv1 | 1*Lv2 + 5*Lv1 | 升阶开启 + * W6 | 9 | 39 | 10 | 1*Lv3 + 1*Lv1 | 2*Lv2 + 4*Lv1 | 首个满级核心出现 + * W7 | 10 | 49 | 13 | 1*Lv3 + 1*Lv2 | 3*Lv2 + 3*Lv1 | 阵型强化 + * W8 | 10(Max) | 59 | 15 | 1*Lv3 + 2*Lv2 | 4*Lv2 + 2*Lv1 | + * W9 | 10 | 69 | 18 | 2*Lv3 | 6*Lv2 | 全员至少 Lv2 + * W10 | 10 | 79 | 21 | 2*Lv3 + 1*Lv2 | 1*Lv3 + 4*Lv2 + 1*Lv1 | (脸黑型开始超出6怪自然合成) + * W11 | 10 | 89 | 23 | 2*Lv3 + 1*Lv2 + 1*Lv1 | 1*Lv3 + 5*Lv2 | + * W12 | 10 | 99 | 26 | 2*Lv3 + 2*Lv2 + 1*Lv1 | 2*Lv3 + 2*Lv2 + 1*Lv1 | 双核心阵型确立 + * W13 | 10 | 109 | 29 | 3*Lv3 + 1*Lv1 | 2*Lv3 + 3*Lv2 + 1*Lv1 | + * W14 | 10 | 119 | 31 | 3*Lv3 + 1*Lv2 + 1*Lv1 | 2*Lv3 + 4*Lv2 | + * W15 | 10 | 129 | 34 | 3*Lv3 + 2*Lv2 + 1*Lv1 | 3*Lv3 + 2*Lv2 | 游戏后期,半数满级 + * W16 | 10 | 139 | 37 | 4*Lv3 + 1*Lv1 | 3*Lv3 + 3*Lv2 | + * W17 | 10 | 149 | 39 | 4*Lv3 + 1*Lv2 | 4*Lv3 + 1*Lv2 | + * W18 | 10 | 159 | 42 | 4*Lv3 + 2*Lv2 | 4*Lv3 + 1*Lv2 + 1*Lv1 | + * W19 | 10 | 169 | 45 | 5*Lv3 | 5*Lv3 | + * W20 | 10 | 179 | 47 | 5*Lv3 + 1*Lv1 | 5*Lv3 + 1*Lv1 | 大成阵型,接近全员满级 + */ + // ======================== 怪物类型枚举 ======================== /** 怪物类型(8 种) */ @@ -252,11 +283,11 @@ const MAJOR_BOSS_TIERS = new Set([3, 5]) * 主线 15 波映射:wave 1-3 → T1, wave 4-6 → T2, ..., wave 13-15 → T5 */ export const TierConfigs: Record = { - 1: { multiplier: 1.0, budget: 200, availableTypes: [MonType.Melee, MonType.Heavy, MonType.Long], isBossTier: false }, - 2: { multiplier: 2.0, budget: 500, availableTypes: [MonType.Melee, MonType.Heavy, MonType.Long, MonType.Support], isBossTier: true }, - 3: { multiplier: 3.5, budget: 1100, availableTypes: [MonType.Melee, MonType.Heavy, MonType.Long, MonType.Support, MonType.Assassin], isBossTier: true }, - 4: { multiplier: 5.5, budget: 2000, availableTypes: [MonType.Melee, MonType.Heavy, MonType.Long, MonType.Support, MonType.Assassin, MonType.Summoner], isBossTier: true }, - 5: { multiplier: 8.5, budget: 3200, availableTypes: [MonType.Melee, MonType.Heavy, MonType.Long, MonType.Support, MonType.Assassin, MonType.Summoner], isBossTier: true }, + 1: { multiplier: 1.0, budget: 60, availableTypes: [MonType.Melee, MonType.Heavy, MonType.Long], isBossTier: false }, + 2: { multiplier: 1.5, budget: 120, availableTypes: [MonType.Melee, MonType.Heavy, MonType.Long, MonType.Support], isBossTier: true }, + 3: { multiplier: 2.2, budget: 180, availableTypes: [MonType.Melee, MonType.Heavy, MonType.Long, MonType.Support, MonType.Assassin], isBossTier: true }, + 4: { multiplier: 3.2, budget: 240, availableTypes: [MonType.Melee, MonType.Heavy, MonType.Long, MonType.Support, MonType.Assassin, MonType.Summoner], isBossTier: true }, + 5: { multiplier: 4.5, budget: 300, availableTypes: [MonType.Melee, MonType.Heavy, MonType.Long, MonType.Support, MonType.Assassin, MonType.Summoner], isBossTier: true }, } /** @@ -362,14 +393,14 @@ export interface BlueprintTemplate { */ export const BlueprintTemplates: BlueprintTemplate[] = [ { id: "R1", type: TemplateType.REST, tierMin: 1, allowAffix: false, - slots: [{ typePool: [MonType.Melee], countMin: 2, countMax: 3, weight: 1.0 }] }, + slots: [{ typePool: [MonType.Melee], countMin: 1, countMax: 2, weight: 1.0 }] }, { id: "R2", type: TemplateType.REST, tierMin: 2, allowAffix: false, slots: [{ typePool: [MonType.Melee, MonType.Heavy], countMin: 2, countMax: 4, weight: 1.0 }] }, { id: "R3", type: TemplateType.REST, tierMin: 3, allowAffix: false, slots: [{ typePool: [MonType.Melee, MonType.Long], countMin: 3, countMax: 5, weight: 1.0 }] }, { id: "N1", type: TemplateType.NORMAL, tierMin: 1, allowAffix: false, - slots: [{ typePool: [MonType.Melee], countMin: 2, countMax: 3, weight: 1.0 }] }, + slots: [{ typePool: [MonType.Melee], countMin: 2, countMax: 4, weight: 1.0 }] }, { id: "N2", type: TemplateType.NORMAL, tierMin: 1, allowAffix: true, slots: [ { typePool: [MonType.Melee], countMin: 1, countMax: 3, weight: 0.6 }, @@ -378,13 +409,13 @@ export const BlueprintTemplates: BlueprintTemplate[] = [ { id: "N3", type: TemplateType.NORMAL, tierMin: 2, allowAffix: true, slots: [ { typePool: [MonType.Melee, MonType.Heavy], countMin: 2, countMax: 4, weight: 0.5 }, - { typePool: [MonType.Long], countMin: 1, countMax: 3, weight: 0.3 }, + { typePool: [MonType.Long], countMin: 1, countMax: 2, weight: 0.3 }, { typePool: [MonType.Support], countMin: 1, countMax: 2, weight: 0.2 }, ] }, { id: "N4", type: TemplateType.NORMAL, tierMin: 3, allowAffix: true, slots: [ { typePool: [MonType.Melee, MonType.Heavy], countMin: 3, countMax: 5, weight: 0.4 }, - { typePool: [MonType.Long, MonType.Assassin], countMin: 2, countMax: 4, weight: 0.3 }, + { typePool: [MonType.Long, MonType.Assassin], countMin: 2, countMax: 3, weight: 0.3 }, { typePool: [MonType.Support], countMin: 1, countMax: 2, weight: 0.3 }, ] }, @@ -396,26 +427,26 @@ export const BlueprintTemplates: BlueprintTemplate[] = [ ] }, { id: "M2", type: TemplateType.MIXED, tierMin: 2, allowAffix: true, slots: [ - { typePool: [MonType.Melee, MonType.Heavy], countMin: 3, countMax: 5, weight: 0.3 }, - { typePool: [MonType.Long, MonType.Assassin], countMin: 2, countMax: 4, weight: 0.3 }, + { typePool: [MonType.Melee, MonType.Heavy], countMin: 3, countMax: 4, weight: 0.3 }, + { typePool: [MonType.Long, MonType.Assassin], countMin: 2, countMax: 3, weight: 0.3 }, { typePool: [MonType.Support], countMin: 1, countMax: 2, weight: 0.4 }, ] }, { id: "M3", type: TemplateType.MIXED, tierMin: 3, allowAffix: true, slots: [ - { typePool: [MonType.Melee, MonType.Heavy], countMin: 3, countMax: 6, weight: 0.3 }, - { typePool: [MonType.Long, MonType.Assassin], countMin: 2, countMax: 4, weight: 0.3 }, + { typePool: [MonType.Melee, MonType.Heavy], countMin: 3, countMax: 5, weight: 0.3 }, + { typePool: [MonType.Long, MonType.Assassin], countMin: 2, countMax: 3, weight: 0.3 }, { typePool: [MonType.Summoner], countMin: 1, countMax: 2, weight: 0.2 }, { typePool: [MonType.Support], countMin: 1, countMax: 2, weight: 0.2 }, ] }, { id: "E1", type: TemplateType.ELITE, tierMin: 2, allowAffix: true, slots: [ - { typePool: [MonType.Heavy], countMin: 1, countMax: 3, weight: 0.5, forceAffix: true }, - { typePool: [MonType.Long, MonType.Assassin], countMin: 1, countMax: 3, weight: 0.5, forceAffix: true }, + { typePool: [MonType.Heavy], countMin: 1, countMax: 2, weight: 0.5, forceAffix: true }, + { typePool: [MonType.Long, MonType.Assassin], countMin: 1, countMax: 2, weight: 0.5, forceAffix: true }, ] }, { id: "E2", type: TemplateType.ELITE, tierMin: 3, allowAffix: true, slots: [ - { typePool: [MonType.Heavy], countMin: 1, countMax: 3, weight: 0.3, forceAffix: true }, + { typePool: [MonType.Heavy], countMin: 1, countMax: 2, weight: 0.3, forceAffix: true }, { typePool: [MonType.Assassin], countMin: 2, countMax: 3, weight: 0.4, forceAffix: true }, { typePool: [MonType.Support], countMin: 1, countMax: 2, weight: 0.3, forceAffix: true }, ] }, @@ -430,24 +461,24 @@ export const BlueprintTemplates: BlueprintTemplate[] = [ { id: "B2", type: TemplateType.BOSS, tierMin: 2, allowAffix: true, slots: [ { typePool: [MonType.MeleeBoss], countMin: 1, countMax: 1, weight: 1.0 }, - { typePool: [MonType.Melee, MonType.Heavy], countMin: 3, countMax: 5, weight: 0.5 }, - { typePool: [MonType.Long, MonType.Support], countMin: 1, countMax: 3, weight: 0.3 }, + { typePool: [MonType.Melee, MonType.Heavy], countMin: 2, countMax: 4, weight: 0.5 }, + { typePool: [MonType.Long, MonType.Support], countMin: 1, countMax: 2, weight: 0.3 }, { typePool: [MonType.Assassin], countMin: 1, countMax: 2, weight: 0.2 }, ] }, { id: "B3", type: TemplateType.BOSS, tierMin: 3, allowAffix: true, slots: [ { typePool: [MonType.MeleeBoss, MonType.LongBoss], countMin: 1, countMax: 1, weight: 1.0 }, - { typePool: [MonType.Melee, MonType.Heavy], countMin: 3, countMax: 5, weight: 0.35 }, - { typePool: [MonType.Long, MonType.Assassin], countMin: 2, countMax: 4, weight: 0.35 }, + { typePool: [MonType.Melee, MonType.Heavy], countMin: 2, countMax: 4, weight: 0.35 }, + { typePool: [MonType.Long, MonType.Assassin], countMin: 2, countMax: 3, weight: 0.35 }, { typePool: [MonType.Support], countMin: 1, countMax: 2, weight: 0.3 }, ] }, { id: "B4", type: TemplateType.BOSS, tierMin: 4, allowAffix: true, slots: [ { typePool: [MonType.MeleeBoss, MonType.LongBoss], countMin: 1, countMax: 1, weight: 1.0 }, - { typePool: [MonType.Heavy], countMin: 2, countMax: 4, weight: 0.35 }, + { typePool: [MonType.Heavy], countMin: 2, countMax: 3, weight: 0.35 }, { typePool: [MonType.Assassin], countMin: 2, countMax: 3, weight: 0.3 }, - { typePool: [MonType.Summoner, MonType.Support], countMin: 1, countMax: 3, weight: 0.2 }, - { typePool: [MonType.Melee], countMin: 2, countMax: 4, weight: 0.15 }, + { typePool: [MonType.Summoner, MonType.Support], countMin: 1, countMax: 2, weight: 0.2 }, + { typePool: [MonType.Melee], countMin: 1, countMax: 3, weight: 0.15 }, ] }, { id: "TUTORIAL", type: TemplateType.NORMAL, tierMin: 1, allowAffix: false,