예제 #1
0
        private static NavGridFile ReadStandardNavGridHeader(NavBinaryReader b, NavGridFile grid)
        {
            grid.MinGridPos = b.ReadVector3();
            grid.MaxGridPos = b.ReadVector3();

            grid.CellSize   = b.GetBinaryReader().ReadSingle();
            grid.XCellCount = b.GetBinaryReader().ReadUInt32();
            grid.YCellCount = b.GetBinaryReader().ReadUInt32();

            return(grid);
        }
예제 #2
0
        private static NavGridFile ReadData(NavBinaryReader b)
        {
            var grid = new NavGridFile
            {
                MajorVersion = b.GetBinaryReader().ReadByte()
            };

            if (grid.MajorVersion != 2)
            {
                grid.MinorVersion = b.GetBinaryReader().ReadInt16();
            }

            grid           = ReadStandardNavGridHeader(b, grid);
            grid.Cells     = new NavGridCell[grid.XCellCount * grid.YCellCount];
            grid.CellFlags = new ushort[grid.XCellCount * grid.YCellCount];

            if (grid.MajorVersion == 0x02 || grid.MajorVersion == 0x03 || grid.MajorVersion == 0x05)
            {
                // Read cells, total size: 0x38 * XCellCount * YCellCount bytes

                for (var i = 0; i < grid.Cells.Length; i++)
                {
                    grid.Cells[i]    = b.ReadGridCell_Version5(out grid.CellFlags[i]);
                    grid.Cells[i].Id = i;
                }

                grid.XSampledHeightCount = b.GetBinaryReader().ReadInt32();
                grid.YSampledHeightCount = b.GetBinaryReader().ReadInt32();

                //should be mXSampledHeightDist
                grid.DirectionX = b.GetBinaryReader().ReadSingle();
                //should be mYSampledHeightDist
                grid.DirectionY = b.GetBinaryReader().ReadSingle();
            }
            else if (grid.MajorVersion == 0x07)
            {
                // Read cells, total size: 0x30 * XCellCount * YCellCount bytes

                for (var i = 0; i < grid.Cells.Length; i++)
                {
                    grid.Cells[i]    = b.ReadGridCell_Version7();
                    grid.Cells[i].Id = i;
                }

                for (var i = 0; i < grid.Cells.Length; i++)
                {
                    grid.CellFlags[i] = b.GetBinaryReader().ReadUInt16();
                }
            }
            else
            {
                throw new Exception($"Magic number at the start is unsupported! Value: {grid.MajorVersion:X}");
            }

            var highestX = 0;
            var highestY = 0;

            foreach (var cell in grid.Cells)
            {
                if (cell.X > highestX)
                {
                    highestX = cell.X;
                }
                if (cell.Y > highestY)
                {
                    highestY = cell.Y;
                }
            }

            // Quality variable naming Kappa
            var asdf = grid.TranslateFromNavGrid(new Vector <float> {
                X = highestX, Y = highestY
            });

            grid.MapWidth    = asdf.X;
            grid.MapHeight   = asdf.Y;
            grid.MiddleOfMap = new Vector2(asdf.X / 2, asdf.Y / 2);

            return(grid);
        }