feat(rogue模式): 调整前期配置并添加经济推演文档
新增前20波玩家战力与经济推演估算的详细注释文档,下调各Tier的怪物生成倍率与预算数值,调整所有蓝图模板的怪物生成数量上下限,优化前期游戏体验并平滑开局节奏。
This commit is contained in:
@@ -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<number, TierConfig> = {
|
||||
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,
|
||||
|
||||
Reference in New Issue
Block a user