diff --git a/Unity/Assets/Scripts/TH1_Data/PlayerData.cs b/Unity/Assets/Scripts/TH1_Data/PlayerData.cs index 6a95ee640..a2a9432d4 100644 --- a/Unity/Assets/Scripts/TH1_Data/PlayerData.cs +++ b/Unity/Assets/Scripts/TH1_Data/PlayerData.cs @@ -499,6 +499,7 @@ namespace RuntimeData public void OnTurnStart(MapData map) { Turn++; + Main.PlayerLogic.UpdateAllTeammateCapitalSight(map); //减少1点伟人复活冷却的时间点 for (int i = 0; i < 6; i++) if (giantPenalty[i] > 0) giantPenalty[i]--; diff --git a/Unity/Assets/Scripts/TH1_Logic/Player/PlayerLogic.cs b/Unity/Assets/Scripts/TH1_Logic/Player/PlayerLogic.cs index 997783a48..59909b339 100644 --- a/Unity/Assets/Scripts/TH1_Logic/Player/PlayerLogic.cs +++ b/Unity/Assets/Scripts/TH1_Logic/Player/PlayerLogic.cs @@ -1615,6 +1615,41 @@ namespace Logic return UpdateSight_LogicView(mapData,playerData,mapData.GridMap.GetAroundGridIdList(radius,gridData,true),ViewNextFrame); } + public void UpdateAllTeammateCapitalSight(MapData mapData) + { + if (mapData?.PlayerMap?.PlayerDataList == null) return; + + foreach (var player in mapData.PlayerMap.PlayerDataList) + { + if (player == null || !player.IsSurvival) continue; + + using var pooledGidList = THCollectionPool.GetListHandle(out var gidList); + foreach (var teammate in mapData.PlayerMap.PlayerDataList) + { + if (teammate == null || !teammate.IsSurvival || teammate.Id == player.Id) continue; + if (!CheckIsTeammate(mapData, player, teammate)) continue; + if (!mapData.GetCapitalCityDataByPlayerId(teammate.Id, out var capital)) continue; + if (!mapData.GetGridIdByCityId(capital.Id, out var capitalGid)) continue; + if (player.Sight.CheckIsInSight(capitalGid)) continue; + gidList.Add(capitalGid); + } + + if (gidList.Count > 0) + UpdateSight_LogicView(mapData, player, gidList); + } + } + + private static bool CheckIsTeammate(MapData mapData, PlayerData player, PlayerData targetPlayer) + { + if (mapData?.MapConfig != null && mapData.MapConfig.ArePlayersInSameTeam(player.Id, targetPlayer.Id)) + return true; + + if (player.GetCountryDiplomacyInfo(targetPlayer.Id, out var selfToTarget) && selfToTarget.IsTeammate) + return true; + + return targetPlayer.GetCountryDiplomacyInfo(player.Id, out var targetToSelf) && targetToSelf.IsTeammate; + } + public void DebugGetAllSight(MapData mapData, PlayerData playerData) { using var pooledGidList = THCollectionPool.GetListHandle(out var gidList);