void ConnectRooms(IntGrid2 room1, IntGrid2 room2, int z)
        {
            var  v     = room2.Center - room1.Center;
            bool horiz = Math.Abs(v.X) < Math.Abs(v.Y);

            CreateCorridor(room1.Center, room2.Center, z, horiz);
        }
예제 #2
0
        void ConnectRooms(IntGrid2 room1, IntGrid2 room2, int z)
        {
            var v = room2.Center - room1.Center;
            bool horiz = Math.Abs(v.X) < Math.Abs(v.Y);

            CreateCorridor(room1.Center, room2.Center, z, horiz);
        }
예제 #3
0
        void InvalidateXYPlane(int z)
        {
            //Console.WriteLine("invalidate z plane {0}", z);

            var rect = new IntGrid2(0, 0, this.Size.Width, this.Size.Height);

            foreach (var _p in rect.Range())
            {
                var p = new IntVector3(_p.X, _p.Y, z);
                InvalidateChunk(p);
            }
        }
예제 #4
0
        void InvalidateXZPlane(int y)
        {
            //Console.WriteLine("invalidate y plane {0}", y);

            var rect = new IntGrid2(0, 0, this.Size.Width, this.Size.Depth);

            foreach (var _p in rect.Range())
            {
                var p = new IntVector3(_p.X, y, _p.Y);
                InvalidateChunk(p);
            }
        }
예제 #5
0
        void InvalidateYZPlane(int x)
        {
            //Console.WriteLine("invalidate x plane {0}", x);

            var rect = new IntGrid2(0, 0, this.Size.Height, this.Size.Depth);

            foreach (var _p in rect.Range())
            {
                var p = new IntVector3(x, _p.X, _p.Y);
                InvalidateChunk(p);
            }
        }
        void CreateDungeonLevel(BSPTree bsp, int z)
        {
            var root = new IntGrid2(0, 0, m_size.Width, m_size.Height);

            CreateNodes(bsp, root, 0);

            var td = TileData.EmptyTileData;

            int leafs = MyMath.Pow2(bsp.Depth - 1);

            var rooms = new List <IntGrid2>();

            // Shrink the full sized leaf nodes for rooms
            for (int l = 0; l < leafs; ++l)
            {
                int i = bsp.Length - l - 1;

                var n    = bsp[i];
                var grid = n.Grid;

                var xm = GetRandomDouble(0.2, 0.5);
                var ym = GetRandomDouble(0.2, 0.5);

                int columns = (int)((grid.Columns - 1) * xm);
                int rows    = (int)((grid.Rows - 1) * ym);
                int x       = m_random.Next(grid.Columns - columns) + grid.X;
                int y       = m_random.Next(grid.Rows - rows) + grid.Y;

                n.Grid = new IntGrid2(x, y, columns, rows);

                bsp[i] = n;

                rooms.Add(n.Grid);
            }

            m_rooms[z] = rooms.ToArray();

            for (int l = 0; l < leafs; ++l)
            {
                int i = bsp.Length - l - 1;

                var grid = bsp[i].Grid;

                foreach (var p2 in grid.Range())
                {
                    var p = new IntVector3(p2, z);

                    SetTileData(p, td);
                }
            }

            Connect(bsp, 0, true, z);
        }
예제 #7
0
        public static void Calculate(IntVector2 viewerLocation, int visionRange, Grid2D<bool> visibilityMap, IntSize2 mapSize,
			Func<IntVector2, bool> blockerDelegate)
        {
            visibilityMap.Clear();

            if (blockerDelegate(viewerLocation) == true)
                return;

            var g = new IntGrid2(new IntVector2(), mapSize);
            g = g.Offset(-viewerLocation.X, -viewerLocation.Y);
            var vr = new IntVector2(visionRange, visionRange);
            g = g.Intersect(new IntGrid2(vr, -vr));

            int visionRangeSquared = (visionRange + 1) * (visionRange + 1);	// +1 to get a bit bigger view area

            foreach (var dst in g.Range())
            {
                if (dst.X * dst.X + dst.Y * dst.Y > visionRangeSquared)
                    continue;

                bool vis = FindLos(viewerLocation, dst, blockerDelegate);
                visibilityMap[dst] = vis;
            }
        }
