/* * @Author: 白哉 * @Description: 行为逻辑类 * @Date: 2025年04月10日 星期四 11:04:44 * @Modify: */ using System; using System.Collections.Generic; using System.Linq; using Logic.Action; using RuntimeData; using TH1_Core.Events; using TH1_Core.Managers; using TH1_Logic.Core; using TH1Renderer; using Unity.VisualScripting.Antlr3.Runtime.Tree; using UnityEngine; //这里是所有BuildAction派生子类的实现模块 namespace TH1_Logic.Action { public enum PlayerActionType { None, OfferAlly, AcceptAlly, RefuseAlly, BreakAlly, Embassy, Max } //UnitAction单位行动逻辑类 public class PlayerActionAction : ActionLogicBase { public PlayerActionAction(CommonActionId id) : base(id) { } protected override bool Execute(CommonActionParams actionParams, bool isMoment) { //Step #1 鲁棒性判断 if (actionParams.PlayerData == null) return false; if (actionParams.MainObjectType != MainObjectType.Player) return false; if (actionParams.TargetPlayerData == null) return false; if (!CheckCan(actionParams)) return false; MapData map = actionParams.MapData; PlayerData player = actionParams.PlayerData; PlayerData targetPlayer = actionParams.TargetPlayerData; if (!map.GetCapitalCityDataByPlayerId(actionParams.TargetPlayerData.Id, out var city)) return false; if (!map.GetGridDataByCityId(city.Id, out var grid)) return false; actionParams.PlayerData.DiplomacyData.GetCountryDiplomacyInfo(actionParams.TargetPlayerData.Id, out var dipInfo); actionParams.TargetPlayerData.DiplomacyData.GetCountryDiplomacyInfo(actionParams.PlayerData.Id,out var dipInfo2); //Step #2 处理大使馆 if (_actionId.PlayerActionType == PlayerActionType.Embassy) { //Step #1建立大使馆,并更新对应城市的视觉,播放大使馆建立特效 & Notify通知 dipInfo.IsEmbassy = true; city.CityInfoRenderMark = true; grid.VFXRenderMarkTreasure = true; EventManager.Publish(new ShowUINotifyCommon(){UINotifyCommonType = UINotifyCommonType.DiplomacyEmbassy}); //Step #2 更新大使馆周围一格的视野,会自动处理视觉部分 var gidList = map.GridMap.GetAroundGridIdList(1,grid,true ); Main.PlayerLogic.UpdateSight(map,player,gidList); //step #3 扣钱 player.PlayerWealth -= GetCost(); return true; } //Step #3 处理申请结盟 if (_actionId.PlayerActionType == PlayerActionType.OfferAlly) { //Step #1 让对方收到我方邮件 dipInfo2.IsLeagueRequest = true; EventManager.Publish(new ShowUINotifyCommon(){UINotifyCommonType = UINotifyCommonType.DiplomacyOfferAlly}); return true; } //Step #4 处理accept结盟 if (_actionId.PlayerActionType == PlayerActionType.AcceptAlly) { //Step #1 关闭我方的对方结盟信件请求标记,登记为盟友 dipInfo.IsLeagueRequest = false; dipInfo.DiplomacyState = DiplomacyState.League; dipInfo2.DiplomacyState = DiplomacyState.League; //Step #2 如果target是真map真人玩家 弹出一个presentationUI 提示,达成盟友 if (map == Main.MapData && targetPlayer.Id == map.PlayerMap.SelfPlayerId) { var announcement = new ShowUIAnnounceDiplomacy { PlayerActionType = PlayerActionType.AcceptAlly,PlayerId = player.Id }; EventManager.Publish(announcement); } return true; } //Step #5 处理refuse结盟 if (_actionId.PlayerActionType == PlayerActionType.RefuseAlly) { //Step #1 关闭对方的结盟请求标记 dipInfo.IsLeagueRequest = false; //Step #2 如果target是真map真人玩家 弹出一个presentationUI 提示,明确拒绝对方 if (map == Main.MapData && targetPlayer.Id == map.PlayerMap.SelfPlayerId) { var announcement = new ShowUIAnnounceDiplomacy { PlayerActionType = PlayerActionType.RefuseAlly,PlayerId = player.Id }; EventManager.Publish(announcement); } return true; } //Step #6 处理break结盟 if (_actionId.PlayerActionType == PlayerActionType.BreakAlly) { //Step #1 设置我对对方的外交状态为背盟 dipInfo.DiplomacyState = DiplomacyState.LeagueRupture; //Step #2 如果target是真map真人玩家 弹出一个presentationUI 提示,明确背叛对方 if (map == Main.MapData && targetPlayer.Id == map.PlayerMap.SelfPlayerId) { var announcement = new ShowUIAnnounceDiplomacy { PlayerActionType = PlayerActionType.BreakAlly,PlayerId = player.Id }; EventManager.Publish(announcement); } return true; } return false; } public override bool CheckCan(CommonActionParams actionParams) { //Step #1 鲁棒性判断 if (actionParams.PlayerData == null) return false; if (actionParams.MainObjectType != MainObjectType.Player) return false; if (actionParams.TargetPlayerData == null) return false; //Step #2 判断钱够不够 if (GetCost() > actionParams.PlayerData.PlayerWealth) return false; //Step #3 如果不具备科技 return if (!actionParams.PlayerData.TechTree.CheckActionCan(_actionId)) return false; //Step #4 处理大使馆 if (_actionId.PlayerActionType == PlayerActionType.Embassy) { //如果对方没有原始首都,不可建立大使馆 actionParams.MapData.GetCapitalCityDataByPlayerId(actionParams.TargetPlayerData.Id,out var city); if (!Main.CityLogic.CheckCradleCapital(actionParams.MapData, actionParams.TargetPlayerData, city)) return false; //如果已经在对方建立了大使馆,不可再次建立大使馆 actionParams.PlayerData.DiplomacyData.GetCountryDiplomacyInfo(actionParams.TargetPlayerData.Id, out var dipInfo); if (dipInfo.IsEmbassy) return false; return true; } //Step #5 判断能否申请结盟 if (_actionId.PlayerActionType == PlayerActionType.OfferAlly) { actionParams.PlayerData.DiplomacyData.GetCountryDiplomacyInfo(actionParams.TargetPlayerData.Id, out var dipInfo); //如果刚解除结盟或者已经结盟 return if (dipInfo.DiplomacyState == DiplomacyState.League || dipInfo.DiplomacyState == DiplomacyState.LeagueRupture) return false; //如果对方已经有一个来自我方的结盟请求 actionParams.TargetPlayerData.DiplomacyData.GetCountryDiplomacyInfo(actionParams.PlayerData.Id,out var dipInfo2); if (dipInfo2.IsLeagueRequest) return false; return true; } //Step #6 && #7 判断能否refuse / accept 结盟 if (_actionId.PlayerActionType == PlayerActionType.RefuseAlly || _actionId.PlayerActionType == PlayerActionType.AcceptAlly) { actionParams.PlayerData.DiplomacyData.GetCountryDiplomacyInfo(actionParams.TargetPlayerData.Id, out var dipInfo); //如果刚解除结盟或者已经结盟 return if (dipInfo.DiplomacyState == DiplomacyState.League || dipInfo.DiplomacyState == DiplomacyState.LeagueRupture) return false; //如果对方没有结盟请求 //actionParams.TargetPlayerData.DiplomacyData.GetCountryDiplomacyInfo(actionParams.PlayerData.Id,out var dipInfo2); if (!dipInfo.IsLeagueRequest) return false; return true; } //Step #8 判断能否break结盟 if (_actionId.PlayerActionType == PlayerActionType.BreakAlly) { actionParams.PlayerData.DiplomacyData.GetCountryDiplomacyInfo(actionParams.TargetPlayerData.Id, out var dipInfo); //如果没有结盟 return if (dipInfo.DiplomacyState != DiplomacyState.League) return false; //如果对方率先break,return actionParams.TargetPlayerData.DiplomacyData.GetCountryDiplomacyInfo(actionParams.PlayerData.Id,out var dipInfo2); if (dipInfo2.DiplomacyState == DiplomacyState.LeagueRupture) return false; return true; } return false; } public override bool CheckShow(CommonActionParams actionParams) { //Step #1 鲁棒性判断 if (actionParams.PlayerData == null) return false; if (actionParams.MainObjectType != MainObjectType.Player) return false; if (actionParams.TargetPlayerData == null) return false; actionParams.PlayerData.DiplomacyData.GetCountryDiplomacyInfo(actionParams.TargetPlayerData.Id, out var dipInfo); //Step #2 如果与对方已经结盟,不能显示结盟按钮 if(dipInfo.DiplomacyState == DiplomacyState.League && _actionId.PlayerActionType == PlayerActionType.OfferAlly) return false; //Step #2 如果未与结盟,不能显示接触结盟按钮 if(dipInfo.DiplomacyState != DiplomacyState.League && _actionId.PlayerActionType == PlayerActionType.BreakAlly) return false; return true; } public override ActionShowState CheckShowState(CommonActionParams actionParams) { //Step #1 鲁棒性判断 if (actionParams.PlayerData == null) return ActionShowState.None; if (actionParams.MainObjectType != MainObjectType.Player) return ActionShowState.None; if (actionParams.TargetPlayerData == null) return ActionShowState.None; MapData map = actionParams.MapData; PlayerData player = actionParams.PlayerData; PlayerData targetPlayer = actionParams.TargetPlayerData; if (!map.GetCapitalCityDataByPlayerId(actionParams.TargetPlayerData.Id, out var city)) return ActionShowState.None; if (!map.GetGridDataByCityId(city.Id, out var grid)) return ActionShowState.None; actionParams.PlayerData.DiplomacyData.GetCountryDiplomacyInfo(actionParams.TargetPlayerData.Id, out var dipInfo); actionParams.TargetPlayerData.DiplomacyData.GetCountryDiplomacyInfo(actionParams.PlayerData.Id,out var dipInfo2); //Step #2 计算结盟按钮的情况 if (_actionId.PlayerActionType == PlayerActionType.OfferAlly) { //如果没有科技 if (!actionParams.PlayerData.TechTree.CheckActionCan(_actionId)) return ActionShowState.Unavailable; //如果已经发送过,还没被回应 if(dipInfo2.IsLeagueRequest) return ActionShowState.Unavailable; //如果已经结盟 if (dipInfo.DiplomacyState == DiplomacyState.League) return ActionShowState.Finished; //其他情况一律是available return ActionShowState.Available; } //Step #3 计算breakAlly按钮的情况 if (_actionId.PlayerActionType == PlayerActionType.BreakAlly) { return ActionShowState.Available; } //Step #4 计算embassy按钮的情况 if (_actionId.PlayerActionType == PlayerActionType.Embassy) { //如果没有科技 if (!actionParams.PlayerData.TechTree.CheckActionCan(_actionId)) return ActionShowState.Unavailable; //如果对方已经丢失原始首都 if (!map.GetCapitalCityDataByPlayerId(targetPlayer.Id, out var targetCapital)) return ActionShowState.None; if (!Main.CityLogic.CheckCradleCapital(map, targetPlayer, targetCapital)) return ActionShowState.Unavailable; //如果钱不够 if (player.PlayerWealth < GetCost()) return ActionShowState.Expensive; //如果已经建立了大使馆 if (dipInfo.IsEmbassy) return ActionShowState.Finished; //其他情况一律是available return ActionShowState.Available; } return ActionShowState.None; } public override bool ExecuteViewBefore(CommonActionParams actionParams) { return false; } public override bool ExecuteViewAfter(CommonActionParams actionParams) { return false; } } }