TH1/Unity/Assets/Scripts/TH1_Logic/Action/GridMiscActionLogic.cs
2026-06-08 11:50:03 +08:00

704 lines
34 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

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

/*
* @Author: 白哉
* @Description: 行为逻辑类
* @Date: 2025年04月10日 星期四 11:04:44
* @Modify:
*/
using System;
using System.Collections.Generic;
using System.Linq;
using Logic.AI;
using 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);
//拥有NapoleonicCode时可在已有建筑上植树不清除Resource
if (!actionParams.GridData.HasBuilding())
actionParams.GridData.Resource = ResourceType.None;
actionParams.GridData.Vegetation = Vegetation.Trees;
actionParams.GridData.Renderer(actionParams.MapData)?.InstantUpdateGrid(true);
//Step #1 处理因为树林变化带来的上方单位防御状态变化的情况
if (actionParams.GridData.VisibleUnit(actionParams.MapData,actionParams.PlayerData,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)?.PlayVFXInSight(new GridVFXParams(GridVFXType.Fog));
}
ReportBoatUnitOnLandAfterGridMisc(actionParams);
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.GridData.VisibleUnit(actionParams.MapData,actionParams.PlayerData, 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)?.PlayVFXInSight(new GridVFXParams(GridVFXType.Fog));
}
ReportBoatUnitOnLandAfterGridMisc(actionParams);
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)?.PlayVFXInSight(new GridVFXParams(GridVFXType.Fog));
}
ReportBoatUnitOnLandAfterGridMisc(actionParams);
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的地块是bridge并且上面有无法visible但是realUnit那么使得该单位揭露
if (actionParams.GridData.Resource == ResourceType.Bridge &&
actionParams.GridData.RealUnit(actionParams.MapData, out var gridUnit))
{
gridUnit.OnBeInteractTarget(actionParams.MapData,gridUnit,actionParams.GridData);
ReportBoatUnitOnLandAfterGridMisc(actionParams);
return true;
}
//更新destroy地块的内容,记录loseExp
var destroyGrid = actionParams.GridData;
//TODO 这里CityExp很危险保护区就吃了亏一定要改为通用方案
var loseExp = actionParams.GridData.CityExp();
var map = actionParams.MapData;
var player = actionParams.PlayerData;
//记录原始的Resource和Feature用来判断是否需要清除Feature.Road并刷新周围格子
//var originalResource = actionParams.GridData.Resource;
//var originalFeature = actionParams.GridData.Feature;
actionParams.GridData.Resource = actionParams.GridData.ResourceUnderBuilding;
actionParams.GridData.ResourceUnderBuilding = ResourceType.None;
actionParams.GridData.buildingLevel = 0;
//如果拆除的是港口/桥梁或者拆除的是单独的Road需要把Feature还原为None
//并刷新周围格子的道路连接图案与BuildActionLogic的port/bridge/road构建对称
/*bool needRefreshAround = originalResource == ResourceType.Port
|| originalResource == ResourceType.Bridge
|| originalFeature == TerrainFeature.Road;
if (needRefreshAround)
{
actionParams.GridData.Feature = TerrainFeature.None;
var aroundBuf = new List<GridData>();
map.GridMap.GetAroundGridData(1, 1, actionParams.GridData, aroundBuf);
foreach (var tgrid in aroundBuf)
tgrid.Renderer(actionParams.MapData)?.InstantUpdateGrid(true);
}*/
//执行城市减去loseExp操作
Main.CityLogic.GridGiveCityExp_LogicView(map, player, destroyGrid, destroyGrid.BelongButNotOnGridCity(map),
-loseExp);
//更新格子的显示
if (actionParams.GridData.InMainSight())
{
actionParams.GridData.Renderer(actionParams.MapData)?.InstantUpdateGrid(true);
actionParams.GridData.Renderer(actionParams.MapData)?.PlayVFXInSight(new GridVFXParams(GridVFXType.Fog));
}
//刷新所有其他格子的情况
Main.PlayerLogic.UpdateTerritoryAllBuildingLevel(map,player.Id);
//刷新所有联通情况
Main.PlayerLogic.UpdateCityConnect(map,player);
//如果上面有unit更新unit的显示
if (actionParams.GridData.VisibleUnit(actionParams.MapData,actionParams.PlayerData, out var unit))
unit.Renderer(actionParams.MapData)?.InstantUpdateUnit(true);
ReportBoatUnitOnLandAfterGridMisc(actionParams);
return true;
}
return false;
}
protected void ReportBoatUnitOnLandAfterGridMisc(CommonActionParams actionParams)
{
try
{
if (actionParams?.MapData == null || actionParams.GridData == null) return;
if (actionParams.GridData.RealUnit(actionParams.MapData, out var unit))
BoatUnitOnLandDiagnostic.ReportIfNeeded(
actionParams.MapData,
unit,
actionParams.GridData,
$"GridMiscAction:{_actionId.GridMiscActionType}");
}
catch (Exception e)
{
LogSystem.LogWarning($"GridMiscAction boat-on-land diagnostic failed: {e}");
}
}
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.GridData.VisibleUnit(actionParams.MapData,actionParams.PlayerData, 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) > actionParams.PlayerData.PlayerCoin)
return false;
//处理grow forest
if (_actionId.GridMiscActionType == GridMiscActionType.GrowForest)
{
if (actionParams.GridData.Terrain != TerrainType.Land) return false;
if (actionParams.GridData.Feature == TerrainFeature.Mountain) return false;
if (actionParams.GridData.Vegetation == Vegetation.Trees) return false;
//常规情况:只能在空地/作物/水果上植树
if (actionParams.GridData.Resource is ResourceType.None or ResourceType.Crop or ResourceType.Fruit)
return true;
//拥有NapoleonicCode时可在平原上的常规建筑、军营、奇观上植树
//含阵营专属建筑RemiliaMilitary、KaguyaFrenchYard
if (actionParams.PlayerData.TechTree.CheckIfHasTechAtom(TechAtom.KaguyaFrenchNapoleonicCode)
&& actionParams.GridData.Resource is ResourceType.Military or ResourceType.Windmill
or ResourceType.Sawmill or ResourceType.Forge or ResourceType.Market or ResourceType.Wonder
or ResourceType.RemiliaMilitary or ResourceType.KaguyaFrenchYard)
return true;
return false;
}
//处理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.GridData.VisibleUnit(actionParams.MapData,actionParams.PlayerData, 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.GridData.VisibleUnit(actionParams.MapData,actionParams.PlayerData, 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)
{
if (actionParams.GridData.Terrain != TerrainType.Land) return false;
if (actionParams.GridData.Feature == TerrainFeature.Mountain) return false;
if (actionParams.GridData.Vegetation == Vegetation.Trees) return false;
//常规情况:只能在空地/作物/水果上植树
if (actionParams.GridData.Resource is ResourceType.None or ResourceType.Crop or ResourceType.Fruit)
return true;
//拥有NapoleonicCode时可在平原上的常规建筑、军营、奇观上植树
//含阵营专属建筑RemiliaMilitary、KaguyaFrenchYard
if (actionParams.PlayerData.TechTree.CheckIfHasTechAtom(TechAtom.KaguyaFrenchNapoleonicCode)
&& actionParams.GridData.Resource is ResourceType.Military or ResourceType.Windmill
or ResourceType.Sawmill or ResourceType.Forge or ResourceType.Market or ResourceType.Wonder
or ResourceType.RemiliaMilitary or ResourceType.KaguyaFrenchYard)
return true;
return false;
}
//处理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.GridData.VisibleUnit(actionParams.MapData,actionParams.PlayerData, 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(actionParam) < 0) return false;
actionParam.PlayerData.SpendCoin(GetCost(actionParam));
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)
{
//否则走这里
if (GetCost(actionParam) > 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.GridData.VisibleUnit(actionParam.MapData,actionParam.PlayerData, 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 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.ResourceUnderBuilding = 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.GridData.VisibleUnit(actionParams.MapData,actionParams.PlayerData, out var unit))
unit.Renderer(actionParams.MapData)?.InstantUpdateUnit(true);
//Step #4 更改视觉
actionParams.GridData.Renderer(actionParams.MapData)?.InstantUpdateGrid(true);
actionParams.GridData.Renderer(actionParams.MapData)?.PlayVFXInSight(new GridVFXParams(GridVFXType.Fog));
//step #5 扣钱
actionParams.PlayerData.SpendCoin(GetCost(actionParams));
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>() { 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)?.PlayVFXInSight(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.GridData.VisibleUnit(actionParams.MapData,actionParams.PlayerData, 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)?.PlayVFXInSight(new GridVFXParams(GridVFXType.Fog));
//Step #5 更新所有建筑的情况(因为会影响学院)
Main.PlayerLogic.UpdateTerritoryAllBuildingLevel(actionParams.MapData,actionParams.PlayerData.Id);
//step #6 扣钱
actionParams.PlayerData.SpendCoin(GetCost(actionParams));
actionParams.PlayerData.PlayerMountainPointUsed++;
ReportBoatUnitOnLandAfterGridMisc(actionParams);
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)?.PlayVFXInSight(new GridVFXParams(GridVFXType.Fog));
}
//step #3 加钱
actionParams.PlayerData.AddCoin(-GetCost(actionParams),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);
}
}
}