diff --git a/src/app/editor/master_editor.cc b/src/app/editor/master_editor.cc index a54e6049..fdfb9383 100644 --- a/src/app/editor/master_editor.cc +++ b/src/app/editor/master_editor.cc @@ -168,6 +168,11 @@ void MasterEditor::DrawFileMenu() { MENU_ITEM2("Save", "Ctrl+S") { status_ = rom()->SaveToFile(backup_rom_); } MENU_ITEM("Save As..") { save_as_menu = true; } + if (rom()->isLoaded()) { + MENU_ITEM("Reload") { status_ = rom()->Reload(); } + MENU_ITEM("Close") { status_ = rom()->Close(); } + } + ImGui::Separator(); if (ImGui::BeginMenu("Options")) { diff --git a/src/app/rom.cc b/src/app/rom.cc index d6003a11..393ac375 100644 --- a/src/app/rom.cc +++ b/src/app/rom.cc @@ -160,7 +160,7 @@ absl::Status LoadGrassColors(const Bytes& rom_data, RETURN_IF_ERROR(palette_groups["grass"].AddColor( gfx::ReadColorFromROM(core::hardcodedGrassDW, rom_data.data()))) RETURN_IF_ERROR(palette_groups["grass"].AddColor( - gfx::ReadColorFromROM(core::hardcodedGrassSpecial, rom_data.data()))); + gfx::ReadColorFromROM(core::hardcodedGrassSpecial, rom_data.data()))) return absl::OkStatus(); } @@ -242,21 +242,21 @@ absl::Status ROM::LoadAllGraphicsData() { } absl::Status ROM::LoadAllPalettes() { - RETURN_IF_ERROR(LoadOverworldMainPalettes(rom_data_, palette_groups_)); - RETURN_IF_ERROR(LoadOverworldAuxiliaryPalettes(rom_data_, palette_groups_)); - RETURN_IF_ERROR(LoadOverworldAnimatedPalettes(rom_data_, palette_groups_)); - RETURN_IF_ERROR(LoadHUDPalettes(rom_data_, palette_groups_)); - RETURN_IF_ERROR(LoadGlobalSpritePalettes(rom_data_, palette_groups_)); - RETURN_IF_ERROR(LoadArmorPalettes(rom_data_, palette_groups_)); - RETURN_IF_ERROR(LoadSwordPalettes(rom_data_, palette_groups_)); - RETURN_IF_ERROR(LoadShieldPalettes(rom_data_, palette_groups_)); - RETURN_IF_ERROR(LoadSpriteAux1Palettes(rom_data_, palette_groups_)); - RETURN_IF_ERROR(LoadSpriteAux2Palettes(rom_data_, palette_groups_)); - RETURN_IF_ERROR(LoadSpriteAux3Palettes(rom_data_, palette_groups_)); - RETURN_IF_ERROR(LoadDungeonMainPalettes(rom_data_, palette_groups_)); - RETURN_IF_ERROR(LoadGrassColors(rom_data_, palette_groups_)); - RETURN_IF_ERROR(Load3DObjectPalettes(rom_data_, palette_groups_)); - RETURN_IF_ERROR(LoadOverworldMiniMapPalettes(rom_data_, palette_groups_)); + RETURN_IF_ERROR(LoadOverworldMainPalettes(rom_data_, palette_groups_)) + RETURN_IF_ERROR(LoadOverworldAuxiliaryPalettes(rom_data_, palette_groups_)) + RETURN_IF_ERROR(LoadOverworldAnimatedPalettes(rom_data_, palette_groups_)) + RETURN_IF_ERROR(LoadHUDPalettes(rom_data_, palette_groups_)) + RETURN_IF_ERROR(LoadGlobalSpritePalettes(rom_data_, palette_groups_)) + RETURN_IF_ERROR(LoadArmorPalettes(rom_data_, palette_groups_)) + RETURN_IF_ERROR(LoadSwordPalettes(rom_data_, palette_groups_)) + RETURN_IF_ERROR(LoadShieldPalettes(rom_data_, palette_groups_)) + RETURN_IF_ERROR(LoadSpriteAux1Palettes(rom_data_, palette_groups_)) + RETURN_IF_ERROR(LoadSpriteAux2Palettes(rom_data_, palette_groups_)) + RETURN_IF_ERROR(LoadSpriteAux3Palettes(rom_data_, palette_groups_)) + RETURN_IF_ERROR(LoadDungeonMainPalettes(rom_data_, palette_groups_)) + RETURN_IF_ERROR(LoadGrassColors(rom_data_, palette_groups_)) + RETURN_IF_ERROR(Load3DObjectPalettes(rom_data_, palette_groups_)) + RETURN_IF_ERROR(LoadOverworldMiniMapPalettes(rom_data_, palette_groups_)) return absl::OkStatus(); } @@ -306,7 +306,7 @@ absl::Status ROM::LoadFromFile(const absl::string_view& filename, } else { version_ = Z3_Version::US; } - LoadAllPalettes(); + RETURN_IF_ERROR(LoadAllPalettes()) } // Set is_loaded_ flag and return success @@ -381,8 +381,6 @@ absl::Status ROM::SaveToFile(bool backup, absl::string_view filename) { absl::StrCat("Could not open ROM file: ", filename)); } - using byte_cast = const char* (*)(const void*); - // Save the data to the file try { file.write( diff --git a/src/app/rom.h b/src/app/rom.h index 7afd6149..d306d449 100644 --- a/src/app/rom.h +++ b/src/app/rom.h @@ -128,7 +128,8 @@ constexpr uint32_t kFontSpriteLocation = 0x70000; struct WriteAction { int address; - std::variant, gfx::SNESColor> value; + std::variant, gfx::SNESColor> + value; }; class ROM { @@ -142,7 +143,8 @@ class ROM { } absl::Status WriteHelper(const WriteAction& action) { - if (std::holds_alternative(action.value)) { + if (std::holds_alternative(action.value) || + std::holds_alternative(action.value)) { return Write(action.address, std::get(action.value)); } else if (std::holds_alternative(action.value)) { return WriteShort(action.address, std::get(action.value)); @@ -364,6 +366,20 @@ class ROM { size_ = size; } + absl::Status Reload() { + if (filename_.empty()) { + return absl::InvalidArgumentError("No filename specified"); + } + return LoadFromFile(filename_); + } + + absl::Status Close() { + rom_data_.clear(); + size_ = 0; + is_loaded_ = false; + return absl::OkStatus(); + } + void QueueChanges(std::function const& function) { changes_.push(function); } @@ -458,10 +474,10 @@ class ROM { Z3_Version version_ = Z3_Version::US; gfx::BitmapTable graphics_bin_; + PaletteGroupMap palette_groups_; std::stack> changes_; std::shared_ptr renderer_; - std::unordered_map palette_groups_; }; class SharedROM {