/* * @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 TH1_Anim.Fragments; using TH1_Core.Managers; using TH1_Logic.Core; using UnityEngine; using TH1Renderer; using TH1Resource; public enum GridMiscActionType { None, GrowForest, ClearForest, BurnForest, Destroy, UpgradeTemple, GrowForestOutside, CreateMountain, SellMetal, } //这里是所有BuildAction派生子类的实现模块 namespace Logic.Action { //GridMisc行为逻辑类,包括Destroy, ClearForest GrowForest BurnForest public class GridMiscAction : ActionLogicBase { public GridMiscAction(CommonActionId id) : base(id) { } protected 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; if (!CheckCan(actionParams)) return false; //处理grow forest if (_actionId.GridMiscActionType == GridMiscActionType.GrowForest) { actionParams.PlayerData.SpendCoin( actionInfo.Cost); actionParams.GridData.Resource = ResourceType.None; actionParams.GridData.Vegetation = Vegetation.Trees; actionParams.GridData.Renderer(actionParams.MapData)?.InstantUpdateGrid(true); //Step #1 处理因为树林变化带来的上方单位防御状态变化的情况 if (actionParams.MapData.GetUnitDataByGid(actionParams.GridData.Id, out var unit)) unit.Renderer(actionParams.MapData)?.InstantUpdateUnit(true); //Step #2 如果player拥有bambooMove技能,更新城市连通性 if (actionParams.PlayerData.TechTree.CheckIfHasTechAtom(TechAtom.KaguyaFrenchBambooMove)) Main.PlayerLogic.UpdateCityConnect(actionParams.MapData,actionParams.PlayerData); //Step #3 更新所有领土内的levelbuilding Main.PlayerLogic.UpdateTerritoryAllBuildingLevel(actionParams.MapData,actionParams.PlayerData.Id); if (actionParams.GridData.InMainSight()) { actionParams.GridData.Renderer(actionParams.MapData)?.InstantUpdateGrid(true); actionParams.GridData.Renderer(actionParams.MapData)?.PlayVFX(new GridVFXParams(GridVFXType.Fog)); } return true; } //处理clear forest if (_actionId.GridMiscActionType == GridMiscActionType.ClearForest) { actionParams.PlayerData.AddCoin( - actionInfo.Cost,actionParams.GridData); actionParams.GridData.Resource = ResourceType.None; actionParams.GridData.Vegetation = Vegetation.None; actionParams.GridData.Renderer(actionParams.MapData)?.InstantUpdateGrid(true); //处理因为树林变化带来的上方单位防御状态变化的情况 if (actionParams.MapData.GetUnitDataByGid(actionParams.GridData.Id, out var unit)) unit.Renderer(actionParams.MapData)?.InstantUpdateUnit(true); //更新所有领土内的levelbuilding Main.PlayerLogic.UpdateTerritoryAllBuildingLevel(actionParams.MapData,actionParams.PlayerData.Id); if (actionParams.GridData.InMainSight()) { actionParams.GridData.Renderer(actionParams.MapData)?.InstantUpdateGrid(true); actionParams.GridData.Renderer(actionParams.MapData)?.PlayVFX(new GridVFXParams(GridVFXType.Fog)); } return true; } //处理 burn forest if (_actionId.GridMiscActionType == GridMiscActionType.BurnForest) { actionParams.PlayerData.SpendCoin(actionInfo.Cost); actionParams.GridData.Vegetation = Vegetation.None; actionParams.GridData.Resource = ResourceType.Crop; actionParams.GridData.Renderer(actionParams.MapData)?.InstantUpdateGrid(true); //更新所有领土内的levelbuilding Main.PlayerLogic.UpdateTerritoryAllBuildingLevel(actionParams.MapData,actionParams.PlayerData.Id); if (actionParams.GridData.InMainSight()) { actionParams.GridData.Renderer(actionParams.MapData)?.InstantUpdateGrid(true); actionParams.GridData.Renderer(actionParams.MapData)?.PlayVFX(new GridVFXParams(GridVFXType.Fog)); } return true; } //TODO Destroy整个改成更鲁棒的写法,不要逐一判断了,全部刷一遍levelbuilding就行了 //处理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; //更新destroy地块的内容,记录loseExp var destroyGrid = actionParams.GridData; var loseExp = actionParams.GridData.CityExp(); var map = actionParams.MapData; var player = actionParams.PlayerData; actionParams.GridData.Resource = actionParams.GridData.ResourceUnderBuilding; actionParams.GridData.ResourceUnderBuilding = ResourceType.None; actionParams.GridData.buildingLevel = 0; //执行城市减去loseExp操作 Main.CityLogic.GridGiveCityExp_LogicView(map, player, destroyGrid, destroyGrid.City(map), -loseExp); //更新格子的显示 if (actionParams.GridData.InMainSight()) { actionParams.GridData.Renderer(actionParams.MapData)?.InstantUpdateGrid(true); actionParams.GridData.Renderer(actionParams.MapData)?.PlayVFX(new GridVFXParams(GridVFXType.Fog)); } //刷新所有其他格子的情况 Main.PlayerLogic.UpdateTerritoryAllBuildingLevel(map,player.Id); //刷新所有联通情况 Main.PlayerLogic.UpdateCityConnect(map,player); //如果上面有unit,更新unit的显示 if (actionParams.MapData.GetUnitDataByGid(actionParams.GridData.Id, out var unit)) unit.Renderer(actionParams.MapData)?.InstantUpdateUnit(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.GetUnitDataByGid(actionParams.GridData.Id, out var unit) && !actionParams.MapData.CheckUnitIdBelongPlayerIdUnion(unit.Id, actionParams.PlayerData.Id)) 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.PlayerCoin) 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; if (actionParams.GridData.Vegetation == Vegetation.Trees) 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(!Table.Instance.GridAndResourceDataAssets.CheckCanBeDestroy(actionParams.GridData.Resource)) return false; //如果是桥梁,上面不能有只能站在陆地上的我方人 if (actionParams.GridData.Resource is ResourceType.Bridge && actionParams.MapData.GetUnitDataByGid( actionParams.GridData.Id, out var gridUnit) && Table.Instance.UnitTypeDataAssets .GetUnitTypeInfo(gridUnit.UnitFullType, out var unitTypeInfo)) { if(unitTypeInfo.LandType == LandType.LandOnly || unitTypeInfo.LandType == LandType.LandAndPort) return false; } return true; } return false; } public override bool CheckShow(CommonActionParams actionParams,out ShowType showType) { showType = ShowType.None; //如果是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.GetUnitDataByGid(actionParams.GridData.Id, out var unit) && !actionParams.MapData.CheckUnitIdBelongPlayerIdUnion(unit.Id, actionParams.PlayerData.Id)) 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; //CheckShow 不需要判断金钱够不够 //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; if (actionParams.GridData.Vegetation == Vegetation.Trees) 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(!Table.Instance.GridAndResourceDataAssets.CheckCanBeDestroy(actionParams.GridData.Resource)) return false; //如果是桥梁,上面不能有只能站在陆地上的我方人 if (actionParams.GridData.Resource is ResourceType.Bridge && actionParams.MapData.GetUnitDataByGid( actionParams.GridData.Id, out var gridUnit) && Table.Instance.UnitTypeDataAssets .GetUnitTypeInfo(gridUnit.UnitFullType, out var unitTypeInfo)) { if(unitTypeInfo.LandType == LandType.LandOnly || unitTypeInfo.LandType == LandType.LandAndPort) return false; } return true; } return false; } //付钱 protected bool GridMiscActionPayMoney(CommonActionParams actionParam) { if (actionParam.PlayerData.PlayerCoin - GetCost() < 0) return false; actionParam.PlayerData.SpendCoin(GetCost()); return true; } //确认是否满足基本信息 protected bool GridMiscActionCheckBaseInfo(CommonActionParams actionParam) { //如果是unit或者city来执行gridMisc操作,直接return false if (actionParam.MainObjectType != MainObjectType.Grid) return false; if (actionParam.GridData == null) return false; return true; } //确认是否有科技 protected bool GridMiscActionCheckHasTech(CommonActionParams actionParam) { //如果没有对应科技,return false if (!actionParam.PlayerData.TechTree.CheckActionCan(_actionId)) return false; return true; } //确认是否有钱 protected bool GridMiscActionCheckHasMoney(CommonActionParams actionParam) { //如果是upgradeTemple这种带参数的gridMisc,走这里 if (_actionId.GridMiscActionType == GridMiscActionType.UpgradeTemple) { if (GetCost(actionParam.GridData.buildingLevel) > actionParam.PlayerData.PlayerCoin) return false; return true; } //否则走这里 if (GetCost() > actionParam.PlayerData.PlayerCoin) return false; return true; } //确认是否在自己领土 protected bool GridMiscActionCheckInTerritory(CommonActionParams actionParam) { //如果在有主领土,判断是敌人还是自己 if (actionParam.MapData.GetPlayerDataByTerritoryGridId(actionParam.GridData.Id, out var playerData) && playerData == actionParam.PlayerData) return true; return false; } //确认是否有敌人占领 protected bool GridMiscActionCheckEnemyOccupy(CommonActionParams actionParam) { //如果有非联盟的敌人站在上面 if (actionParam.MapData.GetUnitDataByGid(actionParam.GridData.Id, out var unit) && !actionParam.MapData.CheckUnitIdBelongPlayerIdUnion(unit.Id, actionParam.PlayerData.Id)) return true; return false; } //确认该城市的唯一性并获得对应的building level protected bool GridMiscActionCheckHasOne(CommonActionParams actionParam,out int level) { if(actionParam.MapData.GetCityDataByTerritoryGid(actionParam.GridData.Id,out var city) && Main.CityLogic.GetBuildingLevelByCity(actionParam.MapData,city,_actionId.ResourceType,out level)) return true; level = 0; return false; } } public class GridMiscActionUpgradeTemple : GridMiscAction { public GridMiscActionUpgradeTemple(CommonActionId id) : base(id) { } protected override bool Execute(CommonActionParams actionParams) { if (!CheckCan(actionParams)) return false; //step #1 扣钱 actionParams.PlayerData.SpendCoin(GetCost(actionParams.GridData.buildingLevel)); //step #2 办事 升级temple actionParams.GridData.buildingLevel++; if (Main.MapData.IsCurrentShowMap()) PresentationManager.EnqueueGridUpdate(actionParams.MapData,actionParams.GridData,GridUpdateType.BuildingUpdate); return true; } public override bool CheckCan(CommonActionParams actionParam) { //step #1 check基本信息 if (!GridMiscActionCheckBaseInfo(actionParam)) return false; //Step #2 check是否是temple if (!(actionParam.GridData.Resource is ResourceType.Temple or ResourceType.KingTemple or ResourceType.MountainTemple or ResourceType.WaterTemple or ResourceType.ForestTemple)) return false; //step #3 check是否有科技 if (!GridMiscActionCheckHasTech(actionParam)) return false; //step #4 check是否有钱 if (!GridMiscActionCheckHasMoney(actionParam)) return false; //step #5 check是否在我方领土 if (!GridMiscActionCheckInTerritory(actionParam)) return false; //step #6 check是否有敌人占领 if (GridMiscActionCheckEnemyOccupy(actionParam)) return false; //step #7 check 是否已经满级 if (actionParam.GridData.buildingLevel >= 5) return false; return true; } public override bool CheckShow(CommonActionParams actionParam,out ShowType showType) { showType = ShowType.None; //step #1 check基本信息 if (!GridMiscActionCheckBaseInfo(actionParam)) return false; //Step #2 check是否是temple if (!(actionParam.GridData.Resource is ResourceType.Temple or ResourceType.KingTemple or ResourceType.MountainTemple or ResourceType.WaterTemple or ResourceType.ForestTemple)) return false; //step #3 check是否有科技 if (!GridMiscActionCheckHasTech(actionParam)) return false; //step #4 check是否有钱 //if (!GridMiscActionCheckHasMoney(actionParam)) return false; //step #5 check是否在我方领土 if (!GridMiscActionCheckInTerritory(actionParam)) return false; //step #6 check是否有敌人占领 if (GridMiscActionCheckEnemyOccupy(actionParam)) return false; //step #7 check 是否已经满级 if (actionParam.GridData.buildingLevel >= 5) return false; return true; } } public class GridMiscActionGrowTreeOutside : GridMiscAction { public GridMiscActionGrowTreeOutside(CommonActionId id) : base(id) { } protected override bool Execute(CommonActionParams actionParams) { //if (!CheckCan(actionParams)) return false; //step #1 办事 种树 actionParams.GridData.Resource = ResourceType.None; actionParams.GridData.Vegetation = Vegetation.Trees; //Step #2 如果player拥有bambooMove技能,更新城市连通性 if (actionParams.PlayerData.TechTree.CheckIfHasTechAtom(TechAtom.KaguyaFrenchBambooMove)) Main.PlayerLogic.UpdateCityConnect(actionParams.MapData,actionParams.PlayerData); //Step #3 处理因为树林变化带来的上方单位防御状态变化的情况 if (actionParams.MapData.GetUnitDataByGid(actionParams.GridData.Id, out var unit)) unit.Renderer(actionParams.MapData)?.InstantUpdateUnit(true); //Step #4 更改视觉 actionParams.GridData.Renderer(actionParams.MapData)?.InstantUpdateGrid(true); actionParams.GridData.Renderer(actionParams.MapData)?.PlayVFX(new GridVFXParams(GridVFXType.Fog)); //step #5 扣钱 actionParams.PlayerData.SpendCoin(GetCost()); return true; } public override bool CheckCan(CommonActionParams actionParam) { //step #1 check基本信息 if (!GridMiscActionCheckBaseInfo(actionParam)) return false; //Step #2 check是否是中立领土,且terrain必须是land,Vegetarion必须是none,feature 必须不是mountain,resource只能是none fruit crop if (actionParam.MapData.GetPlayerDataByTerritoryGridId(actionParam.GridId, out var _)) return false; if (actionParam.GridData.Terrain != TerrainType.Land) return false; if (actionParam.GridData.Feature == TerrainFeature.Mountain) return false; if (!(actionParam.GridData.Resource is ResourceType.None or ResourceType.Fruit or ResourceType.Crop)) return false; if (actionParam.GridData.Vegetation == Vegetation.Trees) return false; //Step #3 if (!GridMiscActionCheckHasTech(actionParam)) return false; //step #4 check是否有钱 if (!GridMiscActionCheckHasMoney(actionParam)) return false; //step #5 check是否有敌人占领 if (GridMiscActionCheckEnemyOccupy(actionParam)) return false; return true; } public override bool CheckShow(CommonActionParams actionParam,out ShowType showType) { showType = ShowType.None; //step #1 check基本信息 if (!GridMiscActionCheckBaseInfo(actionParam)) return false; //Step #2 check是否是中立领土,且terrain必须是land,Vegetarion必须是none,feature 必须不是mountain,resource只能是none fruit crop if (actionParam.MapData.GetPlayerDataByTerritoryGridId(actionParam.GridId, out var _)) return false; if (actionParam.GridData.Terrain != TerrainType.Land) return false; if (actionParam.GridData.Feature == TerrainFeature.Mountain) return false; if (!(actionParam.GridData.Resource is ResourceType.None or ResourceType.Fruit or ResourceType.Crop)) return false; if (actionParam.GridData.Vegetation == Vegetation.Trees) return false; //Step #3 if (!GridMiscActionCheckHasTech(actionParam)) return false; //step #4 check是否有钱 这步不需要,没钱也可以show //if (!GridMiscActionCheckHasMoney(actionParam)) return false; //step #5 check是否有敌人占领 if (GridMiscActionCheckEnemyOccupy(actionParam)) return false; return true; } } public class GridMiscActionCreateMountain : GridMiscAction { public GridMiscActionCreateMountain(CommonActionId id) : base(id) { } protected override bool Execute(CommonActionParams actionParams) { //step #1 办事 造山 var road = (actionParams.GridData.Feature == TerrainFeature.Road); if (actionParams.GridData.Terrain != TerrainType.Land) { actionParams.GridData.Terrain = TerrainType.Land; var dir4 = new List() { Vector2.up, Vector2.left, Vector2.down, Vector2.right }; var cur = actionParams.GridData.Pos.V2(); foreach (var dir in dir4) { if (!actionParams.MapData.GridMap.GetGridDataByV2(cur + dir, out var grid)) continue; if (grid.Terrain == TerrainType.DeepSea) { grid.Terrain = TerrainType.ShallowSea; grid.Renderer(actionParams.MapData)?.InstantUpdateGrid(true); grid.Renderer(actionParams.MapData)?.PlayVFX(new GridVFXParams(GridVFXType.Fog)); } } } actionParams.GridData.Feature = TerrainFeature.Mountain; if (actionParams.GridData.Resource == ResourceType.Crop) actionParams.GridData.Resource = ResourceType.Metal; else { actionParams.GridData.Resource = ResourceType.None; var rd = actionParams.MapData.Net.GetRandom(actionParams.MapData).Next(0, 100); if(rd <= 9) actionParams.GridData.Resource = ResourceType.Metal; } //Step #2 如果原本这里有road,更新连通性 if (road) Main.PlayerLogic.UpdateCityConnect(actionParams.MapData,actionParams.PlayerData); //Step #3 处理因为变成山脉后,防御情况和视野情况 if (actionParams.MapData.GetUnitDataByGid(actionParams.GridData.Id, out var unit)) { unit.Renderer(actionParams.MapData)?.InstantUpdateUnit(true); //该unit更新他自己player的sight var count = Main.PlayerLogic.UpdateSightByRadius_LogicView(actionParams.MapData,unit.Player(actionParams.MapData),unit.Grid(actionParams.MapData),unit.GetSightRange(actionParams.MapData)); //更新对应的heroTask unit.HeroTask(actionParams.MapData)?.OnExploredGrids(actionParams.MapData, unit, count); } //Step #4 更改视觉 actionParams.GridData.Renderer(actionParams.MapData)?.InstantUpdateGrid(true); actionParams.GridData.Renderer(actionParams.MapData)?.PlayVFX(new GridVFXParams(GridVFXType.Fog)); //Step #5 更新所有建筑的情况(因为会影响学院) Main.PlayerLogic.UpdateTerritoryAllBuildingLevel(actionParams.MapData,actionParams.PlayerData.Id); //step #6 扣钱 actionParams.PlayerData.SpendCoin(GetCost()); actionParams.PlayerData.PlayerMountainPointUsed++; return true; } public override bool CheckCan(CommonActionParams actionParam) { //step #1 check基本信息 if (!GridMiscActionCheckBaseInfo(actionParam)) return false; //Step #2 check是否是我方领土,并且必须没有建筑,并且不能已经是山,不能有树 if (actionParam.GridData.Player(actionParam.MapData) != actionParam.PlayerData) return false; if (actionParam.GridData.HasBuilding()) return false; if (actionParam.GridData.Feature == TerrainFeature.Mountain) return false; if (actionParam.GridData.Vegetation == Vegetation.Trees) return false; //Step #3 确认是否有科技 if (!GridMiscActionCheckHasTech(actionParam)) return false; //step #4 check是否有造山点 var mp =Main.PlayerLogic.GetPlayerMountainPoint(actionParam.MapData, actionParam.PlayerId); if (actionParam.PlayerData.PlayerMountainPointUsed >= mp) return false; //step #5 check是否有钱 if (!GridMiscActionCheckHasMoney(actionParam)) return false; //step #6 如果是水中造山,必须有techatom山海奇迹 if (actionParam.GridData.Terrain != TerrainType.Land && !actionParam.PlayerData.TechTree.CheckIfHasTechAtom(TechAtom.CreateMountainWater)) return false; //step #7 check是否有敌人占领 if (GridMiscActionCheckEnemyOccupy(actionParam)) return false; return true; } public override bool CheckShow(CommonActionParams actionParam,out ShowType showType) { showType = ShowType.None; //step #1 check基本信息 if (!GridMiscActionCheckBaseInfo(actionParam)) return false; //Step #2 check是否是我方领土,并且必须没有建筑,并且不能已经是山,不能有树 if (actionParam.GridData.Player(actionParam.MapData) != actionParam.PlayerData) return false; if (actionParam.GridData.HasBuilding()) return false; if (actionParam.GridData.Feature == TerrainFeature.Mountain) return false; if (actionParam.GridData.Vegetation == Vegetation.Trees) return false; //Step #3 确认是否有科技 if (!GridMiscActionCheckHasTech(actionParam)) return false; //step #4 如果是水中造山,必须有techatom山海奇迹 if (actionParam.GridData.Terrain != TerrainType.Land && !actionParam.PlayerData.TechTree.CheckIfHasTechAtom(TechAtom.CreateMountainWater)) return false; //step #5 check是否有钱 if (!GridMiscActionCheckHasMoney(actionParam)) showType = ShowType.Cost; //step #6 check是否有造山点 var mp =Main.PlayerLogic.GetPlayerMountainPoint(actionParam.MapData, actionParam.PlayerId); if (actionParam.PlayerData.PlayerMountainPointUsed >= mp) showType = ShowType.Locked; //step #7 check是否有敌人占领 if (GridMiscActionCheckEnemyOccupy(actionParam)) return false; return true; } } public class GridMiscActionSellMetal : GridMiscAction { public GridMiscActionSellMetal(CommonActionId id) : base(id) { } protected override bool Execute(CommonActionParams actionParams) { //step #1 办事 收矿 actionParams.GridData.Resource = ResourceType.None; //Step #2 更改视觉 if (actionParams.GridData.InMainSight()) { actionParams.GridData.Renderer(actionParams.MapData)?.InstantUpdateGrid(true); actionParams.GridData.Renderer(actionParams.MapData)?.PlayVFX(new GridVFXParams(GridVFXType.Fog)); } //step #3 加钱 actionParams.PlayerData.AddCoin(-GetCost(),actionParams.GridData); return true; } public override bool CheckCan(CommonActionParams actionParam) { //step #1 check基本信息 if (!GridMiscActionCheckBaseInfo(actionParam)) return false; //Step #2 check是否是我方领土,并且必须是Metal if (actionParam.GridData.Player(actionParam.MapData) != actionParam.PlayerData) return false; if (actionParam.GridData.Resource != ResourceType.Metal) return false; //Step #3 确认是否有科技 if (!GridMiscActionCheckHasTech(actionParam)) return false; //step #4 check是否有敌人占领 if (GridMiscActionCheckEnemyOccupy(actionParam)) return false; return true; } public override bool CheckShow(CommonActionParams actionParam,out ShowType showType) { showType = ShowType.None; return CheckCan(actionParam); } } }