Ejemplo n.º 1
0
 public void ReadOffsets()
 {
     try
     {
         string path = Path.GetDirectoryName(Application.ExecutablePath) + "\\exec\\offsets.txt";
         if (!File.Exists(path))
         {
             Println("No offsets.txt found!");
             return;
         }
         string   s       = System.IO.File.ReadAllText(path);
         string[] entries = s.Split(';');
         Offsets = new List <OffsetEntry>();
         foreach (string e in entries)
         {
             string[] parms = e.Split(',');
             if (parms.Length == 2)
             {
                 parms[0] = parms[0].Trim();
                 parms[1] = parms[1].Trim();
                 Println("Found MD5 : " + parms[0] + " @ 0x" + parms[1]);
                 OffsetEntry oe = new OffsetEntry();
                 oe.md5    = parms[0];
                 oe.offset = (uint)Int32.Parse(parms[1], System.Globalization.NumberStyles.HexNumber);
                 Offsets.Add(oe);
             }
         }
     }
     catch (Exception ex)
     {
         Println(ex.Message);
     }
 }
Ejemplo n.º 2
0
        public Ttf_MaximumProfileTable(BinaryReader file, OffsetEntry table)
        {
            file.Seek(table.Offset);
            TableBase = table.Offset;

            Version               = file.GetUint32();
            NumGlyphs             = file.GetUint16();
            MaxPoints             = file.GetUint16();
            MaxContours           = file.GetUint16();
            MaxCompositePoints    = file.GetUint16();
            MaxCompositeContours  = file.GetUint16();
            MaxZones              = file.GetUint16();
            MaxTwilightPoints     = file.GetUint16();
            MaxStorage            = file.GetUint16();
            MaxFunctionDefs       = file.GetUint16();
            MaxInstructionDefs    = file.GetUint16();
            MaxStackElements      = file.GetUint16();
            MaxSizeOfInstructions = file.GetUint16();
            MaxComponentElements  = file.GetUint16();
            MaxComponentDepth     = file.GetUint16();
        }
Ejemplo n.º 3
0
        public Ttf_HorizontalHeaderTable(BinaryReader file, OffsetEntry table)
        {
            file.Seek(table.Offset);
            TableBase = table.Offset;

            // See https://docs.microsoft.com/en-us/typography/opentype/spec/hhea
            Version             = file.GetUint32();
            Ascender            = file.GetFWord();
            Descender           = file.GetFWord();
            LineGap             = file.GetFWord();
            AdvanceWidthMax     = file.GetUint16();
            MinLeftSideBearing  = file.GetFWord();
            MinRightSideBearing = file.GetFWord();
            XMaxExtent          = file.GetFWord();
            CaretSlopeRise      = file.GetInt16();
            CaretSlopeRun       = file.GetInt16();
            Reserved1           = file.GetInt16();
            Reserved2           = file.GetInt16();
            Reserved3           = file.GetInt16();
            Reserved4           = file.GetInt16();
            Reserved5           = file.GetInt16();
            MetricDataFormat    = file.GetInt16();
            NumberOfHMetrics    = file.GetUint16();
        }
Ejemplo n.º 4
0
        public new Dictionary <int, byte[]> ReadOffsetData(BinaryReader dbReader, long pos)
        {
            var CopyTable = new Dictionary <int, byte[]>();
            var offsetmap = new List <OffsetEntry>();

            long indexTablePos = dbReader.BaseStream.Length - (HasIndexTable ? RecordCount * 4 : 0);
            long wch7TablePos  = indexTablePos - UnknownWCH7 * 4;

            int[] m_indexes = null;


            //Offset table - Contains the index, offset and length meaning the index table is not used
            if (HasOffsetTable)
            {
                // Records table
                if (StringBlockSize > 0)
                {
                    dbReader.Scrub(StringBlockSize);
                }

                for (var i = 0; i < RecordCount; i++)
                {
                    int   id     = dbReader.ReadInt32();
                    int   offset = dbReader.ReadInt32();
                    short length = dbReader.ReadInt16();

                    if (offset == 0 || length == 0)
                    {
                        continue;
                    }

                    offsetmap.Add(new OffsetEntry(id, offset, length));
                }
            }

            //New WCH7 table
            if (UnknownWCH7 > 0)
            {
                WCH7Table = new int[UnknownWCH7];
                dbReader.Scrub(wch7TablePos);

                for (var i = 0; i < UnknownWCH7; i++)
                {
                    WCH7Table[i] = dbReader.ReadInt32();
                }
            }

            //Index table
            if (HasIndexTable)
            {
                if (!HasOffsetTable || HasRelationshipData)
                {
                    dbReader.Scrub(indexTablePos);
                }

                m_indexes = new int[RecordCount];
                for (var i = 0; i < RecordCount; i++)
                {
                    m_indexes[i] = dbReader.ReadInt32();
                }
            }

            //Extract record data
            for (var i = 0; i < Math.Max(RecordCount, offsetmap.Count); i++)
            {
                if (HasOffsetTable)
                {
                    OffsetEntry map = offsetmap[i];
                    dbReader.Scrub(map.Offset);

                    var recordbytes = BitConverter.GetBytes(map.Id).Concat(dbReader.ReadBytes(map.Length));
                    CopyTable.Add(map.Id, recordbytes.ToArray());
                }
                else
                {
                    dbReader.Scrub(pos + i * RecordSize);
                    byte[] recordbytes = dbReader.ReadBytes((int)RecordSize);

                    if (HasIndexTable)
                    {
                        var newrecordbytes = BitConverter.GetBytes(m_indexes[i]).Concat(recordbytes);
                        CopyTable.Add(m_indexes[i], newrecordbytes.ToArray());
                    }
                    else
                    {
                        int bytecount = FieldStructure[IdIndex].ByteCount;
                        int offset    = FieldStructure[IdIndex].Offset;

                        var id = 0;
                        for (var j = 0; j < bytecount; j++)
                        {
                            id |= recordbytes[offset + j] << (j * 8);
                        }

                        CopyTable.Add(id, recordbytes);
                    }
                }
            }

            return(CopyTable);
        }
