private void MoveToTarget(NeedAIData data) { if (!HasMoved && m_PathfindingData.Count > 0) { Vector2Int nextPoint = m_PathfindingData.Peek(); PhysicsResult physicsResult = PhysicsManager.IsCollision(WorldPosition, nextPoint, MyWorld); if (physicsResult != PhysicsResult.EntityCollision) { m_PathfindingData.Dequeue(); Move(nextPoint); HasMoved = true; } else if (physicsResult == PhysicsResult.EntityCollision) { MyWorld.SwapPosition(this, MyWorld.GetEntity(nextPoint)); m_PathfindingData.Dequeue(); Move(nextPoint); HasMoved = true; } } else if (m_PathfindingData.Count == 0) { if (data.target != null) { m_PathfindingData = m_Pathfinder.FindPath(WorldPosition, data.target.WorldPosition, MyWorld); } else if (data.targetPoint != Vector2Int.zero) { m_PathfindingData = m_Pathfinder.FindPath(WorldPosition, data.targetPoint, MyWorld); } } }
public void Wander() { NeedAIData needAIData = new NeedAIData(); needAIData.intent = Intent.Interact; needAIData.searching = true; m_AssociatedEntity.CurrentTarget = needAIData; Debug.Log(m_AssociatedEntity.JoyName + " is wandering"); }
public void Seek(MoonObject moonObject, string need) { NeedAIData needAIData = new NeedAIData(); needAIData.intent = Intent.Interact; needAIData.searching = false; needAIData.target = moonObject.GetAssociatedObject(); needAIData.targetPoint = new Vector2Int(-1, -1); needAIData.need = (NeedIndex)Enum.Parse(typeof(NeedIndex), need, true); m_AssociatedEntity.CurrentTarget = needAIData; Debug.Log(m_AssociatedEntity.JoyName + " is seeking " + needAIData.target.JoyName); }
/// <summary> /// TODO: REDO THIS /// </summary> /// <param name="entityRef"></param> /// <param name="objectType"></param> /// <param name="intentRef"></param> /// <returns></returns> public List <NeedAIData> SearchForObjects(Entity entityRef, string objectType, Intent intentRef) { List <NeedAIData> data = new List <NeedAIData>(); if (entityRef.Vision.GetLength(0) == 1) { return(data); } //Special cases //Ownable objects if (objectType == "Any") { for (int i = 0; i < m_Objects.Count; i++) { if (!entityRef.Vision[m_Objects[i].WorldPosition.x, m_Objects[i].WorldPosition.y]) { continue; } if (!m_Objects[i].GetType().Equals(typeof(ItemInstance))) { continue; } NeedAIData tempData = new NeedAIData(); tempData.intent = intentRef; tempData.target = m_Objects[i]; data.Add(tempData); } } else { for (int i = 0; i < m_Objects.Count; i++) { if (entityRef.Vision[m_Objects[i].WorldPosition.x, m_Objects[i].WorldPosition.y]) { if (m_Objects[i].BaseType.Equals(objectType)) { NeedAIData tempData = new NeedAIData(); tempData.intent = intentRef; tempData.target = m_Objects[i]; data.Add(tempData); } } } } return(data); }
public override bool Execute( IJoyObject[] participants, IEnumerable <string> tags = null, IDictionary <string, object> args = null) { this.ClearLastParameters(); if (args.IsNullOrEmpty()) { return(false); } if (!(participants[0] is Entity actor)) { return(false); } string needName = args.TryGetValue("need", out object arg) ? (string)arg : null; if (needName.IsNullOrEmpty()) { return(false); } NeedAIData needAIData = new NeedAIData { Idle = false, Intent = Intent.Interact, Searching = false, Target = participants[1], TargetPoint = GlobalConstants.NO_TARGET, Need = needName }; actor.CurrentTarget = needAIData; //GlobalConstants.ActionLog.AddText(actor.JoyName + " is seeking " + participants[1].JoyName + " for " + needName); this.SetLastParameters(participants, tags, args); return(true); }
public NeedAIData SearchForEntities(Entity entityRef, List <long> GUIDs, Intent intentRef) { NeedAIData data = new NeedAIData(); data.intent = intentRef; Dictionary <long, Entity> chosenEntities = m_Entities.Where(x => GUIDs.Contains(x.GUID)).ToDictionary(x => x.GUID, x => x); List <Entity> visibleEntities = new List <Entity>(); foreach (Entity entity in chosenEntities.Values) { if (entityRef.Vision[entity.WorldPosition.x, entity.WorldPosition.y] && entity.GUID != entityRef.GUID) { visibleEntities.Add(entity); } } if (visibleEntities.Count > 0) { data.target = visibleEntities[RNG.Roll(0, visibleEntities.Count - 1)]; } return(data); }
public override bool Execute(IJoyObject[] participants, IEnumerable <string> tags = null, IDictionary <string, object> args = null) { this.ClearLastParameters(); if (!(participants[0] is Entity actor)) { return(false); } List <Vector2Int> visibleWalls = actor.MyWorld.GetVisibleWalls(actor); Vector2Int[] viablePoints = actor.Vision .Where(i => visibleWalls.Contains(i) == false) .ToArray(); Vector2Int result = GlobalConstants.NO_TARGET; if (viablePoints.Length > 0) { result = viablePoints[GlobalConstants.GameManager.Roller.Roll(0, viablePoints.Length)]; } NeedAIData needAIData = new NeedAIData { Idle = false, Intent = Intent.Interact, Searching = true, TargetPoint = result }; //GlobalConstants.ActionLog.AddText(actor.JoyName + " is wandering."); actor.CurrentTarget = needAIData; this.SetLastParameters(participants, tags, args); return(true); }
public override void Locomotion(IEntity vehicle) { this.Initialise(); //Don't move if you're currently busy if (vehicle.NeedFulfillmentData.Name.IsNullOrEmpty() == false && vehicle.NeedFulfillmentData.Counter > 0) { return; } //If you're idle if (vehicle.CurrentTarget.Idle) { //Let's find something to do List <INeed> needs = vehicle.Needs.Values.OrderByDescending(x => x.Priority).ToList(); //Act on first need bool idle = true; bool wander = false; foreach (INeed need in needs) { if (need.ContributingHappiness) { continue; } idle &= need.FindFulfilmentObject(vehicle); break; } if (idle) { int result = this.Roller.Roll(0, 10); if (result < 1) { wander = true; } } if (wander) { this.WanderAction.Execute( new IJoyObject[] { vehicle }, new[] { "wander", "idle" }); } } //If we have somewhere to be, move there if (vehicle.WorldPosition != vehicle.CurrentTarget.TargetPoint || vehicle.CurrentTarget.Target != null) { if (vehicle.CurrentTarget.Target is IItemInstance && vehicle.WorldPosition != vehicle.CurrentTarget.Target.WorldPosition) { if (vehicle.CurrentTarget.TargetPoint.Equals(GlobalConstants.NO_TARGET)) { NeedAIData newData = new NeedAIData { Idle = vehicle.CurrentTarget.Idle, Intent = vehicle.CurrentTarget.Intent, Need = vehicle.CurrentTarget.Need, Searching = vehicle.CurrentTarget.Searching, Target = vehicle.CurrentTarget.Target, TargetPoint = vehicle.CurrentTarget.Target.WorldPosition }; vehicle.CurrentTarget = newData; } this.MoveToTarget(vehicle); } else if (vehicle.CurrentTarget.Target is IEntity && AdjacencyHelper.IsAdjacent(vehicle.WorldPosition, vehicle.CurrentTarget.Target.WorldPosition) == false) { this.MoveToTarget(vehicle); } else if (vehicle.CurrentTarget.Target is null && vehicle.CurrentTarget.TargetPoint.Equals(GlobalConstants.NO_TARGET) == false) { this.MoveToTarget(vehicle); } } if (vehicle.MyWorld.GetEntity(vehicle.CurrentTarget.TargetPoint) is null == false || vehicle.MyWorld.GetObject(vehicle.CurrentTarget.TargetPoint) is null == false) { //If we've arrived at our destination, then we do our thing if ((vehicle.WorldPosition == vehicle.CurrentTarget.TargetPoint && (vehicle.CurrentTarget.Target is IItemInstance || vehicle.CurrentTarget.Target is null) || (vehicle.CurrentTarget.Target is IEntity && AdjacencyHelper.IsAdjacent(vehicle.WorldPosition, vehicle.CurrentTarget.Target.WorldPosition)))) { //If we have a target if (vehicle.CurrentTarget.Target is null == false) { if (vehicle.CurrentTarget.Intent == Intent.Attack) { //CombatEngine.SwingWeapon(this, CurrentTarget.target); } else if (vehicle.CurrentTarget.Intent == Intent.Interact) { INeed need = vehicle.Needs[vehicle.CurrentTarget.Need]; need.Interact(vehicle, vehicle.CurrentTarget.Target); vehicle.CurrentTarget = NeedAIData.IdleState(); } }