TH1/Unity/Assets/Scripts/TH1_Logic/Action/BuildActionLogic.cs
2026-06-13 20:34:55 +08:00

1366 lines
65 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 ParadoxNotion;
using RuntimeData;
using TH1_Anim;
using TH1_Anim.Fragments;
using TH1_Core.Managers;
using TH1_Logic.Core;
using TH1_Presentation.Sequencer.Task;
using UnityEngine;
using TH1Renderer;
//这里是所有BuildAction派生子类的实现模块
namespace Logic.Action
{
// Build 建造逻辑类
public class BuildAction : ActionLogicBase
{
public BuildAction(CommonActionId id) : base(id)
{
}
protected override bool Execute(CommonActionParams actionParams)
{
//Step #1鲁棒性用
if (!CheckCan(actionParams)) return false;
if (TryRevealHiddenEnemyUnitOnMilitaryBuild(actionParams)) return false;
CityData cityData = actionParams.CityData;
if (cityData == null) actionParams.MapData.GetCityDataByTerritoryGid(actionParams.GridData.Id,out cityData);
//Step #2 扣钱,收获资产,把资产送往city
actionParams.PlayerData.SpendCoin(GetCost(actionParams));
int cityExp = 0;
//处理farm、mine、lumberhut
if (_actionId.ResourceType is ResourceType.Farm or ResourceType.Mine or ResourceType.LumberHut)
{
cityExp = Table.Instance.QueryActionExp(_actionId);
actionParams.GridData.ResourceUnderBuilding = actionParams.GridData.Resource;
actionParams.GridData.Resource = _actionId.ResourceType;
actionParams.GridData.Renderer(actionParams.MapData)?.InstantUpdateGrid(true);
}
//处理windmill sawmill forge market
else if (_actionId.ResourceType is ResourceType.Windmill or ResourceType.Forge or ResourceType.Sawmill or ResourceType.Market )
{
if(actionParams.GridData.Resource != ResourceType.None)
actionParams.GridData.ResourceUnderBuilding = actionParams.GridData.Resource;
actionParams.GridData.Resource = _actionId.ResourceType;
actionParams.GridData.Renderer(actionParams.MapData)?.InstantUpdateGrid(true);
Main.CityLogic.CalcGridBuildingLevel(actionParams.MapData,actionParams.GridData, _actionId.ResourceType,out var buildingLevel);
actionParams.GridData.buildingLevel = buildingLevel;
cityExp = buildingLevel * (_actionId.ResourceType == ResourceType.Forge ? 2 : 1);
if (_actionId.ResourceType == ResourceType.Market) cityExp = 0;
}
//处理port
else if (_actionId.ResourceType is ResourceType.Port)
{
cityExp = Table.Instance.QueryActionExp(_actionId);
actionParams.GridData.ResourceUnderBuilding = actionParams.GridData.Resource;
actionParams.GridData.Resource = _actionId.ResourceType;
//港口会自动设置格子的feature为road
actionParams.GridData.Feature = TerrainFeature.Road;
//更新周围各自的道路图案
_sharedAroundBuf ??= new List<GridData>();
_sharedAroundBuf.Clear();
actionParams.MapData.GridMap.GetAroundGridData(1, 1, actionParams.GridData, _sharedAroundBuf);
foreach (var tgrid in _sharedAroundBuf)
tgrid.Renderer(actionParams.MapData)?.InstantUpdateGrid(true);
}
//处理bridge或者road
else if (_actionId.ResourceType == ResourceType.Bridge || _actionId.FeatureType == TerrainFeature.Road )
{
actionParams.GridData.Feature = TerrainFeature.Road;
if(_actionId.ResourceType == ResourceType.Bridge)
actionParams.GridData.Resource = ResourceType.Bridge;
//更新周围各自的道路图案
_sharedAroundBuf ??= new List<GridData>();
_sharedAroundBuf.Clear();
actionParams.MapData.GridMap.GetAroundGridData(1, 1, actionParams.GridData, _sharedAroundBuf);
foreach (var tgrid in _sharedAroundBuf)
tgrid.Renderer(actionParams.MapData)?.InstantUpdateGrid(true);
}
//处理temple
else if (_actionId.ResourceType == ResourceType.Temple
|| _actionId.ResourceType == ResourceType.ForestTemple
|| _actionId.ResourceType == ResourceType.WaterTemple
|| _actionId.ResourceType == ResourceType.MountainTemple
|| _actionId.ResourceType == ResourceType.KingTemple)
{
cityExp = Table.Instance.QueryActionExp(_actionId);
actionParams.GridData.ResourceUnderBuilding = actionParams.GridData.Resource;
actionParams.GridData.Resource = _actionId.ResourceType;
actionParams.GridData.buildingLevel = 1;
actionParams.GridData.BuildTime = actionParams.PlayerData.Turn;
actionParams.GridData.Renderer(actionParams.MapData)?.InstantUpdateGrid(true);
}
else if (_actionId.ResourceType == ResourceType.Military)
{
cityExp = Table.Instance.QueryActionExp(_actionId);
actionParams.GridData.ResourceUnderBuilding = actionParams.GridData.Resource;
actionParams.GridData.Resource = _actionId.ResourceType;
actionParams.GridData.Renderer(actionParams.MapData)?.InstantUpdateGrid(true);
//如果有人站在军营上要更新他的renderMark
if (actionParams.GridData.VisibleUnit(actionParams.MapData,actionParams.PlayerData, out var unit))
unit.Renderer(actionParams.MapData)?.InstantUpdateUnit(true);
}
else if (_actionId.ResourceType == ResourceType.Academy)
{
Main.CityLogic.CalcGridBuildingLevel(actionParams.MapData,actionParams.GridData, _actionId.ResourceType,out var buildingLevel);
actionParams.GridData.buildingLevel = buildingLevel;
cityExp = Table.Instance.QueryActionExp(_actionId);
actionParams.GridData.ResourceUnderBuilding = actionParams.GridData.Resource;
actionParams.GridData.Resource = _actionId.ResourceType;
}
//Step #5 处理当前格子的视觉
Main.CityLogic.UpdateGrid_ViewOnly(actionParams.MapData,actionParams.GridData);
//Step #6 处理cityExp获取相关
Main.CityLogic.GridGiveCityExp_LogicView(actionParams.MapData,actionParams.PlayerData,actionParams.GridData,cityData,cityExp);
//Step #7 重新计算所有领土上的buildinglevel并跟随相应动画
Main.PlayerLogic.UpdateTerritoryAllBuildingLevel(actionParams.MapData,actionParams.PlayerData.Id);
//Step #8 重新计算连通性
Main.PlayerLogic.UpdateCityConnect(actionParams.MapData,actionParams.PlayerData);
ReportBoatUnitOnLandAfterBuild(actionParams);
return true;
}
protected void ReportBoatUnitOnLandAfterBuild(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,
$"BuildAction:{_actionId.ResourceType}/{_actionId.FeatureType}");
}
catch (Exception e)
{
LogSystem.LogWarning($"BuildAction boat-on-land diagnostic failed: {e}");
}
}
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) > actionParam.PlayerData.PlayerCoin)
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.GridData.VisibleUnit(actionParam.MapData,actionParam.PlayerData, 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 is ResourceType.None or ResourceType.Fish or ResourceType.Starfish))
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;
}
//-------- 再处理直接建设的建筑
//处理学院
if (_actionId.ResourceType == ResourceType.Academy)
{
//确认city是否已经有一个对应的特殊建筑
if(actionParam.MapData.GetCityDataByTerritoryGid(actionParam.GridData.Id,out var academyCity)
&& Main.CityLogic.GetBuildingLevelByCity(actionParam.MapData,academyCity,_actionId.ResourceType,out var academyLevel))
return false;
//必须是没有其他建筑的山脉
if (actionParam.GridData.Feature == TerrainFeature.Mountain
&& actionParam.GridData.Resource is ResourceType.None or ResourceType.Metal)
return true;
return false;
}
//处理军营
if (_actionId.ResourceType == ResourceType.Military)
{
//确认city是否已经有一个军营类建筑
if(actionParam.MapData.GetCityDataByTerritoryGid(actionParam.GridData.Id,out var militaryCity)
&& Main.CityLogic.GetMilitaryBuildingLevelByCity(actionParam.MapData,militaryCity,out var militaryLevel))
return false;
//必须是没有其他建筑的无树林平地拥有NapoleonicCode可在森林建造且允许Animal
bool militaryAllowForest = actionParam.PlayerData.TechTree.CheckIfHasTechAtom(TechAtom.KaguyaFrenchNapoleonicCode);
if (actionParam.GridData.Terrain == TerrainType.Land
&& actionParam.GridData.Feature != TerrainFeature.Mountain
&& (actionParam.GridData.Vegetation != Vegetation.Trees || militaryAllowForest)
&& (actionParam.GridData.Resource is ResourceType.None or ResourceType.Fruit or ResourceType.Crop
|| (militaryAllowForest && actionParam.GridData.Resource == ResourceType.Animal)))
return true;
return false;
}
//处理port
if (_actionId.ResourceType == ResourceType.Port)
{
//如果不是none或者fish的浅水直接return false
if (actionParam.GridData.Terrain != TerrainType.ShallowSea)
return false;
if(actionParam.GridData.Resource is ResourceType.None or ResourceType.Fish or ResourceType.Starfish)
return true;
return false;
}
//剩下windmill sawmill forge market四天王先确定平地情况
if (actionParam.GridData.Terrain != TerrainType.Land
|| (actionParam.GridData.Feature == TerrainFeature.Mountain)
|| (actionParam.GridData.HasBuilding()))
return false;
//森林上不能造冶炼厂以外的market sawmill windmill拥有NapoleonicCode可在森林建造
bool allowForest = actionParam.PlayerData.TechTree.CheckIfHasTechAtom(TechAtom.KaguyaFrenchNapoleonicCode);
if (actionParam.GridData.Vegetation == Vegetation.Trees && _actionId.ResourceType != ResourceType.Forge && !allowForest)
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,out ShowType showType)
{
showType = ShowType.None;
//如果是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.GridData.VisibleUnit(actionParam.MapData,actionParam.PlayerData, 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 is ResourceType.None or ResourceType.Fish or ResourceType.Starfish))
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;
}
//-------- 再处理直接建设的建筑
//处理学院
if (_actionId.ResourceType == ResourceType.Academy)
{
//确认city是否已经有一个对应的特殊建筑
if(actionParam.MapData.GetCityDataByTerritoryGid(actionParam.GridData.Id,out var academyCity)
&& Main.CityLogic.GetBuildingLevelByCity(actionParam.MapData,academyCity,_actionId.ResourceType,out var academyLevel))
return false;
//必须是没有其他建筑的山脉
if (actionParam.GridData.Feature == TerrainFeature.Mountain
&& actionParam.GridData.Resource is ResourceType.None or ResourceType.Metal)
return true;
return false;
}
//处理军营
if (_actionId.ResourceType == ResourceType.Military)
{
//确认city是否已经有一个军营类建筑
if(actionParam.MapData.GetCityDataByTerritoryGid(actionParam.GridData.Id,out var militaryCity)
&& Main.CityLogic.GetMilitaryBuildingLevelByCity(actionParam.MapData,militaryCity,out var militaryLevel))
return false;
//必须是没有其他建筑的无树林平地拥有NapoleonicCode可在森林建造且允许Animal
bool militaryShowAllowForest = actionParam.PlayerData.TechTree.CheckIfHasTechAtom(TechAtom.KaguyaFrenchNapoleonicCode);
if (actionParam.GridData.Terrain == TerrainType.Land
&& actionParam.GridData.Feature != TerrainFeature.Mountain
&& (actionParam.GridData.Vegetation != Vegetation.Trees || militaryShowAllowForest)
&& (actionParam.GridData.Resource is ResourceType.None or ResourceType.Fruit or ResourceType.Crop
|| (militaryShowAllowForest && actionParam.GridData.Resource == ResourceType.Animal)))
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)
return false;
if(actionParam.GridData.Resource is ResourceType.None or ResourceType.Fish or ResourceType.Starfish)
return true;
return false;
}
//剩下windmill sawmill forge market四天王先确定平地情况
if (actionParam.GridData.Terrain != TerrainType.Land
|| (actionParam.GridData.Feature == TerrainFeature.Mountain)
|| (actionParam.GridData.HasBuilding()))
return false;
//森林上不能造冶炼厂以外的market sawmill windmill拥有NapoleonicCode可在森林建造
bool showAllowForest = actionParam.PlayerData.TechTree.CheckIfHasTechAtom(TechAtom.KaguyaFrenchNapoleonicCode);
if (actionParam.GridData.Vegetation == Vegetation.Trees && _actionId.ResourceType != ResourceType.Forge && !showAllowForest)
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;
}
//付钱
protected bool BuildActionPayMoney(CommonActionParams actionParam)
{
if (actionParam.PlayerData.PlayerCoin - GetCost(actionParam) < 0) return false;
actionParam.PlayerData.SpendCoin(GetCost(actionParam));
return true;
}
//确认是否满足基本信息
protected bool BuildActionCheckBaseInfo(CommonActionParams actionParam)
{
//如果是unit或者city来执行build操作直接return false
if (actionParam.MainObjectType != MainObjectType.Grid)
return false;
if (actionParam.GridData == null)
return false;
return true;
}
//确认是否有科技和文化
protected bool BuildActionCheckHasTechCulture(CommonActionParams actionParam)
{
//如果有对应科技return true
if (actionParam.PlayerData.TechTree.CheckActionCan(_actionId))
return true;
//检查已拥有的市政卡是否激活了该action
var cultureCardDataAssets = Table.Instance.CultureCardDataAssets;
if (cultureCardDataAssets != null)
{
foreach (var cardType in actionParam.PlayerData.PlayerCultureInfo.CultureCardList)
{
if (cultureCardDataAssets.GetCultureCardInfo(cardType, out var cardInfo)
&& cardInfo.EnableAction)
{
foreach (var enabledAction in cardInfo.EnableActions)
{
if (enabledAction == _actionId)
return true;
}
}
}
}
return false;
}
//确认是否有钱
protected bool BuildActionCheckHasMoney(CommonActionParams actionParam)
{
//判断钱够不够
if (GetCost(actionParam) > actionParam.PlayerData.PlayerCoin)
return false;
return true;
}
//确认是否在自己领土
protected bool BuildActionCheckInTerritory(CommonActionParams actionParam)
{
//如果在有主领土,判断是敌人还是自己
if (actionParam.MapData.GetPlayerDataByTerritoryGridId(actionParam.GridData.Id, out var playerData) && playerData == actionParam.PlayerData)
return true;
return false;
}
//确认是否有敌人占领
protected bool BuildActionCheckEnemyOccupy(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;
}
protected bool TryRevealHiddenEnemyUnitOnMilitaryBuild(CommonActionParams actionParam)
{
if (actionParam?.MapData == null || actionParam.GridData == null || actionParam.PlayerData == null)
return false;
if (_actionId.ResourceType is not (ResourceType.Military or ResourceType.RemiliaMilitary or ResourceType.MoriyaMilitary))
return false;
if (!actionParam.GridData.RealUnit(actionParam.MapData, out var unit))
return false;
if (!unit.IsHideAndCantSee(actionParam.MapData, actionParam.PlayerData))
return false;
if (actionParam.MapData.CheckUnitIdBelongPlayerIdUnion(unit.Id, actionParam.PlayerData.Id))
return false;
unit.OnBeInteractTarget(actionParam.MapData, unit, actionParam.GridData);
return true;
}
//确认该城市的唯一性并获得对应的building level
protected bool BuildActionCheckHasOne(CommonActionParams actionParam,out int level)
{
if (actionParam.MapData.GetCityDataByTerritoryGid(actionParam.GridData.Id, out var city))
{
if (Main.CityLogic.IsMilitaryBuildingResource(_actionId.ResourceType))
return Main.CityLogic.GetMilitaryBuildingLevelByCity(actionParam.MapData, city, out level);
if (Main.CityLogic.GetBuildingLevelByCity(actionParam.MapData, city, _actionId.ResourceType,
out level))
return true;
}
level = 0;
return false;
}
protected bool BuildActionCheckHasAnotherNearby(CommonActionParams actionParam)
{
var map = actionParam.MapData;
var grid = actionParam.GridData;
_sharedAroundBuf ??= new List<GridData>();
_sharedAroundBuf.Clear();
map.GridMap.GetAroundGridData(1, 1, grid, _sharedAroundBuf);
foreach (var g in _sharedAroundBuf)
if (g.Resource == _actionId.ResourceType)
return true;
return false;
}
}
public class BuildActionBuildPreserve : BuildAction
{
public BuildActionBuildPreserve(CommonActionId id) : base(id)
{
}
protected override bool Execute(CommonActionParams actionParams)
{
if (actionParams.PlayerData == null)
{
LogSystem.LogError("PRESERVE !! playerData Not Found!!!!");
return false;
}
if (!CheckCan(actionParams)) {
LogSystem.LogError("PRESERVE !! CheckCan No!!!!");
return false;
}
if (!BuildActionPayMoney(actionParams)) {
LogSystem.LogError("PRESERVE !! PayMoney NO!!!!");
return false;
}
actionParams.GridData.ResourceUnderBuilding = actionParams.GridData.Resource;
actionParams.GridData.Resource = ResourceType.Preserve;
Main.CityLogic.CalcGridBuildingLevel(actionParams.MapData,actionParams.GridData, _actionId.ResourceType,out var buildingLevel);
actionParams.GridData.buildingLevel = buildingLevel;
Main.CityLogic.UpdateGrid_ViewOnly(actionParams.MapData,actionParams.GridData);
//如果是tree Preserve要给予城市经验
if (actionParams.GridData.Vegetation == Vegetation.Trees)
{
var city = actionParams.GridData.BelongButNotOnGridCity(actionParams.MapData);
Main.CityLogic.GridGiveCityExp_LogicView(actionParams.MapData,actionParams.PlayerData,actionParams.GridData,city,buildingLevel);
}
Main.PlayerLogic.UpdateTerritoryAllBuildingLevel(actionParams.MapData,actionParams.PlayerData.Id);
//Step #2 如果已经有MoriyaRoad 更新连通性
if (actionParams.PlayerData.TechTree.CheckIfHasTechAtom(TechAtom.MoriyaRoad))
Main.PlayerLogic.UpdateCityConnect(actionParams.MapData,actionParams.PlayerData);
ReportBoatUnitOnLandAfterBuild(actionParams);
return true;
}
public override bool CheckCan(CommonActionParams actionParam)
{
//step #1 check基本信息
if (!BuildActionCheckBaseInfo(actionParam)) return false;
//step #2 check是否有科技
if (!BuildActionCheckHasTechCulture(actionParam)) return false;
//step #3 check是否有钱
if (!BuildActionCheckHasMoney(actionParam)) return false;
//step #4 check是否在我方领土
if (!BuildActionCheckInTerritory(actionParam)) return false;
//step #5 check是否有敌人占领
if (BuildActionCheckEnemyOccupy(actionParam)) return false;
//step #6 check改成是是否尚未持有保护区
//if (BuildActionCheckHasOne(actionParam, out var _)) return false;
//step #7 保护区特有条件判断
var grid = actionParam.GridData;
//保护区必须建立在没有其他建筑的树林/浅海/山脉
if ((grid.Vegetation == Vegetation.Trees || grid.Terrain != TerrainType.Land || grid.Feature == TerrainFeature.Mountain) &&
grid.Resource is ResourceType.None or ResourceType.Animal or ResourceType.Fish or ResourceType.Starfish or ResourceType.Metal) return true;
return false;
}
public override bool CheckShow(CommonActionParams actionParam,out ShowType showType)
{
showType = ShowType.None;
//step #1 check基本信息
if (!BuildActionCheckBaseInfo(actionParam)) return false;
//step #2 check是否有科技
if (!BuildActionCheckHasTechCulture(actionParam)) return false;
//step #3 check是否有钱 - 跳过CheckShow不需要判断钱
//if (!BuildActionCheckHasMoney(actionParam)) return false;
//step #4 check是否在我方领土
if (!BuildActionCheckInTerritory(actionParam)) return false;
//step #5 check是否有敌人占领
if (BuildActionCheckEnemyOccupy(actionParam)) return false;
//step #6 check改成是是否尚未持有保护区
//if (BuildActionCheckHasOne(actionParam, out var _)) return false;
//step #7 保护区特有条件判断
var grid = actionParam.GridData;
//保护区必须建立在没有其他建筑的树林/浅海/山脉
if ((grid.Vegetation == Vegetation.Trees || grid.Terrain != TerrainType.Land || grid.Feature == TerrainFeature.Mountain) &&
grid.Resource is ResourceType.None or ResourceType.Animal or ResourceType.Fish or ResourceType.Starfish or ResourceType.Metal) return true;
return false;
}
}
public class BuildActionBuildNavalBase : BuildAction
{
public BuildActionBuildNavalBase(CommonActionId id) : base(id)
{
}
protected override bool Execute(CommonActionParams actionParams)
{
if (!BuildActionPayMoney(actionParams))
return false;
actionParams.GridData.ResourceUnderBuilding = actionParams.GridData.Resource;
actionParams.GridData.Resource = ResourceType.NavalBase;
Main.CityLogic.UpdateGrid_ViewOnly(actionParams.MapData,actionParams.GridData);
ReportBoatUnitOnLandAfterBuild(actionParams);
return true;
}
public override bool CheckCan(CommonActionParams actionParam)
{
//step #1 check基本信息
if (!BuildActionCheckBaseInfo(actionParam)) return false;
//step #2 check是否有科技
if (!BuildActionCheckHasTechCulture(actionParam)) return false;
//step #3 check是否有钱
if (!BuildActionCheckHasMoney(actionParam)) return false;
//step #4 check是否在我方领土
if (!BuildActionCheckInTerritory(actionParam)) return false;
//step #5 check是否有敌人占领
if (BuildActionCheckEnemyOccupy(actionParam)) return false;
//step #6 check是否尚未持有军港
if (BuildActionCheckHasOne(actionParam, out var _)) return false;
//step #7 军港特有条件判断
var grid = actionParam.GridData;
//军港必须建立在我方深海或者浅海,没有其他建筑
if (grid.Terrain == TerrainType.Land) return false;
if (!(grid.Resource is ResourceType.None or ResourceType.Fish or ResourceType.Starfish)) return false;
//军港必须建立在我方港口周围
if (!Main.CityLogic.CheckAroundGridHasSomeResourceBelongPlayer(actionParam.MapData, grid,
actionParam.PlayerData, ResourceType.Port))
return false;
return true;
}
public override bool CheckShow(CommonActionParams actionParam,out ShowType showType)
{
showType = ShowType.None;
//step #1 check基本信息
if (!BuildActionCheckBaseInfo(actionParam)) return false;
//step #2 check是否有科技
if (!BuildActionCheckHasTechCulture(actionParam)) return false;
//step #3 check是否有钱 checkshow不需要!
//if (!BuildActionCheckHasMoney(actionParam)) return false;
//step #4 check是否在我方领土
if (!BuildActionCheckInTerritory(actionParam)) return false;
//step #5 check是否有敌人占领
if (BuildActionCheckEnemyOccupy(actionParam)) return false;
//step #6 check是否尚未持有军港
if (BuildActionCheckHasOne(actionParam, out var _)) return false;
//step #7 军港特有条件判断
var grid = actionParam.GridData;
//军港必须建立在我方深海或者浅海,没有其他建筑
if (grid.Terrain == TerrainType.Land) return false;
if (!(grid.Resource is ResourceType.None or ResourceType.Fish or ResourceType.Starfish)) return false;
//军港必须建立在我方港口周围
if (!Main.CityLogic.CheckAroundGridHasSomeResourceBelongPlayer(actionParam.MapData, grid,
actionParam.PlayerData, ResourceType.Port))
return false;
return true;
}
}
public class BuildActionBuildTemple : BuildAction
{
public BuildActionBuildTemple(CommonActionId id) : base(id)
{
}
/// <summary>
/// 检查地块是否满足对应神像的地形要求,且地块上没有已有建筑
/// KingTemple=深海, WaterTemple=浅海, ForestTemple=森林, Temple=平原, MountainTemple=山脉
/// </summary>
private bool CheckTemplePlaceOK(CommonActionParams actionParam)
{
var grid = actionParam.GridData;
// 所有神像都要求地块上没有已有建筑
if (grid.Resource != ResourceType.None
&& grid.Resource != ResourceType.Fish
&& grid.Resource != ResourceType.Starfish
&& grid.Resource != ResourceType.Crop
&& grid.Resource != ResourceType.Fruit
&& grid.Resource != ResourceType.Animal
&& grid.Resource != ResourceType.Metal)
return false;
switch (_actionId.ResourceType)
{
case ResourceType.KingTemple:
// 深海
return grid.Terrain == TerrainType.DeepSea;
case ResourceType.WaterTemple:
// 浅海
return grid.Terrain == TerrainType.ShallowSea;
case ResourceType.ForestTemple:
// 森林
return grid.Vegetation == Vegetation.Trees;
case ResourceType.Temple:
// 平原:陆地、非山脉、非森林
return grid.Terrain == TerrainType.Land
&& grid.Feature != TerrainFeature.Mountain
&& grid.Vegetation != Vegetation.Trees;
case ResourceType.MountainTemple:
// 山脉
return grid.Feature == TerrainFeature.Mountain;
default:
return false;
}
}
protected override bool Execute(CommonActionParams actionParams)
{
if (!BuildActionPayMoney(actionParams)) return false;
actionParams.GridData.ResourceUnderBuilding = actionParams.GridData.Resource;
actionParams.GridData.Resource = _actionId.ResourceType;
actionParams.GridData.buildingLevel = 1;
actionParams.GridData.BuildTime = actionParams.PlayerData.Turn;
// 更新地块视觉
Main.CityLogic.UpdateGrid_ViewOnly(actionParams.MapData, actionParams.GridData);
// 给城市经验
Table.Instance.GridAndResourceDataAssets.GetResourceInfo(actionParams.GridData.Resource, out var info);
if (!actionParams.MapData.GetCityDataByTerritoryGid(actionParams.GridData.Id, out var city)) return false;
Main.CityLogic.GridGiveCityExp_LogicView(actionParams.MapData, actionParams.PlayerData, actionParams.GridData, city, info?.Exp ?? 0);
// 重新计算建筑等级和连通性
Main.PlayerLogic.UpdateTerritoryAllBuildingLevel(actionParams.MapData, actionParams.PlayerData.Id);
Main.PlayerLogic.UpdateCityConnect(actionParams.MapData, actionParams.PlayerData);
ReportBoatUnitOnLandAfterBuild(actionParams);
return true;
}
public override bool CheckCan(CommonActionParams actionParam)
{
//step #1 check基本信息
if (!BuildActionCheckBaseInfo(actionParam)) return false;
//step #2 check是否有科技
if (!BuildActionCheckHasTechCulture(actionParam)) return false;
//step #3 check是否有钱
if (!BuildActionCheckHasMoney(actionParam)) return false;
//step #4 check是否在我方领土
if (!BuildActionCheckInTerritory(actionParam)) return false;
//step #5 check是否有敌人占领
if (BuildActionCheckEnemyOccupy(actionParam)) return false;
//step #6 地形条件
if (!CheckTemplePlaceOK(actionParam)) return false;
return true;
}
public override bool CheckShow(CommonActionParams actionParam,out ShowType showType)
{
showType = ShowType.None;
//step #1 check基本信息
if (!BuildActionCheckBaseInfo(actionParam)) return false;
//step #2 check是否有科技
if (!BuildActionCheckHasTechCulture(actionParam)) return false;
//step #3 check是否在我方领土
if (!BuildActionCheckInTerritory(actionParam)) return false;
//step #4 check是否有敌人占领
if (BuildActionCheckEnemyOccupy(actionParam)) return false;
//step #5 地形条件
if (!CheckTemplePlaceOK(actionParam)) return false;
//step #6 钱不够时仍显示标记Cost
if (!BuildActionCheckHasMoney(actionParam)) showType = ShowType.Cost;
return true;
}
}
public class BuildActionBuildKaguyaFrenchYard : BuildAction
{
public BuildActionBuildKaguyaFrenchYard(CommonActionId id) : base(id)
{
}
protected override bool Execute(CommonActionParams actionParams)
{
if (actionParams.PlayerData == null) return false;
if (!CheckCan(actionParams)) return false;
if (!BuildActionPayMoney(actionParams)) return false;
actionParams.GridData.ResourceUnderBuilding = actionParams.GridData.Resource;
actionParams.GridData.Resource = ResourceType.KaguyaFrenchYard;
actionParams.GridData.CommonColdTime = 0;
Main.CityLogic.CalcGridBuildingLevel(actionParams.MapData,actionParams.GridData, _actionId.ResourceType,out var buildingLevel);
actionParams.GridData.buildingLevel = buildingLevel;
Main.PlayerLogic.UpdateTerritoryAllBuildingLevel(actionParams.MapData,actionParams.PlayerData.Id);
Main.CityLogic.UpdateGrid_ViewOnly(actionParams.MapData,actionParams.GridData);
ReportBoatUnitOnLandAfterBuild(actionParams);
return true;
}
public override bool CheckCan(CommonActionParams actionParam)
{
//step #1 check基本信息
if (!BuildActionCheckBaseInfo(actionParam)) return false;
//step #2 check是否有科技
if (!BuildActionCheckHasTechCulture(actionParam)) return false;
//step #3 check是否有钱
if (!BuildActionCheckHasMoney(actionParam)) return false;
//step #4 check是否在我方领土
if (!BuildActionCheckInTerritory(actionParam)) return false;
//step #5 check是否有敌人占领
if (BuildActionCheckEnemyOccupy(actionParam)) return false;
//step #6 check改成是是否尚未持有优昙华庭院
if (BuildActionCheckHasOne(actionParam, out var _)) return false;
//step #7 优昙华庭院特有条件判断
var grid = actionParam.GridData;
if (!(grid.Resource is ResourceType.None or ResourceType.Animal or ResourceType.Fruit
or ResourceType.Metal or ResourceType.Crop)) return false;
if (grid.Terrain != TerrainType.Land) return false;
return true;
}
public override bool CheckShow(CommonActionParams actionParam,out ShowType showType)
{
showType = ShowType.None;
//step #1 check基本信息
if (!BuildActionCheckBaseInfo(actionParam)) return false;
//step #2 check是否有科技
if (!BuildActionCheckHasTechCulture(actionParam)) return false;
//step #3 check是否有钱 跳过 没有钱也可以显示
//if (!BuildActionCheckHasMoney(actionParam)) return false;
//step #4 check是否在我方领土
if (!BuildActionCheckInTerritory(actionParam)) return false;
//step #5 check是否有敌人占领
if (BuildActionCheckEnemyOccupy(actionParam)) return false;
//step #6 check改成是是否尚未持有优昙华庭院
if (BuildActionCheckHasOne(actionParam, out var _)) return false;
//step #7 优昙华庭院特有条件判断
var grid = actionParam.GridData;
if (!(grid.Resource is ResourceType.None or ResourceType.Animal or ResourceType.Fruit
or ResourceType.Metal or ResourceType.Crop)) return false;
if (grid.Terrain != TerrainType.Land) return false;
return true;
}
}
//更新所有building的level
public class BuildActionUpdateAllBuildingLevel : BuildAction
{
public BuildActionUpdateAllBuildingLevel(CommonActionId id) : base(id)
{
}
protected override bool Execute(CommonActionParams actionParams)
{
return true;
}
}
public class BuildActionBuildEgyptianIrrigation : BuildAction
{
public BuildActionBuildEgyptianIrrigation(CommonActionId id) : base(id)
{
}
private bool BuildActionBuildEgyptianIrrigationSpecial(CommonActionParams actionParams,bool onWater = false)
{
var grid = actionParams.GridData;
if (!onWater)
{
if (!actionParams.GridData.Player(actionParams.MapData)?.TechTree
.CheckIfHasTech(TechType.RemiliaFarming) ?? true)
return false;
if (grid.Terrain != TerrainType.Land) return false;
if (grid.Feature == TerrainFeature.Mountain) return false;
if (grid.Vegetation == Vegetation.Trees) return false;
if (!(grid.Resource is ResourceType.None or ResourceType.Fruit or ResourceType.Crop)) return false;
_sharedAroundBuf ??= new List<GridData>();
_sharedAroundBuf.Clear();
actionParams.MapData.GridMap.GetAroundGridData(1, 1, grid, _sharedAroundBuf);
int waterSide = 0;
foreach (var g in _sharedAroundBuf)
{
if (Mathf.Abs(g.Pos.X - grid.Pos.X) + Mathf.Abs(g.Pos.Y - grid.Pos.Y) != 1) continue;
if (g.Terrain is TerrainType.ShallowSea) waterSide++;
}
if (waterSide < 2) return false;
}
if (onWater)
{
if (!actionParams.GridData.Player(actionParams.MapData)?.TechTree
.CheckIfHasTech(TechType.RemiliaRamming) ?? true)
return false;
if (grid.Terrain != TerrainType.ShallowSea) return false;
if (!(grid.Resource is ResourceType.None or ResourceType.Fish or ResourceType.Starfish)) return false;
_sharedAroundBuf ??= new List<GridData>();
_sharedAroundBuf.Clear();
actionParams.MapData.GridMap.GetAroundGridData(1, 1, grid, _sharedAroundBuf);
int landSide = 0;
foreach (var g in _sharedAroundBuf)
{
if (Mathf.Abs(g.Pos.X - grid.Pos.X) + Mathf.Abs(g.Pos.Y - grid.Pos.Y) != 1) continue;
if (g.Terrain is TerrainType.Land) landSide++;
}
if (landSide < 2) return false;
}
return true;
}
protected override bool Execute(CommonActionParams actionParams)
{
if (actionParams.PlayerData == null) return false;
if (!BuildActionPayMoney(actionParams)) return false;
actionParams.GridData.ResourceUnderBuilding = actionParams.GridData.Resource;
actionParams.GridData.Resource = ResourceType.EgyptianIrrigation;
actionParams.GridData.CommonColdTime = 0;
Main.CityLogic.CalcGridBuildingLevel(actionParams.MapData,actionParams.GridData, _actionId.ResourceType,out var buildingLevel);
actionParams.GridData.buildingLevel = buildingLevel;
Main.CityLogic.UpdateGrid_ViewOnly(actionParams.MapData,actionParams.GridData);
var city = actionParams.GridData.BelongButNotOnGridCity(actionParams.MapData);
Main.CityLogic.GridGiveCityExp_LogicView(actionParams.MapData,actionParams.PlayerData,actionParams.GridData,city,buildingLevel);
Main.PlayerLogic.UpdateTerritoryAllBuildingLevel(actionParams.MapData,actionParams.PlayerData.Id);
ReportBoatUnitOnLandAfterBuild(actionParams);
return true;
}
public override bool CheckCan(CommonActionParams actionParam)
{
//step #1 check基本信息
if (!BuildActionCheckBaseInfo(actionParam)) return false;
//step #2 check是否有科技
if (!BuildActionCheckHasTechCulture(actionParam)) return false;
//step #3 check是否有钱
if (!BuildActionCheckHasMoney(actionParam)) return false;
//step #4 check是否在我方领土
if (!BuildActionCheckInTerritory(actionParam)) return false;
//step #5 check是否有敌人占领
if (BuildActionCheckEnemyOccupy(actionParam)) return false;
//step #6 check附近一格内是否有其他灌溉工程
if (BuildActionCheckHasAnotherNearby(actionParam)) return false;
//step #7 灌溉工程的特有条件判断2个边相邻的水域
if (!BuildActionBuildEgyptianIrrigationSpecial(actionParam,actionParam.GridData.Terrain != TerrainType.Land )) return false;
return true;
}
public override bool CheckShow(CommonActionParams actionParam,out ShowType showType)
{
showType = ShowType.None;
//step #1 check基本信息
if (!BuildActionCheckBaseInfo(actionParam)) return false;
//step #2 check是否有科技
if (!BuildActionCheckHasTechCulture(actionParam)) return false;
//step #3 check是否有钱 / CheckShow不用判断有钱
//if (!BuildActionCheckHasMoney(actionParam)) return false;
//step #4 check是否在我方领土
if (!BuildActionCheckInTerritory(actionParam)) return false;
//step #5 check是否有敌人占领
if (BuildActionCheckEnemyOccupy(actionParam)) return false;
//step #6 check附近一格内是否有其他灌溉工程
if (BuildActionCheckHasAnotherNearby(actionParam)) return false;
//step #7 灌溉工程的特有条件判断2个边相邻的水域
if (!BuildActionBuildEgyptianIrrigationSpecial(actionParam,actionParam.GridData.Terrain != TerrainType.Land)) return false;
return true;
}
}
public class BuildActionBuildRemiliaMilitary : BuildAction
{
public BuildActionBuildRemiliaMilitary(CommonActionId id) : base(id)
{
}
protected override bool Execute(CommonActionParams actionParams)
{
if (!CheckCan(actionParams)) return false;
if (TryRevealHiddenEnemyUnitOnMilitaryBuild(actionParams)) return false;
if (!BuildActionPayMoney(actionParams))
return false;
actionParams.GridData.ResourceUnderBuilding = actionParams.GridData.Resource;
actionParams.GridData.Resource = ResourceType.RemiliaMilitary;
actionParams.GridData.AddSpType(GridSpType.RemiliaGrid,actionParams.MapData,null);
Main.CityLogic.UpdateGrid_ViewOnly(actionParams.MapData,actionParams.GridData);
ReportBoatUnitOnLandAfterBuild(actionParams);
return true;
}
public override bool CheckCan(CommonActionParams actionParam)
{
//step #1 check基本信息
if (!BuildActionCheckBaseInfo(actionParam)) return false;
//step #2 check是否有科技
if (!BuildActionCheckHasTechCulture(actionParam)) return false;
//step #3 check是否有钱
if (!BuildActionCheckHasMoney(actionParam)) return false;
//step #4 check是否在我方领土
if (!BuildActionCheckInTerritory(actionParam)) return false;
//step #5 check是否有敌人占领
if (BuildActionCheckEnemyOccupy(actionParam)) return false;
//step #6 check是否已经有一个军营
if (BuildActionCheckHasOne(actionParam, out var _)) return false;
//step #7 军营特有逻辑判断 必须是没有其他建筑的无树林平地
if (actionParam.GridData.Terrain == TerrainType.Land
&& actionParam.GridData.Feature != TerrainFeature.Mountain
&& actionParam.GridData.Vegetation != Vegetation.Trees
&& actionParam.GridData.Resource is ResourceType.None or ResourceType.Fruit or ResourceType.Crop)
return true;
return false;
}
public override bool CheckShow(CommonActionParams actionParam,out ShowType showType)
{
showType = ShowType.None;
//step #1 check基本信息
if (!BuildActionCheckBaseInfo(actionParam)) return false;
//step #2 check是否有科技
if (!BuildActionCheckHasTechCulture(actionParam)) return false;
//step #3 check是否有钱
//if (!BuildActionCheckHasMoney(actionParam)) return false;
//step #4 check是否在我方领土
if (!BuildActionCheckInTerritory(actionParam)) return false;
//step #5 check是否有敌人占领
if (BuildActionCheckEnemyOccupy(actionParam)) return false;
//step #6 check是否已经有一个军营
if (BuildActionCheckHasOne(actionParam, out var _)) return false;
//step #7 军营特有逻辑判断 必须是没有其他建筑的无树林平地
if (actionParam.GridData.Terrain == TerrainType.Land
&& actionParam.GridData.Feature != TerrainFeature.Mountain
&& actionParam.GridData.Vegetation != Vegetation.Trees
&& actionParam.GridData.Resource is ResourceType.None or ResourceType.Fruit or ResourceType.Crop)
return true;
return false;
}
}
public class BuildActionBuildMetalStation : BuildAction
{
public BuildActionBuildMetalStation(CommonActionId id) : base(id)
{
}
protected override bool Execute(CommonActionParams actionParams)
{
//Step #1 办事
if (!BuildActionPayMoney(actionParams))
return false;
actionParams.GridData.Resource = ResourceType.MetalStation;
//Step #2 如果已经有MoriyaRoad 更新连通性
if (actionParams.PlayerData.TechTree.CheckIfHasTechAtom(TechAtom.MoriyaRoad))
Main.PlayerLogic.UpdateCityConnect(actionParams.MapData,actionParams.PlayerData);
//Step #3 播放雾效,更新画面
Main.CityLogic.UpdateGrid_ViewOnly(actionParams.MapData,actionParams.GridData);
/*if (actionParams.GridData.InMainSight())
{
actionParams.GridData.Renderer(actionParams.MapData)?.InstantUpdateGrid(true);
actionParams.GridData.Renderer(actionParams.MapData)?.PlayVFX(new GridVFXParams(GridVFXType.Fog));
}*/
//Step #8 重新计算连通性
Main.PlayerLogic.UpdateCityConnect(actionParams.MapData,actionParams.PlayerData);
ReportBoatUnitOnLandAfterBuild(actionParams);
return true;
}
public override bool CheckCan(CommonActionParams actionParam)
{
//step #1 check基本信息
if (!BuildActionCheckBaseInfo(actionParam)) return false;
//step #2 check是否有科技
if (!BuildActionCheckHasTechCulture(actionParam)) return false;
//step #3 check是否有钱
if (!BuildActionCheckHasMoney(actionParam)) return false;
//step #4 check是否在我方领土
if (!BuildActionCheckInTerritory(actionParam)) return false;
//step #5 check是否有敌人占领
if (BuildActionCheckEnemyOccupy(actionParam)) return false;
//step #6 check是否是资源为none的山脉
if (actionParam.GridData.Resource != ResourceType.None || actionParam.GridData.Feature != TerrainFeature.Mountain) return false;
return true;
}
public override bool CheckShow(CommonActionParams actionParam,out ShowType showType)
{
showType = ShowType.None;
//step #1 check基本信息
if (!BuildActionCheckBaseInfo(actionParam)) return false;
//step #2 check是否有科技
if (!BuildActionCheckHasTechCulture(actionParam)) return false;
//step #3 check是否有钱
if (!BuildActionCheckHasMoney(actionParam)) showType = ShowType.Cost;
//step #4 check是否在我方领土
if (!BuildActionCheckInTerritory(actionParam)) return false;
//step #5 check是否有敌人占领
if (BuildActionCheckEnemyOccupy(actionParam)) return false;
//step #6 check是否是资源为none的山脉
if (actionParam.GridData.Resource != ResourceType.None || actionParam.GridData.Feature != TerrainFeature.Mountain) return false;
return true;
}
}
public class BuildActionBuildMoriyaMilitary : BuildAction
{
public BuildActionBuildMoriyaMilitary(CommonActionId id) : base(id)
{
}
protected override bool Execute(CommonActionParams actionParams)
{
if (!CheckCan(actionParams)) return false;
if (TryRevealHiddenEnemyUnitOnMilitaryBuild(actionParams)) return false;
if (!BuildActionPayMoney(actionParams))
return false;
actionParams.GridData.ResourceUnderBuilding = actionParams.GridData.Resource;
actionParams.GridData.Resource = ResourceType.MoriyaMilitary;
Main.CityLogic.UpdateGrid_ViewOnly(actionParams.MapData,actionParams.GridData);
/*
if (Main.MapData.IsCurrentShowMap())
{
PresentationManager.EnqueueGridUpdate(actionParams.MapData,actionParams.GridData,GridUpdateType.BuildingUpdate);
//如果有人站在军港上要更新他的renderMark
if (actionParams.MapData.GetUnitDataByGid(actionParams.GridData.Id, out var unit))
unit.Renderer(actionParams.MapData)?.InstantUpdateUnit(true);
}*/
//Step #8 重新计算连通性
Main.PlayerLogic.UpdateCityConnect(actionParams.MapData,actionParams.PlayerData);
ReportBoatUnitOnLandAfterBuild(actionParams);
return true;
}
public override bool CheckCan(CommonActionParams actionParam)
{
//step #1 check基本信息
if (!BuildActionCheckBaseInfo(actionParam)) return false;
//step #2 check是否有科技
if (!BuildActionCheckHasTechCulture(actionParam)) return false;
//step #3 check是否有钱
if (!BuildActionCheckHasMoney(actionParam)) return false;
//step #4 check是否在我方领土
if (!BuildActionCheckInTerritory(actionParam)) return false;
//step #5 check是否有敌人占领
if (BuildActionCheckEnemyOccupy(actionParam)) return false;
//step #6 check是否已经有一个军营
if (BuildActionCheckHasOne(actionParam, out var _)) return false;
//step #7 军营特有逻辑判断 必须是没有其他建筑的山脉
if (actionParam.GridData.Feature == TerrainFeature.Mountain && !actionParam.GridData.HasBuilding()) return true;
return false;
}
public override bool CheckShow(CommonActionParams actionParam,out ShowType showType)
{
showType = ShowType.None;
//step #1 check基本信息
if (!BuildActionCheckBaseInfo(actionParam)) return false;
//step #2 check是否有科技
if (!BuildActionCheckHasTechCulture(actionParam)) return false;
//step #3 check是否有钱
if (!BuildActionCheckHasMoney(actionParam)) showType = ShowType.Cost;
//step #4 check是否在我方领土
if (!BuildActionCheckInTerritory(actionParam)) return false;
//step #5 check是否有敌人占领
if (BuildActionCheckEnemyOccupy(actionParam)) return false;
//step #6 check是否已经有一个军营
if (BuildActionCheckHasOne(actionParam, out var _)) return false;
//step #7 军营特有逻辑判断 必须是没有其他建筑的山脉
if (actionParam.GridData.Feature == TerrainFeature.Mountain && !actionParam.GridData.HasBuilding()) return true;
return false;
}
}
}