Ejemplo n.º 5
0
 public void ReadOffsets()
 {
     try
     {
         string path = Path.GetDirectoryName(Application.ExecutablePath) + "\\exec\\offsets.txt";
         if (!File.Exists(path))
         {
             Println("No offsets.txt found!");
             return;
         }
         string s = System.IO.File.ReadAllText(path);
         string[] entries = s.Split(';');
         Offsets = new List<OffsetEntry>();
         foreach (string e in entries)
         {
             string[] parms = e.Split(',');
             if (parms.Length == 2)
             {
                 parms[0] = parms[0].Trim();
                 parms[1] = parms[1].Trim();
                 Println("Found MD5 : " + parms[0] + " @ 0x" + parms[1]);
                 OffsetEntry oe = new OffsetEntry();
                 oe.md5 = parms[0];
                 oe.offset = (uint)Int32.Parse(parms[1], System.Globalization.NumberStyles.HexNumber);
                 Offsets.Add(oe);
             }
         }
     }
     catch (Exception ex)
     {
         Println(ex.Message);
     }
 }
Ejemplo n.º 6
0
        private void ParseHeader(IFile f)
        {
            headerStream.Position = 0;
            var numDataFiles = 0;
            var header       = Header.Read(headerStream);
            var fileEntries  = new FileEntry[header.num_files];

            for (var i = 0; i < fileEntries.Length; i++)
            {
                fileEntries[i] = FileEntry.Read(headerStream);
            }

            var dirEntries = new DirEntry[header.num_dirs];

            for (var i = 0; i < dirEntries.Length; i++)
            {
                dirEntries[i] = DirEntry.Read(headerStream);
            }

            var stringTable    = new List <string>(); // # of strings doesn't always match file count
            var stringTableEnd = header.string_table_offset + header.string_table_size;

            while (headerStream.Position < stringTableEnd)
            {
                stringTable.Add(headerStream.ReadASCIINullTerminated());
            }

            var fileOffsets = new OffsetEntry[header.num_offsets];

            for (var i = 0; i < fileOffsets.Length; i++)
            {
                fileOffsets[i] = OffsetEntry.Read(headerStream);
                if (fileOffsets[i].pk_num > numDataFiles)
                {
                    numDataFiles = fileOffsets[i].pk_num;
                }
            }

            var dirs_flat = new Common.DefaultDirectory[header.num_dirs];

            dirs_flat[0] = root;
            for (var i = 1; i < dirs_flat.Length; i++)
            {
                var parent = dirs_flat[dirEntries[i].parent];
                parent.AddDir(dirs_flat[i] = new Common.DefaultDirectory(parent, stringTable[(int)dirEntries[i].string_num]));
            }

            contentFiles = new Stream[numDataFiles + 1];
            var baseName = f.Name.Replace(".hdr.e.2", "");

            for (var i = 0; i <= numDataFiles; i++)
            {
                contentFiles[i] = f.Parent.GetFile($"{baseName}.pk{i}").GetStream();
            }

            for (var i = 0; i < fileEntries.Length; i++)
            {
                var  entry     = fileEntries[i];
                var  name      = entry.string_num < stringTable.Count ? stringTable[(int)entry.string_num] : "ERROR_FILENAME";
                bool encrypted = false;
                if (name.EndsWith(".e.2"))
                {
                    encrypted = true;
                    name      = name.Remove(name.Length - 4);
                }
                dirs_flat[entry.dir_num].AddFile(new Common.OffsetFile(
                                                     name,
                                                     dirs_flat[entry.dir_num],
                                                     contentFiles[fileOffsets[entry.offset_num].pk_num],
                                                     fileOffsets[entry.offset_num].pk_offset,
                                                     entry.size,
                                                     wrapStream: encrypted ? (s => new PowerChordCryptStream(s)) : (Func <Stream, Stream>)null));
            }
        }
