620 lines
22 KiB
C#
620 lines
22 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using Animancer;
|
|
using Logic;
|
|
using Logic.Action;
|
|
using Logic.Audio;
|
|
using Logic.CrashSight;
|
|
using Logic.Multilingual;
|
|
using Logic.Skill;
|
|
using RuntimeData;
|
|
using TH1_Core.Events;
|
|
using TH1_Core.Managers;
|
|
using TH1_Logic.Core;
|
|
using TH1_UI.Components;
|
|
using TH1_UI.HintUI;
|
|
using TH1Renderer;
|
|
using TH1Resource;
|
|
using TMPro;
|
|
using UI.HintUI;
|
|
using Unity.VisualScripting;
|
|
using UnityEngine;
|
|
using UnityEngine.UI;
|
|
|
|
namespace TH1_UI.View.Info
|
|
{
|
|
public class UIInfoGridInfoView : Base.View
|
|
{
|
|
public Button closeButton;
|
|
public ViDelegateAssisstant.Dele OnBtnCloseClick;
|
|
|
|
[Header("GridInfo相关")]
|
|
public GameObject GridInfoArea;
|
|
public GameObject GridPreview;
|
|
public GameObject GridCamera;
|
|
public TextMeshProUGUI GridInfoTitle;
|
|
public TextMeshProUGUI GridInfoDesc;
|
|
public TextMeshProUGUI GridInfoTerrainTxt;
|
|
public TextMeshProUGUI GridInfoResourceTxt;
|
|
public TextMeshProUGUI GridInfoBuildingTxt;
|
|
public HintTrigger GridInfoHint;
|
|
|
|
[Header("CityInfo相关")]
|
|
public GameObject CityInfoArea;
|
|
public GameObject CityPreview;
|
|
public GameObject CityCamera;
|
|
public GameObject CityInfoDataArea;
|
|
public TextMeshProUGUI CityInfoTitle;
|
|
public TextMeshProUGUI CityInfoDesc;
|
|
public TextMeshProUGUI CityInfoCoinTxt;
|
|
public TextMeshProUGUI CityInfoTechTxt;
|
|
public TextMeshProUGUI CityInfoDiamondTxt;
|
|
public TextMeshProUGUI CityInfoPopulationTxt;
|
|
public TextMeshProUGUI CityInfoConnectTxt;
|
|
|
|
[Header("UnitInfo相关")]
|
|
public GameObject UnitInfoArea;
|
|
public Image UnitPreview;
|
|
public GameObject SkillArea;
|
|
public TextMeshProUGUI UnitInfoTitle;
|
|
public TextMeshProUGUI UnitInfoDesc;
|
|
public TextMeshProUGUI UnitInfoAttackTxt;
|
|
public TextMeshProUGUI UnitInfoDefendTxt;
|
|
public TextMeshProUGUI UnitInfoHealthTxt;
|
|
public TextMeshProUGUI UnitInfoMoveTxt;
|
|
public TextMeshProUGUI UnitInfoRangeTxt;
|
|
public HintTrigger UnitInfoHint;
|
|
|
|
[Header("TaskInfo相关")]
|
|
public GameObject TaskArea;
|
|
public TextMeshProUGUI TaskDesc;
|
|
|
|
|
|
[Header("CommonInfo相关")]
|
|
public GameObject AvatarArea;
|
|
|
|
public GameObject AvatarHint;
|
|
public GameObject Avatar;
|
|
public GameObject AvatarTitleArea;
|
|
public TextMeshProUGUI AvatarTitle;
|
|
public Image AvatarImg;
|
|
public Button AvatarBtn;
|
|
|
|
|
|
|
|
|
|
public GameObject ActionArea;
|
|
public TextMeshProUGUI ActionHint;
|
|
public RectTransform VerticalGroup;
|
|
public GameObject ActionCirclePrefab;
|
|
public GameObject SkillCirclePrefab;
|
|
|
|
|
|
private List<UIInfoCommonBaseActionCircleMono> ActionCircleMonoList = null;
|
|
private List<UIInfoCommonBaseSkillCircleMono> SkillCircleMonoList = null;
|
|
private int _actionCount;
|
|
protected override void OnInit()
|
|
{
|
|
base.OnInit();
|
|
ActionCircleMonoList = new List<UIInfoCommonBaseActionCircleMono>();
|
|
SkillCircleMonoList = new List<UIInfoCommonBaseSkillCircleMono>();
|
|
ActionAreaInit();
|
|
SkillAreaInit();
|
|
closeButton.onClick.RemoveAllListeners();
|
|
closeButton.onClick.AddListener(() => { OnBtnCloseClick?.Invoke(); });
|
|
//CheckPanel.InitStart(RefreshStatus);
|
|
|
|
|
|
}
|
|
|
|
//清除所有actioncircle,重新开始生成
|
|
private void ActionAreaInit()
|
|
{
|
|
if (gameObject == null) return;
|
|
for (int i = ActionArea.transform.childCount - 1; i >= 0; i--)
|
|
{
|
|
Transform child = ActionArea.transform.GetChild(i);
|
|
// 判断组件是否存在
|
|
if (child.GetComponent<UIInfoCommonBaseActionCircleMono>() != null)
|
|
{
|
|
// 正确调用 Destroy 方法,销毁子对象的 GameObject
|
|
Destroy(child.gameObject);
|
|
}
|
|
}
|
|
|
|
ActionCircleMonoList.Clear();
|
|
ActionCircleMonoList = new List<UIInfoCommonBaseActionCircleMono>();
|
|
}
|
|
|
|
private void SkillAreaInit()
|
|
{
|
|
if (gameObject == null) return;
|
|
for (int i = SkillArea.transform.childCount - 1; i >= 0; i--)
|
|
{
|
|
Transform child = SkillArea.transform.GetChild(i);
|
|
// 判断组件是否存在
|
|
if (child.GetComponent<UIInfoCommonBaseSkillCircleMono>() != null)
|
|
{
|
|
// 正确调用 Destroy 方法,销毁子对象的 GameObject
|
|
Destroy(child.gameObject);
|
|
}
|
|
}
|
|
|
|
SkillCircleMonoList.Clear();
|
|
SkillCircleMonoList = new List<UIInfoCommonBaseSkillCircleMono>();
|
|
}
|
|
|
|
public void SetContent(ShowUIInfoGridInfo evt)
|
|
{
|
|
SetContentAvatar(evt);
|
|
SetContentGrid(evt);
|
|
SetContentUnit(evt);
|
|
SetContentCity(evt);
|
|
SetContentSkill(evt);
|
|
SetContentAction(evt);
|
|
SetContentTask(evt);
|
|
LayoutRebuilder.ForceRebuildLayoutImmediate(VerticalGroup);
|
|
}
|
|
|
|
private void SetContentAvatar(ShowUIInfoGridInfo evt)
|
|
{
|
|
AvatarArea.SetActive(true);
|
|
|
|
PlayerData player = null;
|
|
switch (evt.type)
|
|
{
|
|
case UIGridInfoType.grid: // City is on a grid, so its ID is a GID
|
|
Main.MapData.GetPlayerDataByTerritoryGridId(evt.id, out player);
|
|
break;
|
|
case UIGridInfoType.unit:
|
|
Main.MapData.GetPlayerDataByUnitId(evt.id, out player);
|
|
break;
|
|
}
|
|
|
|
if (player == null || !Table.Instance.PlayerDataAssets.GetPlayerInfo(player, out var info))
|
|
{
|
|
AvatarTitleArea.SetActive(false);
|
|
AvatarHint.SetActive(false);
|
|
Avatar.SetActive(false);
|
|
return;
|
|
}
|
|
|
|
AvatarTitleArea.SetActive(true);
|
|
AvatarHint.SetActive(true);
|
|
Avatar.SetActive(true);
|
|
|
|
if(!Main.MapData.PlayerMap.SelfPlayerData.MeetPlayers.Contains(player.Id))
|
|
{
|
|
AvatarBtn.onClick.RemoveAllListeners();
|
|
AvatarImg.sprite = Table.Instance.PlayerDataAssets.CommonPlayerAvatar;
|
|
AvatarTitle.text = "???";
|
|
LayoutRebuilder.ForceRebuildLayoutImmediate(AvatarTitleArea.GetComponent<RectTransform>());
|
|
return;
|
|
}
|
|
|
|
|
|
AvatarImg.sprite = info.LeaderAvatar;
|
|
MultilingualManager.Instance.SetUIText(AvatarTitle,info.ForceName);
|
|
LayoutRebuilder.ForceRebuildLayoutImmediate(AvatarTitleArea.GetComponent<RectTransform>());
|
|
|
|
AvatarBtn.onClick.RemoveAllListeners();
|
|
AvatarBtn.onClick.AddListener(() =>
|
|
{
|
|
EventManager.Publish(new ShowUIInfoDiplomacy() { Pid = player.Id });
|
|
OnBtnCloseClick?.Invoke();
|
|
});
|
|
}
|
|
|
|
|
|
private void SetContentGrid(ShowUIInfoGridInfo evt)
|
|
{
|
|
if (evt.type != UIGridInfoType.grid || !Main.MapData.GridMap.GetGridDataByGid(evt.id, out var grid) || Main.MapData.GetCityDataByGid(evt.id, out var _))
|
|
{
|
|
GridInfoArea.SetActive(false);
|
|
return;
|
|
}
|
|
GridInfoArea.SetActive(true);
|
|
|
|
|
|
//Step #1 GridPreview
|
|
|
|
GameObject clone =
|
|
Instantiate(MapRenderer.Instance.ROGridMap[evt.id].GetROGrid() as GameObject);
|
|
for (int i = GridPreview.transform.childCount - 1; i >= 0; i--)
|
|
Destroy(GridPreview.transform.GetChild(i).gameObject);
|
|
clone.transform.SetParent(GridPreview.transform);
|
|
clone.transform.localPosition = new Vector3(0,15,0);
|
|
clone.transform.Find("SelectHighlight").gameObject.SetActive(false);
|
|
SetLayerRecursively(clone, LayerMask.NameToLayer("Preview"));
|
|
GridCamera.SetActive(true);
|
|
Timer.Instance.TimerRegister(GridCamera, () => { CityCamera.SetActive(false); }, 0.001f,"HideCamera");
|
|
|
|
|
|
//Step #2 Title & Desc
|
|
//title 逻辑 -> building > resource > forest > mountain > plain
|
|
string title_DECODE = "";
|
|
string desc_DECODE = "";
|
|
|
|
|
|
|
|
|
|
//如果是奇观
|
|
if (grid.Resource == ResourceType.Wonder)
|
|
{
|
|
|
|
|
|
if (Table.Instance.GridAndResourceDataAssets.GetWonderInfo(grid.Wonder, out var info))
|
|
{
|
|
title_DECODE = MultilingualManager.Instance.GetMultilingualText(uint.Parse(info.Name));
|
|
desc_DECODE = MultilingualManager.Instance.GetMultilingualText(uint.Parse(info.Desc));
|
|
}
|
|
}
|
|
//如果显示建筑或者资源
|
|
else if (grid.Resource != ResourceType.None && Main.MapData.PlayerMap.SelfPlayerData.CanShowResource(grid.Resource))
|
|
{
|
|
title_DECODE = Table.Instance.GridAndResourceDataAssets.GetResourceNameWithLevel(grid);
|
|
//var spr = Table.Instance.GridAndResourceDataAssets.GetResourceSprite(grid.Resource, grid.Player(Main.MapData), grid);
|
|
Table.Instance.GridAndResourceDataAssets.GetResourceInfo(grid.Resource, out var resourceInfo);
|
|
desc_DECODE = MultilingualManager.Instance.GetMultilingualText(uint.Parse(resourceInfo.ResourceDesc));
|
|
}
|
|
//如果显示树木
|
|
else if(grid.Vegetation == Vegetation.Trees)
|
|
{
|
|
Table.Instance.GridAndResourceDataAssets.GetVegetationInfo(out var vegetationInfo);
|
|
title_DECODE = MultilingualManager.Instance.GetMultilingualText(uint.Parse(vegetationInfo.ResourceName));
|
|
desc_DECODE = MultilingualManager.Instance.GetMultilingualText(uint.Parse(vegetationInfo.ResourceDesc));
|
|
}
|
|
//如果显示山脉
|
|
else if(grid.Feature == TerrainFeature.Mountain)
|
|
{
|
|
Table.Instance.GridAndResourceDataAssets.GetMountainInfo(out var mountainInfo);
|
|
title_DECODE = MultilingualManager.Instance.GetMultilingualText(uint.Parse(mountainInfo.ResourceName));
|
|
desc_DECODE = MultilingualManager.Instance.GetMultilingualText(uint.Parse(mountainInfo.ResourceDesc));
|
|
}
|
|
//如果显示地形
|
|
else
|
|
{
|
|
Table.Instance.GridAndResourceDataAssets.GetTerrainInfo(grid.Terrain, out var terrainInfo);
|
|
title_DECODE = MultilingualManager.Instance.GetMultilingualText(uint.Parse(terrainInfo.ResourceName));
|
|
desc_DECODE = MultilingualManager.Instance.GetMultilingualText(uint.Parse(terrainInfo.ResourceDesc));
|
|
}
|
|
GridInfoTitle.text = title_DECODE;
|
|
GridInfoDesc.text = desc_DECODE;
|
|
|
|
//Step #3 设置详细info
|
|
//resource
|
|
if (grid.Resource != ResourceType.None && Table.Instance.GridAndResourceDataAssets.GetResourceInfo(grid.Resource, out var resourceInfo2))
|
|
{
|
|
if (resourceInfo2.ResourceSubType == ResourceSubType.Building)
|
|
{
|
|
MultilingualManager.Instance.SetUIText(GridInfoBuildingTxt,Table.Instance.GridAndResourceDataAssets.GetResourceNameWithLevel(grid));
|
|
//处理盖在建筑下面的资源
|
|
if (grid.ResourceUnderBuilding != ResourceType.None &&
|
|
Table.Instance.GridAndResourceDataAssets.GetResourceInfo(grid.ResourceUnderBuilding,
|
|
out var resourceInfo3) && resourceInfo3.ResourceSubType == ResourceSubType.Resource)
|
|
MultilingualManager.Instance.SetUIText(GridInfoResourceTxt,
|
|
Table.Instance.GridAndResourceDataAssets.GetResourceName(grid.ResourceUnderBuilding));
|
|
else GridInfoResourceTxt.text = "-";
|
|
}
|
|
else
|
|
{
|
|
GridInfoBuildingTxt.text = "-";
|
|
if(Main.MapData.PlayerMap.SelfPlayerData.CanShowResource(grid.Resource))
|
|
MultilingualManager.Instance.SetUIText(GridInfoResourceTxt, Table.Instance.GridAndResourceDataAssets.GetResourceName(grid.Resource));
|
|
else GridInfoResourceTxt.text = "-";
|
|
}
|
|
}
|
|
else
|
|
{
|
|
GridInfoBuildingTxt.text = "-";
|
|
GridInfoResourceTxt.text = "-";
|
|
}
|
|
//terrain
|
|
if (grid.Feature == TerrainFeature.Mountain)
|
|
{
|
|
Table.Instance.GridAndResourceDataAssets.GetMountainInfo(out var mountainInfo);
|
|
MultilingualManager.Instance.SetUIText(GridInfoTerrainTxt, mountainInfo.ResourceName);
|
|
}
|
|
else if (grid.Vegetation == Vegetation.Trees)
|
|
{
|
|
Table.Instance.GridAndResourceDataAssets.GetVegetationInfo(out var vegetationInfo);
|
|
MultilingualManager.Instance.SetUIText(GridInfoTerrainTxt, vegetationInfo.ResourceName);
|
|
}
|
|
else
|
|
{
|
|
Table.Instance.GridAndResourceDataAssets.GetTerrainInfo(grid.Terrain,out var terrainInfo);
|
|
MultilingualManager.Instance.SetUIText(GridInfoTerrainTxt, terrainInfo.ResourceName);
|
|
}
|
|
|
|
//处理GeoHintInfo
|
|
grid.UpdateGeoInfo(Main.MapData);
|
|
if (grid.GeoIdList?.Count > 0)
|
|
{
|
|
GridInfoHint.gameObject.SetActive(true);
|
|
GridInfoHint.DataProvider.HintDataType = HintDataType.GeoData;
|
|
|
|
|
|
|
|
GridInfoHint.DataProvider.GeoIdList = grid.GetRealTimeGeoIdList();
|
|
}
|
|
else
|
|
{
|
|
GridInfoHint.gameObject.SetActive(false);
|
|
}
|
|
|
|
}
|
|
|
|
private void SetContentUnit(ShowUIInfoGridInfo evt)
|
|
{
|
|
if (evt.type != UIGridInfoType.unit || !Main.MapData.UnitMap.GetUnitDataByUnitId(evt.id, out var unitData))
|
|
{
|
|
UnitInfoArea.SetActive(false);
|
|
return;
|
|
}
|
|
UnitInfoArea.SetActive(true);
|
|
// 获取关联数据
|
|
Main.MapData.GetPlayerDataByUnitId(unitData.Id, out var playerData);
|
|
Table.Instance.UnitTypeDataAssets.GetUnitTypeInfo(unitData.UnitFullType, out var unitTypeInfo);
|
|
|
|
// Step #1: Unit Preview
|
|
if (Table.Instance.UnitTypeDataAssets.GetUnitSprite(Main.MapData, unitData, out var spr))
|
|
UnitPreview.sprite = spr;
|
|
|
|
|
|
// Step #2: Title & Description
|
|
// 逻辑参考 BottomInfoUI.cs -> UpdateInfoUnit
|
|
string title = MultilingualManager.Instance.GetMultilingualText(uint.Parse(unitTypeInfo.Name));
|
|
|
|
if (unitData.IsOfficer()) title += "(军官)"; // 示例
|
|
else if (unitData.IsPrepareOfficer()) title += $"({unitData.GetKillCount()}/3)";
|
|
UnitInfoTitle.text = title;
|
|
MultilingualManager.Instance.SetUIText(UnitInfoDesc, unitTypeInfo.Desc);
|
|
// Step #3: Core Stats
|
|
UnitInfoHealthTxt.text = $"{unitData.Health}/{unitData.GetMaxHealth()}";
|
|
UnitInfoAttackTxt.text = unitData.GetAttackShowString(Main.MapData);
|
|
UnitInfoDefendTxt.text = unitData.GetDefenseShowString(Main.MapData); // 参照BottomInfoUI
|
|
UnitInfoMoveTxt.text = unitData.GetMoveRange(Main.MapData).ToString();
|
|
UnitInfoRangeTxt.text = unitData.GetAttackRangeShowString(Main.MapData);//GetAttackRange().ToString();
|
|
|
|
//Step #4 处理Giant Hint
|
|
bool isgiant = unitData.UnitFullType.UnitType is UnitType.Giant or UnitType.GiantJuggernaut;
|
|
UnitInfoHint.gameObject.SetActive(isgiant);
|
|
if (isgiant)
|
|
{
|
|
UnitInfoHint.DataProvider.HintDataType = HintDataType.TextDataGiantUpgrate;
|
|
UnitInfoHint.DataProvider.UnitFullType = unitData.UnitFullType;
|
|
}
|
|
|
|
}
|
|
|
|
private void SetContentCity(ShowUIInfoGridInfo evt)
|
|
{
|
|
if (evt.type != UIGridInfoType.grid || !Main.MapData.GetCityDataByGid(evt.id,out var city)
|
|
|| !Main.MapData.GetPlayerDataByCityId(city.Id, out var player))
|
|
{
|
|
CityInfoArea.SetActive(false);
|
|
return;
|
|
}
|
|
|
|
CityInfoArea.SetActive(true);
|
|
|
|
// Step 1: Preview (Placeholder)
|
|
GameObject clone =
|
|
Instantiate(MapRenderer.Instance.ROGridMap[evt.id].GetROGrid() as GameObject);
|
|
for (int i = CityPreview.transform.childCount - 1; i >= 0; i--)
|
|
Destroy(CityPreview.transform.GetChild(i).gameObject);
|
|
clone.transform.SetParent(CityPreview.transform);
|
|
clone.transform.localPosition = new Vector3(0,15,0);
|
|
clone.transform.Find("SelectHighlight").gameObject.SetActive(false);
|
|
SetLayerRecursively(clone, LayerMask.NameToLayer("Preview"));
|
|
CityCamera.SetActive(true);
|
|
Timer.Instance.TimerRegister(CityCamera, () => { CityCamera.SetActive(false); }, 0.001f,"HideCamera");
|
|
|
|
// Step 2: Title & Description
|
|
Table.Instance.CivDataAssets.GetCityInfo(city.Name, out var cityInfo);
|
|
CityInfoTitle.text = MultilingualManager.Instance.GetMultilingualText(uint.Parse(cityInfo.CityName)) + " Lv." + city.Level;
|
|
MultilingualManager.Instance.SetUIText(CityInfoDesc, cityInfo.CityDescription);
|
|
|
|
// Step 3: Detailed Info (differs for self vs. others)
|
|
if (player.Id == Main.MapData.PlayerMap.SelfPlayerData.Id)
|
|
{
|
|
CityInfoDataArea.SetActive(true);
|
|
var tb = Table.Instance.TextDataAssets;
|
|
CityInfoCoinTxt.text = "+" + Main.CityLogic.GetCityStarsPerTurn(Main.MapData, city)+ MultilingualManager.Instance.GetMultilingualText(uint.Parse(tb.GridInfoText_PerTurn));
|
|
CityInfoTechTxt.text = "+" + Main.CityLogic.GetCityTechPointPerTurn(Main.MapData, city) + MultilingualManager.Instance.GetMultilingualText(uint.Parse(tb.GridInfoText_PerTurn));
|
|
CityInfoPopulationTxt.text = MultilingualManager.Instance.GetMultilingualText(uint.Parse(tb.GridInfoText_Population)) + Main.MapData.GetUnitCount(city.Id) + "/" + city.Level;
|
|
CityInfoDiamondTxt.text = (city.ParkCount + (city.Workshop ? 1 : 0)) + MultilingualManager.Instance.GetMultilingualText(uint.Parse(tb.GridInfoText_Diamond));
|
|
CityInfoConnectTxt.text = city.IsCapital ? MultilingualManager.Instance.GetMultilingualText(uint.Parse(tb.GridInfoText_Capital)) : (city.IsConnectedCapital ? MultilingualManager.Instance.GetMultilingualText(uint.Parse(tb.GridInfoText_Connected)) :
|
|
MultilingualManager.Instance.GetMultilingualText(uint.Parse(tb.GridInfoText_Unconnected)));
|
|
}
|
|
else
|
|
CityInfoDataArea.SetActive(false);
|
|
|
|
|
|
|
|
}
|
|
|
|
private void SetContentSkill(ShowUIInfoGridInfo evt)
|
|
{
|
|
if (evt.type != UIGridInfoType.unit)
|
|
{
|
|
SkillArea.SetActive(false);
|
|
return;
|
|
}
|
|
if (!Main.MapData.UnitMap.GetUnitDataByUnitId(evt.id, out var unit)) return;
|
|
|
|
var skillList = new List<SkillBase>();
|
|
foreach (var skill in unit.Skills)
|
|
{
|
|
if(!Table.Instance.SkillDataAssets.GetSkillInfo(skill.GetSkillType(), out var info)
|
|
|| info.NotShow)continue;
|
|
skillList.Add(skill);
|
|
}
|
|
|
|
if (skillList.Count == 0)
|
|
{
|
|
SkillArea.SetActive(false);
|
|
return;
|
|
}
|
|
SkillArea.SetActive(true);
|
|
|
|
|
|
//Step #2 确定格位够不够
|
|
while (SkillCircleMonoList.Count < skillList.Count)
|
|
{
|
|
GameObject actionCircle = Instantiate(SkillCirclePrefab, SkillArea.transform, true);
|
|
actionCircle.GetComponent<RectTransform>().localScale = Vector3.one;
|
|
actionCircle.GetComponent<RectTransform>().localPosition = Vector3.zero;
|
|
SkillCircleMonoList.Add(actionCircle.GetComponent<UIInfoCommonBaseSkillCircleMono>());
|
|
}
|
|
|
|
//Step #3 设置每一个action
|
|
for (int i = 0; i < SkillCircleMonoList.Count; i++)
|
|
{
|
|
SkillCircleMonoList[i].gameObject.SetActive(i < skillList.Count);
|
|
if (i >= skillList.Count) continue;
|
|
SkillCircleMonoList[i].SetContent(skillList[i],unit.UnitFullType);
|
|
}
|
|
|
|
}
|
|
|
|
private void SetContentAction(ShowUIInfoGridInfo evt)
|
|
{
|
|
//Step #1 获取actionList
|
|
//ResourceCache.Instance.SpriteCache.ActionBGAvailable
|
|
var actionList = new List<ActionLogicBase>();
|
|
var cantTypeList = new List<ActionCantType>();
|
|
bool showAction = false;
|
|
var subType = evt.type;
|
|
CommonActionParams param = null;
|
|
if (subType == UIGridInfoType.unit && Main.MapData.UnitMap.GetUnitDataByUnitId(evt.id,out var unit))
|
|
{
|
|
param = new CommonActionParams(mapData:Main.MapData,playerData:Main.MapData.PlayerMap.SelfPlayerData,unitData:unit,mainObjectType:MainObjectType.Unit);
|
|
showAction = ActionLogicFactory.MainObjectCanShowAction(param, out actionList,out cantTypeList);
|
|
MultilingualManager.Instance.SetUIText(ActionHint,Table.Instance.TextDataAssets.GridInfoText_UnitInfoHint);
|
|
|
|
}
|
|
else if (subType == UIGridInfoType.grid && Main.MapData.GetCityDataByGid(evt.id,out var city))
|
|
{
|
|
param = new CommonActionParams(mapData:Main.MapData,playerData:Main.MapData.PlayerMap.SelfPlayerData,cityData:city,mainObjectType:MainObjectType.City);
|
|
showAction = ActionLogicFactory.MainObjectCanShowAction(param,out actionList,out cantTypeList);
|
|
MultilingualManager.Instance.SetUIText(ActionHint,Table.Instance.TextDataAssets.GridInfoText_CityInfoHint);
|
|
}
|
|
else if (subType == UIGridInfoType.grid && Main.MapData.GridMap.GetGridDataByGid(evt.id,out var grid))
|
|
{
|
|
param = new CommonActionParams(mapData:Main.MapData,Main.MapData.PlayerMap.SelfPlayerData,gridData:grid,mainObjectType:MainObjectType.Grid);
|
|
showAction = ActionLogicFactory.MainObjectCanShowAction(param,out actionList,out cantTypeList);
|
|
if(grid.Resource is ResourceType.Military or ResourceType.RemiliaMilitary)
|
|
MultilingualManager.Instance.SetUIText(ActionHint,Table.Instance.TextDataAssets.GridInfoText_CityInfoHint);
|
|
MultilingualManager.Instance.SetUIText(ActionHint,Table.Instance.TextDataAssets.GridInfoText_GridInfoHint);
|
|
}
|
|
|
|
if (!showAction)
|
|
{
|
|
ActionArea.SetActive(false);
|
|
return;
|
|
}
|
|
ActionArea.SetActive(true);
|
|
_actionCount = actionList.Count;
|
|
//Step #2 确定格位够不够
|
|
while (ActionCircleMonoList.Count < actionList.Count)
|
|
{
|
|
GameObject actionCircle = Instantiate(ActionCirclePrefab, ActionArea.transform, true);
|
|
actionCircle.GetComponent<RectTransform>().localScale = Vector3.one;
|
|
actionCircle.GetComponent<RectTransform>().localPosition = Vector3.zero;
|
|
ActionCircleMonoList.Add(actionCircle.GetComponent<UIInfoCommonBaseActionCircleMono>());
|
|
}
|
|
|
|
//Step #3 设置每一个action
|
|
for (int i = 0; i < ActionCircleMonoList.Count; i++)
|
|
{
|
|
ActionCircleMonoList[i].gameObject.SetActive(i < actionList.Count);
|
|
if (i >= actionList.Count) continue;
|
|
ActionCircleMonoList[i].SetContent(actionList[i].ActionId,cantTypeList[i],param,OnActionCircleClicked);
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
public void ExecuteAction(ExecuteUIInfoGridInfo evt)
|
|
{
|
|
if(evt.idx >= ActionCircleMonoList.Count || evt.idx >= _actionCount) return;
|
|
ActionCircleMonoList[(int)evt.idx].ClickButton.onClick.Invoke();
|
|
}
|
|
private void OnActionCircleClicked(CommonActionId actionId, CommonActionParams param)
|
|
{
|
|
var action = ActionLogicFactory.GetActionLogic(actionId);
|
|
if (action.CheckCan(param) && action.CompleteExecute(param))
|
|
OnBtnCloseClick?.Invoke();
|
|
|
|
|
|
}
|
|
|
|
private void SetLayerRecursively(GameObject obj, int newLayer)
|
|
{
|
|
obj.layer = newLayer;
|
|
|
|
foreach (Transform child in obj.transform)
|
|
{
|
|
SetLayerRecursively(child.gameObject, newLayer);
|
|
}
|
|
}
|
|
|
|
private void SetContentTask(ShowUIInfoGridInfo evt)
|
|
{
|
|
// Step #1 判断是否有task需要显示
|
|
if (evt.type != UIGridInfoType.unit ||
|
|
!Main.MapData.UnitMap.GetUnitDataByUnitId(evt.id, out var unit) ||
|
|
!Main.MapData.GetPlayerDataByUnitId(evt.id, out var player) )
|
|
{
|
|
TaskArea.SetActive(false);
|
|
return;
|
|
}
|
|
|
|
bool shouldShowTask = (unit.UnitFullType.UnitType is UnitType.Giant or UnitType.GiantJuggernaut)&&
|
|
unit.UnitFullType.UnitLevel < 3 &&
|
|
player.Id == Main.MapData.PlayerMap.SelfPlayerId;
|
|
if (!shouldShowTask)
|
|
{
|
|
TaskArea.SetActive(false);
|
|
return;
|
|
}
|
|
|
|
//Step #2 设置具体内容
|
|
TaskArea.SetActive(true);
|
|
if (!Table.Instance.HeroDataAssets.GetHeroInfo(unit.GiantType, out var heroInfo) ||
|
|
heroInfo.TaskList.Count <= unit.UnitLevel ||
|
|
!Main.MapData.PlayerMap.SelfPlayerData.PlayerHeroData.GetHeroTask(unit.GiantType, out var task))
|
|
{
|
|
TaskArea.SetActive(false);
|
|
return;
|
|
}
|
|
if (task.IsForceFinished)
|
|
{
|
|
MultilingualManager.Instance.SetUIText(TaskDesc, Table.Instance.TextDataAssets.HeroTaskFinishedDesc);
|
|
}
|
|
else
|
|
{
|
|
var param1 = task.LevelShowString();
|
|
var param2 = task.TargetLevelShowString();
|
|
var param3 = "";
|
|
if (task.SkillType != SkillType.NONE && Table.Instance.SkillDataAssets.GetSkillInfo(task.SkillType, out var skillInfo))
|
|
{
|
|
param3 = MultilingualManager.Instance.GetMultilingualText(uint.Parse(skillInfo.SkillName));
|
|
}
|
|
var taskDesc = heroInfo.TaskList[(int)unit.UnitLevel].Desc;
|
|
MultilingualManager.Instance.SetUIText(TaskDesc, taskDesc, new List<string> { param1, param2, param3 });
|
|
}
|
|
}
|
|
|
|
public void CloseView()
|
|
{
|
|
AudioManager.Instance.StopMusic();
|
|
}
|
|
|
|
}
|
|
|
|
}
|