2025-06-26 20:11:17 +08:00

2831 lines
127 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 Logic.AI;
using RuntimeData;
using UnityEngine;
using TH1Renderer;
public enum GridMiscActionType{None,GrowForest,ClearForest,BurnForest,Destroy}
namespace Logic.Action
{
// 行为类型枚举
public enum CommonActionType
{
Gain,
Build,
StartWonder,
BuildWonder,
TrainUnit,
GridMisc,
UnitAction,
CityLevelUpAction,
UnitSkill,
LearnTech,
UnitMove,
UnitAttack,
}
// 通用行为参数类
public class CommonActionParams
{
public MapData MapData { get; set; }
public PlayerData PlayerData { get; set; }
public UnitData UnitData { get; set; }
public CityData CityData { get; set; }
public GridData GridData { get; set; }
public UnitData TargetUnitData { get; set; }
public GridData TargetGridData { get; set; }
public MainObjectType MainObjectType { get; set; }
public uint PlayerId;
public uint UnitId;
public uint CityId;
public uint GridId;
public uint TargetUnitId;
public uint TargetGridId;
public CommonActionParams(MapData mapData=null, PlayerData playerData=null,
UnitData unitData=null, CityData cityData=null, GridData gridData=null, UnitData targetUnit=null, GridData targetGrid=null, MainObjectType mainObjectType=MainObjectType.None)
{
MapData = mapData;
PlayerData = playerData;
UnitData = unitData;
CityData = cityData;
GridData = gridData;
TargetUnitData = targetUnit;
TargetGridData = targetGrid;
MainObjectType = mainObjectType;
PlayerId = 0;
UnitId = 0;
CityId = 0;
GridId = 0;
TargetUnitId = 0;
TargetGridId = 0;
if (PlayerData != null) PlayerId = PlayerData.Id;
if (UnitData != null) UnitId = UnitData.Id;
if (CityData != null) CityId = CityData.Id;
if (GridData != null) GridId = GridData.Id;
if (TargetUnitData != null) TargetUnitId = TargetUnitData.Id;
if (TargetGridData != null) TargetGridId = TargetGridData.Id;
}
public void RefreshParams()
{
if (PlayerId != 0 && MapData.PlayerMap.GetPlayerDataByPlayerID(PlayerId, out var player))
{
PlayerData = player;
}
if (UnitId != 0 && MapData.UnitMap.GetUnitDataByUnitId(UnitId, out var unit))
{
UnitData = unit;
}
if (CityId != 0 && MapData.CityMap.GetCityById(CityId, out var city))
{
CityData = city;
}
if (GridId != 0 && MapData.GridMap.GetGridDataByGid(GridId, out var grid))
{
GridData = grid;
}
if (TargetUnitId != 0 && MapData.UnitMap.GetUnitDataByUnitId(TargetUnitId, out var target))
{
TargetUnitData = target;
}
if (TargetGridId != 0 && MapData.GridMap.GetGridDataByGid(TargetGridId, out var targetGrid))
{
TargetGridData = targetGrid;
}
}
public void OnParamChanged()
{
if (PlayerData != null) PlayerId = PlayerData.Id;
if (UnitData != null) UnitId = UnitData.Id;
if (CityData != null) CityId = CityData.Id;
if (GridData != null) GridId = GridData.Id;
if (TargetUnitData != null) TargetUnitId = TargetUnitData.Id;
if (TargetGridData != null) TargetGridId = TargetGridData.Id;
}
public CommonActionParams GetCopyParam()
{
var param = new CommonActionParams();
param.MapData = MapData;
param.PlayerData = PlayerData;
param.UnitData = UnitData;
param.CityData = CityData;
param.GridData = GridData;
param.TargetUnitData = TargetUnitData;
param.TargetGridData = TargetGridData;
param.MainObjectType = MainObjectType;
param.PlayerId = PlayerId;
param.UnitId = UnitId;
param.CityId = CityId;
param.GridId = GridId;
param.TargetUnitId = TargetUnitId;
param.TargetGridId = TargetGridId;
return param;
}
}
// 通用行为ID类
[Serializable]
public class CommonActionId
{
public CommonActionType ActionType;
public WonderTypeEnum WonderType;
public ResourceType ResourceType;
public TerrainFeature FeatureType;
public TerrainType TerrainType;
public UnitType UnitType;
public GiantType GiantType;
public Vegetation Vegetation;
public UnitActionType UnitActionType;
public CityLevelUpActionType CityLevelUpActionType;
public GridMiscActionType GridMiscActionType;
public SkillType SkillType;
public TechType TechType;
//自动生成唯一Id Hash
public uint Id => ComputeId();
private uint ComputeId()
{
unchecked // 溢出安全
{
int hash = 17;
hash = hash * 31 + ActionType.GetHashCode();
hash = hash * 31 + WonderType.GetHashCode();
hash = hash * 31 + ResourceType.GetHashCode();
hash = hash * 31 + FeatureType.GetHashCode();
hash = hash * 31 + TerrainType.GetHashCode();
hash = hash * 31 + UnitType.GetHashCode();
hash = hash * 31 + GiantType.GetHashCode();
hash = hash * 31 + Vegetation.GetHashCode();
hash = hash * 31 + UnitActionType.GetHashCode();
hash = hash * 31 + CityLevelUpActionType.GetHashCode();
hash = hash * 31 + GridMiscActionType.GetHashCode();
hash = hash * 31 + SkillType.GetHashCode();
hash = hash * 31 + TechType.GetHashCode();
return (uint)hash;
}
}
// 重载 == 运算符 当属性被修改时需要修改运算符重载方法
public static bool operator ==(CommonActionId a, CommonActionId b)
{
if (a is null) return b is null;
if (b is null) return false;
if (a.ActionType != b.ActionType) return false;
if (a.WonderType != b.WonderType) return false;
if (a.ResourceType != b.ResourceType) return false;
if (a.TerrainType != b.TerrainType) return false;
if (a.FeatureType != b.FeatureType) return false;
if (a.UnitType != b.UnitType) return false;
if (a.GiantType != b.GiantType) return false;
if (a.Vegetation != b.Vegetation) return false;
if (a.UnitActionType != b.UnitActionType) return false;
if (a.CityLevelUpActionType != b.CityLevelUpActionType) return false;
if (a.GridMiscActionType != b.GridMiscActionType) return false;
if (a.SkillType != b.SkillType) return false;
if (a.TechType != b.TechType) return false;
return true;
}
// 必须同时重载 != 运算符
public static bool operator !=(CommonActionId a, CommonActionId b)
{
return !(a == b);
}
public uint GetHashCode()
{
return 0;
}
}
// 行为逻辑工厂类
public static class ActionLogicFactory
{
private static Dictionary<CommonActionId, ActionLogicBase> ActionLogicDict;
private static Dictionary<uint, ActionLogicBase> _actionLogicIdDict;
public static Dictionary<CommonActionId, ActionLogicBase> GetActionLogicDict()
{
Refresh();
return ActionLogicDict;
}
public static Dictionary<uint, ActionLogicBase> GetActionLogicIDDict()
{
Refresh();
return _actionLogicIdDict;
}
public static void Refresh()
{
if (ActionLogicDict != null)
return;
ActionLogicDict = new Dictionary<CommonActionId, ActionLogicBase>();
CommonActionId commonActionId;
commonActionId = new CommonActionId { ActionType = CommonActionType.UnitMove };
ActionLogicDict[commonActionId] = new UnitMoveAction(commonActionId);
commonActionId = new CommonActionId { ActionType = CommonActionType.UnitAttack };
ActionLogicDict[commonActionId] = new UnitAttackAction(commonActionId);
foreach (ResourceType resourceType in System.Enum.GetValues(typeof(ResourceType)))
{
if (resourceType == ResourceType.None) continue;
// 登记Gain 收获一次性资源的行为逻辑
if (resourceType == ResourceType.Animal || resourceType == ResourceType.Fish ||
resourceType == ResourceType.Fruit)
{
commonActionId = new CommonActionId
{
ActionType = CommonActionType.Gain,
ResourceType = resourceType,
};
ActionLogicDict[commonActionId] = new GainResourceAction(commonActionId);
}
// 登记Build 建设建筑的行为逻辑
else if (resourceType == ResourceType.Sawmill || resourceType == ResourceType.Windmill
|| resourceType == ResourceType.Mine || resourceType == ResourceType.Farm
|| resourceType == ResourceType.Forge || resourceType == ResourceType.LumberHut
|| resourceType == ResourceType.Port || resourceType == ResourceType.Bridge
|| resourceType == ResourceType.Market || resourceType == ResourceType.ForestTemple
|| resourceType == ResourceType.WaterTemple || resourceType == ResourceType.Temple
|| resourceType == ResourceType.MountainTemple
)
{
commonActionId = new CommonActionId
{
ActionType = CommonActionType.Build,
ResourceType = resourceType,
};
ActionLogicDict[commonActionId] = new BuildAction(commonActionId);
}
}
//登记build road这种特殊情况
commonActionId = new CommonActionId
{
ActionType = CommonActionType.Build,
FeatureType = TerrainFeature.Road
};
ActionLogicDict[commonActionId] = new BuildAction(commonActionId);
//GridMisc grid的杂类行为逻辑
foreach (GridMiscActionType gridMiscActionType in System.Enum.GetValues(typeof(GridMiscActionType)))
{
if (gridMiscActionType == GridMiscActionType.None) continue;
commonActionId = new CommonActionId
{
ActionType = CommonActionType.GridMisc,
GridMiscActionType = gridMiscActionType
};
ActionLogicDict[commonActionId] = new GridMiscAction(commonActionId);
}
//登记BuildWonder建造奇观的行为逻辑
foreach (WonderTypeEnum wonderType in System.Enum.GetValues(typeof(WonderTypeEnum)))
{
if(wonderType == WonderTypeEnum.None) continue;
//登记建造奇观的action
commonActionId = new CommonActionId
{
ActionType = CommonActionType.BuildWonder,
WonderType = wonderType,
};
ActionLogicDict[commonActionId] = new BuildWonderAction(commonActionId);
//登记建造开启奇观任务的action
commonActionId = new CommonActionId
{
ActionType = CommonActionType.StartWonder,
WonderType = wonderType,
};
ActionLogicDict[commonActionId] = new StartWonderAction(commonActionId);
}
// TrainUnit 建造unit的行为逻辑
foreach (UnitType unitType in System.Enum.GetValues(typeof(UnitType)))
{
if(unitType == UnitType.None) continue;
if (unitType == UnitType.Giant)
{
foreach (GiantType giantType in System.Enum.GetValues(typeof(GiantType)))
{
if(giantType == GiantType.None) continue;
commonActionId = new CommonActionId
{
ActionType = CommonActionType.TrainUnit,
UnitType = unitType,
GiantType = giantType
};
ActionLogicDict[commonActionId] = new TrainUnitAction(commonActionId);
}
continue;
}
commonActionId = new CommonActionId
{
ActionType = CommonActionType.TrainUnit,
UnitType = unitType,
};
ActionLogicDict[commonActionId] = new TrainUnitAction(commonActionId);
}
//cityLevelUp的各个行为逻辑
foreach (CityLevelUpActionType cityLevelUpActionType in System.Enum.GetValues(typeof(CityLevelUpActionType)))
{
if(cityLevelUpActionType == CityLevelUpActionType.None) continue;
commonActionId = new CommonActionId
{
ActionType = CommonActionType.CityLevelUpAction,
CityLevelUpActionType = cityLevelUpActionType
};
ActionLogicDict[commonActionId] = new CityLevelUpActionAction(commonActionId);
}
//unit自身行为的各个行为逻辑
foreach (UnitActionType unitActionType in System.Enum.GetValues(typeof(UnitActionType)))
{
if(unitActionType == UnitActionType.None) continue;
commonActionId = new CommonActionId
{
ActionType = CommonActionType.UnitAction,
UnitActionType = unitActionType
};
ActionLogicDict[commonActionId] = new UnitActionAction(commonActionId);
}
foreach (UnitType unitType in System.Enum.GetValues(typeof(UnitType)))
if(Table.Instance.UnitTypeDataAssets.GetUnitTypeInfo(unitType,GiantType.None,out var info)
&& info.LandType == LandType.WaterAndAshore)
{
if(unitType == UnitType.None)
Debug.Log("DIEEEE");
if (unitType == UnitType.Boat) continue;
commonActionId = new CommonActionId
{
ActionType = CommonActionType.UnitAction,
UnitType = unitType
};
ActionLogicDict[commonActionId] = new UnitActionAction(commonActionId);
}
//登记所有学习科技的action
foreach (TechType techType in System.Enum.GetValues(typeof(TechType)))
{
commonActionId = new CommonActionId
{
ActionType = CommonActionType.LearnTech,
TechType = techType
};
ActionLogicDict[commonActionId] = new LearnTechAction(commonActionId);
}
//登记6种unitskill类的科技该科技会让该玩家当前的和未来的所有unit都拥有某个skill
foreach (SkillType skillType in System.Enum.GetValues(typeof(SkillType)))
{
if (skillType == SkillType.MOUNTAINMOVE || skillType == SkillType.MOUNTAINDEFENSE ||
skillType == SkillType.WATERMOVE || skillType == SkillType.WATERDEFENSE ||
skillType == SkillType.OCEANMOVE || skillType == SkillType.OCEANDEFENSE ||
skillType == SkillType.FORESTDEFENSE)
{
commonActionId = new CommonActionId
{
ActionType = CommonActionType.UnitSkill,
SkillType = skillType
};
ActionLogicDict[commonActionId] = new UnitSkillAction(commonActionId);
}
}
if (_actionLogicIdDict == null)
{
_actionLogicIdDict = new Dictionary<uint, ActionLogicBase>();
foreach (var kv in ActionLogicDict)
{
_actionLogicIdDict[kv.Key.Id] = kv.Value;
}
}
}
public static ActionLogicBase GetActionLogic(CommonActionId actionId)
{
foreach (var kv in ActionLogicDict)
{
if (kv.Key != actionId) continue;
return kv.Value;
}
return null;
}
// 返回一个玩家有什么 Action
public static bool PlayerHasAction(CommonActionParams param, out List<ActionLogicBase> actionList)
{
param.MainObjectType = MainObjectType.Player;
actionList = new List<ActionLogicBase>();
var actionDict = GetActionLogicDict();
foreach (var action in actionDict.Values)
{
if(action.CheckCan(param))
actionList.Add(action);
}
return actionList.Count > 0;
}
//返回一个 grid 对于 player data 而言有什么 action
public static bool GridHasAction(CommonActionParams param, out List<ActionLogicBase> actionList)
{
param.MainObjectType = MainObjectType.Grid;
actionList = new List<ActionLogicBase>();
var actionDict = GetActionLogicDict();
foreach (var action in actionDict.Values)
{
if (!action.CheckCan(param)) continue;
actionList.Add(action);
}
return actionList.Count > 0;
}
//返回一个 grid 对于 player data 而言有什么 action
public static bool GridHasAction(CommonActionParams param, List<ActionLogicBase> actionList)
{
param.MainObjectType = MainObjectType.Grid;
var actionDict = GetActionLogicDict();
bool hasAction = false;
foreach (var action in actionDict.Values)
{
if (!action.CheckCan(param)) continue;
actionList.Add(action);
hasAction = true;
}
return hasAction;
}
public static bool CityHasAction(CommonActionParams param, out List<ActionLogicBase> actionList)
{
param.MainObjectType = MainObjectType.City;
actionList = new List<ActionLogicBase>();
var actionDict = GetActionLogicDict();
foreach (var action in actionDict.Values)
{
if(action.CheckCan(param))
actionList.Add(action);
}
return actionList.Count > 0;
}
//返回一个 unit 对于 player data 而言有什么 action
public static bool UnitHasAction(CommonActionParams param, out List<ActionLogicBase> actionList)
{
param.MainObjectType = MainObjectType.Unit;
actionList = new List<ActionLogicBase>();
if (param.UnitData.CP <= 0) return false;
var actionDict = GetActionLogicDict();
foreach (var action in actionDict.Values)
{
if (!action.CheckCan(param)) continue;
actionList.Add(action);
}
return actionList.Count > 0;
}
// 返回一个 unit 的移动和攻击行为
public static bool UnitHasMoveAndAttackAction(MapData map, UnitData unit, out List<AIActionBase> actionList)
{
if (!unit.Alive)
{
actionList = null;
return false;
}
var attackID = new CommonActionId { ActionType = CommonActionType.UnitAttack };
var moveId = new CommonActionId { ActionType = CommonActionType.UnitMove };
var attackAction = new UnitAttackAction(attackID);
var moveAction = new UnitMoveAction(moveId);
actionList = new List<AIActionBase>();
Main.UnitLogic.CalcUnitMoveInfo(map, unit.Id);
foreach (var grid in map.GridMap.GridList)
{
var result = Main.UnitLogic.CheckUnitCanMoveOrAttack(map, unit, grid);
if (result == MoveAttackType.None) continue;
if (result == MoveAttackType.Attack)
{
if (unit.AP <= 0 || !map.GetUnitDataByGid(grid.Id, out var targetUnit)) continue;
var param = new CommonActionParams(map, unitData:unit, targetUnit:targetUnit);
param.RefreshParams();
actionList.Add(new AIActionBase(param, attackAction));
if (map.GetGridDataByUnitId(unit.Id, out var unitGrid))
{
//Debug.Log($"生成Action 小兵攻击 {unit.Id}, 攻击范围{unit.GetAttackRange()}" +$"位置{unitGrid.Pos.X}, {unitGrid.Pos.Y}, " + $"目标 {targetUnit.Id}, " + $"目标位置{grid.Pos.X}, {grid.Pos.Y}");
}
continue;
}
if (unit.MP > 0)
{
var param = new CommonActionParams(map, unitData:unit, gridData:grid);
param.RefreshParams();
actionList.Add(new AIActionBase(param, moveAction));
}
}
return actionList.Count > 0;
}
//返回一个主题能够显示的action注意并非能“做”的action有些行为没钱或者没科技他也可以显示
public static bool MainObjectCanShowAction(CommonActionParams param, out List<ActionLogicBase> actionList)
{
actionList = new List<ActionLogicBase>();
var actionDict = GetActionLogicDict();
foreach (var action in actionDict.Values)
{
if (!action.CheckShow(param)) continue;
actionList.Add(action);
}
return actionList.Count > 0;
}
public static List<ActionLogicBase> GetActionLogicByType(CommonActionType type)
{
var actionList = new List<ActionLogicBase>();
foreach (var action in GetActionLogicDict().Values)
{
if (action.ActionId.ActionType != type) continue;
actionList.Add(action);
}
return actionList;
}
public static MainObjectType GetMainObjectType(CommonActionType actionType)
{
if (actionType == CommonActionType.Gain) return MainObjectType.Grid;
if (actionType == CommonActionType.Build) return MainObjectType.Grid;
if (actionType == CommonActionType.StartWonder) return MainObjectType.Player;
if (actionType == CommonActionType.BuildWonder) return MainObjectType.Grid;
if (actionType == CommonActionType.TrainUnit) return MainObjectType.City;
if (actionType == CommonActionType.GridMisc) return MainObjectType.Grid;
if (actionType == CommonActionType.UnitAction) return MainObjectType.Unit;
if (actionType == CommonActionType.CityLevelUpAction) return MainObjectType.City;
if (actionType == CommonActionType.UnitSkill) return MainObjectType.Unit;
if (actionType == CommonActionType.LearnTech) return MainObjectType.Player;
if (actionType == CommonActionType.UnitMove) return MainObjectType.Unit;
if (actionType == CommonActionType.UnitAttack) return MainObjectType.Unit;
return MainObjectType.Player;
}
}
// 行为基类
public abstract class ActionLogicBase
{
protected CommonActionId _actionId;
public CommonActionId ActionId => _actionId;
public ActionLogicBase(CommonActionId id)
{
_actionId = id;
}
public bool CheckEqualActionId(CommonActionId actionId)
{
return _actionId == actionId;
}
public int GetCost()
{
return Table.Instance.ActionDataAssets.GetActionInfo(_actionId,out var info)?
info.Cost: 0;
}
public virtual float GetAnimTime(CommonActionParams actionParams)
{
//TODO 这里通用返回值要读表,暂时先直接返回0.1f
return 0.05f;
}
public virtual bool CameraControl(CommonActionParams actionParams)
{
return false;
}
public float GetValue()
{
return 1f;
}
public abstract bool Execute(CommonActionParams actionParams);
public abstract bool CheckCan(CommonActionParams actionParams);
public abstract bool CheckShow(CommonActionParams actionParams);
public void TH1Debug()
{
Debug.Log($"{_actionId.ActionType} : {_actionId.ResourceType}/{_actionId.UnitType}/{_actionId.WonderType}");
}
}
// 建造奇观逻辑类 #buildwonder
public class BuildWonderAction : ActionLogicBase
{
public BuildWonderAction(CommonActionId id) : base(id)
{
}
public override bool Execute(CommonActionParams actionParams)
{
if(!actionParams.MapData.GetCityDataByTerritoryGid(actionParams.GridData.Id,out var city))
return false;
//给city增加3点exp
if (!Table.Instance.GridAndResourceDataAssets.GetWonderInfoByType(_actionId.WonderType,actionParams.PlayerData, out var wonderInfo))
return false;
if (actionParams.PlayerData == null)
return false;
var player = actionParams.PlayerData;
//临时做法用来播放VFX,获取Main理应向MapData写入一个VFX的RenderMark的
var main = GameObject.Find("Main").GetComponent<Main>();
if (actionParams.MapData == main.MapData && actionParams.PlayerData.Id == actionParams.MapData.PlayerMap.SelfPlayerData.Id)
{
var v1 = Table.Instance.GridToWorld(actionParams.GridData);
actionParams.MapData.GetGridDataByCityId(city.Id, out var g2);
var v2 = Table.Instance.GridToWorld(g2);
Timer.Instance.TimerRegister(Main.CityLogic, () =>
{
int score = wonderInfo.Exp * 5;
main.MapRenderer.ROGridMap[g2.Id].SetBounceAnim();
score += 50 * Main.CityLogic.CityUpdateExp(actionParams.MapData,city,wonderInfo.Exp);
if (actionParams.PlayerData.Id == actionParams.MapData.PlayerMap.SelfPlayerData.Id)
{
var faithPanel = GameObject.Find("UICanvas/TopBarPanel/FaithPanel/Icon").transform;
var endPos = Camera.main.ScreenToWorldPoint(faithPanel.position);
main.MapRenderer.ProjectileManager.CreateProjectile(main,actionParams.MapData,v2,endPos,ProjectileType.Faith,ProjectileMoveType.CoinParabola,score);
}
},
Table.Instance.AnimDataAssets.ProjectileCityExpMoveTime);
//播放雾效和丢出cityexp & 丢出信仰分 的动画
actionParams.GridData.VFXRenderMarkFog = true;
main.MapRenderer.ProjectileManager.CreateProjectileMulti(main,actionParams.MapData,v1,v2,ProjectileType.CityExp,ProjectileMoveType.CityExpHighParabola,wonderInfo.Exp);
if (actionParams.PlayerData.Id == actionParams.MapData.PlayerMap.SelfPlayerData.Id)
{
var faithPanel = GameObject.Find("UICanvas/TopBarPanel/FaithPanel/Icon").transform;
var endPos = Camera.main.ScreenToWorldPoint(faithPanel.position);
main.MapRenderer.ProjectileManager.CreateProjectile(main, actionParams.MapData, v1, endPos,
ProjectileType.Faith, ProjectileMoveType.CoinParabola, 300);
}
}
else
Main.CityLogic.CityUpdateExp(actionParams.MapData,city,wonderInfo.Exp);
actionParams.GridData.ResourceUnderBuilding = actionParams.GridData.Resource;
actionParams.GridData.Resource = ResourceType.Wonder;
actionParams.GridData.Wonder = wonderInfo.Wonder;
player.Wonder.SetWonderState(wonderInfo.WonderType,WonderState.FINISH_BUILD);
actionParams.GridData.RenderMark = true;
return true;
}
public override bool CheckCan(CommonActionParams actionParam)
{
if (actionParam.PlayerData == null)
return false;
if (actionParam.GridData == null)
return false;
var player = actionParam.PlayerData;
var grid = actionParam.GridData;
if (!actionParam.MapData.GetPlayerDataByTerritoryGridId(grid.Id, out var gridPlayer))
return false;
if (player != gridPlayer)
return false;
if (player.Wonder.GetWonderState(_actionId.WonderType) != WonderState.FINISH_NOT_BUILD)
return false;
if (grid.Feature == TerrainFeature.Mountain
|| grid.Terrain == TerrainType.DeepSea
|| grid.Vegetation == Vegetation.Trees)
return false;
if (grid.Resource == ResourceType.None
|| grid.Resource == ResourceType.Fish
|| grid.Resource == ResourceType.Starfish
|| grid.Resource == ResourceType.Crop
|| grid.Resource == ResourceType.Fruit
)
return true;
if (GetCost() > actionParam.PlayerData.PlayerWealth)
return false;
return false;
}
public override bool CheckShow(CommonActionParams actionParam)
{
return CheckCan(actionParam);
}
}
// Gain 收获资源逻辑类
public class GainResourceAction : ActionLogicBase
{
public GainResourceAction(CommonActionId id) : base(id)
{
}
public override bool Execute(CommonActionParams actionParams)
{
CityData cityData = actionParams.CityData;
if (cityData == null)
actionParams.MapData.GetCityDataByTerritoryGid(actionParams.GridData.Id,out cityData);
//扣钱,收获资产,把资产送往city
actionParams.PlayerData.PlayerWealth -= GetCost();
//如果是玩家,执行一整套播放动画的逻辑
//临时做法用来播放VFX,获取Main理应向MapData写入一个VFX的RenderMark的
var main = GameObject.Find("Main").GetComponent<Main>();
if (main.MapData == actionParams.MapData && actionParams.PlayerData.Id == actionParams.MapData.PlayerMap.SelfPlayerData.Id)
{
var v1 = Table.Instance.GridToWorld(actionParams.GridData);
actionParams.MapData.GetGridDataByCityId(cityData.Id, out var g2);
var v2 = Table.Instance.GridToWorld(g2);
//播放城市增加exp的动画
Timer.Instance.TimerRegister(Main.CityLogic, () =>
{
int score = Table.Instance.QueryActionExp(_actionId) * 5;
main.MapRenderer.ROGridMap[g2.Id].SetBounceAnim();
score += 50 * Main.CityLogic.CityUpdateExp(actionParams.MapData,cityData,Table.Instance.QueryActionExp(_actionId));
if (actionParams.PlayerData.Id == actionParams.MapData.PlayerMap.SelfPlayerData.Id)
{
var faithPanel = GameObject.Find("UICanvas/TopBarPanel/FaithPanel/Icon").transform;
var endPos = Camera.main.ScreenToWorldPoint(faithPanel.position);
main.MapRenderer.ProjectileManager.CreateProjectile(main,actionParams.MapData,v2,endPos,ProjectileType.Faith,ProjectileMoveType.CoinParabola,score);
}
},
Table.Instance.AnimDataAssets.ProjectileCityExpMoveTime);
//播放雾效和丢出cityexp的动画
actionParams.GridData.VFXRenderMarkFog = true;
main.MapRenderer.ProjectileManager.CreateProjectile(main,actionParams.MapData,v1,v2,ProjectileType.CityExp,ProjectileMoveType.CityExpHighParabola);
}
//否则执行常规
else
{
Main.CityLogic.CityUpdateExp(actionParams.MapData,cityData,Table.Instance.QueryActionExp(_actionId));
}
//消除水果
actionParams.GridData.Resource = ResourceType.None;
actionParams.GridData.RenderMark = true;
return true;
}
public override bool CheckCan(CommonActionParams actionParam)
{
//如果是unit或者city来执行gain操作直接return false
if (actionParam.MainObjectType != MainObjectType.Grid)
return false;
if (actionParam.GridData == null)
return false;
//如果没有对应科技return false
if (!actionParam.PlayerData.TechTree.CheckActionCan(_actionId))
return false;
//如果在有主领土,判断是敌人还是自己
if (actionParam.MapData.GetPlayerDataByTerritoryGridId(actionParam.GridData.Id, out var playerData))
{
//在敌人领土上直接return false
if (playerData != actionParam.PlayerData)
return false;
}
//如果在无主领土return false
else
return false;
//判断钱够不够
if (GetCost() > actionParam.PlayerData.PlayerWealth)
return false;
return _actionId.ResourceType == actionParam.GridData.Resource;
}
public override bool CheckShow(CommonActionParams actionParam)
{
//如果是unit或者city来执行gain操作直接return false
if (actionParam.MainObjectType != MainObjectType.Grid)
return false;
if (actionParam.GridData == null)
return false;
//这里注意,即使没有科技,也会显示,所以不需要检查科技
//如果在有主领土,判断是敌人还是自己
if (actionParam.MapData.GetPlayerDataByTerritoryGridId(actionParam.GridData.Id, out var playerData))
{
//在敌人领土上直接return false
if (playerData != actionParam.PlayerData)
return false;
}
//如果在无主领土return false
else
return false;
return _actionId.ResourceType == actionParam.GridData.Resource;
}
}
// Build 建造逻辑类
public class BuildAction : ActionLogicBase
{
public BuildAction(CommonActionId id) : base(id)
{
}
public override bool Execute(CommonActionParams actionParams)
{
CityData cityData = actionParams.CityData;
//鲁棒性用
if (cityData == null)
actionParams.MapData.GetCityDataByTerritoryGid(actionParams.GridData.Id,out cityData);
//扣钱,收获资产,把资产送往city
actionParams.PlayerData.PlayerWealth -= GetCost();
int cityExp = 0;
//处理farm、mine、lumberhut
if (_actionId.ResourceType == ResourceType.Farm || _actionId.ResourceType == ResourceType.Mine || _actionId.ResourceType == ResourceType.LumberHut)
{
cityExp = Table.Instance.QueryActionExp(_actionId);
actionParams.GridData.ResourceUnderBuilding = actionParams.GridData.Resource;
actionParams.GridData.Resource = _actionId.ResourceType;
actionParams.GridData.RenderMark = true;
//更新周围的milllike建筑
ResourceType needUpdate = ResourceType.Windmill;
if(_actionId.ResourceType == ResourceType.Mine)
needUpdate = ResourceType.Forge;
if(_actionId.ResourceType == ResourceType.LumberHut)
needUpdate = ResourceType.Sawmill;
//更新对应的milllike建筑的buildinglevel
var gridDataList1 = Main.PlayerLogic.GetPlayerResourceNearbyList(actionParams.MapData, actionParams.PlayerData,
actionParams.GridData, needUpdate);
foreach (var gridData1 in gridDataList1)
{
Main.CityLogic.UpdateGridBuildingData(actionParams.MapData,gridData1);
//找到该milllike建筑附近的market更新该market
var gridDataList2 = Main.PlayerLogic.GetPlayerResourceNearbyList(actionParams.MapData, actionParams.PlayerData,
gridData1, ResourceType.Market);
foreach(var gridData2 in gridDataList2)
Main.CityLogic.UpdateGridBuildingData(actionParams.MapData,gridData2);
}
//更新所有market建筑的buildinglevel
}
//处理windmill sawmill forge market
else if (_actionId.ResourceType == ResourceType.Windmill || _actionId.ResourceType == ResourceType.Forge ||
_actionId.ResourceType == ResourceType.Sawmill || _actionId.ResourceType == ResourceType.Market )
{
actionParams.GridData.Resource = _actionId.ResourceType;
actionParams.GridData.RenderMark = true;
Main.CityLogic.CalcGridBuildingLevel(actionParams.MapData,actionParams.GridData, _actionId.ResourceType,out var buildingLevel);
actionParams.GridData.buildingLevel = buildingLevel;
//如果建设的不是market,而是sawmill forge windmill
if (_actionId.ResourceType != ResourceType.Market)
{
//提供城市经验
cityExp = buildingLevel * (_actionId.ResourceType == ResourceType.Forge ? 2 : 1);
//更新附近的market
var gridDataList = Main.PlayerLogic.GetPlayerResourceNearbyList(actionParams.MapData, actionParams.PlayerData,
actionParams.GridData, ResourceType.Market);
foreach(var gridData in gridDataList)
Main.CityLogic.UpdateGridBuildingData(actionParams.MapData,gridData);
}
}
//处理port
else if (_actionId.ResourceType == ResourceType.Port)
{
cityExp = Table.Instance.QueryActionExp(_actionId);
actionParams.GridData.Resource = _actionId.ResourceType;
//港口会自动设置格子的feature为road
actionParams.GridData.Feature = TerrainFeature.Road;
actionParams.GridData.RenderMark = true;
}
//处理bridge或者road
else if (_actionId.ResourceType == ResourceType.Bridge || _actionId.FeatureType == TerrainFeature.Road )
{
actionParams.GridData.Feature = TerrainFeature.Road;
if(_actionId.ResourceType == ResourceType.Bridge)
actionParams.GridData.Resource = ResourceType.Bridge;
Main.PlayerLogic.UpdateCityConnect(actionParams.MapData,actionParams.PlayerData);
var tlist = actionParams.MapData.GridMap.GetAroundGridData(1, 1, actionParams.GridData);
foreach (var tgrid in tlist)
tgrid.RenderMark = true;
actionParams.GridData.RenderMark = true;
}
//处理temple
else if (_actionId.ResourceType == ResourceType.Temple
|| _actionId.ResourceType == ResourceType.ForestTemple
|| _actionId.ResourceType == ResourceType.WaterTemple
|| _actionId.ResourceType == ResourceType.MountainTemple)
{
cityExp = Table.Instance.QueryActionExp(_actionId);
actionParams.GridData.Resource = _actionId.ResourceType;
actionParams.GridData.buildingLevel = 2;
actionParams.GridData.RenderMark = true;
}
//如果是玩家,执行一整套播放动画的逻辑
//临时做法用来播放VFX,获取Main理应向MapData写入一个VFX的RenderMark的
var main = GameObject.Find("Main").GetComponent<Main>();
if (main.MapData == actionParams.MapData && actionParams.PlayerData.Id == actionParams.MapData.PlayerMap.SelfPlayerData.Id)
//目前只有市场这种情况,只播放建筑建设的雾效,其他啥都不播放
if (cityExp == 0)
{
actionParams.GridData.VFXRenderMarkFog = true;
}
else
{
var v1 = Table.Instance.GridToWorld(actionParams.GridData);
actionParams.MapData.GetGridDataByCityId(cityData.Id, out var g2);
var v2 = Table.Instance.GridToWorld(g2);
Timer.Instance.TimerRegister(Main.CityLogic, () =>
{
int score = cityExp * 5;
main.MapRenderer.ROGridMap[g2.Id].SetBounceAnim();
score += 50 * Main.CityLogic.CityUpdateExp(actionParams.MapData,cityData,cityExp);
if (actionParams.PlayerData.Id == actionParams.MapData.PlayerMap.SelfPlayerData.Id)
{
var faithPanel = GameObject.Find("UICanvas/TopBarPanel/FaithPanel/Icon").transform;
var endPos = Camera.main.ScreenToWorldPoint(faithPanel.position);
main.MapRenderer.ProjectileManager.CreateProjectile(main, actionParams.MapData, v2, endPos,
ProjectileType.Faith, ProjectileMoveType.CoinParabola, score);
}
},
Table.Instance.AnimDataAssets.ProjectileCityExpMoveTime);
//播放雾效和丢出cityexp的动画
actionParams.GridData.VFXRenderMarkFog = true;
main.MapRenderer.ProjectileManager.CreateProjectileMulti(main,actionParams.MapData,v1,v2,ProjectileType.CityExp,ProjectileMoveType.CityExpHighParabola,cityExp);
if (actionParams.PlayerData.Id == actionParams.MapData.PlayerMap.SelfPlayerData.Id
&& (_actionId.ResourceType == ResourceType.Temple
|| _actionId.ResourceType == ResourceType.ForestTemple
|| _actionId.ResourceType == ResourceType.WaterTemple
|| _actionId.ResourceType == ResourceType.MountainTemple))
{
var faithPanel = GameObject.Find("UICanvas/TopBarPanel/FaithPanel/Icon").transform;
var endPos = Camera.main.ScreenToWorldPoint(faithPanel.position);
main.MapRenderer.ProjectileManager.CreateProjectile(main, actionParams.MapData, v1, endPos,
ProjectileType.Faith, ProjectileMoveType.CoinParabola, 100);
}
}
else
Main.CityLogic.CityUpdateExp(actionParams.MapData,cityData,cityExp);
return true;
}
public override bool CheckCan(CommonActionParams actionParam)
{
//如果是unit或者city来执行build操作直接return false
if (actionParam.MainObjectType != MainObjectType.Grid)
return false;
if (actionParam.GridData == null)
return false;
//如果没有对应科技return false
if (!actionParam.PlayerData.TechTree.CheckActionCan(_actionId))
return false;
//判断钱够不够
if (GetCost() > actionParam.PlayerData.PlayerWealth)
return false;
//如果在有主领土,判断是敌人还是自己
if (actionParam.MapData.GetPlayerDataByTerritoryGridId(actionParam.GridData.Id, out var playerData))
{
//在敌人领土上直接return false
if (playerData != actionParam.PlayerData)
return false;
}
//如果在无主领土且不是bridge或者road,也要return false
else
if (_actionId.ResourceType != ResourceType.Bridge
&& _actionId.FeatureType != TerrainFeature.Road)
return false;
//处理bridge
if (_actionId.ResourceType == ResourceType.Bridge)
{
//如果不是none或者fish的浅水直接return false
if (actionParam.GridData.Terrain != TerrainType.ShallowSea
|| (actionParam.GridData.Resource != ResourceType.None
&& actionParam.GridData.Resource != ResourceType.Fish))
return false;
//如果不存在桥两侧的陆地以供建桥梁
if (!actionParam.MapData.HasBridgeSideLand(actionParam.GridData,out var isMirror))
return false;
return true;
}
//处理road
if (_actionId.FeatureType == TerrainFeature.Road)
{
//如果是非陆地、村庄
if (actionParam.GridData.Terrain != TerrainType.Land ||
actionParam.GridData.Resource == ResourceType.CityCenter)
return false;
//如果已经有路或者是山体return false
if (actionParam.GridData.Feature != TerrainFeature.None)
return false;
return true;
}
//处理完了road和bridge剩下建筑必须都在自己领土上否则就return false
if (playerData == null)
return false;
//-------- 以下先处理改造资源的建筑
//处理lumberhut
if (_actionId.ResourceType == ResourceType.LumberHut)
{
//只有林子上空着或者有animal 才可能建lumberhut
if(actionParam.GridData.Vegetation == Vegetation.Trees
&& (actionParam.GridData.Resource == ResourceType.Animal
|| actionParam.GridData.Resource == ResourceType.None))
return true;
return false;
}
//处理mine
if (_actionId.ResourceType == ResourceType.Mine)
{
//只要resource是metal就可以建
if(actionParam.GridData.Resource == ResourceType.Metal)
return true;
return false;
}
//处理farm
if (_actionId.ResourceType == ResourceType.Farm)
{
//只要resource是crop就可以建
if(actionParam.GridData.Resource == ResourceType.Crop){
return true;
}
return false;
}
//-------- 再处理直接建设的建筑
//处理temple
if (_actionId.ResourceType == ResourceType.Temple)
{
//必须平地必须是none或者
if (actionParam.GridData.Feature == TerrainFeature.Mountain
|| actionParam.GridData.Vegetation == Vegetation.Trees
|| actionParam.GridData.Terrain != TerrainType.Land
|| (actionParam.GridData.Resource != ResourceType.None
&& actionParam.GridData.Resource != ResourceType.Metal))
return false;
return true;
}
if(_actionId.ResourceType == ResourceType.WaterTemple)
{
//必须在水上必须是none starfish或者fish才能建设watertemple
if (actionParam.GridData.Terrain == TerrainType.Land
|| (actionParam.GridData.Resource != ResourceType.None
&& actionParam.GridData.Resource != ResourceType.Fish
&& actionParam.GridData.Resource != ResourceType.Starfish))
return false;
return true;
}
if (_actionId.ResourceType == ResourceType.ForestTemple)
{
//必须在林中必须是none或者animals
if (actionParam.GridData.Vegetation != Vegetation.Trees
|| (actionParam.GridData.Resource != ResourceType.None
&& actionParam.GridData.Resource != ResourceType.Animal))
return false;
return true;
}
if (_actionId.ResourceType == ResourceType.MountainTemple)
{
//必须在山上必须是none或者metal
if (actionParam.GridData.Feature != TerrainFeature.Mountain
|| (actionParam.GridData.Resource != ResourceType.None
&& actionParam.GridData.Resource != ResourceType.Metal))
return false;
return true;
}
//处理port
if (_actionId.ResourceType == ResourceType.Port)
{
//如果不是none或者fish的浅水直接return false
if (actionParam.GridData.Terrain != TerrainType.ShallowSea
|| (actionParam.GridData.Resource != ResourceType.None
&& actionParam.GridData.Resource != ResourceType.Fish))
return false;
return true;
}
//剩下windmill sawmill forge market四天王先确定平地情况
if (actionParam.GridData.Terrain != TerrainType.Land
|| (actionParam.GridData.Feature == TerrainFeature.Mountain)
|| (actionParam.GridData.Vegetation == Vegetation.Trees)
|| (actionParam.GridData.Resource != ResourceType.None
&& actionParam.GridData.Resource != ResourceType.Crop))
return false;
//再确认周围有没有支持这个特殊建筑的附属建筑
if (!Main.CityLogic
.CalcGridBuildingLevel(actionParam.MapData, actionParam.GridData,
_actionId.ResourceType,out var level1))
return false;
//再确认city是否已经有一个对应的特殊建筑
if(actionParam.MapData.GetCityDataByTerritoryGid(actionParam.GridData.Id,out var cityData)
&& Main.CityLogic.GetBuildingLevelByCity(actionParam.MapData,cityData,_actionId.ResourceType,out var level2))
return false;
return true;
}
public override bool CheckShow(CommonActionParams actionParam)
{
//如果是unit或者city来执行build操作直接return false
if (actionParam.MainObjectType != MainObjectType.Grid)
return false;
if (actionParam.GridData == null)
return false;
//如果没有对应科技return false
if (!actionParam.PlayerData.TechTree.CheckActionCan(_actionId))
return false;
//如果在有主领土,判断是敌人还是自己
if (actionParam.MapData.GetPlayerDataByTerritoryGridId(actionParam.GridData.Id, out var playerData))
{
//在敌人领土上直接return false
if (playerData != actionParam.PlayerData)
return false;
}
//如果在无主领土且不是bridge或者road,也要return false
else
if (_actionId.ResourceType != ResourceType.Bridge
&& _actionId.FeatureType != TerrainFeature.Road)
return false;
//处理bridge
if (_actionId.ResourceType == ResourceType.Bridge)
{
//如果不是none或者fish的浅水直接return false
if (actionParam.GridData.Terrain != TerrainType.ShallowSea
|| (actionParam.GridData.Resource != ResourceType.None
&& actionParam.GridData.Resource != ResourceType.Fish))
return false;
//如果不存在桥两侧的陆地以供建桥梁
if (!actionParam.MapData.HasBridgeSideLand(actionParam.GridData,out var isMirror))
return false;
return true;
}
//处理road
if (_actionId.FeatureType == TerrainFeature.Road)
{
//如果是非陆地、村庄
if (actionParam.GridData.Terrain != TerrainType.Land ||
actionParam.GridData.Resource == ResourceType.CityCenter)
return false;
//如果已经有路或者是山体return false
if (actionParam.GridData.Feature != TerrainFeature.None)
return false;
return true;
}
//处理完了road和bridge剩下建筑必须都在自己领土上否则就return false
if (playerData == null)
return false;
//-------- 以下先处理改造资源的建筑
//处理lumberhut
if (_actionId.ResourceType == ResourceType.LumberHut)
{
//只有林子上空着或者有animal 才可能建lumberhut
if(actionParam.GridData.Vegetation == Vegetation.Trees
&& (actionParam.GridData.Resource == ResourceType.Animal
|| actionParam.GridData.Resource == ResourceType.None))
return true;
return false;
}
//处理mine
if (_actionId.ResourceType == ResourceType.Mine)
{
//只要resource是metal就可以建
if(actionParam.GridData.Resource == ResourceType.Metal)
return true;
return false;
}
//处理farm
if (_actionId.ResourceType == ResourceType.Farm)
{
//只要resource是crop就可以建
if(actionParam.GridData.Resource == ResourceType.Crop){
return true;
}
return false;
}
//-------- 再处理直接建设的建筑
//处理temple
if (_actionId.ResourceType == ResourceType.Temple)
{
//必须平地必须是none或者
if (actionParam.GridData.Feature == TerrainFeature.Mountain
|| actionParam.GridData.Vegetation == Vegetation.Trees
|| actionParam.GridData.Terrain != TerrainType.Land
|| (actionParam.GridData.Resource != ResourceType.None
&& actionParam.GridData.Resource != ResourceType.Metal))
return false;
return true;
}
if(_actionId.ResourceType == ResourceType.WaterTemple)
{
//必须在水上必须是none starfish或者fish才能建设watertemple
if (actionParam.GridData.Terrain == TerrainType.Land
|| (actionParam.GridData.Resource != ResourceType.None
&& actionParam.GridData.Resource != ResourceType.Fish
&& actionParam.GridData.Resource != ResourceType.Starfish))
return false;
return true;
}
if (_actionId.ResourceType == ResourceType.ForestTemple)
{
//必须在林中必须是none或者animals
if (actionParam.GridData.Vegetation != Vegetation.Trees
|| (actionParam.GridData.Resource != ResourceType.None
&& actionParam.GridData.Resource != ResourceType.Animal))
return false;
return true;
}
if (_actionId.ResourceType == ResourceType.MountainTemple)
{
//必须在山上必须是none或者metal
if (actionParam.GridData.Feature != TerrainFeature.Mountain
|| (actionParam.GridData.Resource != ResourceType.None
&& actionParam.GridData.Resource != ResourceType.Metal))
return false;
return true;
}
//处理port
if (_actionId.ResourceType == ResourceType.Port)
{
//如果不是none或者fish的浅水直接return false
if (actionParam.GridData.Terrain != TerrainType.ShallowSea
|| (actionParam.GridData.Resource != ResourceType.None
&& actionParam.GridData.Resource != ResourceType.Fish))
return false;
return true;
}
//剩下windmill sawmill forge market四天王先确定平地情况
if (actionParam.GridData.Terrain != TerrainType.Land
|| (actionParam.GridData.Feature == TerrainFeature.Mountain)
|| (actionParam.GridData.Vegetation == Vegetation.Trees)
|| (actionParam.GridData.Resource != ResourceType.None
&& actionParam.GridData.Resource != ResourceType.Crop))
return false;
//再确认周围有没有支持这个特殊建筑的附属建筑
if (!Main.CityLogic
.CalcGridBuildingLevel(actionParam.MapData, actionParam.GridData,
_actionId.ResourceType,out var level1))
return false;
//再确认city是否已经有一个对应的特殊建筑
if(actionParam.MapData.GetCityDataByTerritoryGid(actionParam.GridData.Id,out var cityData)
&& Main.CityLogic.GetBuildingLevelByCity(actionParam.MapData,cityData,_actionId.ResourceType,out var level2))
return false;
return true;
}
}
// TrainUnit 训练单位类
public class TrainUnitAction : ActionLogicBase
{
public TrainUnitAction(CommonActionId id) : base(id)
{
}
public override bool Execute(CommonActionParams actionParams)
{
if (_actionId.UnitType == UnitType.None)
return false;
if (actionParams.MainObjectType == MainObjectType.City && actionParams.CityData == null)
return false;
if (actionParams.MainObjectType == MainObjectType.Grid && actionParams.GridData == null)
return false;
GridData gridData = null;
CityData cityData = null;
//如果是city产兵
if (actionParams.MainObjectType == MainObjectType.City)
{
cityData = actionParams.CityData;
//从city处获得准确的gridData
if (!actionParams.MapData.GetGridDataByCityId(actionParams.CityData.Id, out gridData))
return false;
}
//否则如果是grid产兵
if (actionParams.MainObjectType == MainObjectType.Grid)
{
//从actionParams获得准确的gridData
gridData = actionParams.GridData;
if (actionParams.CityData != null)
cityData = actionParams.CityData;
else
actionParams.MapData.GetCityDataByTerritoryGid(gridData.Id, out cityData);
}
if (gridData == null)
return false;
actionParams.PlayerData.PlayerWealth -= GetCost();
actionParams.MapData.AddUnitData(gridData.Id,cityData.Id,_actionId.UnitType,_actionId.GiantType);
cityData.CityInfoRenderMark = true;
//临时做法用来播放VFX,获取Main理应向MapData写入一个VFX的RenderMark的
var main = GameObject.Find("Main").GetComponent<Main>();
if (main.MapData == actionParams.MapData)// && actionParams.PlayerData.Id == actionParams.MapData.PlayerMap.SelfPlayerData.Id)
{
var v1 = Table.Instance.GridToWorld(gridData);
int score = GetCost() * 5;
if (actionParams.PlayerData.Id == actionParams.MapData.PlayerMap.SelfPlayerData.Id)
{
var faithPanel = GameObject.Find("UICanvas/TopBarPanel/FaithPanel/Icon").transform;
var endPos = Camera.main.ScreenToWorldPoint(faithPanel.position);
main.MapRenderer.ProjectileManager.CreateProjectile(main,actionParams.MapData,v1,endPos,ProjectileType.Faith,ProjectileMoveType.CoinParabola,score);
}
}
return true;
}
public override bool CheckCan(CommonActionParams actionParam)
{
PlayerData playerData;
GridData gridData;
CityData cityData;
//如果是城市产兵
if (actionParam.MainObjectType == MainObjectType.City)
{
//鲁棒性
if (actionParam.CityData == null)
return false;
cityData = actionParam.CityData;
//如果player操作的city不是自己的city
if (!actionParam.MapData.GetPlayerDataByCityId(actionParam.CityData.Id, out playerData)
|| playerData.Id != actionParam.PlayerData.Id)
return false;
if (!actionParam.MapData.GetGridDataByCityId(actionParam.CityData.Id, out gridData))
return false;
//如果没科技return
if(!actionParam.PlayerData.TechTree.CheckActionCan(_actionId))
return false;
//如果是城市生产无法生产水生unit
if (Table.Instance.UnitTypeDataAssets.GetUnitTypeInfo(_actionId.UnitType,_actionId.GiantType,out var info)
&& info.LandType == LandType.WaterAndAshore
&& actionParam.CityData != null)
return false;
//如果是unit但是不是boat,那不存在unit生产的可能
if (actionParam.UnitData != null && actionParam.UnitData.UnitType != UnitType.Boat)
return false;
//如果是unit-boat,那生产的unit不能是boat
if (actionParam.UnitData != null && _actionId.UnitType == UnitType.Boat)
return false;
//如果城市已经满员,不能生产,但是可以显示,所以要照常返回
if (actionParam.MapData.CheckIfCityFullPopulation(actionParam.CityData))
return false;
//如果城市上面有单位,不能生产,不显示
if (actionParam.MapData.GetUnitDataByGid(gridData.Id, out var unitData))
return false;
//判断钱够不够
if (GetCost() > actionParam.PlayerData.PlayerWealth)
return false;
//如果是伟人要检查unique属性
if (_actionId.UnitType == UnitType.Giant)
{
//获取unitTypeInfo
if(!Table.Instance.UnitTypeDataAssets.GetUnitTypeInfo(_actionId.UnitType, _actionId.GiantType,
out var unitTypeInfo))
return false;
//如果有Unique且全场已经有1个了
if (unitTypeInfo.Skills.Contains(SkillType.UNIQUE))
{
if (Main.PlayerLogic.GetMapUnitTypeCount(actionParam.MapData, _actionId.UnitType, _actionId.GiantType) > 0)
return false;
}
//如果有QUARTER且全场已经有4个了
if (unitTypeInfo.Skills.Contains(SkillType.QUARTER))
{
if(Main.PlayerLogic.GetMapUnitTypeCount(actionParam.MapData,_actionId.UnitType, _actionId.GiantType) > 3)
return false;
}
}
return true;
}
//如果是grid产兵
if (actionParam.MainObjectType == MainObjectType.Grid)
{
if (actionParam.GridData == null)
return false;
gridData = actionParam.GridData;
if (!actionParam.MapData.GetCityDataByTerritoryGid(gridData.Id, out cityData))
return false;
if (!actionParam.MapData.GetPlayerDataByCityId(cityData.Id, out playerData))
return false;
//如果领土不是player自己的
if (playerData.Id != actionParam.PlayerData.Id)
return false;
//如果没科技return
if(!actionParam.PlayerData.TechTree.CheckActionCan(_actionId))
return false;
//如果城市已经满员不能生产但是可以显示所以checkcan return 0 checkshow return 1
if (actionParam.MapData.CheckIfCityFullPopulation(cityData))
return false;
//如果格子上面有单位,不能生产,不显示
if (actionParam.MapData.GetUnitDataByGid(gridData.Id, out var _))
return false;
//判断钱够不够
if (GetCost() > actionParam.PlayerData.PlayerWealth)
return false;
//如果是伟人要检查unique属性
if (_actionId.UnitType == UnitType.Giant)
{
//获取unitTypeInfo
if(!Table.Instance.UnitTypeDataAssets.GetUnitTypeInfo(_actionId.UnitType, _actionId.GiantType,
out var unitTypeInfo))
return false;
//如果有Unique且全场已经有1个了
if (unitTypeInfo.Skills.Contains(SkillType.UNIQUE))
{
if (Main.PlayerLogic.GetMapUnitTypeCount(actionParam.MapData, _actionId.UnitType, _actionId.GiantType) > 0)
return false;
}
//如果有QUARTER且全场已经有4个了
if (unitTypeInfo.Skills.Contains(SkillType.QUARTER))
{
if(Main.PlayerLogic.GetMapUnitTypeCount(actionParam.MapData,_actionId.UnitType, _actionId.GiantType) > 3)
return false;
}
}
//----------终于进入正式的特判环节,前面都是通用判断,下面开始进入白名单
//红魔馆妖精女仆在树林生产
if (playerData.PlayerForceId == 0 && gridData.Vegetation == Vegetation.Trees
&& (gridData.Resource == ResourceType.Animal ||
gridData.Resource == ResourceType.None)
&& _actionId.UnitType == UnitType.Warrior)
return true;
if (_actionId.UnitType == UnitType.Giant
&& _actionId.GiantType == GiantType.EgyptianFlandre
&& playerData.PlayerForceId == 0
&& playerData.PlayerCivId == 0
&& gridData.Resource == ResourceType.Temple)
return true;
if (_actionId.UnitType == UnitType.Giant
&& _actionId.GiantType == GiantType.EgyptianPatchouli
&& playerData.PlayerForceId == 0
&& playerData.PlayerCivId == 0
&& gridData.Resource == ResourceType.MountainTemple)
return true;
if (_actionId.UnitType == UnitType.Giant
&& _actionId.GiantType == GiantType.EgyptianMeiling
&& playerData.PlayerForceId == 0
&& playerData.PlayerCivId == 0
&& gridData.Resource == ResourceType.ForestTemple)
return true;
if (_actionId.UnitType == UnitType.Giant
&& _actionId.GiantType == GiantType.EgyptianSakuya
&& playerData.PlayerForceId == 0
&& playerData.PlayerCivId == 0
&& gridData.Resource == ResourceType.WaterTemple)
return true;
}
return false;
}
public override bool CheckShow(CommonActionParams actionParam)
{
PlayerData playerData;
GridData gridData;
CityData cityData;
//如果是格子行使TrainUnit,直接return
if (actionParam.MainObjectType == MainObjectType.City)
{
//魯棒性
if (actionParam.CityData == null)
return false;
if (!actionParam.MapData.GetPlayerDataByCityId(actionParam.CityData.Id, out playerData)
|| playerData.Id != actionParam.PlayerData.Id)
return false;
if (!actionParam.MapData.GetGridDataByCityId(actionParam.CityData.Id, out gridData))
return false;
//如果没科技return
if(!actionParam.PlayerData.TechTree.CheckActionCan(_actionId))
return false;
//如果是城市生产无法生产水生unit
if (Table.Instance.UnitTypeDataAssets.GetUnitTypeInfo(_actionId.UnitType,_actionId.GiantType,out var info)
&& info.LandType == LandType.WaterAndAshore
&& actionParam.CityData != null)
return false;
//如果是unit但是不是boat,那不存在unit生产的可能
if (actionParam.UnitData != null && actionParam.UnitData.UnitType != UnitType.Boat)
return false;
//如果是unit-boat,那生产的unit不能是boat
if (actionParam.UnitData != null && _actionId.UnitType == UnitType.Boat)
return false;
//如果城市已经满员,不能生产,但是可以显示,所以要照常返回
//if (actionParam.MapData.CheckIfCityFullPopulation(actionParam.CityData) >= actionParam.CityData.Level)
// return false;
//如果城市上面有单位,不能生产,不显示
if (actionParam.MapData.GetUnitDataByGid(gridData.Id, out var unitData))
return false;
//如果是伟人处理UNIQUE和QUARTER的情况
if (_actionId.UnitType == UnitType.Giant)
{
//获取unitTypeInfo
if(!Table.Instance.UnitTypeDataAssets.GetUnitTypeInfo(_actionId.UnitType, _actionId.GiantType,
out var unitTypeInfo))
return false;
//如果有Unique且全场已经有1个了
if (unitTypeInfo.Skills.Contains(SkillType.UNIQUE))
{
if (Main.PlayerLogic.GetMapUnitTypeCount(actionParam.MapData, _actionId.UnitType, _actionId.GiantType) > 0)
return false;
}
//如果有QUARTER且全场已经有4个了
if (unitTypeInfo.Skills.Contains(SkillType.QUARTER))
{
if(Main.PlayerLogic.GetMapUnitTypeCount(actionParam.MapData,_actionId.UnitType, _actionId.GiantType) > 3)
return false;
}
}
return true;
}
//如果是grid产兵
if (actionParam.MainObjectType == MainObjectType.Grid)
{
if (actionParam.GridData == null)
return false;
gridData = actionParam.GridData;
if (!actionParam.MapData.GetCityDataByTerritoryGid(gridData.Id, out cityData))
return false;
if (!actionParam.MapData.GetPlayerDataByCityId(cityData.Id, out playerData))
return false;
//如果领土不是player自己的
if (playerData.Id != actionParam.PlayerData.Id)
return false;
//如果没科技return
if(!actionParam.PlayerData.TechTree.CheckActionCan(_actionId))
return false;
//如果城市已经满员不能生产但是可以显示所以checkcan return 0 checkshow return 1
//if (actionParam.MapData.CheckIfCityFullPopulation(cityData))
//return false;
//如果格子上面有单位,不能生产,不显示
if (actionParam.MapData.GetUnitDataByGid(gridData.Id, out var _))
return false;
//判断钱够不够
//if (GetCost() > actionParam.PlayerData.PlayerWealth)
//return false;
//如果是伟人要检查unique属性
if (_actionId.UnitType == UnitType.Giant)
{
//获取unitTypeInfo
if(!Table.Instance.UnitTypeDataAssets.GetUnitTypeInfo(_actionId.UnitType, _actionId.GiantType,
out var unitTypeInfo))
return false;
//如果有Unique且全场已经有1个了
if (unitTypeInfo.Skills.Contains(SkillType.UNIQUE))
{
if (Main.PlayerLogic.GetMapUnitTypeCount(actionParam.MapData, _actionId.UnitType, _actionId.GiantType) > 0)
return false;
}
//如果有QUARTER且全场已经有4个了
if (unitTypeInfo.Skills.Contains(SkillType.QUARTER))
{
if(Main.PlayerLogic.GetMapUnitTypeCount(actionParam.MapData,_actionId.UnitType, _actionId.GiantType) > 3)
return false;
}
}
//----------终于进入正式的特判环节,前面都是通用判断,下面开始进入白名单
//红魔馆妖精女仆在树林生产
if (playerData.PlayerForceId == 0 && gridData.Vegetation == Vegetation.Trees
&& (gridData.Resource == ResourceType.Animal ||
gridData.Resource == ResourceType.None)
&& _actionId.UnitType == UnitType.Warrior)
return true;
if (_actionId.UnitType == UnitType.Giant
&& _actionId.GiantType == GiantType.EgyptianFlandre
&& playerData.PlayerForceId == 0
&& playerData.PlayerCivId == 0
&& gridData.Resource == ResourceType.Temple)
return true;
if (_actionId.UnitType == UnitType.Giant
&& _actionId.GiantType == GiantType.EgyptianPatchouli
&& playerData.PlayerForceId == 0
&& playerData.PlayerCivId == 0
&& gridData.Resource == ResourceType.MountainTemple)
return true;
if (_actionId.UnitType == UnitType.Giant
&& _actionId.GiantType == GiantType.EgyptianMeiling
&& playerData.PlayerForceId == 0
&& playerData.PlayerCivId == 0
&& gridData.Resource == ResourceType.ForestTemple)
return true;
if (_actionId.UnitType == UnitType.Giant
&& _actionId.GiantType == GiantType.EgyptianSakuya
&& playerData.PlayerForceId == 0
&& playerData.PlayerCivId == 0
&& gridData.Resource == ResourceType.WaterTemple)
return true;
}
return false;
}
}
//UnitAction单位行动逻辑类
public class UnitActionAction : ActionLogicBase
{
public UnitActionAction(CommonActionId id) : base(id)
{
}
public 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))
{
gridData.VFXRenderMarkFog = true;
Main.PlayerLogic.OccupyCity(actionParams.MapData,actionParams.UnitData,cityData);
//处理占领城市的特效(所有领土会升起一面旗帜
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 GridVFXRenderMark(GridVFXType.Flag,true);
t.CivId = playerData.PlayerCivId;
gdd.SetGridVFXRenderMark(t);
}
}
actionParams.UnitData.CP = 0;
actionParams.UnitData.MP = 0;
actionParams.UnitData.AP = 0;
return true;
}
//处理占领村庄的情况
else
{
gridData.VFXRenderMarkFog = true;
cityData = Main.PlayerLogic.OccupyVillage(actionParams.MapData,actionParams.UnitData,gridData);
//处理占领城市的特效(所有领土会升起一面旗帜
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 GridVFXRenderMark(GridVFXType.Flag,true);
t.CivId = playerData.PlayerCivId;
gdd.SetGridVFXRenderMark(t);
}
}
actionParams.UnitData.CP = 0;
actionParams.UnitData.MP = 0;
actionParams.UnitData.AP = 0;
return true;
}
}
if (_actionId.UnitActionType == UnitActionType.Upgrade)
{
if (!Table.Instance.UnitTypeDataAssets.GetUnitTypeInfo(actionParams.UnitData.UnitType,
actionParams.UnitData.GiantType, out var info))
return false;
//处理CARRY的情况
if (info.Skills.Contains(SkillType.CARRY))
{
if (actionParams.UnitData.CarryVeteran)
return false;
if (actionParams.UnitData.CarryExp < 3)
return false;
actionParams.UnitData.CarryVeteran = true;
}
//处理非CARRY是老兵
else
{
if (actionParams.UnitData.Veteran)
return false;
if (actionParams.UnitData.Exp < 3)
return false;
actionParams.UnitData.Veteran = true;
}
actionParams.UnitData.Health = actionParams.UnitData.GetMaxHealth();
actionParams.UnitData.RenderMark = true;
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, out var info ))
return false;
if (actionParams.PlayerData.PlayerWealth < info.Cost)
return false;
actionParams.PlayerData.PlayerWealth -= info.Cost;
Main.UnitLogic.UnitTypeTransform(actionParams.UnitData,_actionId.UnitType);
Main.PlayerLogic.UpdateSight(actionParams.MapData,actionParams.PlayerData,actionParams.MapData.GridMap.GetAroundGridIdList(2,gridData));
actionParams.UnitData.RenderMark = true;
return true;
}
//剩下的都需要CP消耗CP
if (actionParams.UnitData.CP <= 0)
return false;
//用ret做记录如果最后ret=true再将CPMPAP置0
bool ret = false;
//处理disband
if (_actionId.UnitActionType == UnitActionType.Disband)
{
int earn = 0;
if (!Table.Instance.UnitTypeDataAssets.GetUnitTypeInfo(actionParams.UnitData.UnitType,GiantType.None, out var info ))
return false;
earn += info.Cost / 2;
if (actionParams.UnitData.CarryUnitType != UnitType.None
&& Table.Instance.UnitTypeDataAssets.GetUnitTypeInfo(actionParams.UnitData.CarryUnitType,
GiantType.None, out var carryInfo))
earn += carryInfo.Cost / 2;
actionParams.PlayerData.PlayerWealth += earn;
//临时做法用来播放VFX,获取Main理应向MapData写入一个VFX的RenderMark的
var main = GameObject.Find("Main").GetComponent<Main>();
if (actionParams.MapData == main.MapData)
{
var v1 = Table.Instance.GridToWorld(gridData);
var startPos = Table.Instance.GridToWorld(gridData);
var moneyPanel = GameObject.Find("UICanvas/TopBarPanel/MoneyPanel/Icon").transform;
var endPos = Camera.main.ScreenToWorldPoint(moneyPanel.position);
//播放雾效
gridData.VFXRenderMarkFog = true;
//播放获得钱的动画
if(playerData.Id == actionParams.MapData.PlayerMap.SelfPlayerId)
main.MapRenderer.ProjectileManager.CreateProjectileMulti(main,actionParams.MapData,startPos,endPos,ProjectileType.Coin,ProjectileMoveType.CoinParabola,earn,0.05f);
}
Main.UnitLogic.Die(actionParams.MapData,actionParams.UnitData);
ret = true;
}
//处理recover
if (_actionId.UnitActionType == UnitActionType.Recover)
{
int recoverV = 4;
if (!actionParams.MapData.GetPlayerDataByTerritoryGridId(gridData.Id, out var terrPlayerData))
recoverV = 2;
else if (terrPlayerData != actionParams.PlayerData)
recoverV = 2;
actionParams.UnitData.Health += recoverV;
gridData.VFXRenderMarkHeal = true;
if (actionParams.UnitData.Health > actionParams.UnitData.GetMaxHealth())
actionParams.UnitData.Health = actionParams.UnitData.GetMaxHealth();
ret = true;
actionParams.UnitData.RenderMark = true;
}
//处理heal TODO 未实现
if (_actionId.UnitActionType == UnitActionType.Heal)
{
}
//处理gather
if (_actionId.UnitActionType == UnitActionType.Gather)
{
gridData.Resource = ResourceType.None;
actionParams.PlayerData.PlayerWealth += 10;
gridData.RenderMark = true;
ret = true;
var main = GameObject.Find("Main").GetComponent<Main>();
if (actionParams.MapData == main.MapData && actionParams.MapData.PlayerMap.SelfPlayerId == playerData.Id)
{
var v1 = Table.Instance.GridToWorld(gridData);
var startPos = Table.Instance.GridToWorld(gridData);
var moneyPanel = GameObject.Find("UICanvas/TopBarPanel/MoneyPanel/Icon").transform;
var endPos = Camera.main.ScreenToWorldPoint(moneyPanel.position);
//播放获得钱的动画
main.MapRenderer.ProjectileManager.CreateProjectileMulti(main,actionParams.MapData,startPos,endPos,ProjectileType.Coin,ProjectileMoveType.CoinParabola,10,0.05f);
//main.MapRenderer.ProjectileManager.CreateProjectileMulti(main,actionParams.MapData,v1,v2,ProjectileType.CityExp,ProjectileMoveType.CityExpHighParabola,wonderInfo.Exp);
}
}
//处理examine
if (_actionId.UnitActionType == UnitActionType.Examine)
{
gridData.Resource = ResourceType.None;
gridData.RenderMark = true;
if (UnityEngine.Random.Range(0, 100) < 50)
{
actionParams.PlayerData.PlayerWealth += 10;
//临时做法用来播放VFX,获取Main理应向MapData写入一个VFX的RenderMark的
var main = GameObject.Find("Main").GetComponent<Main>();
if (actionParams.MapData == main.MapData && actionParams.MapData.PlayerMap.SelfPlayerId == playerData.Id)
{
var v1 = Table.Instance.GridToWorld(gridData);
var startPos = Table.Instance.GridToWorld(gridData);
var moneyPanel = GameObject.Find("UICanvas/TopBarPanel/MoneyPanel/Icon").transform;
var endPos = Camera.main.ScreenToWorldPoint(moneyPanel.position);
//播放获得钱的动画
main.MapRenderer.ProjectileManager.CreateProjectileMulti(main,actionParams.MapData,startPos,endPos,ProjectileType.Coin,ProjectileMoveType.CoinParabola,10,0.05f);
//main.MapRenderer.ProjectileManager.CreateProjectileMulti(main,actionParams.MapData,v1,v2,ProjectileType.CityExp,ProjectileMoveType.CityExpHighParabola,wonderInfo.Exp);
}
}
//给一个随机科技
else if (UnityEngine.Random.Range(0, 100) < 0)
{
var tt = new List<TechType>();
foreach (TechType tech in System.Enum.GetValues(typeof(TechType)))
{
if (actionParams.PlayerData.TechTree.CheckIfHasTech(tech))
continue;
tt.Add(tech);
}
if(tt.Count <= 0)
actionParams.PlayerData.PlayerWealth += 10;
else
{
Main.PlayerLogic.ResearchTech(actionParams.MapData,actionParams.PlayerData,tt[UnityEngine.Random.Range(0, tt.Count)],0);
}
}
//给一个单位
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)
{
var unit = actionParams.MapData.AddUnitData(gridData.Id,capital.Id,UnitType.Swordsman);
unit.Exp = 3;
}
else
{
var unit = actionParams.MapData.AddUnitData(gridData.Id,capital.Id,UnitType.RammerShip);
unit.CarryExp = 3;
}
if(gridData.Terrain == TerrainType.Land)
capital.CityInfoRenderMark = true;
}
ret = true;
}
//处理ROYALFLAMES
if (_actionId.UnitActionType == UnitActionType.ROYALFLAMES)
{
var unitA = actionParams.UnitData;
var gridA = gridData;
var gridList = actionParams.MapData.GridMap.GetAroundGridData(2,2,gridA);
var t = new GridVFXRenderMark(GridVFXType.ROYALFLAMES);
gridA.SetGridVFXRenderMark(t);
Timer.Instance.TimerRegister(this,()=>{
foreach (var gridB in gridList)
{
//如果有单位,造成伤害
if (actionParams.MapData.GetUnitDataByGid(gridB.Id, out var unitB))
{
var dis = Table.Instance.CalcDistance(gridA,gridB );
//处理内圈伤害
if (dis == 1)
{
//var damage = Table.Instance.CalcDamage(actionParams.MapData, unitA, unitB);
Main.UnitLogic.SpecialDamage(actionParams.MapData,unitA, unitB,6);
}
//处理外圈伤害
if (dis == 2)
{
//var damage = Table.Instance.CalcDamage(actionParams.MapData, unitA, unitB,damagePara:0.5f);
Main.UnitLogic.SpecialDamage(actionParams.MapData,unitA, unitB,3);
}
}
else
//如果没有单位,造成地块震荡的效果
{
//处理动画效果
//TODO 不该这么做,临时凑合一下
var main = GameObject.Find("Main").GetComponent<Main>();
main.MapRenderer.ROGridMap[gridB.Id].SetBounceAnim(NeedRandomWait:true);
}
}
},0.5f);
ret = true;
}
if (ret)
{
actionParams.UnitData.CP = 0;
actionParams.UnitData.AP = 0;
actionParams.UnitData.MP = 0;
}
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.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, out var info))
return false;
//处理CARRY的情况
if (info.Skills.Contains(SkillType.CARRY))
{
if (actionParams.UnitData.CarryVeteran)
return false;
if (actionParams.UnitData.CarryExp >= 3)
return true;
return false;
}
//处理非CARRY是老兵
if (actionParams.UnitData.Veteran)
return false;
if (actionParams.UnitData.Exp >= 3)
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)
&& player1 != actionParams.PlayerData)
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 == UnitType.Giant || 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;
}
//处理heal TODO 未实现
if (_actionId.UnitActionType == UnitActionType.Heal)
{
}
//处理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)
{
//鲁棒性判断
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;
//判断钱够不够 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, out var info))
return false;
//处理CARRY的情况
if (info.Skills.Contains(SkillType.CARRY))
{
if (actionParams.UnitData.CarryVeteran)
return false;
if (actionParams.UnitData.CarryExp >= 3)
return true;
return false;
}
//处理非CARRY是老兵
if (actionParams.UnitData.Veteran)
return false;
if (actionParams.UnitData.Exp >= 3)
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)
&& player1 != actionParams.PlayerData)
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 == UnitType.Giant || 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;
}
//处理heal TODO 未实现
if (_actionId.UnitActionType == UnitActionType.Heal)
{
}
//处理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;
}
}
//CityLevelUp 行动逻辑类
public class CityLevelUpActionAction : ActionLogicBase
{
public CityLevelUpActionAction(CommonActionId id) : base(id)
{
}
public override bool Execute(CommonActionParams actionParams)
{
//鲁棒性判断
if (actionParams.CityData == null) return false;
if (!actionParams.MapData.GetGridDataByCityId(actionParams.CityData.Id, out var gridData))
return false;
if (!actionParams.CityData.CityLevelUpPoint)
return false;
actionParams.CityData.CityLevelUpPoint = false;
if (_actionId.CityLevelUpActionType == CityLevelUpActionType.Explorer)
{
// 1. 锁定玩家输入
Main main = GameObject.FindObjectOfType<Logic.Main>();
main.InputLogic.LockInput();
Debug.Log("玩家输入已锁定");
// 2. 创建临时探索者图像3秒后自动销毁
main.MapRenderer.CreateTemporaryExplorer(gridData, 3f);
actionParams.CityData.CityInfoRenderMark = true;
return true;
}
if (_actionId.CityLevelUpActionType == CityLevelUpActionType.Workshop)
{
actionParams.CityData.Workshop = true;
actionParams.CityData.CityInfoRenderMark = true;
return true;
}
if (_actionId.CityLevelUpActionType == CityLevelUpActionType.CityWealth)
{
if (actionParams.MapData.GetPlayerDataByCityId(actionParams.CityData.Id, out var playerData))
playerData.PlayerWealth += 5;
actionParams.CityData.CityInfoRenderMark = true;
return true;
}
if (_actionId.CityLevelUpActionType == CityLevelUpActionType.CityWall)
{
actionParams.CityData.CityWall = true;
gridData.RenderMark = true;
return true;
}
if (_actionId.CityLevelUpActionType == CityLevelUpActionType.Expand)
{
Main.CityLogic.CityLevelUpActionExpand(actionParams.MapData,actionParams.CityData);
actionParams.CityData.CityInfoRenderMark = true;
return true;
}
if (_actionId.CityLevelUpActionType == CityLevelUpActionType.Population)
{
Main.CityLogic.CityUpdateExp(actionParams.MapData,actionParams.CityData,3);
actionParams.CityData.CityInfoRenderMark = true;
return true;
}
if (_actionId.CityLevelUpActionType == CityLevelUpActionType.Park)
{
actionParams.CityData.ParkCount++;
actionParams.CityData.CityInfoRenderMark = true;
return true;
}
if (_actionId.CityLevelUpActionType == CityLevelUpActionType.BigGuy)
{
if(actionParams.MapData.GetUnitDataByGid(gridData.Id,out var unitData))
Main.UnitLogic.PassiveMoveAway(actionParams.MapData, unitData);
actionParams.MapData.AddUnitData(gridData.Id,actionParams.CityData.Id,UnitType.BigGuy);
actionParams.CityData.CityInfoRenderMark = true;
return true;
}
return false;
}
public override bool CheckCan(CommonActionParams actionParams)
{
if (actionParams.CityData == null) return false;
//如果没有升级行动的点数,退出
if (!actionParams.CityData.CityLevelUpPoint)
return false;
if (_actionId.CityLevelUpActionType == CityLevelUpActionType.Explorer)
return actionParams.CityData.Level == 3;
if (_actionId.CityLevelUpActionType == CityLevelUpActionType.Workshop)
return actionParams.CityData.Level == 3;
if (_actionId.CityLevelUpActionType == CityLevelUpActionType.CityWall)
return actionParams.CityData.Level == 4;
if (_actionId.CityLevelUpActionType == CityLevelUpActionType.CityWealth)
return actionParams.CityData.Level == 4;
if (_actionId.CityLevelUpActionType == CityLevelUpActionType.Population)
return actionParams.CityData.Level == 5;
if (_actionId.CityLevelUpActionType == CityLevelUpActionType.Expand)
return actionParams.CityData.Level == 5;
if (_actionId.CityLevelUpActionType == CityLevelUpActionType.Park)
return actionParams.CityData.Level > 5;
if (_actionId.CityLevelUpActionType == CityLevelUpActionType.BigGuy)
return actionParams.CityData.Level > 5;
return false;
}
public override bool CheckShow(CommonActionParams actionParams)
{
if (actionParams.CityData == null) return false;
//如果没有升级行动的点数,退出
if (!actionParams.CityData.CityLevelUpPoint)
return false;
if (_actionId.CityLevelUpActionType == CityLevelUpActionType.Explorer)
return actionParams.CityData.Level == 3;
if (_actionId.CityLevelUpActionType == CityLevelUpActionType.Workshop)
return actionParams.CityData.Level == 3;
if (_actionId.CityLevelUpActionType == CityLevelUpActionType.CityWall)
return actionParams.CityData.Level == 4;
if (_actionId.CityLevelUpActionType == CityLevelUpActionType.CityWealth)
return actionParams.CityData.Level == 4;
if (_actionId.CityLevelUpActionType == CityLevelUpActionType.Population)
return actionParams.CityData.Level == 5;
if (_actionId.CityLevelUpActionType == CityLevelUpActionType.Expand)
return actionParams.CityData.Level == 5;
if (_actionId.CityLevelUpActionType == CityLevelUpActionType.Park)
return actionParams.CityData.Level > 5;
if (_actionId.CityLevelUpActionType == CityLevelUpActionType.BigGuy)
return actionParams.CityData.Level > 5;
return false;
}
}
// 小兵移动,目前只用于 AI 的行为
public class UnitMoveAction : ActionLogicBase
{
public UnitMoveAction(CommonActionId id) : base(id)
{
}
public override bool Execute(CommonActionParams actionParams)
{
if (actionParams.MapData.GetGridDataByUnitId(actionParams.UnitData.Id, out var unitGrid))
{
var distance = actionParams.MapData.GridMap.CalcDistance(unitGrid, actionParams.GridData);
if (distance > 3)
{
Debug.LogError($"!!!");
}
}
Main.UnitLogic.MoveTo(actionParams.MapData, actionParams.UnitData, actionParams.GridData,
MoveType.ActiveMove);
return true;
}
public override bool CheckCan(CommonActionParams actionParams)
{
return true;
}
public override bool CheckShow(CommonActionParams actionParams)
{
return false;
}
public override bool CameraControl(CommonActionParams actionParams)
{
var main = GameObject.Find("Main").GetComponent<Main>();
if (actionParams.GridData != null && main != null && main.MapRenderer.CameraController != null)
main.MapRenderer.CameraController?.CameraFocusOnGrid(actionParams.GridData);
return true;
}
public override float GetAnimTime(CommonActionParams actionParams)
{
return Table.Instance.AnimDataAssets.MoveAnimTime + Table.Instance.AnimDataAssets.AIAfterMoveColdDownTime;// + Table.Instance.AnimDataAssets.AIBeforeAnimWaitTime;
}
}
// 小兵攻击,目前只用于 AI 的行为
public class UnitAttackAction : ActionLogicBase
{
public UnitAttackAction(CommonActionId id) : base(id)
{
}
public override bool Execute(CommonActionParams actionParams)
{
Main.UnitLogic.Attack(actionParams.MapData, actionParams.UnitData, actionParams.TargetUnitData);
return true;
}
public override bool CheckCan(CommonActionParams actionParams)
{
return true;
}
public override bool CheckShow(CommonActionParams actionParams)
{
return false;
}
public override bool CameraControl(CommonActionParams actionParams)
{
var main = GameObject.Find("Main").GetComponent<Main>();
if(actionParams.GridData != null && main != null && main.MapRenderer.CameraController != null)
main.MapRenderer.CameraController?.CameraFocusOnGrid(actionParams.GridData);
return true;
}
public override float GetAnimTime(CommonActionParams actionParams)
{
var unit1 = actionParams.UnitData;
if(actionParams.UnitData == null || !actionParams.MapData.UnitMap.GetUnitDataByUnitId(actionParams.TargetUnitId, out var unit2))
return 0.05f;
var main = GameObject.Find("Main").GetComponent<Main>();
return Main.UnitLogic.AttackAnimTime(actionParams.MapData, unit1, unit2) +
Table.Instance.AnimDataAssets.AIAfterAttackColdDownTime;// + Table.Instance.AnimDataAssets.AIBeforeAnimWaitTime;
}
}
public class StartWonderAction : ActionLogicBase
{
public StartWonderAction(CommonActionId id) : base(id)
{
}
public override bool Execute(CommonActionParams actionParams)
{
return false;
}
public override bool CheckCan(CommonActionParams actionParams)
{
return false;
}
public override bool CheckShow(CommonActionParams actionParams)
{
return false;
}
}
//TODO 没有填写Skill
public class UnitSkillAction : ActionLogicBase
{
public UnitSkillAction(CommonActionId id) : base(id)
{
}
public override bool Execute(CommonActionParams actionParams)
{
return false;
}
public override bool CheckCan(CommonActionParams actionParams)
{
return false;
}
public override bool CheckShow(CommonActionParams actionParams)
{
return false;
}
}
//GridMisc行为逻辑类包括Destroy, ClearForest GrowForest BurnForest
public class GridMiscAction : ActionLogicBase
{
public GridMiscAction(CommonActionId id) : base(id)
{
}
public override bool Execute(CommonActionParams actionParams)
{
if (actionParams.PlayerData == null || actionParams.GridData == null)
return false;
if (!Table.Instance.ActionDataAssets.GetActionInfo(_actionId, out var actionInfo))
return false;
//处理grow forest
if (_actionId.GridMiscActionType == GridMiscActionType.GrowForest)
{
actionParams.PlayerData.PlayerWealth -= actionInfo.Cost;
actionParams.GridData.Resource = ResourceType.None;
actionParams.GridData.Vegetation = Vegetation.Trees;
actionParams.GridData.RenderMark = true;
//处理因为树林变化带来的上方单位防御状态变化的情况
if (actionParams.MapData.GetUnitDataByGid(actionParams.GridData.Id, out var unit))
unit.RenderMark = true;
return true;
}
//处理clear forest
if (_actionId.GridMiscActionType == GridMiscActionType.ClearForest)
{
actionParams.PlayerData.PlayerWealth -= actionInfo.Cost;
actionParams.GridData.Resource = ResourceType.None;
actionParams.GridData.Vegetation = Vegetation.None;
actionParams.GridData.RenderMark = true;
//处理因为树林变化带来的上方单位防御状态变化的情况
if (actionParams.MapData.GetUnitDataByGid(actionParams.GridData.Id, out var unit))
unit.RenderMark = true;
return true;
}
//处理 burn forest
if (_actionId.GridMiscActionType == GridMiscActionType.BurnForest)
{
actionParams.PlayerData.PlayerWealth -= actionInfo.Cost;
actionParams.GridData.Vegetation = Vegetation.None;
actionParams.GridData.Resource = ResourceType.Crop;
actionParams.GridData.RenderMark = true;
return true;
}
//处理Destroy
if (_actionId.GridMiscActionType == GridMiscActionType.Destroy)
{
Debug.Log($"执行拆除!目标是{actionParams.GridData.Resource}");
if (!Table.Instance.GridAndResourceDataAssets.GetResourceInfo(actionParams.GridData.Resource,
out var resourceInfo))
return false;
//如果destroy的位置是无主地块
if (!actionParams.MapData.GetCityDataByTerritoryGid(actionParams.GridData.Id, out var cityData))
return false;
if (actionParams.GridData.Resource == ResourceType.Farm ||
actionParams.GridData.Resource == ResourceType.Mine ||
actionParams.GridData.Resource == ResourceType.LumberHut)
{
//在已经拆除前记录下来周围的什么样的milllike建筑要被同时更新
ResourceType needUpdate =
Table.Instance.GridAndResourceDataAssets.GetMillLikeRelative(actionParams.GridData.Resource);
Main.CityLogic.CityUpdateExp(actionParams.MapData, cityData, -resourceInfo.Exp);
actionParams.GridData.Resource = actionParams.GridData.ResourceUnderBuilding;
actionParams.GridData.ResourceUnderBuilding = ResourceType.None;
//更新周围的milllike建筑
var gridDataList1 = Main.PlayerLogic.GetPlayerResourceNearbyList(actionParams.MapData,
actionParams.PlayerData,
actionParams.GridData, needUpdate);
Debug.Log($"执行拆除!目标影响到了周围的{needUpdate},数量有是{gridDataList1.Count}");
foreach (var gridData1 in gridDataList1)
{
Main.CityLogic.UpdateGridBuildingData(actionParams.MapData, gridData1);
//还要额外连带影响附近的market
var gridDataList2 = Main.PlayerLogic.GetPlayerResourceNearbyList(actionParams.MapData,
actionParams.PlayerData, gridData1, ResourceType.Market);
foreach (var gridData2 in gridDataList2)
Main.CityLogic.UpdateGridBuildingData(actionParams.MapData, gridData2);
}
}
//处理windmill sawmill forge
else if (actionParams.GridData.Resource == ResourceType.Windmill ||
actionParams.GridData.Resource == ResourceType.Forge ||
actionParams.GridData.Resource == ResourceType.Sawmill)
{
//对应城市先丢失exp
Main.CityLogic.CityUpdateExp(actionParams.MapData, cityData,
-actionParams.GridData.buildingLevel * (actionParams.GridData.Resource == ResourceType.Forge ? 2 : 1));
//删除格子的内容
actionParams.GridData.Resource = actionParams.GridData.ResourceUnderBuilding;
actionParams.GridData.ResourceUnderBuilding = ResourceType.None;
actionParams.GridData.buildingLevel = 0;
//更新周围的market情况
var gridDataList = Main.PlayerLogic.GetPlayerResourceNearbyList(actionParams.MapData,
actionParams.PlayerData,
actionParams.GridData, ResourceType.Market);
Debug.Log($"这次拆除后周围的market找到了{gridDataList.Count()}个");
foreach (var gridData in gridDataList)
Main.CityLogic.UpdateGridBuildingData(actionParams.MapData, gridData);
}
//处理market
else if (actionParams.GridData.Resource == ResourceType.Market)
{
actionParams.GridData.Resource = actionParams.GridData.ResourceUnderBuilding;
actionParams.GridData.ResourceUnderBuilding = ResourceType.None;
actionParams.GridData.buildingLevel = 0;
}
//处理港口和桥梁
else if(actionParams.GridData.Resource == ResourceType.Port ||
actionParams.GridData.Resource == ResourceType.Bridge)
{
Main.CityLogic.CityUpdateExp(actionParams.MapData, cityData, -resourceInfo.Exp);
Main.PlayerLogic.UpdateCityConnect(actionParams.MapData,actionParams.PlayerData);
}
//处理其他情况
else
{
actionParams.GridData.Resource = actionParams.GridData.ResourceUnderBuilding;
actionParams.GridData.ResourceUnderBuilding = ResourceType.None;
Main.CityLogic.CityUpdateExp(actionParams.MapData, cityData, -resourceInfo.Exp);
}
cityData.CityInfoRenderMark = true;
actionParams.GridData.RenderMark = true;
return true;
}
return false;
}
public override bool CheckCan(CommonActionParams actionParams)
{
//如果是unit或者city来执行gridMisc操作直接return false
if (actionParams.MainObjectType != MainObjectType.Grid)
return false;
if (actionParams.GridData == null)
return false;
//如果没有对应科技return false
if (!actionParams.PlayerData.TechTree.CheckActionCan(_actionId))
return false;
//如果在有主领土,判断是敌人还是自己
if (actionParams.MapData.GetPlayerDataByTerritoryGridId(actionParams.GridData.Id, out var playerData))
{
//在敌人领土上直接return false
if (playerData != actionParams.PlayerData)
return false;
}
//如果在无主领土 return false
else
return false;
//判断钱够不够
if (GetCost() > actionParams.PlayerData.PlayerWealth)
return false;
//处理grow forest
if (_actionId.GridMiscActionType == GridMiscActionType.GrowForest)
{
//如果不是crop或者none的land直接return false
if (actionParams.GridData.Terrain != TerrainType.Land
|| (actionParams.GridData.Resource != ResourceType.None
&& actionParams.GridData.Resource != ResourceType.Crop
&& actionParams.GridData.Resource != ResourceType.Fruit))
return false;
if (actionParams.GridData.Feature == TerrainFeature.Mountain)
return false;
return true;
}
//处理clear forest 和 burn forest
if (_actionId.GridMiscActionType == GridMiscActionType.ClearForest || _actionId.GridMiscActionType == GridMiscActionType.BurnForest )
{
//如果没有树林 或者 树林已经不是none或animal return false
if (actionParams.GridData.Vegetation != Vegetation.Trees
|| (actionParams.GridData.Resource != ResourceType.None
&& actionParams.GridData.Resource != ResourceType.Animal))
return false;
return true;
}
//处理Destroy
if (_actionId.GridMiscActionType == GridMiscActionType.Destroy)
{
if (actionParams.GridData.Resource == ResourceType.Temple
|| actionParams.GridData.Resource == ResourceType.ForestTemple
|| actionParams.GridData.Resource == ResourceType.MountainTemple
|| actionParams.GridData.Resource == ResourceType.WaterTemple
|| actionParams.GridData.Resource == ResourceType.Windmill
|| actionParams.GridData.Resource == ResourceType.Sawmill
|| actionParams.GridData.Resource == ResourceType.Forge
|| actionParams.GridData.Resource == ResourceType.LumberHut
|| actionParams.GridData.Resource == ResourceType.Farm
|| actionParams.GridData.Resource == ResourceType.Mine
|| actionParams.GridData.Resource == ResourceType.Port
|| actionParams.GridData.Resource == ResourceType.Bridge
|| actionParams.GridData.Resource == ResourceType.Market
|| actionParams.GridData.Resource == ResourceType.Wonder)
return true;
return false;
}
return false;
}
public override bool CheckShow(CommonActionParams actionParams)
{
return CheckCan(actionParams);
}
}
public class LearnTechAction : ActionLogicBase
{
public LearnTechAction(CommonActionId id) : base(id)
{
}
public override bool Execute(CommonActionParams actionParams)
{
if (actionParams.MainObjectType != MainObjectType.Player)
return false;
if (actionParams.PlayerData == null)
return false;
int cost = Main.PlayerLogic.GetRealCost(actionParams.MapData, actionParams.PlayerData, _actionId.TechType);
Main.PlayerLogic.ResearchTech(actionParams.MapData,actionParams.PlayerData,_actionId.TechType,cost);
return true;
}
public override bool CheckCan(CommonActionParams actionParams)
{
//鲁棒性判断,不是玩家执行这个操作就退出
if (actionParams.MainObjectType != MainObjectType.Player)
return false;
if (actionParams.PlayerData == null)
return false;
if (actionParams.PlayerData.TechTree.CheckIfHasTech(_actionId.TechType))
return false;
//如果没有父科技
var techInfo = Table.Instance.TechDataAssets.GetTechInfo(_actionId.TechType);
if (!actionParams.PlayerData.TechTree.CheckIfHasTech(techInfo.FatherTechType))
return false;
//判断钱够不够
if (GetCost() > actionParams.PlayerData.PlayerWealth)
return false;
int cost = Main.PlayerLogic.GetRealCost(actionParams.MapData, actionParams.PlayerData, _actionId.TechType);
if(cost > actionParams.PlayerData.PlayerWealth)
return false;
//
return true;
}
public override bool CheckShow(CommonActionParams actionParams)
{
return false;
}
}
}