public async Task Write(CroFile dllField, CroFile dllPoke3Select) { byte[] fieldCode = await dllField.GetCodeSection(); byte[] pokeSelectData = await dllPoke3Select.GetDataSection(); this.SynchronizeSpecies(); fieldCode.WithWriter(bw => this.startersField.WriteData(bw)); pokeSelectData.WithWriter(bw => this.startersPokeSelect.WriteData(bw)); await dllField.WriteCodeSection(fieldCode); await dllPoke3Select.WriteDataSection(pokeSelectData); }
public Task <CroFile> GetCroFile(CroNames name, bool edited = false) { var filename = $"Dll{name}.cro"; var path = Path.Combine(this.RomFS, filename); if (edited && this.IsOverridingOutPath) { var editedPath = Path.Combine(this.OutputPathOverride, "RomFS", filename); if (File.Exists(editedPath)) { path = editedPath; } } if (!File.Exists(path)) { throw new FileNotFoundException($"CRO file not found: {name}"); } return(CroFile.FromFile(path)); }
private async Task TestCroFile(CroFile cro, Func <Task> saveAction, bool failOnBadHash = true) { var fname = Path.GetFileName(cro.Path); var outPath = Path.Combine(this.path, fname); var origPath = Path.Combine(this.path, $"{Path.GetFileNameWithoutExtension( outPath )}.orig.cro"); byte[] origData = await cro.Write(); await saveAction(); byte[] newData = await cro.Write(); using (var md5 = MD5.Create()) using (var origFs = new FileStream(origPath, FileMode.Create, FileAccess.Write, FileShare.None)) using (var newFs = new FileStream(outPath, FileMode.Create, FileAccess.Write, FileShare.None)) { await origFs.WriteAsync(origData, 0, origData.Length); await newFs.WriteAsync(newData, 0, newData.Length); byte[] hashOriginal = md5.ComputeHash(origData); byte[] hashNew = md5.ComputeHash(newData); try { Assert.AreEqual(hashOriginal, hashNew, $"Hash for rewritten {fname} did not match original"); } catch (AssertionException ex) { if (failOnBadHash) { throw; } throw new InconclusiveException(ex.Message, ex); } } }
public async Task Read(CroFile dllField, CroFile dllPoke3Select) { byte[] fieldCode = await dllField.GetCodeSection(); byte[] pokeSelectData = await dllPoke3Select.GetDataSection(); fieldCode.WithReader(br => this.startersField.ReadData(br)); pokeSelectData.WithReader(br => this.startersPokeSelect.ReadData(br)); for (int gen = 1; gen <= 6; gen++) { for (int entry = 0; entry < 3; entry++) { ushort speciesField = this.startersField.StarterSpecies[gen - 1][entry]; ushort speciesPokeSelect = this.startersPokeSelect.StarterSpecies[gen - 1][entry]; if (speciesField != speciesPokeSelect) { throw new InvalidDataException($"Species ID for Gen {gen}, Starter {entry + 1} did not match in the two CRO files. " + $"DllField was {speciesField} but DllPoke3Select was {speciesPokeSelect}"); } } } }
internal Task SaveStarters(Starters starters, CroFile dllField, CroFile dllPokeSelect) => starters.Write(dllField, dllPokeSelect);