Add Rom::LoadZelda3 for loading game data across Load fns

This commit is contained in:
scawful
2024-08-14 18:28:12 -04:00
parent 5c68f61544
commit 4b990662df
2 changed files with 24 additions and 37 deletions

View File

@@ -142,12 +142,11 @@ absl::Status Rom::LoadAllGraphicsData() {
}
absl::Status Rom::LoadFromFile(const std::string& filename, bool z3_load) {
std::string full_filename = std::filesystem::absolute(filename).string();
if (filename.empty()) {
return absl::InvalidArgumentError(
"Could not load ROM: parameter `filename` is empty.");
}
// Set filename
std::string full_filename = std::filesystem::absolute(filename).string();
filename_ = full_filename;
// Open file
@@ -177,10 +176,7 @@ absl::Status Rom::LoadFromFile(const std::string& filename, bool z3_load) {
// Check if the sROM has a header
constexpr size_t baseROMSize = 1048576; // 1MB
constexpr size_t headerSize = 0x200; // 512 bytes
if (size_ % baseROMSize == headerSize) {
std::cout << "ROM has a header" << std::endl;
has_header_ = true;
}
has_header_ = (size_ % baseROMSize == headerSize);
// Remove header if present
if (has_header_) {
@@ -193,21 +189,8 @@ absl::Status Rom::LoadFromFile(const std::string& filename, bool z3_load) {
// Close file
file.close();
// Load Zelda 3 specific data if requested
if (z3_load) {
// Copy ROM title
constexpr uint32_t kTitleStringOffset = 0x7FC0;
constexpr uint32_t kTitleStringLength = 20;
std::copy(rom_data_.begin() + kTitleStringOffset,
rom_data_.begin() + kTitleStringOffset + kTitleStringLength,
title_.begin());
if (rom_data_[kTitleStringOffset + 0x19] == 0) {
version_ = Z3_Version::JP;
} else {
version_ = Z3_Version::US;
}
RETURN_IF_ERROR(gfx::LoadAllPalettes(rom_data_, palette_groups_));
LoadGfxGroups();
RETURN_IF_ERROR(LoadZelda3());
}
// Expand the ROM data to 2MB without changing the data in the first 1MB
@@ -235,19 +218,7 @@ absl::Status Rom::LoadFromPointer(uchar* data, size_t length, bool z3_load) {
size_ = length;
if (z3_load) {
// Copy ROM title
constexpr uint32_t kTitleStringOffset = 0x7FC0;
constexpr uint32_t kTitleStringLength = 20;
std::copy(rom_data_.begin() + kTitleStringOffset,
rom_data_.begin() + kTitleStringOffset + kTitleStringLength,
title_.begin());
if (rom_data_[kTitleStringOffset + 0x19] == 0) {
version_ = Z3_Version::JP;
} else {
version_ = Z3_Version::US;
}
RETURN_IF_ERROR(gfx::LoadAllPalettes(rom_data_, palette_groups_));
LoadGfxGroups();
RETURN_IF_ERROR(LoadZelda3());
}
// Set is_loaded_ flag and return success
@@ -256,6 +227,23 @@ absl::Status Rom::LoadFromPointer(uchar* data, size_t length, bool z3_load) {
return absl::OkStatus();
}
absl::Status Rom::LoadZelda3() {
constexpr uint32_t kTitleStringOffset = 0x7FC0;
constexpr uint32_t kTitleStringLength = 20;
// Copy ROM title
std::copy(rom_data_.begin() + kTitleStringOffset,
rom_data_.begin() + kTitleStringOffset + kTitleStringLength,
title_.begin());
if (rom_data_[kTitleStringOffset + 0x19] == 0) {
version_ = Z3_Version::JP;
} else {
version_ = Z3_Version::US;
}
RETURN_IF_ERROR(gfx::LoadAllPalettes(rom_data_, palette_groups_));
RETURN_IF_ERROR(LoadGfxGroups());
return absl::OkStatus();
}
absl::Status Rom::LoadFromBytes(const Bytes& data) {
if (data.empty()) {
return absl::InvalidArgumentError(
@@ -310,7 +298,7 @@ absl::Status Rom::SaveToFile(bool backup, bool save_new, std::string filename) {
}
if (flags()->kSaveGfxGroups) {
SaveGroupsToRom();
RETURN_IF_ERROR(SaveGroupsToRom());
}
if (save_new) {

View File

@@ -473,9 +473,6 @@ class Rom : public core::ExperimentFlags {
std::vector<std::vector<uint8_t>> spriteset_ids;
std::vector<std::vector<uint8_t>> paletteset_ids;
void LoadGfxGroups();
void SaveGroupsToRom();
struct WriteAction {
int address;
std::variant<int, uint8_t, uint16_t, short, std::vector<uint8_t>,
@@ -520,6 +517,8 @@ class Rom : public core::ExperimentFlags {
}
return absl::OkStatus();
}
absl::Status LoadZelda3();
absl::Status LoadGfxGroups();
absl::Status SaveGroupsToRom();