using System.Collections.Generic; using GameFramework.Event; using GeometryTD.CustomEvent; using GeometryTD.Definition; using UnityEngine; using UnityGameFramework.Runtime; namespace GeometryTD.UI { public partial class CombatFinishFormController : UIFormControllerCommonBase { private CombatFinishFormUseCase _useCase; private readonly Dictionary _itemDescSeedMap = new Dictionary(); private sealed class ItemDescSeed { public string Title; public string TypeText; public string Description; public TagType[] Tags; public TagRuntimeData[] TagRuntimes; } protected override UIFormType UIFormTypeId => UIFormType.CombatFinishForm; protected override void RefreshUI(CombatFinishForm form, CombatFinishFormContext context) { form.RefreshUI(context); } protected override void SubscribeCustomEvents() { GameEntry.Event.Subscribe(CombatFinishReturnEventArgs.EventId, OnCombatFinishReturnButtonClicked); GameEntry.Event.Subscribe(RepoItemClickedEventArgs.EventId, OnRepoItemClicked); } protected override void UnsubscribeCustomEvents() { GameEntry.Event.Unsubscribe(CombatFinishReturnEventArgs.EventId, OnCombatFinishReturnButtonClicked); GameEntry.Event.Unsubscribe(RepoItemClickedEventArgs.EventId, OnRepoItemClicked); } public override int? OpenUI(object userData = null) { if (userData is CombatFinishFormContext context) { return OpenUIInternal(context); } if (userData is CombatFinishFormRawData rawDataFromUserData) { return OpenUI(rawDataFromUserData); } if (userData != null) { Log.Warning("CombatFinishFormController.OpenUI() userData type is invalid."); return null; } if (_useCase == null) { Log.Error("CombatFinishFormController.OpenUI() useCase is null."); return null; } CombatFinishFormRawData rawData = _useCase.CreateInitialModel(); return OpenUI(rawData); } public int? OpenUI(CombatFinishFormRawData rawData) { CombatFinishFormContext context = BuildContext(rawData); return OpenUIInternal(context); } public override void BindUseCase(IUIUseCase useCase) { if (!(useCase is CombatFinishFormUseCase combatFinishFormUseCase)) { Log.Error("CombatFinishFormController.BindUseCase() useCase is invalid."); return; } _useCase = combatFinishFormUseCase; } #region Event Handlers private void OnCombatFinishReturnButtonClicked(object sender, GameEventArgs e) { if (!IsEventFromCurrentForm(sender) || !(e is CombatFinishReturnEventArgs)) { return; } _useCase?.TryReturnToMenu(); } private void OnRepoItemClicked(object sender, GameEventArgs e) { if (!IsEventFromCurrentForm(sender)) { return; } if (!(e is RepoItemClickedEventArgs args)) { return; } if (!_itemDescSeedMap.TryGetValue(args.ItemId, out ItemDescSeed seed)) { return; } GameEntry.UIRouter.OpenUI(UIFormType.ItemDescForm, new ItemDescFormRawData { Title = seed.Title, TypeText = seed.TypeText, Description = seed.Description ?? string.Empty, Price = 0, ScreenPosition = args.ScreenPosition, Tags = seed.Tags, TagRuntimes = seed.TagRuntimes }); } #endregion private bool IsEventFromCurrentForm(object sender) { if (Form == null) { return false; } if (ReferenceEquals(sender, Form)) { return true; } if (sender is Component component) { CombatFinishForm ownerForm = component.GetComponentInParent(); return ownerForm == Form; } return false; } } }