TH1/Unity/Assets/Scripts/TH1_UI/View/Interaction/UIInteractionCityLevelupView.cs
2026-06-12 16:02:05 +08:00

169 lines
5.6 KiB
C#

using System;
using System.Collections.Generic;
using Logic;
using Logic.Action;
using Logic.Multilingual;
using Microsoft.Win32.SafeHandles;
using RuntimeData;
using TH1_Logic.Core;
using TH1_UI.View.Announce;
using TH1_UI.View.Info;
using TH1Resource;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
namespace TH1_UI.View.Interaction
{
public class UIInteractionCityLevelupView : Base.View
{
public TextMeshProUGUI Title;
public MultilingualTextMono TitleMultilingual;
public UIInfoCommonBaseActionCircleMono ChoiceCircleA;
public UIInfoCommonBaseActionCircleMono ChoiceCircleB;
private CommonActionId _choiceA;
private CommonActionId _choiceB;
public ViDelegateAssisstant.Dele OnItemClick;
protected override void OnInit()
{
base.OnInit();
}
public void SetContent(int cid, CommonActionId choiceA,CommonActionId choiceB,CommonActionParams choiceParamA,CommonActionParams choiceParamB,Action<CommonActionId,CommonActionParams> onChoice)
{
//Step #1 设置城市标题
_choiceA = choiceA;
_choiceB = choiceB;
if (Main.MapData.CityMap.GetCityById((uint)cid, out var city)
&& Table.Instance.CivDataAssets.GetCityInfo(city.Name, out var cityInfo))
MultilingualManager.Instance.SetUIText(Title,TitleMultilingual.ID.ToString(),new List<string>(){MultilingualManager.Instance.GetMultilingualTextSafe(cityInfo.CityName)});
//Step #2 设置ChoiceA
ChoiceCircleA.SetContent(choiceA,ShowType.None,choiceParamA,onChoice);
//Step #3 设置ChoiceB
ChoiceCircleB.SetContent(choiceB,ShowType.None,choiceParamB,onChoice);
}
public bool GetPos(CityLevelUpActionType actionType, out Vector3 pos)
{
pos = Vector3.zero;
if (_choiceA.CityLevelUpActionType == actionType)
{
pos = ChoiceCircleA.transform.position;
return true;
}
if (_choiceB.CityLevelUpActionType == actionType)
{
pos = ChoiceCircleB.transform.position;
return true;
}
return false;
}
}
public class UIInteractionTreasureView : Base.View
{
public TextMeshProUGUI Title;
public MultilingualTextMono TitleMultilingual;
public Transform CircleRow;
public GameObject ActionCirclePrefab;
private readonly List<UIInfoCommonBaseActionCircleMono> _actionCircleMonoList = new();
private Action<CommonActionId, CommonActionParams> _onChoice;
protected override void OnInit()
{
base.OnInit();
AutoBindReferences();
}
public void SetContent(ActionOptionGroup optionGroup, Action<CommonActionId, CommonActionParams> onChoice)
{
AutoBindReferences();
_onChoice = onChoice;
if (optionGroup?.ActionOptionList == null || CircleRow == null) return;
if (Title != null)
{
if (TryGetTreasureTitle(out var title))
Title.text = title;
else if (TitleMultilingual != null)
MultilingualManager.Instance.SetUIText(Title, TitleMultilingual.ID.ToString());
else
Title.text = "";
}
EnsureActionCircleCount(optionGroup.ActionOptionList.Count);
for (var i = 0; i < _actionCircleMonoList.Count; i++)
{
var mono = _actionCircleMonoList[i];
mono.gameObject.SetActive(i < optionGroup.ActionOptionList.Count);
if (i >= optionGroup.ActionOptionList.Count) continue;
mono.SetTreasureOptionContent(optionGroup.ActionOptionList[i], OnActionCircleClicked);
}
}
public void CloseView()
{
_onChoice = null;
}
private void EnsureActionCircleCount(int count)
{
if (ActionCirclePrefab == null)
ActionCirclePrefab = ResourceLoader.Load<GameObject>("Prefab/UI/Info/UIInfoCommonBaseActionCircle");
if (ActionCirclePrefab == null || CircleRow == null) return;
while (_actionCircleMonoList.Count < count)
{
var actionCircle = Instantiate(ActionCirclePrefab, CircleRow, false);
actionCircle.transform.localScale = Vector3.one;
actionCircle.transform.localPosition = Vector3.zero;
if (!actionCircle.TryGetComponent<UIInfoCommonBaseActionCircleMono>(out var mono))
{
Debug.LogError("UIInteractionTreasureView: UIInfoCommonBaseActionCircle prefab missing UIInfoCommonBaseActionCircleMono.");
Destroy(actionCircle);
break;
}
_actionCircleMonoList.Add(mono);
}
}
private void OnActionCircleClicked(CommonActionId actionId, CommonActionParams param)
{
_onChoice?.Invoke(actionId, param);
}
private void AutoBindReferences()
{
if (Title == null)
Title = transform.Find("Name")?.GetComponent<TextMeshProUGUI>();
if (TitleMultilingual == null)
TitleMultilingual = transform.Find("Name")?.GetComponent<MultilingualTextMono>();
if (CircleRow == null)
CircleRow = transform.Find("CircleRow");
}
private bool TryGetTreasureTitle(out string title)
{
title = "";
if (!Table.Instance.GridAndResourceDataAssets.GetResourceInfo(ResourceType.Treasure, out var resourceInfo))
return false;
title = MultilingualManager.Instance.GetMultilingualTextSafe(resourceInfo.ResourceName);
return !string.IsNullOrEmpty(title);
}
}
}