Exemplo n.º 1
0
 static void Main(string[] args)
 {
     if (args.Length == 0)
     {
         Console.Write("Filename: ");
         args = new string[] { Console.ReadLine().Trim('"') };
     }
     foreach (string filename in args)
     {
         byte[] fc;
         if (Path.GetExtension(filename).Equals(".prs", StringComparison.OrdinalIgnoreCase))
         {
             fc = Prs.Decompress(filename);
         }
         else
         {
             fc = File.ReadAllBytes(filename);
         }
         string       path = Path.Combine(Path.GetDirectoryName(Path.GetFullPath(filename)), Path.GetFileNameWithoutExtension(filename));
         EventIniData ini  = IniSerializer.Deserialize <EventIniData>(Path.Combine(path, Path.ChangeExtension(Path.GetFileName(filename), ".ini")));
         uint         key;
         if (fc[0] == 0x81)
         {
             ByteConverter.BigEndian = true;
             key = 0x8125FE60;
         }
         else
         {
             ByteConverter.BigEndian = false;
             key = 0xC600000;
         }
         List <byte> modelbytes           = new List <byte>(fc);
         Dictionary <string, uint> labels = new Dictionary <string, uint>();
         foreach (string file in ini.Files.Where(a => HelperFunctions.FileHash(Path.Combine(path, a.Key)) != a.Value).Select(a => a.Key))
         {
             modelbytes.AddRange(new ModelFile(Path.Combine(path, file)).Model.GetBytes((uint)(key + modelbytes.Count), false, labels, out uint address));
         }
         fc = modelbytes.ToArray();
         int ptr = fc.GetPointer(0x20, key);
         if (ptr != 0)
         {
             for (int i = 0; i < (ini.Game == Game.SA2B ? 18 : 16); i++)
             {
                 UpgradeInfo info = ini.Upgrades[i];
                 if (info.RootNode != null)
                 {
                     if (labels.ContainsKey(info.RootNode))
                     {
                         ByteConverter.GetBytes(labels[info.RootNode]).CopyTo(fc, ptr);
                     }
                     if (labels.ContainsKey(info.AttachNode1))
                     {
                         ByteConverter.GetBytes(labels[info.AttachNode1]).CopyTo(fc, ptr + 4);
                     }
                     if (labels.ContainsKey(info.Model1))
                     {
                         ByteConverter.GetBytes(labels[info.Model1]).CopyTo(fc, ptr + 8);
                     }
                     if (info.AttachNode2 != null && labels.ContainsKey(info.AttachNode2))
                     {
                         ByteConverter.GetBytes(labels[info.AttachNode2]).CopyTo(fc, ptr + 12);
                     }
                     if (info.Model2 != null && labels.ContainsKey(info.Model2))
                     {
                         ByteConverter.GetBytes(labels[info.Model2]).CopyTo(fc, ptr + 16);
                     }
                 }
                 ptr += 0x14;
             }
         }
         int gcnt = ByteConverter.ToInt32(fc, 8);
         ptr = fc.GetPointer(0, key);
         if (ptr != 0)
         {
             for (int gn = 0; gn <= gcnt; gn++)
             {
                 GroupInfo info = ini.Groups[gn];
                 int       ptr2 = fc.GetPointer(ptr, key);
                 int       ecnt = Math.Min(ByteConverter.ToInt32(fc, ptr + 4), info.Entities?.Count ?? 0);
                 if (ptr2 != 0)
                 {
                     for (int en = 0; en < ecnt; en++)
                     {
                         if (labels.ContainsKey(info.Entities[en]))
                         {
                             ByteConverter.GetBytes(labels[info.Entities[en]]).CopyTo(fc, ptr2);
                         }
                         ptr2 += ini.Game == Game.SA2B ? 0x2C : 0x20;
                     }
                 }
                 ptr2 = fc.GetPointer(ptr + 0x18, key);
                 if (ptr2 != 0 && info.Big != null && labels.ContainsKey(info.Big))
                 {
                     ByteConverter.GetBytes(labels[info.Big]).CopyTo(fc, ptr2);
                 }
                 ptr += 0x20;
             }
         }
         ptr = fc.GetPointer(0x18, key);
         if (ptr != 0)
         {
             for (int i = 0; i < 18; i++)
             {
                 if (ini.MechParts.ContainsKey(i) && labels.ContainsKey(ini.MechParts[i]))
                 {
                     ByteConverter.GetBytes(labels[ini.MechParts[i]]).CopyTo(fc, ptr);
                 }
                 ptr += 4;
             }
         }
         ptr = fc.GetPointer(0x1C, key);
         if (ptr != 0 && ini.TailsTails != null && labels.ContainsKey(ini.TailsTails))
         {
             ByteConverter.GetBytes(labels[ini.TailsTails]).CopyTo(fc, ptr);
         }
         if (Path.GetExtension(filename).Equals(".prs", StringComparison.OrdinalIgnoreCase))
         {
             Prs.Compress(fc, filename);
         }
         else
         {
             File.WriteAllBytes(filename, fc);
         }
     }
 }
Exemplo n.º 2
0
 public override byte[] GetBytes()
 {
     return(ByteConverter.GetBytes(Header));
 }