示例#1
0
    void Update()
    {
        if (Application.isPlaying)
        {
            return;
        }

        if (!map)
        {
            return;
        }

        if (freezed)
        {
            return;
        }

        Clear();

        dungeon = new Dungeon.Dungeon(randomSeed);

        DungeonMapPixel[] mapPixels     = GetComponents <DungeonMapPixel>();
        DungeonMapPixel[] wallMapPixels = Array.FindAll(mapPixels, mapPixel => mapPixel.isWall == true);
        DungeonMapPixel[] roomMapPixels = Array.FindAll(mapPixels, mapPixel => mapPixel.isWall == false);

        List <Color> roomColors = new List <Color>(Array.ConvertAll(roomMapPixels, mapPixel => mapPixel.pixelColor))
        {
            roomColor
        };
        List <Color> wallColors = new List <Color>(Array.ConvertAll(wallMapPixels, mapPixel => mapPixel.pixelColor))
        {
            wallColor
        };

        dungeon.Init(map, roomColors);

        foreach (Room room in dungeon.rooms)
        {
            // ROOM
            foreach (Cell cell in room.cells)
            {
                List <GameObject> currentRoomMapPixels = new List <GameObject>(Array.ConvertAll(
                                                                                   Array.FindAll(roomMapPixels, mapPixel => mapPixel.pixelColor == cell.pixel),
                                                                                   mapPixel => mapPixel.prefab));

                if (currentRoomMapPixels.Count > 0)
                {
                    Create(cell, 0, 0, 0, currentRoomMapPixels, debugColor: Color.blue);
                }
                else
                {
                    float rotateY = randomRotateFloorTiles ? 90f * dungeon.random.GetInt(4) : 0;

                    Create(cell, 0, 0, rotateY, floorTiles, debugColor: Color.blue);
                }
            }

            // WALLS
            foreach (Cell cell in room.walls)
            {
                cell.ComputeWallQuartersFor(room);

                // fetch mapPixels of the current cell pixel/color
                List <GameObject> currentWallMapPixels = new List <GameObject>(Array.ConvertAll(
                                                                                   Array.FindAll(wallMapPixels, mapPixel => mapPixel.pixelColor == cell.pixel),
                                                                                   mapPixel => mapPixel.prefab));

                if (currentWallMapPixels.Count > 0)
                {
                    // do not produce a brand new tile if a tile was already created (by another room)
                    if (cell.tiles.Count == 0)
                    {
                        float rotationY = 0;

                        if (cell.W != null && cell.E != null && cell.W.room != null && cell.E.room != null)
                        {
                            rotationY = 90;
                        }

                        Create(cell, 0, 0, rotationY, currentWallMapPixels);
                    }

                    continue;
                }

                // DOUBLE LOOKUP
                for (int index = 0; index < 4; index++)
                {
                    var quarter         = cell.wallQuarters[index];
                    var previousQuarter = cell.wallQuarters[index == 0 ? 3 : index - 1];

                    bool bothAreSimpleWall       = previousQuarter.type == WallQuarter.Type.SIMPLE_WALL && quarter.type == WallQuarter.Type.SIMPLE_WALL;
                    bool bothHaveSameOrientation = previousQuarter.orientation == quarter.orientation;

                    if (bothAreSimpleWall && bothHaveSameOrientation)
                    {
                        if (quarter.orientation == Orientation.S)
                        {
                            Create(cell, 0, -.25f, 0, simpleWalls);
                        }
                        else if (quarter.orientation == Orientation.E)
                        {
                            Create(cell, .25f, 0, -90, simpleWalls);
                        }
                        else if (quarter.orientation == Orientation.N)
                        {
                            Create(cell, 0, .25f, 180, simpleWalls);
                        }
                        else if (quarter.orientation == Orientation.W)
                        {
                            Create(cell, -.25f, 0, 90, simpleWalls);
                        }

                        previousQuarter.done = true;
                        quarter.done         = true;
                    }
                }

                // REGULAR LOOP
                for (int index = 0; index < 4; index++)
                {
                    var   quarter = cell.wallQuarters[index];
                    var   v       = Orientation.ToVector(quarter.position);
                    float dx      = .25f * v.x;
                    float dy      = .25f * v.y;

                    if (quarter.done)
                    {
                        continue;
                    }

                    if (quarter.type == WallQuarter.Type.INNER_CORNER)
                    {
                        Create(cell, dx, dy, 90 * -index, cornerWalls);
                    }
                    else if (quarter.type == WallQuarter.Type.OUTER_CORNER)
                    {
                        Create(cell, dx, dy, 90 * (-index + 1), outerCornerWalls);
                    }
                    else if (quarter.type == WallQuarter.Type.SIMPLE_WALL)
                    {
                        Create(cell, dx, dy, Orientation.CardinalToRotation(quarter.orientation), halfWalls);
                    }
                }
            }
        }
    }
