AI迭代
This commit is contained in:
parent
72eaa34843
commit
c446a3bb20
@ -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}
|
||||
|
||||
24
My project/Assets/Resources/BT/CommonTech .asset
Normal file
24
My project/Assets/Resources/BT/CommonTech .asset
Normal 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}
|
||||
8
My project/Assets/Resources/BT/CommonTech .asset.meta
Normal file
8
My project/Assets/Resources/BT/CommonTech .asset.meta
Normal file
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3179cc79a3507e445b1078a7ffea49f5
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -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}
|
||||
|
||||
@ -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}
|
||||
|
||||
@ -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}
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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()
|
||||
{
|
||||
|
||||
@ -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 + " ";
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user