Esempio n. 1
0
        protected virtual bool DoLock(string rawParameters, params CommandParameter[] parameters)
        {
            if (parameters.Length == 0)
            {
                Send("Lock what?");
                return(true);
            }

            // TODO: search item

            // No item found, search door
            ExitDirections exitDirection;
            IExit          exit = VerboseFindDoor(parameters[0], out exitDirection);

            if (exit == null)
            {
                return(true);
            }
            if (!exit.IsClosed)
            {
                Send("It's not closed.");
                return(true);
            }
            if (exit.Blueprint.Key <= 0)
            {
                Send("It can't be locked.");
                return(true);
            }
            // search key
            bool keyFound = Content.OfType <IItemKey>().Any(x => x.Blueprint.Id == exit.Blueprint.Key);

            if (!keyFound)
            {
                Send("You lack the key.");
                return(true);
            }
            if (exit.IsLocked)
            {
                Send("It's already locked.");
                return(true);
            }
            // Unlock this side
            exit.Lock();
            Send("*Click*");
            Act(ActOptions.ToRoom, "{0:N} locks the {1}.", this, exit);

            // Unlock other side
            IExit otherSideExit = exit.Destination.Exit(ExitHelpers.ReverseDirection(exitDirection));

            if (otherSideExit != null)
            {
                otherSideExit.Lock();
            }
            else
            {
                Log.Default.WriteLine(LogLevels.Warning, $"Non bidirectional exit in room {Room.Blueprint.Id} direction {exitDirection}");
            }

            return(true);
        }
Esempio n. 2
0
        // Helpers
        private IExit VerboseFindDoor(CommandParameter parameter, out ExitDirections exitDirection)
        {
            bool wasAskingForDirection;
            bool found = FindDoor(parameter, out exitDirection, out wasAskingForDirection);

            if (!found)
            {
                //  if open north -> I see no door north here.
                //  if open black door -> I see no black door here.
                if (wasAskingForDirection)
                {
                    Send($"I see no door {parameter.Value} here.");
                }
                else
                {
                    Send($"I see no {parameter.Value} here.");
                }
                return(null);
            }
            IExit exit = Room.Exit(exitDirection);

            if (exit == null)
            {
                return(null);
            }
            if (!exit.IsDoor)
            {
                Send("You can't do that.");
                return(null);
            }
            return(exit);
        }
Esempio n. 3
0
File: Move.cs Progetto: crybx/mud
        private static IExit FindExit(Direction direction, IRoom room)
        {
            IExit exit = null;

            switch (direction)
            {
            case Direction.North:
                exit = room.North;
                break;

            case Direction.East:
                exit = room.East;
                break;

            case Direction.South:
                exit = room.South;
                break;

            case Direction.West:
                exit = room.West;
                break;

            case Direction.Up:
                exit = room.Up;
                break;

            case Direction.Down:
                exit = room.Down;
                break;
            }

            return(exit);
        }
Esempio n. 4
0
 public Engine(ISetupPark setupPark, IPark park, IExit exit, IFindVehicle findVehicle, IVehiclesByOwner vehiclesByOwner, IStatus status)
 {
     this.setupPark = setupPark;
     this.park = park;
     this.exit = exit;
     this.findVehicle = findVehicle;
     this.vehiclesByOwner = vehiclesByOwner;
     this.status = status;
 }
Esempio n. 5
0
        public TurtleMoveCommandTests()
        {
            ITurtleMoveService turtleMoveService = Mock.Of <TurtleMoveService>();

            _board  = Mock.Of <Board>();
            _mine   = Mock.Of <Mine>();
            _exit   = Mock.Of <Exit>();
            _turtle = new Turtle(turtleMoveService);
        }
Esempio n. 6
0
        public Room(Guid guid, RoomBlueprint blueprint, IArea area)
            : base(guid, blueprint.Name, blueprint.Description)
        {
            Blueprint = blueprint;
            _people   = new List <ICharacter>();
            _content  = new List <IItem>();
            Exits     = new IExit[ExitHelpers.ExitCount];

            Area = area;
            Area.AddRoom(this);
        }
