1#ifndef YAZE_APP_DATA_OVERWORLD_H
2#define YAZE_APP_DATA_OVERWORLD_H
10#include <unordered_map>
13#include "absl/status/status.h"
14#include "absl/status/statusor.h"
256 return storage_bytes <= 0 ? 0
301 return address >= 0 &&
static_cast<size_t>(address) < rom.
size();
308 return rom.
data()[address];
331 const uint8_t entrance_flag =
378 return map_index & 0x3F;
382 return static_cast<uint8_t
>(parent_index & 0x3F);
406 const Rom& rom,
bool* expanded =
nullptr);
418 : zelda3_version::US);
552 int i,
int parent_x_pos,
int parent_y_pos,
int transition_target_north,
553 int transition_target_west,
int transition_pos_x,
int transition_pos_y,
554 int screen_change_1,
int screen_change_2,
int screen_change_3,
555 int screen_change_4);
559 int i,
int parent_x_pos,
int parent_y_pos,
int transition_target_north,
560 int transition_target_west,
int transition_pos_x,
int transition_pos_y,
561 int screen_change_1,
int screen_change_2,
int screen_change_3,
562 int screen_change_4);
566 int i,
int parent_x_pos,
int parent_y_pos,
int transition_target_north,
567 int transition_target_west,
int transition_pos_x,
int transition_pos_y,
568 int screen_change_1,
int screen_change_2,
int screen_change_3,
569 int screen_change_4);
573 int i,
int parent_x_pos,
int parent_y_pos,
int transition_target_north,
574 int transition_target_west,
int transition_pos_x,
int transition_pos_y,
575 int screen_change_1,
int screen_change_2,
int screen_change_3,
576 int screen_change_4);
603 bool enable_main_palette,
605 bool enable_gfx_groups,
606 bool enable_subscreen_overlay,
607 bool enable_animated);
722 switch (world_type) {
755 if (state < 0 || state >= 3)
756 return std::vector<Sprite>{};
760 if (state < 0 || state >= 3)
761 return static_cast<std::vector<Sprite>*
>(
nullptr);
765 static const std::vector<uint8_t> kEmpty;
770 const std::vector<OverworldEntrance>&
entrances()
const {
787 static const std::vector<uint8_t> kEmpty;
793 static const std::vector<uint8_t> kEmpty;
822 void SetTile(
int x,
int y, uint16_t tile_id) {
857 const uint32_t* map32address);
865 std::vector<uint8_t>& bytes2,
int i,
int sx,
int sy,
911 std::array<uint64_t, std::tuple_size_v<OverworldTilesetKey>>;
The Rom class is used to load, save, and modify Rom data. This is a generic SNES ROM container and do...
rom::LyraLayoutInspection InspectLyraLayout() const
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.
std::vector< uint64_t > deleted_entrances_
absl::Status SaveMap32Expanded()
Save expanded tile32 definitions (v1+ ROMs)
absl::Status BuildMapWithTilesetCache(int map_index, int world_type)
absl::Status DecompressAllMapTilesParallel()
std::vector< uint16_t > tiles32_list_
void InvalidateTilesetCacheForSheet(int sheet)
Drop cached tilesets that load sheet (graphics sheet edits). Built maps keep their pixels; mark them ...
void set_current_world(int world)
int GetTileFromPosition(ImVec2 position) const
bool staged_map_tiles_valid_
rom::LyraLayoutInspection descriptor_layout_
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
void SyncAreaProperties(int map_index)
Copy the area parent's render settings (main palette, animated GFX, tile GFX groups,...
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()
Drop every cached tileset/blockset. Call after graphics buffer or tile16 edits that are not tied to o...
const std::vector< OverworldEntrance > & holes() const
absl::Status SaveMap32Tiles()
Save tile32 definitions to ROM.
std::map< OverworldTilesetKey, TilesetCacheEntry > tileset_cache_
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)
absl::Status SaveSprites()
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.
void StageSavedMapTiles()
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)
bool is_lyra_preview() const
auto expanded_tile16() const
std::array< uint8_t, kNumTileTypes > all_tiles_types_
int inspected_map_count() const
absl::StatusOr< SubscreenOverlayLayer > BuildSubscreenOverlayLayer(int map_index)
Build the subscreen overlay layer for a screen (builds the screen if needed). The overlay comes from ...
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
size_t tileset_cache_size() const
Number of cached tileset entries (for tests and diagnostics).
const std::vector< uint8_t > & tile16_blockset_data() const
uint64_t Tiles16Fingerprint() const
void SetGraphicsPreview(OverworldGraphicsPreview preview)
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.
uint64_t tileset_cache_clock_
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)
absl::StatusOr< OverworldSpriteSavePlan > PrepareSpriteSave() const
void FillBlankMapTiles(int map_index)
auto mutable_overworld_map(int i)
bool MapTilesUnchanged() const
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.
void RollbackSavedMapTiles()
std::vector< OverworldMap > overworld_maps_
OverworldMapTiles loaded_map_tiles_
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)
void CommitSavedMapTiles()
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)
absl::Status LoadLyraTerrainPreview(Rom *rom)
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()
TilesetRevisions SheetRevisionsForKey(const OverworldTilesetKey &key) const
OverworldGraphicsPreview graphics_preview_
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
bool loaded_map_tiles_valid_
void set_game_state(int state)
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)
absl::Status BuildLyraTerrainPreview(Rom *rom, rom::LyraLayoutInspection layout)
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
static constexpr size_t kMaxCachedTilesets
DiggableTiles diggable_tiles_
static constexpr int kMaxBuiltMaps
std::array< std::array< bool, 160 >, 3 > sprite_maps_loaded_
OverworldBlockset & GetMapTiles(int world_type)
OverworldMapTiles staged_map_tiles_
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_
std::array< uint64_t, std::tuple_size_v< OverworldTilesetKey > > TilesetRevisions
bool descriptor_sprite_display_available() const
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
std::array< uint8_t, 17 > OverworldTilesetKey
constexpr int overworldSpecialSpriteGFXGroupExpandedTemp
constexpr int kOverworldSpecialPalGroup
constexpr int kOverworldScreenSizeForLoading
constexpr int kOverworldSpritePaletteIds
std::map< int, AreaGraphicsPreview > OverworldGraphicsPreview
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
absl::StatusOr< std::vector< gfx::Tile16 > > ReadMap16Tiles(const Rom &rom, bool *expanded)
Represents the full Overworld data, light and dark world.
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
LyraLayoutPresence presence
Overworld map tile32 data.
OverworldBlockset dark_world
OverworldBlockset special_world
OverworldBlockset light_world
rom::LyraLayoutInspection lyra_layout
bool has_tail_map_expansion
bool supports_custom_bg_colors
bool supports_expanded_space
bool has_expanded_entrances
Subscreen overlay layer for one screen, in that screen's palette.
std::vector< uint8_t > pixels
std::vector< uint8_t > tile16_blockset
TilesetRevisions sheet_revisions
std::vector< uint8_t > current_gfx
uint64_t tiles16_fingerprint
ROM data pointers for different game versions.