// Issue 5 - End static TileData() { using (FileStream fileStream = FileManager.GetFile("tiledata.mul")) { BinaryReader binaryReader = new BinaryReader(fileStream); LandData landData; for (int i = 0; i < 0x4000; i++) { landData = new LandData(); if ((i & 0x1F) == 0) { binaryReader.ReadInt32(); } TileFlag flags = (TileFlag)binaryReader.ReadInt32(); int iTextureID = binaryReader.ReadInt16(); binaryReader.BaseStream.Seek(20, SeekOrigin.Current); landData.Flags = flags; landData.TextureID = iTextureID; LandData[i] = landData; } ItemData itemData; for (int i = 0; i < 0x4000; i++) { itemData = new ItemData(); if ((i & 0x1F) == 0) { binaryReader.ReadInt32(); } itemData.Flags = (TileFlag)binaryReader.ReadInt32(); itemData.Weight = binaryReader.ReadByte(); itemData.Quality = binaryReader.ReadByte(); binaryReader.BaseStream.Seek(3, SeekOrigin.Current); itemData.Quantity = binaryReader.ReadByte(); itemData.AnimID = binaryReader.ReadInt16(); binaryReader.BaseStream.Seek(3, SeekOrigin.Current); itemData.Value = binaryReader.ReadByte(); itemData.Height = binaryReader.ReadByte(); itemData.Name = System.Text.ASCIIEncoding.ASCII.GetString((binaryReader.ReadBytes(20))); itemData.Name = itemData.Name.Trim('\0'); // binaryReader.BaseStream.Seek(20, SeekOrigin.Current); // Issue 5 - Statics (bridge, stairs, etc) should be walkable - http://code.google.com/p/ultimaxna/issues/detail?id=5 - Smjert if (i > 1005 && i < 7640) { itemData.IsStairs = !(Array.BinarySearch(m_StairsID, i) < 0); } // Issue 5 - End ItemData[i] = itemData; } Metrics.ReportDataRead((int)binaryReader.BaseStream.Position); } }
private unsafe int PatchStatics(TileMatrix tileMatrix, string dataPath, string indexPath, string lookupPath) { using (FileStream fsData = FileManager.GetFile(dataPath)) { using (FileStream fsIndex = FileManager.GetFile(indexPath)) { using (FileStream fsLookup = FileManager.GetFile(lookupPath)) { BinaryReader indexReader = new BinaryReader(fsIndex); BinaryReader lookupReader = new BinaryReader(fsLookup); int count = (int)(indexReader.BaseStream.Length / 4); StaticTileList[][] lists = new StaticTileList[8][]; for (int x = 0; x < 8; ++x) { lists[x] = new StaticTileList[8]; for (int y = 0; y < 8; ++y) { lists[x][y] = new StaticTileList(); } } for (int i = 0; i < count; ++i) { int blockID = indexReader.ReadInt32(); int blockX = blockID / tileMatrix.BlockHeight; int blockY = blockID % tileMatrix.BlockHeight; int offset = lookupReader.ReadInt32(); int length = lookupReader.ReadInt32(); lookupReader.ReadInt32(); if (offset < 0 || length <= 0) { tileMatrix.SetStaticBlock(blockX, blockY, tileMatrix.EmptyStaticsBlock); continue; } fsData.Seek(offset, SeekOrigin.Begin); int tileCount = length / 7; if (m_TileBuffer.Length < tileCount) { m_TileBuffer = new StaticTile[tileCount]; } StaticTile[] staticTiles = m_TileBuffer; fixed(StaticTile *pStaticTiles = staticTiles) { SharedMethods.Read(fsData.SafeFileHandle, pStaticTiles, length); StaticTile *pCur = pStaticTiles, pEnd = pStaticTiles + tileCount; while (pCur < pEnd) { lists[pCur->X & 0x07][pCur->Y & 0x07].Add((short)((pCur->ID & 0x3FFF) + 0x4000), pCur->Z); pCur = pCur + 1; } StaticTile[][][] tiles = new StaticTile[8][][]; for (int x = 0; x < 8; ++x) { tiles[x] = new StaticTile[8][]; for (int y = 0; y < 8; ++y) { tiles[x][y] = lists[x][y].ToArray(); } } tileMatrix.SetStaticBlock(blockX, blockY, tiles); } } indexReader.Close(); lookupReader.Close(); return(count); } } } }