/* * @Author: 白哉 * @Description: * @Date: 2025年06月06日 星期五 19:06:16 * @Modify: */ using System; using System.Collections.Generic; using Logic.AI; using NodeCanvas.Framework; using ParadoxNotion.Design; using RuntimeData; namespace NodeCanvas.Tasks.Actions { [Category("AIAction")] [Serializable] public class AIParamExplore : BaseActionTask { public int Offset = 3; protected override string desc { get { return string.Format($"查找周围 {Offset} 格内可抵达的探索目标"); } } protected override void OnExecute() { base.OnExecute(); // 直接从Blackboard获取AICalculatorData var data = blackboard.GetVariable("Data"); if (data?.value?.TargetParam.UnitData == null) { EndAction(false); return; } var param = data.value.TargetParam; if (!param.MapData.GetGridDataByUnitId(param.UnitData.Id, out var unitGrid)) { EndAction(false); return; } var selfCity = new HashSet(); param.MapData.GetCityDataListByPlayerId(param.PlayerData.Id, selfCity); var aroundGrids = param.MapData.GridMap.GetAroundGridData(Offset, Offset, unitGrid); var targetGrids = new List>(); for (int i = 0; i < 3; i++) targetGrids.Add(new List()); foreach (var grid in aroundGrids) { if (grid == unitGrid) continue; if (grid.Resource == ResourceType.CityCenter && !param.MapData.GetCityDataByGid(grid.Id, out _)) { targetGrids[0].Add(grid); continue; } if (grid.Resource == ResourceType.Treasure) { targetGrids[1].Add(grid); continue; } if (grid.Resource == ResourceType.Starfish) { targetGrids[2].Add(grid); continue; } } var score = float.MinValue; GridData minTarget = null; var selfUnits = new HashSet(); param.MapData.GetUnitDataListByPlayerId(param.PlayerData.Id, selfUnits); foreach (var list in targetGrids) { foreach (var target in list) { var path = PathFinder.FindPath((int)param.MapData.MapConfig.Width, (int)param.MapData.MapConfig.Height, new (unitGrid.Pos.X, unitGrid.Pos.Y), new (target.Pos.X, target.Pos.Y), param.MapData, param.PlayerData); if (!path.found) continue; aroundGrids = param.MapData.GridMap.GetAroundGridData(3, 3, target); var selfScore = 0f; var enemyScore = 0f; foreach (var grid in aroundGrids) { if (unitGrid.Id == grid.Id) continue; if (!param.MapData.GetUnitDataByGid(grid.Id, out var unit)) continue; var dis = param.MapData.GridMap.CalcDistance(grid, target); if (selfUnits.Contains(unit)) selfScore += unit.GetMilitary() / (dis + 1f); else enemyScore += unit.GetMilitary() / (dis + 1f); } var targetScore = (selfScore - enemyScore) / path.length; if (targetScore > score) { score = targetScore; minTarget = target; } } } if (minTarget != null) { data.value.TargetParam.TargetGridData = minTarget; data.value.TargetParam.OnParamChanged(); EndAction(true); return; } EndAction(false); } } }