Пример #1
0
 public static bool FindDirection(string direction, out ExitDirections exitDirection)
 {
     exitDirection = ExitDirections.North;
     if (direction == "n" || direction == "north")
     {
         exitDirection = ExitDirections.North;
     }
     else if (direction == "e" || direction == "east")
     {
         exitDirection = ExitDirections.East;
     }
     else if (direction == "s" || direction == "south")
     {
         exitDirection = ExitDirections.South;
     }
     else if (direction == "w" || direction == "west")
     {
         exitDirection = ExitDirections.West;
     }
     else if (direction == "u" || direction == "up")
     {
         exitDirection = ExitDirections.Up;
     }
     else if (direction == "d" || direction == "down")
     {
         exitDirection = ExitDirections.Down;
     }
     else if (direction == "n" || direction == "north")
     {
         exitDirection = ExitDirections.North;
     }
     else if (direction == "ne" || direction == "northeast")
     {
         exitDirection = ExitDirections.NorthEast;
     }
     else if (direction == "nw" || direction == "northwest")
     {
         exitDirection = ExitDirections.NorthWest;
     }
     else if (direction == "se" || direction == "southeas")
     {
         exitDirection = ExitDirections.SouthEast;
     }
     else if (direction == "sw" || direction == "southwest")
     {
         exitDirection = ExitDirections.SouthWest;
     }
     else
     {
         return(false);
     }
     return(true);
 }
Пример #2
0
        public GridRef GetOffsetGridRef(ExitDirections direction)
        {
            //Generate grid reference
            GridRef[] positionOffsets = new GridRef[] {
                new GridRef(0, 1),  //Y = N
                new GridRef(1, 0),  //X = E
                new GridRef(0, -1), //-Y = S
                new GridRef(-1, 0)  //-X = W
            };

            return(new Place.GridRef(
                       PlaceGridRef.x + positionOffsets[(int)direction].x,
                       PlaceGridRef.y + positionOffsets[(int)direction].y
                       ));
        }
Пример #3
0
        public static ExitDirections InvertExitState(ExitDirections direction)
        {
            switch (direction)
            {
            default:
            case ExitDirections.North:
                return(ExitDirections.South);

            case ExitDirections.South:
                return(ExitDirections.North);

            case ExitDirections.East:
                return(ExitDirections.West);

            case ExitDirections.West:
                return(ExitDirections.East);
            }
        }
Пример #4
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);
 }
Пример #5
0
        public static string ShortExitDirections(ExitDirections exitDirections)
        {
            switch (exitDirections)
            {
            case ExitDirections.North:
                return("N");

            case ExitDirections.East:
                return("E");

            case ExitDirections.South:
                return("S");

            case ExitDirections.West:
                return("W");

            case ExitDirections.Up:
                return("U");

            case ExitDirections.Down:
                return("D");

            case ExitDirections.NorthEast:
                return("ne");

            case ExitDirections.NorthWest:
                return("nw");

            case ExitDirections.SouthEast:
                return("se");

            case ExitDirections.SouthWest:
                return("sw");

            default:
                return("?");
            }
        }
