wonderupdate优化
This commit is contained in:
parent
8ee7e62a60
commit
ce17970f6e
@ -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;
|
||||
|
||||
}
|
||||
|
||||
// 回合开始
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user