969 lines
46 KiB
C#
969 lines
46 KiB
C#
/*
|
||
* @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;
|
||
}
|
||
}
|
||
|
||
} |