遭遇战创作
一场遭遇战就是完整的战斗配方:玩家、有序敌人、奖励池和规则
玩家角色由 Squire 定义,Iron Resolve 是它的 Starting Deck,敌人 HP、Intent 与 Behavior 则保存在 Strawman 中
Encounter 模式会把这些引用组合进 The Threshing Field,这份 GameEncounter 会保存名称、说明、难度、横幅、玩家、按行动顺序排列的敌人、奖励卡组与 Battle Rules,角色、卡牌和敌人的具体配置仍然保留在各自的原始资产中
先确认当前场景的 GameCardManager 已启用至少一个 Encounter Database,数据库配置决定 Game Card Editor 能够列出、创建和编辑哪些遭遇战
Tools > TinyGiants > GCS > Game Card Editor
在窗口顶部选择 Encounter,再从左侧定位 The Threshing Field

上图呈现了 Encounter 从资产选择到启动前核对的完整创作界面,在 List 中选定 GameEncounter 后,Inspector 会绑定参战单位、奖励与规则,Preview 与 Used By 分别显示配置摘要和内容层级,四个区域共享当前选择,把分散的内容资产组合成一份可以继续校验和启动的战斗配方
从 List 选择 The Threshing Field
Encounter 模式只会读取当前 GameCardManager 已启用的 Encounter Database,先在 Database 中选择要写入的数据库,再用 + 创建空白遭遇战、用复制按钮基于当前结构创建副本,或用 − 删除当前遭遇战
搜索框会按遭遇战子资产名过滤,Difficulty 与 Tags 可以进一步筛选结果
每个列表行都会显示 16:9 战斗图片、名称、难度与敌人槽位数量,无需打开 Inspector 就能比较同一数据库中的战斗规模与分类

当前列表已经选中 The Threshing Field,修改 Inspector 中的 Name、Difficulty、Icon 或 Enemy Units 后,列表项中的名称、难度、图片与敌人数量都会同步刷新
先建立战斗身份,再组装参战阵容
Basic
Basic 先确定这场战斗在编辑器、遭遇战选择界面和项目流程中的身份
| 字段 | 配置结果 |
|---|---|
| Name | Workbench 与项目 UI 使用的显示名称,填写非空值时也会同步更新子资产名 |
| Description | 面向玩家的战斗地点、目标或对手说明 |
| Difficulty | 内置 Normal、Elite、Boss 或项目自定义标签,只负责分类与显示,不会自动缩放战斗数值 |
| Tags | 供 Workbench 筛选以及项目自己的进度、分组或选择逻辑读取的标签 |
将 Name 设为 The Threshing Field,将 Difficulty 设为 Normal,再填写玩家实际会看到的场景说明与 Warrior 标签,Basic 中的身份信息会立即同步显示在 List 与 Preview 中

Basic 已经确定战斗名称、场景与难度,Visual 会继续为当前 Encounter 指定战斗横幅
Visual
在 Icon 中选择一张 Sprite 后,Workbench 会把这张图片以 16:9 缩略图显示在 List 和 Display 预览中,项目的遭遇战选择页、加载界面或背景表现也可以直接复用这项引用
身份与画面确定后,这场遭遇战仍然需要一名参战玩家和至少一个敌人槽位,二者共同决定运行时会创建哪些单位
Player
在 Player 中选择 Squire,当前卡片会显示角色头像、名称、HP 70 与 Energy 3,这两个数值分别来自角色的 Max HP 与 Base Energy

需要调整 Player 引用时,选择按钮可以替换角色,打开按钮会切换到 Player 模式继续编辑,× 会清空当前引用
战斗启动时,运行时会根据 Squire 的 Max HP 与 Base Energy 创建玩家状态,场景表现层可以使用它的 Template 创建单位画面
当前 Run 的 Master Deck 为空时,运行时才会使用 Iron Resolve Starting Deck 构建抽牌堆,角色字段与两类卡组来源分别见玩家创作和卡组创作
Enemy Units
参战玩家确定后,在 Enemy Units 中加入 Strawman,当前配置会显示槽位 1、Normal Tier 与 14–18 HP