Esempio n. 7
0
 private IDoor GetDoor(IExit exit, string keyword)
 {
     if (exit.Door != null)
     {
         if (exit.Door.KeyWords.Any(s => s.Equals(keyword, StringComparison.OrdinalIgnoreCase)))
         {
             return(exit.Door);
         }
     }
     return(null);
 }
Esempio n. 8
0
 private void AddDoors(IExit exit, string keyword, List <IDoor> doors)
 {
     if (exit != null)
     {
         IDoor door = GetDoor(exit, keyword);
         if (door != null)
         {
             doors.Add(door);
         }
     }
 }
Esempio n. 9
0
 public TurtleGameInvoker(IBoard board,
                          IExit exit,
                          ITurtle turtle,
                          IInitializationService <ITurtle, IMine> initializationService)
 {
     _board  = board;
     _mines  = new List <IMine>();
     _exit   = exit;
     _turtle = turtle;
     _initializationService = initializationService;
 }
Esempio n. 10
0
File: Move.cs Progetto: elavanis/Mud
        public IResult PerformCommand(IMobileObject performer, ICommand command)
        {
            IResult result = base.PerfomCommand(performer, command);

            if (result != null)
            {
                return(result);
            }

            //check to see if they are mounted on their mount
            if (performer.Mount != null &&
                performer.Mount.Room == performer.Room &&
                performer.Mount.Riders.Contains(performer))
            {
                //they are mounted, send the move to command to their mount
                performer.Mount.EnqueueCommand(command.CommandName);
                return(null);
            }

            result = GlobalReference.GlobalValues.CanMobDoSomething.Move(performer);
            if (result != null)
            {
                return(result);
            }

            IRoom room = performer.Room;

            Direction direction = FindDirection(command);
            IExit     exit      = FindExit(direction, room);

            result = ValidateExit(exit);
            if (result != null)
            {
                return(result);
            }

            result = room.CheckLeave(performer);
            if (result != null)
            {
                return(result);
            }

            result = room.CheckLeaveDirection(performer, direction);
            if (result != null)
            {
                return(result);
            }

            IRoom proposedRoom = GlobalReference.GlobalValues.World.Zones[exit.Zone].Rooms[exit.Room];

            //we are safe to cross zones because we make a copy of each pc/npc list before processing it in a thread safe manor
            return(MoveToRoom(performer, room, direction, proposedRoom));
        }
Esempio n. 11
0
File: Move.cs Progetto: crybx/mud
        private IResult ValidateExit(IExit exit)
        {
            if (exit == null)
            {
                return(new Result(false, "There is no obvious way to leave that way."));
            }

            if (exit.Door != null && exit.Door.Opened == false)
            {
                string message = string.Format("You will need to open the {0} first.", exit.Door.SentenceDescription);
                return(new Result(false, message));
            }

            return(null);
        }
Esempio n. 12
0
        public TurtleGameInvokerTests()
        {
            IAnimalValidator    animalValidator    = Mock.Of <AnimalValidator>();
            IBoardValidator     boardValidator     = Mock.Of <BoardValidator>();
            IExitValidator      exitValidator      = Mock.Of <ExitValidator>();
            IObstaclesValidator obstaclesValidator = Mock.Of <ObstaclesValidator>();

            _commandParserService = new CommandParserService(animalValidator, boardValidator, exitValidator, obstaclesValidator);
            IInitializationService <ITurtle, IMine> initializationService = new TurtleInitializationService();
            ITurtleMoveService turtleMoveService = Mock.Of <TurtleMoveService>();
            IBoard             board             = Mock.Of <Board>();
            IExit   exit   = Mock.Of <Exit>();
            ITurtle turtle = new Turtle(turtleMoveService);

            _invoker = new TurtleGameInvoker(board, exit, turtle, initializationService);
        }