Пример #6
0
        public List <ConnectedSceneResult> ConnectedScenes()
        {
            var  scenesSharingCorners = Core.Scenes.CurrentWorldScenes.Where(s => s.CornerPositions.Any(pos => CornerPositions.Contains(pos)));
            var  output = new List <ConnectedSceneResult>();
            bool withinBounds;

            foreach (var other in scenesSharingCorners)
            {
                var onSouthEdge = other.NorthWest.X == SouthWest.X && other.NorthEast.X == SouthEast.X;
                withinBounds = other.Size.X < Size.X
                    ? other.NorthWest.Y >= SouthWest.Y && other.NorthEast.Y <= SouthEast.Y
                    : other.NorthWest.Y <= SouthWest.Y && other.NorthEast.Y >= SouthEast.Y;

                if (onSouthEdge && withinBounds)
                {
                    if (other.ExitDirections.HasFlag(SceneExitDirections.North) && ExitDirections.HasFlag(SceneExitDirections.South))
                    {
                        output.Add(new ConnectedSceneResult
                        {
                            Scene        = other,
                            Direction    = SceneExitDirections.South,
                            ExitPosition = ExitPositions[SceneExitDirections.South],
                            EdgePointA   = other.NorthWest,
                            EdgePointB   = other.NorthEast,
                        });
                    }
                    continue;
                }

                var onNorthEdge = other.SouthWest.X == NorthWest.X && other.SouthEast.X == NorthEast.X;
                withinBounds = other.Size.X < Size.X
                    ? other.SouthWest.Y >= NorthWest.Y && other.SouthEast.Y <= NorthEast.Y
                    : other.SouthWest.Y <= NorthWest.Y && other.SouthEast.Y >= NorthEast.Y;

                if (onNorthEdge && withinBounds)
                {
                    if (other.ExitDirections.HasFlag(SceneExitDirections.South) && ExitDirections.HasFlag(SceneExitDirections.North))
                    {
                        output.Add(new ConnectedSceneResult
                        {
                            Scene        = other,
                            Direction    = SceneExitDirections.North,
                            ExitPosition = ExitPositions[SceneExitDirections.North],
                            EdgePointA   = other.SouthEast,
                            EdgePointB   = other.SouthWest,
                        });
                    }
                    continue;
                }

                var onEastEdge = other.NorthWest.Y == NorthEast.Y && other.SouthWest.Y == SouthEast.Y;
                withinBounds = other.Size.X < Size.X
                    ? other.NorthWest.X >= NorthEast.X && other.SouthWest.X <= SouthEast.X
                    : other.NorthWest.X <= NorthEast.X && other.SouthWest.X >= SouthEast.X;

                if (onEastEdge && withinBounds)
                {
                    if (other.ExitDirections.HasFlag(SceneExitDirections.West) && ExitDirections.HasFlag(SceneExitDirections.East))
                    {
                        output.Add(new ConnectedSceneResult
                        {
                            Scene        = other,
                            Direction    = SceneExitDirections.East,
                            ExitPosition = ExitPositions[SceneExitDirections.East],
                            EdgePointA   = other.NorthWest,
                            EdgePointB   = other.SouthWest,
                        });
                    }
                    continue;
                }

                var onWestEdge = other.NorthEast.Y == NorthWest.Y && other.SouthEast.Y == SouthWest.Y;
                withinBounds = other.Size.X < Size.X
                    ? other.NorthEast.X >= NorthWest.X && other.SouthEast.X <= SouthWest.X
                    : other.NorthEast.X <= NorthWest.X && other.SouthEast.X >= SouthWest.X;

                if (onWestEdge && withinBounds)
                {
                    if (other.ExitDirections.HasFlag(SceneExitDirections.East) && ExitDirections.HasFlag(SceneExitDirections.West))
                    {
                        output.Add(new ConnectedSceneResult
                        {
                            Scene        = other,
                            Direction    = SceneExitDirections.West,
                            ExitPosition = ExitPositions[SceneExitDirections.West],
                            EdgePointA   = other.SouthEast,
                            EdgePointB   = other.NorthEast,
                        });
                    }
                }
            }

            return(output);
        }
Пример #7
0
 public IExit AddExit(IRoom from, IRoom to, ExitBlueprint blueprint, ExitDirections direction)
 {
     throw new NotImplementedException();
 }
Пример #8
0
        public void OnGreet(ICharacter actor, ExitDirections from)
        {
            LuaFunction function = GetLuaFunction();

            object[] returnedValues = function?.Call(Character, actor, from);
        }
Пример #9
0
 public GenerationNode(ExitDirections Direction)
 {
     exitDirection = Direction;
 }
