Ejemplo n.º 1
0
        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);
            }
        }
Ejemplo n.º 2
0
        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);
                }
            }
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
        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);
        }