コード例 #1
0
 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);
         }
     }
 }
コード例 #2
0
ファイル: MoonEntity.cs プロジェクト: Nosrick/JoyUnity
        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");
        }
コード例 #3
0
ファイル: MoonEntity.cs プロジェクト: Nosrick/JoyUnity
        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);
        }
コード例 #4
0
ファイル: WorldInstance.cs プロジェクト: Nosrick/JoyUnity
        /// <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);
        }
コード例 #5
0
        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);
        }
コード例 #6
0
ファイル: WorldInstance.cs プロジェクト: Nosrick/JoyUnity
        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);
        }
コード例 #7
0
        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);
        }
コード例 #8
0
ファイル: StandardDriver.cs プロジェクト: Nosrick/JoyGodot
        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();
                        }
                    }