using System.Collections.Generic; using GeometryTD.Definition; using GeometryTD.Entity.EntityData; using GeometryTD.UI; using UnityEngine; namespace GeometryTD.CustomComponent { internal sealed class CombatLoadingState : CombatStateBase { public CombatLoadingState(CombatSchedulerRuntime runtime, CombatSchedulerCoordinator coordinator) : base(runtime, coordinator) { } public override void OnEnter() { if (Runtime.CurrentLevel == null) { Coordinator.EnterFailureFallback("Combat loading failed. Current level is null."); return; } MapEntityLoadContext mapLoadContext = BuildMapLoadContext(); if (!Runtime.LoadSession.StartLoading(Runtime.CurrentLevel, mapLoadContext, Coordinator.Port, out string errorMessage)) { Coordinator.EnterFailureFallback($"Combat loading failed. {errorMessage}"); } } public override void OnUpdate(float elapseSeconds, float realElapseSeconds) { _ = elapseSeconds; _ = realElapseSeconds; if (!Runtime.LoadSession.IsReady) { return; } Coordinator.TryBeginNextPhase(); } private MapEntityLoadContext BuildMapLoadContext() { List buildTowerStatsSnapshot = new(); for (int i = 0; i < Runtime.CombatRunResourceStore.CurrentBuildTowerCount; i++) { if (Runtime.CombatRunResourceStore.TryGetBuildTowerStats(i, out TowerStatsData stats) && stats != null) { buildTowerStatsSnapshot.Add(stats); } } MapData mapData = new MapData( entityId: 0, typeId: 0, levelId: Runtime.CurrentLevel.Id, position: Vector3.zero, initialCoin: Runtime.CombatRunResourceStore.CurrentCoin, buildTowerStatsSnapshot: buildTowerStatsSnapshot, inventorySnapshot: Runtime.CombatRunResourceStore.GetCombatInventorySnapshot(), participantTowerSnapshot: Runtime.CombatRunResourceStore.GetParticipantTowerSnapshot()); return new MapEntityLoadContext( mapData, Runtime.CombatRunResourceStore.TryConsumeCoin, Runtime.CombatRunResourceStore.AddCoin); } } }