18#include "absl/status/status.h"
19#include "absl/status/statusor.h"
20#include "absl/strings/str_format.h"
21#include "absl/strings/string_view.h"
47 uint32_t ptr2, uint32_t ptr3,
size_t rom_size);
76static const std::map<zelda3_version, zelda3_version_pointers>
77 kVersionConstantsMap = {
78 {zelda3_version::US, zelda3_us_pointers},
79 {zelda3_version::JP, zelda3_jp_pointers},
80 {zelda3_version::SD, {}},
81 {zelda3_version::RANDO, {}},
109 return absl::OkStatus();
114 absl::Status
SavePalette(
int index,
const std::string& group_name,
144 template <
typename...
Args>
152 template <
typename T,
typename...
Args>
158 if constexpr (
sizeof...(args) > 0) {
166 std::variant<int, uint8_t, uint16_t, short, std::vector<uint8_t>,
173 if (std::holds_alternative<uint8_t>(action.value)) {
174 return WriteByte(action.address, std::get<uint8_t>(action.value));
175 }
else if (std::holds_alternative<uint16_t>(action.value) ||
176 std::holds_alternative<short>(action.value)) {
177 return WriteShort(action.address, std::get<uint16_t>(action.value));
178 }
else if (std::holds_alternative<std::vector<uint8_t>>(action.value)) {
180 std::get<std::vector<uint8_t>>(action.value));
181 }
else if (std::holds_alternative<gfx::SnesColor>(action.value)) {
182 return WriteColor(action.address, std::get<gfx::SnesColor>(action.value));
183 }
else if (std::holds_alternative<std::vector<gfx::SnesColor>>(
185 return absl::UnimplementedError(
186 "WriteHelper: std::vector<gfx::SnesColor>");
188 auto error_message = absl::StrFormat(
"Invalid write argument type: %s",
189 typeid(action.value).name());
190 return absl::InvalidArgumentError(error_message);
193 template <
typename T>
195 if constexpr (std::is_same_v<T, uint8_t>) {
198 }
else if constexpr (std::is_same_v<T, uint16_t>) {
201 }
else if constexpr (std::is_same_v<T, std::vector<uint8_t>>) {
205 return absl::OkStatus();
210 throw std::out_of_range(
"Rom index out of range");
242 return kVersionConstantsMap.at(
version_);
255 unsigned long size_ = 0;
258 std::string
title_ =
"ROM not loaded";
307 Rom& rom,
bool defer_render =
false);
310 Rom& rom, std::array<gfx::Bitmap, kNumGfxSheets>& gfx_sheets);
The Rom class is used to load, save, and modify Rom data. This is a generic SNES ROM container and do...
absl::StatusOr< std::vector< uint8_t > > ReadByteVector(uint32_t offset, uint32_t length) const
project::ResourceLabelManager * resource_label()
auto mutable_graphics_buffer()
absl::Status ReadTransaction(T &var, int address, Args &&... args)
absl::Status LoadFromFile(const std::string &filename, const LoadOptions &options=LoadOptions::Defaults())
gfx::PaletteGroupMap palette_groups_
absl::StatusOr< gfx::Tile16 > ReadTile16(uint32_t tile16_id, uint32_t tile16_ptr)
absl::Status WriteColor(uint32_t address, const gfx::SnesColor &color)
auto mutable_palette_group()
absl::Status WriteByte(int addr, uint8_t value)
absl::Status WriteTile16(int tile16_id, uint32_t tile16_ptr, const gfx::Tile16 &tile)
void set_dirty(bool dirty)
absl::Status LoadZelda3()
std::array< std::array< uint8_t, 4 >, kNumSpritesets > spriteset_ids
const auto & vector() const
std::array< std::array< uint8_t, 4 >, kNumPalettesets > paletteset_ids
auto mutable_dungeon_palette(int i)
absl::StatusOr< uint16_t > ReadWord(int offset)
const auto & palette_group() const
absl::Status WriteVector(int addr, std::vector< uint8_t > data)
absl::Status WriteTransaction(Args... args)
absl::Status SaveToFile(const SaveSettings &settings)
const GraphicsLoadDiagnostics & GetDiagnostics() const
std::array< std::array< uint8_t, 4 >, kNumRoomBlocksets > room_blockset_ids
virtual absl::Status WriteHelper(const WriteAction &action)
GraphicsLoadDiagnostics & GetMutableDiagnostics()
absl::StatusOr< uint32_t > ReadLong(int offset)
std::vector< uint8_t > rom_data_
std::vector< uint8_t > graphics_buffer_
zelda3_version_pointers version_constants() const
absl::Status SaveGfxGroups()
absl::Status LoadGfxGroups()
absl::Status LoadFromData(const std::vector< uint8_t > &data, const LoadOptions &options=LoadOptions::Defaults())
const auto & graphics_buffer() const
absl::Status ReadHelper(T &var, int address)
absl::Status SavePalette(int index, const std::string &group_name, gfx::SnesPalette &palette)
absl::StatusOr< uint8_t > ReadByte(int offset)
absl::Status WriteShort(int addr, uint16_t value)
project::ResourceLabelManager resource_label_manager_
auto dungeon_palette(int i)
uint8_t & operator[](unsigned long i)
absl::Status InitializeForTesting()
auto set_filename(std::string_view name)
absl::Status WriteWord(int addr, uint16_t value)
virtual absl::Status WriteHelper(const WriteAction &action)
absl::Status WriteLong(uint32_t addr, uint32_t value)
GraphicsLoadDiagnostics diagnostics_
std::array< std::array< uint8_t, 8 >, kNumMainBlocksets > main_blockset_ids
absl::Status SaveAllPalettes()
Represents a palette of colors for the Super Nintendo Entertainment System (SNES).
Tile composition of four 8x8 tiles.
zelda3_version
Different versions of the game supported by YAZE.
#define ASSIGN_OR_RETURN(type_variable_name, expression)
constexpr uint32_t kMaxGraphics
constexpr uint32_t kGfxGroupsPointer
constexpr uint32_t kUncompressedSheetSize
absl::StatusOr< std::vector< uint8_t > > Load2BppGraphics(const Rom &rom)
Loads 2bpp graphics from Rom data.
absl::StatusOr< std::array< gfx::Bitmap, kNumLinkSheets > > LoadLinkGraphics(const Rom &rom)
Loads the players 4bpp graphics sheet from Rom data.
uint32_t GetGraphicsAddress(const uint8_t *data, uint8_t addr, uint32_t ptr1, uint32_t ptr2, uint32_t ptr3, size_t rom_size)
Calculates ROM offset for a graphics sheet using pointer tables.
constexpr uint32_t kNumLinkSheets
constexpr uint32_t kNormalGfxSpaceStart
constexpr uint32_t kEntranceGfxGroup
constexpr uint32_t kFontSpriteLocation
constexpr uint32_t kNumSpritesets
constexpr uint32_t kTile16Ptr
constexpr uint32_t kNumMainBlocksets
constexpr uint32_t kNumRoomBlocksets
absl::StatusOr< gfx::Bitmap > LoadFontGraphics(const Rom &rom)
constexpr uint32_t kNumGfxSheets
absl::StatusOr< std::array< gfx::Bitmap, kNumGfxSheets > > LoadAllGraphicsData(Rom &rom, bool defer_render)
This function iterates over all graphics sheets in the Rom and loads them into memory....
constexpr uint32_t kNumPalettesets
constexpr uint32_t kNormalGfxSpaceEnd
absl::Status SaveAllGraphicsData(Rom &rom, std::array< gfx::Bitmap, kNumGfxSheets > &gfx_sheets)
SDL2/SDL3 compatibility layer.
#define RETURN_IF_ERROR(expr)
static RomLoadOptions AppDefaults()
bool expand_to_full_image
static RomLoadOptions CliDefaults()
static RomLoadOptions RawDataOnly()
bool load_resource_labels
std::variant< int, uint8_t, uint16_t, short, std::vector< uint8_t >, gfx::SnesColor, std::vector< gfx::SnesColor > > ValueType
Represents a mapping of palette groups.
PaletteGroup dungeon_main
auto mutable_palette(int i)
ROM data pointers for different game versions.
The Legend of Zelda: A Link to the Past - Data Structures and Constants.