每一行都代表一个独立战斗槽位,同一个敌人添加两次会在运行时创建两个单位
拖动行可以调整槽位顺序,选择按钮可以替换当前敌人,打开按钮会切换到 Enemy 模式,× 会移除当前槽位
运行时会按照槽位顺序创建敌人,敌人阶段也会按同一顺序执行各单位的行动,战斗启动时,每个 Strawman 实例的实际 HP 会从 14–18 中随机确定
场景布局和单位 View 应当保持相同的槽位映射,避免画面顺序与实际行动顺序脱节,敌人创作说明了 HP 范围、Intent 与 Behavior 怎样共同定义每个槽位中的敌人
用 Reward Deck 与 Battle Rules 完成战斗配方
参战双方确定后,Reward Deck 会决定胜利时可以生成哪些卡牌候选,Battle Rules 则会决定开局资源、回合抽牌、手牌处理、Intent 显示与奖励数量
Reward Deck
在 Reward Deck 中选择 Spoils of Battle,卡片会显示卡组名称、11 cards 与 1.73 平均费用

需要调整 Reward Deck 引用时,选择按钮可以替换奖励卡组,打开按钮会切换到 Deck 模式,× 会清空当前引用
每个 Reward Deck Entry 的 Copies 都会提供对应卡牌的抽取权重,Card Reward Count 则会决定本次请求的候选数量,运行时会据此带权且不重复地抽取条目
实际候选数量不会超过有效条目数,参与计算的 Copies 与 Card Reward Count 低于 1 时都会按 1 处理
Reward Deck 缺失或没有有效条目时不会产生卡牌候选,但胜利流程仍会进入奖励等待,项目的奖励 UI 需要提交其他奖励或调用 GCSApi.SkipReward(),本场胜利流程才会结束
候选生成与四类奖励结果见战斗循环
Battle Rules
奖励池只决定胜利后可以出现哪些卡牌,Battle Rules 则会把开局资源与手牌上限的创作基值、回合循环规则、Intent 显示范围和可供项目表现层读取的节奏参数保存在当前 Encounter 中
| 规则 | 运行结果 |
|---|---|
| Starting Hand Size | 战斗初始化时请求的起手数量,最小为 0,Innate 卡牌会优先参与起手抽取,OnDrawCards Hook 可以改写请求数量,最终进入手牌的数量仍受手牌上限约束 |
| Draw Per Turn | 从第 2 回合开始,每次 PlayerTurnStart 请求抽取的卡牌数,最小为 0,实际抽取数仍会经过 OnDrawCards Hook |
| Max Hand Size | 手牌上限的创作基值,最小为 1,OnHandSizeLimit Hook 会解析最终上限,开局与回合抽牌会把超出部分送入弃牌堆,其他抽牌调用达到上限后会停止 |
| Starting Energy | 大于 0 时作为每回合基础能量,0 会改用玩家角色的 Base Energy,随后仍会叠加 Run Energy Bonus 并经过 Energy Per Turn Hook |
| Card Reward Count | 胜利时请求的卡牌候选数,存在有效 Reward Deck 时,运行时会把低于 1 的值按 1 处理 |
| Armor Decay | ResetOnTurnStart 会在玩家回合开始和每个敌人行动开始时处理护甲重置,Persist 会保留护甲,Armor Reset Hook 仍可以改写或取消结果 |
| Hand Discard | 回合结束时先把 Ethereal 手牌移入 Exhaust Pile,DiscardOnTurnEnd 再保留 Retain 并弃掉其余手牌,Persist 会保留剩余手牌 |
| Enemy Intent Display | Hidden 不发送 OnEnemyUnitIntentChanged,IconOnly 会发送标签但把数值设为 -1,Full 会同时发送标签与数值,GCSApi.PendingIntents 仍可读取原始 Intent |
| Animation Gap | 以秒保存并显示在 Preview 中的表现节奏参数,项目表现层可以读取该值,当前内置状态机不会据此自动插入等待 |
The Threshing Field 将 Starting Hand Size 与 Draw Per Turn 都设为 5,将 Max Hand Size 设为 10,并将 Enemy Intent Display 设为 Full
Starting Energy 为 0,因此 Squire 的 3 点 Base Energy 会成为每回合能量的计算起点