Esempio n. 13
0
        protected virtual bool DoOpen(string rawParameters, params CommandParameter[] parameters)
        {
            if (parameters.Length == 0)
            {
                Send("Open what?");
                return(true);
            }
            // TODO: search item

            // No item found, search door
            ExitDirections exitDirection;
            IExit          exit = VerboseFindDoor(parameters[0], out exitDirection);

            if (exit == null)
            {
                return(true);
            }
            if (!exit.IsClosed)
            {
                Send("It's already open.");
                return(true);
            }
            if (exit.IsLocked)
            {
                Send("It's locked.");
                return(true);
            }

            // Open this side side
            exit.Open();
            Act(ActOptions.ToRoom, "{0:N} opens the {1}.", this, exit);
            Send("Ok.");

            // Open the other side
            IExit otherSideExit = exit.Destination.Exit(ExitHelpers.ReverseDirection(exitDirection));

            if (otherSideExit != null)
            {
                otherSideExit.Open();
                Act(exit.Destination.People, "The {0} opens.", otherSideExit);
            }
            else
            {
                Log.Default.WriteLine(LogLevels.Warning, $"Non bidirectional exit in room {Room.Blueprint.Id} direction {exitDirection}");
            }
            return(true);
        }
Esempio n. 14
0
 private bool FindDoor(CommandParameter parameter, out ExitDirections exitDirection, out bool wasAskingForDirection)
 {
     if (ExitHelpers.FindDirection(parameter.Value, out exitDirection))
     {
         wasAskingForDirection = true;
         return(true);
     }
     wasAskingForDirection = false;
     //exit = Room.Exits.FirstOrDefault(x => x?.Destination != null && x.IsDoor && x.Keywords.Any(k => FindHelpers.StringStartsWith(k, parameter.Value)));
     foreach (ExitDirections direction in EnumHelpers.GetValues <ExitDirections>())
     {
         IExit exit = Room.Exit(direction);
         if (exit?.Destination != null && exit.IsDoor && exit.Keywords.Any(k => FindHelpers.StringStartsWith(k, parameter.Value)))
         {
             exitDirection = direction;
             return(true);
         }
     }
     return(false);
 }
Esempio n. 15
0
File: Move.cs Progetto: crybx/mud
        public IResult PerformCommand(IMobileObject performer, ICommand command)
        {
            IResult result = GlobalReference.GlobalValues.CanMobDoSomething.Move(performer);

            if (result != null)
            {
                return(result);
            }

            IRoom room = performer.Room;

            Direction direction = FindDirection(command);
            IExit     exit      = FindExit(direction, room);

            result = ValidateExit(exit);
            if (result != null)
            {
                return(result);
            }

            result = room.CheckLeave(performer);
            if (result != null)
            {
                return(result);
            }

            result = room.CheckLeaveDirection(performer, direction);
            if (result != null)
            {
                return(result);
            }

            IRoom proposedRoom = GlobalReference.GlobalValues.World.Zones[exit.Zone].Rooms[exit.Room];

            return(MoveToRoom(performer, room, direction, proposedRoom));
        }
Esempio n. 16
0
        private string GetExitDescription(IExit exit, IRoom room) {
            //there's a lot of sentence  
            string[] vowel = new string[] { "a", "e", "i", "o", "u" };
			RoomExits direction = (RoomExits)Enum.Parse(typeof(RoomExits), exit.Direction.CamelCaseWord());
            if (room.IsDark) {
                exit.Description = "something";
            }

            if (string.IsNullOrEmpty(exit.Description)) {
                exit.Description = exit.availableExits[direction].Title.ToLower();
            }

            if (exit.Description.Contains("that leads to")) {
                exit.Description += exit.availableExits[direction].Title.ToLower();
            }

            string directionCorrected = "To the " + exit.Direction + " there is ";

            if (String.Compare(exit.Direction, "up", true) == 0 || String.Compare(exit.Direction, "down", true) == 0) {
                if (!room.IsDark) {
                    directionCorrected = exit.Description;
                }
                else {
                    directionCorrected = "something";
                }

                directionCorrected += " leads " + exit.Direction + " towards ";

                if (!room.IsDark) {
                    exit.Description = "somewhere";
                }
                else {
                    exit.Description = exit.availableExits[direction].Title.ToLower();
                }
            }

            if (!exit.Description.Contains("somewhere") && vowel.Contains(exit.Description[0].ToString())) {
                directionCorrected += "an ";
            }
            else if (!exit.Description.Contains("somewhere") && exit.Description != "something") {
                directionCorrected += "a ";
            }

            return (directionCorrected + exit.Description + ".");
        }
