using System; using System.Collections.Generic; using GeometryTD.DataTable; using GeometryTD.Definition; using GeometryTD.UI; using UnityEngine; using UnityGameFramework.Runtime; namespace GeometryTD.CustomComponent { public sealed class CombatSettlementService { private const int RewardSelectDisplayCount = 3; private readonly CombatSettlementCalculator _calculator = new(); private readonly CombatSettlementCommitter _committer = new(); public CombatSettlementContext BuildSettlementContext( bool didCombatWin, DRLevel currentLevel, int defeatedEnemyCount, CombatRunResourceStore resourceStore) { return _calculator.BuildSettlementContext( didCombatWin, currentLevel, defeatedEnemyCount, resourceStore); } public void CommitSettlementInventory(CombatSettlementContext settlementContext) { _committer.CommitSettlementInventory(settlementContext); } public bool TryPrepareRewardSelection( CombatSettlementContext settlementContext, int displayPhaseIndex, LevelThemeType themeType, int runSeed, int sequenceIndex, ref int nextRewardOrdinal, RewardSelectFormUseCase rewardSelectFormUseCase, Action onRewardSelected, Action onGiveUp) { if (settlementContext == null || rewardSelectFormUseCase == null) { return false; } IReadOnlyList candidateItems = GameEntry.InventoryGeneration.BuildRewardCandidates( displayPhaseIndex, themeType, RewardSelectDisplayCount, runSeed, sequenceIndex, ref nextRewardOrdinal); if (candidateItems == null || candidateItems.Count <= 0) { settlementContext.Flags.ShouldOpenRewardSelection = false; return false; } rewardSelectFormUseCase.SetCallbacks(onRewardSelected, onGiveUp); rewardSelectFormUseCase.ConfigureRewardCandidates( candidateItems, displayCount: RewardSelectDisplayCount, refreshCost: 0, allowRotateOnce: false, allowGiveUp: false, tipText: "基地满血奖励:请选择 1 个组件"); RewardSelectFormRawData rawData = rewardSelectFormUseCase.CreateInitialModel(); if (rawData == null || rawData.RewardItems == null || rawData.RewardItems.Length <= 0) { settlementContext.Flags.ShouldOpenRewardSelection = false; return false; } settlementContext.Flags.DidEnterRewardSelection = true; GameEntry.UIRouter.OpenUI(UIFormType.RewardSelectForm, rawData); return true; } public void ApplySelectedReward(CombatSettlementContext settlementContext, RewardSelectItemRawData selectedReward) { _committer.ApplySelectedReward(settlementContext, selectedReward); } public void OpenCombatFinishForm( CombatSettlementContext settlementContext, CombatFinishFormUseCase combatFinishFormUseCase) { if (settlementContext == null || combatFinishFormUseCase == null) { return; } combatFinishFormUseCase.SetSummary(settlementContext); GameEntry.UIRouter.OpenUI(UIFormType.CombatFinishForm); } } }