private void GenerateInternal(BaseMapBlock _block, params Point[] _objects) { var rnd = new Random(_block.RandomSeed); MapBlockHelper.Clear(_block, rnd, this, DefaultWalls); var rooms = LayerHelper.GenerateRooms(rnd, new Rct(0, 0, Constants.MAP_BLOCK_SIZE - 1, Constants.MAP_BLOCK_SIZE - 1), new List <Point>(_objects), _block.BlockId); foreach (var room in rooms) { MapBlockHelper.Fill(_block, rnd, this, DefaultEmptySpaces, room.RoomRectangle); _block.AddRoom(room); } }
public override void Fill(MapBlock _block, WorldLayer _layer) { var rnd = new Random(_block.RandomSeed); InDoorWorldCoords = Room.RoomRectangle.Inflate(-1, -1).BorderPoints.ToArray(); OutDoorWorldCoords = Room.RoomRectangle.BorderPoints.ToArray(); MapBlockHelper.Fill(_block, rnd, _layer, _layer.DefaultEmptySpaces, Room.AreaRectangle); var graves = EssenceHelper.GetAllThings <Grave>().ToArray(); foreach (var point in Room.RoomRectangle.AllPoints) { if (rnd.Next(4) == 0 && !InDoorWorldCoords.Contains(point)) { _block.AddEssence(graves.RandomItem(rnd), point); } } }
protected override MapBlock GenerateBlock(Point _blockId) { BaseMapBlock baseMapBlock; if (!m_mazeBlocks.TryGetValue(_blockId, out baseMapBlock)) { var eblock = new MapBlock(_blockId); var ernd = new Random(eblock.RandomSeed); MapBlockHelper.Clear(eblock, ernd, this, DefaultWalls); return(eblock); } var block = new MapBlock(_blockId, baseMapBlock); var rnd = new Random(block.RandomSeed); AddItems(block, rnd); AddCreatures(block, rnd); return(block); }
protected override MapBlock GenerateBlock(Point _blockId) { var block = new MapBlock(_blockId); var rnd = new Random(block.RandomSeed); MapBlockHelper.Clear(block, rnd, this, DefaultEmptySpaces); const int v = Constants.MAP_BLOCK_SIZE / 2 - 2; for (var i = 0; i < v; ++i) { block.Map[i, 0] = ETerrains.STONE_WALL; block.Map[0, i] = ETerrains.STONE_WALL; block.Map[Constants.MAP_BLOCK_SIZE - 1 - i, 0] = ETerrains.STONE_WALL; block.Map[0, Constants.MAP_BLOCK_SIZE - 1 - i] = ETerrains.STONE_WALL; } block.AddEssence(new OnWallTorch(new LightSource(8, new FColor(5f, 1f, 0, 0)), EDirections.DOWN, EssenceHelper.GetFirstFoundedMaterial <WoodMaterial>()), new Point(1, 1)); block.AddEssence(new OnWallTorch(new LightSource(8, new FColor(1f, 0f, 1f, 0f)), EDirections.UP, EssenceHelper.GetFirstFoundedMaterial <WoodMaterial>()), new Point(Constants.MAP_BLOCK_SIZE - 1, Constants.MAP_BLOCK_SIZE - 1)); block.AddEssence(new OnWallTorch(new LightSource(8, new FColor(1f, 0f, 0f, 1f)), EDirections.RIGHT, EssenceHelper.GetFirstFoundedMaterial <WoodMaterial>()), new Point(Constants.MAP_BLOCK_SIZE - 1, 1)); block.AddEssence(new OnWallTorch(new LightSource(8, new FColor(1f, 1f, 0f, 1f)), EDirections.LEFT, EssenceHelper.GetFirstFoundedMaterial <WoodMaterial>()), new Point(1, Constants.MAP_BLOCK_SIZE - 1)); { var x = rnd.Next(Constants.MAP_BLOCK_SIZE); var y = rnd.Next(Constants.MAP_BLOCK_SIZE); block.CreaturesAdd(EssenceHelper.GetFirstFoundedCreature <AbstractMonster>(), new Point(x, y)); } block.Map[9, 9] = ETerrains.RED_BRICK_WALL; block.Map[10, 9] = ETerrains.RED_BRICK_WINDOW; block.Map[11, 9] = ETerrains.RED_BRICK_WALL; block.Map[11, 10] = ETerrains.RED_BRICK_WINDOW; block.Map[9, 10] = ETerrains.RED_BRICK_WINDOW; block.Map[9, 11] = ETerrains.RED_BRICK_WALL; block.AddEssence(new ClosedDoor(null), new Point(10, 11)); block.Map[11, 11] = ETerrains.RED_BRICK_WALL; //block.AddLightSource(new Point(10, 10), new LightSource(18, new FColor(53f, 0f, 1f, 1f))); return(block); }
private void ConnectTwoRooms(Room _room1, Room _room2, IDictionary <Point, EDirections> _forbid, IDictionary <Point, Connector> _connectors, params Point[] _points) { var rnd = new Random(m_mazeBlocks[_room1.BlockId].RandomSeed); var pnt = _points[0]; var defEmpty = DefaultEmptySpaces.ToArray(); Point point = null; for (var i = 1; i < _points.Length; ++i) { var line = pnt.GetLineToPoints(_points[i]).ToArray(); var border = Util.GetDirection(pnt, _points[i]).GetBorders().ToArray(); for (var index = 0; index < line.Length; index++) { if (point == line[index]) { continue; } point = line[index]; Connector connector; if (_connectors.TryGetValue(point, out connector)) { _room1.Connect(connector.Rooms.ToArray()); connector.Rooms.Add(_room1); if (_room2 != null) { ConnectTwoRooms(_room2, null, _forbid, _connectors, _points.Reverse().ToArray()); } return; } if (_room2 != null) { _connectors.Add(point, new Connector(_room1, _room2)); } else { _connectors.Add(point, new Connector(_room1)); } var inBlock = BaseMapBlock.GetInBlockCoords(point); var blockId = BaseMapBlock.GetBlockId(point); BaseMapBlock block; if (!m_mazeBlocks.TryGetValue(blockId, out block)) { block = new MapBlock(blockId); MapBlockHelper.Clear(block, rnd, this, DefaultWalls); m_mazeBlocks[blockId] = block; } block.Map[inBlock.X, inBlock.Y] = defEmpty.RandomItem(rnd); if (index != 0 && index < line.Length - 1) { foreach (var delta in border) { var borderPnt = point + delta.Key; EDirections dir; if (!_forbid.TryGetValue(borderPnt, out dir)) { dir = EDirections.DOWN | EDirections.UP | EDirections.LEFT | EDirections.RIGHT; } _forbid[borderPnt] = dir & delta.Value; } } } pnt = _points[i]; } _room1.Connect(_room2); }