Esempio n. 17
0
        private void AddRoom(IZone zone, IRoom room, int x, int y, int z)
        {
            roomStack.Push(new RoomPositionInfo(room, x, y, z));
            while (roomStack.Count != 0)
            {
                RoomPositionInfo roomPositionInfo = roomStack.Pop();
                room = roomPositionInfo.Room;
                x    = roomPositionInfo.X;
                y    = roomPositionInfo.Y;
                z    = roomPositionInfo.Z;


                if (Grid.ContainsKey(room))
                {
                    //return;
                }
                else
                {
                    MapRoom mapRoom = new MapRoom(zone, room, new Position(x, y, z));
                    Grid.Add(room, mapRoom);
                    hashPositions.Add(mapRoom.Position.ToString());
                }

                if (room.North != null)
                {
                    IExit exit = room.North;
                    if (exit.Zone == room.Zone)
                    {
                        IRoom newRoom = zone.Rooms[exit.Room];
                        if (!Grid.ContainsKey(newRoom))
                        {
                            Position currentPosition = Grid[room].Position;
                            while (CheckPosition(currentPosition.X, currentPosition.Y + 1, currentPosition.Z))
                            {
                                MigrateSouth(currentPosition.Y);
                            }

                            roomStack.Push(new RoomPositionInfo(newRoom, currentPosition.X, currentPosition.Y + 1, currentPosition.Z));
                        }
                    }
                }

                if (room.East != null)
                {
                    IExit exit = room.East;
                    if (exit.Zone == room.Zone)
                    {
                        IRoom newRoom = zone.Rooms[exit.Room];
                        if (!Grid.ContainsKey(newRoom))
                        {
                            Position currentPosition = Grid[room].Position;

                            while (CheckPosition(currentPosition.X + 1, currentPosition.Y, currentPosition.Z))
                            {
                                MigrateWest(currentPosition.X);
                            }
                            roomStack.Push(new RoomPositionInfo(newRoom, currentPosition.X + 1, currentPosition.Y, currentPosition.Z));
                        }
                    }
                }

                if (room.South != null)
                {
                    IExit exit = room.South;
                    if (exit.Zone == room.Zone)
                    {
                        IRoom newRoom = zone.Rooms[exit.Room];
                        if (!Grid.ContainsKey(newRoom))
                        {
                            Position currentPosition = Grid[room].Position;
                            while (CheckPosition(currentPosition.X, currentPosition.Y - 1, currentPosition.Z))
                            {
                                MigrateNorth(currentPosition.Y);
                            }
                            roomStack.Push(new RoomPositionInfo(newRoom, currentPosition.X, currentPosition.Y - 1, currentPosition.Z));
                        }
                    }
                }

                if (room.West != null)
                {
                    IExit exit = room.West;
                    if (exit.Zone == room.Zone)
                    {
                        IRoom newRoom = zone.Rooms[exit.Room];
                        if (!Grid.ContainsKey(newRoom))
                        {
                            Position currentPosition = Grid[room].Position;
                            while (CheckPosition(currentPosition.X - 1, currentPosition.Y, currentPosition.Z))
                            {
                                MigrateEast(currentPosition.X);
                            }
                            roomStack.Push(new RoomPositionInfo(newRoom, currentPosition.X - 1, currentPosition.Y, currentPosition.Z));
                        }
                    }
                }

                if (room.Up != null)
                {
                    IExit exit = room.Up;
                    if (exit.Zone == room.Zone)
                    {
                        IRoom newRoom = zone.Rooms[exit.Room];
                        if (!Grid.ContainsKey(newRoom))
                        {
                            Position currentPosition = Grid[room].Position;
                            while (CheckPosition(currentPosition.X, currentPosition.Y, currentPosition.Z + 1))
                            {
                                MigrateDown(currentPosition.Z);
                            }
                            roomStack.Push(new RoomPositionInfo(newRoom, currentPosition.X, currentPosition.Y, currentPosition.Z + 1));
                        }
                    }
                }

                if (room.Down != null)
                {
                    IExit exit = room.Down;
                    if (exit.Zone == room.Zone)
                    {
                        IRoom newRoom = zone.Rooms[exit.Room];
                        if (!Grid.ContainsKey(newRoom))
                        {
                            Position currentPosition = Grid[room].Position;
                            while (CheckPosition(currentPosition.X, currentPosition.Y, currentPosition.Z - 1))
                            {
                                MigrateUp(currentPosition.Z);
                            }
                            roomStack.Push(new RoomPositionInfo(newRoom, currentPosition.X, currentPosition.Y, currentPosition.Z - 1));
                        }
                    }
                }
            }
        }
