300 lines
13 KiB
C#
300 lines
13 KiB
C#
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;
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
}
|
||
} |