using System; using System.Text; using Schema; using Sirenix.Utilities; using UnityEngine; using VOID.Generic.Objects.Unit; using VOID.Generic.Util; namespace VOID.Generic.AI.Schema.Conditionals { [DarkIcon("Conditionals/d_IsNull")] [LightIcon("Conditionals/IsNull")] [Category(SchemaCategory.AnyUnit)] public class CanUnitMoveTo : Conditional { private enum MoveToType { Position, Unit } [SerializeField] private BlackboardEntrySelector _unit; [SerializeField, Space(15)] private MoveToType _moveTo; [SerializeField] private BlackboardEntrySelector _moveToPosition; [SerializeField] private BlackboardEntrySelector _moveToUnit; [SerializeField, Space(15)] private BlackboardEntrySelector _range; public override bool Evaluate(object nodeMemory, SchemaAgent agent) { var unitAgent = (UnitObjectSchemaAgent)agent; switch (_moveTo) { case MoveToType.Position: _unit.value.unitNavAgent.CalculatePathTo(_moveToPosition.value.position, _range.value + unitAgent.unit.basicData.radius); break; case MoveToType.Unit: _unit.value.unitNavAgent.CalculatePathTo(_moveToUnit.value.transform.position, _range.value + unitAgent.unit.basicData.radius + _moveToUnit.value.basicData.radius); break; default: throw new ArgumentOutOfRangeException(); } var path = _unit.value.unitNavAgent.GetCorrectedPath(); // If somehow path isnt calculated - cant move if (path.IsNullOrEmpty()) return false; // Out of combat - costless move if (!_unit.value.basicState.turnManager) return true; // Calculate move cost when in turn combat var cost = NavMeshPathUtil.CalculatePathCost(path); return _unit.value.unitData.currentResources.movePoints >= cost; } public override GUIContent GetConditionalContent() { var sb = new StringBuilder(); if (invert) sb.Append("NOT "); sb.Append($"If {_unit.name} can move to "); if (_moveTo is MoveToType.Position) sb.Append($"{_moveToPosition.name}"); if (_moveTo is MoveToType.Unit) sb.Append($"{_moveToUnit.name}"); return new GUIContent(sb.ToString()); } } }