yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
game_data.h
Go to the documentation of this file.
1#ifndef YAZE_ZELDA3_GAME_DATA_H
2#define YAZE_ZELDA3_GAME_DATA_H
3
4#include <array>
5#include <cstdint>
6#include <map>
7#include <vector>
8
9#include "absl/status/status.h"
10#include "absl/status/statusor.h"
11#include "app/gfx/core/bitmap.h"
13#include "rom/rom.h"
14#include "rom/rom_diagnostics.h"
15#include "zelda.h"
17
18namespace yaze {
19namespace zelda3 {
20
21// ============================================================================
22// Graphics Constants
23// ============================================================================
24
25// Sheet counts
26constexpr uint32_t kNumGfxSheets = 223;
27constexpr uint32_t kNumLinkSheets = 14;
28
29// Blockset/Group counts
30constexpr uint32_t kNumMainBlocksets = 37;
31constexpr uint32_t kNumRoomBlocksets = 82;
32constexpr uint32_t kNumSpritesets = 144;
33constexpr uint32_t kNumPalettesets = 72;
34
35// ROM pointer locations
36constexpr uint32_t kEntranceGfxGroup = 0x5D97;
37// Note: kGfxGroupsPointer defined in zelda3/dungeon/dungeon_rom_addresses.h
38constexpr uint32_t kMaxGraphics = 0x0C3FFF;
39
40// Dungeon palette lookup tables
41// Room headers store a "palette set ID" (0-71), NOT a direct palette index!
42// Two-level lookup: paletteset_ids[room.palette][0] gives a byte offset into
43// kDungeonPalettePointerTable. The word there, divided by 180, is the palette.
44constexpr uint32_t kPalettesetIdsAddress = 0x75460;
45constexpr uint32_t kDungeonPalettePointerTable = 0xDEC4B;
46constexpr int kDungeonPaletteBytes = 180;
47
48// Link graphics location ($10:8000)
49constexpr uint32_t kLinkGfxOffset = 0x80000;
50constexpr uint16_t kLinkGfxLength = 0x800;
51
52// Font graphics location
53constexpr uint32_t kFontSpriteLocation = 0x70000;
54
55// Sheet sizes
56constexpr uint32_t kUncompressedSheetSize = 0x0800; // 2048 bytes
57
58// Tile16 pointer location
59constexpr uint32_t kTile16Ptr = 0x78000;
60
61// Version constants map
62static const std::map<zelda3_version, zelda3_version_pointers>
63 kVersionConstantsMap = {
64 {zelda3_version::US, zelda3_us_pointers},
65 {zelda3_version::JP, zelda3_jp_pointers},
66 {zelda3_version::SD, {}},
67 {zelda3_version::RANDO, {}},
68};
69
70struct GameData {
71 // Constructors
72 GameData() = default;
73 explicit GameData(Rom* rom) : rom_(rom) {}
74
75 // ROM reference (non-owning)
76 Rom* rom() const { return rom_; }
77 void set_rom(Rom* rom) { rom_ = rom; }
78
79 // Version info
80 zelda3_version version = zelda3_version::US;
81 std::string title;
82
83 // Graphics Resources
84 std::vector<uint8_t> graphics_buffer; // Legacy contiguous buffer
85 std::array<std::vector<uint8_t>, kNumGfxSheets>
86 raw_gfx_sheets; // 8BPP indexed
87 std::array<gfx::Bitmap, kNumGfxSheets> gfx_bitmaps; // Renderable bitmaps
88 std::array<gfx::Bitmap, kNumLinkSheets> link_graphics;
90
91 // Game Data Structures
93
94 std::array<std::array<uint8_t, 8>, kNumMainBlocksets> main_blockset_ids;
95 std::array<std::array<uint8_t, 4>, kNumRoomBlocksets> room_blockset_ids;
96 std::array<std::array<uint8_t, 4>, kNumSpritesets> spriteset_ids;
97
98 // Palette set lookup table (72 entries × 4 bytes each)
99 // Entry format: [bg_palette_offset, aux1, aux2, aux3]
100 // NOTE: paletteset_ids[n][0] is a BYTE OFFSET into kDungeonPalettePointerTable,
101 // NOT a direct palette index! See room.cc for correct lookup algorithm.
102 std::array<std::array<uint8_t, 4>, kNumPalettesets> paletteset_ids;
103
104 // Diagnostics
106
107 // Global RoomsWithPitDamage membership table (bank $07).
109
110 void Clear() {
111 graphics_buffer.clear();
112 for (auto& sheet : raw_gfx_sheets)
113 sheet.clear();
114 // gfx_bitmaps don't need explicit clearing if reloaded
117 }
118
119 private:
120 Rom* rom_ = nullptr;
121};
122
124 bool load_graphics = true;
125 bool load_palettes = true;
126 bool load_gfx_groups = true;
127 bool expand_rom = true;
128 bool populate_metadata = true;
129};
130
137absl::Status LoadGameData(Rom& rom, GameData& data,
138 const LoadOptions& options = {});
139
145absl::Status SaveGameData(Rom& rom, GameData& data);
146
147// Individual loaders (internal use or fine-grained control)
148absl::Status LoadMetadata(const Rom& rom, GameData& data);
149absl::Status LoadPalettes(const Rom& rom, GameData& data);
150absl::Status LoadGfxGroups(Rom& rom, GameData& data);
151absl::Status LoadGraphics(Rom& rom, GameData& data);
152absl::Status SaveGfxGroups(Rom& rom, const GameData& data);
153
159absl::StatusOr<std::array<gfx::Bitmap, kNumLinkSheets>> LoadLinkGraphics(
160 const Rom& rom);
161
167absl::StatusOr<std::vector<uint8_t>> Load2BppGraphics(const Rom& rom);
168
174absl::StatusOr<gfx::Bitmap> LoadFontGraphics(const Rom& rom);
175
182absl::Status SaveAllGraphicsData(
183 Rom& rom, const std::array<gfx::Bitmap, kNumGfxSheets>& sheets);
184
195uint32_t GetGraphicsAddress(const uint8_t* data, uint8_t addr, uint32_t ptr1,
196 uint32_t ptr2, uint32_t ptr3, size_t rom_size);
197
198} // namespace zelda3
199} // namespace yaze
200
201#endif // YAZE_ZELDA3_GAME_DATA_H
The Rom class is used to load, save, and modify Rom data. This is a generic SNES ROM container and do...
Definition rom.h:28
Represents a bitmap image optimized for SNES ROM hacking.
Definition bitmap.h:67
zelda3_version
Different versions of the game supported by YAZE.
Definition zelda.h:33
absl::Status SaveGfxGroups(Rom &rom, const GameData &data)
Definition game_data.cc:266
absl::StatusOr< std::vector< uint8_t > > Load2BppGraphics(const Rom &rom)
Loads 2BPP graphics sheets from ROM.
Definition game_data.cc:565
constexpr uint32_t kPalettesetIdsAddress
Definition game_data.h:44
constexpr uint16_t kLinkGfxLength
Definition game_data.h:50
constexpr uint32_t kFontSpriteLocation
Definition game_data.h:53
absl::StatusOr< std::array< gfx::Bitmap, kNumLinkSheets > > LoadLinkGraphics(const Rom &rom)
Loads Link's graphics sheets from ROM.
Definition game_data.cc:539
absl::StatusOr< gfx::Bitmap > LoadFontGraphics(const Rom &rom)
Loads font graphics from ROM.
Definition game_data.cc:609
constexpr uint32_t kNumRoomBlocksets
Definition game_data.h:31
constexpr uint32_t kUncompressedSheetSize
Definition game_data.h:56
absl::Status LoadGameData(Rom &rom, GameData &data, const LoadOptions &options)
Loads all Zelda3-specific game data from a generic ROM.
Definition game_data.cc:123
absl::Status LoadMetadata(const Rom &rom, GameData &data)
Definition game_data.cc:184
constexpr uint32_t kMaxGraphics
Definition game_data.h:38
constexpr uint32_t kTile16Ptr
Definition game_data.h:59
constexpr uint32_t kNumPalettesets
Definition game_data.h:33
absl::Status SaveAllGraphicsData(Rom &rom, const std::array< gfx::Bitmap, kNumGfxSheets > &sheets)
Saves all graphics sheets back to ROM.
Definition game_data.cc:633
constexpr uint32_t kLinkGfxOffset
Definition game_data.h:49
constexpr int kDungeonPaletteBytes
Definition game_data.h:46
constexpr uint32_t kNumMainBlocksets
Definition game_data.h:30
constexpr uint32_t kNumGfxSheets
Definition game_data.h:26
constexpr uint32_t kEntranceGfxGroup
Definition game_data.h:36
constexpr uint32_t kNumSpritesets
Definition game_data.h:32
constexpr uint32_t kNumLinkSheets
Definition game_data.h:27
absl::Status LoadPalettes(const Rom &rom, GameData &data)
Definition game_data.cc:208
absl::Status SaveGameData(Rom &rom, GameData &data)
Saves modified game data back to the ROM.
Definition game_data.cc:155
absl::Status LoadGraphics(Rom &rom, GameData &data)
Definition game_data.cc:459
constexpr uint32_t kDungeonPalettePointerTable
Definition game_data.h:45
uint32_t GetGraphicsAddress(const uint8_t *data, uint8_t addr, uint32_t ptr1, uint32_t ptr2, uint32_t ptr3, size_t rom_size)
Gets the graphics address for a sheet index.
Definition game_data.cc:112
absl::Status LoadGfxGroups(Rom &rom, GameData &data)
Definition game_data.cc:214
Represents a mapping of palette groups.
std::array< std::array< uint8_t, 4 >, kNumSpritesets > spriteset_ids
Definition game_data.h:96
void set_rom(Rom *rom)
Definition game_data.h:77
std::array< std::array< uint8_t, 4 >, kNumRoomBlocksets > room_blockset_ids
Definition game_data.h:95
std::array< std::array< uint8_t, 4 >, kNumPalettesets > paletteset_ids
Definition game_data.h:102
gfx::Bitmap font_graphics
Definition game_data.h:89
gfx::PaletteGroupMap palette_groups
Definition game_data.h:92
GraphicsLoadDiagnostics diagnostics
Definition game_data.h:105
zelda3_version version
Definition game_data.h:80
PitDamageTable pit_damage_table
Definition game_data.h:108
std::array< gfx::Bitmap, kNumGfxSheets > gfx_bitmaps
Definition game_data.h:87
std::array< gfx::Bitmap, kNumLinkSheets > link_graphics
Definition game_data.h:88
Rom * rom() const
Definition game_data.h:76
std::array< std::array< uint8_t, 8 >, kNumMainBlocksets > main_blockset_ids
Definition game_data.h:94
std::array< std::vector< uint8_t >, kNumGfxSheets > raw_gfx_sheets
Definition game_data.h:86
std::vector< uint8_t > graphics_buffer
Definition game_data.h:84
The Legend of Zelda: A Link to the Past - Data Structures and Constants.