protected internal override void Decorate() { var start = RoomExit.Top * Width + RoomExit.Left + 1; var end = start + RoomExit.Width() - 1; for (var i = start; i < end; i++) { if (i != exit) { map[i] = Terrain.WALL_DECO; map[i + Width] = Terrain.WATER; } else { map[i + Width] = Terrain.EMPTY; } } while (true) { var pos = RoomEntrance.Random(); if (pos == entrance) { continue; } map[pos] = Terrain.SIGN; break; } }
protected override bool Build() { InitRooms(); int distance; var retry = 0; do { if (retry++ > 10) { return(false); } var innerRetry = 0; do { if (innerRetry++ > 10) { return(false); } RoomEntrance = Random.Element(Rooms); } while (RoomEntrance.Width() < 4 || RoomEntrance.Height() < 4); innerRetry = 0; do { if (innerRetry++ > 10) { return(false); } RoomExit = Random.Element(Rooms); }while (RoomExit == RoomEntrance || RoomExit.Width() < 7 || RoomExit.Height() < 7 || RoomExit.Top == 0); Graph.BuildDistanceMap(Rooms, RoomExit); distance = Graph.BuildPath(Rooms, RoomEntrance, RoomExit).Count; } while (distance < 3); RoomEntrance.type = RoomType.ENTRANCE; RoomExit.type = RoomType.BOSS_EXIT; var path = Graph.BuildPath(Rooms, RoomEntrance, RoomExit); Graph.SetPrice(path, RoomEntrance.distance); Graph.BuildDistanceMap(Rooms, RoomExit); path = Graph.BuildPath(Rooms, RoomEntrance, RoomExit); _anteroom = path[path.Count - 2]; _anteroom.type = RoomType.STANDARD; var room = RoomEntrance; foreach (var next in path) { room.Connect(next); room = next; } foreach (var room1 in Rooms.Where(room1 => room1.type == RoomType.NULL && room1.Connected.Count > 0)) { room1.type = RoomType.PASSAGE; } Paint(); var r = RoomExit.Connected.Keys.ToArray()[0]; if (RoomExit.Connected[r].Y == RoomExit.Top) { return(false); } PaintWater(); PaintGrass(); PlaceTraps(); return(true); }
protected internal override void Decorate() { for (var i = Width + 1; i < Length - Width - 1; i++) { if (map[i] != Terrain.EMPTY) { continue; } var c = 0.15f; if (map[i + 1] == Terrain.WALL && map[i + Width] == Terrain.WALL) { c += 0.2f; } if (map[i - 1] == Terrain.WALL && map[i + Width] == Terrain.WALL) { c += 0.2f; } if (map[i + 1] == Terrain.WALL && map[i - Width] == Terrain.WALL) { c += 0.2f; } if (map[i - 1] == Terrain.WALL && map[i - Width] == Terrain.WALL) { c += 0.2f; } if (Random.Float() < c) { map[i] = Terrain.EMPTY_DECO; } } for (var i = 0; i < Width; i++) { if (map[i] == Terrain.WALL && (map[i + Width] == Terrain.EMPTY || map[i + Width] == Terrain.EMPTY_SP) && Random.Int(4) == 0) { map[i] = Terrain.WALL_DECO; } } for (var i = Width; i < Length - Width; i++) { if (map[i] == Terrain.WALL && map[i - Width] == Terrain.WALL && (map[i + Width] == Terrain.EMPTY || map[i + Width] == Terrain.EMPTY_SP) && Random.Int(2) == 0) { map[i] = Terrain.WALL_DECO; } } while (true) { var pos = RoomEntrance.Random(); if (pos == entrance) { continue; } map[pos] = Terrain.SIGN; break; } var door = RoomExit.Entrance(); _arenaDoor = door.X + door.Y * Width; Painter.Set(this, _arenaDoor, Terrain.LOCKED_DOOR); Painter.Fill(this, RoomExit.Left + 2, RoomExit.Top + 2, RoomExit.Width() - 3, RoomExit.Height() - 3, Terrain.INACTIVE_TRAP); }
protected override bool Build() { InitRooms(); int distance; var retry = 0; var minDistance = (int)Math.Sqrt(Rooms.Count); do { var innerRetry = 0; do { if (innerRetry++ > 10) { return(false); } RoomEntrance = pdsharp.utils.Random.Element(Rooms); }while (RoomEntrance.Width() < 4 || RoomEntrance.Height() < 4); innerRetry = 0; do { if (innerRetry++ > 10) { return(false); } RoomExit = pdsharp.utils.Random.Element(Rooms); }while (RoomExit == RoomEntrance || RoomExit.Width() < 6 || RoomExit.Height() < 6 || RoomExit.Top == 0); Graph.BuildDistanceMap(Rooms, RoomExit); distance = RoomEntrance.Distance(); if (retry++ > 10) { return(false); } }while (distance < minDistance); RoomEntrance.type = RoomType.ENTRANCE; RoomExit.type = RoomType.BOSS_EXIT; Graph.BuildDistanceMap(Rooms, RoomExit); var path = Graph.BuildPath(Rooms, RoomEntrance, RoomExit); Graph.SetPrice(path, RoomEntrance.distance); Graph.BuildDistanceMap(Rooms, RoomExit); path = Graph.BuildPath(Rooms, RoomEntrance, RoomExit); var room = RoomEntrance; foreach (var next in path) { room.Connect(next); room = next; } room = RoomExit.Connected.Keys.First(); if (RoomExit.Top == room.Bottom) { return(false); } foreach (var r in Rooms.Where(r => r.type == RoomType.NULL && r.Connected.Count > 0)) { r.type = RoomType.TUNNEL; } var candidates = new List <Room>(); foreach (var r in RoomExit.Neigbours) { if (!RoomExit.Connected.ContainsKey(r) && (RoomExit.Left == r.Right || RoomExit.Right == r.Left || RoomExit.Bottom == r.Top)) { candidates.Add(r); } } if (candidates.Count > 0) { var kingsRoom = pdsharp.utils.Random.Element(candidates); kingsRoom.Connect(RoomExit); kingsRoom.type = RoomType.RAT_KING; } Paint(); PaintWater(); PaintGrass(); PlaceTraps(); return(true); }
protected override bool Build() { InitRooms(); int distance; var retry = 0; var minDistance = (int)Math.Sqrt(Rooms.Count); do { var innerRetry = 0; do { if (innerRetry++ > 10) { return(false); } RoomEntrance = pdsharp.utils.Random.Element(Rooms); }while (RoomEntrance.Width() < 4 || RoomEntrance.Height() < 4); innerRetry = 0; do { if (innerRetry++ > 10) { return(false); } RoomExit = pdsharp.utils.Random.Element(Rooms); }while (RoomExit == RoomEntrance || RoomExit.Width() < 6 || RoomExit.Height() < 6 || RoomExit.Top == 0); Graph.BuildDistanceMap(Rooms, RoomExit); distance = Graph.BuildPath(Rooms, RoomEntrance, RoomExit).Count; if (retry++ > 10) { return(false); } }while (distance < minDistance); RoomEntrance.type = RoomType.ENTRANCE; RoomExit.type = RoomType.EXIT; Graph.BuildDistanceMap(Rooms, RoomExit); var path = Graph.BuildPath(Rooms, RoomEntrance, RoomExit); Graph.SetPrice(path, RoomEntrance.distance); Graph.BuildDistanceMap(Rooms, RoomExit); path = Graph.BuildPath(Rooms, RoomEntrance, RoomExit); var room = RoomEntrance; foreach (var next in path) { room.Connect(next); room = next; } Room roomShop = null; var shopSquare = 0; foreach (var r in Rooms) { if (r.type != RoomType.NULL || r.Connected.Count <= 0) { continue; } r.type = RoomType.PASSAGE; if (r.Square() <= shopSquare) { continue; } roomShop = r; shopSquare = r.Square(); } if (roomShop == null || shopSquare < 30) { return(false); } roomShop.type = Imp.Quest.IsCompleted ? RoomType.SHOP : RoomType.STANDARD; Paint(); PaintWater(); PaintGrass(); return(true); }