/* * @Author: 白哉 * @Description: * @Date: 2025年10月21日 星期二 17:10:56 * @Modify: */ using System; using Logic.AI; using NodeCanvas.Framework; using ParadoxNotion.Design; namespace NodeCanvas.Tasks.Actions { [Name("筛选最高值目标格子(>0)")] [Category("AI节点")] [Serializable] public class AIParamChooseMaxKillScore : BaseActionTask { public bool KillScore = true; public bool AttackScore = false; public bool ThreatScore = false; protected override string desc { get { if (ThreatScore) return $"选取威胁分最高的目标格子"; if (AttackScore) return $"选取攻击分最高的目标格子"; if (KillScore) return $"选取击杀分最高的目标格子"; return ""; } } protected override void OnExecute() { base.OnExecute(); // 直接从Blackboard获取AICalculatorData var data = blackboard.GetVariable("Data"); if (data?.value?.AIActions == null) { EndAction(false); return; } // 限制三个bool值只有一个为true if (ThreatScore) { KillScore = false; AttackScore = false; } if (AttackScore) KillScore = false; AIActionBase action = null; var maxScore = 0f; for (int i = data.value.AIActions.Count - 1; i >= 0; i--) { var map = data.value.AIActions[i].Param.MapData; var unit = data.value.AIActions[i].Param.UnitData; var grid = data.value.AIActions[i].Param.GridData; if (map == null || grid == null || unit == null) continue; var score = 0f; if (ThreatScore) score = data.value.CalGridThreatScore(map, unit, grid); else if (AttackScore) score = data.value.CalGridAttackGainScore(map, unit, grid); else if (KillScore) score = data.value.CalGridKillScore(map, unit, grid); if (score <= maxScore) continue; action = data.value.AIActions[i]; maxScore = score; } data.value.AIActions.Clear(); if (action != null) data.value.AIActions.Add(action); EndAction(data.value.AIActions.Count > 0); } } }