TH1/Unity/Assets/Scripts/TH1_Renderer/CityInfoRenderer.cs
2026-01-04 02:45:59 +08:00

236 lines
9.3 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Logic;
using Logic.CrashSight;
using Logic.Multilingual;
using RuntimeData;
using TH1_Logic.Core;
using TMPro;
using UnityEngine;
namespace TH1_Renderer
{
public class CityInfoRenderer
{
private MapData _mapData;
//private GameObject _ROCityInfo;
//private GameObject _RODebugText;
//private TextMeshProUGUI _debugText;
private uint _cityId;
//-------- Update缓存数据 --------//
private CityData _cityData;
private CityInfoMono _cityInfoMono;
public CityInfoRenderer(GameObject prefab,Transform father, uint cid, MapData mapData, Main main)
{
_mapData = mapData;
_cityId = cid;
_mapData.CityMap.GetCityById(_cityId,out _cityData);
Vector3 tpos = Table.Instance.GridToWorld(_cityData.Grid(mapData) ?? null,"isCityInfo");
var obj = GameObject.Instantiate(prefab,tpos, Quaternion.identity, father);
_cityInfoMono = obj.GetComponent<CityInfoMono>();
//_RODebugText = _ROCityInfo.transform.Find("CityInfoCanvas/DebugText").gameObject;
//_debugText = _RODebugText.GetComponent<TextMeshProUGUI>();
}
public void Update()
{
_mapData.CityMap.GetCityById(_cityId,out _cityData);
//RenderUpdateDebug();
}
//瞬间生效的动画函数,将cityinfo的所有视觉瞬间与数据完全同步
public void InstantUpdateCityInfo()
{
RenderUpdateCityInfo();
}
//瞬间生效的动画,将所有图标相关的视觉瞬间与数据完全同步
public void InstantUpdateCityLabels()
{
var player = _cityData.Player(Main.MapData);
var isSelfCity = player == _mapData.PlayerMap.SelfPlayerData;
var isCradleCity = Main.CityLogic.CheckCradleCapital(_mapData, player, _cityData);
//更新联通图标的情况
_cityInfoMono?.SetConnect( isSelfCity && !isCradleCity && _cityData.IsConnectedCapital);
//更新首都图标的情况
_cityInfoMono?.SetCapital(isCradleCity && isSelfCity);
//更新大使馆图标的情况
GetEmbassyIconStatus(out bool showEmbassy,out bool showWarEmbassy);
_cityInfoMono?.SetEmbassy(showEmbassy);
_cityInfoMono?.SetWarEmbassy(showWarEmbassy);
}
public void InstantUpdateCityCoinTech()
{
RenderUpdateCityCoinTech();
}
private void RenderUpdateCityInfo()
{
//更新图标
InstantUpdateCityLabels();
//更新info底色
_cityInfoMono?.SetBG(_cityData.Player(Main.MapData)?.IsSelfPlayer() ?? false);
//更新人口条,会自动处理不在视野的情况
RenderUpdateCityPops(_cityData.Level,_cityData.LevelExp);
//更新GDP,会自动处理不在视野的情况
RenderUpdateCityCoinTech();
//更新城市名,会自动处理不在视野的情况
RenderUpdateCityName();
//更新显示情况
_cityInfoMono?.gameObject.SetActive(_mapData.PlayerMap.SelfPlayerData.Sight.CheckIsInSight(_cityData.Grid(Main.MapData)?.Id ?? 0));
}
private void GetEmbassyIconStatus(out bool showEmbassy,out bool showWarEmbassy)
{
showWarEmbassy = false;
showEmbassy = false;
//如果是对方的cradleCaptain并且真人玩家在此建立了大使馆才显示
if (!_cityData.Player(Main.MapData, out var player)) return;
//如果不是对方城市 return
if (player == Main.MapData.PlayerMap.SelfPlayerData) return;
//如果不是cradlecity return
if (!Main.CityLogic.CheckCradleCapital(_mapData, _cityData.Player(Main.MapData), _cityData)) return;
//如果没有建立大使馆return
if (!Main.MapData.PlayerMap.SelfPlayerData.GetCountryDiplomacyInfo(player.Id, out var dipInfo)) return;
if (!dipInfo.IsEmbassy) return;
if (dipInfo.DiplomacyState == DiplomacyState.War)
showWarEmbassy = true;
else showEmbassy = true;
}
private void RenderUpdateCityCoinTech()
{
//如果不是己方的城市,有外交才显示,不然不显示
if (!(_cityData.Player(Main.MapData)?.IsSelfPlayer() ?? true))
{
//处理外交金钱
var coin = Main.PlayerLogic.GetEmbassyCoin(_mapData,_mapData.PlayerMap.SelfPlayerData,_cityData.Player(Main.MapData));
bool hasEmbassyCoin = coin > 0 &&
Main.CityLogic.CheckCradleCapital(_mapData, _cityData.Player(Main.MapData),
_cityData);
_cityInfoMono?.SetCoin(hasEmbassyCoin,coin);
_cityInfoMono?.SetTech(false, 0);
return;
}
//如果是己方城市,直接显示
_cityInfoMono?.SetCoin(true,Main.CityLogic.GetCityStarsPerTurn(_mapData,_cityData));
var tech = Main.CityLogic.GetCityTechPointPerTurn(_mapData, _cityData);
_cityInfoMono?.SetTech(tech > 0,tech);
}
private void RenderUpdateCityName()
{
Table.Instance.CivDataAssets.GetCityInfo(_cityData.Name,out var cityInfo);
_cityInfoMono?.SetCityName(cityInfo.CityName);
}
private void RenderUpdateCityPops(int level,int levelExp)
{
if (_mapData?.PlayerMap?.SelfPlayerData?.Sight == null)
{
LogSystem.LogError($"RenderUpdateCityPops _mapData?.PlayerMap?.SelfPlayerData?.Sight == null");
return;
}
if (_cityData == null)
{
LogSystem.LogError($"RenderUpdateCityPops _cityData == null");
return;
}
// 检查 Main.MapData 是否为 null
if (Main.MapData == null)
{
LogSystem.LogError($"RenderUpdateCityPops Main.MapData == null");
return;
}
var cityGrid = _cityData.Grid(Main.MapData);
if (!_mapData.PlayerMap.SelfPlayerData.Sight.CheckIsInSight(cityGrid?.Id ?? 0))
return;
//如果不是己方的城市,不显示
var cityPlayer = _cityData.Player(Main.MapData);
bool isSelfCity = cityPlayer?.Id == _mapData.PlayerMap.SelfPlayerData.Id;
//Step 3 设置城市经验条
_cityInfoMono?.SetLevelBar(isSelfCity,level,levelExp,_mapData.GetUnitCount(_cityData.Id));
//Step 4 更新cityName
RenderUpdateCityName();
}
public void UpdateLevelShow(int level,int levelExp)
{
RenderUpdateCityPops(level, levelExp);
}
public uint GetCid()
{
return _cityId;
}
/*public void RenderUpdateDebug()
{
if (DebugCenter.Instance.DebugMode)
{
if(!_RODebugText.activeSelf)
_RODebugText.SetActive(true);
}
else
{
_RODebugText.SetActive(false);
return;
}
_debugText.text = "";
_debugText.text += $"CID={_cityId} PID={_cityData.Player(Main.MapData)?.Id ?? 0} CIV={_cityData.Player(Main.MapData)?.PlayerCivId ?? 0} gold={_cityData.Player(Main.MapData)?.PlayerCoin ?? 0}\n";
//如果不是我方单位显示city和player的战略
if(!_mapData.CheckCityIdBelongPlayerId(_cityId,_mapData.PlayerMap.SelfPlayerData.Id))
if (MainEditor.Instance.Data != null)
{
MainEditor.Instance.GetCityStrategy(_cityId, out var cst);
MainEditor.Instance.GetPlayerStrategy(_cityData.Player(Main.MapData)?.Id ?? 0, out var pst, out var target);
_debugText.text += $"CST={cst} PST={pst}";
_debugText.text += "\n";
}
//如果是首都,展示科技
if (_cityData.IsCapital)
{
_debugText.text += "tech={";
foreach (var tech in _cityData.Player(Main.MapData).TechTree.TechSet)
{
_debugText.text += tech + ",";
}
_debugText.text += "}\n";
}
//如果是不我方单位展示city上一回合的action list
if(!_mapData.CheckCityIdBelongPlayerId(_cityId,_mapData.PlayerMap.SelfPlayerData.Id))
if (MainEditor.Instance.Data != null)
{
var actionList = MainEditor.Instance.GetCityActions(_cityId);
_debugText.text += $"Turn {_cityData.Player(Main.MapData)?.Turn} act list\n";
if(actionList != null)
foreach (var act in actionList)
_debugText.text += act.DebugInfo() + "\n";
}
}*/
}
}