增加队友逻辑
This commit is contained in:
parent
41a77ab922
commit
ec04df6514
@ -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;
|
||||
}
|
||||
|
||||
|
||||
// 一场游戏的地图数据
|
||||
|
||||
@ -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;
|
||||
//如果对方率先break,return
|
||||
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;
|
||||
//如果对方率先break,return
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user