예제 #8
0
        void CreateNodes(BSPTree bsp, IntGrid2 grid, int i)
        {
            int middle;
            bool horiz;

            if (grid.Columns <= 4 && grid.Rows <= 4)
            {
                Debugger.Break();
                throw new Exception();
            }
            else if (grid.Columns <= 4)
            {
                horiz = true;
            }
            else if (grid.Rows <= 4)
            {
                horiz = false;
            }
            else
            {
                horiz = grid.Columns < grid.Rows;
            }

            double m = GetRandomDouble(0.4, 0.6);

            if (horiz)
                middle = (int)(grid.Rows * m);
            else
                middle = (int)(grid.Columns * m);

            bsp[i] = new BSPNode(grid, horiz);

            if (bsp.IsLeaf(i))
                return;

            int left = bsp.GetLeft(i);
            int right = bsp.GetRight(i);

            if (horiz)
            {
                // up
                var g1 = new IntGrid2(grid.X, grid.Y, grid.Columns, middle);
                CreateNodes(bsp, g1, left);

                // down
                var g2 = new IntGrid2(grid.X, grid.Y + middle + 1, grid.Columns, grid.Rows - middle - 1);
                CreateNodes(bsp, g2, right);
            }
            else
            {
                // left
                var g1 = new IntGrid2(grid.X, grid.Y, middle, grid.Rows);
                CreateNodes(bsp, g1, left);

                // right
                var g2 = new IntGrid2(grid.X + middle + 1, grid.Y, grid.Columns - middle - 1, grid.Rows);
                CreateNodes(bsp, g2, right);
            }
        }
예제 #9
0
        void CreateDungeonLevel(BSPTree bsp, int z)
        {
            var root = new IntGrid2(0, 0, m_size.Width, m_size.Height);
            CreateNodes(bsp, root, 0);

            var td = TileData.EmptyTileData;

            int leafs = MyMath.Pow2(bsp.Depth - 1);

            var rooms = new List<IntGrid2>();

            // Shrink the full sized leaf nodes for rooms
            for (int l = 0; l < leafs; ++l)
            {
                int i = bsp.Length - l - 1;

                var n = bsp[i];
                var grid = n.Grid;

                var xm = GetRandomDouble(0.2, 0.5);
                var ym = GetRandomDouble(0.2, 0.5);

                int columns = (int)((grid.Columns - 1) * xm);
                int rows = (int)((grid.Rows - 1) * ym);
                int x = m_random.Next(grid.Columns - columns) + grid.X;
                int y = m_random.Next(grid.Rows - rows) + grid.Y;

                n.Grid = new IntGrid2(x, y, columns, rows);

                bsp[i] = n;

                rooms.Add(n.Grid);
            }

            m_rooms[z] = rooms.ToArray();

            for (int l = 0; l < leafs; ++l)
            {
                int i = bsp.Length - l - 1;

                var grid = bsp[i].Grid;

                foreach (var p2 in grid.Range())
                {
                    var p = new IntVector3(p2, z);

                    SetTileData(p, td);
                }
            }

            Connect(bsp, 0, true, z);
        }
        void UpdateSelectionRect()
        {
            if (!this.Selection.IsSelectionValid)
            {
                m_selectionRect.Visibility = Visibility.Hidden;
                return;
            }

            if (this.Selection.SelectionBox.Z1 > m_mapControl.Z || this.Selection.SelectionBox.Z2 < m_mapControl.Z)
            {
                m_selectionRect.Visibility = Visibility.Hidden;
                return;
            }

            var ir = new IntGrid2(this.Selection.SelectionStart.ToIntPoint(), this.Selection.SelectionEnd.ToIntPoint());

            var r = m_mapControl.MapRectToScreenPointRect(ir);

            Canvas.SetLeft(m_selectionRect, r.Left);
            Canvas.SetTop(m_selectionRect, r.Top);
            m_selectionRect.Width = r.Width;
            m_selectionRect.Height = r.Height;

            m_selectionRect.Visibility = Visibility.Visible;
        }
예제 #11
0
 public Rect MapRectToScreenPointRect(IntGrid2 ir)
 {
     Rect r = new Rect(MapTileToScreenPoint(new Point(ir.X1 - 0.5, ir.Y1 - 0.5)),
         new Size(ir.Columns * this.TileSize, ir.Rows * this.TileSize));
     return r;
 }
예제 #12
0
        void InvalidateYZPlane(int x)
        {
            //Console.WriteLine("invalidate x plane {0}", x);

            var rect = new IntGrid2(0, 0, this.Size.Height, this.Size.Depth);

            foreach (var _p in rect.Range())
            {
                var p = new IntVector3(x, _p.X, _p.Y);
                InvalidateChunk(p);
            }
        }
