This commit is contained in:
daixiawu 2025-06-25 00:14:09 +08:00
parent 72eaa34843
commit c446a3bb20
15 changed files with 225 additions and 58 deletions

View File

@ -12,7 +12,7 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 7a686a47eee2fa44cb0a34b5d86e4d5e, type: 3}
m_Name: BT
m_EditorClassIdentifier:
_serializedGraph: '{"type":"NodeCanvas.BehaviourTrees.BehaviourTree","nodes":[{"_position":{"x":216.5371,"y":116.0371},"$type":"NodeCanvas.BehaviourTrees.Selector","$id":"0"},{"_subTree":{"_value":1},"_tag":"\u9632\u5b88\u79d1\u6280","_position":{"x":-223.1669,"y":366.2295},"_comment":"","$type":"NodeCanvas.BehaviourTrees.SubTree","$id":"1"},{"_subTree":{"_value":2},"_tag":"\u57ce\u5e02","_position":{"x":-39.6286,"y":368.0934},"$type":"NodeCanvas.BehaviourTrees.SubTree","$id":"2"},{"_subTree":{"_value":3},"_tag":"\u53d1\u5c55\u79d1\u6280","_position":{"x":151.7755,"y":366.7513},"$type":"NodeCanvas.BehaviourTrees.SubTree","$id":"3"},{"_subTree":{"_value":4},"_tag":"\u81ea\u7531\u4eba","_position":{"x":338.4889,"y":362.5828},"$type":"NodeCanvas.BehaviourTrees.SubTree","$id":"4"},{"_subTree":{"_value":5},"_tag":"\u519b\u56e2","_position":{"x":516.5888,"y":362.6096},"$type":"NodeCanvas.BehaviourTrees.SubTree","$id":"5"},{"_subTree":{"_value":6},"_tag":"\u514b\u5236\u79d1\u6280","_position":{"x":706.7617,"y":357.8222},"$type":"NodeCanvas.BehaviourTrees.SubTree","$id":"6"},{"_action":{"$type":"NodeCanvas.Tasks.Actions.AIFinishAction"},"_position":{"x":873.0679,"y":363.9172},"$type":"NodeCanvas.BehaviourTrees.ActionNode","$id":"7"}],"connections":[{"_sourceNode":{"$ref":"0"},"_targetNode":{"$ref":"1"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"0"},"_targetNode":{"$ref":"2"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"0"},"_targetNode":{"$ref":"3"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"0"},"_targetNode":{"$ref":"4"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"0"},"_targetNode":{"$ref":"5"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"0"},"_targetNode":{"$ref":"6"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"0"},"_targetNode":{"$ref":"7"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"}],"canvasGroups":[],"localBlackboard":{"_variables":{}},"derivedData":{"repeat":true,"$type":"NodeCanvas.BehaviourTrees.BehaviourTree+DerivedSerializationData"}}'
_serializedGraph: '{"type":"NodeCanvas.BehaviourTrees.BehaviourTree","nodes":[{"_position":{"x":216.5371,"y":116.0371},"$type":"NodeCanvas.BehaviourTrees.Selector","$id":"0"},{"_subTree":{"_value":1},"_tag":"\u9632\u5b88\u79d1\u6280","_position":{"x":-223.1669,"y":366.2295},"_comment":"","$type":"NodeCanvas.BehaviourTrees.SubTree","$id":"1"},{"_subTree":{"_value":2},"_tag":"\u57ce\u5e02","_position":{"x":-39.6286,"y":368.0934},"$type":"NodeCanvas.BehaviourTrees.SubTree","$id":"2"},{"_subTree":{"_value":3},"_tag":"\u53d1\u5c55\u79d1\u6280","_position":{"x":151.7755,"y":366.7513},"$type":"NodeCanvas.BehaviourTrees.SubTree","$id":"3"},{"_subTree":{"_value":4},"_tag":"\u81ea\u7531\u4eba","_position":{"x":338.4889,"y":362.5828},"$type":"NodeCanvas.BehaviourTrees.SubTree","$id":"4"},{"_subTree":{"_value":5},"_tag":"\u519b\u56e2","_position":{"x":516.5888,"y":362.6096},"$type":"NodeCanvas.BehaviourTrees.SubTree","$id":"5"},{"_subTree":{"_value":6},"_tag":"\u514b\u5236\u79d1\u6280","_position":{"x":706.7617,"y":357.8222},"$type":"NodeCanvas.BehaviourTrees.SubTree","$id":"6"},{"_subTree":{"_value":7},"_tag":"\u6361\u6f0f\u79d1\u6280\u53d1\u5c55","_position":{"x":924.2001,"y":356.6},"$type":"NodeCanvas.BehaviourTrees.SubTree","$id":"7"},{"_action":{"$type":"NodeCanvas.Tasks.Actions.AIFinishAction"},"_position":{"x":1100.668,"y":358.5172},"$type":"NodeCanvas.BehaviourTrees.ActionNode","$id":"8"}],"connections":[{"_sourceNode":{"$ref":"0"},"_targetNode":{"$ref":"1"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"0"},"_targetNode":{"$ref":"2"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"0"},"_targetNode":{"$ref":"3"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"0"},"_targetNode":{"$ref":"4"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"0"},"_targetNode":{"$ref":"5"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"0"},"_targetNode":{"$ref":"6"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"0"},"_targetNode":{"$ref":"7"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"0"},"_targetNode":{"$ref":"8"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"}],"canvasGroups":[],"localBlackboard":{"_variables":{}},"derivedData":{"repeat":true,"$type":"NodeCanvas.BehaviourTrees.BehaviourTree+DerivedSerializationData"}}'
_objectReferences:
- {fileID: 0}
- {fileID: 11400000, guid: 5c2d56f30f0281f4b89ebbbe5f2015e8, type: 2}
@ -21,11 +21,12 @@ MonoBehaviour:
- {fileID: 11400000, guid: c172427e55805814c9b171c0d4a91cb1, type: 2}
- {fileID: 11400000, guid: cf5354f0e5a794a4688155a6dc1354f9, type: 2}
- {fileID: 11400000, guid: 48449983bc4403b46bf23ded188b0a3c, type: 2}
- {fileID: 11400000, guid: 3179cc79a3507e445b1078a7ffea49f5, type: 2}
_graphSource:
_version: 3.33
_category:
_comments:
_translation: {x: 792, y: 220}
_zoomFactor: 0.92921627
_translation: {x: -204, y: 459}
_zoomFactor: 1
_haltSerialization: 0
_externalSerializationFile: {fileID: 0}

