From d3df11d49224e16ba6f0e1c713cce3653671325b Mon Sep 17 00:00:00 2001 From: scawful Date: Fri, 9 Aug 2024 19:29:37 -0400 Subject: [PATCH] cleanup Rom class interface --- src/app/editor/master_editor.cc | 1 - src/app/rom.cc | 24 ++++++++++++++------ src/app/rom.h | 39 +++++++++------------------------ src/app/zelda3/music/tracker.cc | 8 +++---- 4 files changed, 31 insertions(+), 41 deletions(-) diff --git a/src/app/editor/master_editor.cc b/src/app/editor/master_editor.cc index 95319776..f573c7f7 100644 --- a/src/app/editor/master_editor.cc +++ b/src/app/editor/master_editor.cc @@ -473,7 +473,6 @@ void MasterEditor::DrawFileMenu() { MENU_ITEM("Save As..") { save_as_menu = true; } if (rom()->is_loaded()) { - MENU_ITEM("Reload") { status_ = rom()->Reload(); } MENU_ITEM("Close") { status_ = rom()->Close(); rom_assets_loaded_ = false; diff --git a/src/app/rom.cc b/src/app/rom.cc index b70c8156..0f932ba5 100644 --- a/src/app/rom.cc +++ b/src/app/rom.cc @@ -34,19 +34,23 @@ using core::Renderer; constexpr int Uncompressed3BPPSize = 0x0600; constexpr int kEntranceGfxGroup = 0x5D97; -int Rom::GetGraphicsAddress(const uchar* data, uint8_t addr) { +namespace { +int GetGraphicsAddress(const uchar* data, uint8_t addr, uint32_t ptr1, + uint32_t ptr2, uint32_t ptr3) { return core::SnesToPc(core::AddressFromBytes( - data[version_constants().kOverworldGfxPtr1 + addr], - data[version_constants().kOverworldGfxPtr2 + addr], - data[version_constants().kOverworldGfxPtr3 + addr])); + data[ptr1 + addr], data[ptr2 + addr], data[ptr3 + addr])); } +} // namespace absl::StatusOr Rom::Load2BppGraphics() { Bytes sheet; const uint8_t sheets[] = {113, 114, 218, 219, 220, 221}; for (const auto& sheet_id : sheets) { - auto offset = GetGraphicsAddress(data(), sheet_id); + auto offset = GetGraphicsAddress(data(), sheet_id, + version_constants().kOverworldGfxPtr1, + version_constants().kOverworldGfxPtr2, + version_constants().kOverworldGfxPtr3); ASSIGN_OR_RETURN(auto decomp_sheet, gfx::lc_lz2::DecompressV2(data(), offset)) auto converted_sheet = gfx::SnesTo8bppSheet(decomp_sheet, 2); @@ -89,7 +93,10 @@ absl::Status Rom::LoadAllGraphicsData() { for (int i = 0; i < kNumGfxSheets; i++) { if (i >= 115 && i <= 126) { // uncompressed sheets sheet.resize(Uncompressed3BPPSize); - auto offset = GetGraphicsAddress(data(), i); + auto offset = + GetGraphicsAddress(data(), i, version_constants().kOverworldGfxPtr1, + version_constants().kOverworldGfxPtr2, + version_constants().kOverworldGfxPtr3); for (int j = 0; j < Uncompressed3BPPSize; j++) { sheet[j] = rom_data_[j + offset]; } @@ -97,7 +104,10 @@ absl::Status Rom::LoadAllGraphicsData() { } else if (i == 113 || i == 114 || i >= 218) { bpp3 = false; } else { - auto offset = GetGraphicsAddress(data(), i); + auto offset = + GetGraphicsAddress(data(), i, version_constants().kOverworldGfxPtr1, + version_constants().kOverworldGfxPtr2, + version_constants().kOverworldGfxPtr3); ASSIGN_OR_RETURN(sheet, gfx::lc_lz2::DecompressV2(data(), offset)) bpp3 = true; } diff --git a/src/app/rom.h b/src/app/rom.h index ec7c59e3..875c2de0 100644 --- a/src/app/rom.h +++ b/src/app/rom.h @@ -391,13 +391,6 @@ class Rom : public core::ExperimentFlags { 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; @@ -405,28 +398,20 @@ class Rom : public core::ExperimentFlags { return absl::OkStatus(); } + core::ResourceLabelManager* resource_label() { + return &resource_label_manager_; + } VersionConstants version_constants() const { return kVersionConstantsMap.at(version_); } - int GetGraphicsAddress(const uchar* data, uint8_t addr); - - auto palette_group() { return palette_groups_; } - auto mutable_palette_group() { return &palette_groups_; } - auto dungeon_palette(int i) { return palette_groups_.dungeon_main[i]; } - auto mutable_dungeon_palette(int i) { - return palette_groups_.dungeon_main.mutable_palette(i); - } - // Full graphical data for the game Bytes graphics_buffer() const { return graphics_buffer_; } [[deprecated]] gfx::BitmapTable graphics_bin() const { return graphics_bin_; } - [[deprecated]] gfx::Bitmap* mutable_graphics_sheet(int index) { return &graphics_bin_.at(index); } - [[deprecated]] auto bitmap_manager() { return graphics_manager_; } [[deprecated]] auto mutable_bitmap_manager() { return &graphics_manager_; } @@ -436,6 +421,13 @@ class Rom : public core::ExperimentFlags { auto gfx_sheets() { return graphics_sheets_; } auto mutable_gfx_sheets() { return &graphics_sheets_; } + auto palette_group() { return palette_groups_; } + auto mutable_palette_group() { return &palette_groups_; } + auto dungeon_palette(int i) { return palette_groups_.dungeon_main[i]; } + auto mutable_dungeon_palette(int i) { + return palette_groups_.dungeon_main.mutable_palette(i); + } + auto title() const { return title_; } auto size() const { return size_; } auto begin() { return rom_data_.begin(); } @@ -454,15 +446,6 @@ class Rom : public core::ExperimentFlags { } return rom_data_[i]; } - uint8_t& operator+(int i) { - if (i > size_) { - std::cout << "ROM: Index " << i << " out of bounds, size: " << size_ - << std::endl; - return rom_data_[0]; - } - return rom_data_[i]; - } - const uint8_t* operator&() { return rom_data_.data(); } std::vector> main_blockset_ids; std::vector> room_blockset_ids; @@ -472,8 +455,6 @@ class Rom : public core::ExperimentFlags { void LoadGfxGroups(); void SaveGroupsToRom(); - auto resource_label() { return &resource_label_manager_; } - private: struct WriteAction { int address; diff --git a/src/app/zelda3/music/tracker.cc b/src/app/zelda3/music/tracker.cc index 9de7bedb..2f6fa0d4 100644 --- a/src/app/zelda3/music/tracker.cc +++ b/src/app/zelda3/music/tracker.cc @@ -1249,13 +1249,13 @@ void Tracker::SaveSongs(Rom &rom) { ssblt[i] = 0; } if (n > l + 4) { - *(short *)(rom + l) = n - l - 4; - *(short *)(rom + l + 2) = o ? bank_lwr[k] : 0xd000; + *(short *)(rom.data() + l) = n - l - 4; + *(short *)(rom.data() + l + 2) = o ? bank_lwr[k] : 0xd000; l = n; } } - *(short *)(rom + l) = 0; - *(short *)(rom + l + 2) = 0x800; + *(short *)(rom.data() + l) = 0; + *(short *)(rom.data() + l + 2) = 0x800; if (k == 1) m = l + 4; } free(ssblt);