TH1/Unity/Assets/Scripts/TH1_Renderer/CityInfoRenderer.cs
2025-11-12 21:23:11 +08:00

300 lines
13 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 PlayerData _playerData;
//-------- 1个bool就能驱动的动画 --------
//public bool UpdateCityInfo;
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");
_ROCityInfo = GameObject.Instantiate(prefab,tpos, Quaternion.identity, father);
_RODebugText = _ROCityInfo.transform.Find("CityInfoCanvas/DebugText").gameObject;
_debugText = _RODebugText.GetComponent<TextMeshProUGUI>();
}
public void Update()
{
_mapData.CityMap.GetCityById(_cityId,out _cityData);
RenderUpdateDebug();
}
//public void SetUpdateCityInfo(bool v) { UpdateCityInfo = v; }
//瞬间生效的动画函数,将cityinfo的所有视觉瞬间与数据完全同步
public void InstantUpdateCityInfo()
{
RenderUpdateCityInfo();
}
//瞬间生效的动画,将所有图标相关的视觉瞬间与数据完全同步
public void InstantUpdateCityLables()
{
//更新联通图标的情况
RenderUpdateCityConnected();
//更新首都图标的情况
RenderUpdateCityCapital();
//更新大使馆图标的情况
RenderUpdateCityEmbassy();
}
public void InstantUpdateCityGDP()
{
RenderUpdateCityGDP();
}
private void RenderUpdateCityInfo()
{
//更新图标
InstantUpdateCityLables();
//更新人口条,会自动处理不在视野的情况
RenderUpdateCityPops(_cityData.Level,_cityData.LevelExp);
//更新GDP,会自动处理不在视野的情况
RenderUpdateCityGDP();
//更新城市名,会自动处理不在视野的情况
RenderUpdateCityName();
_ROCityInfo.SetActive(_mapData.PlayerMap.SelfPlayerData.Sight.CheckIsInSight(_cityData.Grid(Main.MapData)?.Id ?? 0));
}
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)?.PlayerWealth ?? 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";
}
}
private void RenderUpdateCityConnected()
{
bool st = false;
//如果是己方的城市,才显示这个
if (_cityData.Player(Main.MapData)?.Id == _mapData.PlayerMap.SelfPlayerData.Id)
st = _cityData.IsConnectedCapital;
_ROCityInfo.transform.Find("CityInfoCanvas/CityName/Connected").gameObject.SetActive(st);
}
private void RenderUpdateCityCapital()
{
//如果是cradlecaptain 并且是真人玩家的城市,才显示
bool show = Main.CityLogic.CheckCradleCapital(_mapData, _cityData.Player(Main.MapData), _cityData) &&
_cityData.Player(Main.MapData) == _mapData.PlayerMap.SelfPlayerData;
_ROCityInfo.transform.Find("CityInfoCanvas")
.transform.Find("CityName").transform.Find("CapitalIcon").gameObject.SetActive(show);
}
private void RenderUpdateCityEmbassy()
{
//如果是对方的cradleCaptain并且真人玩家在此建立了大使馆才现世
Main.MapData.PlayerMap.SelfPlayerData.GetCountryDiplomacyInfo(_cityData.Player(Main.MapData)?.Id ?? 0, out var dipInfo);
if (dipInfo == null) return;
bool show = Main.CityLogic.CheckCradleCapital(_mapData, _cityData.Player(Main.MapData), _cityData) && dipInfo.IsEmbassy;
bool showWar = false;
if (show && dipInfo.DiplomacyState == DiplomacyState.War)
{
show = false;
showWar = true;
}
_ROCityInfo.transform.Find("CityInfoCanvas/CityName/Embassy").gameObject.SetActive(show);
_ROCityInfo.transform.Find("CityInfoCanvas/CityName/WarEmbassy").gameObject.SetActive(showWar);
}
private void RenderUpdateCityGDP() //更新城市的GDP显示,一线打工的渲染函数
{
//如果不是己方的城市,不显示
if (!(_cityData.Player(Main.MapData)?.IsSelfPlayer() ?? true))
{
//处理外交金钱
var coin = Main.PlayerLogic.GetEmbassyCoin(_mapData,_mapData.PlayerMap.SelfPlayerData,_cityData.Player(Main.MapData));
if (coin > 0 && Main.CityLogic.CheckCradleCapital(_mapData, _cityData.Player(Main.MapData), _cityData))
{
_ROCityInfo.transform.Find("CityInfoCanvas/CityName/Wealth").gameObject.SetActive(true);
_ROCityInfo.transform.Find("CityInfoCanvas/CityName/CircleBG").gameObject.SetActive(true);
TextMeshProUGUI wealth2 = _ROCityInfo.transform.Find("CityInfoCanvas/CityName/Wealth")
.GetComponent<TextMeshProUGUI>();
wealth2.text = coin.ToString();
}
else
{
_ROCityInfo.transform.Find("CityInfoCanvas/CityName/Wealth").gameObject.SetActive(false);
_ROCityInfo.transform.Find("CityInfoCanvas/CityName/CircleBG").gameObject.SetActive(false);
}
return;
}
_ROCityInfo.transform.Find("CityInfoCanvas/CityName/Wealth").gameObject.SetActive(true);
_ROCityInfo.transform.Find("CityInfoCanvas/CityName/CircleBG").gameObject.SetActive(true);
TextMeshProUGUI wealth = _ROCityInfo.transform.Find("CityInfoCanvas/CityName/Wealth")
.GetComponent<TextMeshProUGUI>();
wealth.text = Main.CityLogic.GetCityStarsPerTurn(_mapData,_cityData).ToString();
}
private void RenderUpdateCityName() //更新城市的名称显示,一线打工的渲染函数
{
//if (!map.player[map.renko].sight[map.city[cityId].cityCenter.x, map.city[cityId].cityCenter.y])
// return; //如果不在玩家视野就不更新具体的内容直接return
TextMeshProUGUI cityName = _ROCityInfo.transform
.Find("CityInfoCanvas").transform.Find("CityName").transform.Find("CityNameText")
.GetComponent<TextMeshProUGUI>();
Table.Instance.CivDataAssets.GetCityInfo(_cityData.Name,out var cityInfo);
MultilingualManager.Instance.SetUIText(cityName, 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;
}
if (!_mapData.PlayerMap.SelfPlayerData.Sight.CheckIsInSight(_cityData.Grid(Main.MapData)?.Id ?? 0))
return;
//如果不是己方的城市,不显示
if (_cityData.Player(Main.MapData)?.Id != _mapData.PlayerMap.SelfPlayerData.Id)
{
_ROCityInfo?.transform.Find("CityInfoCanvas/CityLevelBar")?.gameObject.SetActive(false);
return;
}
_ROCityInfo?.transform.Find("CityInfoCanvas/CityLevelBar")?.gameObject.SetActive(true);
//第0part 更新基础信息,主要是cityname
RenderUpdateCityName();
//第1part设置城市的经验条
int lineNo, rankNo;//行号和顺次
float scale = level < 4? 1.3f:(level > 7? 0.7f:1.3f);
int population = _mapData.GetUnitCount(_cityData.Id);
for (int i = 0; i < level; i++)
{
lineNo = i / 10;
rankNo = i % 10;
var houseFather = _ROCityInfo?.transform
.Find($"CityInfoCanvas/CityLevelBar/CityLevelBarLine ({lineNo})/HouseFather ({rankNo})")?.gameObject;
if (!houseFather)
{
LogSystem.LogError($"RenderUpdateCityPops not find CityInfoCanvas/CityLevelBar/CityLevelBarLine ({lineNo})/HouseFather ({rankNo})");
continue;
}
houseFather.SetActive(true);
var houseCom = houseFather.transform.Find("House")?.GetComponent<SpriteRenderer>();
var populationCom = houseFather.transform.Find("Population")?.GetComponent<SpriteRenderer>();
if (!houseCom || !populationCom) continue;
//处理绿色house城市经验的情况
if (levelExp > i)
{
houseCom.sprite = Resources.Load<Sprite>("ArtResources/TH1Miscs/TH1Misc_House_green");
}
//处理负citylevel的情况
else if (levelExp < -i)
{
houseCom.sprite = Resources.Load<Sprite>("ArtResources/TH1Miscs/TH1Misc_House_red");
}
//其他情况是白色house
else
{
houseCom.sprite = Resources.Load<Sprite>("ArtResources/TH1Miscs/TH1Misc_House_white");
}
//处理人口显示
populationCom.gameObject.SetActive(population > i);
}
//根据level确定缩放尺寸
var cityLevelBatTrs = _ROCityInfo?.transform.Find($"CityInfoCanvas/CityLevelBar");
if (!cityLevelBatTrs)
{
LogSystem.LogError($"RenderUpdateCityPops not find CityInfoCanvas/CityLevelBar");
return;
}
cityLevelBatTrs.localScale = new Vector3(scale,scale,scale);
}
public void UpdateLevelShow(int level,int levelExp)
{
RenderUpdateCityPops(level, levelExp);
}
public uint GetCid()
{
return _cityId;
}
}
}