17#include "absl/status/status.h"
18#include "absl/status/statusor.h"
19#include "absl/strings/match.h"
20#include "absl/strings/str_format.h"
21#include "absl/strings/string_view.h"
48static const std::map<zelda3_version, zelda3_version_pointers>
49 kVersionConstantsMap = {
81 absl::Status
SaveToFile(
bool backup,
bool save_new =
false,
91 absl::Status
SavePalette(
int index,
const std::string& group_name,
111 return absl::OkStatus();
114 absl::StatusOr<uint8_t>
ReadByte(
int offset);
115 absl::StatusOr<uint16_t>
ReadWord(
int offset);
116 absl::StatusOr<uint32_t>
ReadLong(
int offset);
117 absl::StatusOr<std::vector<uint8_t>>
ReadByteVector(uint32_t offset,
118 uint32_t length)
const;
119 absl::StatusOr<gfx::Tile16>
ReadTile16(uint32_t tile16_id);
122 absl::Status
WriteByte(
int addr, uint8_t value);
123 absl::Status
WriteWord(
int addr, uint16_t value);
124 absl::Status
WriteShort(
int addr, uint16_t value);
125 absl::Status
WriteLong(uint32_t addr, uint32_t value);
129 template <
typename... Args>
137 template <
typename T,
typename... Args>
143 if constexpr (
sizeof...(args) > 0) {
150 if (i >=
size_)
throw std::out_of_range(
"Rom index out of range");
155 if (!absl::StrContains(
filename_,
".sfc") &&
185 return kVersionConstantsMap.at(
version_);
195 std::variant<int, uint8_t, uint16_t, short, std::vector<uint8_t>,
202 if (std::holds_alternative<uint8_t>(action.
value)) {
204 }
else if (std::holds_alternative<uint16_t>(action.
value) ||
205 std::holds_alternative<short>(action.
value)) {
207 }
else if (std::holds_alternative<std::vector<uint8_t>>(action.
value)) {
209 std::get<std::vector<uint8_t>>(action.
value));
210 }
else if (std::holds_alternative<gfx::SnesColor>(action.
value)) {
212 }
else if (std::holds_alternative<std::vector<gfx::SnesColor>>(
214 return absl::UnimplementedError(
215 "WriteHelper: std::vector<gfx::SnesColor>");
217 auto error_message = absl::StrFormat(
"Invalid write argument type: %s",
218 typeid(action.
value).name());
219 return absl::InvalidArgumentError(error_message);
222 template <
typename T>
224 if constexpr (std::is_same_v<T, uint8_t>) {
227 }
else if constexpr (std::is_same_v<T, uint16_t>) {
230 }
else if constexpr (std::is_same_v<T, std::vector<uint8_t>>) {
234 return absl::OkStatus();
305 Rom& rom,
bool defer_render =
false);
308 Rom& rom, std::array<gfx::Bitmap, kNumGfxSheets>& gfx_sheets);
332 uint32_t temp = (addr & 0x7FFF) + ((addr / 2) & 0xFF8000);
337 uint8_t* b =
reinterpret_cast<uint8_t*
>(&addr);
338 b[2] =
static_cast<uint8_t
>(b[2] * 2);
351 (
PcToSnes(addr) & 0xFF0000) | (data[addr + 1] << 8) | data[addr];
359 return (bank << 16) | (high << 8) | low;
364 result = (bank << 16) | addr;
virtual ~GraphicsSheetManager()=default
GraphicsSheetManager()=default
std::array< gfx::Bitmap, kNumGfxSheets > gfx_sheets_
auto mutable_gfx_sheets()
static GraphicsSheetManager & GetInstance()
auto mutable_gfx_sheet(int i)
std::array< gfx::Bitmap, kNumGfxSheets > & gfx_sheets()
The Rom class is used to load, save, and modify Rom data.
absl::StatusOr< std::vector< uint8_t > > ReadByteVector(uint32_t offset, uint32_t length) const
absl::Status LoadFromFile(const std::string &filename, bool z3_load=true)
auto mutable_graphics_buffer()
absl::Status ReadTransaction(T &var, int address, Args &&... args)
absl::Status SaveGroupsToRom()
std::vector< uint8_t > rom_data_
std::vector< uint8_t > graphics_buffer() const
gfx::PaletteGroupMap palette_groups_
auto palette_group() const
absl::StatusOr< gfx::Tile16 > ReadTile16(uint32_t tile16_id)
absl::Status WriteColor(uint32_t address, const gfx::SnesColor &color)
auto mutable_palette_group()
absl::Status LoadFromData(const std::vector< uint8_t > &data, bool z3_load=true)
absl::Status WriteByte(int addr, uint8_t value)
absl::Status SaveToFile(bool backup, bool save_new=false, std::string filename="")
Saves the Rom data to a file.
absl::Status LoadZelda3()
std::array< std::array< uint8_t, 4 >, kNumSpritesets > spriteset_ids
ResourceLabelManager * resource_label()
std::array< std::array< uint8_t, 4 >, kNumPalettesets > paletteset_ids
auto mutable_dungeon_palette(int i)
absl::StatusOr< uint16_t > ReadWord(int offset)
absl::Status WriteVector(int addr, std::vector< uint8_t > data)
absl::Status WriteTile16(int tile16_id, const gfx::Tile16 &tile)
absl::Status WriteTransaction(Args... args)
auto set_filename(std::string name)
std::array< std::array< uint8_t, 4 >, kNumRoomBlocksets > room_blockset_ids
virtual absl::Status WriteHelper(const WriteAction &action)
absl::StatusOr< uint32_t > ReadLong(int offset)
std::vector< uint8_t > graphics_buffer_
zelda3_version_pointers version_constants() const
ResourceLabelManager resource_label_manager_
absl::Status LoadGfxGroups()
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)
auto dungeon_palette(int i)
uint8_t & operator[](unsigned long i)
absl::Status WriteWord(int addr, uint16_t value)
absl::Status WriteLong(uint32_t addr, uint32_t value)
std::array< std::array< uint8_t, 8 >, kNumMainBlocksets > main_blockset_ids
absl::Status SaveAllPalettes()
Saves all palettes in the Rom.
virtual ~SharedRom()=default
static std::shared_ptr< Rom > shared_rom_
std::shared_ptr< Rom > shared_rom()
Represents a palette of colors for the Super Nintendo Entertainment System (SNES).
Tile composition of four 8x8 tiles.
#define ASSIGN_OR_RETURN(type_variable_name, expression)
Main namespace for the application.
uint32_t PcToSnes(uint32_t addr)
uint32_t MapBankToWordAddress(uint8_t bank, uint16_t addr) noexcept
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.
constexpr uint32_t kFastRomRegion
absl::StatusOr< std::array< gfx::Bitmap, kNumLinkSheets > > LoadLinkGraphics(const Rom &rom)
Loads the players 4bpp graphics sheet from Rom data.
constexpr uint32_t kNumLinkSheets
constexpr uint32_t kNormalGfxSpaceStart
constexpr uint32_t kEntranceGfxGroup
constexpr uint32_t kFontSpriteLocation
uint32_t Get24LocalFromPC(uint8_t *data, int addr, bool pc=true)
constexpr uint32_t kNumSpritesets
int AddressFromBytes(uint8_t bank, uint8_t high, uint8_t low) noexcept
constexpr uint32_t kTile16Ptr
constexpr uint32_t kNumMainBlocksets
constexpr uint32_t kNumRoomBlocksets
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)
uint32_t SnesToPc(uint32_t addr) noexcept
std::variant< int, uint8_t, uint16_t, short, std::vector< uint8_t >, gfx::SnesColor, std::vector< gfx::SnesColor > > value
Represents a mapping of palette groups.
Pointers for each version of the game.
zelda3_version
Different versions of the game supported by yaze.