2860 lines
130 KiB
C#
2860 lines
130 KiB
C#
/*
|
||
* @Author: 白哉
|
||
* @Description: 行为逻辑类
|
||
* @Date: 2025年04月10日 星期四 11:04:44
|
||
* @Modify:
|
||
*/
|
||
|
||
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using System.Linq;
|
||
using Logic.AI;
|
||
using Logic.CrashSight;
|
||
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;
|
||
MapRenderer.Instance.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);
|
||
MapRenderer.Instance.ProjectileManager.CreateProjectile(main,actionParams.MapData,v2,endPos,ProjectileType.Faith,ProjectileMoveType.CoinParabola,score);
|
||
}
|
||
|
||
|
||
},
|
||
Table.Instance.AnimDataAssets.ProjectileCityExpMoveTime);
|
||
|
||
//播放雾效和丢出cityexp & 丢出信仰分 的动画
|
||
actionParams.GridData.VFXRenderMarkFog = true;
|
||
MapRenderer.Instance.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);
|
||
MapRenderer.Instance.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)
|
||
{
|
||
//鲁棒性+基础数据准备,必须准备player(谁来建设?)和grid(在哪里建设?)
|
||
if (actionParam.PlayerData == null) return false;
|
||
if (actionParam.GridData == null) return false;
|
||
var player = actionParam.PlayerData;
|
||
var grid = actionParam.GridData;
|
||
var map = actionParam.MapData;
|
||
//找到grid所属于的player,如果是无主领土就return
|
||
if (!map.GetPlayerDataByTerritoryGridId(grid.Id, out var gridPlayer))
|
||
return false;
|
||
//如果player操作的grid都不属于自己return
|
||
if (player != gridPlayer) return false;
|
||
//如果根本无法建设这个奇观 return
|
||
if (player.Wonder.GetWonderState(_actionId.WonderType) != WonderState.FINISH_NOT_BUILD) return false;
|
||
//如果是山地或者深海,无法建设这个奇观 return false
|
||
if (grid.Feature == TerrainFeature.Mountain
|
||
|| grid.Terrain == TerrainType.DeepSea
|
||
|| grid.Vegetation == Vegetation.Trees)
|
||
return false;
|
||
//如果有非联盟的敌人站在上面
|
||
if (map.GetUnitDataByGid(grid.Id, out var unit) && !map.CheckUnitIdBelongPlayerIdUnion(unit.Id, player.Id))
|
||
return false;
|
||
//如果上面是常规资源,那么就是可以建设的 return true
|
||
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;
|
||
MapRenderer.Instance.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);
|
||
MapRenderer.Instance.ProjectileManager.CreateProjectile(main,actionParams.MapData,v2,endPos,ProjectileType.Faith,ProjectileMoveType.CoinParabola,score);
|
||
}
|
||
|
||
},
|
||
Table.Instance.AnimDataAssets.ProjectileCityExpMoveTime);
|
||
|
||
//播放雾效和丢出cityexp的动画
|
||
actionParams.GridData.VFXRenderMarkFog = true;
|
||
MapRenderer.Instance.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;
|
||
var grid = actionParam.GridData;
|
||
var map = actionParam.MapData;
|
||
var player = actionParam.PlayerData;
|
||
if (grid == null || map == null || player == null) return false;
|
||
|
||
//如果没有对应科技,return false
|
||
if (!player.TechTree.CheckActionCan(_actionId)) return false;
|
||
//确认grid实际属于的player是谁
|
||
map.GetPlayerDataByTerritoryGridId(actionParam.GridData.Id, out var gridPlayer);
|
||
//如果不在我方领土,return false
|
||
if (gridPlayer == null || player.Id != gridPlayer.Id) return false;
|
||
//钱不够 return
|
||
if (GetCost() > actionParam.PlayerData.PlayerWealth)
|
||
return false;
|
||
//如果有非联盟的敌人站在上面
|
||
if (map.GetUnitDataByGid(grid.Id, out var unit) && !map.CheckUnitIdBelongPlayerIdUnion(unit.Id, player.Id))
|
||
return false;
|
||
|
||
return _actionId.ResourceType == actionParam.GridData.Resource;
|
||
}
|
||
|
||
public override bool CheckShow(CommonActionParams actionParam)
|
||
{
|
||
if (actionParam.MainObjectType != MainObjectType.Grid) return false;
|
||
var grid = actionParam.GridData;
|
||
var map = actionParam.MapData;
|
||
var player = actionParam.PlayerData;
|
||
if (grid == null || map == null || player == null) return false;
|
||
|
||
//如果没有对应科技也会显示 钱不够也会显示
|
||
//确认grid实际属于的player是谁
|
||
map.GetPlayerDataByTerritoryGridId(actionParam.GridData.Id, out var gridPlayer);
|
||
//如果不在我方领土,return false
|
||
if (gridPlayer == null || player.Id != gridPlayer.Id) return false;
|
||
|
||
//如果有非联盟的敌人站在上面
|
||
if (map.GetUnitDataByGid(grid.Id, out var unit) && !map.CheckUnitIdBelongPlayerIdUnion(unit.Id, player.Id))
|
||
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;
|
||
Main.PlayerLogic.UpdateCityConnect(actionParams.MapData,actionParams.PlayerData);
|
||
}
|
||
//处理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 = 1;
|
||
actionParams.GridData.BuildTime = actionParams.PlayerData.Turn;
|
||
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;
|
||
MapRenderer.Instance.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);
|
||
MapRenderer.Instance.ProjectileManager.CreateProjectile(main, actionParams.MapData, v2, endPos,
|
||
ProjectileType.Faith, ProjectileMoveType.CoinParabola, score);
|
||
}
|
||
},
|
||
Table.Instance.AnimDataAssets.ProjectileCityExpMoveTime);
|
||
|
||
//播放雾效和丢出cityexp的动画
|
||
actionParams.GridData.VFXRenderMarkFog = true;
|
||
MapRenderer.Instance.ProjectileManager.CreateProjectileMulti(main,actionParams.MapData,v1,v2,ProjectileType.CityExp,ProjectileMoveType.CityExpHighParabola,cityExp);
|
||
//如果是temple,播放对应faith分特效
|
||
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);
|
||
MapRenderer.Instance.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;
|
||
|
||
//如果有非联盟的敌人站在上面
|
||
if (actionParam.MapData.GetUnitDataByGid(actionParam.GridData.Id, out var unit)
|
||
&& !actionParam.MapData.CheckUnitIdBelongPlayerIdUnion(unit.Id, actionParam.PlayerData.Id))
|
||
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
|
||
&& actionParam.GridData.Resource != ResourceType.Fruit))
|
||
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;
|
||
|
||
//如果有非联盟的敌人站在上面
|
||
if (actionParam.MapData.GetUnitDataByGid(actionParam.GridData.Id, out var unit)
|
||
&& !actionParam.MapData.CheckUnitIdBelongPlayerIdUnion(unit.Id, actionParam.PlayerData.Id))
|
||
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);
|
||
MapRenderer.Instance.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)
|
||
MapRenderer.Instance.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);
|
||
//播放获得钱的动画
|
||
MapRenderer.Instance.ProjectileManager.CreateProjectileMulti(main,actionParams.MapData,startPos,endPos,ProjectileType.Coin,ProjectileMoveType.CoinParabola,10,0.05f);
|
||
//MapRenderer.Instance.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);
|
||
//播放获得钱的动画
|
||
MapRenderer.Instance.ProjectileManager.CreateProjectileMulti(main,actionParams.MapData,startPos,endPos,ProjectileType.Coin,ProjectileMoveType.CoinParabola,10,0.05f);
|
||
//MapRenderer.Instance.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.DamageSettlement(actionParams.MapData,unitA, unitB,6, DamageType.Splash);
|
||
}
|
||
//处理外圈伤害
|
||
if (dis == 2)
|
||
{
|
||
//var damage = Table.Instance.CalcDamage(actionParams.MapData, unitA, unitB,damagePara:0.5f);
|
||
Main.UnitLogic.DamageSettlement(actionParams.MapData,unitA, unitB,3, DamageType.Splash);
|
||
}
|
||
}
|
||
else
|
||
//如果没有单位,造成地块震荡的效果
|
||
{
|
||
//处理动画效果
|
||
MapRenderer.Instance.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秒后自动销毁
|
||
MapRenderer.Instance.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;
|
||
//如果city上有单位,也要更新单位的渲染
|
||
if (actionParams.MapData.GetUnitDataByGid(gridData.Id, out var unit))
|
||
unit.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);
|
||
}
|
||
|
||
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 && MapRenderer.Instance.CameraController != null)
|
||
MapRenderer.Instance.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)
|
||
{
|
||
if (!actionParams.MapData.GetPlayerDataByUnitId(actionParams.UnitData.Id, out _)) return false;
|
||
if (!actionParams.MapData.GetPlayerDataByUnitId(actionParams.TargetUnitData.Id, out _)) return false;
|
||
if (!actionParams.MapData.GetCityDataByUnitId(actionParams.UnitData.Id, out _)) return false;
|
||
if (!actionParams.MapData.GetCityDataByUnitId(actionParams.TargetUnitData.Id, out _)) return false;
|
||
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 && MapRenderer.Instance.CameraController != null)
|
||
MapRenderer.Instance.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;
|
||
var destroyGrid = actionParams.GridData;
|
||
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);
|
||
actionParams.GridData.Resource = actionParams.GridData.ResourceUnderBuilding;
|
||
actionParams.GridData.ResourceUnderBuilding = ResourceType.None;
|
||
|
||
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;
|
||
//播放雾效
|
||
destroyGrid.VFXRenderMarkFog = 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;
|
||
}
|
||
}
|
||
|
||
} |