public void DecorateRoom(DungeonRoom room) { lightsDecorator.DecorateRoom(room); DungeonRoomType roomType = roomTypes[Random.Range(0, roomTypes.Length)]; room.SetFloorTile(roomType.floorIds); room.SetWallTile(roomType.wallIds); }
/// <summary> /// Creates and puts a particular room in a particular rectangle /// </summary> /// <param name="roomType"></param> /// <param name="rect"></param> /// <param name="circle">When the room is a Summoning Room, there's the circle</param> private static void PutRoom(MapBlock[,] map, int tileID, int level, DungeonRoomType roomType, Rectangle rect, out SummoningCircle circle) { circle = null; string tagName = roomType.ToString().ToLower().Replace("_", " ") + " room"; LocalMapXMLParser parser = new LocalMapXMLParser(); var maplet = parser.ParseMapletFromTag(tagName); //Change the width and height to match the rectangle we're fitting it in //Leave a rim of 1 maplet.SizeX = rect.Width - 2; maplet.SizeY = rect.Height - 2; LocalMapGenerator lmg = new LocalMapGenerator(); Actor[] actors = null; MapletActorWanderArea[] areas = null; MapletPatrolPoint[] patrolRoutes = null; MapletFootpathNode[] footpathNodes = null; var gennedMap = lmg.GenerateMap(tileID, null, maplet, false, "", OwningFactions.UNDEAD, out actors, out areas, out patrolRoutes, out footpathNodes); //Is this a summoning room? if (roomType == DungeonRoomType.SUMMONING) { //Go through each map block and see if we find a summoning circle for (int x = 0; x < gennedMap.GetLength(0); x++) { for (int y = 0; y < gennedMap.GetLength(1); y++) { var block = gennedMap[x, y]; if (block.GetTopMapItem() != null && block.GetTopMapItem().GetType().Equals(typeof(SummoningCircle))) { circle = block.GetTopMapItem() as SummoningCircle; } } } } if (roomType == DungeonRoomType.COMBAT_PIT) { int docLevel = (int) level/4; docLevel = docLevel < 1 ? 1 : docLevel; docLevel = docLevel > 5 ? 5 : docLevel; //Generate a combat manual - Level [1..5] will be determined by floor of Dungeon Level /4 CombatManual cm = new CombatManual(SpecialAttacksGenerator.GenerateSpecialAttack(docLevel)); //Now place it, somewhere (or at least try 50 times) for(int i=0; i < 50; i++) { MapBlock randomBlock = gennedMap[GameState.Random.Next(gennedMap.GetLength(0)), GameState.Random.Next(gennedMap.GetLength(1))]; if (randomBlock.MayContainItems) { randomBlock.ForcePutItemOnBlock(cm); break; } } } //Do we have any treasure chests? for (int x = 0; x < gennedMap.GetLength(0); x++) { for (int y = 0; y < gennedMap.GetLength(1); y++) { var block = gennedMap[x, y]; if (block.GetTopMapItem() != null && block.GetTopMapItem().GetType().Equals(typeof(TreasureChest))) { TreasureChest chest = block.GetTopMapItem() as TreasureChest; InventoryItemManager iim = new InventoryItemManager(); //Fill em up chest.Contents = iim.FillTreasureChest((InventoryCategory[])Enum.GetValues(typeof(InventoryCategory)), 300 + (50 * level)); } } } //Now fit one into the other lmg.JoinMaps(map, gennedMap, rect.X + 1, rect.Y + 1); }