using GeometryTD.Definition; namespace GeometryTD.UI { public class CombatInfoFormUseCase : IUIUseCase { public CombatInfoFormRawData CreateInitialModel() { return BuildModel(); } public CombatInfoFormRawData TryRefresh() { return BuildModel(); } public bool TryEndCombat() { if (GameEntry.CombatNode == null || !GameEntry.CombatNode.CanEndCombat) { return false; } return GameEntry.CombatNode.TryEndCombatByPlayer(); } private static CombatInfoFormRawData BuildModel() { if (GameEntry.CombatNode == null) { return null; } var level = GameEntry.CombatNode.CurrentLevel; LevelThemeType themeType = level != null ? level.LevelThemeType : GameEntry.CombatNode.CurrentThemeType; int levelId = level != null ? level.Id : 0; int baseHpMax = level != null ? level.BaseHp : 0; int enemyHpRateMultiplier = ResolveEnemyHpRateMultiplier( GameEntry.CombatNode.CurrentPhaseIndex, GameEntry.CombatNode.CurrentLevelPhaseCount); return new CombatInfoFormRawData { LevelThemeType = themeType, LevelId = levelId, CurrentPhaseIndex = GameEntry.CombatNode.CurrentPhaseIndex, TotalPhaseCount = GameEntry.CombatNode.CurrentLevelPhaseCount, Coin = GameEntry.CombatNode.CurrentCoin, BaseHp = GameEntry.CombatNode.CurrentBaseHp, BaseHpMax = baseHpMax, EnemyHpRateMultiplier = enemyHpRateMultiplier, CanPause = true, CanEnd = GameEntry.CombatNode.CanEndCombat }; } private static int ResolveEnemyHpRateMultiplier(int currentPhaseIndex, int totalPhaseCount) { if (currentPhaseIndex <= 0 || totalPhaseCount <= 0) { return 1; } int completedLoopCount = UnityEngine.Mathf.Max(0, (currentPhaseIndex - 1) / totalPhaseCount); if (completedLoopCount >= 30) { return int.MaxValue; } return 1 << completedLoopCount; } } }