增加队友逻辑

This commit is contained in:
wuwenbo 2026-05-08 17:34:51 +08:00
parent 41a77ab922
commit ec04df6514
5 changed files with 76 additions and 9 deletions

View File

@ -83,6 +83,10 @@ namespace RuntimeData
// 水域类型,默认为 Pangea
public Logic.MapWaterType WaterType = Logic.MapWaterType.Pangea;
// 存储着基于 Index 的玩家战前数据,包括真人和 AI
public List<PlayerInfo> PlayerInfos;
[MemoryPackConstructor]
public MapConfig()
{
@ -90,6 +94,7 @@ namespace RuntimeData
PlayerSettlements = new List<PlayerSettlementInfo>();
_memberCivs = new Dictionary<ulong, MemberCiv>();
MatchLimits = new List<MatchLimitType>();
PlayerInfos = new List<PlayerInfo>();
}
public MapConfig(uint width, uint height, uint playerCount,uint civId, uint forceId, AIDifficult aiDiff = AIDifficult.LUNATIC)
@ -102,6 +107,7 @@ namespace RuntimeData
selfForceId = forceId;
MultiCivs = new List<MemberCiv>();
_memberCivs = new Dictionary<ulong, MemberCiv>();
PlayerInfos = new List<PlayerInfo>();
}
// MemoryPack 反序列化之后的后处理
@ -272,6 +278,15 @@ namespace RuntimeData
public uint CivId;
public uint ForceId;
}
[MemoryPackable]
public partial class PlayerInfo
{
public uint Index;
public uint CivId;
public uint ForceId;
}
// 一场游戏的地图数据

View File

@ -224,6 +224,7 @@ namespace TH1_Logic.Action
//Step #6 处理break结盟
if (_actionId.PlayerActionType == PlayerActionType.BreakAlly)
{
if (dipInfo.IsTeammate || dipInfo2.IsTeammate) return false;
//Step #1 设置双方的外交状态为背盟
dipInfo.DiplomacyState = DiplomacyState.LeagueRupture;
dipInfo2.DiplomacyState = DiplomacyState.LeagueRupture;
@ -352,10 +353,11 @@ namespace TH1_Logic.Action
if (_actionId.PlayerActionType == PlayerActionType.BreakAlly)
{
actionParams.PlayerData.GetCountryDiplomacyInfo(actionParams.TargetPlayerData.Id, out var dipInfo);
actionParams.TargetPlayerData.GetCountryDiplomacyInfo(actionParams.PlayerData.Id,out var dipInfo2);
if (dipInfo.IsTeammate || dipInfo2.IsTeammate) return false;
//如果没有结盟 return
if (dipInfo.DiplomacyState != DiplomacyState.League) return false;
//如果对方率先breakreturn
actionParams.TargetPlayerData.GetCountryDiplomacyInfo(actionParams.PlayerData.Id,out var dipInfo2);
if (dipInfo2.DiplomacyState == DiplomacyState.LeagueRupture) return false;
return true;
}
@ -446,10 +448,11 @@ namespace TH1_Logic.Action
//Step #8 判断能否break结盟
{
actionParams.PlayerData.GetCountryDiplomacyInfo(actionParams.TargetPlayerData.Id, out var dipInfo);
actionParams.TargetPlayerData.GetCountryDiplomacyInfo(actionParams.PlayerData.Id,out var dipInfo2);
if (dipInfo.IsTeammate || dipInfo2.IsTeammate) return false;
//如果没有结盟 return
if (dipInfo.DiplomacyState != DiplomacyState.League) return false;
//如果对方率先breakreturn
actionParams.TargetPlayerData.GetCountryDiplomacyInfo(actionParams.PlayerData.Id,out var dipInfo2);
if (dipInfo2.DiplomacyState == DiplomacyState.LeagueRupture) return false;
return true;
}
@ -488,6 +491,7 @@ namespace TH1_Logic.Action
//Step #3 计算breakAlly按钮的情况
if (_actionId.PlayerActionType == PlayerActionType.BreakAlly)
{
if (dipInfo.IsTeammate || dipInfo2.IsTeammate) return ActionShowState.Unavailable;
return ActionShowState.Available;
}
@ -597,4 +601,4 @@ namespace TH1_Logic.Action
return true;
}
}
}
}

View File

