/* * @Author: 白哉 * @Description: * @Date: 2025年06月06日 星期五 19:06:16 * @Modify: */ using System; using System.Collections.Generic; using Logic.Action; using Logic.AI; using NodeCanvas.Framework; using ParadoxNotion.Design; using RuntimeData; namespace NodeCanvas.Tasks.Actions { [Name("迭代一次开始")] [Category("AI节点")] [Serializable] public class AIForeachStart : BaseActionTask { protected override string desc { get { return string.Format($"迭代一次开始"); } } protected override void OnExecute() { base.OnExecute(); // 直接从Blackboard获取AICalculatorData var data = blackboard.GetVariable("Data"); if (data?.value == null) { EndAction(false); return; } if (data.value.ForeachUnit.Count == 0 && data.value.ForeachCity.Count == 0 && data.value.ForeachLegion.Count == 0) { EndAction(false); return; } if (data.value.ForeachUnit.Count == 0 && data.value.ForeachLegion.Count != 0) { var legion = data.value.ForeachLegion[0]; var selfUnitList = new HashSet(); data.value.Map.GetUnitDataListByPlayerId(data.value.Player.Id, selfUnitList); foreach (var unit in selfUnitList) { if (unit.LegionId != legion) continue; data.value.ForeachUnit.Add(unit); } data.value.ForeachLegion.RemoveAt(0); } data.value.TargetParam = new CommonActionParams(); data.value.TargetParam.MapData = data.value.Map; data.value.TargetParam.PlayerData = data.value.Player; if (data.value.ForeachCity.Count != 0) { data.value.TargetParam.CityData = data.value.ForeachCity[0]; if (data.value.Map.GetGridDataByCityId(data.value.TargetParam.CityData.Id, out var grid)) { if (data.value.Map.GetUnitDataByGid(grid.Id, out var unit)) { data.value.TargetParam.UnitData = unit; } } } if (data.value.ForeachUnit.Count != 0) { data.value.TargetParam.UnitData = data.value.ForeachUnit[0]; var legion = data.value.TargetParam.UnitData.LegionId; if (legion != 0 && data.value.LegionTargetCity.TryGetValue(legion, out var cityId)) { if (data.value.Map.GetGridDataByCityId(cityId, out var grid)) data.value.TargetParam.TargetGridData = grid; } else if (data.value.UnitTargetGrid.TryGetValue(data.value.TargetParam.UnitData.Id, out var value)) { data.value.TargetParam.TargetGridData = value; } else { } } data.value.TargetParam.OnParamChanged(); EndAction(false); } } }