TH1/Unity/Assets/Scripts/TH1_Logic/Action/BuildActionLogic.cs
2025-10-10 01:58:12 +08:00

942 lines
44 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 ET;
using Logic.AI;
using Logic.CrashSight;
using ParadoxNotion;
using RuntimeData;
using TH1_Anim.Fragments;
using TH1_Core.Managers;
using TH1_Logic.Core;
using UnityEngine;
using TH1Renderer;
using TH1Resource;
//这里是所有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;
CityData cityData = actionParams.CityData;
if (cityData == null) actionParams.MapData.GetCityDataByTerritoryGid(actionParams.GridData.Id,out cityData);
//Step #2 扣钱,收获资产,把资产送往city
actionParams.PlayerData.PlayerWealth -= GetCost();
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)?.SetUpdateGrid(true);
}
//处理windmill sawmill forge market
else if (_actionId.ResourceType is ResourceType.Windmill or ResourceType.Forge or ResourceType.Sawmill or ResourceType.Market )
{
actionParams.GridData.Resource = _actionId.ResourceType;
actionParams.GridData.Renderer(actionParams.MapData)?.SetUpdateGrid(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.Resource = _actionId.ResourceType;
//港口会自动设置格子的feature为road
actionParams.GridData.Feature = TerrainFeature.Road;
actionParams.GridData.Renderer(actionParams.MapData)?.SetUpdateGrid(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;
var tlist = actionParams.MapData.GridMap.GetAroundGridData(1, 1, actionParams.GridData);
foreach (var tgrid in tlist)
tgrid.Renderer(actionParams.MapData)?.SetUpdateGrid(true);
actionParams.GridData.Renderer(actionParams.MapData)?.SetUpdateGrid(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.Resource = _actionId.ResourceType;
actionParams.GridData.buildingLevel = 1;
actionParams.GridData.BuildTime = actionParams.PlayerData.Turn;
actionParams.GridData.Renderer(actionParams.MapData)?.SetUpdateGrid(true);
}
else if (_actionId.ResourceType == ResourceType.Military)
{
cityExp = Table.Instance.QueryActionExp(_actionId);
actionParams.GridData.Resource = _actionId.ResourceType;
actionParams.GridData.Renderer(actionParams.MapData)?.SetUpdateGrid(true);
//如果有人站在军营上要更新他的renderMark
if (actionParams.MapData.GetUnitDataByGid(actionParams.GridData.Id, out var unit))
unit.RenderMark = 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.Resource = _actionId.ResourceType;
actionParams.GridData.Renderer(actionParams.MapData)?.SetUpdateGrid(true);
}
//Step #6 处理cityExp获取相关
Main.CityLogic.GridGiveCityExp(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);
return true;
}
public override bool CheckCan(CommonActionParams actionParam)
{
//如果是unit或者city来执行build操作直接return false
if (actionParam.MainObjectType != MainObjectType.Grid)
return false;
if (actionParam.GridData == null)
return false;
//如果没有对应科技return false
if (!actionParam.PlayerData.TechTree.CheckActionCan(_actionId))
return false;
//判断钱够不够
if (GetCost() > actionParam.PlayerData.PlayerWealth)
return false;
//如果在有主领土,判断是敌人还是自己
if (actionParam.MapData.GetPlayerDataByTerritoryGridId(actionParam.GridData.Id, out var playerData))
{
//在敌人领土上直接return false
if (playerData != actionParam.PlayerData)
return false;
}
//如果在无主领土且不是bridge或者road,也要return false
else
if (_actionId.ResourceType != ResourceType.Bridge
&& _actionId.FeatureType != TerrainFeature.Road)
return false;
//如果有非联盟的敌人站在上面
if (actionParam.MapData.GetUnitDataByGid(actionParam.GridData.Id, out var unit)
&& !actionParam.MapData.CheckUnitIdBelongPlayerIdUnion(unit.Id, actionParam.PlayerData.Id))
return false;
//处理bridge
if (_actionId.ResourceType == ResourceType.Bridge)
{
//如果不是none或者fish的浅水直接return false
if (actionParam.GridData.Terrain != TerrainType.ShallowSea
|| (actionParam.GridData.Resource != ResourceType.None
&& actionParam.GridData.Resource != ResourceType.Fish))
return false;
//如果不存在桥两侧的陆地以供建桥梁
if (!actionParam.MapData.HasBridgeSideLand(actionParam.GridData,out var isMirror))
return false;
return true;
}
//处理road
if (_actionId.FeatureType == TerrainFeature.Road)
{
//如果是非陆地、村庄
if (actionParam.GridData.Terrain != TerrainType.Land ||
actionParam.GridData.Resource == ResourceType.CityCenter)
return false;
//如果已经有路或者是山体return false
if (actionParam.GridData.Feature != TerrainFeature.None)
return false;
return true;
}
//处理完了road和bridge剩下建筑必须都在自己领土上否则就return false
if (playerData == null)
return false;
//-------- 以下先处理改造资源的建筑
//处理lumberhut
if (_actionId.ResourceType == ResourceType.LumberHut)
{
//只有林子上空着或者有animal 才可能建lumberhut
if(actionParam.GridData.Vegetation == Vegetation.Trees
&& (actionParam.GridData.Resource == ResourceType.Animal
|| actionParam.GridData.Resource == ResourceType.None))
return true;
return false;
}
//处理mine
if (_actionId.ResourceType == ResourceType.Mine)
{
//只要resource是metal就可以建
if(actionParam.GridData.Resource == ResourceType.Metal)
return true;
return false;
}
//处理farm
if (_actionId.ResourceType == ResourceType.Farm)
{
//只要resource是crop就可以建
if(actionParam.GridData.Resource == ResourceType.Crop){
return true;
}
return false;
}
//-------- 再处理直接建设的建筑
//处理学院
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.GetBuildingLevelByCity(actionParam.MapData,militaryCity,_actionId.ResourceType,out var militaryLevel))
return false;
//必须是没有其他建筑的无树林平地
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;
}
//处理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.Vegetation == Vegetation.Trees)
|| (actionParam.GridData.Resource != ResourceType.None
&& actionParam.GridData.Resource != ResourceType.Crop
&& actionParam.GridData.Resource != ResourceType.Fruit))
return false;
//再确认周围有没有支持这个特殊建筑的附属建筑
if (!Main.CityLogic
.CalcGridBuildingLevel(actionParam.MapData, actionParam.GridData,
_actionId.ResourceType,out var level1))
return false;
//再确认city是否已经有一个对应的特殊建筑
if(actionParam.MapData.GetCityDataByTerritoryGid(actionParam.GridData.Id,out var cityData)
&& Main.CityLogic.GetBuildingLevelByCity(actionParam.MapData,cityData,_actionId.ResourceType,out var level2))
return false;
return true;
}
public override bool CheckShow(CommonActionParams actionParam)
{
//如果是unit或者city来执行build操作直接return false
if (actionParam.MainObjectType != MainObjectType.Grid)
return false;
if (actionParam.GridData == null)
return false;
//如果没有对应科技return false
if (!actionParam.PlayerData.TechTree.CheckActionCan(_actionId))
return false;
//如果在有主领土,判断是敌人还是自己
if (actionParam.MapData.GetPlayerDataByTerritoryGridId(actionParam.GridData.Id, out var playerData))
{
//在敌人领土上直接return false
if (playerData != actionParam.PlayerData)
return false;
}
//如果在无主领土且不是bridge或者road,也要return false
else
if (_actionId.ResourceType != ResourceType.Bridge
&& _actionId.FeatureType != TerrainFeature.Road)
return false;
//如果有非联盟的敌人站在上面
if (actionParam.MapData.GetUnitDataByGid(actionParam.GridData.Id, out var unit)
&& !actionParam.MapData.CheckUnitIdBelongPlayerIdUnion(unit.Id, actionParam.PlayerData.Id))
return false;
//处理bridge
if (_actionId.ResourceType == ResourceType.Bridge)
{
//如果不是none或者fish的浅水直接return false
if (actionParam.GridData.Terrain != TerrainType.ShallowSea
|| (actionParam.GridData.Resource != ResourceType.None
&& actionParam.GridData.Resource != ResourceType.Fish))
return false;
//如果不存在桥两侧的陆地以供建桥梁
if (!actionParam.MapData.HasBridgeSideLand(actionParam.GridData,out var isMirror))
return false;
return true;
}
//处理road
if (_actionId.FeatureType == TerrainFeature.Road)
{
//如果是非陆地、村庄
if (actionParam.GridData.Terrain != TerrainType.Land ||
actionParam.GridData.Resource == ResourceType.CityCenter)
return false;
//如果已经有路或者是山体return false
if (actionParam.GridData.Feature != TerrainFeature.None)
return false;
return true;
}
//处理完了road和bridge剩下建筑必须都在自己领土上否则就return false
if (playerData == null)
return false;
//-------- 以下先处理改造资源的建筑
//处理lumberhut
if (_actionId.ResourceType == ResourceType.LumberHut)
{
//只有林子上空着或者有animal 才可能建lumberhut
if(actionParam.GridData.Vegetation == Vegetation.Trees
&& (actionParam.GridData.Resource == ResourceType.Animal
|| actionParam.GridData.Resource == ResourceType.None))
return true;
return false;
}
//处理mine
if (_actionId.ResourceType == ResourceType.Mine)
{
//只要resource是metal就可以建
if(actionParam.GridData.Resource == ResourceType.Metal)
return true;
return false;
}
//处理farm
if (_actionId.ResourceType == ResourceType.Farm)
{
//只要resource是crop就可以建
if(actionParam.GridData.Resource == ResourceType.Crop){
return true;
}
return false;
}
//-------- 再处理直接建设的建筑
//处理学院
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.GetBuildingLevelByCity(actionParam.MapData,militaryCity,_actionId.ResourceType,out var militaryLevel))
return false;
//必须是没有其他建筑的无树林平地
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)
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.Vegetation == Vegetation.Trees)
|| (actionParam.GridData.Resource != ResourceType.None
&& actionParam.GridData.Resource != ResourceType.Crop
&& actionParam.GridData.Resource != ResourceType.Fruit))
return false;
//再确认周围有没有支持这个特殊建筑的附属建筑
if (!Main.CityLogic
.CalcGridBuildingLevel(actionParam.MapData, actionParam.GridData,
_actionId.ResourceType,out var level1))
return false;
//再确认city是否已经有一个对应的特殊建筑
if(actionParam.MapData.GetCityDataByTerritoryGid(actionParam.GridData.Id,out var cityData)
&& Main.CityLogic.GetBuildingLevelByCity(actionParam.MapData,cityData,_actionId.ResourceType,out var level2))
return false;
return true;
}
//付钱
protected bool BuildActionPayMoney(CommonActionParams actionParam)
{
if (actionParam.PlayerData.PlayerWealth - GetCost() < 0) return false;
actionParam.PlayerData.PlayerWealth -= GetCost();
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 BuildActionCheckHasTech(CommonActionParams actionParam)
{
//如果没有对应科技return false
if (!actionParam.PlayerData.TechTree.CheckActionCan(_actionId))
return false;
return true;
}
//确认是否有钱
protected bool BuildActionCheckHasMoney(CommonActionParams actionParam)
{
//判断钱够不够
if (GetCost() > actionParam.PlayerData.PlayerWealth)
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.MapData.GetUnitDataByGid(actionParam.GridData.Id, out var unit)
&& !actionParam.MapData.CheckUnitIdBelongPlayerIdUnion(unit.Id, actionParam.PlayerData.Id))
return true;
return false;
}
//确认该城市的唯一性并获得对应的building level
protected bool BuildActionCheckHasOne(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 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;
//更新附近的Academy
var gridDataList = Main.PlayerLogic.GetPlayerResourceNearbyList(actionParams.MapData, actionParams.PlayerData,
actionParams.GridData, ResourceType.Academy);
foreach(var gridData in gridDataList)
Main.CityLogic.UpdateGridBuildingData(actionParams.MapData,gridData);
Main.PlayerLogic.UpdateTerritoryAllBuildingLevel(actionParams.MapData,actionParams.PlayerData.Id);
//更新显示地块
if (Main.MapData.IsCurrentShowMap())
PresentationManager.EnqueueGridUpdate(actionParams.MapData,actionParams.GridData,GridUpdateType.BuildingUpdate);
return true;
}
public override bool CheckCan(CommonActionParams actionParam)
{
//step #1 check基本信息
if (!BuildActionCheckBaseInfo(actionParam)) return false;
//step #2 check是否有科技
if (!BuildActionCheckHasTech(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) return false;
if (!(grid.Resource is ResourceType.None or ResourceType.Animal)) return false;
return true;
}
public override bool CheckShow(CommonActionParams actionParam)
{
//step #1 check基本信息
if (!BuildActionCheckBaseInfo(actionParam)) return false;
//step #2 check是否有科技
if (!BuildActionCheckHasTech(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) return false;
if (!(grid.Resource is ResourceType.None or ResourceType.Animal)) return false;
return true;
}
}
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;
//如果不是真mapdata在播放动画
if (Main.MapData.IsCurrentShowMap())
{
PresentationManager.EnqueueGridUpdate(actionParams.MapData,actionParams.GridData,GridUpdateType.BuildingUpdate);
//如果有人站在军港上要更新他的renderMark
if (actionParams.MapData.GetUnitDataByGid(actionParams.GridData.Id, out var unit))
unit.RenderMark = true;
}
return true;
}
public override bool CheckCan(CommonActionParams actionParam)
{
//step #1 check基本信息
if (!BuildActionCheckBaseInfo(actionParam)) return false;
//step #2 check是否有科技
if (!BuildActionCheckHasTech(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)
{
//step #1 check基本信息
if (!BuildActionCheckBaseInfo(actionParam)) return false;
//step #2 check是否有科技
if (!BuildActionCheckHasTech(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)
{
}
//确定一个城市是否已经拥有一座英雄神像
private bool CheckGridCityHasTemple(CommonActionParams actionParam)
{
if (!actionParam.MapData.GetCityDataByTerritoryGid(actionParam.GridData.Id, out var city))
{
LogSystem.LogError($"Can't find City with id {actionParam.GridData.Id} In BuildActionBuildTemple CheckGridCityHasTemple");
return true;
}
if(Main.CityLogic.GetBuildingLevelByCity(actionParam.MapData,city,ResourceType.KingTemple,out var _)
|| Main.CityLogic.GetBuildingLevelByCity(actionParam.MapData,city,ResourceType.ForestTemple,out var _)
|| Main.CityLogic.GetBuildingLevelByCity(actionParam.MapData,city,ResourceType.WaterTemple,out var _)
|| Main.CityLogic.GetBuildingLevelByCity(actionParam.MapData,city,ResourceType.Temple,out var _)
|| Main.CityLogic.GetBuildingLevelByCity(actionParam.MapData,city,ResourceType.MountainTemple,out var _))
return true;
return false;
}
private bool CheckTemplePlaceOK(CommonActionParams actionParam)
{
if (_actionId.ResourceType == ResourceType.Temple || _actionId.ResourceType == ResourceType.KingTemple)
{
//必须平地必须是none或者crop
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.Crop
&& actionParam.GridData.Resource != ResourceType.Fruit))
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;
}
return true;
}
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;
Table.Instance.GridAndResourceDataAssets.GetResourceInfo(actionParams.GridData.Resource,out var info);
if (!actionParams.MapData.GetCityDataByTerritoryGid(actionParams.GridData.Id, out var city)) return false;
//更新citylevel
//Main.CityLogic.CityUpdateExp(actionParams.MapData,city,info?.Exp??0);
Main.CityLogic.GridGiveCityExp(actionParams.MapData,actionParams.PlayerData,actionParams.GridData,city,info?.Exp??0);
return true;
}
public override bool CheckCan(CommonActionParams actionParam)
{
//step #1 check基本信息
if (!BuildActionCheckBaseInfo(actionParam)) return false;
//step #2 check是否有科技
if (!BuildActionCheckHasTech(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 (CheckGridCityHasTemple(actionParam)) return false;
//step #7 不同神像特有的建造条件
if (!CheckTemplePlaceOK(actionParam)) return false;
return true;
}
public override bool CheckShow(CommonActionParams actionParam)
{
//step #1 check基本信息
if (!BuildActionCheckBaseInfo(actionParam)) return false;
//step #2 check是否有科技
if (!BuildActionCheckHasTech(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 (CheckGridCityHasTemple(actionParam)) return false;
//step #7 不同神像特有的建造条件
if (!CheckTemplePlaceOK(actionParam)) return false;
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.KaguyaFrenchAnimalTime = 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);
//如果不是真mapdata在播放动画
if (Main.MapData.IsCurrentShowMap())
PresentationManager.EnqueueGridUpdate(actionParams.MapData,actionParams.GridData,GridUpdateType.BuildingUpdate);
return true;
}
public override bool CheckCan(CommonActionParams actionParam)
{
//step #1 check基本信息
if (!BuildActionCheckBaseInfo(actionParam)) return false;
//step #2 check是否有科技
if (!BuildActionCheckHasTech(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)
{
//step #1 check基本信息
if (!BuildActionCheckBaseInfo(actionParam)) return false;
//step #2 check是否有科技
if (!BuildActionCheckHasTech(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;
}
}
}