@ -29,6 +29,8 @@ namespace Logic
//player[pid]解雇unit[uid]
public int UpdateSight_LogicView(MapData mapData, PlayerData playerData, List<uint> gidList,bool viewNextFrame,float duration);
//unit[uid]在grid[tpos]的位置,为player[pid]更新了视野情况
bool SetTeammateAndLeague(MapData mapData, PlayerData playerA, PlayerData playerB, bool isTeammate);
//设置双方队友关系;当 isTeammate=true 时同步设为结盟,并通过首都周围视野触发双向 meet
//-------tech相关操作-------
//返回player[pid]的tid科技是否被锁了
@ -42,4 +44,4 @@ namespace Logic
//player[pid]进入下一回合
//void TempReturnThisAction(string name, PlayerData P, CityData C, UnitData U, GridData T,MapData M);
}
}
}

View File

@ -1694,12 +1694,48 @@ namespace Logic
}
}
// 设置双方队友关系;当 isTeammate=true 时同步设为结盟,并通过首都周围视野触发双向 meet
public bool SetTeammateAndLeague(MapData map, PlayerData playerA, PlayerData playerB, bool isTeammate)
{
if (map == null || playerA == null || playerB == null) return false;
if (playerA.Id == playerB.Id) return false;
if (!playerA.GetCountryDiplomacyInfo(playerB.Id, out var playerAToB)) return false;
if (!playerB.GetCountryDiplomacyInfo(playerA.Id, out var playerBToA)) return false;
playerAToB.IsTeammate = isTeammate;
playerBToA.IsTeammate = isTeammate;
if (!isTeammate) return true;
playerAToB.DiplomacyState = DiplomacyState.League;
playerBToA.DiplomacyState = DiplomacyState.League;
playerAToB.IsLeagueRequest = false;
playerBToA.IsLeagueRequest = false;
playerAToB.IsLeagueRupture = false;
playerBToA.IsLeagueRupture = false;
if (map.GetCapitalCityDataByPlayerId(playerB.Id, out var playerBCapital)
&& map.GetGridDataByCityId(playerBCapital.Id, out var playerBCapitalGrid))
{
UpdateSight_LogicView(map, playerA, map.GridMap.GetAroundGridIdList(1, playerBCapitalGrid, true));
}
if (map.GetCapitalCityDataByPlayerId(playerA.Id, out var playerACapital)
&& map.GetGridDataByCityId(playerACapital.Id, out var playerACapitalGrid))
{
UpdateSight_LogicView(map, playerB, map.GridMap.GetAroundGridIdList(1, playerACapitalGrid, true));
}
return true;
}
// 设置外交关系
public void SetDiplomacyLeague(MapData map, PlayerData originPlayer, PlayerData targetPlayer, DiplomacyState state)
{
if (!originPlayer.GetCountryDiplomacyInfo(targetPlayer.Id, out var player1ToPlayer2)) return;
if (!targetPlayer.GetCountryDiplomacyInfo(originPlayer.Id, out var player2ToPlayer1)) return;
if (state == DiplomacyState.War && (player1ToPlayer2.IsTeammate || player2ToPlayer1.IsTeammate)) return;
player1ToPlayer2.DiplomacyState = state;
player2ToPlayer1.DiplomacyState = state;
if (state == DiplomacyState.War)

View File

@ -268,6 +268,10 @@ namespace Logic
&& mapData.GetPlayerDataByUnitId(unitData.Id, out var player1)
&& player1.Id != player2.Id)
{
if (player1.GetCountryDiplomacyInfo(player2.Id, out var player1ToPlayer2)
&& player2.GetCountryDiplomacyInfo(player1.Id, out var player2ToPlayer1)
&& (player1ToPlayer2.IsTeammate || player2ToPlayer1.IsTeammate))
return true;
player2.AddAttacker(player1.Id);
Main.PlayerLogic.SetDiplomacyLeague(mapData, player1, player2, DiplomacyState.War);
}
@ -515,11 +519,17 @@ namespace Logic
if (type is DamageType.ActiveAttack or DamageType.FollowAttack)
{
Main.PlayerLogic.SetDiplomacyLeague(mapData,player1, player2, DiplomacyState.War);
player1.CurAttackPlayers.Add(player2.Id);
player2.CurAttackPlayers.Add(player1.Id);
player2.AddAttacker(player1.Id);
player1.TurnNoAttack = 0;
bool isTeammate = player1.GetCountryDiplomacyInfo(player2.Id, out var player1ToPlayer2)
&& player2.GetCountryDiplomacyInfo(player1.Id, out var player2ToPlayer1)
&& (player1ToPlayer2.IsTeammate || player2ToPlayer1.IsTeammate);
if (!isTeammate)
{
Main.PlayerLogic.SetDiplomacyLeague(mapData,player1, player2, DiplomacyState.War);
player1.CurAttackPlayers.Add(player2.Id);
player2.CurAttackPlayers.Add(player1.Id);
player2.AddAttacker(player1.Id);
player1.TurnNoAttack = 0;
}
}
//Step #4 Moment Process