wonderupdate优化

This commit is contained in:
wuwenbo 2026-04-24 16:35:46 +08:00
parent 8ee7e62a60
commit ce17970f6e

View File

@ -38,79 +38,177 @@ namespace Logic
public void UpdateWonder(MapData mapData, PlayerData player,WonderTypeEnum specificWonder = WonderTypeEnum.None)
{
bool isMainSelfPlayer = mapData == Main.MapData && player == mapData.PlayerMap.SelfPlayerData;
int cachedMaxCityLevel = -1;
int cachedConnectedCityCount = -1;
bool cachedHasAllTech = false;
bool hasCachedHasAllTech = false;
bool cachedOneTowerInSight = false;
bool hasCachedOneTowerInSight = false;
bool cachedAllTowerInSight = false;
bool hasCachedAllTowerInSight = false;
foreach (WonderTypeEnum wonder in _cachedWonderTypes)
{
//如果指定了特定奇观,那么只判断对应的奇观
if (specificWonder != WonderTypeEnum.None && wonder != specificWonder) continue;
if (wonder == WonderTypeEnum.None) continue;
var wonderState = player.Wonder.GetWonderState(wonder);
//part #1 如果是未开启的奇观判断是否需要发出WonderStart提示
if (player.Wonder.GetWonderState(wonder) == WonderState.NO_HINT)
if (wonderState == WonderState.NO_HINT)
{
//step #1 确认是否拥有科技
if (!Enum.TryParse("StartWonder" + wonder.ToString(), out TechAtom StartWonderTechAtom)) continue;
bool checkTechTree = player.TechTree.CheckIfHasTechAtom(StartWonderTechAtom);
if (!checkTechTree) continue;
if (!TryGetStartWonderTechAtom(wonder, out var startWonderTechAtom)) continue;
if (!player.TechTree.CheckIfHasTechAtom(startWonderTechAtom)) continue;
//step #2 确认EYE POWER PARK的特殊条件
bool checkSpecial = !(wonder == WonderTypeEnum.EYE && !CheckOneTowerInSight(mapData, player));
if (wonder == WonderTypeEnum.POWER && player.TotalKill <= 0) checkSpecial = false;
if (wonder == WonderTypeEnum.PARK && GetMaxCityLevel(mapData,player) <= 2) checkSpecial = false;
bool checkSpecial = true;
switch (wonder)
{
case WonderTypeEnum.EYE:
if (!hasCachedOneTowerInSight)
{
cachedOneTowerInSight = CheckOneTowerInSight(mapData, player);
hasCachedOneTowerInSight = true;
}
checkSpecial = cachedOneTowerInSight;
break;
case WonderTypeEnum.POWER:
checkSpecial = player.TotalKill > 0;
break;
case WonderTypeEnum.PARK:
if (cachedMaxCityLevel < 0)
{
cachedMaxCityLevel = GetMaxCityLevel(mapData, player);
}
checkSpecial = cachedMaxCityLevel > 2;
break;
}
if (!checkSpecial) continue;
//step #3 设置奇观状态为已开启
player.Wonder.SetWonderState(wonder, WonderState.HAVE_HINT);
wonderState = WonderState.HAVE_HINT;
//如果是和平奇怪还要把技术调整为0
if (wonder == WonderTypeEnum.PEACE)
player.TurnNoAttack = 0;
//step #4 如果是player是真人玩家发出界面通知事件
if (mapData != Main.MapData || player != mapData.PlayerMap.SelfPlayerData) continue;
var announcement = new ShowUIAnnounceMajorEvent { EventType = UIAnnounceMajorEventType.WonderStart,Param1 = (int)wonder };
EventManager.Publish(announcement);
if (isMainSelfPlayer)
{
var announcement = new ShowUIAnnounceMajorEvent
{
EventType = UIAnnounceMajorEventType.WonderStart,
Param1 = (int)wonder
};
EventManager.Publish(announcement);
}
}
//part #2 如果是已经wonderStart的奇观判断是否需要发出WonderComplete提示
else if (player.Wonder.GetWonderState(wonder) == WonderState.HAVE_HINT)
if (wonderState == WonderState.HAVE_HINT)
{
//step #1 确认奇观有没有完成
bool checkWonderDone = wonder switch
bool checkWonderDone;
switch (wonder)
{
WonderTypeEnum.PEACE => player.TurnNoAttack >= 5,
WonderTypeEnum.KNOWLEDGE => player.TechTree.HasAllTech(player),
WonderTypeEnum.TRADE => GetConnectedCityCount(mapData, player) >= 5,
WonderTypeEnum.WEALTH => player.PlayerCoin >= 100,
WonderTypeEnum.EYE => CheckAllTowerInSight(mapData, player),
WonderTypeEnum.POWER => player.TotalKill >= 10,
WonderTypeEnum.PARK => GetMaxCityLevel(mapData, player) > 5,
_ => false
};
if (!checkWonderDone) continue;
if (WonderTypeEnum.POWER == wonder)
{
Debug.Log(mapData.PlayerMap.SelfPlayerData.Wonder.GetWonderState(WonderTypeEnum.KNOWLEDGE));
case WonderTypeEnum.PEACE:
checkWonderDone = player.TurnNoAttack >= 5;
break;
case WonderTypeEnum.KNOWLEDGE:
if (!hasCachedHasAllTech)
{
cachedHasAllTech = player.TechTree.HasAllTech(player);
hasCachedHasAllTech = true;
}
checkWonderDone = cachedHasAllTech;
break;
case WonderTypeEnum.TRADE:
if (cachedConnectedCityCount < 0)
{
cachedConnectedCityCount = GetConnectedCityCount(mapData, player);
}
checkWonderDone = cachedConnectedCityCount >= 5;
break;
case WonderTypeEnum.WEALTH:
checkWonderDone = player.PlayerCoin >= 100;
break;
case WonderTypeEnum.EYE:
if (!hasCachedAllTowerInSight)
{
cachedAllTowerInSight = CheckAllTowerInSight(mapData, player);
hasCachedAllTowerInSight = true;
}
checkWonderDone = cachedAllTowerInSight;
break;
case WonderTypeEnum.POWER:
checkWonderDone = player.TotalKill >= 10;
break;
case WonderTypeEnum.PARK:
if (cachedMaxCityLevel < 0)
{
cachedMaxCityLevel = GetMaxCityLevel(mapData, player);
}
checkWonderDone = cachedMaxCityLevel > 5;
break;
default:
checkWonderDone = false;
break;
}
if (!checkWonderDone) continue;
//step #2 设置状态
player.Wonder.SetWonderState(wonder, WonderState.FINISH_NOT_BUILD);
//step #3 如果是player是真人玩家发出界面通知事件
if (mapData != Main.MapData || player != mapData.PlayerMap.SelfPlayerData) continue;
var announcement = new ShowUIAnnounceMajorEvent { EventType = UIAnnounceMajorEventType.WonderEnd, Param1 = (int)wonder };
EventManager.Publish(announcement);
if (isMainSelfPlayer)
{
var announcement = new ShowUIAnnounceMajorEvent
{
EventType = UIAnnounceMajorEventType.WonderEnd,
Param1 = (int)wonder
};
EventManager.Publish(announcement);
}
}
}
}
private static bool TryGetStartWonderTechAtom(WonderTypeEnum wonder, out TechAtom techAtom)
{
switch (wonder)
{
case WonderTypeEnum.PEACE:
techAtom = TechAtom.StartWonderPEACE;
return true;
case WonderTypeEnum.KNOWLEDGE:
techAtom = TechAtom.StartWonderKNOWLEDGE;
return true;
case WonderTypeEnum.TRADE:
techAtom = TechAtom.StartWonderTRADE;
return true;
case WonderTypeEnum.WEALTH:
techAtom = TechAtom.StartWonderWEALTH;
return true;
case WonderTypeEnum.POWER:
techAtom = TechAtom.StartWonderPOWER;
return true;
case WonderTypeEnum.PARK:
techAtom = TechAtom.StartWonderPARK;
return true;
case WonderTypeEnum.EYE:
techAtom = TechAtom.StartWonderEYE;
return true;
default:
techAtom = TechAtom.None;
return false;
}
}
public void Update(MapData mapData)
{
if (mapData == null)
return;
@ -118,8 +216,7 @@ namespace Logic
//每帧判断每个玩家的奇观达成情况
foreach (var player in mapData.PlayerMap.PlayerDataList)
{
//这里执行两边,用来处理同一帧开启+完成奇观的情况
UpdateWonder(mapData, player);
//单次调用内即可处理同一帧开启+完成奇观
UpdateWonder(mapData, player);
}
@ -165,7 +262,6 @@ namespace Logic
//var selfp = mapData.PlayerMap.SelfPlayerData;
//if (mapData.GetCityCount(selfp.Id) == 0)
//selfp.Alive = false;
}
// 回合开始