View File

@ -0,0 +1,24 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 7a686a47eee2fa44cb0a34b5d86e4d5e, type: 3}
m_Name: 'CommonTech '
m_EditorClassIdentifier:
_serializedGraph: '{"type":"NodeCanvas.BehaviourTrees.BehaviourTree","nodes":[{"_position":{"x":487.8,"y":543.2001},"$type":"NodeCanvas.BehaviourTrees.Sequencer","$id":"0"},{"_action":{"MarkStr":"DevelopmentTechFinal","CheckNotHave":true,"$type":"NodeCanvas.Tasks.Actions.MarkAction"},"_position":{"x":113.4,"y":687.2},"$type":"NodeCanvas.BehaviourTrees.ActionNode","$id":"1"},{"_position":{"x":695.4,"y":644.2},"$type":"NodeCanvas.BehaviourTrees.Selector","$id":"2"},{"_position":{"x":554.0001,"y":759.6},"$type":"NodeCanvas.BehaviourTrees.Sequencer","$id":"3"},{"_action":{"ActionTypes":[9],"$type":"NodeCanvas.Tasks.Actions.AIGeneratorAction"},"_tag":"","_position":{"x":402.4702,"y":907.9698},"$type":"NodeCanvas.BehaviourTrees.ActionNode","$id":"4"},{"_action":{"CalculateTypes":[34],"$type":"NodeCanvas.Tasks.Actions.AICalculateAction"},"_tag":"","_position":{"x":565.9526,"y":907.599},"$type":"NodeCanvas.BehaviourTrees.ActionNode","$id":"5"},{"_action":{"$type":"NodeCanvas.Tasks.Actions.AIExecuteAction"},"_tag":"","_position":{"x":746.7076,"y":904.691},"$type":"NodeCanvas.BehaviourTrees.ActionNode","$id":"6"},{"_action":{"MarkStr":"DevelopmentTechFinal","$type":"NodeCanvas.Tasks.Actions.MarkAction"},"_position":{"x":800.4,"y":754.0},"$type":"NodeCanvas.BehaviourTrees.ActionNode","$id":"7"}],"connections":[{"_sourceNode":{"$ref":"0"},"_targetNode":{"$ref":"1"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"0"},"_targetNode":{"$ref":"2"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"2"},"_targetNode":{"$ref":"3"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"2"},"_targetNode":{"$ref":"7"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"3"},"_targetNode":{"$ref":"4"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"3"},"_targetNode":{"$ref":"5"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"3"},"_targetNode":{"$ref":"6"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"}],"canvasGroups":[],"localBlackboard":{"_variables":{}},"derivedData":{"repeat":true,"$type":"NodeCanvas.BehaviourTrees.BehaviourTree+DerivedSerializationData"}}'
_objectReferences: []
_graphSource:
_version: 3.33
_category:
_comments:
_translation: {x: 57, y: 10}
_zoomFactor: 1
_haltSerialization: 0
_externalSerializationFile: {fileID: 0}

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 3179cc79a3507e445b1078a7ffea49f5
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@ -18,7 +18,7 @@ MonoBehaviour:
_version: 3.33
_category:
_comments:
_translation: {x: 5126, y: -347}
_zoomFactor: 0.9998963
_translation: {x: 4410, y: 394}
_zoomFactor: 1
_haltSerialization: 0
_externalSerializationFile: {fileID: 0}

