示例#1
0
 public EffectDataResource()
 {
     // From http://wpdev.sourceforge.net/docs/guide/node167.html:
     // There are 2048 blocks, 8 entries per block, 68 bytes per entry.
     // Thanks to Krrios for figuring out the blocksizes.
     // Each block has an 4 byte header which is currently unknown. The
     // entries correspond with the Static ID. You can lookup an entry
     // for a given static with this formula:
     // Offset = (id>>3)*548+(id&15)*68+4;
     // Here is the record format for each entry:
     // byte[64] Frames
     // byte     Unknown
     // byte     Number of Frames Used
     // byte     Frame Interval
     // byte     Start Interval
     _animData = new EffectData[Count][];
     using (var s = UltimaFileManager.GetFile("animdata.mul"))
     {
         var r = new BinaryReader(s);
         for (var i = 0; i < Count; i++)
         {
             var data   = new EffectData[8];
             var header = r.ReadInt32(); // unknown value.
             for (var j = 0; j < 8; j++)
             {
                 data[j] = new EffectData(r);
             }
             _animData[i] = data;
         }
     }
 }
示例#2
0
        static uint[] getTextureData()
        {
            var r            = new BinaryReader(UltimaFileManager.GetFile("hues.mul"));
            var currentHue   = 0;
            var currentIndex = 0;
            var data         = new uint[_hueTextureWidth * _hueTextureHeight * 2];

            Metrics.ReportDataRead((int)r.BaseStream.Length);
            currentIndex += 32;
            while (r.BaseStream.Position < r.BaseStream.Length)
            {
                r.ReadInt32(); //Header
                for (var entry = 0; entry < 8; entry++)
                {
                    for (var i = 0; i < 32; i++)
                    {
                        const float multiplier = 0xff / 0x1f;
                        var         color      = r.ReadUInt16();
                        if (i == 31)
                        {
                            _hues[currentHue] = (ushort)color;
                        }
                        data[currentIndex++] = 0xFF000000 + (
                            ((uint)(((color >> 10) & 0x1F) * multiplier)) |
                            ((uint)(((color >> 5) & 0x1F) * multiplier) << 8) |
                            ((uint)((color & 0x1F) * multiplier) << 16)
                            );
                    }
                    r.ReadInt16();   //table start
                    r.ReadInt16();   //table end
                    r.ReadBytes(20); //name
                    currentHue++;
                }
            }
            r.Close();
            var webSafeHuesBegin = _hueTextureHeight * 2 - 216;

            for (var b = 0; b < 6; b++)
            {
                for (var g = 0; g < 6; g++)
                {
                    for (var r_ = 0; r_ < 6; r_++)
                    {
                        data[(webSafeHuesBegin + r_ + g * 6 + b * 36) * 32 + 31] = (uint)(
                            0xff000000 +
                            b * 0x00330000 +
                            g * 0x00003300 +
                            r_ * 0x00000033);
                    }
                }
            }
            return(data);
        }
示例#3
0
 unsafe int LoadLandPatches(TileMatrixData tileMatrix, string landPath, string indexPath)
 {
     _landPatchPtrs = new Dictionary <uint, LandPatchData>();
     if (ClientVersion.InstallationIsUopFormat)
     {
         return(0);
     }
     _landPatchStream = UltimaFileManager.GetFile(landPath);
     if (_landPatchStream == null)
     {
         return(0);
     }
     using (var fsIndex = UltimaFileManager.GetFile(indexPath))
     {
         var indexReader = new BinaryReader(fsIndex);
         var count       = (int)(indexReader.BaseStream.Length / 4);
         var ptr         = 0U;
         for (var i = 0U; i < count; ++i)
         {
             var blockId = indexReader.ReadUInt32();
             var x       = blockId / tileMatrix.ChunkHeight;
             var y       = blockId % tileMatrix.ChunkHeight;
             var key     = MakeChunkKey(x, y);
             ptr += 4;
             if (_landPatchPtrs.ContainsKey(key))
             {
                 var current = _landPatchPtrs[key];
                 while (current.Next != null)
                 {
                     current = current.Next;
                 }
                 current.Next = new LandPatchData(i, ptr);
             }
             else
             {
                 _landPatchPtrs.Add(key, new LandPatchData(i, ptr));
             }
             ptr += 192;
         }
         indexReader.Close();
         return(count);
     }
 }