Esempio n. 18
0
        protected virtual bool DoRstat(string rawParameters, params CommandParameter[] parameters)
        {
            if (parameters.Length == 0 && Impersonating == null)
            {
                Send("Rstat what?");
                return(true);
            }
            if (parameters.Length >= 1 && !parameters[0].IsNumber)
            {
                Send("Syntax: rstat [<room id>]");
                return(true);
            }
            IRoom room;

            if (Impersonating != null)
            {
                room = Impersonating.Room;
            }
            else
            {
                int id = parameters[0].AsNumber;
                room = DependencyContainer.Instance.GetInstance <IWorld>().Rooms.FirstOrDefault(x => x.Blueprint.Id == id);
            }
            if (room == null)
            {
                Send("It doesn't exist.");
                return(true);
            }
            StringBuilder sb = new StringBuilder();

            if (room.Blueprint != null)
            {
                sb.AppendFormatLine("Blueprint: {0}", room.Blueprint.Id);
            }
            else
            {
                sb.AppendLine("No blueprint");
            }
            sb.AppendFormatLine("Name: {0}", room.Blueprint?.Name ?? "(none)");
            sb.AppendFormatLine("DisplayName: {0}", room.DisplayName);
            sb.AppendFormatLine("Description: {0}", room.Description);
            if (room.ExtraDescriptions != null)
            {
                foreach (KeyValuePair <string, string> kv in room.ExtraDescriptions)
                {
                    sb.AppendFormatLine("ExtraDescription: {0} " + Environment.NewLine + "{1}", kv.Key, kv.Value);
                }
            }
            foreach (ExitDirections direction in EnumHelpers.GetValues <ExitDirections>())
            {
                IExit exit = room.Exit(direction);
                if (exit?.Destination != null)
                {
                    sb.Append(StringHelpers.UpperFirstLetter(direction.ToString()));
                    sb.Append(" - ");
                    sb.Append(exit.Destination.DisplayName); // TODO: too dark to tell
                    if (exit.IsClosed)
                    {
                        sb.Append(" (CLOSED)");
                    }
                    if (exit.IsHidden)
                    {
                        sb.Append(" [HIDDEN]");
                    }
                    if (exit.IsLocked)
                    {
                        sb.AppendFormat(" <Locked> {0}", exit.Blueprint.Key);
                    }
                    sb.Append($" [{exit.Destination.Blueprint?.Id.ToString() ?? "???"}]");
                    sb.AppendLine();
                }
                // TODO: exits
                // TODO: content
                // TODO: people
            }
            Send(sb);
            return(true);
        }
