コード例 #1
0
 /// <summary>
 /// Creates an empty FMG configured for the specified version.
 /// </summary>
 public FMG(FMGVersion version)
 {
     Entries   = new List <Entry>();
     Version   = version;
     BigEndian = Version == FMGVersion.DemonsSouls;
 }
コード例 #2
0
        internal override void Read(BinaryReaderEx br)
        {
            br.AssertByte(0);
            BigEndian = br.ReadBoolean();
            Version   = br.ReadEnum8 <FMGVersion>();
            br.AssertByte(0);

            br.BigEndian = BigEndian;
            bool wide = Version == FMGVersion.DarkSouls3;

            int fileSize = br.ReadInt32();

            br.AssertByte(1);
            br.AssertByte((byte)(Version == FMGVersion.DemonsSouls ? 0xFF : 0x00));
            br.AssertByte(0);
            br.AssertByte(0);
            int groupCount  = br.ReadInt32();
            int stringCount = br.ReadInt32();

            if (wide)
            {
                br.AssertInt32(0xFF);
            }

            long stringOffsetsOffset;

            if (wide)
            {
                stringOffsetsOffset = br.ReadInt64();
            }
            else
            {
                stringOffsetsOffset = br.ReadInt32();
            }

            if (wide)
            {
                br.AssertInt64(0);
            }
            else
            {
                br.AssertInt32(0);
            }

            Entries = new List <Entry>(groupCount);
            for (int i = 0; i < groupCount; i++)
            {
                int offsetIndex = br.ReadInt32();
                int firstID     = br.ReadInt32();
                int lastID      = br.ReadInt32();

                if (wide)
                {
                    br.AssertInt32(0);
                }

                br.StepIn(stringOffsetsOffset + offsetIndex * (wide ? 8 : 4));
                {
                    for (int j = 0; j < lastID - firstID + 1; j++)
                    {
                        long stringOffset;
                        if (wide)
                        {
                            stringOffset = br.ReadInt64();
                        }
                        else
                        {
                            stringOffset = br.ReadInt32();
                        }

                        int    id   = firstID + j;
                        string text = stringOffset != 0 ? br.GetUTF16(stringOffset) : null;
                        Entries.Add(new Entry(id, text));
                    }
                }
                br.StepOut();
            }
        }
コード例 #3
0
 /// <summary>
 /// Creates an empty FMG configured for DS1/DS2.
 /// </summary>
 public FMG()
 {
     Entries   = new List <Entry>();
     Version   = FMGVersion.DarkSouls1;
     BigEndian = false;
 }