/* * @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 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) { } protected 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 ActionShowState CheckShowState(CommonActionParams actionParams) { return ActionShowState.None; } 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; } //-------------------------------------- 视觉部分 ------------------------------- //常规建筑更新 protected bool UpdateViewAfterBuild(CommonActionParams actionParam) { //如果不是真mapdata在播放动画 if (Main.MapData != actionParam.MapData) return false; //更新显示地块 actionParam.GridData.RenderMark = true; //播放雾效 actionParam.GridData.SetGridVFXRenderMark(new GridVFXRenderMark(GridVFXType.Fog)); return true; } } public class BuildActionBuildPreserve : BuildAction { public BuildActionBuildPreserve(CommonActionId id) : base(id) { } protected override bool Execute(CommonActionParams actionParams, bool isMoment) { 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); 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) { } protected 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; } protected 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; } } public class BuildActionBuildKaguyaFrenchYard : BuildAction { public BuildActionBuildKaguyaFrenchYard(CommonActionId id) : base(id) { } protected override bool Execute(CommonActionParams actionParams, bool isMoment) { 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); //更新视觉 UpdateViewAfterBuild(actionParams); 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; 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; return true; } } }