public void Handle(ReplaceStarterCommand command) { // Load files const string nsoPath = "exefs/main"; IMainExecutable nso = MainExecutable.LoadFromNso(rom.ReadAllBytes(nsoPath)); const string natureDiagnosisPath = "romfs/Data/StreamingAssets/data/nature_diagnosis/diagnosis.json"; var natureDiagnosis = JsonConvert.DeserializeObject <NDConverterSharedData.DataStore>(rom.ReadAllText(natureDiagnosisPath)); const string fixedPokemonPath = "romfs/Data/StreamingAssets/native_data/dungeon/fixed_pokemon.bin"; IFixedPokemon fixedPokemon = new FixedPokemon(rom.ReadAllBytes(fixedPokemonPath)); // Process var map = nso.StarterFixedPokemonMaps.First(m => m.PokemonId == command.OldPokemonId); map.PokemonId = command.NewPokemonId; var fixedPokemonEntry = fixedPokemon.Entries[(int)map.FixedPokemonId]; fixedPokemonEntry.PokemonId = command.NewPokemonId; if (command.Move1 != default) { fixedPokemonEntry.Move1 = command.Move1; } if (command.Move2 != default) { fixedPokemonEntry.Move2 = command.Move2; } if (command.Move3 != default) { fixedPokemonEntry.Move3 = command.Move3; } if (command.Move4 != default) { fixedPokemonEntry.Move4 = command.Move4; } var ndEntry = natureDiagnosis.m_pokemonNatureAndTypeList.First(p => p.m_nameLabel == command.OldPokemonId); ndEntry.m_nameLabel = command.NewPokemonId; var symbolCandiate = PegasusActDatabase.ActorDataList .Where(a => a.raw_pokemonIndex == command.NewPokemonId && a.bIsFemale == false) // bIsFemale is out of scope since this is just a proof-of-concept .OrderByDescending(a => (int)a.raw_formType) .FirstOrDefault(); if (symbolCandiate != null) { ndEntry.m_symbolName = symbolCandiate.symbolName !; ndEntry.m_symbolNameFemale = ""; } // Save files rom.WriteAllBytes(nsoPath, nso.ToNso()); rom.WriteAllText(natureDiagnosisPath, JsonConvert.SerializeObject(natureDiagnosis)); rom.WriteAllBytes(fixedPokemonPath, fixedPokemon.Build().Data.ReadArray()); }
static void Main(string[] args) { //ChangeStarters(); //return; var basePath = @"D:\01003D200BAA2000"; var natureDiagnosis = JsonConvert.DeserializeObject <NDConverterSharedData.DataStore>(File.ReadAllText(basePath + @"\romfs\Data\StreamingAssets\data\nature_diagnosis\diagnosis.json")); //var actorDataInfoPath = basePath + @"\romfs\Data\StreamingAssets\native_data\pokemon\pokemon_actor_data_info.bin"; //var actorDataInfo = new PokemonActorDataInfo(File.ReadAllBytes(actorDataInfoPath)); var graphicsDatabasePath = basePath + @"\romfs\Data\StreamingAssets\native_data\pokemon_graphics_database.bin"; var graphicsDatabase = new PokemonGraphicsDatabase(File.ReadAllBytes(graphicsDatabasePath)); var nsoPath = basePath + @"\exefs\main"; IMainExecutable nso = MainExecutable.LoadFromNso(File.ReadAllBytes(nsoPath)); var fixedPokemonPath = basePath + @"\romfs\Data\StreamingAssets\native_data\dungeon\fixed_pokemon.bin"; IFixedPokemon fixedPokemon = new FixedPokemon(File.ReadAllBytes(fixedPokemonPath)); var messageBinPath = basePath + @"\romfs\Data\StreamingAssets\native_data\message_us.bin"; var messageBin = new Farc(File.ReadAllBytes(messageBinPath)); var common = new MessageBinEntry(messageBin.GetFile("common.bin")); ICommonStrings commonStrings = new CommonStrings(common); IStarterQueries starterQueries = new StarterQueries(commonStrings, nso, natureDiagnosis, fixedPokemon); Console.WriteLine("Starters:"); var starters = starterQueries.GetStarters(); foreach (var starter in starters) { Console.WriteLine(starter.PokemonName); } Console.WriteLine("Press any key to exit"); Console.ReadLine(); }