Пример #10
0
        /// <summary>
        /// Creates a new room at the given position (bottom left corner) with the given layout.
        /// </summary>
        /// <param name="posX">The x-Position of the room.</param>
        /// <param name="posY">The y-Position of the room.</param>
        /// <param name="layout">The layout of the room.</param>
        public Room(int posX, int posY, Fast2DArray <TileType> layout, List <TiledImporter.PrefabLocations> gameObjects, RoomType roomType)
        {
            this.Position    = new Vector2Int(posX, posY);
            this.Type        = roomType;
            this.Layout      = layout;
            this.GameObjects = gameObjects;

            this.ExitDirections = new Dictionary <Vector2Int, Direction>();

            this.TileCount = 0;

            List <Vector2Int> checkedPositions = new List <Vector2Int>();

            for (int x = 0; x < this.Layout.XSize; x++)
            {
                for (int y = 0; y < this.Layout.YSize; y++)
                {
                    if (this.Layout[x, y] == TileType.Floor)
                    {
                        TileCount++;
                    }

                    if (this.Layout[x, y] == TileType.CorridorAccess && !checkedPositions.Contains(new Vector2Int(x, y)))
                    {
                        checkedPositions.Add(new Vector2Int(x, y));

                        if (this.Layout[x + 1, y] == TileType.CorridorAccess)
                        {
                            if (this.Layout[x, y + 1] == TileType.Floor)
                            {
                                ExitDirections.Add(new Vector2Int(x, y), Direction.Down);

                                int delta = 1;
                                while (this.Layout[x + delta, y] == TileType.CorridorAccess && this.Layout[x + delta + 1, y] == TileType.CorridorAccess)
                                {
                                    checkedPositions.Add(new Vector2Int(x + delta, y));

                                    ExitDirections.Add(new Vector2Int(x + delta, y), Direction.Down);

                                    delta++;
                                }
                            }
                            else if (this.Layout[x, y - 1] == TileType.Floor)
                            {
                                ExitDirections.Add(new Vector2Int(x, y), Direction.Up);

                                int delta = 1;
                                while (this.Layout[x + delta, y] == TileType.CorridorAccess && this.Layout[x + delta + 1, y] == TileType.CorridorAccess)
                                {
                                    checkedPositions.Add(new Vector2Int(x + delta, y));

                                    ExitDirections.Add(new Vector2Int(x + delta, y), Direction.Up);

                                    delta++;
                                }
                            }
                        }
                        else if (this.Layout[x, y + 1] == TileType.CorridorAccess)
                        {
                            if (this.Layout[x + 1, y] == TileType.Floor)
                            {
                                ExitDirections.Add(new Vector2Int(x, y), Direction.Left);

                                int delta = 1;
                                while (this.Layout[x, y + delta] == TileType.CorridorAccess && this.Layout[x, y + delta + 1] == TileType.CorridorAccess && this.Layout[x, y + delta + 2] == TileType.CorridorAccess)
                                {
                                    checkedPositions.Add(new Vector2Int(x, y + delta));

                                    ExitDirections.Add(new Vector2Int(x, y + delta), Direction.Left);

                                    delta++;
                                }
                                checkedPositions.Add(new Vector2Int(x, y + delta));
                            }
                            else if (this.Layout[x - 1, y] == TileType.Floor)
                            {
                                ExitDirections.Add(new Vector2Int(x, y), Direction.Right);

                                int delta = 1;
                                while (this.Layout[x, y + delta] == TileType.CorridorAccess && this.Layout[x, y + delta + 1] == TileType.CorridorAccess && this.Layout[x, y + delta + 2] == TileType.CorridorAccess)
                                {
                                    checkedPositions.Add(new Vector2Int(x, y + delta));

                                    ExitDirections.Add(new Vector2Int(x, y + delta), Direction.Right);

                                    delta++;
                                }
                                checkedPositions.Add(new Vector2Int(x, y + delta));
                            }
                        }
                    }
                }
            }
        }
Пример #11
0
 public IExit Exit(ExitDirections direction)
 {
     return(Exits[(int)direction]);
 }
Пример #12
0
        public IRoom GetRoom(ExitDirections direction)
        {
            IExit exit = Exit(direction);

            return(exit?.Destination);
        }