From 34267f682a75647bce381dd59c05fc3250cdb7d9 Mon Sep 17 00:00:00 2001 From: scawful Date: Sat, 11 Nov 2023 19:05:05 -0500 Subject: [PATCH] Add GfxGroups fns to `ROM` --- src/app/rom.cc | 1 + src/app/rom.h | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+) diff --git a/src/app/rom.cc b/src/app/rom.cc index f971c01b..242d339b 100644 --- a/src/app/rom.cc +++ b/src/app/rom.cc @@ -327,6 +327,7 @@ absl::Status ROM::LoadFromFile(const absl::string_view& filename, version_ = Z3_Version::US; } RETURN_IF_ERROR(LoadAllPalettes()) + LoadGfxGroups(); } // Set is_loaded_ flag and return success diff --git a/src/app/rom.h b/src/app/rom.h index e9f46df1..5b5e58f5 100644 --- a/src/app/rom.h +++ b/src/app/rom.h @@ -464,6 +464,85 @@ class ROM { bitmap->UpdateTexture(renderer_); } + std::vector> main_blockset_ids; + std::vector> room_blockset_ids; + std::vector> spriteset_ids; + std::vector> paletteset_ids; + + void LoadGfxGroups() { + main_blockset_ids.resize(37, std::vector(8)); + room_blockset_ids.resize(82, std::vector(4)); + spriteset_ids.resize(144, std::vector(4)); + paletteset_ids.resize(72, std::vector(4)); + + int gfxPointer = (rom_data_[core::gfx_groups_pointer + 1] << 8) + + rom_data_[core::gfx_groups_pointer]; + gfxPointer = core::SnesToPc(gfxPointer); + + for (int i = 0; i < 37; i++) { + for (int j = 0; j < 8; j++) { + main_blockset_ids[i][j] = rom_data_[gfxPointer + (i * 8) + j]; + } + } + + for (int i = 0; i < 82; i++) { + for (int j = 0; j < 4; j++) { + room_blockset_ids[i][j] = + rom_data_[core::entrance_gfx_group + (i * 4) + j]; + } + } + + for (int i = 0; i < 144; i++) { + for (int j = 0; j < 4; j++) { + spriteset_ids[i][j] = + rom_data_[GetVersionConstants().kSpriteBlocksetPointer + (i * 4) + + j]; + } + } + + for (int i = 0; i < 72; i++) { + for (int j = 0; j < 4; j++) { + paletteset_ids[i][j] = + rom_data_[core::dungeons_palettes_groups + (i * 4) + j]; + } + } + } + + bool SaveGroupsToROM() { + int gfxPointer = (rom_data_[core::gfx_groups_pointer + 1] << 8) + + rom_data_[core::gfx_groups_pointer]; + gfxPointer = core::SnesToPc(gfxPointer); + + for (int i = 0; i < 37; i++) { + for (int j = 0; j < 8; j++) { + rom_data_[gfxPointer + (i * 8) + j] = main_blockset_ids[i][j]; + } + } + + for (int i = 0; i < 82; i++) { + for (int j = 0; j < 4; j++) { + rom_data_[core::entrance_gfx_group + (i * 4) + j] = + room_blockset_ids[i][j]; + } + } + + for (int i = 0; i < 144; i++) { + for (int j = 0; j < 4; j++) { + rom_data_[GetVersionConstants().kSpriteBlocksetPointer + (i * 4) + j] = + spriteset_ids[i][j]; + } + } + + for (int i = 0; i < 72; i++) { + for (int j = 0; j < 4; j++) { + rom_data_[core::dungeons_palettes_groups + (i * 4) + j] = + paletteset_ids[i][j]; + } + } + + return false; + } + private: long size_ = 0; bool is_loaded_ = false;