704 lines
34 KiB
C#
704 lines
34 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_Anim.Fragments;
|
||
using TH1_Core.Managers;
|
||
using TH1_Logic.Core;
|
||
using UnityEngine;
|
||
using TH1Renderer;
|
||
using TH1Resource;
|
||
|
||
|
||
public enum GridMiscActionType
|
||
{
|
||
None,
|
||
GrowForest,
|
||
ClearForest,
|
||
BurnForest,
|
||
Destroy,
|
||
UpgradeTemple,
|
||
GrowForestOutside,
|
||
CreateMountain,
|
||
SellMetal,
|
||
}
|
||
|
||
//这里是所有BuildAction派生子类的实现模块
|
||
namespace Logic.Action
|
||
{
|
||
|
||
//GridMisc行为逻辑类,包括Destroy, ClearForest GrowForest BurnForest
|
||
public class GridMiscAction : ActionLogicBase
|
||
{
|
||
public GridMiscAction(CommonActionId id) : base(id)
|
||
{
|
||
|
||
}
|
||
|
||
protected override bool Execute(CommonActionParams actionParams)
|
||
{
|
||
if (actionParams.PlayerData == null || actionParams.GridData == null)
|
||
return false;
|
||
if (!Table.Instance.ActionDataAssets.GetActionInfo(_actionId, out var actionInfo))
|
||
return false;
|
||
|
||
if (!CheckCan(actionParams)) return false;
|
||
|
||
//处理grow forest
|
||
if (_actionId.GridMiscActionType == GridMiscActionType.GrowForest)
|
||
{
|
||
actionParams.PlayerData.SpendCoin( actionInfo.Cost);
|
||
//拥有NapoleonicCode时,可在已有建筑上植树,不清除Resource
|
||
if (!actionParams.GridData.HasBuilding())
|
||
actionParams.GridData.Resource = ResourceType.None;
|
||
actionParams.GridData.Vegetation = Vegetation.Trees;
|
||
actionParams.GridData.Renderer(actionParams.MapData)?.InstantUpdateGrid(true);
|
||
//Step #1 处理因为树林变化带来的上方单位防御状态变化的情况
|
||
if (actionParams.GridData.VisibleUnit(actionParams.MapData,actionParams.PlayerData,out var unit))
|
||
unit.Renderer(actionParams.MapData)?.InstantUpdateUnit(true);
|
||
//Step #2 如果player拥有bambooMove技能,更新城市连通性
|
||
if (actionParams.PlayerData.TechTree.CheckIfHasTechAtom(TechAtom.KaguyaFrenchBambooMove))
|
||
Main.PlayerLogic.UpdateCityConnect(actionParams.MapData,actionParams.PlayerData);
|
||
|
||
//Step #3 更新所有领土内的levelbuilding
|
||
Main.PlayerLogic.UpdateTerritoryAllBuildingLevel(actionParams.MapData,actionParams.PlayerData.Id);
|
||
|
||
if (actionParams.GridData.InMainSight())
|
||
{
|
||
actionParams.GridData.Renderer(actionParams.MapData)?.InstantUpdateGrid(true);
|
||
actionParams.GridData.Renderer(actionParams.MapData)?.PlayVFXInSight(new GridVFXParams(GridVFXType.Fog));
|
||
}
|
||
ReportBoatUnitOnLandAfterGridMisc(actionParams);
|
||
return true;
|
||
}
|
||
|
||
//处理clear forest
|
||
if (_actionId.GridMiscActionType == GridMiscActionType.ClearForest)
|
||
{
|
||
actionParams.PlayerData.AddCoin( - actionInfo.Cost,actionParams.GridData);
|
||
actionParams.GridData.Resource = ResourceType.None;
|
||
actionParams.GridData.Vegetation = Vegetation.None;
|
||
actionParams.GridData.Renderer(actionParams.MapData)?.InstantUpdateGrid(true);
|
||
//处理因为树林变化带来的上方单位防御状态变化的情况
|
||
if (actionParams.GridData.VisibleUnit(actionParams.MapData,actionParams.PlayerData, out var unit))
|
||
unit.Renderer(actionParams.MapData)?.InstantUpdateUnit(true);
|
||
|
||
//更新所有领土内的levelbuilding
|
||
Main.PlayerLogic.UpdateTerritoryAllBuildingLevel(actionParams.MapData,actionParams.PlayerData.Id);
|
||
if (actionParams.GridData.InMainSight())
|
||
{
|
||
actionParams.GridData.Renderer(actionParams.MapData)?.InstantUpdateGrid(true);
|
||
actionParams.GridData.Renderer(actionParams.MapData)?.PlayVFXInSight(new GridVFXParams(GridVFXType.Fog));
|
||
}
|
||
|
||
ReportBoatUnitOnLandAfterGridMisc(actionParams);
|
||
return true;
|
||
}
|
||
|
||
//处理 burn forest
|
||
if (_actionId.GridMiscActionType == GridMiscActionType.BurnForest)
|
||
{
|
||
actionParams.PlayerData.SpendCoin(actionInfo.Cost);
|
||
actionParams.GridData.Vegetation = Vegetation.None;
|
||
actionParams.GridData.Resource = ResourceType.Crop;
|
||
actionParams.GridData.Renderer(actionParams.MapData)?.InstantUpdateGrid(true);
|
||
//更新所有领土内的levelbuilding
|
||
Main.PlayerLogic.UpdateTerritoryAllBuildingLevel(actionParams.MapData,actionParams.PlayerData.Id);
|
||
if (actionParams.GridData.InMainSight())
|
||
{
|
||
actionParams.GridData.Renderer(actionParams.MapData)?.InstantUpdateGrid(true);
|
||
actionParams.GridData.Renderer(actionParams.MapData)?.PlayVFXInSight(new GridVFXParams(GridVFXType.Fog));
|
||
}
|
||
ReportBoatUnitOnLandAfterGridMisc(actionParams);
|
||
return true;
|
||
}
|
||
|
||
//TODO Destroy整个改成更鲁棒的写法,不要逐一判断了,全部刷一遍levelbuilding就行了
|
||
//处理Destroy
|
||
if (_actionId.GridMiscActionType == GridMiscActionType.Destroy)
|
||
{
|
||
//Debug.Log($"执行拆除!目标是{actionParams.GridData.Resource}");
|
||
if (!Table.Instance.GridAndResourceDataAssets.GetResourceInfo(actionParams.GridData.Resource,
|
||
out var resourceInfo))
|
||
return false;
|
||
|
||
//如果destroy的位置是无主地块
|
||
if (!actionParams.MapData.GetCityDataByTerritoryGid(actionParams.GridData.Id, out var cityData)) return false;
|
||
|
||
//如果destroy的地块是bridge并且上面有无法visible但是realUnit,那么使得该单位揭露
|
||
if (actionParams.GridData.Resource == ResourceType.Bridge &&
|
||
actionParams.GridData.RealUnit(actionParams.MapData, out var gridUnit))
|
||
{
|
||
gridUnit.OnBeInteractTarget(actionParams.MapData,gridUnit,actionParams.GridData);
|
||
ReportBoatUnitOnLandAfterGridMisc(actionParams);
|
||
return true;
|
||
}
|
||
|
||
|
||
//更新destroy地块的内容,记录loseExp
|
||
var destroyGrid = actionParams.GridData;
|
||
//TODO 这里CityExp很危险,保护区就吃了亏,一定要改为通用方案
|
||
var loseExp = actionParams.GridData.CityExp();
|
||
var map = actionParams.MapData;
|
||
var player = actionParams.PlayerData;
|
||
//记录原始的Resource和Feature,用来判断是否需要清除Feature.Road并刷新周围格子
|
||
//var originalResource = actionParams.GridData.Resource;
|
||
//var originalFeature = actionParams.GridData.Feature;
|
||
actionParams.GridData.Resource = actionParams.GridData.ResourceUnderBuilding;
|
||
actionParams.GridData.ResourceUnderBuilding = ResourceType.None;
|
||
actionParams.GridData.buildingLevel = 0;
|
||
|
||
//如果拆除的是港口/桥梁,或者拆除的是单独的Road,需要把Feature还原为None
|
||
//并刷新周围格子的道路连接图案(与BuildActionLogic的port/bridge/road构建对称)
|
||
/*bool needRefreshAround = originalResource == ResourceType.Port
|
||
|| originalResource == ResourceType.Bridge
|
||
|| originalFeature == TerrainFeature.Road;
|
||
if (needRefreshAround)
|
||
{
|
||
actionParams.GridData.Feature = TerrainFeature.None;
|
||
var aroundBuf = new List<GridData>();
|
||
map.GridMap.GetAroundGridData(1, 1, actionParams.GridData, aroundBuf);
|
||
foreach (var tgrid in aroundBuf)
|
||
tgrid.Renderer(actionParams.MapData)?.InstantUpdateGrid(true);
|
||
}*/
|
||
|
||
//执行城市减去loseExp操作
|
||
Main.CityLogic.GridGiveCityExp_LogicView(map, player, destroyGrid, destroyGrid.BelongButNotOnGridCity(map),
|
||
-loseExp);
|
||
|
||
//更新格子的显示
|
||
if (actionParams.GridData.InMainSight())
|
||
{
|
||
actionParams.GridData.Renderer(actionParams.MapData)?.InstantUpdateGrid(true);
|
||
actionParams.GridData.Renderer(actionParams.MapData)?.PlayVFXInSight(new GridVFXParams(GridVFXType.Fog));
|
||
}
|
||
|
||
|
||
//刷新所有其他格子的情况
|
||
Main.PlayerLogic.UpdateTerritoryAllBuildingLevel(map,player.Id);
|
||
|
||
|
||
|
||
//刷新所有联通情况
|
||
Main.PlayerLogic.UpdateCityConnect(map,player);
|
||
|
||
//如果上面有unit,更新unit的显示
|
||
if (actionParams.GridData.VisibleUnit(actionParams.MapData,actionParams.PlayerData, out var unit))
|
||
unit.Renderer(actionParams.MapData)?.InstantUpdateUnit(true);
|
||
|
||
ReportBoatUnitOnLandAfterGridMisc(actionParams);
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
protected void ReportBoatUnitOnLandAfterGridMisc(CommonActionParams actionParams)
|
||
{
|
||
try
|
||
{
|
||
if (actionParams?.MapData == null || actionParams.GridData == null) return;
|
||
if (actionParams.GridData.RealUnit(actionParams.MapData, out var unit))
|
||
BoatUnitOnLandDiagnostic.ReportIfNeeded(
|
||
actionParams.MapData,
|
||
unit,
|
||
actionParams.GridData,
|
||
$"GridMiscAction:{_actionId.GridMiscActionType}");
|
||
}
|
||
catch (Exception e)
|
||
{
|
||
LogSystem.LogWarning($"GridMiscAction boat-on-land diagnostic failed: {e}");
|
||
}
|
||
}
|
||
|
||
public override bool CheckCan(CommonActionParams actionParams)
|
||
{
|
||
//如果是unit或者city来执行gridMisc操作,直接return false
|
||
if (actionParams.MainObjectType != MainObjectType.Grid)
|
||
return false;
|
||
if (actionParams.GridData == null)
|
||
return false;
|
||
//如果没有对应科技,return false
|
||
if (!actionParams.PlayerData.TechTree.CheckActionCan(_actionId))
|
||
return false;
|
||
|
||
|
||
//如果有非联盟的敌人站在上面
|
||
if (actionParams.GridData.VisibleUnit(actionParams.MapData,actionParams.PlayerData, out var unit)
|
||
&& !actionParams.MapData.CheckUnitIdBelongPlayerIdUnion(unit.Id, actionParams.PlayerData.Id))
|
||
return false;
|
||
|
||
//如果在有主领土,判断是敌人还是自己
|
||
if (actionParams.MapData.GetPlayerDataByTerritoryGridId(actionParams.GridData.Id, out var playerData))
|
||
{
|
||
//在敌人领土上,直接return false
|
||
if (playerData != actionParams.PlayerData)
|
||
return false;
|
||
}
|
||
//如果在无主领土 return false
|
||
else
|
||
return false;
|
||
|
||
//判断钱够不够
|
||
if (GetCost(actionParams) > actionParams.PlayerData.PlayerCoin)
|
||
return false;
|
||
|
||
//处理grow forest
|
||
if (_actionId.GridMiscActionType == GridMiscActionType.GrowForest)
|
||
{
|
||
if (actionParams.GridData.Terrain != TerrainType.Land) return false;
|
||
if (actionParams.GridData.Feature == TerrainFeature.Mountain) return false;
|
||
if (actionParams.GridData.Vegetation == Vegetation.Trees) return false;
|
||
|
||
//常规情况:只能在空地/作物/水果上植树
|
||
if (actionParams.GridData.Resource is ResourceType.None or ResourceType.Crop or ResourceType.Fruit)
|
||
return true;
|
||
//拥有NapoleonicCode时,可在平原上的常规建筑、军营、奇观上植树
|
||
//(含阵营专属建筑:RemiliaMilitary、KaguyaFrenchYard)
|
||
if (actionParams.PlayerData.TechTree.CheckIfHasTechAtom(TechAtom.KaguyaFrenchNapoleonicCode)
|
||
&& actionParams.GridData.Resource is ResourceType.Military or ResourceType.Windmill
|
||
or ResourceType.Sawmill or ResourceType.Forge or ResourceType.Market or ResourceType.Wonder
|
||
or ResourceType.RemiliaMilitary or ResourceType.KaguyaFrenchYard)
|
||
return true;
|
||
return false;
|
||
}
|
||
//处理clear forest 和 burn forest
|
||
if (_actionId.GridMiscActionType == GridMiscActionType.ClearForest || _actionId.GridMiscActionType == GridMiscActionType.BurnForest )
|
||
{
|
||
|
||
//如果没有树林 或者 树林已经不是none或animal return false
|
||
if (actionParams.GridData.Vegetation != Vegetation.Trees
|
||
|| (actionParams.GridData.Resource != ResourceType.None
|
||
&& actionParams.GridData.Resource != ResourceType.Animal))
|
||
return false;
|
||
return true;
|
||
}
|
||
|
||
//处理Destroy
|
||
if (_actionId.GridMiscActionType == GridMiscActionType.Destroy)
|
||
{
|
||
if(!Table.Instance.GridAndResourceDataAssets.CheckCanBeDestroy(actionParams.GridData.Resource))
|
||
return false;
|
||
|
||
//如果是桥梁,上面不能有只能站在陆地上的我方人
|
||
if (actionParams.GridData.Resource is ResourceType.Bridge &&
|
||
actionParams.GridData.VisibleUnit(actionParams.MapData,actionParams.PlayerData, out var gridUnit) &&
|
||
Table.Instance.UnitTypeDataAssets.GetUnitTypeInfo(gridUnit.UnitFullType, out var unitTypeInfo))
|
||
{
|
||
if(unitTypeInfo.LandType == LandType.LandOnly || unitTypeInfo.LandType == LandType.LandAndPort)
|
||
return false;
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
return false;
|
||
}
|
||
public override bool CheckShow(CommonActionParams actionParams,out ShowType showType)
|
||
{
|
||
showType = ShowType.None;
|
||
//如果是unit或者city来执行gridMisc操作,直接return false
|
||
if (actionParams.MainObjectType != MainObjectType.Grid)
|
||
return false;
|
||
if (actionParams.GridData == null)
|
||
return false;
|
||
//如果没有对应科技,return false
|
||
if (!actionParams.PlayerData.TechTree.CheckActionCan(_actionId))
|
||
return false;
|
||
|
||
|
||
//如果有非联盟的敌人站在上面
|
||
if (actionParams.GridData.VisibleUnit(actionParams.MapData,actionParams.PlayerData, out var unit)
|
||
&& !actionParams.MapData.CheckUnitIdBelongPlayerIdUnion(unit.Id, actionParams.PlayerData.Id))
|
||
return false;
|
||
|
||
//如果在有主领土,判断是敌人还是自己
|
||
if (actionParams.MapData.GetPlayerDataByTerritoryGridId(actionParams.GridData.Id, out var playerData))
|
||
{
|
||
//在敌人领土上,直接return false
|
||
if (playerData != actionParams.PlayerData)
|
||
return false;
|
||
}
|
||
//如果在无主领土 return false
|
||
else
|
||
return false;
|
||
|
||
//CheckShow 不需要判断金钱够不够
|
||
//if (GetCost() > actionParams.PlayerData.PlayerWealth)
|
||
// return false;
|
||
|
||
//处理grow forest
|
||
if (_actionId.GridMiscActionType == GridMiscActionType.GrowForest)
|
||
{
|
||
if (actionParams.GridData.Terrain != TerrainType.Land) return false;
|
||
if (actionParams.GridData.Feature == TerrainFeature.Mountain) return false;
|
||
if (actionParams.GridData.Vegetation == Vegetation.Trees) return false;
|
||
|
||
//常规情况:只能在空地/作物/水果上植树
|
||
if (actionParams.GridData.Resource is ResourceType.None or ResourceType.Crop or ResourceType.Fruit)
|
||
return true;
|
||
//拥有NapoleonicCode时,可在平原上的常规建筑、军营、奇观上植树
|
||
//(含阵营专属建筑:RemiliaMilitary、KaguyaFrenchYard)
|
||
if (actionParams.PlayerData.TechTree.CheckIfHasTechAtom(TechAtom.KaguyaFrenchNapoleonicCode)
|
||
&& actionParams.GridData.Resource is ResourceType.Military or ResourceType.Windmill
|
||
or ResourceType.Sawmill or ResourceType.Forge or ResourceType.Market or ResourceType.Wonder
|
||
or ResourceType.RemiliaMilitary or ResourceType.KaguyaFrenchYard)
|
||
return true;
|
||
return false;
|
||
}
|
||
//处理clear forest 和 burn forest
|
||
if (_actionId.GridMiscActionType == GridMiscActionType.ClearForest || _actionId.GridMiscActionType == GridMiscActionType.BurnForest )
|
||
{
|
||
|
||
//如果没有树林 或者 树林已经不是none或animal return false
|
||
if (actionParams.GridData.Vegetation != Vegetation.Trees
|
||
|| (actionParams.GridData.Resource != ResourceType.None
|
||
&& actionParams.GridData.Resource != ResourceType.Animal))
|
||
return false;
|
||
return true;
|
||
}
|
||
|
||
//处理Destroy
|
||
if (_actionId.GridMiscActionType == GridMiscActionType.Destroy)
|
||
{
|
||
if(!Table.Instance.GridAndResourceDataAssets.CheckCanBeDestroy(actionParams.GridData.Resource))
|
||
return false;
|
||
|
||
//如果是桥梁,上面不能有只能站在陆地上的我方人
|
||
if (actionParams.GridData.Resource is ResourceType.Bridge
|
||
&& actionParams.GridData.VisibleUnit(actionParams.MapData,actionParams.PlayerData, out var gridUnit)
|
||
&& Table.Instance.UnitTypeDataAssets
|
||
.GetUnitTypeInfo(gridUnit.UnitFullType,
|
||
out var unitTypeInfo))
|
||
{
|
||
if(unitTypeInfo.LandType == LandType.LandOnly || unitTypeInfo.LandType == LandType.LandAndPort)
|
||
return false;
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
return false;
|
||
}
|
||
|
||
//付钱
|
||
protected bool GridMiscActionPayMoney(CommonActionParams actionParam)
|
||
{
|
||
if (actionParam.PlayerData.PlayerCoin - GetCost(actionParam) < 0) return false;
|
||
actionParam.PlayerData.SpendCoin(GetCost(actionParam));
|
||
return true;
|
||
}
|
||
|
||
//确认是否满足基本信息
|
||
protected bool GridMiscActionCheckBaseInfo(CommonActionParams actionParam)
|
||
{
|
||
//如果是unit或者city来执行gridMisc操作,直接return false
|
||
if (actionParam.MainObjectType != MainObjectType.Grid)
|
||
return false;
|
||
if (actionParam.GridData == null)
|
||
return false;
|
||
return true;
|
||
}
|
||
|
||
//确认是否有科技
|
||
protected bool GridMiscActionCheckHasTech(CommonActionParams actionParam)
|
||
{
|
||
//如果没有对应科技,return false
|
||
if (!actionParam.PlayerData.TechTree.CheckActionCan(_actionId))
|
||
return false;
|
||
return true;
|
||
}
|
||
|
||
//确认是否有钱
|
||
protected bool GridMiscActionCheckHasMoney(CommonActionParams actionParam)
|
||
{
|
||
|
||
//否则走这里
|
||
if (GetCost(actionParam) > actionParam.PlayerData.PlayerCoin)
|
||
return false;
|
||
return true;
|
||
|
||
}
|
||
|
||
//确认是否在自己领土
|
||
protected bool GridMiscActionCheckInTerritory(CommonActionParams actionParam)
|
||
{
|
||
//如果在有主领土,判断是敌人还是自己
|
||
if (actionParam.MapData.GetPlayerDataByTerritoryGridId(actionParam.GridData.Id, out var playerData) && playerData == actionParam.PlayerData)
|
||
return true;
|
||
return false;
|
||
}
|
||
|
||
//确认是否有敌人占领
|
||
protected bool GridMiscActionCheckEnemyOccupy(CommonActionParams actionParam)
|
||
{
|
||
//如果有非联盟的敌人站在上面
|
||
if (actionParam.GridData.VisibleUnit(actionParam.MapData,actionParam.PlayerData, out var unit)
|
||
&& !actionParam.MapData.CheckUnitIdBelongPlayerIdUnion(unit.Id, actionParam.PlayerData.Id))
|
||
return true;
|
||
return false;
|
||
}
|
||
|
||
//确认该城市的唯一性并获得对应的building level
|
||
protected bool GridMiscActionCheckHasOne(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 GridMiscActionGrowTreeOutside : GridMiscAction
|
||
{
|
||
public GridMiscActionGrowTreeOutside(CommonActionId id) : base(id)
|
||
{
|
||
|
||
}
|
||
|
||
protected override bool Execute(CommonActionParams actionParams)
|
||
{
|
||
//if (!CheckCan(actionParams)) return false;
|
||
|
||
//step #1 办事 种树
|
||
actionParams.GridData.Resource = ResourceType.None;
|
||
actionParams.GridData.ResourceUnderBuilding = ResourceType.None;
|
||
actionParams.GridData.Vegetation = Vegetation.Trees;
|
||
//Step #2 如果player拥有bambooMove技能,更新城市连通性
|
||
if (actionParams.PlayerData.TechTree.CheckIfHasTechAtom(TechAtom.KaguyaFrenchBambooMove))
|
||
Main.PlayerLogic.UpdateCityConnect(actionParams.MapData,actionParams.PlayerData);
|
||
|
||
//Step #3 处理因为树林变化带来的上方单位防御状态变化的情况
|
||
if (actionParams.GridData.VisibleUnit(actionParams.MapData,actionParams.PlayerData, out var unit))
|
||
unit.Renderer(actionParams.MapData)?.InstantUpdateUnit(true);
|
||
|
||
//Step #4 更改视觉
|
||
actionParams.GridData.Renderer(actionParams.MapData)?.InstantUpdateGrid(true);
|
||
actionParams.GridData.Renderer(actionParams.MapData)?.PlayVFXInSight(new GridVFXParams(GridVFXType.Fog));
|
||
//step #5 扣钱
|
||
actionParams.PlayerData.SpendCoin(GetCost(actionParams));
|
||
return true;
|
||
}
|
||
|
||
public override bool CheckCan(CommonActionParams actionParam)
|
||
{
|
||
//step #1 check基本信息
|
||
if (!GridMiscActionCheckBaseInfo(actionParam)) return false;
|
||
//Step #2 check是否是中立领土,且terrain必须是land,Vegetarion必须是none,feature 必须不是mountain,resource只能是none fruit crop
|
||
if (actionParam.MapData.GetPlayerDataByTerritoryGridId(actionParam.GridId, out var _)) return false;
|
||
if (actionParam.GridData.Terrain != TerrainType.Land) return false;
|
||
if (actionParam.GridData.Feature == TerrainFeature.Mountain) return false;
|
||
if (!(actionParam.GridData.Resource is ResourceType.None or ResourceType.Fruit or ResourceType.Crop)) return false;
|
||
if (actionParam.GridData.Vegetation == Vegetation.Trees) return false;
|
||
//Step #3
|
||
if (!GridMiscActionCheckHasTech(actionParam)) return false;
|
||
//step #4 check是否有钱
|
||
if (!GridMiscActionCheckHasMoney(actionParam)) return false;
|
||
//step #5 check是否有敌人占领
|
||
if (GridMiscActionCheckEnemyOccupy(actionParam)) return false;
|
||
return true;
|
||
}
|
||
|
||
public override bool CheckShow(CommonActionParams actionParam,out ShowType showType)
|
||
{
|
||
showType = ShowType.None;
|
||
//step #1 check基本信息
|
||
if (!GridMiscActionCheckBaseInfo(actionParam)) return false;
|
||
//Step #2 check是否是中立领土,且terrain必须是land,Vegetarion必须是none,feature 必须不是mountain,resource只能是none fruit crop
|
||
if (actionParam.MapData.GetPlayerDataByTerritoryGridId(actionParam.GridId, out var _)) return false;
|
||
if (actionParam.GridData.Terrain != TerrainType.Land) return false;
|
||
if (actionParam.GridData.Feature == TerrainFeature.Mountain) return false;
|
||
if (!(actionParam.GridData.Resource is ResourceType.None or ResourceType.Fruit or ResourceType.Crop)) return false;
|
||
if (actionParam.GridData.Vegetation == Vegetation.Trees) return false;
|
||
//Step #3
|
||
if (!GridMiscActionCheckHasTech(actionParam)) return false;
|
||
//step #4 check是否有钱 这步不需要,没钱也可以show
|
||
//if (!GridMiscActionCheckHasMoney(actionParam)) return false;
|
||
//step #5 check是否有敌人占领
|
||
if (GridMiscActionCheckEnemyOccupy(actionParam)) return false;
|
||
return true;
|
||
}
|
||
|
||
}
|
||
|
||
public class GridMiscActionCreateMountain : GridMiscAction
|
||
{
|
||
public GridMiscActionCreateMountain(CommonActionId id) : base(id)
|
||
{
|
||
|
||
}
|
||
|
||
protected override bool Execute(CommonActionParams actionParams)
|
||
{
|
||
|
||
//step #1 办事 造山
|
||
var road = (actionParams.GridData.Feature == TerrainFeature.Road);
|
||
if (actionParams.GridData.Terrain != TerrainType.Land)
|
||
{
|
||
actionParams.GridData.Terrain = TerrainType.Land;
|
||
var dir4 = new List<Vector2>() { Vector2.up, Vector2.left, Vector2.down, Vector2.right };
|
||
var cur = actionParams.GridData.Pos.V2();
|
||
foreach (var dir in dir4)
|
||
{
|
||
if (!actionParams.MapData.GridMap.GetGridDataByV2(cur + dir, out var grid)) continue;
|
||
if (grid.Terrain == TerrainType.DeepSea)
|
||
{
|
||
grid.Terrain = TerrainType.ShallowSea;
|
||
grid.Renderer(actionParams.MapData)?.InstantUpdateGrid(true);
|
||
grid.Renderer(actionParams.MapData)?.PlayVFXInSight(new GridVFXParams(GridVFXType.Fog));
|
||
}
|
||
}
|
||
}
|
||
|
||
actionParams.GridData.Feature = TerrainFeature.Mountain;
|
||
if (actionParams.GridData.Resource == ResourceType.Crop)
|
||
actionParams.GridData.Resource = ResourceType.Metal;
|
||
else
|
||
{
|
||
actionParams.GridData.Resource = ResourceType.None;
|
||
var rd = actionParams.MapData.Net.GetRandom(actionParams.MapData).Next(0, 100);
|
||
if(rd <= 9)
|
||
actionParams.GridData.Resource = ResourceType.Metal;
|
||
}
|
||
|
||
//Step #2 如果原本这里有road,更新连通性
|
||
if (road)
|
||
Main.PlayerLogic.UpdateCityConnect(actionParams.MapData,actionParams.PlayerData);
|
||
|
||
//Step #3 处理因为变成山脉后,防御情况和视野情况
|
||
if (actionParams.GridData.VisibleUnit(actionParams.MapData,actionParams.PlayerData, out var unit))
|
||
{
|
||
unit.Renderer(actionParams.MapData)?.InstantUpdateUnit(true);
|
||
|
||
//该unit更新他自己player的sight
|
||
var count = Main.PlayerLogic.UpdateSightByRadius_LogicView(actionParams.MapData,unit.Player(actionParams.MapData),unit.Grid(actionParams.MapData),unit.GetSightRange(actionParams.MapData));
|
||
//更新对应的heroTask
|
||
unit.HeroTask(actionParams.MapData)?.OnExploredGrids(actionParams.MapData, unit, count);
|
||
}
|
||
|
||
|
||
//Step #4 更改视觉
|
||
actionParams.GridData.Renderer(actionParams.MapData)?.InstantUpdateGrid(true);
|
||
actionParams.GridData.Renderer(actionParams.MapData)?.PlayVFXInSight(new GridVFXParams(GridVFXType.Fog));
|
||
|
||
//Step #5 更新所有建筑的情况(因为会影响学院)
|
||
Main.PlayerLogic.UpdateTerritoryAllBuildingLevel(actionParams.MapData,actionParams.PlayerData.Id);
|
||
|
||
//step #6 扣钱
|
||
actionParams.PlayerData.SpendCoin(GetCost(actionParams));
|
||
actionParams.PlayerData.PlayerMountainPointUsed++;
|
||
ReportBoatUnitOnLandAfterGridMisc(actionParams);
|
||
return true;
|
||
}
|
||
|
||
public override bool CheckCan(CommonActionParams actionParam)
|
||
{
|
||
//step #1 check基本信息
|
||
if (!GridMiscActionCheckBaseInfo(actionParam)) return false;
|
||
//Step #2 check是否是我方领土,并且必须没有建筑,并且不能已经是山,不能有树
|
||
if (actionParam.GridData.Player(actionParam.MapData) != actionParam.PlayerData) return false;
|
||
if (actionParam.GridData.HasBuilding()) return false;
|
||
if (actionParam.GridData.Feature == TerrainFeature.Mountain) return false;
|
||
if (actionParam.GridData.Vegetation == Vegetation.Trees) return false;
|
||
//Step #3 确认是否有科技
|
||
if (!GridMiscActionCheckHasTech(actionParam)) return false;
|
||
//step #4 check是否有造山点
|
||
var mp =Main.PlayerLogic.GetPlayerMountainPoint(actionParam.MapData, actionParam.PlayerId);
|
||
if (actionParam.PlayerData.PlayerMountainPointUsed >= mp) return false;
|
||
//step #5 check是否有钱
|
||
if (!GridMiscActionCheckHasMoney(actionParam)) return false;
|
||
//step #6 如果是水中造山,必须有techatom山海奇迹
|
||
if (actionParam.GridData.Terrain != TerrainType.Land && !actionParam.PlayerData.TechTree.CheckIfHasTechAtom(TechAtom.CreateMountainWater)) return false;
|
||
//step #7 check是否有敌人占领
|
||
if (GridMiscActionCheckEnemyOccupy(actionParam)) return false;
|
||
return true;
|
||
}
|
||
|
||
public override bool CheckShow(CommonActionParams actionParam,out ShowType showType)
|
||
{
|
||
showType = ShowType.None;
|
||
//step #1 check基本信息
|
||
if (!GridMiscActionCheckBaseInfo(actionParam)) return false;
|
||
//Step #2 check是否是我方领土,并且必须没有建筑,并且不能已经是山,不能有树
|
||
if (actionParam.GridData.Player(actionParam.MapData) != actionParam.PlayerData) return false;
|
||
if (actionParam.GridData.HasBuilding()) return false;
|
||
if (actionParam.GridData.Feature == TerrainFeature.Mountain) return false;
|
||
if (actionParam.GridData.Vegetation == Vegetation.Trees) return false;
|
||
//Step #3 确认是否有科技
|
||
if (!GridMiscActionCheckHasTech(actionParam)) return false;
|
||
//step #4 如果是水中造山,必须有techatom山海奇迹
|
||
if (actionParam.GridData.Terrain != TerrainType.Land && !actionParam.PlayerData.TechTree.CheckIfHasTechAtom(TechAtom.CreateMountainWater)) return false;
|
||
//step #5 check是否有钱
|
||
if (!GridMiscActionCheckHasMoney(actionParam)) showType = ShowType.Cost;
|
||
//step #6 check是否有造山点
|
||
var mp =Main.PlayerLogic.GetPlayerMountainPoint(actionParam.MapData, actionParam.PlayerId);
|
||
if (actionParam.PlayerData.PlayerMountainPointUsed >= mp) showType = ShowType.Locked;
|
||
//step #7 check是否有敌人占领
|
||
if (GridMiscActionCheckEnemyOccupy(actionParam)) return false;
|
||
return true;
|
||
}
|
||
|
||
}
|
||
|
||
|
||
public class GridMiscActionSellMetal : GridMiscAction
|
||
{
|
||
public GridMiscActionSellMetal(CommonActionId id) : base(id)
|
||
{
|
||
|
||
}
|
||
|
||
protected override bool Execute(CommonActionParams actionParams)
|
||
{
|
||
|
||
//step #1 办事 收矿
|
||
actionParams.GridData.Resource = ResourceType.None;
|
||
|
||
//Step #2 更改视觉
|
||
if (actionParams.GridData.InMainSight())
|
||
{
|
||
actionParams.GridData.Renderer(actionParams.MapData)?.InstantUpdateGrid(true);
|
||
actionParams.GridData.Renderer(actionParams.MapData)?.PlayVFXInSight(new GridVFXParams(GridVFXType.Fog));
|
||
}
|
||
|
||
//step #3 加钱
|
||
actionParams.PlayerData.AddCoin(-GetCost(actionParams),actionParams.GridData);
|
||
return true;
|
||
}
|
||
|
||
public override bool CheckCan(CommonActionParams actionParam)
|
||
{
|
||
//step #1 check基本信息
|
||
if (!GridMiscActionCheckBaseInfo(actionParam)) return false;
|
||
//Step #2 check是否是我方领土,并且必须是Metal
|
||
if (actionParam.GridData.Player(actionParam.MapData) != actionParam.PlayerData) return false;
|
||
if (actionParam.GridData.Resource != ResourceType.Metal) return false;
|
||
//Step #3 确认是否有科技
|
||
if (!GridMiscActionCheckHasTech(actionParam)) return false;
|
||
//step #4 check是否有敌人占领
|
||
if (GridMiscActionCheckEnemyOccupy(actionParam)) return false;
|
||
return true;
|
||
}
|
||
|
||
public override bool CheckShow(CommonActionParams actionParam,out ShowType showType)
|
||
{
|
||
showType = ShowType.None;
|
||
return CheckCan(actionParam);
|
||
}
|
||
|
||
}
|
||
|
||
}
|