Files
Continentis/docs/Project_Overview_初步总结.md

279 lines
12 KiB
Markdown
Raw Normal View History

2026-03-20 11:56:50 -04:00
# Continentis 项目初步总结
> **文档类型**:设计·技术综合概览
> **生成时间**2026-03-13
> **负责角色**:首席游戏设计师 (game-designer-generic)
> **状态**:初稿,待设计师确认
---
## 一、项目定性
**Continentis** 是一款以 **Unity** 为引擎的 **支持 Mod 的类〈杀戮尖塔〉CCG 卡牌游戏**
游戏以分阵营的**回合制卡牌战斗**为核心体验,兼具 JRPG 幻想世界观与 Roguelike 结构。
Mod 支持通过 **UMod** 框架实现允许第三方开发者自定义几乎全部的游戏内容卡牌、角色、Buff、关卡等
---
## 二、技术架构总览
### 2.1 程序集分层
| 程序集 | 命名空间前缀 | 职责 |
|---|---|---|
| `GameAPI` | `Continentis.MainGame.*` | 游戏核心引擎,定义所有基类与接口 |
| `MainGame` | (同上) | 主要游戏逻辑的具体实现 |
| `Assembly-CSharp` | `Continentis.Mods.*` | 编辑器内置的 "Basic" Mod 实现 |
| UMod 编译产物 | 各 Mod 自定义 | 运行时动态加载的外部 Mod |
### 2.2 Mod 加载流程
1. **Manifest 资产**`ModManifest.asset`):列出该 Mod 的全部 `CardData``CharacterData``EquipmentData``HUDData``KeywordData` 和本地化文件的资产名 ID。
2. `ModManifest.SaveToDatabase(ModHost host)` 在运行时被调用,将所有 ScriptableObject 资产按类型注入 `ModManager.Database` 字典。
3. `CardLogicBase.GenerateCardLogic()` 通过 `ModManager.GetTypeID()` + `ModManager.GetType()` 找到Mod中注册的C#类,用 `Activator.CreateInstance` 实例化,**实现数据驱动的逻辑绑定**。
4. 资产命名规范:`{类型}_{Mod名}_{资产名}`,例如 `CardData_Basic_Backstab`
---
## 三、战斗系统核心设计
### 3.1 战斗流程(回合结构)
```
StartCombat()
└── NextRound() ← 每轮开始;敌方计算意图
└── NextAction() ← 每个角色的"行动"
├── (PlayerHero) 抽牌 → 玩家操作 → EndAction()
└── (CombatNPC) 按意图打出卡牌 → EndAction()
└── NextAction() / NextRound() 循环
```
**关键设计点:**
- 战斗的主要时间单位是**"行动Action"**,而非《杀戮尖塔》的整个回合。每轮内所有角色(玩家、盟友、敌人)都有自己的行动窗口,顺序由 `actionOrderList` 决定(基于 Speed 属性)。
- 玩家手牌逻辑:行动开始抽牌,行动结束时,标有 `Retain` 关键词的牌保留,标有 `Ethereal (虚无)` 的牌消耗,其余弃入弃牌堆。
### 3.2 资源系统
每个角色同时拥有**双资源**
| 资源 | 属性名 | 补充时机 | 说明 |
|---|---|---|---|
| 体力 (Stamina) | `Stamina` / `MaximumStamina` | 每次行动开始时恢复 `StaminaRecoverPerAction` | 物理/技能类卡牌主要消耗 |
| 魔法 (Mana) | `Mana` / `MaximumMana` | 每次行动开始时恢复 `ManaRecoverPerAction` | 魔法类卡牌主要消耗 |
### 3.3 防御三层机制
伤害处理为**顺序削减**
```
原始伤害
1. 闪避 (Dodge) → 若闪避值 ≥ 伤害,完全回避(消耗闪避值)
2. 格挡 (Block) → 按格挡值削减,每轮行动开始时清零
3. 护盾 (Shield) → 按护盾值削减,不自动清零
→ 剩余伤害扣除 Health
```
### 3.4 伤害计算公式
卡牌伤害最终值由以下因数相乘:
```
基础伤害 = 卡牌Damage属性 + 物理偏移量(用户) + 魔法偏移量(用户)
最终伤害 = 基础伤害 × 元素加成 × 通用魔法加成 × 最终伤害加成
```
- **元素标签系统**:卡牌可拥有 `Physics``Slash``Prick``Strike``Arcane``Sorcery``Magic` 等关键词,不同元素享有不同的攻防加成属性。
- 攻守双方的对应 `Multiplier` 属性相乘,支持元素克制/弱点设计。
---
## 四、卡牌系统
### 4.1 卡牌类型
| 类型 | 枚举值 | 设计定位 |
|---|---|---|
| Attack (攻击) | 0 | 主要造成伤害 |
| Skill (技能) | 10 | 功能性效果如格挡、Buff 等 |
| Power (力量) | 20 | 持续效果,通常保留在场上 |
| Status (状态) | 30 | 非主动使用的状态牌(通常由其他效果生成) |
| Curse (诅咒) | 40 | 对玩家不利的牌 |
| Item (物品) | 50 | 消耗性道具 |
### 4.2 卡牌升级系统
支持两种升级路径:
- **分叉升级**`isTerminalNode = false`):升级后变成另一张 `CardData`(完整变形)。
- **叠加升级**`isTerminalNode = true`):在原卡基础上按 `customUpgradeAttributes / defaultUpgradeAttributes` 叠加属性提升,支持无限升级(`isInfiniteUpgrade`)。
### 4.3 卡牌属性分层
| 层级 | 说明 |
|---|---|
| `originalAttributes` | 静态不变的原始值,不受运行时影响 |
| `variableAttributes` | 设计期的可变属性(自动拆解为 BaseAttr / Attr / DisplayAttr |
| `runtimeCurrentAttributes` | 战斗中的实时动态属性,受 Buff/效果影响 |
### 4.4 关键词系统
- `KeywordData` ScriptableObject定义每个关键词的展示名称、描述、图标等。
- 卡牌通过 `keywords: List<string>` 字符串列表声明关键词,逻辑层通过 `HasKeyword("字符串")` 查询。
- 内置功能关键词举例:`Retain`(回合末保留)、`Ethereal`(行动末消耗)、`Instant`(抽到立即打出)。
---
## 五、角色系统
### 5.1 角色分类
| 类 | 说明 |
|---|---|
| `PlayerHero` | 玩家控制的英雄角色,手牌由玩家操作 |
| `CombatNPC` | AI控制的战斗单位敌人与盟友均使用此类 |
| `CombatTeam` | 可作为牌的"持有者"的队伍实体(共享牌库场景) |
### 5.2 核心属性两级体系
```
CoreAttributes核心属性
├── Strength力量 → 转化为 MaximumStamina、物理伤害偏移量
├── Agility敏捷 → 转化为 Speed、敏捷伤害偏移量
├── Intelligence智力→ 转化为 DeckCapacity、ManaRecoverPerAction
├── Physique体质 → 转化为 MaximumHealth、StaminaRecoverPerAction
├── Perception感知→ 转化为 DrawCardAmountPerAction、Awareness
└── Charisma魅力 → 转化为 魅力偏移量(功能待扩展)
↓ 经 AttributeRulesCollection 转换规则
GeneralAttributes通用属性—— 战斗中直接使用
包含MaximumHealth, Health, MaximumStamina, Stamina, Mana,
Block, Shield, Dodge, Speed, DrawCardAmountPerAction, 等...
```
*转换规则(`ApplyRules_ConvertCoreIntoGeneral`)在 Mod 层定义,可被 Mod 覆盖。*
### 5.3 AI 意图系统
敌方 NPC 通过 `IntentionBase``IntentionBrain()` 实现基于优先级的意图决策:
1. **注册意图列表**:在 `CharacterLogicBase.Initialize()` 中调用 `character.RegisterIntention(...)` 注册所有可能的意图。
2. **每轮筛选**`IntentionBrain()` 从所有意图中筛选 `Condition()``true` 的,按优先级选最高者。
3. **刷新权重**:激活意图调用 `RefreshCardWeights()`,通过 `forceUse / forceIgnore / baseWeight` 控制当轮出牌倾向。
4. **加权随机抽取**`GetIntendedCards()` 在资源约束下,优先强制使用牌,然后按权重随机从 Pool 中选剩余牌。
5. **意图显示**:使用 `IntentionCardView` 在 UI 上展示敌方下回合意图(类杀戮尖塔"意图"系统)。
**案例(亡灵元帅)**
- `Normal`:默认权重分配。
- `SummonFirst`优先级20盟友仅剩自身时强制使用"亡灵大军"。
- `UltimateAttackFirst`优先级10任意敌方身上的"燃烧"层数 ≥ 5 时,强制使用"冥界之怒"。
---
## 六、Buff 系统
### 6.1 类型
- `BuffBase<T>` 为抽象泛型基类,`T` 为被挂载目标类型(`CharacterBase``CardInstance`)。
- `CharacterCombatBuffBase`:挂载在角色上的战斗 Buff最常用
- `CardBuffBase`:挂载在卡牌上的 Buff。
### 6.2 生命周期
```
OnBuffApply() → 尝试添加时调用(处理同类叠加/刷新逻辑)
OnAfterFirstApply() → 首次成功添加后调用
[各种事件钩子RoundStart / ActionStart / onDealAttack 等]
OnBuffDispel() → 被驱散前调用
OnBuffRemove() → 被正常移除时调用
```
### 6.3 驱散等级
`Basic` < `Strong` < `DeathOnly` < `Undispellable`
### 6.4 已实现的 General BuffBasic Mod
正面Consolidate坚固、CounterAttack反击、Firm坚定、Nimble敏捷、Protected被保护、Protecting保护、Prowess武勇、Resonance共鸣、Sharpness锐利、Withstand承受
负面Bleed流血、Blind致盲、Burn燃烧、Corrosion腐蚀、Freeze冻结、Heavy沉重阻止抽牌、Vulnerable脆弱、Weak虚弱
职业专属Assassin — `AmbushStance``KnifeTrick``WoundDeterioration`
---
## 七、卡牌池Basic Mod 速览)
Basic Mod 包含约 **80+** 张卡牌,覆盖以下职业/风格:
| 职业/标签 | 代表牌 | 设计风格 |
|---|---|---|
| 骑士 (Knight) | KnightStrike, IronWall, OathOfCourage | 格挡、护盾、领袖光环 |
| 牧师 (Cleric) | PrayerOfHealing, DivineSmite, SpiritGuardian | 治疗、圣属性攻击、护盾 |
| 法师 (Mage) | FireBall, ArcaneMissiles, Haste | AOE 魔法、施法加速 |
| 刺客 (Assassin) | Backstab, Stealth, AmbushStance | 隐身、叠伤、连击 |
| 通用 | Guard, Slash, Strike, DualStrike | 基础攻防 |
| 敌方专属 | HellfireBlast, ArmyOfTheDead, WrathOfUnderworld | BOSS 技能 |
---
## 八、装备系统
`EquipmentData``EquipmentBase` 实例化。装备挂载在角色上,可以:
- 向角色牌库中注入额外卡牌(`belongingCardDataRefs`)。
- 拥有独立的事件订阅(`onCombatStart``onRoundStart`等),实现被动效果。
---
## 九、命令队列系统Command Queue
所有战斗演出/逻辑效果通过**命令Command模式**异步执行:
- `CommandBase`:抽象命令基类。
- `CommandGroup`:命令容器,支持 `Sequential`(顺序)或 `Parallel`(并行)执行模式。
- `CommandQueueManager`:全局单例,逐帧消费命令队列。
- 卡牌逻辑的 `PlayEffect()` 返回 `List<CommandBase>`,由系统依次执行。
**常用命令类型:**
| 命令 | 功能 |
|---|---|
| `Cmd_Function` | 执行任意 lambda支持延时 |
| `Cmd_ParamFunction<T>` | 带参数的函数命令(常用于传入 Target |
| `Cmd_DrawCards` | 抽牌 |
| `Cmd_DiscardCards` | 弃牌 |
| `Cmd_ExhaustCards` | 消耗牌 |
| `Cmd_PlayAnimation` | 播放角色动画 |
| `Cmd_PlaySFX` | 播放音效 |
| `Cmd_SpawnVFX` | 生成特效 |
| `Cmd_ReshuffleDeck` | 洗牌 |
---
## 十、Mod 开发者视角Modder's API 速览)
制作卡牌最小步骤:
1. 创建 `CardData` ScriptableObject设置属性、关键词、图片等
2. 创建继承 `CardLogicBase` 的 C# 类,重写 `PlayEffect()` 方法。
3.`SetUpLogicComponents()` 中添加所需 `CardLogicComponentBase`
4.`CardData` 名称注册到 `ModManifest``cardDataIDList`
5. 打包 Mod通过 UMod 加载。
Buff 制作最小步骤:
1. 继承 `CharacterCombatBuffBase`,实现 `Apply()` / `Remove()` / `OnBuffApply()`
2. 在卡牌 `PlayEffect()` 中调用 `CreateCharacterBuff<T>().Apply(target, caster, card)`
3. 注册类型到 `ModManager`UMod 自动处理)。
---
## 十一、已知开发状态与注意事项
- 战斗流程(回合/行动)**已可运行**,玩家手牌操作基本完备。
- `CombatNPC` 的行动逻辑中有 `//TODO: 临时的,刷新一次意图目标` 注释,目标检测逻辑有待完善。
- `DrawCardAmountPerAction` 中存在 `+= 10` 的临时偏移量,需后续清理。
- `ModifyMana` 函数中有一处 `ClampAttribute("Stamina", ...)` 疑似笔误(应为 Mana
- 卡牌的 `Targeting` 瞄准 UI 目前仅对第一个目标显示指向,多目标场景还需优化。
- Roguelike 的地图/节点系统、商店、奖励等**尚未在当前代码中发现**,可能是下一阶段工作。
---
*本文档由 game-designer-generic 技能基于代码扫描自动生成,如有与实际设计意图不符之处,请以开发者说明为准。*