示例#4
0
 unsafe int LoadStaticPatches(TileMatrixData tileMatrix, string dataPath, string indexPath, string lookupPath)
 {
     _staticPatchPtrs   = new Dictionary <uint, StaticPatchData>();
     _staticPatchStream = UltimaFileManager.GetFile(dataPath);
     if (_staticPatchStream == null)
     {
         return(0);
     }
     using (var fsIndex = UltimaFileManager.GetFile(indexPath))
         using (var fsLookup = UltimaFileManager.GetFile(lookupPath))
         {
             var indexReader  = new BinaryReader(fsIndex);
             var lookupReader = new BinaryReader(fsLookup);
             var count        = (int)(indexReader.BaseStream.Length / 4);
             for (var i = 0U; i < count; ++i)
             {
                 var blockID = indexReader.ReadUInt32();
                 var blockX  = blockID / tileMatrix.ChunkHeight;
                 var blockY  = blockID % tileMatrix.ChunkHeight;
                 var key     = MakeChunkKey(blockX, blockY);
                 var offset  = lookupReader.ReadUInt32();
                 var length  = lookupReader.ReadInt32();
                 lookupReader.ReadInt32();
                 if (_staticPatchPtrs.ContainsKey(key))
                 {
                     var current = _staticPatchPtrs[key];
                     while (current.Next != null)
                     {
                         current = current.Next;
                     }
                     current.Next = new StaticPatchData(i, offset, length);
                 }
                 else
                 {
                     _staticPatchPtrs.Add(key, new StaticPatchData(i, offset, length));
                 }
             }
             indexReader.Close();
             lookupReader.Close();
             return(count);
         }
 }