Esempio n. 19
0
        /// <summary>
        /// Move
        /// </summary>
        /// <param name="movements">Movement</param>
        /// <param name="mines">Collection of mine</param>
        /// <param name="exit">Exit</param>
        public void Move(IEnumerable <Movement> movements, IEnumerable <IMine> mines, IExit exit)
        {
            var isHitMine = false;
            var isExit    = false;

            foreach (var movement in movements)
            {
                if (movement == Movement.Move)
                {
                    // Make sure the turtle still in the board.
                    if (!Board.IsValid(Point))
                    {
                        throw new PointValidationException("Turtle cannot go out of board!");
                    }

                    // Move the turtle to the next tile.
                    _turtleMoveService.MoveForward(Point);

                    // If the turtle hits the mine it will not continue.
                    if (_turtleMoveService.IsObstacleHit(Point, mines))
                    {
                        Result    = $"Mine Hit";
                        isHitMine = true;
                        break;
                    }

                    // If the turtle finds the exit it will not continue.
                    if (_turtleMoveService.IsExit(Point, exit))
                    {
                        Result = $"Success";
                        isExit = true;
                        break;
                    }
                }
                else if (movement == Movement.Left)
                {
                    // Turn left the turtle.
                    _turtleMoveService.MoveLeft(Point);
                }
                else if (movement == Movement.Right)
                {
                    // Turn right the turtle.
                    _turtleMoveService.MoveRight(Point);
                }
            }

            if (!isHitMine && !isExit)
            {
                Result = "Still In Danger";
            }
        }
Esempio n. 20
0
        private void DisplayExits(bool compact)
        {
            StringBuilder message = new StringBuilder();

            if (compact)
            {
                message.Append("[Exits:");
            }
            else
            {
                message.AppendLine("Obvious exits:");
            }
            bool exitFound = false;

            foreach (ExitDirections direction in EnumHelpers.GetValues <ExitDirections>())
            {
                IExit exit = Room.Exit(direction);
                if (exit?.Destination != null && CanSee(exit))
                {
                    if (compact)
                    {
                        message.Append(" ");
                        if (exit.IsHidden)
                        {
                            message.Append("[");
                        }
                        if (exit.IsClosed)
                        {
                            message.Append("(");
                        }
                        message.AppendFormat("{0}", direction.ToString().ToLowerInvariant());
                        if (exit.IsClosed)
                        {
                            message.Append(")");
                        }
                        if (exit.IsHidden)
                        {
                            message.Append("]");
                        }
                    }
                    else
                    {
                        message.Append(StringHelpers.UpperFirstLetter(direction.ToString()));
                        message.Append(" - ");
                        if (exit.IsClosed)
                        {
                            message.Append("A closed door");
                        }
                        else
                        {
                            message.Append(exit.Destination.DisplayName); // TODO: too dark to tell
                        }
                        if (exit.IsClosed)
                        {
                            message.Append(" (CLOSED)");
                        }
                        if (exit.IsHidden)
                        {
                            message.Append(" [HIDDEN]");
                        }
                        if (ImpersonatedBy is IAdmin)
                        {
                            message.Append($" [{exit.Destination.Blueprint?.Id.ToString() ?? "???"}]");
                        }
                        message.AppendLine();
                    }
                    exitFound = true;
                }
            }
            if (!exitFound)
            {
                if (compact)
                {
                    message.AppendLine(" none");
                }
                else
                {
                    message.AppendLine("None.");
                }
            }
            if (compact)
            {
                message.AppendLine("]");
            }
            Send(message);
        }
Esempio n. 21
0
 public CreateTemplateViewModel(ITemplateCreater templateCreater, IExit exit)
 {
     _templateCreater = templateCreater;
     _exit            = exit;
 }