예제 #13
0
        void InvalidateXZPlane(int y)
        {
            //Console.WriteLine("invalidate y plane {0}", y);

            var rect = new IntGrid2(0, 0, this.Size.Width, this.Size.Depth);

            foreach (var _p in rect.Range())
            {
                var p = new IntVector3(_p.X, y, _p.Y);
                InvalidateChunk(p);
            }
        }
 public BSPNode(IntGrid2 grid, bool horiz)
 {
     this.Grid  = grid;
     this.Horiz = horiz;
 }
        void CreateNodes(BSPTree bsp, IntGrid2 grid, int i)
        {
            int  middle;
            bool horiz;

            if (grid.Columns <= 4 && grid.Rows <= 4)
            {
                Debugger.Break();
                throw new Exception();
            }
            else if (grid.Columns <= 4)
            {
                horiz = true;
            }
            else if (grid.Rows <= 4)
            {
                horiz = false;
            }
            else
            {
                horiz = grid.Columns < grid.Rows;
            }

            double m = GetRandomDouble(0.4, 0.6);

            if (horiz)
            {
                middle = (int)(grid.Rows * m);
            }
            else
            {
                middle = (int)(grid.Columns * m);
            }


            bsp[i] = new BSPNode(grid, horiz);

            if (bsp.IsLeaf(i))
            {
                return;
            }

            int left  = bsp.GetLeft(i);
            int right = bsp.GetRight(i);

            if (horiz)
            {
                // up
                var g1 = new IntGrid2(grid.X, grid.Y, grid.Columns, middle);
                CreateNodes(bsp, g1, left);

                // down
                var g2 = new IntGrid2(grid.X, grid.Y + middle + 1, grid.Columns, grid.Rows - middle - 1);
                CreateNodes(bsp, g2, right);
            }
            else
            {
                // left
                var g1 = new IntGrid2(grid.X, grid.Y, middle, grid.Rows);
                CreateNodes(bsp, g1, left);

                // right
                var g2 = new IntGrid2(grid.X + middle + 1, grid.Y, grid.Columns - middle - 1, grid.Rows);
                CreateNodes(bsp, g2, right);
            }
        }
예제 #16
0
 public BSPNode(IntGrid2 grid, bool horiz)
 {
     this.Grid = grid;
     this.Horiz = horiz;
 }
예제 #17
0
        void InvalidateXYPlane(int z)
        {
            //Console.WriteLine("invalidate z plane {0}", z);

            var rect = new IntGrid2(0, 0, this.Size.Width, this.Size.Height);

            foreach (var _p in rect.Range())
            {
                var p = new IntVector3(_p.X, _p.Y, z);
                InvalidateChunk(p);
            }
        }
예제 #18
0
        void CreateDungeonLevel(BSPTree bsp, int z)
        {
            var root = new IntGrid2(0, 0, m_size.Width, m_size.Height);
            CreateNodes(bsp, root, 0);

            var td = new TileData();
            td.TerrainID = TerrainID.NaturalFloor;
            td.TerrainMaterialID = MaterialID.Granite;
            td.InteriorID = InteriorID.Empty;
            td.InteriorMaterialID = MaterialID.Undefined;

            int leafs = MyMath.Pow2(bsp.Depth - 1);

            var rooms = new List<IntGrid2>();

            // Shrink the full sized leaf nodes for rooms
            for (int l = 0; l < leafs; ++l)
            {
                int i = bsp.Length - l - 1;

                var n = bsp[i];
                var grid = n.Grid;

                var xm = GetRandomDouble(0.2, 0.5);
                var ym = GetRandomDouble(0.2, 0.5);

                int columns = (int)((grid.Columns - 1) * xm);
                int rows = (int)((grid.Rows - 1) * ym);
                int x = m_random.Next(grid.Columns - columns) + grid.X;
                int y = m_random.Next(grid.Rows - rows) + grid.Y;

                n.Grid = new IntGrid2(x, y, columns, rows);

                bsp[i] = n;

                rooms.Add(n.Grid);
            }

            m_rooms[z] = rooms.ToArray();

            for (int l = 0; l < leafs; ++l)
            {
                int i = bsp.Length - l - 1;

                var grid = bsp[i].Grid;

                foreach (var p2 in grid.Range())
                {
                    var p = new IntPoint3(p2, z);

                    var _td = GetTileData(p);
                    if (_td.TerrainID == td.TerrainID)
                        Debugger.Break();

                    SetTileData(p, td);
                }
            }

            Connect(bsp, 0, true, z);
        }