补全 S1 测试

- 调整 CombatNode 正常结束与异常的变量语义,现在是 DidCombatWin 与 Exception
- 补充测试样例
- 完成 S1 目标
This commit is contained in:
SepComet
2026-03-08 21:10:03 +08:00
parent 1023239880
commit 793a87c171
29 changed files with 393 additions and 113 deletions
@@ -91,7 +91,7 @@ namespace GeometryTD.CustomComponent
_runtime.EnemyManager.EndPhase();
_runtime.EnemyManager.ResetCombatStats();
_coordinator.ResetRuntime();
_runtime.IsFinishAsVictory = true;
_runtime.DidCombatWin = true;
_runtime.CurrentLevel = level;
_runtime.RunId = runId;
@@ -53,7 +53,7 @@ namespace GeometryTD.CustomComponent
_runtime.EnemyDropResolver.Reset();
_runtime.SettlementContext = null;
_runtime.CurrentLevel = null;
_runtime.IsFinishAsVictory = true;
_runtime.DidCombatWin = true;
_runtime.IsCompleted = false;
_runtime.NodeEnterFired = false;
_runtime.RunId = null;
@@ -124,21 +124,21 @@ namespace GeometryTD.CustomComponent
TryBeginNextPhase();
}
public bool ShouldEnterSettlementFromActiveState(out bool isVictory)
public bool ShouldEnterSettlementFromActiveState(out bool didCombatWin)
{
if (GetCurrentBaseHp() <= 0)
{
isVictory = false;
didCombatWin = false;
return true;
}
if (_runtime.PhaseLoopRuntime.IsEndCombatRequested)
{
isVictory = true;
didCombatWin = true;
return true;
}
isVictory = true;
didCombatWin = true;
return false;
}
@@ -198,9 +198,9 @@ namespace GeometryTD.CustomComponent
GameEntry.UIRouter.CloseUI(UIFormType.DialogForm);
}
public void CompleteNormalCombatAndNotify(bool succeeded)
public void CompleteNormalCombatAndNotify(bool didCombatWin)
{
CompleteCombat(succeeded);
CompleteCombat(didCombatWin);
GameEntry.Event.Fire(
this,
NodeCompleteEventArgs.Create(
@@ -208,7 +208,8 @@ namespace GeometryTD.CustomComponent
_runtime.NodeId,
_runtime.NodeType,
_runtime.SequenceIndex,
succeeded,
RunNodeCompletionStatus.Completed,
didCombatWin,
GameEntry.PlayerInventory != null ? GameEntry.PlayerInventory.GetInventorySnapshot() : null));
}
@@ -219,7 +220,16 @@ namespace GeometryTD.CustomComponent
CloseRewardSelectForm();
CloseDialogForm();
CompleteCombat(false);
GameEntry.Event.Fire(this, CombatFailureReturnEventArgs.Create());
GameEntry.Event.Fire(
this,
NodeCompleteEventArgs.Create(
_runtime.RunId,
_runtime.NodeId,
_runtime.NodeType,
_runtime.SequenceIndex,
RunNodeCompletionStatus.Exception,
false,
GameEntry.PlayerInventory != null ? GameEntry.PlayerInventory.GetInventorySnapshot() : null));
}
public bool HandleStartFailure(string errorMessage)
@@ -26,7 +26,7 @@ namespace GeometryTD.CustomComponent
public RewardSelectFormUseCase RewardSelectFormUseCase { get; set; }
public CombatStateBase CurrentState { get; set; }
public Action<bool> CombatEndedCallback { get; set; }
public bool IsFinishAsVictory { get; set; } = true;
public bool DidCombatWin { get; set; } = true;
public bool IsCompleted { get; set; }
public bool NodeEnterFired { get; set; }
public CombatSettlementContext SettlementContext { get; set; }
@@ -18,7 +18,7 @@ namespace GeometryTD.CustomComponent
internal sealed class CombatSettlementResult
{
public bool IsVictory;
public bool DidCombatWin;
public int FinalCoin;
public int FinalBaseHp;
public int MaxBaseHp;
@@ -18,14 +18,14 @@ namespace GeometryTD.CustomComponent
private const float LowBaseHpTowerEndurancePenalty = 10f;
public CombatSettlementContext BuildSettlementContext(
bool isVictory,
bool didCombatWin,
DRLevel currentLevel,
int defeatedEnemyCount,
CombatRunResourceStore resourceStore)
{
bool shouldOpenFullBaseHpRewardSelect = false;
ResolveSettlementByBaseHp(
isVictory,
didCombatWin,
currentLevel,
resourceStore,
out int currentBaseHp,
@@ -39,7 +39,7 @@ namespace GeometryTD.CustomComponent
CombatSettlementContext settlementContext = new CombatSettlementContext
{
};
settlementContext.Result.IsVictory = isVictory;
settlementContext.Result.DidCombatWin = didCombatWin;
settlementContext.Result.FinalCoin = Mathf.Max(0, resourceStore != null ? resourceStore.CurrentCoin : 0);
settlementContext.Result.FinalBaseHp = currentBaseHp;
settlementContext.Result.MaxBaseHp = maxBaseHp;
@@ -173,7 +173,7 @@ namespace GeometryTD.CustomComponent
}
private static void ResolveSettlementByBaseHp(
bool isVictory,
bool didCombatWin,
DRLevel currentLevel,
CombatRunResourceStore resourceStore,
out int currentBaseHp,
@@ -197,7 +197,7 @@ namespace GeometryTD.CustomComponent
appliedLowBaseHpPenalty = false;
shouldOpenFullBaseHpRewardSelect = false;
if (!isVictory || resourceStore == null)
if (!didCombatWin || resourceStore == null)
{
return;
}
@@ -66,9 +66,9 @@ namespace GeometryTD.CustomComponent
Runtime.PhaseLoopRuntime.AdvancePhaseElapsed(elapseSeconds);
Runtime.EnemyManager.OnUpdate(elapseSeconds, realElapseSeconds);
if (Coordinator.ShouldEnterSettlementFromActiveState(out bool isVictory))
if (Coordinator.ShouldEnterSettlementFromActiveState(out bool didCombatWin))
{
Coordinator.ChangeState(new CombatSettlementState(Runtime, Coordinator, isVictory));
Coordinator.ChangeState(new CombatSettlementState(Runtime, Coordinator, didCombatWin));
return;
}
@@ -2,23 +2,23 @@ namespace GeometryTD.CustomComponent
{
internal sealed class CombatSettlementState : CombatStateBase
{
private readonly bool _isVictory;
private readonly bool _didCombatWin;
public CombatSettlementState(
CombatSchedulerRuntime runtime,
CombatSchedulerCoordinator coordinator,
bool isVictory) : base(runtime, coordinator)
bool didCombatWin) : base(runtime, coordinator)
{
_isVictory = isVictory;
_didCombatWin = didCombatWin;
}
public override void OnEnter()
{
Runtime.EnemyManager.EndPhase();
Runtime.EnemyManager.CleanupTrackedEnemies();
Runtime.IsFinishAsVictory = _isVictory;
Runtime.DidCombatWin = _didCombatWin;
Runtime.SettlementContext = Runtime.CombatSettlementService.BuildSettlementContext(
_isVictory,
_didCombatWin,
Runtime.CurrentLevel,
Runtime.EnemyManager.DefeatedEnemyCount,
Runtime.CombatRunResourceStore);
@@ -22,9 +22,9 @@ namespace GeometryTD.CustomComponent
Runtime.PhaseLoopRuntime.AdvancePhaseElapsed(elapseSeconds);
if (Coordinator.ShouldEnterSettlementFromActiveState(out bool isVictory))
if (Coordinator.ShouldEnterSettlementFromActiveState(out bool didCombatWin))
{
Coordinator.ChangeState(new CombatSettlementState(Runtime, Coordinator, isVictory));
Coordinator.ChangeState(new CombatSettlementState(Runtime, Coordinator, didCombatWin));
return;
}
@@ -34,7 +34,7 @@ namespace GeometryTD.CustomComponent
Runtime.LoadSession.Cleanup();
Coordinator.CloseCombatFinishForm();
Coordinator.CloseRewardSelectForm();
Coordinator.CompleteNormalCombatAndNotify(Runtime.IsFinishAsVictory);
Coordinator.CompleteNormalCombatAndNotify(Runtime.DidCombatWin);
}
}
}
@@ -94,6 +94,7 @@ namespace GeometryTD.CustomComponent
_activeNodeId,
_activeNodeType,
_activeSequenceIndex,
RunNodeCompletionStatus.Completed,
true,
GameEntry.PlayerInventory != null ? GameEntry.PlayerInventory.GetInventorySnapshot() : null));
ClearActiveNodeContext();
@@ -59,6 +59,7 @@ namespace GeometryTD.CustomComponent
_activeNodeId,
_activeNodeType,
_activeSequenceIndex,
RunNodeCompletionStatus.Completed,
true,
GameEntry.PlayerInventory != null ? GameEntry.PlayerInventory.GetInventorySnapshot() : null));
ClearActiveNodeContext();