TH1/Unity/Assets/Scripts/TH1_Logic/Action/UnitActionLogic.cs
2026-03-30 12:04:50 +08:00

1415 lines
59 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* @Author: 白哉
* @Description: 行为逻辑类
* @Date: 2025年04月10日 星期四 11:04:44
* @Modify:
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using Logic.AI;
using Logic.Audio;
using Logic.CrashSight;
using Logic.Skill;
using RuntimeData;
using Steamworks;
using TH1_Core.Events;
using TH1_Core.Managers;
using TH1_Logic.Core;
using UnityEngine;
using TH1Renderer;
using TH1Resource;
using Unity.VisualScripting;
//这里是所有BuildAction派生子类的实现模块
namespace Logic.Action
{
public enum UnitActionType
{
None,Upgrade,Recover,HEAL,Examine,Gather,Capture,Disband,ROYALFLAMES,ROYALFLAMESPRO,HeroUpgrade,
TEWIFRENCHBUFF,
MOKOUFRENCHBOOM,
KAGUYAFRENCHAROUND,
ForceDisband,
RemoveRedMist,
REMILIABUFF,
AbsorbRedMist,
REMILIAABSORB,
KANAKOSIT,
KANAKOUNSIT,
AYAMOVEAGAIN,
}
//UnitAction单位行动逻辑类
public class UnitActionAction : ActionLogicBase
{
public UnitActionAction(CommonActionId id) : base(id)
{
}
protected override bool Execute(CommonActionParams actionParams)
{
//鲁棒性判断
if (actionParams.UnitData == null) return false;
var unitData = actionParams.UnitData;
var playerData = actionParams.PlayerData;
if (playerData == null)
if (!actionParams.MapData.GetPlayerDataByUnitId(actionParams.UnitData.Id, out playerData))
return false;
if (!actionParams.MapData.GetGridDataByUnitId(actionParams.UnitData.Id, out var gridData))
return false;
if (_actionId.UnitActionType == UnitActionType.Capture)
{
//处理捕获city的情况
if (actionParams.MapData.GetCityDataByGid(gridData.Id, out var cityData))
{
//Step #1 先更新unit 状态
actionParams.UnitData.CP = 0;
actionParams.UnitData.MP = 0;
actionParams.UnitData.AP = 0;
actionParams.UnitData.Renderer(actionParams.MapData)?.InstantUpdateUnit(true);
//Step #2 再处理占领城市的所有logic & view
Main.PlayerLogic.OccupyCity_LogicView(actionParams.MapData, actionParams.UnitData, cityData);
//Step #3 再更新heroTask
unitData.HeroTask(actionParams.MapData)?.OnCaptureCity(actionParams.MapData);
foreach (var item in actionParams.PlayerData.MomentData.Items)
{
item.OnCaptureCity(actionParams.MapData, actionParams.PlayerData, cityData);
}
var player = unitData?.Player(actionParams.MapData);
if (player != null)
{
foreach (var kv in player.PlayerHeroData.HeroTaskDict)
kv.Value.OnPlayerCaptureCity(actionParams.MapData);
}
return true;
}
//处理占领村庄的情况
else
{
gridData.Renderer(actionParams.MapData)?.PlayVFXInSight(new GridVFXParams(GridVFXType.Fog));
cityData = Main.PlayerLogic.OccupyVillage_LogicOnly(actionParams.MapData,actionParams.UnitData,gridData);
//Step #3 再更新heroTask
unitData.HeroTask(actionParams.MapData)?.OnCaptureVillage(actionParams.MapData);
var player = unitData?.Player(actionParams.MapData);
if (player != null)
{
foreach (var kv in player.PlayerHeroData.HeroTaskDict)
kv.Value.OnPlayerCaptureVillage(actionParams.MapData);
}
//Step #3.5 如果玩家有视野,播放音效
if(gridData.InMainSight())
AudioManager.Instance.PlayAudio("SFX/UNIT_capture");
//处理占领城市的特效(所有领土会升起一面旗帜
HashSet<uint> gridList = new HashSet<uint>();
cityData.Territory.GetAllTerritoryArea(gridList);
foreach (var gd in gridList)
{
if (actionParams.MapData.GridMap.GetGridDataByGid(gd, out var gdd))
{
//设置gdd格子的VFXrendermark
var t = new GridVFXParams(GridVFXType.Flag);
t.CivId = playerData.PlayerCivId;
gdd.Renderer(actionParams.MapData)?.PlayVFXInSight(t);
}
}
actionParams.UnitData.CP = 0;
actionParams.UnitData.MP = 0;
actionParams.UnitData.AP = 0;
unitData.Renderer(actionParams.MapData)?.InstantUpdateUnit(true);
//Step #5 处理NotifyMoment
if (actionParams.UnitData.Player(actionParams.MapData) == Main.MapData.PlayerMap.SelfPlayerData)
{
EventManager.Publish(new ShowUINotifyMoment()
{
MomentSubType = MomentSubType.BattleCaptureVillage,
Empire = Main.MapData.PlayerMap.SelfPlayerData.Empire
});
}
return true;
}
}
if (_actionId.UnitActionType == UnitActionType.Upgrade)
{
actionParams.UnitData.SetOfficer();
actionParams.UnitData.Health = actionParams.UnitData.GetMaxHealth();
actionParams.UnitData.Renderer(actionParams.MapData)?.InstantUpdateUnit(true);
//Step #3.5 如果玩家有视野,播放音效
if(actionParams.UnitData.Grid(actionParams.MapData)?.InMainSight() ?? false)
AudioManager.Instance.PlayAudio("SFX/UNIT_levelup");
//Step #4 Moment
if (actionParams.UnitData.Player(actionParams.MapData) == Main.MapData.PlayerMap.SelfPlayerData)
{
EventManager.Publish(new ShowUINotifyMoment()
{
MomentSubType = MomentSubType.BattleLevelup,
Empire = Main.MapData.PlayerMap.SelfPlayerData.Empire
});
}
return true;
}
//处理ship
if (_actionId.UnitType == UnitType.Ship || _actionId.UnitType == UnitType.RammerShip
|| _actionId.UnitType == UnitType.BomberShip)
{
if (!Table.Instance.UnitTypeDataAssets.GetUnitTypeInfo(_actionId.UnitType,GiantType.None,0, out var info ))
return false;
if (actionParams.PlayerData.PlayerCoin < info.Cost)
return false;
actionParams.PlayerData.SpendCoin(info.Cost);
Main.UnitLogic.UnitTypeTransform(actionParams.MapData,actionParams.UnitData,_actionId.UnitType);
Main.PlayerLogic.UpdateSight_LogicView(actionParams.MapData,actionParams.PlayerData,actionParams.MapData.GridMap.GetAroundGridIdList(unitData.GetSightRange(actionParams.MapData),gridData));
actionParams.UnitData.Renderer(actionParams.MapData)?.InstantUpdateUnit(true);
actionParams.UnitData.Grid(actionParams.MapData)?.Renderer(actionParams.MapData)?.PlayVFXInSight(new GridVFXParams(GridVFXType.Fog));
//Step #3.5 如果玩家有视野,播放音效
if(actionParams.UnitData.Grid(actionParams.MapData)?.InMainSight() ?? false)
AudioManager.Instance.PlayAudio("SFX/UNIT_levelup");
return true;
}
//剩下的都需要CP消耗CP
//用ret做记录
bool ret = false;
//处理disband
if (_actionId.UnitActionType == UnitActionType.Disband)
{
int earn = 0;
if (!Table.Instance.UnitTypeDataAssets.GetUnitTypeInfo(actionParams.UnitData.UnitFullType, out var info ))
return false;
earn += info.Cost / 2;
if (actionParams.UnitData.CarryUnitFullType.UnitType != UnitType.None
&& Table.Instance.UnitTypeDataAssets.GetUnitTypeInfo(actionParams.UnitData.CarryUnitFullType,out var carryInfo))
earn += carryInfo.Cost / 2;
var startPos = Table.Instance.GridToWorld(gridData);
actionParams.PlayerData.AddCoin(earn,startPos);
if (actionParams.MapData.IsCurrentShowMap())
{
//播放雾效
gridData.Renderer(actionParams.MapData)?.PlayVFXInSight(new GridVFXParams(GridVFXType.Fog));
actionParams.UnitData.Renderer(Main.MapData)?.Die();
//更新原来所属的城市的cityinfo
}
var city = actionParams.UnitData.City(actionParams.MapData);
Main.UnitLogic.UnitUnnaturalDie(actionParams.MapData,actionParams.UnitData);
if (city != null)
{
city.CityInfoRenderer(actionParams.MapData)?.InstantUpdateCityInfo();
ret = true;
}
}
//处理recover
if (_actionId.UnitActionType == UnitActionType.Recover)
{
int recoverV = 4;
if (!actionParams.MapData.GetPlayerDataByTerritoryGridId(gridData.Id, out var terrPlayerData))
recoverV = 2;
else if (!actionParams.MapData.SameUnion(terrPlayerData.Id , actionParams.PlayerData.Id))
recoverV = 2;
actionParams.UnitData.Health += recoverV;
if (actionParams.UnitData.Health > actionParams.UnitData.GetMaxHealth())
actionParams.UnitData.Health = actionParams.UnitData.GetMaxHealth();
ret = true;
if(actionParams.UnitData.Renderer(actionParams.MapData)?.InstantUpdateUnit(true) ?? false)
gridData.Renderer(actionParams.MapData)?.PlayVFXInSight(new GridVFXParams(GridVFXType.Heal));
}
//处理gather
if (_actionId.UnitActionType == UnitActionType.Gather)
{
gridData.Resource = ResourceType.None;
actionParams.PlayerData.AddCoin(10,Table.Instance.GridToWorld(gridData));
gridData.Renderer(actionParams.MapData)?.InstantUpdateGrid(true);
ret = true;
if (actionParams.MapData == Main.MapData && actionParams.MapData.PlayerMap.SelfPlayerId == playerData.Id)
{
gridData.Renderer(actionParams.MapData)?.PlayVFXInSight(new GridVFXParams(GridVFXType.Fog));
}
}
//处理examine
if (_actionId.UnitActionType == UnitActionType.Examine)
{
unitData.HeroTask(actionParams.MapData)?.OnTreasure(actionParams.MapData);
var player = unitData?.Player(actionParams.MapData);
if (player != null)
{
foreach (var kv in player.PlayerHeroData.HeroTaskDict)
kv.Value.OnPlayerTreasure(actionParams.MapData);
}
gridData.Resource = ResourceType.None;
gridData.Renderer(actionParams.MapData)?.InstantUpdateGrid(true);
var value = actionParams.MapData.Net.GetRandom(actionParams.MapData).Next(0, 100);
//播放雾效
if (actionParams.MapData == Main.MapData && actionParams.MapData.PlayerMap.SelfPlayerId == playerData.Id)
{
gridData.Renderer(actionParams.MapData)?.PlayVFXInSight(new GridVFXParams(GridVFXType.Fog));
AudioManager.Instance.PlayAudio("SFX/UNIT_treasure");
}
if (value < 50)
{
actionParams.PlayerData.AddCoin(10,Table.Instance.GridToWorld(gridData));
}
//给一个单位
else
{
Main.UnitLogic.PassiveMoveAway(actionParams.MapData, actionParams.UnitData);
if(!actionParams.MapData.GetCapitalCityDataByPlayerId(actionParams.PlayerData.Id, out var capital))
return false;
if (gridData.Terrain == TerrainType.Land)
{
if (actionParams.MapData.AddUnitData(gridData.Id, capital.Id,new UnitFullType(UnitType.Swordsman,GiantType.None,0) , out var unit))
{
unit.SetOfficer();
unit.Health = unit.GetMaxHealth();
unit.Renderer(actionParams.MapData)?.InstantUpdateUnit(true);
};
}
else
{
if (actionParams.MapData.AddUnitData(gridData.Id, capital.Id,
new UnitFullType(UnitType.RammerShip, GiantType.None, 0), out var unit))
{
unit.AddSkill_Legacy(SkillType.OFFICER,actionParams.MapData,true,-1,false,-1,false,SpecialAddSkillType.Normal,0);
unit.SetOfficer();
unit.Health = unit.GetMaxHealth();
//Main.UnitLogic.UnitTypeTransform(actionParams.MapData,unit,new UnitFullType(UnitType.RammerShip,GiantType.None,0));
unit.Renderer(actionParams.MapData)?.InstantUpdateUnit(true);
}
}
capital.SetCityRenderer(actionParams.MapData);
}
ret = true;
//Step #4 Moment
if (actionParams.MapData == Main.MapData && actionParams.UnitData.Player(actionParams.MapData) ==
Main.MapData.PlayerMap.SelfPlayerData)
{
EventManager.Publish(new ShowUINotifyMoment()
{
MomentSubType = MomentSubType.ExploitTreasure,
Empire = Main.MapData.PlayerMap.SelfPlayerData.Empire
});
}
}
if (ret)
{
actionParams.UnitData.CP = 0;
actionParams.UnitData.AP = 0;
actionParams.UnitData.MP = 0;
actionParams.UnitData.Renderer(actionParams.MapData)?.InstantUpdateUnit(true);
}
return ret;
}
public override bool CheckCan(CommonActionParams actionParams)
{
//鲁棒性判断
if (actionParams.UnitData == null) return false;
if (actionParams.PlayerData == null) return false;
if (!actionParams.MapData.GetGridDataByUnitId(actionParams.UnitData.Id, out var gridData))
return false;
//如果unit不是player的退出
if(!actionParams.MapData.GetPlayerDataByUnitId(actionParams.UnitData.Id, out var playerData) ||
playerData != actionParams.PlayerData)
return false;
//判断钱够不够
if (GetCost(actionParams) > actionParams.PlayerData.PlayerCoin)
return false;
//如果不具备科技
if (!actionParams.PlayerData.TechTree.CheckActionCan(_actionId))
return false;
if (_actionId.UnitActionType == UnitActionType.Upgrade)
{
//鲁棒性处理
if (!Table.Instance.UnitTypeDataAssets.GetUnitTypeInfo(actionParams.UnitData.UnitFullType, out var info))
return false;
return actionParams.UnitData.IsCanBeOfficer();
}
//先处理不需要CP的 Upgrade UnitShip UnitRammerShip UnitBattleShip 这4个
if (_actionId.UnitType == UnitType.Ship || _actionId.UnitType == UnitType.RammerShip
|| _actionId.UnitType == UnitType.BomberShip)
{
if(actionParams.UnitData.UnitFullType.UnitType != UnitType.Boat)
return false;
if (!actionParams.MapData.GetPlayerDataByTerritoryGridId(gridData.Id, out var player1))
return false;
if(!actionParams.MapData.SameUnion(player1.Id,actionParams.PlayerData.Id))
return false;
return true;
}
//剩下的都需要CP如果Unit有没有CP了return false
if (actionParams.UnitData.CP <= 0)
return false;
//处理capture
if (_actionId.UnitActionType == UnitActionType.Capture)
{
//如果是占领别的城市
if (actionParams.MapData.GetCityDataByGid(gridData.Id, out var cityData))
{
actionParams.MapData.GetPlayerDataByCityId(cityData.Id,out var playerId1);
actionParams.MapData.GetPlayerDataByUnitId(actionParams.UnitData.Id,out var playerId2);
return playerId1 != playerId2;
}
//如果是占领村庄
else
{
return gridData.Resource == ResourceType.CityCenter;
}
}
//处理disband
if (_actionId.UnitActionType == UnitActionType.Disband)
{
if ((actionParams.UnitData.UnitType is UnitType.Giant or UnitType.GiantJuggernaut or UnitType.KaguyaFrenchReisenIllusion or UnitType.KaguyaFrenchMokouEgg) || actionParams.UnitData.CarryUnitType == UnitType.Giant)
return false;
return true;
}
//处理recover
if (_actionId.UnitActionType == UnitActionType.Recover)
{
if (actionParams.UnitData.Health < actionParams.UnitData.GetMaxHealth())
return true;
return false;
}
//处理gather
if (_actionId.UnitActionType == UnitActionType.Gather)
return gridData.Resource == ResourceType.Starfish;
//处理examine
if (_actionId.UnitActionType == UnitActionType.Examine)
return gridData.Resource == ResourceType.Treasure;
//处理战技ROYALFLAMES
if (_actionId.UnitActionType == UnitActionType.ROYALFLAMES)
{
if (!actionParams.UnitData.GetSkill(SkillType.ROYALFLAMES, out var skillInfo))
return false;
return true;
}
return false;
}
public override bool CheckShow(CommonActionParams actionParams,out ShowType showType)
{
showType = ShowType.None;
//鲁棒性判断
if (actionParams.UnitData == null) return false;
if (actionParams.PlayerData == null) return false;
if (!actionParams.MapData.GetGridDataByUnitId(actionParams.UnitData.Id, out var gridData))
return false;
//如果unit不是player的退出
if(!actionParams.MapData.GetPlayerDataByUnitId(actionParams.UnitData.Id, out var playerData) ||
playerData.Id != actionParams.PlayerData.Id)
return false;
//判断钱够不够 checkshow中 即使钱不够,也可以显示的
//if (GetCost() > actionParams.PlayerData.PlayerWealth)
// return false;
//如果不具备科技
if (!actionParams.PlayerData.TechTree.CheckActionCan(_actionId))
return false;
//先处理不需要CP的 Upgrade UnitShip UnitRammerShip UnitBattleShip 这4个
if (_actionId.UnitActionType == UnitActionType.Upgrade)
{
//鲁棒性处理
if (!Table.Instance.UnitTypeDataAssets.GetUnitTypeInfo(actionParams.UnitData.UnitType,
actionParams.UnitData.GiantType, actionParams.UnitData.UnitLevel,out var info))
return false;
if (actionParams.UnitData.IsCanBeOfficer()) return true;
return false;
}
if (_actionId.UnitType == UnitType.Ship || _actionId.UnitType == UnitType.RammerShip
|| _actionId.UnitType == UnitType.BomberShip)
{
if(actionParams.UnitData.UnitType != UnitType.Boat)
return false;
if (!actionParams.MapData.GetPlayerDataByTerritoryGridId(gridData.Id, out var player1))
return false;
if(!actionParams.MapData.SameUnion(player1.Id,actionParams.PlayerData.Id))
return false;
return true;
}
//剩下的都需要CP如果Unit有没有CP了return false
if (actionParams.UnitData.CP <= 0)
return false;
//处理capture
if (_actionId.UnitActionType == UnitActionType.Capture)
{
//如果是占领别的城市
if (actionParams.MapData.GetCityDataByGid(gridData.Id, out var cityData))
{
actionParams.MapData.GetPlayerDataByCityId(cityData.Id,out var playerId1);
actionParams.MapData.GetPlayerDataByUnitId(actionParams.UnitData.Id,out var playerId2);
return playerId1 != playerId2;
}
//如果是占领村庄
else
{
return gridData.Resource == ResourceType.CityCenter;
}
}
//处理disband
if (_actionId.UnitActionType == UnitActionType.Disband)
{
if ((actionParams.UnitData.UnitType is UnitType.Giant or UnitType.GiantJuggernaut or UnitType.KaguyaFrenchReisenIllusion or UnitType.KaguyaFrenchMokouEgg) || actionParams.UnitData.CarryUnitType == UnitType.Giant)
return false;
return true;
}
//处理recover
if (_actionId.UnitActionType == UnitActionType.Recover)
{
if (actionParams.UnitData.Health < actionParams.UnitData.GetMaxHealth())
return true;
return false;
}
//处理gather
if (_actionId.UnitActionType == UnitActionType.Gather)
return gridData.Resource == ResourceType.Starfish;
//处理examine
if (_actionId.UnitActionType == UnitActionType.Examine)
return gridData.Resource == ResourceType.Treasure;
//处理战技ROYALFLAMES
if (_actionId.UnitActionType == UnitActionType.ROYALFLAMES)
{
if (!actionParams.UnitData.GetSkill(SkillType.ROYALFLAMES, out var skillInfo))
return false;
return true;
}
return false;
}
//付钱
protected bool UnitActionPayMoney(CommonActionParams actionParam)
{
if (actionParam.PlayerData.PlayerCoin - GetCost(actionParam) < 0) return false;
actionParam.PlayerData.SpendCoin(GetCost(actionParam));
return true;
}
//确认是否满足基本信息,并且补全actionParam(主要是补充unit所处的grid)
protected bool UnitActionCheckBaseInfo(CommonActionParams actionParam)
{
//鲁棒性判断必须包含unitData和playerData表明是哪个玩家正在操作哪个单位
if (actionParam.UnitData == null) return false;
if (actionParam.PlayerData == null) return false;
if (!actionParam.MapData.GetGridDataByUnitId(actionParam.UnitData.Id, out var grid)) return false;
actionParam.GridData = grid;
return true;
}
protected bool UnitActionCheckUnitBelongPlayer(CommonActionParams actionParam)
{
//如果unit不是player的退出
if(!actionParam.MapData.GetPlayerDataByUnitId(actionParam.UnitData.Id, out var playerData) ||
playerData != actionParam.PlayerData)
return false;
return true;
}
//确认是否有科技
protected bool UnitActionCheckHasTech(CommonActionParams actionParam)
{
//如果没有对应科技return false
if (!actionParam.PlayerData.TechTree.CheckActionCan(_actionId))
return false;
return true;
}
//确认是否有钱
protected bool UnitActionCheckHasMoney(CommonActionParams actionParams)
{
//判断钱够不够
if (GetCost(actionParams) > actionParams.PlayerData.PlayerCoin)
return false;
return true;
}
//确认unit是否有CP
protected bool UnitActionCheckUnitHasCP(CommonActionParams actionParam)
{
if (actionParam.UnitData == null || actionParam.UnitData.CP <= 0)
return false;
return true;
}
//确认unit是否拥有这个skill
protected bool UnitActionCheckUnitHasSkill(CommonActionParams actionParam)
{
//将unitActionType转化为skillType
if (!Enum.TryParse(_actionId.UnitActionType.ToString(), out SkillType skillType)) return false;
if (actionParam.UnitData == null || !actionParam.UnitData.GetSkill(skillType, out var _)) return false;
return true;
}
}
//目前废弃
public class UnitActionROYALFLAMESPRO : UnitActionAction
{
public UnitActionROYALFLAMESPRO(CommonActionId id) : base(id)
{
}
protected override bool Execute(CommonActionParams actionParams)
{
return false;
}
public override bool CheckCan(CommonActionParams actionParam)
{
return false;
}
public override bool CheckShow(CommonActionParams actionParam,out ShowType showType)
{
showType = ShowType.None;
return false;
}
}
//英雄升级
public class UnitActionGiantUpgrade : UnitActionAction
{
private int _healthBeforeAnim;
private bool CheckUnitCanGiantUpgrade(CommonActionParams actionParams)
{
var unit = actionParams.UnitData;
var player = actionParams.PlayerData;
if (player == null) return false;
if(unit == null || unit.UnitType != UnitType.Giant || unit.GiantType == GiantType.None || unit.UnitLevel >= 3) return false;
if(!Table.Instance.UnitTypeDataAssets.GetUnitTypeInfo(unit.UnitType,unit.GiantType,unit.UnitLevel,out var info)) return false;
return unit.HeroTask(actionParams.MapData)?.CheckFinished(actionParams.MapData, player) ?? false;
}
public UnitActionGiantUpgrade(CommonActionId id) : base(id)
{
}
protected override bool Execute(CommonActionParams actionParams)
{
if (actionParams.UnitData == null) return false;
_healthBeforeAnim = actionParams.UnitData.Health;
//if (!CheckCan(actionParams)) return false;
var unit = actionParams.UnitData;
if (!Table.Instance.UnitTypeDataAssets.GetUnitTypeInfo(unit.UnitType, unit.GiantType, unit.UnitLevel,
out var info)) return false;
//step #1 已经升到满级就return
if (unit.UnitLevel + 1 > 3) return false;
//step #2 英雄升级
if (!Main.UnitLogic.HeroUpgrade(actionParams.MapData, unit)) return false;
//step #3 回复10点血
unit.AddHealth(10);
//更新视觉自动排除非真map情况和不在视野情况
if(actionParams.UnitData.Renderer(actionParams.MapData)?.InstantUpdateUnit(true)??false){
actionParams.UnitData.Grid(actionParams.MapData)?.Renderer(actionParams.MapData)?.PlayVFXInSight(new GridVFXParams(GridVFXType.Heal));
}
if(actionParams.UnitData.Grid(actionParams.MapData)?.InMainSight()??false)
AudioManager.Instance.PlayAudio("SFX/UNIT_levelup");
//Step #4 Moment
if (actionParams.UnitData.Player(actionParams.MapData) == Main.MapData.PlayerMap.SelfPlayerData)
{
EventManager.Publish(new ShowUINotifyMoment()
{
MomentSubType = MomentSubType.BattleHeroLevelup,
Empire = Main.MapData.PlayerMap.SelfPlayerData.Empire
});
}
return true;
}
public override bool CheckCan(CommonActionParams actionParam)
{
//step #1 check基本信息
if (!UnitActionCheckBaseInfo(actionParam)) return false;
//#step #2 check unit属于player
if (!UnitActionCheckUnitBelongPlayer(actionParam)) return false;
//step #3 check unit是否是hero并满足升级条件
if (!CheckUnitCanGiantUpgrade(actionParam)) return false;
return true;
}
public override bool CheckShow(CommonActionParams actionParam,out ShowType showType)
{
showType = ShowType.None;
return CheckCan(actionParam);
}
public bool ExecuteViewBefore(CommonActionParams actionParams)
{
return true;
}
public bool ExecuteViewAfter(CommonActionParams actionParams)
{
return true;
}
}
public class UnitActionHEAL : UnitActionAction
{
public UnitActionHEAL(CommonActionId id) : base(id)
{
}
protected override bool Execute(CommonActionParams actionParams)
{
var map = actionParams.MapData;
var unit = actionParams.UnitData;
if (map == null || unit == null) return false;
if (!map.GetGridDataByUnitId(actionParams.UnitData.Id, out var targetGrid)) return false;
var roundGrid = map.GridMap.GetAroundGridData(1, 1, targetGrid);
foreach (var grid in roundGrid)
{
if (!map.GetUnitDataByGid(grid.Id, out var tunit)) continue;
if(tunit.Id == unit.Id)continue;
if (!map.SameUnionByUnitId(unit.Id,tunit.Id)) continue;
tunit.AddHealth(4);
if(tunit.Renderer(actionParams.MapData)?.InstantUpdateUnit(true)??false)
grid.Renderer(actionParams.MapData)?.PlayVFXInSight(new GridVFXParams(GridVFXType.Heal));
}
unit.ClearAPMPCP();
unit.Renderer(actionParams.MapData)?.InstantUpdateUnit(true);
return true;
}
public override bool CheckCan(CommonActionParams actionParam)
{
//step #1 check基本信息
if (!UnitActionCheckBaseInfo(actionParam)) return false;
//#step #2 check unit属于player
if (!UnitActionCheckUnitBelongPlayer(actionParam)) return false;
//step #3 check是否有CP释放技能
if (!UnitActionCheckUnitHasCP(actionParam)) return false;
//step #4 check unit是否拥有skill技能
if (!UnitActionCheckUnitHasSkill(actionParam)) return false;
return true;
}
public override bool CheckShow(CommonActionParams actionParam,out ShowType showType)
{
showType = ShowType.None;
return CheckCan(actionParam);
}
}
public class UnitActionTEWIFRENCHBUFF : UnitActionAction
{
public UnitActionTEWIFRENCHBUFF(CommonActionId id) : base(id)
{
}
protected override bool Execute(CommonActionParams actionParams)
{
var selfUnit = actionParams.UnitData;
var selfGrid = actionParams.GridData;
if(selfGrid == null)
if(!actionParams.MapData.GetGridDataByUnitId(selfUnit.Id, out selfGrid)) return false;
if (!actionParams.MapData.GetPlayerDataByUnitId(selfUnit.Id, out var selfPlayer)) return false;
var gridList = actionParams.MapData.GridMap.GetAroundGridData(1,1,selfGrid);
foreach (var grid in gridList)
{
if (grid == selfGrid) continue;
if(!actionParams.MapData.GetUnitDataByGid(grid.Id,out var targetUnit))continue;
if(!actionParams.MapData.GetPlayerDataByUnitId(targetUnit.Id, out var targetPlayer)) continue;
if(!actionParams.MapData.SameUnion(targetPlayer.Id,selfPlayer.Id)) continue;
targetUnit.AddSkill_Legacy(SkillType.MOVERANGEUP,actionParams.MapData,false,1,false,-1,false,SpecialAddSkillType.AddTurnLimit,0);
targetUnit.AddSkill_Legacy(SkillType.KAGUYAFRENCHSYNERGY,actionParams.MapData,false,1,false, -1,false,SpecialAddSkillType.AddTurnLimit,0);
if(targetUnit.Renderer(actionParams.MapData)?.InstantUpdateUnit(true)??false)
grid.Renderer(actionParams.MapData)?.PlayVFXInSight(new GridVFXParams(GridVFXType.TewiFrenchBuff));
}
actionParams.UnitData.ClearAPMPCP();
actionParams.UnitData.Renderer(actionParams.MapData)?.InstantUpdateUnit(true);
return true;
}
public override bool CheckCan(CommonActionParams actionParam)
{
//step #1 check基本信息
if (!UnitActionCheckBaseInfo(actionParam)) return false;
//#step #2 check unit属于player
if (!UnitActionCheckUnitBelongPlayer(actionParam)) return false;
//step #3 check是否有CP释放技能
if (!UnitActionCheckUnitHasCP(actionParam)) return false;
//step #4 check unit是否拥有skill技能
if (!UnitActionCheckUnitHasSkill(actionParam)) return false;
return true;
}
public override bool CheckShow(CommonActionParams actionParam,out ShowType showType)
{
showType = ShowType.None;
return CheckCan(actionParam);
}
}
public class UnitActionMOKOUFRENCHBOOM : UnitActionAction
{
public UnitActionMOKOUFRENCHBOOM(CommonActionId id) : base(id)
{
}
protected override bool Execute(CommonActionParams actionParams)
{
if (actionParams.MapData == null) return false;
var selfUnit = actionParams.UnitData;
if (selfUnit == null) return false;
var selfGrid = actionParams.GridData;
if (selfGrid == null)
{
if (!actionParams.MapData.GetGridDataByUnitId(selfUnit.Id, out selfGrid)) return false;
}
if (!actionParams.MapData.GetPlayerDataByUnitId(selfUnit.Id, out var selfPlayer)) return false;
var gridList = actionParams.MapData.GridMap.GetAroundGridData(1,1,selfGrid);
foreach (var grid in gridList)
{
if (grid == selfGrid) continue;
if(!actionParams.MapData.GetUnitDataByGid(grid.Id,out var targetUnit))continue;
var dmg = Table.Instance.CalcDamage(actionParams.MapData,selfUnit,targetUnit,10);
var dmgType = actionParams.MapData.SameUnionByUnitId(selfUnit.Id, targetUnit.Id) ? DamageType.KillSelf : DamageType.True;
var settle = Main.UnitLogic.DamageSettlement(actionParams.MapData, selfUnit, targetUnit, dmg, dmgType);
if (settle == null) continue;
if (settle.DamageTargetGrid != null && settle.DamageTargetGrid.InMainSight())
{
if (!settle.IsKill)
{
settle.DamageTargetGrid.Renderer(actionParams.MapData)?.PlayVFXInSight(new GridVFXParams(GridVFXType.Hurt));
targetUnit?.Renderer(actionParams.MapData)?.InstantUpdateUnit(true);
}
else
{
settle.DamageTargetGrid.Renderer(actionParams.MapData)?.PlayVFXInSight(new GridVFXParams(GridVFXType.Die));
settle.DamageTargetGrid.Renderer(actionParams.MapData)?.PlayVFXInSight(new GridVFXParams(GridVFXType.Hurt));
settle.DamageTargetGrid.Renderer(actionParams.MapData)?.PlayVFXInSight(new GridVFXParams(GridVFXType.Fog));
targetUnit?.Renderer(actionParams.MapData)?.Die();
}
}
}
Main.UnitLogic.DamageSettlement(actionParams.MapData, selfUnit, selfUnit, selfUnit.Health, DamageType.KillSelf);
selfUnit.Renderer(actionParams.MapData)?.Die();
return true;
}
public override bool CheckCan(CommonActionParams actionParam)
{
//step #1 check基本信息
if (!UnitActionCheckBaseInfo(actionParam)) return false;
//#step #2 check unit属于player
if (!UnitActionCheckUnitBelongPlayer(actionParam)) return false;
//step #3 check是否有CP释放技能
if (!UnitActionCheckUnitHasCP(actionParam)) return false;
//step #4 check unit是否拥有skill技能
if (!UnitActionCheckUnitHasSkill(actionParam)) return false;
return true;
}
public override bool CheckShow(CommonActionParams actionParam,out ShowType showType)
{
showType = ShowType.None;
return CheckCan(actionParam);
}
}
public class UnitActionKAGUYAFRENCHAROUND : UnitActionAction
{
public UnitActionKAGUYAFRENCHAROUND(CommonActionId id) : base(id)
{
}
protected override bool Execute(CommonActionParams actionParams)
{
var selfUnit = actionParams.UnitData;
var selfGrid = actionParams.GridData;
if(selfGrid == null)
if(!actionParams.MapData.GetGridDataByUnitId(selfUnit.Id, out selfGrid)) return false;
if (!actionParams.MapData.GetPlayerDataByUnitId(selfUnit.Id, out var selfPlayer)) return false;
var gridList = actionParams.MapData.GridMap.GetAroundGridData(1,1,selfGrid);
foreach (var grid in gridList)
{
if (grid == selfGrid) continue;
if(!actionParams.MapData.GetUnitDataByGid(grid.Id,out var targetUnit))continue;
if(!actionParams.MapData.GetPlayerDataByUnitId(targetUnit.Id, out var targetPlayer)) continue;
if(!actionParams.MapData.SameUnion(targetPlayer.Id,selfPlayer.Id)) continue;
targetUnit.AddSkill_Legacy(SkillType.KAGUYAFRENCHFOREVERBUFF, actionParams.MapData,false,1,true,1,true,SpecialAddSkillType.AddLevel, selfUnit.Id);
//if (targetUnit.GetSkill(SkillType.KAGUYAFRENCHFOREVERBUFF, out var skill))
//skill.AddLevel(actionParams.MapData, selfUnit, targetUnit, 1);
targetUnit.Renderer(actionParams.MapData)?.InstantUpdateUnit(true);
grid.Renderer(actionParams.MapData)?.PlayVFXInSight(new GridVFXParams(GridVFXType.KaguyaFrenchBuff));
}
actionParams.UnitData.ClearAPMPCP();
actionParams.UnitData.Renderer(actionParams.MapData)?.InstantUpdateUnit(true);
return true;
}
public override bool CheckCan(CommonActionParams actionParam)
{
//step #1 check基本信息
if (!UnitActionCheckBaseInfo(actionParam)) return false;
//#step #2 check unit属于player
if (!UnitActionCheckUnitBelongPlayer(actionParam)) return false;
//step #3 check是否有CP释放技能
if (!UnitActionCheckUnitHasCP(actionParam)) return false;
//step #4 check unit是否拥有skill技能
if (!UnitActionCheckUnitHasSkill(actionParam)) return false;
return true;
}
public override bool CheckShow(CommonActionParams actionParam,out ShowType showType)
{
showType = ShowType.None;
return CheckCan(actionParam);
}
}
public class UnitActionForceDisband : UnitActionAction
{
public UnitActionForceDisband(CommonActionId id) : base(id)
{
}
protected override bool Execute(CommonActionParams actionParams)
{
//Step #1 鲁棒性判断
if (actionParams.UnitData == null) return false;
var unitData = actionParams.UnitData;
var playerData = actionParams.PlayerData;
if (playerData == null)
if (!actionParams.MapData.GetPlayerDataByUnitId(actionParams.UnitData.Id, out playerData))
return false;
if (!actionParams.MapData.GetGridDataByUnitId(actionParams.UnitData.Id, out var gridData))
return false;
//Step #2 计算花费的金币数,增加金币
int earn = 0;
//返还造价一半的金币
if (!Table.Instance.UnitTypeDataAssets.GetUnitTypeInfo(actionParams.UnitData.UnitFullType, out var info )) return false;
earn += info.Cost / 2;
//如果是有carry技能那么船和船上单位分开计费
if (actionParams.UnitData.CarryUnitType != UnitType.None
&& Table.Instance.UnitTypeDataAssets.GetUnitTypeInfo(actionParams.UnitData.CarryUnitType,
GiantType.None,0, out var carryInfo))
earn += carryInfo.Cost / 2;
//AddCoin自带动画考量
actionParams.PlayerData.AddCoin(earn,gridData);
//Step #3 如果是真map需要播放单位死亡动画
if (actionParams.MapData == Main.MapData)
{
//播放雾效
gridData.Renderer(actionParams.MapData)?.PlayVFXInSight(new GridVFXParams(GridVFXType.Fog));
//通知渲染器播放死亡
if(MapRenderer.Instance.ROUnitMap.TryGetValue(actionParams.UnitData.Id,out var renderer))
renderer.Die();
}
//Step #4 单位彻底死亡
Main.UnitLogic.UnitUnnaturalDie(actionParams.MapData,actionParams.UnitData);
return true;
}
public override bool CheckCan(CommonActionParams actionParam)
{
//step #1 check基本信息
if (!UnitActionCheckBaseInfo(actionParam)) return false;
//#step #2 check unit属于player
if (!UnitActionCheckUnitBelongPlayer(actionParam)) return false;
return true;
}
}
public class UnitActionRemoveRedMist : UnitActionAction
{
public UnitActionRemoveRedMist(CommonActionId id) : base(id)
{
}
protected override bool Execute(CommonActionParams actionParams)
{
//Step #1 鲁棒性判断
var unit = actionParams.UnitData;
if (unit == null || !unit.Grid(actionParams.MapData,out var grid)) return false;
//Step #2 清除红雾
grid.RemoveSpType(GridSpType.RemiliaGrid,actionParams.MapData);
unit.ClearAPMPCP();
if (grid.InMainSight())
{
grid.Renderer(actionParams.MapData)?.PlayVFXInSight(new GridVFXParams(GridVFXType.Fog));
grid.Renderer(actionParams.MapData)?.InstantUpdateGrid();
unit.Renderer(actionParams.MapData)?.InstantUpdateUnit(false);
}
return true;
}
public override bool CheckCan(CommonActionParams actionParams)
{
//step #1 check基本信息
if (!UnitActionCheckBaseInfo(actionParams)) return false;
//#step #2 check unit属于player
if (!UnitActionCheckUnitBelongPlayer(actionParams)) return false;
//#step #3 check 是否有CP
if (actionParams.UnitData.CP <= 0) return false;
//#step #4 check 当前grid是否是remiliaGrid
if (!actionParams.UnitData.Grid(actionParams.MapData, out var grid) ||
!grid.HasSpType(GridSpType.RemiliaGrid)) return false;
//#step #5 部分格子无法清除红雾
if (grid.Resource == ResourceType.RemiliaMilitary) return false;
//#step #6 如果是remilia阵营的单位无法清除
var playerCivId = actionParams.UnitData.Player(actionParams.MapData)?.PlayerCivId;
if (playerCivId is 0) return false;
return true;
}
public override bool CheckShow(CommonActionParams actionParams,out ShowType showType)
{
showType = ShowType.None;
return CheckCan(actionParams);
}
}
public class UnitActionREMILIABUFF : UnitActionAction
{
public UnitActionREMILIABUFF(CommonActionId id) : base(id)
{
}
protected override bool Execute(CommonActionParams actionParams)
{
var selfUnit = actionParams.UnitData;
var selfGrid = actionParams.GridData;
if(selfGrid == null)
if(!actionParams.MapData.GetGridDataByUnitId(selfUnit.Id, out selfGrid)) return false;
if (!actionParams.MapData.GetPlayerDataByUnitId(selfUnit.Id, out var selfPlayer)) return false;
var gridList = actionParams.MapData.GridMap.GetAroundGridData(1,1,selfGrid);
foreach (var grid in gridList)
{
if (grid.Resource == ResourceType.CityCenter) continue;
if (grid.Terrain != TerrainType.Land) continue;
if (grid.HasSpType(GridSpType.RemiliaGrid)) continue;
grid.AddSpType(GridSpType.RemiliaGrid,actionParams.MapData,selfUnit);
if (grid.InMainSight())
{
grid.Renderer(actionParams.MapData)?.PlayVFXInSight(new GridVFXParams(GridVFXType.RedMistCreate));
grid.Renderer(actionParams.MapData)?.InstantUpdateGrid();
if(grid.SelfPlayerVisibleUnit(actionParams.MapData,out var gridUnit))
gridUnit.Renderer(actionParams.MapData)?.InstantUpdateUnit(false);
}
}
actionParams.UnitData.ClearAPMPCP();
actionParams.UnitData.Renderer(actionParams.MapData)?.InstantUpdateUnit(true);
return true;
}
public override bool CheckCan(CommonActionParams actionParam)
{
//step #1 check基本信息
if (!UnitActionCheckBaseInfo(actionParam)) return false;
//#step #2 check unit属于player
if (!UnitActionCheckUnitBelongPlayer(actionParam)) return false;
//step #3 check是否有CP释放技能
if (!UnitActionCheckUnitHasCP(actionParam)) return false;
//step #4 check unit是否拥有skill技能
if (!UnitActionCheckUnitHasSkill(actionParam)) return false;
return true;
}
public override bool CheckShow(CommonActionParams actionParam,out ShowType showType)
{
showType = ShowType.None;
return CheckCan(actionParam);
}
}
public class UnitActionAbsorbRedMist : UnitActionAction
{
public UnitActionAbsorbRedMist(CommonActionId id) : base(id)
{
}
protected override bool Execute(CommonActionParams actionParams)
{
//Step #1 鲁棒性判断
var unit = actionParams.UnitData;
if (unit == null || !unit.Grid(actionParams.MapData,out var grid)) return false;
//Step #2 清除红雾
grid.RemoveSpType(GridSpType.RemiliaGrid,actionParams.MapData);
if (grid.InMainSight())
{
grid.Renderer(actionParams.MapData)?.PlayVFXInSight(new GridVFXParams(GridVFXType.Fog));
grid.Renderer(actionParams.MapData)?.PlayVFXInSight(new GridVFXParams(GridVFXType.Heal));
grid.Renderer(actionParams.MapData)?.InstantUpdateGrid();
unit.Renderer(actionParams.MapData)?.InstantUpdateUnit(false);
}
//Step #3 恢复血量
Main.UnitLogic.RecoverHealth(actionParams.MapData,actionParams.UnitData,actionParams.UnitData,4);
return true;
}
public override bool CheckCan(CommonActionParams actionParams)
{
//step #1 check基本信息
if (!UnitActionCheckBaseInfo(actionParams)) return false;
//#step #2 check unit属于player 且player是斯卡雷特阵营
if (!UnitActionCheckUnitBelongPlayer(actionParams)) return false;
if(actionParams.PlayerData.PlayerCivId != 0) return false;
//#step #3 check CP 不需要任何CP
//if (actionParams.UnitData.CP <= 0) return false;
//#step #4 check 当前grid是否是remiliaGrid
if (!actionParams.UnitData.Grid(actionParams.MapData, out var grid) ||
!grid.HasSpType(GridSpType.RemiliaGrid)) return false;
return true;
}
public override bool CheckShow(CommonActionParams actionParams,out ShowType showType)
{
showType = ShowType.None;
return CheckCan(actionParams);
}
}
public class UnitActionRemiliaAbsorb : UnitActionAction
{
public UnitActionRemiliaAbsorb(CommonActionId id) : base(id)
{
}
protected override bool Execute(CommonActionParams actionParams)
{
//Step #1 鲁棒性判断
var unit = actionParams.UnitData;
if (unit == null || !unit.Grid(actionParams.MapData,out var grid)) return false;
//Step #2 清除红雾
int count = 0;
var gridSet = actionParams.MapData.GridMap.GetAroundGridDataSet_NOCENTER(1, 1, grid);
gridSet.Add(grid);
foreach (var tgrid in gridSet)
{
if (!tgrid.HasSpType(GridSpType.RemiliaGrid)) continue;
count++;
tgrid.RemoveSpType(GridSpType.RemiliaGrid,actionParams.MapData);
if (tgrid.InMainSight())
{
tgrid.Renderer(actionParams.MapData)?.PlayVFXInSight(new GridVFXParams(GridVFXType.Fog));
tgrid.Renderer(actionParams.MapData)?.InstantUpdateGrid();
if(tgrid.RealUnit(actionParams.MapData,out var gridUnit))
gridUnit.Renderer(actionParams.MapData)?.InstantUpdateUnit(false);
}
}
//Step #3 赋予buff
unit.AddSkill_Legacy(SkillType.REMILIABUFF3, actionParams.MapData,false,0,true,count,true,SpecialAddSkillType.AddLevel,unit.Id);
//if (unit.GetSkill(SkillType.REMILIABUFF3, out var skill))
//skill.AddLevel(actionParams.MapData, unit, unit, count);
return true;
}
public override bool CheckCan(CommonActionParams actionParams)
{
//step #1 check基本信息
if (!UnitActionCheckBaseInfo(actionParams)) return false;
//#step #2 check unit属于player 且player是斯卡雷特阵营
if (!UnitActionCheckUnitBelongPlayer(actionParams)) return false;
if(actionParams.PlayerData.PlayerCivId != 0) return false;
//#step #3 check CP 当前单位拥有该技能
if (!actionParams.UnitData.GetSkill(SkillType.REMILIAABSORB, out var _)) return false;
//#step #4 check 当前grid是否是remiliaGrid
if (!actionParams.UnitData.Grid(actionParams.MapData, out var grid))return false;
var gridSet = actionParams.MapData.GridMap.GetAroundGridDataSet_NOCENTER(1, 1, grid);
gridSet.Add(grid);
bool hasRemiliaGrid = false;
foreach (var tgrid in gridSet)
if (tgrid.HasSpType(GridSpType.RemiliaGrid))
{
hasRemiliaGrid = true;
break;
}
if (!hasRemiliaGrid) return false;
return true;
}
public override bool CheckShow(CommonActionParams actionParams,out ShowType showType)
{
showType = ShowType.None;
return CheckCan(actionParams);
}
}
public class UnitActionKanakoSit : UnitActionAction
{
public UnitActionKanakoSit(CommonActionId id) : base(id)
{
}
protected override bool Execute(CommonActionParams actionParams)
{
//Step #1 鲁棒性判断
var unit = actionParams.UnitData;
if (unit == null || !unit.Grid(actionParams.MapData,out var grid)) return false;
//Step #2 赋予buff
unit.AddSkill_Legacy(SkillType.KANAKOSITTING, actionParams.MapData,true,-1,false,-1,false,SpecialAddSkillType.Force,0);
//Step #3 消耗CP(不需要消耗)
//unit.ClearAPMPCP();
//Step #4 刷新视觉
if (unit.InMainSight())
{
unit.Renderer(actionParams.MapData).InstantUpdateUnit(showoff: true);
grid.Renderer(actionParams.MapData).PlayVFXInSight(new GridVFXParams(GridVFXType.Fog));
}
return true;
}
public override bool CheckCan(CommonActionParams actionParams)
{
//step #1 check基本信息
if (!UnitActionCheckBaseInfo(actionParams)) return false;
//#step #2 check unit属于player
if (!UnitActionCheckUnitBelongPlayer(actionParams)) return false;
//#step #3 check 当前单位拥有该技能且不处在sit状态
if (!actionParams.UnitData.GetSkill(SkillType.KANAKOBATTLEFIELD, out var _)) return false;
if (actionParams.UnitData.GetSkill(SkillType.KANAKOSITTING, out var _)) return false;
//#step #4 CP
if(actionParams.UnitData.CP <= 0) return false;
return true;
}
public override bool CheckShow(CommonActionParams actionParams,out ShowType showType)
{
showType = ShowType.None;
return CheckCan(actionParams);
}
}
public class UnitActionKanakoUnSit : UnitActionAction
{
public UnitActionKanakoUnSit(CommonActionId id) : base(id)
{
}
protected override bool Execute(CommonActionParams actionParams)
{
//Step #1 鲁棒性判断
var unit = actionParams.UnitData;
if (unit == null || !unit.Grid(actionParams.MapData,out var grid)) return false;
//Step #2 去除buff
unit.RemoveSkill(SkillType.KANAKOSITTING, actionParams.MapData);
//Step #3 消耗CP
//unit.ClearAPMPCP();
//Step #4 刷新视觉
if (unit.InMainSight())
{
unit.Renderer(actionParams.MapData).InstantUpdateUnit(showoff: true);
grid.Renderer(actionParams.MapData).PlayVFXInSight(new GridVFXParams(GridVFXType.Fog));
}
return true;
}
public override bool CheckCan(CommonActionParams actionParams)
{
//step #1 check基本信息
if (!UnitActionCheckBaseInfo(actionParams)) return false;
//#step #2 check unit属于player
if (!UnitActionCheckUnitBelongPlayer(actionParams)) return false;
//#step #3 check 当前单位正在Sit
if (!actionParams.UnitData.GetSkill(SkillType.KANAKOSITTING, out var _)) return false;
return true;
}
public override bool CheckShow(CommonActionParams actionParams,out ShowType showType)
{
showType = ShowType.None;
return CheckCan(actionParams);
}
}
public class UnitActionAyaMoveAgain : UnitActionAction
{
public UnitActionAyaMoveAgain(CommonActionId id) : base(id)
{
}
protected override bool Execute(CommonActionParams actionParams)
{
//Step #1 鲁棒性判断
var unit = actionParams.UnitData;
if (unit == null || !unit.Grid(actionParams.MapData,out var grid)) return false;
//Step #2 去除buff
unit.GetSkill(SkillType.AYAMOVEAGAIN, out var skill);
if (skill.Level <= 0) return false;
skill.ReduceLevel(actionParams.MapData, actionParams.UnitData, 1);
unit.MP = 1;
//Step #4 刷新视觉
if (unit.InMainSight())
{
unit.Renderer(actionParams.MapData).InstantUpdateUnit(showoff: true);
}
return true;
}
public override bool CheckCan(CommonActionParams actionParams)
{
//step #1 check基本信息
if (!UnitActionCheckBaseInfo(actionParams)) return false;
//#step #2 check unit属于player
if (!UnitActionCheckUnitBelongPlayer(actionParams)) return false;
//#step #3 check 当前单位正在Sit
if (!actionParams.UnitData.GetSkill(SkillType.AYAMOVEAGAIN, out var skill) || skill.Level <= 0) return false;
return true;
}
public override bool CheckShow(CommonActionParams actionParams,out ShowType showType)
{
showType = ShowType.None;
return CheckCan(actionParams);
}
}
}