View File

@ -18,7 +18,7 @@ MonoBehaviour:
_version: 3.33
_category:
_comments:
_translation: {x: 159, y: -1429}
_zoomFactor: 0.7500665
_translation: {x: -110, y: -2333}
_zoomFactor: 1
_haltSerialization: 0
_externalSerializationFile: {fileID: 0}

View File

@ -18,7 +18,7 @@ MonoBehaviour:
_version: 3.33
_category:
_comments:
_translation: {x: -881, y: 477}
_zoomFactor: 0.72269636
_translation: {x: -147, y: 557}
_zoomFactor: 0.25008237
_haltSerialization: 0
_externalSerializationFile: {fileID: 0}

View File

@ -279,19 +279,6 @@ MonoBehaviour:
GiantTechSet:
FatherTechType: 2
techActions:
- ActionType: 4
WonderType: 0
ResourceType: 0
FeatureType: 0
TerrainType: 0
UnitType: 9
GiantType: 0
Vegetation: 0
UnitActionType: 0
CityLevelUpActionType: 0
GridMiscActionType: 0
SkillType: 0
TechType: 0
- ActionType: 2
WonderType: 2
ResourceType: 0

View File

@ -107872,7 +107872,7 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 4c0a91e9c554c694791fbd5691165798, type: 3}
m_Name:
m_EditorClassIdentifier:
NoAI: 1
NoAI: 0
FullSight: 1
AIActionTime: 0.5
AIAllTech: 0

View File

@ -509,11 +509,11 @@ namespace RuntimeData
[Serializable]
public class TechTreeData : ISerializationCallbackReceiver
{
private HashSet<TechType> TechSet;
public HashSet<TechType> TechSet;
public HashSet<uint> TechActionCacheSet;
//仅用于序列化
public List<TechType> TechList;
public List<TechType> TechListForSerial;
public List<uint> TechActionCacheList;
@ -541,11 +541,11 @@ namespace RuntimeData
public void OnBeforeSerialize()
{
TechList ??= new List<TechType>();
TechListForSerial ??= new List<TechType>();
TechActionCacheList ??= new List<uint>();
TechList.Clear();
TechListForSerial.Clear();
TechActionCacheList.Clear();
foreach (var techType in TechSet) TechList.Add(techType);
foreach (var techType in TechSet) TechListForSerial.Add(techType);
foreach (var cache in TechActionCacheSet) TechActionCacheList.Add(cache);
}
@ -555,7 +555,7 @@ namespace RuntimeData
TechActionCacheSet ??= new HashSet<uint>();
TechSet.Clear();
TechActionCacheSet.Clear();
foreach (var techType in TechList) TechSet.Add(techType);
foreach (var techType in TechListForSerial) TechSet.Add(techType);
foreach (var cache in TechActionCacheList) TechActionCacheSet.Add(cache);
}

