TH1/Unity/Assets/Scripts/TH1_Logic/Action/BuildActionLogic.cs
2025-08-26 14:32:20 +08:00

969 lines
46 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_Logic.Core;
using UnityEngine;
using TH1Renderer;
using TH1Resource;
//这里是所有BuildAction派生子类的实现模块
namespace Logic.Action
{
// Build 建造逻辑类
public class BuildAction : ActionLogicBase
{
public BuildAction(CommonActionId id) : base(id)
{
}
public override bool Execute(CommonActionParams actionParams, bool isMoment)
{
if (!CheckCan(actionParams)) return false;
CityData cityData = actionParams.CityData;
//鲁棒性用
if (cityData == null)
actionParams.MapData.GetCityDataByTerritoryGid(actionParams.GridData.Id,out cityData);
//扣钱,收获资产,把资产送往city
actionParams.PlayerData.PlayerWealth -= GetCost();
int cityExp = 0;
//TODO 全部更新逻辑!! 现在全部会重新跑一遍 buildinglevel update
//处理farm、mine、lumberhut
if (_actionId.ResourceType == ResourceType.Farm || _actionId.ResourceType == ResourceType.Mine || _actionId.ResourceType == ResourceType.LumberHut)
{
cityExp = Table.Instance.QueryActionExp(_actionId);
actionParams.GridData.ResourceUnderBuilding = actionParams.GridData.Resource;
actionParams.GridData.Resource = _actionId.ResourceType;
actionParams.GridData.RenderMark = true;
//更新周围的milllike建筑
ResourceType needUpdate = ResourceType.Windmill;
if(_actionId.ResourceType == ResourceType.Mine)
needUpdate = ResourceType.Forge;
if(_actionId.ResourceType == ResourceType.LumberHut)
needUpdate = ResourceType.Sawmill;
//更新对应的milllike建筑的buildinglevel
var gridDataList1 = Main.PlayerLogic.GetPlayerResourceNearbyList(actionParams.MapData, actionParams.PlayerData,
actionParams.GridData, needUpdate);
foreach (var gridData1 in gridDataList1)
{
Main.CityLogic.UpdateGridBuildingData(actionParams.MapData,gridData1);
//找到该milllike建筑附近的market更新该market
var gridDataList2 = Main.PlayerLogic.GetPlayerResourceNearbyList(actionParams.MapData, actionParams.PlayerData,
gridData1, ResourceType.Market);
foreach(var gridData2 in gridDataList2)
Main.CityLogic.UpdateGridBuildingData(actionParams.MapData,gridData2);
}
//更新所有market建筑的buildinglevel
}
//处理windmill sawmill forge market
else if (_actionId.ResourceType == ResourceType.Windmill || _actionId.ResourceType == ResourceType.Forge ||
_actionId.ResourceType == ResourceType.Sawmill || _actionId.ResourceType == ResourceType.Market )
{
actionParams.GridData.Resource = _actionId.ResourceType;
actionParams.GridData.RenderMark = true;
Main.CityLogic.CalcGridBuildingLevel(actionParams.MapData,actionParams.GridData, _actionId.ResourceType,out var buildingLevel);
actionParams.GridData.buildingLevel = buildingLevel;
//如果建设的不是market,而是sawmill forge windmill
if (_actionId.ResourceType != ResourceType.Market)
{
//提供城市经验
cityExp = buildingLevel * (_actionId.ResourceType == ResourceType.Forge ? 2 : 1);
//更新附近的market
var gridDataList = Main.PlayerLogic.GetPlayerResourceNearbyList(actionParams.MapData, actionParams.PlayerData,
actionParams.GridData, ResourceType.Market);
foreach(var gridData in gridDataList)
Main.CityLogic.UpdateGridBuildingData(actionParams.MapData,gridData);
//更新附近的academy
gridDataList = Main.PlayerLogic.GetPlayerResourceNearbyList(actionParams.MapData, actionParams.PlayerData,
actionParams.GridData, ResourceType.Academy);
foreach(var gridData in gridDataList)
Main.CityLogic.UpdateGridBuildingData(actionParams.MapData,gridData);
}
}
//处理port
else if (_actionId.ResourceType == ResourceType.Port)
{
cityExp = Table.Instance.QueryActionExp(_actionId);
actionParams.GridData.Resource = _actionId.ResourceType;
//港口会自动设置格子的feature为road
actionParams.GridData.Feature = TerrainFeature.Road;
actionParams.GridData.RenderMark = true;
Main.PlayerLogic.UpdateCityConnect(actionParams.MapData,actionParams.PlayerData);
}
//处理bridge或者road
else if (_actionId.ResourceType == ResourceType.Bridge || _actionId.FeatureType == TerrainFeature.Road )
{
actionParams.GridData.Feature = TerrainFeature.Road;
if(_actionId.ResourceType == ResourceType.Bridge)
actionParams.GridData.Resource = ResourceType.Bridge;
Main.PlayerLogic.UpdateCityConnect(actionParams.MapData,actionParams.PlayerData);
var tlist = actionParams.MapData.GridMap.GetAroundGridData(1, 1, actionParams.GridData);
foreach (var tgrid in tlist)
tgrid.RenderMark = true;
actionParams.GridData.RenderMark = true;
}
//处理temple
else if (_actionId.ResourceType == ResourceType.Temple
|| _actionId.ResourceType == ResourceType.ForestTemple
|| _actionId.ResourceType == ResourceType.WaterTemple
|| _actionId.ResourceType == ResourceType.MountainTemple
|| _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.RenderMark = true;
}
else if (_actionId.ResourceType == ResourceType.Military)
{
cityExp = Table.Instance.QueryActionExp(_actionId);
actionParams.GridData.Resource = _actionId.ResourceType;
actionParams.GridData.RenderMark = 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.RenderMark = true;
}
Main.PlayerLogic.UpdateTerritoryAllBuildingLevel(actionParams.MapData,actionParams.PlayerData.Id);
//如果是玩家,执行一整套播放动画的逻辑
//临时做法用来播放VFX,获取Main理应向MapData写入一个VFX的RenderMark的
if (Main.MapData == actionParams.MapData && actionParams.PlayerData.Id == actionParams.MapData.PlayerMap.SelfPlayerData.Id)
//目前只有市场这种情况,只播放建筑建设的雾效,其他啥都不播放
if (cityExp == 0)
{
actionParams.GridData.VFXRenderMarkFog = true;
}
else
{
var v1 = Table.Instance.GridToWorld(actionParams.GridData);
actionParams.MapData.GetGridDataByCityId(cityData.Id, out var g2);
var v2 = Table.Instance.GridToWorld(g2);
Timer.Instance.TimerRegister(Main.CityLogic, () =>
{
int score = cityExp * 5;
MapRenderer.Instance.ROGridMap[g2.Id].SetBounceAnim();
score += 50 * Main.CityLogic.CityUpdateExp(actionParams.MapData,cityData,cityExp);
if (actionParams.PlayerData.Id == actionParams.MapData.PlayerMap.SelfPlayerData.Id)
{
var faithPanel = GameObject.Find("UICanvas/TopBarPanel/FaithPanel/Icon").transform;
var endPos = faithPanel.position;
MapRenderer.Instance.ProjectileManager.CreateProjectile( v2, endPos,
ProjectileType.Faith, ProjectileMoveType.CoinParabola, score);
}
},
Table.Instance.AnimDataAssets.ProjectileCityExpMoveTime,"ActionLogic_Build_CoinAnim_1054");
//播放雾效和丢出cityexp的动画
actionParams.GridData.VFXRenderMarkFog = true;
MapRenderer.Instance.ProjectileManager.CreateProjectileMulti(v1,v2,ProjectileType.CityExp,ProjectileMoveType.CityExpHighParabola,cityExp);
//如果是temple播放对应faith分特效
if (actionParams.PlayerData.Id == actionParams.MapData.PlayerMap.SelfPlayerData.Id
&& (_actionId.ResourceType == ResourceType.Temple
|| _actionId.ResourceType == ResourceType.ForestTemple
|| _actionId.ResourceType == ResourceType.WaterTemple
|| _actionId.ResourceType == ResourceType.MountainTemple))
{
var faithPanel = GameObject.Find("UICanvas/TopBarPanel/FaithPanel/Icon").transform;
var endPos = faithPanel.position;
MapRenderer.Instance.ProjectileManager.CreateProjectile( v1, endPos,
ProjectileType.Faith, ProjectileMoveType.CoinParabola, 100);
}
}
else
Main.CityLogic.CityUpdateExp(actionParams.MapData,cityData,cityExp);
return true;
}
public override bool CheckCan(CommonActionParams actionParam)
{
//如果是unit或者city来执行build操作直接return false
if (actionParam.MainObjectType != MainObjectType.Grid)
return false;
if (actionParam.GridData == null)
return false;
//如果没有对应科技return false
if (!actionParam.PlayerData.TechTree.CheckActionCan(_actionId))
return false;
//判断钱够不够
if (GetCost() > actionParam.PlayerData.PlayerWealth)
return false;
//如果在有主领土,判断是敌人还是自己
if (actionParam.MapData.GetPlayerDataByTerritoryGridId(actionParam.GridData.Id, out var playerData))
{
//在敌人领土上直接return false
if (playerData != actionParam.PlayerData)
return false;
}
//如果在无主领土且不是bridge或者road,也要return false
else
if (_actionId.ResourceType != ResourceType.Bridge
&& _actionId.FeatureType != TerrainFeature.Road)
return false;
//如果有非联盟的敌人站在上面
if (actionParam.MapData.GetUnitDataByGid(actionParam.GridData.Id, out var unit)
&& !actionParam.MapData.CheckUnitIdBelongPlayerIdUnion(unit.Id, actionParam.PlayerData.Id))
return false;
//处理bridge
if (_actionId.ResourceType == ResourceType.Bridge)
{
//如果不是none或者fish的浅水直接return false
if (actionParam.GridData.Terrain != TerrainType.ShallowSea
|| (actionParam.GridData.Resource != ResourceType.None
&& actionParam.GridData.Resource != ResourceType.Fish))
return false;
//如果不存在桥两侧的陆地以供建桥梁
if (!actionParam.MapData.HasBridgeSideLand(actionParam.GridData,out var isMirror))
return false;
return true;
}
//处理road
if (_actionId.FeatureType == TerrainFeature.Road)
{
//如果是非陆地、村庄
if (actionParam.GridData.Terrain != TerrainType.Land ||
actionParam.GridData.Resource == ResourceType.CityCenter)
return false;
//如果已经有路或者是山体return false
if (actionParam.GridData.Feature != TerrainFeature.None)
return false;
return true;
}
//处理完了road和bridge剩下建筑必须都在自己领土上否则就return false
if (playerData == null)
return false;
//-------- 以下先处理改造资源的建筑
//处理lumberhut
if (_actionId.ResourceType == ResourceType.LumberHut)
{
//只有林子上空着或者有animal 才可能建lumberhut
if(actionParam.GridData.Vegetation == Vegetation.Trees
&& (actionParam.GridData.Resource == ResourceType.Animal
|| actionParam.GridData.Resource == ResourceType.None))
return true;
return false;
}
//处理mine
if (_actionId.ResourceType == ResourceType.Mine)
{
//只要resource是metal就可以建
if(actionParam.GridData.Resource == ResourceType.Metal)
return true;
return false;
}
//处理farm
if (_actionId.ResourceType == ResourceType.Farm)
{
//只要resource是crop就可以建
if(actionParam.GridData.Resource == ResourceType.Crop){
return true;
}
return false;
}
//-------- 再处理直接建设的建筑
//处理学院
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;
}
//处理port
if (_actionId.ResourceType == ResourceType.Port)
{
//如果不是none或者fish的浅水直接return false
if (actionParam.GridData.Terrain != TerrainType.ShallowSea
|| (actionParam.GridData.Resource != ResourceType.None
&& actionParam.GridData.Resource != ResourceType.Fish))
return false;
return true;
}
//剩下windmill sawmill forge market四天王先确定平地情况
if (actionParam.GridData.Terrain != TerrainType.Land
|| (actionParam.GridData.Feature == TerrainFeature.Mountain)
|| (actionParam.GridData.Vegetation == Vegetation.Trees)
|| (actionParam.GridData.Resource != ResourceType.None
&& actionParam.GridData.Resource != ResourceType.Crop
&& actionParam.GridData.Resource != ResourceType.Fruit))
return false;
//再确认周围有没有支持这个特殊建筑的附属建筑
if (!Main.CityLogic
.CalcGridBuildingLevel(actionParam.MapData, actionParam.GridData,
_actionId.ResourceType,out var level1))
return false;
//再确认city是否已经有一个对应的特殊建筑
if(actionParam.MapData.GetCityDataByTerritoryGid(actionParam.GridData.Id,out var cityData)
&& Main.CityLogic.GetBuildingLevelByCity(actionParam.MapData,cityData,_actionId.ResourceType,out var level2))
return false;
return true;
}
public override bool CheckShow(CommonActionParams actionParam)
{
//如果是unit或者city来执行build操作直接return false
if (actionParam.MainObjectType != MainObjectType.Grid)
return false;
if (actionParam.GridData == null)
return false;
//如果没有对应科技return false
if (!actionParam.PlayerData.TechTree.CheckActionCan(_actionId))
return false;
//如果在有主领土,判断是敌人还是自己
if (actionParam.MapData.GetPlayerDataByTerritoryGridId(actionParam.GridData.Id, out var playerData))
{
//在敌人领土上直接return false
if (playerData != actionParam.PlayerData)
return false;
}
//如果在无主领土且不是bridge或者road,也要return false
else
if (_actionId.ResourceType != ResourceType.Bridge
&& _actionId.FeatureType != TerrainFeature.Road)
return false;
//如果有非联盟的敌人站在上面
if (actionParam.MapData.GetUnitDataByGid(actionParam.GridData.Id, out var unit)
&& !actionParam.MapData.CheckUnitIdBelongPlayerIdUnion(unit.Id, actionParam.PlayerData.Id))
return false;
//处理bridge
if (_actionId.ResourceType == ResourceType.Bridge)
{
//如果不是none或者fish的浅水直接return false
if (actionParam.GridData.Terrain != TerrainType.ShallowSea
|| (actionParam.GridData.Resource != ResourceType.None
&& actionParam.GridData.Resource != ResourceType.Fish))
return false;
//如果不存在桥两侧的陆地以供建桥梁
if (!actionParam.MapData.HasBridgeSideLand(actionParam.GridData,out var isMirror))
return false;
return true;
}
//处理road
if (_actionId.FeatureType == TerrainFeature.Road)
{
//如果是非陆地、村庄
if (actionParam.GridData.Terrain != TerrainType.Land ||
actionParam.GridData.Resource == ResourceType.CityCenter)
return false;
//如果已经有路或者是山体return false
if (actionParam.GridData.Feature != TerrainFeature.None)
return false;
return true;
}
//处理完了road和bridge剩下建筑必须都在自己领土上否则就return false
if (playerData == null)
return false;
//-------- 以下先处理改造资源的建筑
//处理lumberhut
if (_actionId.ResourceType == ResourceType.LumberHut)
{
//只有林子上空着或者有animal 才可能建lumberhut
if(actionParam.GridData.Vegetation == Vegetation.Trees
&& (actionParam.GridData.Resource == ResourceType.Animal
|| actionParam.GridData.Resource == ResourceType.None))
return true;
return false;
}
//处理mine
if (_actionId.ResourceType == ResourceType.Mine)
{
//只要resource是metal就可以建
if(actionParam.GridData.Resource == ResourceType.Metal)
return true;
return false;
}
//处理farm
if (_actionId.ResourceType == ResourceType.Farm)
{
//只要resource是crop就可以建
if(actionParam.GridData.Resource == ResourceType.Crop){
return true;
}
return false;
}
//-------- 再处理直接建设的建筑
//处理学院
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
|| (actionParam.GridData.Resource != ResourceType.None
&& actionParam.GridData.Resource != ResourceType.Fish))
return false;
return true;
}
//剩下windmill sawmill forge market四天王先确定平地情况
if (actionParam.GridData.Terrain != TerrainType.Land
|| (actionParam.GridData.Feature == TerrainFeature.Mountain)
|| (actionParam.GridData.Vegetation == Vegetation.Trees)
|| (actionParam.GridData.Resource != ResourceType.None
&& actionParam.GridData.Resource != ResourceType.Crop))
return false;
//再确认周围有没有支持这个特殊建筑的附属建筑
if (!Main.CityLogic
.CalcGridBuildingLevel(actionParam.MapData, actionParam.GridData,
_actionId.ResourceType,out var level1))
return false;
//再确认city是否已经有一个对应的特殊建筑
if(actionParam.MapData.GetCityDataByTerritoryGid(actionParam.GridData.Id,out var cityData)
&& Main.CityLogic.GetBuildingLevelByCity(actionParam.MapData,cityData,_actionId.ResourceType,out var level2))
return false;
return true;
}
public override bool ExecuteViewBefore(CommonActionParams actionParams)
{
return false;
}
public override bool ExecuteViewAfter(CommonActionParams actionParams)
{
return false;
}
//付钱
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)
{
}
public override bool Execute(CommonActionParams actionParams, bool isMoment)
{
if (!BuildActionPayMoney(actionParams)) return false;
if (actionParams.PlayerData == null) return false;
if (!CheckCan(actionParams)) 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);
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 override bool ExecuteViewBefore(CommonActionParams actionParams)
{
return false;
}
public override bool ExecuteViewAfter(CommonActionParams actionParams)
{
//如果不是真mapdata在播放动画
if (Main.MapData != actionParams.MapData) return false;
//更新显示地块
actionParams.GridData.RenderMark = true;
//播放雾效
actionParams.GridData.SetGridVFXRenderMark(new GridVFXRenderMark(GridVFXType.Fog));
return true;
}
}
public class BuildActionBuildNavalBase : BuildAction
{
public BuildActionBuildNavalBase(CommonActionId id) : base(id)
{
}
public override bool Execute(CommonActionParams actionParams, bool isMoment)
{
if (!BuildActionPayMoney(actionParams))
return false;
actionParams.GridData.ResourceUnderBuilding = actionParams.GridData.Resource;
actionParams.GridData.Resource = ResourceType.NavalBase;
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 override bool ExecuteViewBefore(CommonActionParams actionParams)
{
return false;
}
public override bool ExecuteViewAfter(CommonActionParams actionParams)
{
//如果不是真mapdata在播放动画
if (Main.MapData != actionParams.MapData) return false;
//更新显示地块
actionParams.GridData.RenderMark = true;
//播放雾效
actionParams.GridData.SetGridVFXRenderMark(new GridVFXRenderMark(GridVFXType.Fog));
//如果有人站在军港上要更新他的renderMark
if (actionParams.MapData.GetUnitDataByGid(actionParams.GridData.Id, out var unit))
unit.RenderMark = true;
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;
}
public override bool Execute(CommonActionParams actionParams, bool isMoment)
{
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);
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 override bool ExecuteViewBefore(CommonActionParams actionParams)
{
return false;
}
public override bool ExecuteViewAfter(CommonActionParams actionParams)
{
//如果不是真mapdata在播放动画
if (Main.MapData != actionParams.MapData) return false;
//更新显示地块
actionParams.GridData.RenderMark = true;
//播放雾效
actionParams.GridData.SetGridVFXRenderMark(new GridVFXRenderMark(GridVFXType.Fog));
return true;
}
}
}