private void DrawRooms(RogueLevel level) { foreach (var room in level.Rooms) { for (var x = 0; x < room.Size.X; x++) { for (var y = 0; y < room.Size.Y; y++) { ITile tile; Coordinate coordinate = new Coordinate( room.Position.X + x, room.Position.Y + y); if (x == 0 || y == 0 || x == room.Size.X - 1 || y == room.Size.Y - 1) { tile = new Tile("wall", coordinate, true).AddTag("visionblocker"); } else { tile = new Tile("floor", coordinate); } level.SetTile(coordinate, tile); } } } }
private void DrawCorridor(RogueLevel level, RogueLevel.Room first, RogueLevel.Room second) { Coordinate startPoint, endPoint, delta, turnDelta; RogueLevel.Room from, to; bool right; int distance; int turnPoint; int turnLength; from = first.Index < second.Index ? first : second; to = first.Index < second.Index ? second : first; right = from.Index + 1 == to.Index; if (right) { startPoint = new Coordinate( from.Position.X + from.Size.X - 1, from.Position.Y + DmRandom.Next(from.Size.Y - 2) + 1); endPoint = new Coordinate( to.Position.X, to.Position.Y + DmRandom.Next(to.Size.Y - 2) + 1); delta = new Coordinate(1, 0); distance = System.Math.Abs(startPoint.X - endPoint.X) - 1; turnDelta = new Coordinate(0, startPoint.Y < endPoint.Y ? 1 : -1); turnLength = System.Math.Abs(startPoint.Y - endPoint.Y); } else { // downward corridor startPoint = new Coordinate( from.Position.X + DmRandom.Next(from.Size.X - 2) + 1, from.Position.Y + from.Size.Y - 1); endPoint = new Coordinate( to.Position.X + DmRandom.Next(to.Size.X - 2) + 1, to.Position.Y); delta = new Coordinate(0, 1); distance = System.Math.Abs(startPoint.Y - endPoint.Y) - 1; turnDelta = new Coordinate(startPoint.X < endPoint.X ? 1 : -1, 0); turnLength = System.Math.Abs(startPoint.X - endPoint.X); } turnPoint = DmRandom.Next(1, distance - 1); var current = new Coordinate(startPoint); System.Action drawAtCurrent = () => level.SetTile(current, new Tile("passage", current)); while (distance > 0) { current += delta; if (distance == turnPoint) { while (turnLength-- > 0) { drawAtCurrent(); current += turnDelta; } } drawAtCurrent(); distance--; } var startDoor = new Tile("door", startPoint); startDoor.AddTag(DmRandom.Next(2) == 0 ? "open" : "closed"); level.SetTile(startPoint, startDoor); var endDoor = new Tile("door", endPoint); endDoor.AddTag(DmRandom.Next(2) == 0 ? "open" : "closed"); level.SetTile( endPoint, endDoor); }