View File

@ -624,6 +624,7 @@ namespace Logic.AI
// 国家进攻
if (CountryStrategy == Strategy.Attack)
{
foreach (var legionId in waitLegions)
{
foreach (var city in Map.CityMap.CityList)
@ -631,6 +632,8 @@ namespace Logic.AI
if (!LegionCanMoveCities[legionId].Contains(city.Id)) continue;
if (selfCity.Contains(city)) continue;
if (!Map.GetGridDataByCityId(city.Id, out var cityGrid)) continue;
//如果
if (CalPlayerCityMinDistance(Player, city) > 5) continue;
var score = (2 * LegionScore[legionId] - CityDefendScore[city.Id] - CityRescueScore[city.Id]) /
(Map.GridMap.CalcDistance(cityGrid, LegionGrid[legionId]) + 1);
results.Add(new MatchResult(legionId, city.Id, score));
@ -920,25 +923,31 @@ namespace Logic.AI
private int CalThreatScore(PlayerData target)
{
int score = 0;
if (Player.LastAttackPlayers.Contains(target.Id)) score = 10;
if (Player.LastAttackPlayers.Contains(target.Id)) score += 2;
var gridSet = Map.GetPlayerTerritoryGridIdSet(Player.Id);
var unitList = new List<UnitData>();
Map.GetUnitDataListByPlayerId(target.Id, unitList);
foreach (var gridId in gridSet)
foreach (var unit in unitList)
{
if (!Map.GridMap.GetGridDataByGid(gridId, out var grid)) continue;
foreach (var unit in unitList)
if (!Map.GetGridDataByUnitId(unit.Id, out var unitGrid)) continue;
foreach (var gridId in gridSet)
{
if (!Map.GetGridDataByUnitId(unit.Id, out var unitGrid)) continue;
if (!Map.GridMap.GetGridDataByGid(gridId, out var grid)) continue;
if (gridSet.Contains(unitGrid.Id))
{
score += 2;
continue;
break;
}
//TODO 复杂度可从O(n)降低到O(8)
var distance = Map.GridMap.CalcDistance(grid, unitGrid);
if (distance == 1) score += 1;
if (distance == 1)
{
score += 1;
break;
}
}
}
return score;
@ -1065,12 +1074,53 @@ namespace Logic.AI
CountryStrategy = Strategy.Defend;
return;
}
bool HasCityCenterNearBy = false;
var targetGrids = new HashSet<GridData>();
int PathLimit = 5;
//判断5格内有没有村庄有的话执行发展战略遍历每个城市然后遍历每个城市中心的5格内情况
foreach (var city in Map.CityMap.CityList)
if(Map.GetPlayerIdByCityId(city.Id,out var tmpPlayer) && tmpPlayer == Player.Id)
{
if(!Map.GetGridDataByCityId(city.Id,out var capitalGrid))
continue;
var gridList = Map.GridMap.GetAroundGridData(PathLimit, PathLimit, capitalGrid);
foreach (var grid in gridList)
if (grid.Resource == ResourceType.CityCenter && !Map.GetCityDataByGid(grid.Id, out _))
targetGrids.Add(grid);
}
if(Map.GetCapitalCityDataByPlayerId(Player.Id, out var capital) && Map.GetGridDataByCityId(capital.Id,out var start))
foreach (var target in targetGrids)
{
var path = PathFinder.FindPath((int)Map.MapConfig.Width, (int)Map.MapConfig.Height,
new (start.Pos.X, start.Pos.Y), new (target.Pos.X, target.Pos.Y), Map, Player);
if (!path.found) continue;
if (path.length <= PathLimit )
{
HasCityCenterNearBy = true;
break;
}
}
if (HasCityCenterNearBy)
{
CountryStrategy = Strategy.Development;
return;
}
//然后判断是否做进攻的国家战略
foreach (var target in Map.PlayerMap.PlayerDataList)
{
if (target == Player) continue;
if (ThreatScore[target.Id] < 2) continue;
if (MilitaryGapScore[target.Id] < -5) continue;
//daixiawu增加 如果距离过远也continue要求双方最近的两个城市距离<=5
//TODO 暂时用的直线距离 要改成寻路距离
if (CalPlayerMinCityDistance(Player, target) > 5) continue;
CountryStrategy = Strategy.Attack;
AttackPlayer = target;
return;
@ -1172,7 +1222,60 @@ namespace Logic.AI
return score;
}
// 计算城市最近边境距离
// 计算两国最近的城市的距离
private int CalPlayerMinCityDistance(PlayerData player1, PlayerData player2)
{
var player1Cities = new List<CityData>();
var player2Cities = new List<CityData>();
Map.GetCityDataListByPlayerId(player1.Id, player1Cities);
Map.GetCityDataListByPlayerId(player2.Id, player2Cities);
int minDistance = int.MaxValue;
foreach (var city1 in player1Cities)
{
if (!Map.GetGridDataByCityId(city1.Id, out var grid1)) continue;
foreach (var city2 in player2Cities)
{
if (!Map.GetGridDataByCityId(city2.Id, out var grid2)) continue;
int distance = Map.GridMap.CalcDistance(grid1, grid2);
if (distance < minDistance)
{
minDistance = distance;
}
}
}
return minDistance;
}
//计算一个城市 与另一个国家最近的城市的距离
private int CalPlayerCityMinDistance(PlayerData player1, CityData city2)
{
if (!Map.GetGridDataByCityId(city2.Id, out var grid2)) return int.MaxValue;
var player1Cities = new List<CityData>();
Map.GetCityDataListByPlayerId(player1.Id, player1Cities);
int minDistance = int.MaxValue;
foreach (var city1 in player1Cities)
{
if (!Map.GetGridDataByCityId(city1.Id, out var grid1)) continue;
int distance = Map.GridMap.CalcDistance(grid1, grid2);
if (distance < minDistance)
{
minDistance = distance;
}
}
return minDistance;
}
// 计算城市最近的别国边境距离
private int CalCityBorderDistance(CityData city)
{
if (!Map.GetGridDataByCityId(city.Id, out var selfGrid)) return 0;
@ -1307,5 +1410,12 @@ namespace Logic.AI
&& player.Sight.CheckIsInSight(cityGrid.Id)) return;
IsInSight = false;
}
public string DebugInfo()
{
if (ActionLogic.ActionId.ActionType == CommonActionType.Gain || ActionLogic.ActionId.ActionType == CommonActionType.Build || ActionLogic.ActionId.ActionType == CommonActionType.BuildWonder)
return ActionLogic.ActionId.ActionType + " " + ActionLogic.ActionId.ResourceType;
return ActionLogic.ActionId.ActionType.ToString();
}
}
}

