Advertisement
SciresM

ExtractFireEmblemMessageArchive()

Jun 24th, 2015
805
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 1.79 KB | None | 0 0
  1. private void ExtractFireEmblemMessageArchive(string outname, byte[] archive)
  2.         {
  3.             var ShiftJIS = Encoding.GetEncoding(932);
  4.             string ArchiveName = ShiftJIS.GetString(archive.Skip(0x20).TakeWhile(b => b != 0).ToArray()); // Archive Name.
  5.             uint TextPartitionLen = BitConverter.ToUInt32(archive, 4);
  6.             uint StringCount = BitConverter.ToUInt32(archive, 0xC);
  7.             string[] MessageNames = new string[StringCount];
  8.             string[] Messages = new string[StringCount];
  9.  
  10.             uint StringMetaOffset = 0x20 + TextPartitionLen;
  11.             uint NamesOffset = StringMetaOffset + 0x8 * StringCount;
  12.  
  13.             for (int i = 0; i < StringCount; i++)
  14.             {
  15.                 int MessageOffset = 0x20+BitConverter.ToInt32(archive, (int)StringMetaOffset + 0x8 * i);
  16.                 int MessageLen = 0;
  17.                 while (BitConverter.ToUInt16(archive, MessageOffset + MessageLen) != 0)
  18.                     MessageLen += 2;
  19.                 Messages[i] = Encoding.Unicode.GetString(archive.Skip(MessageOffset).Take(MessageLen).ToArray()).Replace("\n","\\n").Replace("\r","\\r");
  20.                 int NameOffset = (int)NamesOffset + BitConverter.ToInt32(archive, (int)StringMetaOffset + (0x8 * i) + 4);
  21.                 MessageNames[i] = ShiftJIS.GetString(archive.Skip(NameOffset).TakeWhile(b => b != 0).ToArray());
  22.             }
  23.  
  24.             List<string> Lines = new List<string>();
  25.             Lines.Add(ArchiveName);
  26.             Lines.Add(Environment.NewLine);
  27.             Lines.Add("Message Name: Message");
  28.             Lines.Add(Environment.NewLine);
  29.             for (int i = 0; i < StringCount; i++)
  30.                 Lines.Add(string.Format("{0}: {1}", MessageNames[i], Messages[i]));
  31.             File.WriteAllLines(outname, Lines);
  32.         }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement