public unsafe AnimationFrame(GraphicsDevice graphics, uint[] palette, BinaryFileReader reader) { int xCenter = reader.ReadShort(); int yCenter = reader.ReadShort(); int width = reader.ReadUShort(); int height = reader.ReadUShort(); // Fix for animations with no UltimaData. if ((width == 0) || (height == 0)) { m_Texture = null; return; } uint[] data = new uint[width * height]; int header; int xBase = xCenter - 0x200; int yBase = (yCenter + height) - 0x200; fixed (uint* pData = data) { uint* dataRef = pData; int delta = width; int dataRead = 0; dataRef += xBase; dataRef += (yBase * delta); while ((header = reader.ReadInt()) != 0x7FFF7FFF) { header ^= DoubleXor; uint* cur = dataRef + ((((header >> 12) & 0x3FF) * delta) + ((header >> 22) & 0x3FF)); uint* end = cur + (header & 0xFFF); int filecounter = 0; byte[] filedata = reader.ReadBytes(header & 0xFFF); while (cur < end) *cur++ = palette[filedata[filecounter++]]; dataRead += header & 0xFFF; } Diagnostics.Metrics.ReportDataRead(dataRead); } m_Center = new Microsoft.Xna.Framework.Point(xCenter, yCenter); m_Texture = new Texture2D(graphics, width, height); m_Texture.SetData<uint>(data); }
private static unsafe Skill LoadSkill(int index, BinaryFileReader reader) { int nameLength = m_FileIndex.Index[index].length - 2; int extra = m_FileIndex.Index[index].extra; byte[] set1 = new byte[1]; byte[] set2 = new byte[nameLength]; byte[] set3 = new byte[1]; set1 = reader.ReadBytes(1); set2 = reader.ReadBytes(nameLength); set3 = reader.ReadBytes(1); bool useBtn = SkillsData.ToBool(set1); string name = SkillsData.ToString(set2); return new Skill(new SkillVars(index, name, useBtn, extra, set3[0])); }