示例#2
0
 private void Awake()
 {
     dungeon = I_dungeon;
     dungeon.Init(dungeonSize, dungeonMaxSplitVariance, dungeonMinSubAreaSize);
 }
示例#3
0
        /// <summary>
        /// Get input for commands
        /// </summary>
        private void UpdateInput()
        {
            KeyboardState newState      = Keyboard.GetState();
            MouseState    newMouseState = Mouse.GetState();

            //Checks if the same key has been held for a period of time.
            if (newState.Equals(oldState))
            {
                if (!held)
                {
                    oldtime = time;
                    held    = true;
                }
                else
                {
                    if (!repeat && time.TotalMilliseconds - oldtime.TotalMilliseconds > 250)
                    {
                        repeat = true;
                    }
                }
            }
            else
            {
                held   = false;
                repeat = false;
            }

            // Is the SPACE key down?
            if (newState.IsKeyDown(Keys.Space))
            {
                if (!oldState.IsKeyDown(Keys.Space))
                {
                    dungeon.Clear();
                    level = new Dungeon(npcDicationary);
                    dungeon.Add(level);
                    npcs = level.npcs;
                    currentdngn_floor = 0;
                    player            = new Player(level.upStairs);
                    fov = new FOV(level.grid, player.location);
                    fov.GetVisibility();
                    Log.Write("New floor generated.");
                    playerActed = false;
                }
            }
            if (newState.IsKeyDown(Keys.Left) || newState.IsKeyDown(Keys.NumPad4))
            {
                if (!oldState.IsKeyDown(Keys.Left) && !oldState.IsKeyDown(Keys.NumPad4) || repeat)
                {
                    if (doorWait != "none")
                    {
                        doorTile = level.grid[(int)player.location.X - 1, (int)player.location.Y];
                        switch (doorWait)
                        {
                        case ("close"):
                            playerActed = doorTile.CloseDoor();
                            break;

                        case ("open"):
                            playerActed = doorTile.OpenDoor();
                            break;
                        }
                        doorWait = "none";
                    }
                    else
                    {
                        moveToList = player.Movement(new Vector2(-1, 0), level.grid, moveType, moveToList);
                        moveType   = "one";
                    }
                    fov = new FOV(level.grid, player.location);
                    fov.GetVisibility();
                }
            }
            if (newState.IsKeyDown(Keys.NumPad7))
            {
                if (!oldState.IsKeyDown(Keys.NumPad7) || repeat)
                {
                    if (doorWait != "none")
                    {
                        doorTile = level.grid[(int)player.location.X - 1, (int)player.location.Y - 1];
                        switch (doorWait)
                        {
                        case ("close"):
                            playerActed = doorTile.CloseDoor();
                            break;

                        case ("open"):
                            playerActed = doorTile.OpenDoor();
                            break;
                        }
                        doorWait = "none";
                    }
                    else
                    {
                        moveToList = player.Movement(new Vector2(-1, -1), level.grid, moveType, moveToList);
                        moveType   = "one";
                    }
                    fov = new FOV(level.grid, player.location);
                    fov.GetVisibility();
                }
            }
            if (newState.IsKeyDown(Keys.Up) || newState.IsKeyDown(Keys.NumPad8))
            {
                if (!oldState.IsKeyDown(Keys.Up) && !oldState.IsKeyDown(Keys.NumPad8) || repeat)
                {
                    if (doorWait != "none")
                    {
                        doorTile = level.grid[(int)player.location.X, (int)player.location.Y - 1];
                        switch (doorWait)
                        {
                        case ("close"):
                            playerActed = doorTile.CloseDoor();
                            break;

                        case ("open"):
                            playerActed = doorTile.OpenDoor();
                            break;
                        }
                        doorWait = "none";
                    }
                    else
                    {
                        moveToList = player.Movement(new Vector2(0, -1), level.grid, moveType, moveToList);
                        moveType   = "one";
                    }
                    fov = new FOV(level.grid, player.location);
                    fov.GetVisibility();
                }
            }
            if (newState.IsKeyDown(Keys.NumPad9))
            {
                if (!oldState.IsKeyDown(Keys.NumPad9) || repeat)
                {
                    if (doorWait != "none")
                    {
                        doorTile = level.grid[(int)player.location.X + 1, (int)player.location.Y - 1];
                        switch (doorWait)
                        {
                        case ("close"):
                            playerActed = doorTile.CloseDoor();
                            break;

                        case ("open"):
                            playerActed = doorTile.OpenDoor();
                            break;
                        }
                        doorWait = "none";
                    }
                    else
                    {
                        moveToList = player.Movement(new Vector2(1, -1), level.grid, moveType, moveToList);
                        moveType   = "one";
                    }
                    fov = new FOV(level.grid, player.location);
                    fov.GetVisibility();
                }
            }
            if (newState.IsKeyDown(Keys.Right) || newState.IsKeyDown(Keys.NumPad6))
            {
                if (!oldState.IsKeyDown(Keys.Right) && !oldState.IsKeyDown(Keys.NumPad6) || repeat)
                {
                    if (doorWait != "none")
                    {
                        doorTile = level.grid[(int)player.location.X + 1, (int)player.location.Y];
                        switch (doorWait)
                        {
                        case ("close"):
                            playerActed = doorTile.CloseDoor();
                            break;

                        case ("open"):
                            playerActed = doorTile.OpenDoor();
                            break;
                        }
                        doorWait = "none";
                    }
                    else
                    {
                        moveToList = player.Movement(new Vector2(1, 0), level.grid, moveType, moveToList);
                        moveType   = "one";
                    }
                    fov = new FOV(level.grid, player.location);
                    fov.GetVisibility();
                }
            }
            if (newState.IsKeyDown(Keys.NumPad3))
            {
                if (!oldState.IsKeyDown(Keys.NumPad3) || repeat)
                {
                    if (doorWait != "none")
                    {
                        doorTile = level.grid[(int)player.location.X + 1, (int)player.location.Y + 1];
                        switch (doorWait)
                        {
                        case ("close"):
                            playerActed = doorTile.CloseDoor();
                            break;

                        case ("open"):
                            playerActed = doorTile.OpenDoor();
                            break;
                        }
                        doorWait = "none";
                    }
                    else
                    {
                        moveToList = player.Movement(new Vector2(1, 1), level.grid, moveType, moveToList);
                        moveType   = "one";
                    }
                    fov = new FOV(level.grid, player.location);
                    fov.GetVisibility();
                }
            }
            if (newState.IsKeyDown(Keys.Down) || newState.IsKeyDown(Keys.NumPad2))
            {
                if (!oldState.IsKeyDown(Keys.Down) && !oldState.IsKeyDown(Keys.NumPad2) || repeat)
                {
                    if (doorWait != "none")
                    {
                        doorTile = level.grid[(int)player.location.X, (int)player.location.Y + 1];
                        switch (doorWait)
                        {
                        case ("close"):
                            playerActed = doorTile.CloseDoor();
                            break;

                        case ("open"):
                            playerActed = doorTile.OpenDoor();
                            break;
                        }
                        doorWait = "none";
                    }
                    else
                    {
                        moveToList = player.Movement(new Vector2(0, 1), level.grid, moveType, moveToList);
                        moveType   = "one";
                    }
                    fov = new FOV(level.grid, player.location);
                    fov.GetVisibility();
                }
            }
            if (newState.IsKeyDown(Keys.NumPad1))
            {
                if (!oldState.IsKeyDown(Keys.NumPad1) || repeat)
                {
                    if (doorWait != "none")
                    {
                        doorTile = level.grid[(int)player.location.X - 1, (int)player.location.Y + 1];
                        switch (doorWait)
                        {
                        case ("close"):
                            playerActed = doorTile.CloseDoor();
                            break;

                        case ("open"):
                            playerActed = doorTile.OpenDoor();
                            break;
                        }
                        doorWait = "none";
                    }
                    else
                    {
                        moveToList = player.Movement(new Vector2(-1, 1), level.grid, moveType, moveToList);
                        moveType   = "one";
                    }
                    fov = new FOV(level.grid, player.location);
                    fov.GetVisibility();
                }
            }
            if (newState.IsKeyDown(Keys.OemPeriod))
            {
                if (!oldState.IsKeyDown(Keys.OemPeriod))
                {
                    if (player.MoveDown(level.grid))
                    {
                        if (currentdngn_floor == dungeon.Count - 1)
                        {
                            level = new Dungeon(npcDicationary);
                            dungeon.Add(level);
                            npcs = level.npcs;
                            currentdngn_floor++;
                        }
                        else
                        {
                            currentdngn_floor++;
                            level = dungeon[currentdngn_floor];
                        }
                        player.location = level.upStairs.tilePos;
                        fov             = new FOV(level.grid, player.location);
                        fov.GetVisibility();
                    }
                }
            }
            if (newState.IsKeyDown(Keys.OemComma))
            {
                if (!oldState.IsKeyDown(Keys.OemComma))
                {
                    if (currentdngn_floor > 0)
                    {
                        if (player.MoveUp(level.grid))
                        {
                            currentdngn_floor--;
                            level           = dungeon[currentdngn_floor];
                            npcs            = level.npcs;
                            player.location = level.downStairs.tilePos;
                            fov             = new FOV(level.grid, player.location);
                            fov.GetVisibility();
                        }
                    }
                }
            }
            if (newState.IsKeyDown(Keys.C))
            {
                if (!oldState.IsKeyDown(Keys.C))
                {
                    doorWait = "close";
                    Log.Write("Close which door?");
                }
            }
            if (newState.IsKeyDown(Keys.O))
            {
                if (!oldState.IsKeyDown(Keys.O))
                {
                    doorWait = "open";
                    Log.Write("Open which door?");
                }
            }
            if (newState.IsKeyDown(Keys.Divide))
            {
                if (!oldState.IsKeyDown(Keys.Divide))
                {
                    moveType = "five";
                }
            }
            if (newState.IsKeyDown(Keys.Multiply))
            {
                if (!oldState.IsKeyDown(Keys.Multiply))
                {
                    moveType = "end";
                }
            }

            if (newState.IsKeyDown(Keys.I))
            {
                if (!oldState.IsKeyDown(Keys.I))
                {
                    menu = !menu;
                }
            }

            /*if (newState.IsKeyDown(Keys.X))
             * {
             *  if (!oldState.IsKeyDown(Keys.X))
             *  {
             *      moveToList = Pathing.FindPath(new Vector2(12,12),level.grid);
             *  }
             * }*/

            if (newState.IsKeyDown(Keys.Escape))
            {
                if (!oldState.IsKeyDown(Keys.Escape))
                {
                    Exit();
                }
            }

            if (newState.IsKeyDown(Keys.Enter))
            {
                if (!oldState.IsKeyDown(Keys.Enter))
                {
                    Log.Write("Test message!");
                }
            }

            if (newState.IsKeyDown(Keys.F10))
            {
                if (!oldState.IsKeyDown(Keys.F10))
                {
                    for (int x = 0; x < 50; x++)
                    {
                        for (int y = 0; y < 50; y++)
                        {
                            level.grid[x, y].visible = true;
                        }
                    }
                }
            }

            if (newMouseState.LeftButton == ButtonState.Pressed)
            {
                if (oldMouseState.LeftButton != ButtonState.Pressed &&
                    GraphicsDevice.Viewport.Bounds.Contains(new Point((int)newMouseState.X, (int)newMouseState.Y)))
                {
                    Vector2 clickedTile = new Vector2();
                    Vector2 moveToTile  = new Vector2();
                    clickedTile.X = newMouseState.X / 32;  //Get on screen tile coords
                    clickedTile.Y = newMouseState.Y / 32;

                    if (clickedTile.X >= 0 && clickedTile.X < 25 && clickedTile.Y >= 0 && clickedTile.Y < 25)
                    {
                        moveToTile = viewport.GetTile(clickedTile);  //Get whole dungeon tile coords
                        if (level.grid[(int)moveToTile.X, (int)moveToTile.Y].seen ||
                            level.grid[(int)moveToTile.X, (int)moveToTile.Y].visible)
                        {
                            moveToList = Pathing.FindPath(moveToTile, player.location, level.grid);
                        }
                    }
                }
            }

            // Update saved state.
            oldState      = newState;
            oldMouseState = newMouseState;
        }