Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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));
        }
Exemplo n.º 3
0
        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);
                        }
                    }
        }
Exemplo n.º 4
0
        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}");
                    }
                }
            }
        }
Exemplo n.º 5
0
 internal Task SaveStarters(Starters starters, CroFile dllField, CroFile dllPokeSelect)
 => starters.Write(dllField, dllPokeSelect);