Files
zeling_v2/Docs/DesignSpec/09_ProgressionSystem.md
2026-05-08 11:04:00 +08:00

247 lines
8.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 09 · 进程系统规范
> **所属文档集** [← 返回索引](./README.md)
> **摘要**能力解锁、门控系统、Geo 遗骸机制与游戏完成度追踪。
---
## 目录
1. [进程设计原则](#1-进程设计原则)
2. [能力系统](#2-能力系统)
3. [门控系统](#3-门控系统)
4. [Geo 遗骸机制](#4-geo-遗骸机制)
5. [完成度追踪](#5-完成度追踪)
6. [护符系统](#6-护符系统)
7. [进程事件目录](#7-进程事件目录)
---
## 1. 进程设计原则
| 原则 | 说明 |
|------|------|
| **有机探索** | 能力解锁带来新的区域通路,而非仅仅提升战斗数值 |
| **无死门** | 不存在因获取顺序错误而无法继续的情况 |
| **多路径** | 大多数门控有多种解锁方式(能力/密钥/支线)|
| **数据驱动** | 所有解锁条件用数据定义,逻辑层不硬编码 |
---
## 2. 能力系统
### 2.1 能力数据模型
```
DataModel AbilityData {
abilityId : ID
displayName : String
description : String
──────────────────────────────────
abilityType : AbilityType // 移动/战斗/探索/形态
unlockSource : UnlockSource // 如何获得Boss掉落/收集品/商店)
──────────────────────────────────
gatesUnlocked : List<GateType> // 该能力解锁哪些门控类型
movementFlags : Flags<MovementAbilityFlag> // 移动系统的能力开关
combatFlags : Flags<CombatAbilityFlag> // 战斗系统的能力开关
}
```
### 2.2 核心能力列表
| 能力 ID | 名称 | 获取方式 | 解锁内容 |
|--------|------|---------|---------|
| `DoubleJump` | 双跳 | 初始能力(教程)| 空中二段跳 |
| `WallGrab` | 墙抓 | 区域 1 Boss | 抓墙/墙跳 |
| `AerialDash` | 空中冲刺 | 区域 2 Boss | 8方向空中冲刺 |
| `Plunge` | 下冲 | 区域 3 收集品 | 下冲攻击 |
| `SwimAbility` | 游泳 | 区域 4 收集品 | 进入液体区域 |
| `SkyFormUnlock` | 天魂解锁 | 剧情节点 | 天魂形态 |
| `EarthFormUnlock` | 地魂解锁 | 剧情节点 | 地魂形态 |
| `DeathFormUnlock` | 命魂解锁 | 剧情节点 | 命魂形态 |
| `SoulSkillUpgrade` | 魂技能升级 | 特定 NPC | 魂技能二阶效果 |
### 2.3 能力解锁流程
```
玩家获得 AbilityData来源Boss掉落/拾取/购买)
→ 发出 OnAbilityUnlocked 事件abilityId
→ 更新 SaveData.unlockedAbilities 集合
→ 玩家系统注册新 movementFlags 和 combatFlags
→ 门控系统重新评估所有已知门控状态
→ 地图更新(若新能力打开了新路径)
```
---
## 3. 门控系统
### 3.1 门控数据模型
```
DataModel GateData {
gateId : ID
roomId : ID
displayName : String
──────────────────────────────────
conditions : List<GateCondition> // 解锁条件满足任一即可OR逻辑
unlockMode : GateUnlockMode // 永久解锁 / 单次通过
──────────────────────────────────
lockedVisual : VisualState
unlockedVisual : VisualState
tooltipText : String // 玩家尝试进入未解锁门时显示
}
DataModel GateCondition {
conditionType : GateConditionType
targetId : ID // 依条件类型能力ID/密钥ID/任务ID
quantity : Optional<Integer> // 若需要数量(如 Geo 消耗)
}
```
### 3.2 门控条件类型
| 条件类型 | 说明 | 示例 |
|---------|------|------|
| `HasAbility` | 玩家已解锁某能力 | 需要双跳才能通过高台 |
| `HasItem` | 玩家持有某关键道具 | 需要古城钥匙 |
| `BossDefeated` | 某 Boss 已被击败 | 区域终 Boss 死后大门开启 |
| `QuestComplete` | 某任务/剧情已完成 | NPC 认可后打开秘道 |
| `PaidGeo` | 支付 Geo商人/通行税)| 进入特定区域收费 |
| `WorldFlag` | 某世界标记为真 | 触发了某机关后解锁 |
---
## 4. Geo 遗骸机制
### 4.1 规则规范
```
玩家死亡:
→ 当前持有的 Geo 全部转移为遗骸GeoShade
→ 遗骸实体生成于死亡位置
→ 玩家的 Geo 归零
→ 若已有遗骸(上一次死亡未取回):
→ 旧遗骸永久消失(及其中的 Geo
→ 新遗骸替代旧遗骸
玩家到达遗骸位置并触碰:
→ 恢复遗骸中的全部 Geo
→ 遗骸消失
→ 发出 OnGeoShadeRecovered 事件
```
### 4.2 数据模型
```
DataModel GeoShadeState {
exists : Boolean
geoAmount : Integer
deathPosition : Vector2
roomId : ID // 遗骸所在房间(跨房间持久存在)
}
```
> **设计决策**:再次死亡前遗骸永久消失
> **原因**:来自 Hollow Knight 的核心惩罚机制。失去 Geo 的焦虑推动玩家谨慎前进,而非莽撞行事。
---
## 5. 完成度追踪
### 5.1 完成度指标
```
DataModel CompletionData {
──── 主线进程 ────────────────────
mainQuestStage : Integer // 当前主线阶段
endingUnlocked : Optional<EndingType>
──── 探索进度 ────────────────────
roomsVisited : Set<ID> // 已访问房间
mapRevealPercent: Number // 0.0~1.0
──── 收集进度 ────────────────────
maxHPUpCount : Integer // 已拾取 HP 上限碎片数
maxSoulUpCount : Integer // 已拾取灵力上限碎片数
maxSpiritUpCount: Integer // 已拾取魄元上限碎片数
lorePiecesFound : Set<ID>
──── 挑战进度 ────────────────────
bossesDefeated : Set<ID>
bossesParried : Set<ID> // 弹反过 Boss 至少一次
secretsFound : Set<ID>
}
```
### 5.2 三结局条件
| 结局 | 触发条件 |
|------|---------|
| **结局 A**(普通结局)| 击败最终 Boss未满足结局 B/C 条件 |
| **结局 B**(完全结局)| 击败所有 Boss + 主线所有剧情节点 + 特定 NPC 任务完成 |
| **结局 C**(隐藏结局)| 发现隐藏区域、触发特定世界标记序列 + 结局 B 条件 |
---
## 6. 护符系统
### 6.1 护符数据模型
```
DataModel CharmData {
charmId : ID
displayName : String
description : String
──────────────────────────────────
notchCost : Integer // 装备槽位消耗
──────────────────────────────────
effects : List<CharmEffect>
comboCharms : Optional<List<ID>> // 与哪些护符组合触发强化效果
comboEffects : Optional<List<CharmEffect>>
}
DataModel CharmEffect {
effectType : CharmEffectType
params : Map<String, Number>
}
```
### 6.2 护符槽位规则
| 规则项 | 说明 |
|--------|------|
| 初始槽位 | 3 个 Notch |
| 扩展方式 | 特定 NPC付 Geo增加 Notch |
| 最大 Notch | 11 个(初始 3 + 最多可购买 8|
| 过量装备 | 可强行装备超过槽位(超出则 HP 上限临时减半)|
### 6.3 护符效果类型
| 类型 | 说明 | 参数 |
|------|------|------|
| `StatModifier` | 修改某资源上限/恢复量 | `statType`, `delta` |
| `DamageModifier` | 修改某类攻击的伤害倍率 | `attackType`, `multiplier` |
| `WeaponOverride` | 覆盖某形态的武器 | `formId`, `weaponId` |
| `SkillModifier` | 修改技能效果参数 | `skillId`, `paramKey`, `newValue` |
| `AerialDashCount` | 增加空中冲刺充能次数 | `additionalCharges` |
| `ParryWindowExpand` | 扩大弹反时间窗口 | `addedSeconds` |
| `OnHitEffect` | 命中时附加效果 | `effectType`, `chance` |
---
## 7. 进程事件目录
| 事件 | 触发时机 | 载荷 |
|------|---------|------|
| `OnAbilityUnlocked` | 获得新能力 | `abilityId` |
| `OnGateUnlocked` | 门控条件满足,门开启 | `gateId` |
| `OnCharmEquipped` | 装备护符 | `charmId, slotIndex` |
| `OnCharmUnequipped` | 卸下护符 | `charmId` |
| `OnCharmComboActivated` | 护符组合效果触发 | `charmIds: List<ID>` |
| `OnGeoShadeCreated` | 死亡创建遗骸 | `position, amount` |
| `OnGeoShadeRecovered` | 拾取遗骸 | `amount` |
| `OnGeoShadeLost` | 遗骸永久消失 | `amount` |
| `OnEndingUnlocked` | 结局条件满足 | `endingType` |
| `OnCompletionMilestone` | 完成度达到里程碑 | `milestoneId, percent` |