Esempio n. 22
0
 /// <summary>
 /// Set
 /// </summary>
 /// <param name="turtle">Turtle</param>
 /// <param name="mines">Mines collections</param>
 /// <param name="exit">Exit</param>
 public void Set(ITurtle turtle, IEnumerable <IMine> mines, IExit exit)
 {
     _turtle = turtle;
     _mines  = mines;
     _exit   = exit;
 }
Esempio n. 23
0
        private Trail AddNextRoom(HashSet <IRoom> searchedRooms, Directions.Direction direction, IExit exit, IMobileObject performer, Queue <Trail> newTrails, Trail trail)
        {
            if (trail.Distance > 3) //don't follow someone that has gotten to far away to follow
            {
                return(null);
            }

            if (exit != null)
            {
                IRoom nextRoom = Zones[exit.Zone].Rooms[exit.Room];

                if (searchedRooms.Contains(nextRoom))
                {
                    return(null);
                }

                trail.Distance++;
                IMobileObject foundMob = FindMobInRoom(nextRoom, performer);
                if (foundMob != null)
                {
                    return(trail);
                }

                if (!searchedRooms.Contains(nextRoom))
                {
                    trail.Room = nextRoom;
                    newTrails.Enqueue(trail);
                    searchedRooms.Add(nextRoom);
                }
            }

            return(null);
        }
Esempio n. 24
0
 /// <summary>
 /// Set
 /// </summary>
 /// <param name="board">Board</param>
 /// <param name="exit">Exit</param>
 public void Set(IBoard board, IExit exit)
 {
     _board = board;
     _exit  = exit;
 }
Esempio n. 25
0
 public void AddExit(IExit exit)
 {
     ExitObjects.Add(exit);
 }
Esempio n. 26
0
        private Trail AddNextRoom(IMobileObject performer, HashSet <IRoom> searchedRooms, Directions.Direction direction, IExit exit, string targetKeyword, Queue <Trail> newTrails, Trail trail)
        {
            if (exit != null)
            {
                IRoom nextRoom = GlobalReference.GlobalValues.World.Zones[exit.Zone].Rooms[exit.Room];

                if (searchedRooms.Contains(nextRoom))
                {
                    return(null);
                }

                //check to make sure the next room does not contain the attribute NoTrack
                //if so return null
                if (nextRoom.Attributes.Contains(RoomAttribute.NoTrack))
                {
                    searchedRooms.Add(nextRoom);  //don't bother to keep searching this room
                    return(null);
                }

                trail.Distance++;
                IMobileObject foundMob = FindMobInRoom(nextRoom, targetKeyword);
                if (foundMob != null)
                {
                    return(trail);
                }

                if (!searchedRooms.Contains(nextRoom))
                {
                    trail.Room = nextRoom;
                    newTrails.Enqueue(trail);
                    searchedRooms.Add(nextRoom);
                }
            }

            return(null);
        }
Esempio n. 27
0
 /// <summary>
 /// Is exit
 /// </summary>
 /// <param name="point">Point</param>
 /// <param name="exit">Exit</param>
 /// <returns></returns>
 public bool IsExit(IPoint point, IExit exit)
 {
     return(exit.Point.X == point.X && exit.Point.Y == point.Y);
 }
