Files
Continentis/docs/Project_Overview_初步总结.md
SoulliesOfficial d09b58fd80 架构大更
2026-03-20 11:56:50 -04:00

279 lines
12 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.
# 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 技能基于代码扫描自动生成,如有与实际设计意图不符之处,请以开发者说明为准。*