初次提交

This commit is contained in:
2026-07-20 10:56:52 +08:00
commit 7bcc0026e0
462 changed files with 50191 additions and 0 deletions
+248
View File
@@ -0,0 +1,248 @@
# 数值策划设计案:魔法工匠 (Arcane Artificer)
## 0. 设计理念 (Design Philosophy)
本游戏的数值体系服务于 **“高自由度构建”** 这一核心目标。
数值设计不应教玩家怎么玩,而应提供足够宽广的边界(Boundary)和明确的权衡(Trade-off)。
**核心公式**:
`构建强度 = (基础数值 * 修正系数) ^ 逻辑复杂度`
## 1. 基础资源模型 (Resource Model)
### 1.1 玩家属性 (Player Stats)
这些属性是全局的,会修正所有法杖的输出。
| 属性 ID | 名称 | 基准值 | 软上限 | 硬上限 | 说明 |
| :--- | :--- | :--- | :--- | :--- | :--- |
| `hp_max` | 最大生命 | 100 | 2000 | - | |
| `mana_max` | 最大魔力 | 100 | 1000 | - | 全局蓝条上限,法杖也有自己的上限,取 Min 值 |
| `move_speed` | 移动速度 | 300 | 600 | 800 | 像素/秒 |
| `cast_delay_mod` | 施法延迟修正 | 1.0 (100%) | 0.1 | 0.01 | 越低越快,乘算系数 |
| `recharge_speed_mod` | 充能速度修正 | 1.0 (100%) | 5.0 | - | 越低越快 |
| `luck` | 幸运 | 0 | 100 | - | 影响高阶法术掉率、暴击率 |
| `cpu_limit` | 运算力上限 | 5 | 20 | 50 | `SpellEvaluator` 实际 MAX_OPS = `cpu_limit × 40`(默认 5 → 200 步;软上限 20 → 800 步;硬上限 50 → 2000 步)。升级此属性可执行更复杂的法术链,与 `implementation_plan.md §2.2``MAX_OPS_PER_CPU = 40` 常量对应。 |
| `attunement_fire` | 火焰精通 | 0 | 50 | 100 | 每点:火焰伤害 +3%(乘算),火焰状态(点燃/爆燃)触发概率 +2%。影响 `damage_type=FIRE` 的所有投射物。 |
| `attunement_ice` | 冰霜精通 | 0 | 50 | 100 | 每点:冰霜伤害 +3%,冰冻/减速触发概率 +2%。 |
| `attunement_lightning` | 雷电精通 | 0 | 50 | 100 | 每点:雷电伤害 +3%,麻痹/连锁导电触发概率 +2%。 |
| `attunement_poison` | 毒素精通 | 0 | 50 | 100 | 每点:毒素 DoT +3%,中毒叠层上限 +1(上限 20)。 |
### 1.2 经济系统 (Economy)
* **金币 (Gold)** (代号 `G`)
* **来源**: 击杀怪物 (1-5G),波次结算 (100G + 10%利息)。
* **消耗**: 购买法术 (50-500G),购买法杖 (200-2000G),刷新商店 (20G*)。
* **利息上限**: 10% 利息计算时,单次波次奖励上限为 **100G**(即持有 1000G 以上部分不再产生额外利息)。防止后期经济失控膨胀。
* **膨胀控制**: 商店刷新价格每次增加,波次结束后重置。金币不捡 5 秒后消失,逼迫玩家移动拾取。
- **刷新价格公式(F11 补充,P6-N23)**`刷新费用 = 20 + (本波已刷新次数 × 10)`(单位:G)。
即第 1 次刷新 20G,第 2 次 30G,第 3 次 40G,以此类推;波次结算后重置为 20G。
设计意图:前 1-2 次刷新成本低,鼓励灵活换货;反复刷新代价指数感,抑制"无脑刷新"。
实现:`ShopManager` 维护 `_refresh_count: int`(波次内),`WAVE_COMPLETE` 事件后清零。
* **经验值 (XP)**
* **升级曲线(权威公式 P6-N16**
$$XP\_required(level) = \lfloor 10 \times 1.4^{level-1} \rfloor$$
| 等级 | 所需 XP | 累计 XP |
| :--- | :--- | :--- |
| 1→2 | 10 | 10 |
| 5→6 | 54 | 234 |
| 10→11 | 289 | 1397 |
| 15→16 | 1551 | 7174 |
| 20→21 | 8322 | 39,343 |
- 系数 `1.4` 使早期升级快速(前 5 级约 4 波内完成),后期升级需要持续 3-5 波,节奏符合 Roguelite 期望。
- `ProfileManager` 在关卡加载时预计算前 50 级的阈值表并缓存,避免运行时浮点指数运算。
- **⚠️ F10 可行性验证(P6-N22**Level 21 累计 XP 需求 39,343。20 波 × 60 秒/波 = 1200 秒游戏时长。
设平均每秒击杀 2 只敌人,每只掉 15 XP(Wave 10+ 标准怪),则 1200 × 2 × 15 = 36,000 XP——
**略低于 39,343**,意味着理论上最高只能达到 Level 20 左右(不满 21 级)。
若期望玩家在通关时达到 20 级,需将 `XP_required` 公式中系数从 `1.4` 调整为约 `1.38`
或将波次奖励 XP 提高(每波结算奖励 200 XP)。**当前设计定为 Level 20 通关上限,不强制要求 Level 21**;
Level 21+ 曲线仅服务于 Endless 模式。敌人 XP 掉落参考值:Wave 1 杂鱼 = 5 XPWave 10 精英 = 30 XPBoss = 500 XP。
---
## 2. 法术系统数值 (Spell System Metrics)
### 2.1 核心参数定义
每个法术卡片 (Godot Resource / Json) 包含以下关键数值:
1. **Mana Cost (魔耗)**: 执行此节点消耗的魔力。
* *原则*: 越强力的效果,蓝耗越高,或者有其他负面代价。
2. **Cast Delay (施法后摇)**: 执行此节点后,给法杖增加的“冷却时间”。
* *原则*: 强大的单发法术通常有高延迟(如核弹 +2.0s)。
3. **Recharge Time (充能延迟)**: 这是一个特殊的延迟,只有当完整的一轮(Deck空了)打完正在重置时,才会计算。
* *原则*: 只有极强的终极技能才会增加此值。
### 2.2 基础法术参考表 (Spell Database)
> **⚠️ 注意**Projectile/Action 类型法术必须在 `.tres` 中显式设置 `damage_type`DamageType 枚举值)。
> 未填写时 `ProjectileDef.reset()` 默认 `DamageType.PHYSICAL`,但设计意图应在此表中明示,
> 避免内容制作者遗漏火/雷等元素属性导致构建伤害系统无法正常触发。
#### Tier 1 (新手/平民)
| ID | 名称 | 类型 | Mana | Delay | 伤害类型 | 效果/修正 | 备注 |
| :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- |
| `spark_bolt` | 魔法飞弹 | Projectile | 5 | +0.05s | PHYSICAL | Dmg: 3, Speed: 600 | 最基础的突突突 |
| `energy_orb` | 能量球 | Projectile | 20 | +0.20s | PHYSICAL | Dmg: 15, Speed: 300 | 慢速高伤 |
| `double_cast` | 双重施法 | Multicast | 2 | +0.00s | — | Draw: 2 | 必备插件 |
| `spread_mod` | 散射修正 | Modifier | 0 | -0.10s | — | Spread: +30°, Speed: +10% | 这一发打不准,但射得快 |
#### Tier 2 (进阶/功能)
| ID | 名称 | 类型 | Mana | Delay | 伤害类型 | 效果/修正 | 备注 |
| :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- |
| `shotgun_blast` | 霰弹爆破 | Projectile | 25 | +0.40s | PHYSICAL | 发射3枚 4dmg 的弹片 | 自带多重效果 |
| `damage_plus` | 伤害增强 | Modifier | 15 | +0.10s | — | Dmg: +10 | |
| `speed_up` | 加速推进 | Modifier | 5 | -0.05s | — | Speed: +400, Range: +20% | 狙击流必备 |
| `trigger_hit` | 击中触发 | Trigger | 10 | +0.00s | — | Payload Dmg: 0.1x | 子母弹核心 |
#### Tier 3 (史诗/质变)
| ID | 名称 | 类型 | Mana | Delay | 伤害类型 | 效果/修正 | 备注 |
| :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- |
| `nuke` | 战术核弹 | Projectile | 200 | +3.00s | PHYSICAL | Dmg: 500, Radius: 300 | 屏幕清空,可能会炸死自己 |
| `homing` | 自动追踪 | Modifier | 40 | +0.10s | — | Homing Force: 5.0 | 只有这一个修正就够改变玩法 |
| `heavy_cost` | 鲜血献祭 | Modifier | 0 | -0.50s | — | Dmg: +50, Cost: 10 HP | 卖血流 |
| `chain_bolt` | 连锁闪电 | Projectile | 60 | +0.80s | LIGHTNING | 弹射 5 次 | 清怪神器 |
---
## 3. 敌人与战斗数值 (Combat Metrics)
### 3.1 伤害计算管线
> **⚠️ 权威公式(Authoritative Formula**:所有文档均应引用此处定义,不得出现矛盾版本。
为了支持复杂的 Buff/Debuff,伤害计算必须分步:
1. **Base Damage**: 法术面板值 (e.g. 10)
2. **Add Modifiers**: 累加修正器 (e.g. +5 +5 -> 20)
3. **Mult Modifiers**: 乘法修正器 (e.g. Critical 2.0x, Element Weakness 1.5x)
4. **Flat Reduction**: 敌人护甲 (Armor -2)
5. **Percent Reduction**: 敌人抗性 (Fire Res 50%)
```
Damage = ((Base + Add) × Mult) × (1 - Res) - Armor
```
*(最小伤害为 1*
### 3.2 怪物设计标准
我们设定 **“标准单位时间伤害 (DPS)”** 为基准。
* 玩家 Lvl 1 预计 DPS: 20
* 玩家 Lvl 20 预计 DPS: 5000+
| 怪物等级 | 怪物类型 | HP | 移动速度 | 攻击力 | 特殊词条 |
| :--- | :--- | :--- | :--- | :--- | :--- |
| Wave 1 | 杂鱼土豆 | 15 | 100 | 5 | - |
| Wave 5 | 冲锋甲虫 | 80 | 250 | 12 | 击退抗性 50% |
| Wave 10| 坦克巨兽 | 2000 | 50 | 30 | 护甲 5 (免疫机枪) |
| Wave 20| 虚空领主 | 50000| 150 | 100 | 弹幕反射盾 |
### 3.3 波次强度控制 (Pacing)
游戏设计为 20 波 (Wave),每波 60秒。
* **W1-3**: 爽局。怪物血量 < 玩家单发伤害。
* **W4-7**: 压力局。怪物密度增加,玩家必须拥有至少一个 AOE 手段(穿透/爆炸)。
* **W8**: **首领战 (Mini Boss)**。考验单体 DPS。
* **W9-15**: 资源局。怪物掉落增加,但伴随高护甲怪,考验玩家的“破甲/元素”构建。
* **W20**: **最终 Boss**
---
## 4. 元素反应矩阵 (Elemental Matrix)
为了增加构建深度,引入简单的元素克制/反应。
| 攻击 \ 如果目标状态 | 无 | 潮湿 (Wet) | 油腻 (Oily) | 燃烧 (Burning) | 冰冻 (Frozen) |
| :--- | :--- | :--- | :--- | :--- | :--- |
| **火 (Fire)** | 点燃 | 蒸发 (AOE) | 爆燃 (x3 Dmg) | - | 融化 (解冻) |
| **冰 (Ice)** | 减速 | 冻结 (硬控) | - | 熄灭 | - |
| **雷 (Elec)** | 麻痹 | 连锁导电 (AOE) | - | 过载 (爆炸) | 碎冰 (物理Dmg) |
*数值策划备注:*
* **潮湿**:受到雷电伤害 +100%。
* **油腻**:受到火焰伤害 +200%,且持续时间翻倍。
* **冻结**:无法移动,受到物理撞击伤害 +300% (即碎冰机制)。
---
## 5. 平衡性隐患与对策 (Balancing Risks)
### A. 无限蓝机枪 (Infinite Mana Gun)
* **问题**: 玩家堆积大量 `-Delay``Mana Regen`,导致射速突破帧率限制,且蓝不掉。
* **对策**:
* **最小帧限制**: 设定射击间隔至少为 1 帧 (0.016s)。
* **过热机制 (Overheat)**: 连续射击超过 5秒,法杖进入“过热”状态,强制冷却 2秒 或 增加散布。
* **递增蓝耗**: 连续快速射击时,每发子弹蓝耗增加 1%,停止射击后快速衰减。
### B. 显卡杀手 (GPU Killer)
* **问题**: 玩家构建出 `无限分裂` + `无限粒子`
* **对策**:
* **最大弹道数 (Max Projectiles)**: 全局限制 2000 个弹道。超过时,新的子弹不再生成(或顶掉旧的)。
* **双重限制机制**
* **MAX_OPS**= `cpu_limit × MAX_OPS_PER_CPU`,默认 `5 × 40 = 200`,软上限 `20 × 40 = 800`):`SpellEvaluator` 每帧单次施法最多执行对应条指令(包括 ACTION/MODIFIER/LOGIC 各类节点)。主要防止线性/循环构建死循环。与 `implementation_plan.md §2.2``MAX_OPS_PER_CPU = 40` 常量对应。
* **嵌套深度锁 MAX_TRIGGER_DEPTH = 3**`SpellEvaluator.execute_sub` 调用时传入 `depth` 参数,超过 3 层不再触发新的 SubPayload(即 TRIGGER 内嵌套 TRIGGER 最多 3 层)。**两者分工**:MAX_OPS 管局内指令数量,MAX_TRIGGER_DEPTH 管跨子弹的调用深度。
### C. 站桩输出 (AFK Build)
* **问题**: 比如”自动追踪吸血光环”,玩家站着不动就能通关。
* **对策**:
* **反挂机怪**: 设计一种怪物,会向玩家当前位置投掷”毒圈”,逼迫玩家移动。
* **资源衰减**: 掉落的金币如果不捡,5秒后消失(或变少),逼迫玩家去捡钱。
### D. W20 Boss Phase 1 DPS 门槛(P6-N17
* **问题**: Phase 1 的 `regen_on_physical_hit = 0.005`(每次物理命中恢复 Boss 最大 HP 的 0.5%)。
Boss 最大 HP = 50,000,即每次物理命中回血 **250 HP**
若玩家攻速 10 发/秒(纯物理构建),Boss 每秒净回血 2,500 HP。
* **DPS 突破阈值(最低要求)**:物理构建需满足以下条件才能有效磨血:
$$DPS_{physical} > \frac{250 \times hit\_rate}{1} \Rightarrow DPS > 2500 \text{10发/秒时)}$$
等价条件:每发伤害 > 250(单发狙击流),或总 DPS > 2500(高频流)。
- **设计意图**:并非阻止物理构建,而是要求玩家必须达到中后期构建强度(DPS 5000+)才能高效磨血;低配物理构建可用更长时间磨过,但效率不如元素/共鸣流。
- **数值调整入口**`res://resources/bosses/boss_w20.json` 中的 `regen_on_physical_hit` 字段,平衡迭代时直接修改数据而无需改代码。
### E. `infinite_spells` 与 `heavy_cost` 叠加交互(P6-N18
* **问题**`infinite_spells` 特性(法力耗尽时每发+1 HP 代价)与 `heavy_cost` 修正器(每次施法-10 HP)叠加时,HP 代价是否累加?
* **规则定义**:两者**独立计算、顺序执行**
1. `SpellEvaluator` 先执行 `heavy_cost` MODIFIER(扣 10 HP,归类为”构建设计主动代价”)。
2. **之后**,若 mana 不足,`infinite_spells` 机制额外扣 1 HP(归类为”资源溢出代价”)。
3. 两者同帧触发时,单发最大 HP 代价 = `heavy_cost 值 + 1`(如 10+1=11 HP/发)。
* **UI 提示**:法杖编辑界面在检测到 `infinite_spells Core` + `heavy_cost` 组合时,显示橙色警告”⚠ 双重 HP 消耗”,并提示预估每秒 HP 消耗量。
* **上限保护**:单次施法 HP 代价上限 = `player.hp_max × 0.15`(15% 上限),防止极端组合一发即死。
---
## 6. 波次生成配置格式 (SpawnConfig Schema — E5 权威定义)
波次内容**完全由数据驱动**,关卡设计师仅需编辑 JSON 无需改代码。文件位于 `res://resources/waves/wave_XX.json`
```json
{
"wave": 5,
"duration_sec": 60,
"budget": 200,
"spawn_groups": [
{
"enemy_id": "bug_charger",
"weight": 3,
"count_min": 2,
"count_max": 5,
"spawn_interval": 3.0,
"spawn_radius_from_player": [400, 700]
},
{
"enemy_id": "tank_brute",
"weight": 1,
"count_min": 1,
"count_max": 1,
"spawn_interval": 15.0,
"spawn_radius_from_player": [500, 800]
}
],
"elite_overrides": [
{ "at_sec": 45, "enemy_id": "elite_bug_charger", "count": 1 }
],
"boss": null
}
```
* `budget`:本波总"刷怪点数",每个怪物有对应的 `cost`;实际刷新量 = `floor(budget / cost)`
* `weight`:同时存在多个 group 时,按权重随机选组,而非轮流刷新。
* `elite_overrides`:精确时间点强制刷出精英怪,不消耗 budget。
* `boss`:非 null 时在波末触发 BossSpawn(见 §6 Boss 设计框架)。