public static void MQJsonImportAndPatch(IExperimentFace face, List <string> filePath) { Rom n0 = new ORom(filePath[0], ORom.Build.N0); Rom mq = new ORom(filePath[1], ORom.Build.MQU); List <Scene_MQJson> scenes = Load_Scene_MQJson(); foreach (var scene in scenes) { if (!MQRandoScenes.Contains(scene.Id)) { continue; } var n0_scene = SceneRoomReader.InitializeScene(n0, scene.Id); var mq_scene = SceneRoomReader.InitializeScene(mq, scene.Id); CollisionMesh n0_mesh = ((CollisionCommand)n0_scene.Header[HeaderCommands.Collision]).Mesh; CollisionMesh mq_mesh = ((CollisionCommand)mq_scene.Header[HeaderCommands.Collision]).Mesh; var delta = new Col_MQJson(n0_mesh, mq_mesh); scene.ColDelta = delta; } MemoryStream s = SerializeScenes(scenes); StreamReader sr = new StreamReader(s); face.OutputText(sr.ReadToEnd()); }
private void DumpActorTable() { List <RomVersion> versions = new List <RomVersion>(); versions.AddRange(ORom.GetSupportedBuilds()); versions.AddRange(MRom.GetSupportedBuilds()); StringBuilder sb = new StringBuilder(); foreach (var version in versions) { string outFile = $"actor_dlf_{version.ShortUniqueKey}.txt"; if (PathUtil.TryGetRomLocation(version, out string file)) { var txt = Get.ActorTable(Rom.New(file, version)); System.IO.File.WriteAllText(outFile, txt); sb.AppendLine($"Created {outFile}"); } else { sb.AppendLine($"{outFile} failed; no rom found"); } } outRichTextBox.Text = sb.ToString(); }
public static void TestYazDecompress(IExperimentFace face, List <string> filePath) { StringBuilder sb = new StringBuilder(); ORom compRom = new ORom(filePath[0], ORom.Build.N0); ORom decompRom = new ORom(@"C:\Users\mzxrules\Documents\Roms\N64\Games\Ocarina\Ocarina (U10)\Ocarina (U10) (d).z64", ORom.Build.N0); RomFile compFile = compRom.Files.GetFile(ORom.FileList.code); RomFile decompFile = decompRom.Files.GetFile(ORom.FileList.code); BinaryReader compReader = new BinaryReader(compFile); BinaryReader decompReader = new BinaryReader(decompFile); byte[] compText = compReader.ReadBytes(compFile.Record.VRom.Size); byte[] decompText = decompReader.ReadBytes(decompFile.Record.VRom.Size); for (int i = 0; i < compFile.Record.VRom.Size; i++) { byte a = decompText[i]; byte b = compText[i]; if (a == b) { continue; } sb.AppendLine($"DECOMPRESS MISMATCH {i:X6}: {a:X2} {b:X2}"); break; } sb.AppendLine("Test Complete"); face.OutputText(sb.ToString()); }
static void DisassembleRom(RomVersion ver, string path) { Rom rom; Console.Write("Initializing task list: "); if (ver.Game == Game.OcarinaOfTime) { rom = new ORom(path, ver); } else { rom = new MRom(path, ver); } List <DisassemblyTask> taskList = DisassemblyTask.CreateTaskList(rom); taskList = taskList.Where(x => x.VRom.End > 0).ToList(); Console.WriteLine("DONE!"); Console.Write($"Building symbol table: "); Stream getFile(FileAddress x) => rom.Files.GetFile(x); LoadFunctionDatabase(ver); GetSymbols(taskList, rom.Version, getFile); Console.WriteLine("DONE!"); Console.WriteLine("Disassembling files: "); DisassembleTasks(rom.Version, taskList, getFile); DumpFoundFunctions(rom.Version, Disassemble.GetFunctions()); }
public static void ChestContents(ORom rom) { //int NTSC10 = 0xBEEE94; int NTSC12 = 0xBEEF74; //int PAL11 = 0xBEF204; int val = NTSC12; Get.Table(rom, val - (129 * 6), "chestcontents", DumpChestContents); //int tableStart_N0 = 0xBEEE94; //FileRecord start; //if (rom.Version != Rom.Build.N0) // return; //start = rom.Files.GetFileStart(tableStart_N0); //if (start == null) // return; //using (StreamWriter fs = new StreamWriter(String.Format("{0}-chestcontents.txt", rom.Version))) //using (BinaryReader file = new BinaryReader(rom.Files.GetFile(start.VirtualAddress))) //{ // file.BaseStream.Position = start.GetRelativeAddress(tableStart_N0); //} }
private static void DisplayHelp() { Console.WriteLine("compress 'inputRom' 'outputRom' 'GameId' 'Version'"); Console.WriteLine("decompress 'inputRom' 'outputRom' 'GameId' 'Version'"); Console.WriteLine("swap 'inputRom' 'outputRom' 'SwapType'"); Console.WriteLine(); Console.Write("Press Enter to Continue..."); Console.ReadLine(); Console.Clear(); ORom.ConsolePrintSupportedVersions(); Console.WriteLine(); MRom.ConsolePrintSupportedVersions(); Console.WriteLine(); Console.Write("Press Enter to Continue..."); Console.ReadLine(); Console.Clear(); Console.WriteLine("Swap Types:"); // 00 01 02 03 Console.WriteLine("little16: converts 01 00 03 02 -> 00 01 02 03"); Console.WriteLine("little32: converts 03 02 01 00 -> 00 01 02 03"); // 02 03 00 01 Console.WriteLine(); Console.WriteLine("Press Enter to Quit"); Console.ReadLine(); }
public static void ImportMapData(IExperimentFace face, List <string> files) { Rom n0 = new ORom(files[0], ORom.Build.N0); Rom mq = new ORom(files[1], ORom.Build.MQU); var scenes = Load_Scene_MQJson(); const int dung_mark_vrom_mq = 0xBE78D8; N64Ptr dung_mark_vram_mq = 0x8085CFF8; var Minimaps = GetDungeonMinimaps(mq, dung_mark_vrom_mq, dung_mark_vram_mq); //const int floor_index_n0 = 0xB6C934; //const int floor_data_n0 = 0xBC7E00; const int floor_index_mq = 0xB6AFC4; const int floor_data_mq = 0xBB49E0; var FloorMap = GetDungeonFloorData(mq, floor_index_mq, floor_data_mq); for (int i = 0; i < 10; i++) { scenes[i].FloorMaps = FloorMap[i]; scenes[i].Minimaps = Minimaps[i]; } var ms = SerializeScenes(scenes); StreamReader sr = new StreamReader(ms); face.OutputText(sr.ReadToEnd()); }
private void CompareFiles() { List <string> files = DoubleDialog(); if (files == null) { return; } int addr = 0x7170; ORom rom1 = new ORom(files[0], ORom.Build.MQP); ORom rom2 = new ORom(files[1], ORom.Build.MQP); BinaryReader br1 = new BinaryReader(rom1.Files.GetFile(addr)); BinaryReader br2 = new BinaryReader(rom2.Files.GetFile(addr)); StringBuilder sb = new StringBuilder(); while (br1.BaseStream.Position < br1.BaseStream.Length) { if (br1.ReadInt64() != br2.ReadInt64()) { sb.AppendLine(string.Format("{0:X4}", br1.BaseStream.Position - 8 + addr)); } } br1.Close(); br2.Close(); outRichTextBox.Text = sb.ToString(); }
private void DumpTextSingle() { List <string> s = SingleDialog(); ORom r = new ORom(s[0], ORom.Build.N0); outRichTextBox.Text = Get.TextDump(r, ORom.Language.English); }
private void VersionSelector_Load(object sender, EventArgs e) { if (Game == Game.OcarinaOfTime) { versionComboBox.DataSource = ORom.GetSupportedBuilds().ToList(); } else if (Game == Game.MajorasMask) { versionComboBox.DataSource = MRom.GetSupportedBuilds().ToList(); } }
public static void OutputMQJson(IExperimentFace face, List <string> filePath) { Rom n0 = new ORom(filePath[0], ORom.Build.N0); Rom mq = new ORom(filePath[1], ORom.Build.MQU); var rom_scenes = new List <List <Scene_MQJson> >(); List <Scene_MQJson> scenes; foreach (Rom rom in new Rom[] { n0, mq }) { scenes = new List <Scene_MQJson>(); foreach (int sceneId in MQRandoScenes) { if (sceneId == 12) { continue; } var sceneFile = rom.Files.GetSceneFile(sceneId); using (BinaryReader br = new BinaryReader(sceneFile)) { var va = sceneFile.Record.VRom; var scene = new Scene_MQJson(br, sceneId, va.Start, va.End); br.BaseStream.Position = scene.RoomsAddress.Offset; for (int roomId = 0; roomId < scene.RoomsCount; roomId++) { int start = br.ReadBigInt32(); int end = br.ReadBigInt32(); var roomFile = rom.Files.GetFile(start); var room = new Room_MQJson(new BinaryReader(roomFile), sceneId, roomId, start, end); scene.Rooms.Add(room); } scenes.Add(scene); } } rom_scenes.Add(scenes); } var n0_scenes = rom_scenes[0]; scenes = rom_scenes[1]; SetN0Addresses(scenes, n0_scenes); MemoryStream ms = SerializeScenes(scenes); StreamReader sr = new StreamReader(ms); string json = sr.ReadToEnd(); face.OutputText(json); }
private void TextTestClass(List <string> file) { ORom r = new ORom(file[0], ORom.Build.N0); g = new GameText(r); //outRichTextBox.AppendText(g.GetMessage(0x1/*01A*/, Rom.Language.English)); //outRichTextBox.AppendText(" --- End ---"); //outRichTextBox.AppendText(Environment.NewLine); //outRichTextBox.AppendText(g.GetMessage(0x1/*01A*/, Rom.Language.Japanese)); //outRichTextBox.AppendText(Environment.NewLine); }
public static void PatchFiles_SameVrom(Stream output, bool outputIsCompressed, ORom hostRom, Dictionary <long, string> updateFiles, GetFileDelegate getFile) { if (outputIsCompressed) { PatchFiles_SameVrom_Compressed(output, hostRom, updateFiles, getFile); } else { throw new NotImplementedException(); } }
static void DumpChestContents(ORom rom, BinaryReader file, StreamWriter write) { for (int i = 0; i < 0x7D + 128 + 2; i++) { write.WriteLine(String.Format("{0:X2} {1:X2} {2:X2} {3:X2} {4:X4}", file.ReadByte(), file.ReadByte(), file.ReadByte(), file.ReadByte(), file.ReadBigUInt16()));//Endian.ConvertUShort(file.ReadUInt16()))); } }
private void GetChestContents() { List <string> file = SingleDialog(); if (file == null) { return; } ORom r = new ORom(file[0], ORom.Build.N2); Get.ChestContents(r); }
private static bool TryGetBuild(string enumStr, out ORom.Build build) { if (!Enum.TryParse(enumStr, true, out build)) { return(false); } if (!ORom.IsBuildNintendo(build)) { return(false); } return(true); }
private void CompressFile(List <string> file) { ORom r = new ORom(file[0], ORom.Build.MQP); byte[] data; using (Stream stream = r.Files.GetFile(COMPRESS_FILE_TEST)) using (FileStream fs = new FileStream("00E7DC20", FileMode.CreateNew)) { data = new byte[stream.Length]; stream.Read(data, 0, (int)stream.Length); Yaz.Encode(data, data.Length, fs); } }
private static Cutscene GetCutscene(List <string> file, int csAddr) { Cutscene cs; FileRecord record; ORom rom = new ORom(file[0], ORom.Build.N0); record = rom.Files.GetFileStart(csAddr); RomFile f = rom.Files.GetFile(record.VRom); f.Stream.Position = f.Record.GetRelativeAddress(csAddr); cs = new Cutscene(f); return(cs); }
public static string GetPartialCutscene() { List <InCutsceneData> cutsceneData; Dictionary <int, _Scene> sceneInfo; StringBuilder sb = new(); ORom rom; string romLoc = string.Empty; if (!VerboseOcarina.RomLocation.TryGetRomLocation(ORom.Build.N0, ref romLoc)) { throw new NotImplementedException(); } rom = new ORom(romLoc, ORom.Build.N0); //get list of cutscene bank offsets cutsceneData = GetCutsceneOffsetData(); //get stats on the scenes within the input list sceneInfo = GetSceneInfo(rom); InCutsceneData.GetSceneDelegate = sceneInfo.TryGetValue; for (int sceneId = 0; sceneId < 101; sceneId++) { RomFile file; sceneInfo.TryGetValue(sceneId, out _Scene scene); file = rom.Files.GetSceneFile(sceneId); foreach (InCutsceneData inData in cutsceneData) { if (inData.scene == sceneId) { continue; } var odat = GetData(scene, file, inData); sb.AppendFormat("{0},{1},{2:X6},{3:X6},{4:X8},{5},{6}", odat.inData.scene, odat.inData.setup, odat.inData.offset, odat.inData.RamStart, odat.cutsceneRomAddress, odat.scene.Id, odat.result.ToString()); sb.AppendLine(); } } return(sb.ToString()); }
private static Dictionary <int, _Scene> GetSceneInfo(ORom rom) { Dictionary <int, _Scene> result = new(); for (int sceneId = 0; sceneId < 101; sceneId++) { _Scene s = new() { Id = sceneId, Address = rom.Files.GetSceneVirtualAddress(sceneId) }; result.Add(sceneId, s); } return(result); }
public static void TestYazCompression(IExperimentFace face, List <string> filePath) { ORom rom = new ORom(filePath[0], ORom.Build.N0); StringBuilder sb = new StringBuilder(); foreach (var file in rom.Files) { if (!file.IsCompressed) { continue; } try { Stream vanillaFile = rom.Files.GetPhysicalFile(file.VRom); var decompressedFile = Yaz.Decode(vanillaFile, file.Rom.Size); MemoryStream ms = new MemoryStream(file.Rom.Size); sb.AppendLine($"{ Yaz.Encode(decompressedFile, decompressedFile.Length, ms):X8}"); while (ms.Length < ms.Capacity) { ms.WriteByte(0); } vanillaFile.Position = 0; ms.Position = 0; BinaryReader original = new BinaryReader(vanillaFile); BinaryReader test = new BinaryReader(ms); sb.AppendLine($"{file.VRom} - original: {original.BaseStream.Length:X8} test: {test.BaseStream.Length:X8}"); for (int i = 0; i < file.Rom.Size; i += 4) { int left = original.ReadBigInt32(); int right = test.ReadBigInt32(); if (left != right) { sb.AppendLine($"{file.VRom} - {i:X8} does not match, comparison stopped"); } } } catch (Exception e) { sb.AppendLine($"{file.VRom} - Exception {e.Message} {e.InnerException}"); } } face.OutputText(sb.ToString()); }
public static void Generate(IExperimentFace face, List <string> file) { byte[] buffer; MemoryStream ms; const int RecordLength = 0x1EC; const int RecordCount = 0x4158 / 0x1EC; ORom rom = new ORom(file[0], ORom.Build.MQU); var addr = rom.Files.GetPlayPauseAddress(0); var kaleido_scope = rom.Files.GetFile(addr); var kalBr = new BinaryReader(kaleido_scope); BinaryWriter newBw; using (FileStream fs = new FileStream(file[1], FileMode.Open)) { buffer = new byte[fs.Length]; ms = new MemoryStream(buffer); fs.CopyTo(ms); } newBw = new BinaryWriter(ms); ms.Position = 0x016C20; kaleido_scope.Stream.Position = kaleido_scope.Record.GetRelativeAddress(0xBB49E0); for (int i = 0; i < RecordCount; i++) { for (int j = 0; j < RecordLength; j += 4) { var word = kalBr.ReadBigInt32(); if (j == 0x8) { newBw.BaseStream.Position += 4; continue; } else { newBw.WriteBig(word); } } } using (FileStream fs = new FileStream("new_ovl_kaleido_scope", FileMode.Create)) { newBw.Seek(0, SeekOrigin.Begin); newBw.BaseStream.CopyTo(fs); } }
private static Stream CompressFile(ORom rom, FileRecord record) { byte[] data; using (BinaryReader br = new BinaryReader(rom.Files.GetFile(record.VRom.Start))) { data = br.ReadBytes(record.VRom.Size); } //compress file MemoryStream ms = new MemoryStream(); Yaz.Encode(data, data.Length, ms); ms.Position = 0; return(ms); }
public static void DmaFile(ORom r) { using (StreamWriter fs = new StreamWriter($"{r.Version}-dmadata.txt")) { for (int i = 0; i < r.Files.Count; i++) { FileRecord f = r.Files[i]; fs.WriteLine(string.Format("{0},{1},{2:X8},{3:X8},{2},{3},{4},{5}", i, r.Version.ToString(), f.VRom.Start, f.VRom.End, f.Rom.Start, f.Rom.End)); } } }
private static void DisplayHelp() { Console.WriteLine("compress \"inputRom\" \"outputRom\" \"GameId\" \"Version\""); Console.WriteLine("decompress \"inputRom\" \"outputRom\" \"GameId\" \"Version\""); Console.WriteLine("swap \"inputRom\" \"outputRom\" \"SwapType\""); Console.WriteLine(); Console.Write("Press Enter to Continue..."); Console.ReadLine(); Console.Clear(); Console.WriteLine("Ocarina of Time: use GameId \"oot\""); Console.WriteLine("Version:"); foreach (var item in ORom.GetSupportedBuilds()) { var info = ORom.BuildInformation.Get(item); Console.WriteLine(" {0,-5} {1}", info.Version + ":", info.Name); } Console.WriteLine(); Console.WriteLine("Majora's Mask: use GameId \"mm\""); Console.WriteLine("Version:"); foreach (var item in MRom.GetSupportedBuilds()) { var info = MRom.BuildInformation.Get(item); Console.WriteLine(" {0,-5} {1}", info.Version + ":", info.Name); } Console.WriteLine(); Console.Write("Press Enter to Continue..."); Console.ReadLine(); Console.Clear(); Console.WriteLine("Swap Types:"); // 00 01 02 03 Console.WriteLine("little16: converts 01 00 03 02 -> 00 01 02 03"); Console.WriteLine("little32: converts 03 02 01 00 -> 00 01 02 03"); // 02 03 00 01 Console.WriteLine(); Console.WriteLine("Press Enter to Quit"); Console.ReadLine(); }
public static void RandomDrops(IExperimentFace face, List <string> file) { ORom rom = new ORom(file[0], ORom.Build.N0); StringBuilder sb = new StringBuilder(); var codeFile = rom.Files.GetFile(new RomFileToken(ORom.FileList.code)); long dropTableAddr = codeFile.Record.GetRelativeAddress(0xB5D764); BinaryReader br = new BinaryReader(codeFile); br.BaseStream.Position = dropTableAddr; for (int i = 0; i < 15; i++) { sb.AppendLine(new RandomDropTable(br).ToString()); } face.OutputText(sb.ToString()); }
public static string DecompressedFileList(ORom romFile) { OFileTable ft; StringBuilder sb = new StringBuilder(); ft = new OFileTable(romFile.FileLocation, romFile.Version); sb.AppendLine(romFile.Version.ToString()); for (int i = 0; i < ft.Count; i++) { FileRecord record = ft[i]; if (record.IsCompressed == false) { sb.AppendLine($"{i:D4} {record.VRom.Start:X8}"); } } return sb.ToString(); }
public void Script(string path) { ORom rom = new ORom(path, ORom.Build.DBGMQ); MemoryStream ms = new MemoryStream(new byte[0x4000000]); //clone rom's files by DMA foreach (var item in rom.Files) { var rfile = rom.Files.GetFile(item.VRom); CopyToOutputRom(ms, rfile); } //clone scene and room files for (int i = 0; i < rom.Scenes; i++) { var sceneFile = rom.Files.GetSceneFile(i); if (sceneFile == null) { continue; } var sceneFileMeta = SceneRoomReader.InitializeScene(sceneFile, i); RemoveActor0001FromFile(ms, sceneFile, sceneFileMeta.Header); CopyToOutputRom(ms, sceneFile); foreach (var roomAddr in sceneFileMeta.Header.GetRoomAddresses()) { var roomFile = rom.Files.GetFile(roomAddr); var roomFileMeta = SceneRoomReader.InitializeRoom(roomFile); RemoveActor0001FromFile(ms, roomFile, roomFileMeta.Header); CopyToOutputRom(ms, roomFile); } } //save using (Stream sw = new FileStream("ZeldosBirthday.z64", FileMode.Create)) { ms.Position = 0; ms.CopyTo(sw); } //using (BinaryWriter bw = new BinaryWriter(new StreamWriter())) }
//public delegate void GenerateFile(); /// <summary> /// /// </summary> /// <param name="sourceRom">The source rom file</param> /// <param name="modifiedRom">The modified rom file</param> /// <param name="folder"></param> public static void GenerateModifiedFiles(ORom sourceRom, ORom modifiedRom, string folder) { BinaryReader source; BinaryReader modified; //FileRecord modifiedFileRecord; RomFile modifiedFile; foreach (FileRecord record in sourceRom.Files) { source = new BinaryReader(sourceRom.Files.GetFile(record.VRom)); modifiedFile = modifiedRom.Files.GetFile(record.VRom); modified = new BinaryReader(modifiedFile); if (source.BaseStream.IsDifferentTo(modified.BaseStream)) { modified.BaseStream.Position = 0; WriteFile(modified, modifiedFile.Record, record.IsCompressed, folder); } } }
//void XmlActorDictionaryTests() //{ // XmlActorDictionary.LoadFile(openFileDialog.FileName); // byte[] test = new byte[0x10]; // byte[] testInit = test; // //test out our actor def function // XmlActorDictionary.TryGetActorDefinition(0xA, out ActorDefinition def); // string testOut = def.GetDescription(test); // XmlActor testNewRecord = new XmlActor(testInit); // this.outRichTextBox.Text = testNewRecord.Print(); //} private void CutsceneParser() { #region Cutscene Parser mzxrules.OcaLib.Cutscenes.Cutscene a; //br = SceneRoomReader.LocalFileTable.GetFile(0x0318E000); //br.BaseStream.Position = 0x1DA40; //hyrule field title //br = SceneRoomReader.LocalFileTable.GetFile(0x01FB8000); //br.BaseStream.Position = 0xA920; ORom rom = new ORom("", ORom.Build.N0); //navi Stream s = rom.Files.GetFile(0x206F000); s.Position = 0xA6D0; a = new mzxrules.OcaLib.Cutscenes.Cutscene(s); outRichTextBox.Clear(); outRichTextBox.Text = a.PrintByOccurrence(); #endregion }