Ejemplo n.º 7
0
        private void ParseHeader(IFile f)
        {
            headerStream.Position = 0;
            var numDataFiles = 0;
            var header       = Header.Read(headerStream);
            var fileEntries  = new FileEntry[header.num_files];

            for (var i = 0; i < fileEntries.Length; i++)
            {
                fileEntries[i] = FileEntry.Read(headerStream);
            }

            var dirEntries = new DirEntry[header.num_dirs];

            for (var i = 0; i < dirEntries.Length; i++)
            {
                dirEntries[i] = DirEntry.Read(headerStream);
            }

            var stringTable    = new string[header.num_files];
            var stringTableEnd = header.string_table_offset + header.string_table_size;
            var x = 0;

            while (headerStream.Position < stringTableEnd)
            {
                stringTable[x++] = headerStream.ReadASCIINullTerminated();
            }

            var fileOffsets = new OffsetEntry[header.num_offsets];

            for (var i = 0; i < fileOffsets.Length; i++)
            {
                fileOffsets[i] = OffsetEntry.Read(headerStream);
                if (fileOffsets[i].pk_num > numDataFiles)
                {
                    numDataFiles = fileOffsets[i].pk_num;
                }
            }

            var dirs_flat = new Common.DefaultDirectory[header.num_dirs];

            dirs_flat[0] = root;
            for (var i = 1; i < dirs_flat.Length; i++)
            {
                var parent = dirs_flat[dirEntries[i].parent];
                parent.AddDir(dirs_flat[i] = new Common.DefaultDirectory(parent, stringTable[dirEntries[i].string_num]));
            }

            contentFiles = new Stream[numDataFiles + 1];
            var baseName = f.Name.Replace(".hdr.e.2", "");

            for (var i = 0; i <= numDataFiles; i++)
            {
                contentFiles[i] = f.Parent.GetFile($"{baseName}.pk{i}").GetStream();
            }

            for (var i = 0; i < fileEntries.Length; i++)
            {
                var entry = fileEntries[i];
                var name  = entry.string_num < stringTable.Length ? stringTable[entry.string_num] : "ERROR_FILENAME";
                dirs_flat[entry.dir_num].AddFile(new Common.OffsetFile(
                                                     name,
                                                     dirs_flat[entry.dir_num],
                                                     contentFiles[fileOffsets[entry.offset_num].pk_num],
                                                     fileOffsets[entry.offset_num].pk_offset,
                                                     entry.size));
            }
        }
Ejemplo n.º 8
0
            protected override void OnTarget(Mobile from, object targeted)
            {
                if (m_Potion.Deleted || m_Potion.Map == Map.Internal)
                {
                    return;
                }

                IPoint3D p = targeted as IPoint3D;

                if (p == null)
                {
                    return;
                }

                Map map = from.Map;

                if (map == null)
                {
                    return;
                }

                SpellHelper.GetSurfaceTop(ref p);

                from.RevealingAction();

                IEntity to;

                if (p is Mobile)
                {
                    to = (Mobile)p;
                }
                else
                {
                    to = new DummyEntity(Serial.Zero, new Point3D(p), map);
                }

                Effects.SendMovingEffect(from, to, m_Potion.ItemID, 7, 0, false, false, m_Potion.Hue, 0);

                Effects.SendLocationParticles(EffectItem.Create(new Point3D(p.X, p.Y, p.Z), from.Map, EffectItem.DefaultDuration), 0x376A, 9, 4, 0, 0, 0x13AE, 0);

                int length = 0;

                switch (m_Potion.AreaSize)
                {
                case 1: length = 3; break;

                case 2: length = 15; break;

                case 3: length = 31; break;

                case 4: length = 55; break;

                case 5: length = 83; break;

                case 6: length = 123; break;

                case 7: length = 163; break;
                }

                for (int i = 0; i <= length; ++i)
                {
                    OffsetEntry oe = Offsets[i] as OffsetEntry;

                    Effects.SendLocationParticles(EffectItem.Create(new Point3D(p.X + oe.X, p.Y + oe.Y, p.Z), from.Map, EffectItem.DefaultDuration), 0x376A, 9, 4, 0, 0, 0x13AE, 0);
                }

                var eable = from.Map.GetMobilesInRange(new Point3D(p.X, p.Y, p.Z), m_Potion.AreaSize);

                foreach (object obj in eable)
                {
                    if (obj is BaseCreature)
                    {
                        BaseCreature m = obj as BaseCreature;

                        if (m != null && !m.Controlled)
                        {
                            m.Frozen = true;

                            InternalTimer timer = new InternalTimer(new Point3D(p.X, p.Y, p.Z), m_Potion.AreaSize, from);

                            timer.Start();
                        }
                    }
                }


                m_Potion.SetNextDrinkTime(from);

                m_Potion.Consume();
            }