1415 lines
59 KiB
C#
1415 lines
59 KiB
C#
/*
|
||
* @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);
|
||
}
|
||
|
||
|
||
}
|
||
|
||
} |