示例#5
0
        // Issue 5 - End

        static TileData()
        {
            using (var s = UltimaFileManager.GetFile("tiledata.mul"))
            {
                var      r = new BinaryReader(s);
                LandData landData; ItemData itemData;
                if (s.Length == 3188736) // 7.0.9.0
                {
                    LandData = new LandData[0x4000];
                    for (var i = 0; i < 0x4000; ++i)
                    {
                        landData = new LandData();
                        if (i == 1 || (i > 0 && (i & 0x1F) == 0))
                        {
                            r.ReadInt32();
                        }
                        var flags     = (TileFlag)r.ReadInt64();
                        var textureID = r.ReadInt16();
                        landData.Name = Encoding.ASCII.GetString(r.ReadBytes(20));
                        landData.Name = landData.Name.Trim('\0');
                        //r.BaseStream.Seek(20, SeekOrigin.Current);
                        landData.Flags     = flags;
                        landData.TextureID = textureID;
                        LandData[i]        = landData;
                    }
                    ItemData = new ItemData[0x10000];
                    for (var i = 0; i < 0x10000; ++i)
                    {
                        itemData = new ItemData {
                            ItemId = i
                        };
                        if ((i & 0x1F) == 0)
                        {
                            r.ReadInt32();
                        }
                        itemData.Flags    = (TileFlag)r.ReadInt64();
                        itemData.Weight   = r.ReadByte();
                        itemData.Quality  = r.ReadByte();
                        itemData.Unknown1 = r.ReadByte();
                        itemData.Unknown2 = r.ReadByte();
                        itemData.Unknown3 = r.ReadByte();
                        itemData.Quantity = r.ReadByte();
                        itemData.AnimId   = r.ReadInt16();
                        r.BaseStream.Seek(2, SeekOrigin.Current); // hue?
                        itemData.Unknown4 = r.ReadByte();
                        itemData.Value    = r.ReadByte();
                        itemData.Height   = r.ReadByte();
                        itemData.Name     = Encoding.ASCII.GetString(r.ReadBytes(20));
                        itemData.Name     = itemData.Name.Trim('\0');
                        // r.BaseStream.Seek(20, SeekOrigin.Current);
                        if (i > 1005 && i < 7640)
                        {
                            itemData.IsStairs = !(Array.BinarySearch(_stairsID, i) < 0);
                        }
                        // Issue 5 - End
                        ItemData[i] = itemData;
                    }
                }
                else
                {
                    LandData = new LandData[0x4000];
                    for (var i = 0; i < 0x4000; ++i)
                    {
                        landData = new LandData();
                        if ((i & 0x1F) == 0)
                        {
                            r.ReadInt32();
                        }
                        var flags     = (TileFlag)r.ReadInt32();
                        var textureID = r.ReadInt16();
                        landData.Name = Encoding.ASCII.GetString(r.ReadBytes(20));
                        landData.Name = landData.Name.Trim('\0');
                        //r.BaseStream.Seek(20, SeekOrigin.Current);
                        landData.Flags     = flags;
                        landData.TextureID = textureID;
                        LandData[i]        = landData;
                    }
                    if (s.Length == 1644544) // 7.0.0.0
                    {
                        ItemData = new ItemData[0x8000];
                        for (var i = 0; i < 0x8000; ++i)
                        {
                            itemData = new ItemData {
                                ItemId = i
                            };
                            if ((i & 0x1F) == 0)
                            {
                                r.ReadInt32();
                            }
                            itemData.Flags    = (TileFlag)r.ReadInt32();
                            itemData.Weight   = r.ReadByte();
                            itemData.Quality  = r.ReadByte();
                            itemData.Unknown1 = r.ReadByte();
                            itemData.Unknown2 = r.ReadByte();
                            itemData.Unknown3 = r.ReadByte();
                            itemData.Quantity = r.ReadByte();
                            itemData.AnimId   = r.ReadInt16();
                            r.BaseStream.Seek(2, SeekOrigin.Current); // hue?
                            itemData.Unknown4 = r.ReadByte();
                            itemData.Value    = r.ReadByte();
                            itemData.Height   = r.ReadByte();
                            itemData.Name     = Encoding.ASCII.GetString(r.ReadBytes(20));
                            itemData.Name     = itemData.Name.Trim('\0');
                            // r.BaseStream.Seek(20, SeekOrigin.Current);
                            if (i > 1005 && i < 7640)
                            {
                                itemData.IsStairs = !(Array.BinarySearch(_stairsID, i) < 0);
                            }
                            // Issue 5 - End
                            ItemData[i] = itemData;
                        }
                    }
                    else
                    {
                        ItemData = new ItemData[0x4000];
                        for (var i = 0; i < 0x4000; ++i)
                        {
                            itemData = new ItemData {
                                ItemId = i
                            };
                            if ((i & 0x1F) == 0)
                            {
                                r.ReadInt32();
                            }
                            itemData.Flags    = (TileFlag)r.ReadInt32();
                            itemData.Weight   = r.ReadByte();
                            itemData.Quality  = r.ReadByte();
                            itemData.Unknown1 = r.ReadByte();
                            itemData.Unknown2 = r.ReadByte();
                            itemData.Unknown3 = r.ReadByte();
                            itemData.Quantity = r.ReadByte();
                            itemData.AnimId   = r.ReadInt16();
                            r.BaseStream.Seek(2, SeekOrigin.Current); // hue?
                            itemData.Unknown4 = r.ReadByte();
                            itemData.Value    = r.ReadByte();
                            itemData.Height   = r.ReadByte();
                            itemData.Name     = Encoding.ASCII.GetString(r.ReadBytes(20));
                            itemData.Name     = itemData.Name.Trim('\0');
                            // r.BaseStream.Seek(20, SeekOrigin.Current);
                            if (i > 1005 && i < 7640)
                            {
                                itemData.IsStairs = !(Array.BinarySearch(_stairsID, i) < 0);
                            }
                            // Issue 5 - End
                            ItemData[i] = itemData;
                        }
                    }
                }
                Metrics.ReportDataRead((int)r.BaseStream.Position);
            }
        }