SciresM

MakeFireEmblemMessageArchive()

Jun 24th, 2015
1,035
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.25 KB | None | 0 0
  1. private byte[] MakeFireEmblemMessageArchive(string[] lines) // Assumes Format is ExtractFireEmblemMessageArchive() generated.
  2.         {
  3.             var ShiftJIS = Encoding.GetEncoding(932);
  4.             int StringCount = lines.Length - 6;
  5.             string[] Messages = new string[StringCount];
  6.             string[] Names = new string[StringCount];
  7.             uint[] MPos = new uint[StringCount];
  8.             uint[] NPos = new uint[StringCount];
  9.             for (int i = 6; i < lines.Length; i++)
  10.             {
  11.                 int ind = lines[i].IndexOf(": ");
  12.                 Names[i - 6] = lines[i].Substring(0, ind);
  13.                 Messages[i - 6] = lines[i].Substring(ind + 2, lines[i].Length - (ind + 2)).Replace("\\n", "\n").Replace("\\r", "\r");
  14.             }
  15.             byte[] Header = new byte[0x20];
  16.             byte[] StringTable;
  17.             byte[] MetaTable = new byte[StringCount * 8];
  18.             byte[] NamesTable;
  19.             using (MemoryStream st = new MemoryStream())
  20.             {
  21.                 using (BinaryWriter bw = new BinaryWriter(st))
  22.                 {
  23.                     bw.Write(ShiftJIS.GetBytes(lines[0]));
  24.                     bw.Write((byte)0);
  25.                     while (bw.BaseStream.Position % 4 != 0)
  26.                         bw.Write((byte)0);
  27.                     for (int i = 0; i < StringCount; i++)
  28.                     {
  29.                         MPos[i] = (uint)bw.BaseStream.Position;
  30.                         bw.Write(Encoding.Unicode.GetBytes(Messages[i]));
  31.                         bw.Write((ushort)0);
  32.                         while (bw.BaseStream.Position % 4 != 0)
  33.                             bw.Write((byte)0);
  34.                     }
  35.                 }
  36.                 StringTable = st.ToArray();
  37.             }
  38.             using (MemoryStream nt = new MemoryStream())
  39.             {
  40.                 using (BinaryWriter bw = new BinaryWriter(nt))
  41.                 {
  42.                     for (int i = 0; i < StringCount; i++)
  43.                     {
  44.                         NPos[i] = (uint)bw.BaseStream.Position;
  45.                         bw.Write(ShiftJIS.GetBytes(Names[i]));
  46.                         bw.Write((byte)0);
  47.                     }
  48.                 }
  49.                 NamesTable = nt.ToArray();
  50.             }
  51.             for (int i = 0; i < StringCount; i++)
  52.             {
  53.                 Array.Copy(BitConverter.GetBytes(MPos[i]), 0, MetaTable, (i * 8), 4);
  54.                 Array.Copy(BitConverter.GetBytes(NPos[i]), 0, MetaTable, (i * 8) + 4, 4);
  55.             }
  56.             Array.Copy(BitConverter.GetBytes(Archive.Length), Header, 4);
  57.             Array.Copy(BitConverter.GetBytes(StringTable.Length), 0, Header, 4, 4);
  58.             Array.Copy(BitConverter.GetBytes(StringCount), 0, Header, 0xC, 4);
  59.  
  60.             byte[] Archive = new byte[Header.Length + StringTable.Length + MetaTable.Length + NamesTable.Length];
  61.             Array.Copy(Header, Archive, Header.Length);
  62.             Array.Copy(StringTable, 0, Archive, Header.Length, StringTable.Length);
  63.             Array.Copy(MetaTable, 0, Archive, Header.Length + StringTable.Length, MetaTable.Length);
  64.             Array.Copy(NamesTable, 0, Archive, Header.Length + StringTable.Length + MetaTable.Length, NamesTable.Length);
  65.  
  66.             return Archive;
  67.         }
Advertisement
Add Comment
Please, Sign In to add comment