Beispiel #1
0
        internal void SetTargetToNextPointTowardsRandomOfClosestThreeMapExits(IGraphNode currentNode)
        {
            var dijkstraValues = currentNode.GetDijkstraValues();
            var possibleExits  = Entity.Level.Entities
                                 .Where(_ => _.Implements <IMapExit>())
                                 .OrderBy(_ => dijkstraValues.Distances[_.GetImplementation <IGraphNode>()])
                                 .Take(3)
                                 .ToList();

            if (!possibleExits.Any())
            {
                throw new InvalidLevelConfigurationException("Map does not contain any exits.");
            }

            var targetedExit = possibleExits[new Random().Next(possibleExits.Count)];
            var current      = targetedExit.GetImplementation <IGraphNode>();
            var path         = new List <Entity> {
                targetedExit
            };

            while (dijkstraValues.Predecessors[current] != null)
            {
                current = dijkstraValues.Predecessors[current];
                path.Insert(0, current.Entity);
            }
            var movable = Entity.GetBehavior <MovableBehavior>();

            movable.SetTarget(path[1]);
        }
Beispiel #2
0
        internal void SetTargetToNextPointTowardsParkingLot(IGraphNode currentNode)
        {
            var dijkstraValues     = currentNode.GetDijkstraValues();
            var targetedParkingLot = Entity.Level.Entities
                                     .Where(_ => _.HasBehavior <ParkingLotBehavior>())
                                     .Where(_ => !TriedParkingLots.Contains(_))
                                     .OrderBy(_ => dijkstraValues.Distances[_.GetImplementation <IGraphNode>()])
                                     .FirstOrDefault();

            if (targetedParkingLot == null)
            {
                // no more parkinglots to try -> leave frustrated ;D
                SetTargetToNextPointTowardsRandomOfClosestThreeMapExits(currentNode);
            }

            var path    = dijkstraValues.GetPathTowardsTarget(targetedParkingLot.GetImplementation <IGraphNode>());
            var movable = Entity.GetBehavior <MovableBehavior>();

            movable.SetTarget(path.Count > 1 ? path[1].Entity : targetedParkingLot);
        }