1#ifndef YAZE_APP_DATA_OVERWORLD_H
2#define YAZE_APP_DATA_OVERWORLD_H
9#include <unordered_map>
12#include "absl/status/status.h"
13#include "absl/status/statusor.h"
254 return storage_bytes <= 0 ? 0
296 return address >= 0 &&
static_cast<size_t>(address) < rom.
size();
303 return rom.
data()[address];
325 const uint8_t entrance_flag =
365 return map_index & 0x3F;
369 return static_cast<uint8_t
>(parent_index & 0x3F);
399 : zelda3_version::US);
442 void CacheTileset(uint64_t config_hash,
const std::vector<uint8_t>& tileset);
482 int i,
int parent_x_pos,
int parent_y_pos,
int transition_target_north,
483 int transition_target_west,
int transition_pos_x,
int transition_pos_y,
484 int screen_change_1,
int screen_change_2,
int screen_change_3,
485 int screen_change_4);
489 int i,
int parent_x_pos,
int parent_y_pos,
int transition_target_north,
490 int transition_target_west,
int transition_pos_x,
int transition_pos_y,
491 int screen_change_1,
int screen_change_2,
int screen_change_3,
492 int screen_change_4);
496 int i,
int parent_x_pos,
int parent_y_pos,
int transition_target_north,
497 int transition_target_west,
int transition_pos_x,
int transition_pos_y,
498 int screen_change_1,
int screen_change_2,
int screen_change_3,
499 int screen_change_4);
503 int i,
int parent_x_pos,
int parent_y_pos,
int transition_target_north,
504 int transition_target_west,
int transition_pos_x,
int transition_pos_y,
505 int screen_change_1,
int screen_change_2,
int screen_change_3,
506 int screen_change_4);
533 bool enable_main_palette,
535 bool enable_gfx_groups,
536 bool enable_subscreen_overlay,
537 bool enable_animated);
647 switch (world_type) {
680 if (state < 0 || state >= 3)
681 return std::vector<Sprite>{};
685 if (state < 0 || state >= 3)
686 return static_cast<std::vector<Sprite>*
>(
nullptr);
690 static const std::vector<uint8_t> kEmpty;
695 const std::vector<OverworldEntrance>&
entrances()
const {
712 static const std::vector<uint8_t> kEmpty;
718 static const std::vector<uint8_t> kEmpty;
745 void SetTile(
int x,
int y, uint16_t tile_id) {
780 const uint32_t* map32address);
788 std::vector<uint8_t>& bytes2,
int i,
int sx,
int sy,
The Rom class is used to load, save, and modify Rom data. This is a generic SNES ROM container and do...
static RomSettings & Get()
uint32_t GetAddressOr(const std::string &key, uint32_t default_value) const
Represents a palette of colors for the Super Nintendo Entertainment System (SNES).
Manages diggable tile state as a 512-bit bitfield.
Represents a single Overworld map screen.
static bool SupportsCustomBGColors(OverworldVersion version)
Check if ROM supports custom background colors per area (v2+)
static OverworldVersion GetVersion(const Rom &rom)
Detect ROM version from ASM marker byte.
static uint8_t GetAsmVersion(const Rom &rom)
Get raw ASM version byte from ROM.
static bool SupportsAreaEnum(OverworldVersion version)
Check if ROM supports area enum system (v3+ only)
static bool SupportsExpandedSpace(OverworldVersion version)
Check if ROM uses expanded ROM space for overworld data.
Represents the full Overworld data, light and dark world.
std::vector< uint64_t > deleted_entrances_
absl::Status SaveMap32Expanded()
Save expanded tile32 definitions (v1+ ROMs)
absl::Status DecompressAllMapTilesParallel()
std::vector< uint16_t > tiles32_list_
void set_current_world(int world)
int GetTileFromPosition(ImVec2 position) const
auto mutable_deleted_entrances()
absl::Status Load(Rom *rom)
Load all overworld data from ROM.
int current_world() const
std::vector< OverworldItem > all_items_
void OrganizeMapTiles(std::vector< uint8_t > &bytes, std::vector< uint8_t > &bytes2, int i, int sx, int sy, int &ttpos)
auto expanded_tile32() const
zelda3_version_pointers version_constants() const
Get version-specific ROM addresses.
std::array< int, kNumOverworldMaps > map_pointers1
std::vector< gfx::Tile32 > tiles32_unique_
const std::vector< uint8_t > & current_graphics() const
auto deleted_entrances() const
absl::Status SaveMapProperties()
Save per-area graphics, palettes, and messages.
std::vector< std::pair< uint32_t, uint32_t > > GetProjectedWriteRanges() const
Get the projected write ranges (PC offsets) for overworld map saves.
void ClearGraphicsConfigCache()
Clear entire graphics config cache Call when palette or graphics settings change globally.
const std::vector< OverworldEntrance > & holes() const
absl::Status SaveMap32Tiles()
Save tile32 definitions to ROM.
const gfx::SnesPalette & current_area_palette() const
std::vector< OverworldEntrance > all_entrances_
absl::Status SaveTallAreaTransitions(int i, int parent_x_pos, int parent_y_pos, int transition_target_north, int transition_target_west, int transition_pos_x, int transition_pos_y, int screen_change_1, int screen_change_2, int screen_change_3, int screen_change_4)
Save screen transition data for tall (1x2) areas (v3+ only)
OverworldMapTiles map_tiles_
absl::Status SaveMap16Tiles()
Save tile16 definitions to ROM.
absl::Status SaveAreaSizes()
Save area size enum data (v3+ only)
DiggableTiles * mutable_diggable_tiles()
auto sprites(int state) const
void InvalidateSiblingMapCaches(int map_index)
Invalidate cached tilesets for a map and all its siblings.
absl::Status SaveLargeMaps()
Save large map parent/sibling relationships.
const std::vector< gfx::Tile16 > & tiles16() const
std::array< uint8_t, kNumOverworldMaps > map_parent_
void AssignWorldTiles(int x, int y, int sx, int sy, int tpos, OverworldBlockset &world)
absl::Status SaveDiggableTiles()
void InvalidateMapCache(int map_index)
Invalidate cached tileset for a specific map.
void SetGameData(GameData *game_data)
Overworld(Rom *rom, GameData *game_data=nullptr)
auto expanded_tile16() const
std::array< uint8_t, kNumTileTypes > all_tiles_types_
std::unordered_map< uint64_t, GraphicsConfigCache > gfx_config_cache_
void LoadTileTypes()
Load tile type collision data.
absl::Status CreateTile32Tilemap()
Build tile32 tilemap from current tile16 data.
const std::vector< OverworldMap > & overworld_maps() const
std::array< int, kNumOverworldMaps > map_pointers1_id
auto overworld_map(int i) const
int current_map_id() const
const std::vector< uint8_t > * GetCachedTileset(uint64_t config_hash)
Try to get cached tileset data for a graphics configuration.
const std::vector< uint8_t > & tile16_blockset_data() const
absl::Status SaveLargeAreaTransitions(int i, int parent_x_pos, int parent_y_pos, int transition_target_north, int transition_target_west, int transition_pos_x, int transition_pos_y, int screen_change_1, int screen_change_2, int screen_change_3, int screen_change_4)
Save screen transition data for large (2x2) areas.
OverworldBlockset & SelectWorldBlockset(int world_type)
bool HasExpandedPointerTables() const
Check if the ROM has expanded pointer tables for tail maps.
static constexpr int kMaxCachedConfigs
auto all_tiles_types() const
absl::Status SaveCustomOverworldASM(bool enable_bg_color, bool enable_main_palette, bool enable_mosaic, bool enable_gfx_groups, bool enable_subscreen_overlay, bool enable_animated)
Save custom ASM feature enable flags.
absl::Status SaveCustomOverworldData()
Save all v2/v3 property tables using the ROM's current feature flags.
void set_current_map(int i)
void FillBlankMapTiles(int map_index)
auto mutable_overworld_map(int i)
absl::Status SaveEntrances()
Save entrance warp points to ROM.
absl::Status SaveExits()
Save exit return points to ROM.
absl::Status LoadSprites()
Load sprite data for all game states.
absl::Status EnsureMapBuilt(int map_index)
Build a map on-demand if it hasn't been built yet.
uint64_t ComputeGraphicsConfigHash(int map_index)
Compute hash of graphics configuration for cache lookup.
std::vector< OverworldMap > overworld_maps_
void CacheTileset(uint64_t config_hash, const std::vector< uint8_t > &tileset)
Cache tileset data for future reuse.
absl::Status SaveItems()
Save hidden overworld items to ROM.
absl::Status SaveAreaSpecificBGColors()
Save per-area background colors (v2+)
absl::Status LoadDiggableTiles()
absl::Status Save(Rom *rom)
Master save method (calls sub-methods in correct order)
std::vector< gfx::Tile32 > tiles32_
absl::Status SaveWideAreaTransitions(int i, int parent_x_pos, int parent_y_pos, int transition_target_north, int transition_target_west, int transition_pos_x, int transition_pos_y, int screen_change_1, int screen_change_2, int screen_change_3, int screen_change_4)
Save screen transition data for wide (2x1) areas (v3+ only)
uint16_t GetTile(int x, int y) const
absl::Status SaveOverworldMaps()
Save compressed map tile data to ROM.
auto mutable_all_tiles_types()
std::array< std::vector< Sprite >, 3 > all_sprites_
OverworldVersion cached_version_
std::array< int, kNumOverworldMaps > map_pointers2_id
auto tiles32_unique() const
void SetTile(int x, int y, uint16_t tile_id)
absl::Status LoadOverworldMaps()
Load overworld map tile data.
std::vector< gfx::Tile16 > tiles16_
absl::Status AutoDetectDiggableTiles()
auto expanded_entrances() const
absl::Status AssembleMap16Tiles()
std::mutex map_tiles_mutex_
const std::vector< uint8_t > & current_map_bitmap_data() const
auto mutable_sprites(int state)
absl::Status LoadSpritesFromMap(int sprite_start, int sprite_count, int sprite_index)
Load sprites from a specific map range.
const DiggableTiles & diggable_tiles() const
const std::vector< OverworldEntrance > & entrances() const
std::array< std::vector< uint8_t >, kNumOverworldMaps > map_data_p1
absl::Status SaveLargeMapsExpanded()
Save expanded large map data (v1+ ROMs)
void AssignMapSizes(std::vector< OverworldMap > &maps)
Assign map sizes based on area size enum (v3+)
absl::Status SaveMap16Expanded()
Save expanded tile16 definitions (v1+ ROMs)
std::vector< OverworldExit > all_exits_
std::array< int, kNumOverworldMaps > map_pointers2
absl::StatusOr< uint16_t > GetTile16ForTile32(int index, int quadrant, int dimension, const uint32_t *map32address)
std::array< std::vector< uint8_t >, kNumOverworldMaps > map_data_p2
absl::Status SaveSmallAreaTransitions(int i, int parent_x_pos, int parent_y_pos, int transition_target_north, int transition_target_west, int transition_pos_x, int transition_pos_y, int screen_change_1, int screen_change_2, int screen_change_3, int screen_change_4)
Save screen transition data for small (1x1) areas.
std::deque< int > built_map_lru_
absl::Status SaveMapOverlays()
Save interactive overlay data to ROM.
absl::Status AssembleMap32Tiles()
bool is_current_map_valid() const
DiggableTiles diggable_tiles_
static constexpr int kMaxBuiltMaps
OverworldBlockset & GetMapTiles(int world_type)
absl::Status SaveOverworldTilesType()
Save tile type collision data to ROM.
absl::Status SaveMusic()
Save per-area music IDs.
absl::Status ConfigureMultiAreaMap(int parent_index, AreaSizeEnum size)
Configure a multi-area map structure (Large/Wide/Tall)
std::vector< OverworldEntrance > all_holes_
constexpr char kOverworldExpandedPtrHigh[]
constexpr char kOverworldMap16Expanded[]
constexpr char kOverworldExpandedPtrMagic[]
constexpr char kOverworldMap32BlExpanded[]
constexpr char kOverworldExpandedPtrMarker[]
constexpr char kOverworldMap32TrExpanded[]
constexpr char kOverworldExpandedPtrLow[]
constexpr char kOverworldMap32BrExpanded[]
Zelda 3 specific classes and functions.
constexpr int overworldSpecialSpritePaletteExpandedTemp
constexpr int kAreaGfxIdPtr
constexpr int kOverworldSpritePaletteGroup
constexpr int kOverworldTransitionPositionY
constexpr int kNumMapsPerWorld
constexpr int kOverworldSpriteset
int GetMap32TileBRExpanded()
bool IsValidRomAddress(const Rom &rom, int address)
constexpr int kMap16ExpandedFlagPos
constexpr int LimitOfMap32
constexpr int NumberOfMap16Ex
constexpr int kOverworldScreenTileMapChangeByScreen1
constexpr int kOverworldMapDataOverflow
int LegacyParentTableIndexForMap(int map_index)
constexpr int kMap32BytesPerPackedGroup
constexpr int kOverworldMapSizeHighByte
constexpr int overworldMessagesExpanded
constexpr int GravesTilemapPos
constexpr int overworldSpritesBeginingExpanded
constexpr int kNumTileTypes
uint8_t ReadRomByteOr(const Rom &rom, int address, uint8_t fallback)
constexpr int NumberOfMap32
constexpr int kOverworldScreenSize
constexpr int kExpandedPtrTableLow
constexpr int kOverworldScreenTileMapChangeByScreen4
constexpr int kNumTile16Individual
int GetMap32TileTRExpanded()
constexpr int kSpecialWorldMapIdStart
constexpr int ExpandedOverlaySpace
constexpr int kMap32DefinitionCapacityVanilla
constexpr int GravesCountOnY
constexpr int kMap16Tiles
constexpr int overworldSpritesAgahnimExpanded
int GetMap32TileBLExpanded()
constexpr int kExpandedPtrTableMarker
constexpr int Map32DefinitionCapacityForStorageBytes(int storage_bytes)
constexpr int GravesYLine
constexpr int kNumOverworldMaps
int GetExpandedPtrTableHigh()
constexpr int GravesXTilePos
bool IsSpecialTailMapExpansionEnabled(const Rom &rom)
constexpr int kOverworldMusicBeginning
std::vector< std::vector< uint16_t > > OverworldBlockset
Represents tile32 data for the overworld.
int GetExpandedPtrTableMarker()
constexpr int kMap32TileBLExpanded
AreaSizeEnum
Area size enumeration for v3+ ROMs.
constexpr int kOverworldTransitionPositionX
constexpr int kOverworldMusicDarkWorld
constexpr int overworldSpecialSpriteGFXGroupExpandedTemp
constexpr int kOverworldSpecialPalGroup
constexpr int kOverworldScreenSizeForLoading
constexpr int kOverworldSpritePaletteIds
constexpr int overworldTilesType
constexpr int kMap32TileBRExpanded
constexpr int kMap32TileCountExpanded
int GetExpandedPtrTableLow()
constexpr int kTransitionTargetWest
constexpr int overworldMessages
constexpr int kMap32TileStorageBytesVanilla
constexpr int kOverworldMusicAgahnim
constexpr int kMap32TileStorageBytesExpanded
constexpr int kOverworldSpritesZelda
constexpr int kOverworldMapParentId
constexpr int GraveLinkSpecialHole
constexpr int Map32PerScreen
constexpr int kMap32ExpandedFlagPos
constexpr int kMap32DefinitionsPerPackedGroup
OverworldVersion
ROM version detection for overworld features.
@ kVanilla
0xFF in ROM, no ZScream ASM applied
bool IsSameOverworldWorld(int a, int b)
constexpr int kExpandedPtrTableHigh
constexpr int overworldCustomMosaicASM
constexpr int kOverworldMusicMasterSword
constexpr int kOverworldMusicZelda
constexpr int kOverworldMessageIds
constexpr int NumberOfMap16
constexpr int kOverworldMapSize
constexpr int kOverworldScreenTileMapChangeByScreen2
constexpr int overworldSpritesDataStartExpanded
constexpr int kDarkWorldMapIdStart
OverworldRomProfile DetectOverworldRomProfile(const Rom &rom)
int GetOverworldEntranceFlagExpanded()
bool CanPersistLegacyScreenSize(int map_index)
constexpr int kEssentialMapsPerWorld
constexpr int kOverworldCompressedMapPos
constexpr int overworldCustomMosaicArray
int WorldForOverworldMap(int map_index)
constexpr int kOverworldSpritesBeginning
constexpr int kExpandedMapCount
constexpr int kOverworldScreenTileMapChangeByScreen3
bool CanPersistLegacyMultiAreaMap(int map_index)
uint8_t LegacyParentTableValueForMap(int parent_index)
int Map32DefinitionCapacityForProfile(const OverworldRomProfile &profile)
uint8_t GetExpandedPtrTableMagic()
constexpr int kMap16TilesExpanded
constexpr uint8_t kExpandedPtrTableMagic
int Map32StorageBytesForProfile(const OverworldRomProfile &profile)
constexpr int kMap32DefinitionCapacityExpanded
constexpr int kOverworldSpritesAgahnim
int LegacyScreenSizeTableIndexForMap(int map_index)
constexpr int kTransitionTargetNorth
constexpr int overworldSpritesZeldaExpanded
constexpr int kOverworldCompressedOverflowPos
constexpr int GravesYTilePos
constexpr int NumberOfOWSprites
constexpr int kMap32TileTRExpanded
int GetMap16TilesExpanded()
constexpr int kOverworldMapPaletteIds
constexpr int kOverworldEntranceAllowedTilesLeft
constexpr int kOverworldSpecialGfxGroup
constexpr int kOverworldEntranceAllowedTilesRight
constexpr int GraveLinkSpecialStairs
Overworld map tile32 data.
OverworldBlockset dark_world
OverworldBlockset special_world
OverworldBlockset light_world
bool has_tail_map_expansion
bool supports_custom_bg_colors
bool supports_expanded_space
bool has_expanded_entrances
std::vector< uint8_t > current_gfx
ROM data pointers for different game versions.