292 lines
14 KiB
C#
292 lines
14 KiB
C#
/*
|
||
* @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;
|
||
}
|
||
|
||
|
||
}
|
||
|
||
} |