跳到主要内容

战斗循环

GCS · Core Concepts

每场 GCS 战斗都遵循同一个循环:加载遭遇战、抽牌、出牌、结算敌人意图,直到进入胜利或失败阶段。本页将该循环对应到 BattlePhase 枚举值。

适用于确认卡牌何时可以打出、状态何时结算、战斗何时结束,以及运行时当前处于哪个阶段。

GCS 的战斗流程由固定阶段推进:加载遭遇战,抽牌,在玩家阶段出牌,结算敌人意图,然后进入下一个回合,直到胜利或失败。设计卡牌、状态、敌人和遭遇战时,应先确认它们对应的阶段和触发时机。

运行时用 BattlePhase 表示当前阶段:


阶段概览

阶段面向用户的含义
Initialize正在准备遭遇战、单位、牌组、规则和初始手牌
PlayerTurnStart结算回合开始规则、抽牌、能量、状态和 hook
PlayerPhase玩家可以查看手牌、选择目标、打出卡牌并结束回合
PlayerTurnEnd结算回合结束弃牌、状态衰减、延迟触发和清理
EnemyPhase敌人展示或结算意图,并运行各自的行为图
BattleWon所有胜利条件已经满足,可以播放奖励和胜利表现
BattleLost玩家失败,可以播放失败表现并执行清理

None 表示没有活动战斗,通常出现在战斗创建之前或拆除之后。


加载遭遇战

战斗从一个遭遇战(encounter)开始。遭遇战提供玩家单位、敌人阵容、奖励牌组、战斗规则,以及场景可使用的标签和显示信息。场景 bootstrap 和 GameCardManager 会把场景连接到选中的遭遇战和当前启用的数据库。

战斗规则会驱动 PlayerTurnStartPlayerTurnEnd 中的大部分流程。以 demo 遭遇战 The Threshing Field 为例:初始手牌 5 张、每回合抽 5 张、手牌上限 10、护甲回合开始重置、回合结束弃牌。修改这些规则会直接改变回合循环。


玩家回合

PlayerTurnStart,GCS 按顺序应用遭遇战规则:重置或保留护甲,增加本回合能量,抽牌,结算回合开始的状态和 hook,最后执行手牌上限。

PlayerPhase 中,一张牌要同时满足这些条件才可以打出:

  • 它在手牌中;
  • 结算费用修正后,玩家仍有足够能量;
  • 目标模式已经满足(SingleEnemyUnit 的牌需要选中一个存活敌人);
  • 可打出性 hook 没有取消它;
  • 战斗当前没有在等待其他流程,例如一个选择或动画门

在代码中,GCSApi.CanPlayCard 使用同一份检查清单。任何条件不满足时,GCSApi.TryPlayCard 返回 false,不会抛异常。

卡牌结算后,会根据卡牌标签和规则移动到对应牌堆:通常进入弃牌堆,消耗牌进入消耗(exhaust)堆。

"手牌"包含本回合新抽的牌吗?

包含。手牌指检查时手牌堆中的全部卡牌,包括同一回合内由其他卡牌效果抽到的牌。


敌人回合

敌人的行为通过 FlowGraph 创作。敌人阶段通常按顺序执行三件事:结算敌人意图,运行每个敌人的行动,然后推进到下一个玩家回合。

意图(intent)是面向玩家的行动预告。每个敌人在行动前都会显示自己将要执行的行动类别,即使底层行为图更复杂。意图应准确反映下一步行动,让玩家可以规划自己的回合。


胜利、失败与奖励

胜利表示所有必需击败的敌人都已被击败。失败表示玩家单位死亡,或战斗规则进入失败状态。胜负判定由阶段机制执行,通常发生在回合切换和出牌结算之后。只从代码直接修改 HP 不会立即结束战斗;循环会在下一次判定时发现结果。

阶段进入 BattleWon 后,demo 会显示奖励界面:从遭遇战奖励池抽出的卡牌、永久能量升级,或永久费用折扣。

战斗胜利后的奖励界面:三张奖励卡牌,加上 +1 Max Energy、-1 Cost (All Cards) 和 Skip 按钮


从代码观察循环

GCSApi 直接暴露了这个循环。订阅返回 IDisposable,组件销毁时记得释放:

using TinyGiants.GCS.Runtime;

// React to loop milestones.
var turnSub = GCSApi.OnTurnStarted(args =>
Debug.Log($"Turn {GCSApi.TurnNumber} started"));
var playSub = GCSApi.OnCardPlayed(args =>
Debug.Log("A card resolved"));

// Or poll the phase anywhere.
if (GCSApi.Phase == BattlePhase.PlayerPhase && GCSApi.IsPlayerTurn)
{
GCSApi.EndPlayerTurn();
}

在 Play Mode 中打开 Game Card Monitor,可以直接查看阶段状态。Phase 标签显示当前阶段和历史记录;当它显示 BattleWonBattleLost 时,表示核心运行时已经得出结果,即使奖励 UI 或失败表现仍在播放。

Game Card Monitor 的 Phase 标签,显示运行中战斗的当前 BattlePhase 和阶段切换历史


设计建议

  • PlayerPhase 中的卡牌效果保持可读。
  • 把延迟或反应式行为放在明确的触发器或状态上。
  • 在敌人行动前显示可读意图。
  • 用 hook 修改数值,不要用 hook 隐藏卡牌的主要结果。
  • 阶段行为不符合预期时,先看 Monitor,再检查 FlowGraph。