View File

@ -980,7 +980,7 @@ namespace Logic.AI
private static void CalculateTechGap(AICalculatorData data, CommonActionParams param, CalculateResult result)
{
var score = 0f;
foreach (var tech in param.PlayerData.TechTree.TechList)
foreach (var tech in param.PlayerData.TechTree.TechSet)
{
if (!data.TechGapScore.TryGetValue(tech, out var value)) continue;
score += value;
@ -992,7 +992,7 @@ namespace Logic.AI
private static void CalculateTechResource(AICalculatorData data, CommonActionParams param, CalculateResult result)
{
var score = 0f;
foreach (var tech in param.PlayerData.TechTree.TechList)
foreach (var tech in param.PlayerData.TechTree.TechSet)
{
if (!data.TechResourceScore.TryGetValue(tech, out var value)) continue;
score += value;
@ -1030,20 +1030,20 @@ namespace Logic.AI
int player1Score = 0;
int player2Score = 0;
int gapScore = 0;
foreach (var tech in player1.TechTree.TechList)
foreach (var tech in player1.TechTree.TechSet)
{
var techInfo = Table.Instance.TechDataAssets.GetTechInfo(tech);
player1Score += techInfo.CostLevel;
}
foreach (var tech in player2.TechTree.TechList)
foreach (var tech in player2.TechTree.TechSet)
{
var techInfo = Table.Instance.TechDataAssets.GetTechInfo(tech);
player2Score += techInfo.CostLevel;
}
foreach (var tech1 in player1.TechTree.TechList)
foreach (var tech1 in player1.TechTree.TechSet)
{
foreach (var tech2 in player2.TechTree.TechList)
foreach (var tech2 in player2.TechTree.TechSet)
{
gapScore += CalculatePlayerTechGapScore(tech1, tech2);
gapScore -= CalculatePlayerTechGapScore(tech2, tech1);

View File

@ -170,7 +170,7 @@ namespace Logic.AI
//其他单独处理
if (tech == TechType.Philosophy)
other += 26 - player.TechTree.TechList.Count;
other += 26 - player.TechTree.TechSet.Count;
if (tech == TechType.Roads)
other += map.GetCityCount(player.Id) * 2;

View File

@ -784,7 +784,7 @@ namespace Logic.Action
//扣钱,收获资产,把资产送往city
actionParams.PlayerData.PlayerWealth -= GetCost();
//如果是玩家,执行一整套播放动画的逻辑
//临时做法用来播放VFX,获取Main理应向MapData写入一个VFX的RenderMark的
var main = GameObject.Find("Main").GetComponent<Main>();
if (main.MapData == actionParams.MapData && actionParams.PlayerData.Id == actionParams.MapData.PlayerMap.SelfPlayerData.Id)
@ -813,14 +813,15 @@ namespace Logic.Action
//播放雾效和丢出cityexp的动画
actionParams.GridData.VFXRenderMarkFog = true;
main.MapRenderer.ProjectileManager.CreateProjectile(main,actionParams.MapData,v1,v2,ProjectileType.CityExp,ProjectileMoveType.CityExpHighParabola);
actionParams.GridData.Resource = ResourceType.None;
actionParams.GridData.RenderMark = true;
}
//否则执行常规
else
{
Main.CityLogic.CityUpdateExp(actionParams.MapData,cityData,Table.Instance.QueryActionExp(_actionId));
}
//消除水果
actionParams.GridData.Resource = ResourceType.None;
actionParams.GridData.RenderMark = true;
return true;
}
@ -831,7 +832,10 @@ namespace Logic.Action
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))
{
@ -981,7 +985,7 @@ namespace Logic.Action
actionParams.GridData.RenderMark = true;
}
//播放获取经验动画,城市还要弹跳一下
//如果是玩家,执行一整套播放动画的逻辑
//临时做法用来播放VFX,获取Main理应向MapData写入一个VFX的RenderMark的
var main = GameObject.Find("Main").GetComponent<Main>();
if (main.MapData == actionParams.MapData && actionParams.PlayerData.Id == actionParams.MapData.PlayerMap.SelfPlayerData.Id)
@ -1374,7 +1378,7 @@ namespace Logic.Action
//临时做法用来播放VFX,获取Main理应向MapData写入一个VFX的RenderMark的
var main = GameObject.Find("Main").GetComponent<Main>();
if (main.MapData == actionParams.MapData && actionParams.PlayerData.Id == actionParams.MapData.PlayerMap.SelfPlayerData.Id)
if (main.MapData == actionParams.MapData)// && actionParams.PlayerData.Id == actionParams.MapData.PlayerMap.SelfPlayerData.Id)
{
var v1 = Table.Instance.GridToWorld(gridData);
int score = GetCost() * 5;
@ -1399,7 +1403,7 @@ namespace Logic.Action
return false;
//如果player操作的city不是自己的city
if (!actionParam.MapData.GetPlayerDataByCityId(actionParam.CityData.Id, out var playerData)
|| playerData != actionParam.PlayerData)
|| playerData.Id != actionParam.PlayerData.Id)
return false;
if (!actionParam.MapData.GetGridDataByCityId(actionParam.CityData.Id, out var gridData))
return false;
@ -1458,6 +1462,9 @@ namespace Logic.Action
//魯棒性
if (actionParam.CityData == null)
return false;
if (!actionParam.MapData.GetPlayerDataByCityId(actionParam.CityData.Id, out var playerData)
|| playerData.Id != actionParam.PlayerData.Id)
return false;
if (!actionParam.MapData.GetGridDataByCityId(actionParam.CityData.Id, out var gridData))
return false;
//如果没科技return
@ -1522,9 +1529,11 @@ namespace Logic.Action
{
//鲁棒性判断
if (actionParams.UnitData == null) return false;
if (actionParams.PlayerData == null) return false;
var playerData = actionParams.PlayerData;
var unitData = actionParams.UnitData;
var playerData = actionParams.PlayerData;
if (playerData == null)
if (!actionParams.MapData.GetPlayerDataByUnitId(actionParams.UnitData.Id, out playerData))
return false;
if (!actionParams.MapData.GetGridDataByUnitId(actionParams.UnitData.Id, out var gridData))
return false;
if (_actionId.UnitActionType == UnitActionType.Capture)
@ -1695,6 +1704,18 @@ namespace Logic.Action
actionParams.PlayerData.PlayerWealth += 10;
gridData.RenderMark = true;
ret = true;
var main = GameObject.Find("Main").GetComponent<Main>();
if (actionParams.MapData == main.MapData && actionParams.MapData.PlayerMap.SelfPlayerId == playerData.Id)
{
var v1 = Table.Instance.GridToWorld(gridData);
var startPos = Table.Instance.GridToWorld(gridData);
var moneyPanel = GameObject.Find("UICanvas/TopBarPanel/MoneyPanel/Icon").transform;
var endPos = Camera.main.ScreenToWorldPoint(moneyPanel.position);
//播放获得钱的动画
main.MapRenderer.ProjectileManager.CreateProjectileMulti(main,actionParams.MapData,startPos,endPos,ProjectileType.Coin,ProjectileMoveType.CoinParabola,10,0.05f);
//main.MapRenderer.ProjectileManager.CreateProjectileMulti(main,actionParams.MapData,v1,v2,ProjectileType.CityExp,ProjectileMoveType.CityExpHighParabola,wonderInfo.Exp);
}
}
@ -1709,7 +1730,7 @@ namespace Logic.Action
//临时做法用来播放VFX,获取Main理应向MapData写入一个VFX的RenderMark的
var main = GameObject.Find("Main").GetComponent<Main>();
if (actionParams.MapData == main.MapData)
if (actionParams.MapData == main.MapData && actionParams.MapData.PlayerMap.SelfPlayerId == playerData.Id)
{
var v1 = Table.Instance.GridToWorld(gridData);
@ -2074,7 +2095,7 @@ namespace Logic.Action
public override float GetAnimTime(CommonActionParams actionParams)
{
return Table.Instance.AnimDataAssets.MoveAnimTime;
return Table.Instance.AnimDataAssets.MoveAnimTime + 0.3f;
}
}
@ -2413,6 +2434,10 @@ namespace Logic.Action
return false;
if (actionParams.PlayerData.TechTree.CheckIfHasTech(_actionId.TechType))
return false;
//如果没有父科技
var techInfo = Table.Instance.TechDataAssets.GetTechInfo(_actionId.TechType);
if (!actionParams.PlayerData.TechTree.CheckIfHasTech(techInfo.FatherTechType))
return false;
//判断钱够不够
if (GetCost() > actionParams.PlayerData.PlayerWealth)
return false;

View File

@ -92,12 +92,24 @@ namespace TH1Renderer
if (_cityData.IsCapital)
{
_debugText.text += "tech={";
foreach (var tech in _playerData.TechTree.TechList)
foreach (var tech in _playerData.TechTree.TechSet)
{
_debugText.text += tech + ",";
}
_debugText.text += "}\n";
}
//如果是不我方单位展示city上一回合的action list
if(!_mapData.CheckCityIdBelongPlayerId(_cityId,_mapData.PlayerMap.SelfPlayerData.Id))
if (MainEditor.Instance.Data != null)
{
var actionList = MainEditor.Instance.GetCityActions(_cityId);
_debugText.text += $"Turn {_playerData.Turn} act list\n";
if(actionList != null)
foreach (var act in actionList)
_debugText.text += act.DebugInfo() + "\n";
}
}
private void RenderUpdateCityConnected()
{

View File

@ -179,7 +179,7 @@ public class DebugUI
tmp.text = $"-------- ID={player.Id}, Civ={player.PlayerCivId}, Force={player.PlayerForceId} --------\n";
tmp.text += $"Money = {player.PlayerWealth}, Stratery = ???\n";
tmp.text += $"Tech:";
foreach (var tech in player.TechTree.TechList)
foreach (var tech in player.TechTree.TechSet)
{
tmp.text += tech + " ";
}