cleanup Rom class interface

This commit is contained in:
scawful
2024-08-09 19:29:37 -04:00
parent 0ea1c13cea
commit d3df11d492
4 changed files with 31 additions and 41 deletions

View File

@@ -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;

View File

@@ -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<Bytes> 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;
}

View File

@@ -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<std::vector<uint8_t>> main_blockset_ids;
std::vector<std::vector<uint8_t>> 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;

View File

@@ -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);