状态机会在初始化阶段应用 Starting Hand Size,第一回合不会再叠加一次 Draw Per Turn
从第 2 回合开始,状态机才会在 PlayerTurnStart 应用每回合抽牌规则,完整执行顺序见战斗阶段与执行顺序
在 Preview 中核对最终战斗
完成 Inspector 配置后,Preview 会直接呈现当前 Encounter 的身份、阵容与规则摘要,进入 Play Mode 前即可核对引用和数值是否一致
Display
Display 会把 16:9 Icon、Name、Description 与 Difficulty 组合成一张玩家可识别的遭遇战信息卡,先确认画面与文字确实描述当前战斗

The Threshing Field 的横幅、名称、场景说明与 Normal 已经保持一致,继续在 Lineup 中核对 Player 与 Enemy Units 是否属于同一场战斗
Lineup
Lineup 会把当前 Player 与按槽位顺序排列的 Enemy Units 放在同一块预览中,直接呈现这场战斗的完整阵容

当前阵容已经确认为 Squire 对战 Strawman,战斗启动时,运行时会从预览所示区间内确定敌人的实际 HP
继续检查 Player 引用、槽位数量和排列顺序是否符合设计,并确认阵容与遭遇战身份一致
Battle Rules
阵容正确后,Preview 中的 Battle Rules 会将九项规则汇总为标签,需要对比多场遭遇战时,可以直接核对手牌、抽牌、能量、奖励、护甲、弃牌、Intent 与表现参数

这些标签与 Inspector 使用同一份 BattleRules 数据,Inspector 中的任何字段改动都会同步到对应标签,逐项对照即可确认规则摘要与输入值一致
Used By
Encounter 在 GCS 内容模型中属于由外部入口直接启动的顶层内容,不会作为子配置嵌套在另一份创作资产中,因此 Used By 会固定显示它没有父级内容资产
Used By 对 GameEncounter 只显示内容模型中的固定顶层提示,不会扫描场景中的 Bootstrap 或项目代码
实际启动入口仍需要在场景与项目流程中单独配置,固定场景可以保存 Encounter 引用,地图、任务和关卡流程则可以在运行时选择任意一场已创作的战斗
完成校验并接入启动流程
Workbench 会在保存和编辑期间检查 Encounter 的四项基础配置,Error 表示这份战斗缺少形成有效阵容所需的引用,Warning 表示分类或奖励配置仍不完整
这些校验只负责报告问题,不会拦截 StartBattle
| 级别 | 条件 | 需要完成的配置 |
|---|---|---|
| Error | Player Unit 为空 | 在 Player 中选择一个有效角色 |
| Error | Enemy Units 中没有任何非空敌人 | 至少加入一个有效敌人槽位 |
| Warning | Reward Deck 为空 | 需要卡牌候选时选择一份有效奖励卡组 |
| Warning | Difficulty 为空 | 选择内置难度或填写项目自定义标签 |
校验不会检查 Reward Deck 是否包含有效条目,也不会判断场景是否已经配置可用的 Manager、所选启动入口与表现层,消除表中的问题后,还要继续检查奖励池内容与场景入口
常见校验信息和修复路径见内容创作错误
校验完成后,固定战斗场景可以用 GameCardEncounterBootstrap 保存当前 Encounter,地图、任务或关卡流程则可以在 GCSApi.IsReady 后调用 GCSApi.StartBattle(encounter),两种入口都依赖场景中可用的 GameCardManager
任一入口以 The Threshing Field 启动战斗后,运行时都会按其中的玩家、敌人顺序、奖励池和 Battle Rules 创建单位与牌堆、抽取起手牌、解析首组 Intent,并进入第一个玩家回合
场景中的棋盘、单位 View 与手牌 UI 会把这些运行状态呈现为可以操作的战场
Bootstrap 的 Default Encounter、Auto Start On Play 与动态入口的生命周期见战斗启动,Manager、棋盘、单位 View、手牌 UI 与 Choice Presenter 的职责见战斗场景
进入 Play Mode 后,在 Game Card Monitor 中核对 Battle、Pile、Unit 与 Phase,确认当前 Encounter、玩家、敌人顺序、起手数量、能量、Intent 与阶段转换都对应 The Threshing Field
由外部系统读取或启动遭遇战的完整接口见 GCSApi 与战斗控制