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); } } } } }
private void Awake() { dungeon = I_dungeon; dungeon.Init(dungeonSize, dungeonMaxSplitVariance, dungeonMinSubAreaSize); }
/// <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; }