Esempio n. 28
0
        protected virtual bool DoLook(string rawParameters, params CommandParameter[] parameters)
        {
            // TODO: 0/ sleeping/blind/dark room (see act_info.C:1413 -> 1436)

            // 1: room+exits+chars+items
            if (string.IsNullOrWhiteSpace(rawParameters))
            {
                Log.Default.WriteLine(LogLevels.Debug, "DoLook(1): room");
                DisplayRoom();
                return(true);
            }
            // 2: container in room then inventory then equipment
            if (parameters[0].Value == "in" || parameters[0].Value == "on" || parameters[0].Value == "into")
            {
                Log.Default.WriteLine(LogLevels.Debug, "DoLook(2): container in room, inventory, equipment");
                // look in container
                if (parameters.Length == 1)
                {
                    Send("Look in what?");
                }
                else
                {
                    // search in room, then in inventory(unequiped), then in equipement
                    IItem containerItem = FindHelpers.FindItemHere(this, parameters[1]);
                    if (containerItem == null)
                    {
                        Send(StringHelpers.ItemNotFound);
                    }
                    else
                    {
                        Log.Default.WriteLine(LogLevels.Debug, "DoLook(2): found in {0}", containerItem.ContainedInto.DebugName);
                        IContainer container = containerItem as IContainer;
                        if (container != null)
                        {
                            DisplayContainerContent(container);
                        }
                        // TODO: drink container
                        else
                        {
                            Send("This is not a container.");
                        }
                    }
                }
                return(true);
            }
            // 3: character in room
            ICharacter victim = FindHelpers.FindByName(Room.People.Where(CanSee), parameters[0]);

            if (victim != null)
            {
                Log.Default.WriteLine(LogLevels.Debug, "DoLook(3): character in room");
                DisplayCharacter(victim, true); // TODO: always peeking ???
                return(true);
            }
            // 4:search among inventory/equipment/room.content if an item has extra description or name equals to parameters
            string itemDescription;
            bool   itemFound = FindItemByExtraDescriptionOrName(parameters[0], out itemDescription);

            if (itemFound)
            {
                Log.Default.WriteLine(LogLevels.Debug, "DoLook(4): item in inventory+equipment+room -> {0}", itemDescription);
                Send(itemDescription, false);
                return(true);
            }
            // 5: extra description in room
            if (Room.ExtraDescriptions != null && Room.ExtraDescriptions.Any())
            {
                // TODO: try to use ElementAtOrDefault
                int count = 0;
                foreach (KeyValuePair <string, string> extraDescription in Room.ExtraDescriptions)
                {
                    if (parameters[0].Tokens.All(x => FindHelpers.StringStartsWith(extraDescription.Key, x)) &&
                        ++count == parameters[0].Count)
                    {
                        Send(extraDescription.Value, false);
                        return(true);
                    }
                }
            }
            // 6: direction
            ExitDirections direction;

            if (ExitHelpers.FindDirection(parameters[0].Value, out direction))
            {
                Log.Default.WriteLine(LogLevels.Debug, "DoLook(6): direction");
                IExit exit = Room.Exit(direction);
                if (exit?.Destination == null)
                {
                    Send("Nothing special there.");
                }
                else
                {
                    Send(exit.Description ?? "Nothing special there.");
                    if (exit.Keywords.Any())
                    {
                        if (exit.IsClosed)
                        {
                            Act(ActOptions.ToCharacter, "The {0} is closed.", exit);
                        }
                        else if (exit.IsDoor)
                        {
                            Act(ActOptions.ToCharacter, "The {0} is open.", exit);
                        }
                    }
                }
            }
            else
            {
                Send(StringHelpers.ItemNotFound);
            }
            return(true);
        }
        /// <summary>
        /// Initialization Exit Set Command
        /// </summary>
        /// <param name="board">Board</param>
        /// <param name="exit">Exit</param>
        /// <param name="command">Command</param>
        public void InitializationExitSetCommand(IBoard board, IExit exit, ICommand command)
        {
            var exitSetCommand = (IExitSetCommand)command;

            exitSetCommand.Set(board, exit);
        }
Esempio n. 30
0
 public ExitSetCommandTests()
 {
     _board = Mock.Of <Board>();
     _exit  = Mock.Of <Exit>();
 }
        /// <summary>
        /// Initializatiob animal move command
        /// </summary>
        /// <param name="turtle">Animal</param>
        /// <param name="mines">Obstacles</param>
        /// <param name="exit">Exit</param>
        /// <param name="command">Command</param>
        public void InitializationAnimalMoveCommand(ITurtle turtle, IEnumerable <IMine> mines, IExit exit, ICommand command)
        {
            var turtleMoveCommand = (ITurtleMoveCommand)command;

            turtleMoveCommand.Set(turtle, mines, exit);
        }