using GeometryTD.Definition; using GeometryTD.UI; using UnityGameFramework.Runtime; namespace GeometryTD.CustomComponent { public sealed class CombatSettlementCommitter { public void CommitSettlementInventory(CombatSettlementContext settlementContext) { if (settlementContext == null || settlementContext.Flags.IsCommitted) { return; } BackpackInventoryData rewardInventory = settlementContext.Result.RewardInventory ?? new BackpackInventoryData(); GameEntry.PlayerInventory?.MergeInventory(rewardInventory); settlementContext.Result.RewardInventory = rewardInventory; settlementContext.Summary.RewardInventory = rewardInventory; settlementContext.Result.Endurance.AffectedTowerCount = ApplyDeferredSettlementEndurance(settlementContext); settlementContext.Flags.IsCommitted = true; } public void ApplySelectedReward(CombatSettlementContext settlementContext, RewardSelectItemRawData selectedReward) { if (settlementContext?.Result.RewardInventory == null || selectedReward?.SourceItem == null) { return; } TryAppendRewardComponent(settlementContext.Result.RewardInventory, selectedReward.SourceItem); settlementContext.Summary.RewardInventory = settlementContext.Result.RewardInventory; } private static int ApplyDeferredSettlementEndurance(CombatSettlementContext settlementContext) { if (settlementContext == null || settlementContext.Result.Endurance.EnduranceLossPerComponent <= 0f || settlementContext.Result.Endurance.TargetTowerInstanceIds.Count <= 0) { return 0; } PlayerInventoryComponent inventory = GameEntry.PlayerInventory; if (inventory == null) { return 0; } return inventory.ReduceTowerEndurance( settlementContext.Result.Endurance.TargetTowerInstanceIds, settlementContext.Result.Endurance.EnduranceLossPerComponent); } private static bool TryAppendRewardComponent(BackpackInventoryData rewardInventory, TowerCompItemData selectedItem) { if (rewardInventory == null || selectedItem == null) { return false; } if (selectedItem is MuzzleCompItemData muzzleComp) { rewardInventory.MuzzleComponents.Add(muzzleComp); return true; } if (selectedItem is BearingCompItemData bearingComp) { rewardInventory.BearingComponents.Add(bearingComp); return true; } if (selectedItem is BaseCompItemData baseComp) { rewardInventory.BaseComponents.Add(baseComp); return true; } return false; } } }