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); } } }
public override byte[] GetBytes() { return(ByteConverter.GetBytes(Header)); }