1#ifndef YAZE_APP_EDITOR_OVERWORLDEDITOR_H
2#define YAZE_APP_EDITOR_OVERWORLDEDITOR_H
8#include "absl/status/status.h"
37#include "imgui/imgui.h"
89struct OverworldItemsSnapshot;
95constexpr unsigned int k4BPP = 4;
106 ImGuiTableFlags_Borders | ImGuiTableFlags_Resizable |
107 ImGuiTableFlags_RowBg | ImGuiTableFlags_SizingStretchProp;
110 "Light World\0Dark World\0Extra World\0";
184 absl::Status
Load()
override;
185 absl::Status
Update() final;
186 absl::Status
Undo() override;
187 absl::Status
Redo() override;
188 absl::Status
Cut()
override {
return absl::UnimplementedError(
"Cut"); }
189 absl::Status
Copy()
override;
190 absl::Status
Paste()
override;
191 absl::Status
Find()
override {
return absl::UnimplementedError(
"Find"); }
192 absl::Status
Save()
override;
196 absl::Status
Clear()
override;
217 return "No ROM loaded";
219 return "ROM failed to load";
220 return absl::StrFormat(
"ROM loaded: %s",
rom_->
title());
342 const std::optional<OverworldContextTarget>& target);
438 ImGui::TextDisabled(
"Lyra preview: area graphics editing unavailable");
439 return absl::OkStatus();
443 return absl::FailedPreconditionError(
"Renderer not initialized");
448 ImGui::TextDisabled(
"Lyra preview: Tile16 editing unavailable");
449 return absl::OkStatus();
452 return absl::FailedPreconditionError(
"Renderer not initialized");
457 ImGui::TextDisabled(
"Lyra preview: map properties editing unavailable");
475 ImGui::TextDisabled(
"Lyra preview: Tile8 editing unavailable");
484 ImGui::TextDisabled(
"Lyra preview: overworld settings unavailable");
560 return absl::FailedPreconditionError(
561 "MapRefreshCoordinator not initialized");
570 return absl::FailedPreconditionError(
571 "MapRefreshCoordinator not initialized");
583 map_refresh_->RefreshSiblingMapGraphics(map_index, include_self);
630 void PrimeWorldMaps(
int world,
bool process_texture_queue =
false);
672 std::vector<std::pair<std::pair<int, int>,
int>>
677 void CreateUndoPoint(
int map_id,
int world,
int x,
int y,
int old_tile_id);
683 std::string description);
685 bool record_undo =
true);
687 const std::vector<OverworldPropertyEdit>& edits,
688 const std::string& description,
bool record_undo =
true);
691 const std::string& label);
791 std::string
name =
"Scratch Space";
825 std::array<gfx::Bitmap, zelda3::kExpandedMapCount>
maps_bmp_;
The Rom class is used to load, save, and modify Rom data. This is a generic SNES ROM container and do...
Interface for editor classes.
UndoManager undo_manager_
virtual void SetDependencies(const EditorDependencies &deps)
zelda3::GameData * game_data() const
EditorDependencies dependencies_
Editor-level service responsible for overworld entity mutations.
Manage graphics group configurations in a Rom.
std::function< absl::StatusOr< zelda3::RoomsetUsageReport >(int)> RoomsetUsageCallback
std::function< absl::StatusOr< zelda3::MainGroupUsageReport >(int, int)> MainUsageCallback
void SetRoomsetUsageCallback(RoomsetUsageCallback callback)
void SetMainUsageCallback(MainUsageCallback callback)
void DetachRuntimeContext()
void SetWorkspaceState(GfxGroupWorkspaceState *state)
void SetUndoManager(UndoManager *undo)
void SetGameData(zelda3::GameData *data)
Handles all canvas drawing and panel rendering for the overworld editor.
Main UI class for editing overworld maps in A Link to the Past.
void ToggleItemListWindow()
bool grid_visible() const
void LocateOverworldTile(int map_id, int world_x, int world_y)
std::unique_ptr< UsageStatisticsCard > usage_stats_card_
absl::Status Clear() override
std::unique_ptr< MapPropertiesSystem > map_properties_system_
std::unique_ptr< OverworldCanvasRenderer > canvas_renderer_
bool item_insert_popup_requested_
OverworldEntityWorkbench * GetWorkbench()
Resolve the entity workbench window content (may be null).
void HandleMapInteraction()
bool overworld_canvas_fullscreen_
bool map_blockset_loaded_
void InitMapTextureCoordinator()
absl::Status DrawScratchSpace()
std::string insert_error_
zelda3::OverworldEntranceTileTypes entrance_tiletypes_
void CenterOverworldView()
void OpenEntityContextMenu(zelda3::GameEntity *entity)
std::array< gfx::Bitmap, zelda3::kExpandedMapCount > maps_bmp_
zelda3::OverworldExit & edit_exit()
EditorContextSnapshot BuildContextSnapshot() const override
std::optional< OverworldUndoPoint > current_paint_operation_
absl::Status BeginSaveTransaction() override
void PushItemUndoAction(OverworldItemsSnapshot before, std::string description)
absl::Status CheckForCurrentMap()
Check for map changes and refresh if needed.
void CreateUndoPoint(int map_id, int world, int x, int y, int old_tile_id)
absl::Status Cut() override
void CommitSaveTransaction() override
absl::Status LoadScratchToSelection()
void ForceRefreshGraphics(int map_index)
zelda3::GameEntity * ResolveEditingEntity()
void RequestTile16Selection(int tile_id)
void RestoreItemUndoSnapshot(const OverworldItemsSnapshot &snapshot)
zelda3::Sprite & edit_sprite()
int current_tile16_id() const
std::vector< int > selected_tile16_ids_
absl::Status ApplyOverworldPropertyEdit(const OverworldPropertyEdit &edit, bool record_undo=true)
zelda3::OverworldEntrance edit_entrance_
const gfx::Tilemap & tile16_blockset() const
Read-only access for integration tests that verify refresh output.
zelda3::GameData * game_data_
gfx::Bitmap current_gfx_bmp_
gui::Canvas & ow_map_canvas()
gfx::Tilemap tile16_blockset_
absl::Status ClearScratchSpace()
void InitCanvasNavigationManager()
Initialize the canvas navigation manager (called during Initialize)
void JumpToMap(int map_id)
void InitMapRefreshCoordinator()
Initialize the map refresh coordinator (called during Initialize)
void RequestItemInsertPopup(const std::optional< OverworldContextTarget > &target)
std::optional< zelda3::OverworldItem > selected_item_identity_
void CycleTileSelection(int delta)
absl::Status RefreshMapPalette(int map_id=-1)
zelda3::OverworldBlockset refresh_blockset_
gfx::Bitmap selected_tile_bmp_
void ResetOverworldView()
zelda3::OverworldItem & edit_item()
void OpenMapPropertiesWindow()
Tile16Editor tile16_editor_
std::unique_ptr< zelda3::OverworldUpgradeSystem > upgrade_system_
void RequestJumpToEntrance(int entrance_id)
Trigger a jump to a dungeon entrance.
void DrawScratchSpaceSelection()
gui::Canvas ow_map_canvas_
absl::Status SyncProjectGraphicsPreview(bool force=false)
ScratchSpace scratch_space_
void SetDependencies(const EditorDependencies &deps) override
bool DeleteItemByIdentity(const zelda3::OverworldItem &item_identity)
void HandleEntityInsertion(const std::string &entity_type, const OverworldContextTarget &target)
Handle entity insertion from context menu.
void NotifyEntityModified(zelda3::GameEntity *entity)
Notify that an entity has been modified, marking ROM as dirty.
void SwitchToWorld(int world)
absl::Status CheckRomReplacement(const Rom &replacement) const
absl::Status Undo() override
void ToggleTile16EditorWindow()
void SetPreviewStoryState(int state)
zelda3::GameEntity * dragged_entity_
void DrawItemInsertPopup()
std::unique_ptr< MapRefreshCoordinator > map_refresh_
void MarkScratchSpaceDirty()
void SelectAdjacentMap(int dx, int dy)
Alt+Arrow: select the neighbouring screen in the world grid and center it.
std::unique_ptr< OverworldMapTextureCoordinator > map_texture_
bool is_lyra_preview() const
static bool NormalizeMapSelection(int ¤t_world, int ¤t_map)
Clamp a possibly stale world/map selection back into a valid overworld range.
bool PickTile16FromHoveredCanvas()
void RefreshOverworldMap()
void CheckForOverworldEdits()
Check for tile edits - delegates to TilePaintingManager.
void UpdateScratchBitmapTile(int tile_x, int tile_y, int tile_id)
void UpdateBlocksetWithPendingTileChanges()
UsageStatisticsCard * usage_stats_card()
Access usage statistics card for panel.
const gfx::Bitmap & map_bitmap(int map_id) const
void ContributeStatus(StatusBar *status_bar) override
EntityMutationService * entity_mutation_service()
Access the entity mutation service.
~OverworldEditor() override
void SetGameData(zelda3::GameData *game_data) override
void RefreshSiblingMapGraphics(int map_index, bool include_self=false)
void DrawScratchSpacePattern()
gui::Canvas scratch_canvas_
void PrimeWorldMaps(int world, bool process_texture_queue=false)
absl::Status FlushScratchPadIfDirty()
std::optional< zelda3::OverworldItem > selected_item_identity() const
Get current selected item identity snapshot.
bool SampleContextTile16(const OverworldContextTarget &target)
std::optional< OverworldContextTarget > item_insert_target_
absl::Status ApplyOverworldPropertyEdits(const std::vector< OverworldPropertyEdit > &edits, const std::string &description, bool record_undo=true)
int current_world_id() const
gui::Canvas * GetOverworldCanvas()
void set_current_map(int map_id)
Set the current map for editing (also updates world)
void DrawScratchSpaceEdits()
void RefreshOverworldMapOnDemand(int map_index)
void RefreshMapsForSheetEdits()
Mark maps for a graphics rebuild when a sheet they use changed in the session's sheet store (an unsav...
gui::Canvas current_gfx_canvas_
void set_current_tile16(int tile_id)
void Initialize() override
bool show_overlay_editor_
std::unique_ptr< OverworldSidebar > sidebar_
std::string & insert_error()
absl::Status Redo() override
void SetupCanvasAutomation()
void InvalidateGraphicsCache(int map_id=-1)
Invalidate cached graphics for a specific map or all maps.
bool overlay_preview_enabled() const
bool scratch_space_dirty_
DebugWindowCard * debug_window_card()
Access debug window card for panel.
std::optional< int > pending_tile16_selection_after_gfx_
void HandleTile16Edit(const OverworldContextTarget &target)
Handle tile16 editing from context menu (MOUSE mode) Opens the Tile16 captured at menu-open through t...
void SetEditingMode(EditingMode mode)
Tool change from the toolbar or keys 1/2: also leaves entity modes.
bool dragged_entity_free_movement_
absl::Status RenameProjectResourceLabelWithUndo(const std::string &type, int id, const std::string &label)
absl::Status SaveCurrentSelectionToScratch()
zelda3::OverworldItem * GetSelectedItem()
Resolve selected item identity to the current live item pointer.
bool NormalizeCurrentSelectionState()
Handle overworld keyboard shortcuts and edit-mode hotkeys.
bool DuplicateSelectedItem(int offset_x=16, int offset_y=0)
Duplicate selected item with optional pixel offset.
bool AutomationSetTile(int x, int y, int tile_id)
void DrawOverworldCanvas()
Draw the main overworld canvas.
gui::Canvas blockset_canvas_
absl::Status RefreshTile16Blockset()
void OpenEntityEditor(zelda3::GameEntity *entity)
void ToggleCanvasFullscreen()
zelda3::Overworld & overworld()
Access the underlying Overworld data.
void SetCurrentEntity(zelda3::GameEntity *entity)
Set the currently active entity for editing.
absl::Status LoadScratchPad()
void UpdateBlocksetSelectorState()
zelda3::OverworldItem edit_item_
std::optional< OverworldEntityInsertionRequest > TakePendingEntityInsertion()
std::optional< OverworldItemsSnapshot > drag_item_snapshot_
Item state before an in-progress canvas drag (drag undo).
int current_map_id() const
void RollbackSaveTransaction() override
void RefreshChildMap(int map_index)
void FinalizePaintOperation()
std::unique_ptr< OverworldEntityRenderer > entity_renderer_
auto & GetWorldTiles(int world)
std::optional< OverworldEntityInsertionRequest > pending_entity_insertion_
absl::Status Load() override
absl::Status UpdateGfxGroupEditor()
absl::Status RebuildScratchBitmapFromTileData()
void EnsureMapTexture(int map_index)
Ensure a specific map has its texture created.
const gfx::Bitmap & current_gfx_bmp_for_testing() const
std::vector< gfx::Bitmap > sprite_previews_
absl::Status OpenGraphicsForTile16Quadrant(int tile16_id, int quadrant)
std::unique_ptr< CanvasNavigationManager > canvas_nav_
OverworldEditor(Rom *rom, const EditorDependencies &deps)
absl::Status Copy() override
std::string GetRomStatus() const override
bool NudgeSelectedItem(int delta_x, int delta_y)
Move selected item by signed pixel deltas.
absl::Status DrawAreaGraphics()
EntityEditMode entity_edit_mode_
const gfx::Bitmap * AreaScreenBitmap(int map_id)
std::unique_ptr< OverworldToolbar > toolbar_
PaletteEditor palette_editor_
zelda3::Sprite edit_sprite_
bool IsRomLoaded() const override
Tile16Editor & tile16_editor()
Access the Tile16 Editor for panel integration.
bool item_placement_armed_
GfxGroupEditor gfx_group_editor_
void ProcessDeferredTextures()
Create textures for deferred map bitmaps on demand.
absl::Status OpenGraphicsForContextTile16(const OverworldContextTarget &target)
const Tile16Editor & tile16_editor() const
zelda3::OverworldEntrance & edit_entrance()
absl::Status Update() final
std::unique_ptr< gui::TileSelectorWidget > blockset_selector_
std::optional< OverworldEntityEditingTarget > editing_target_
zelda3::GameEntity * current_entity() const
bool show_overlay_preview_
friend class AuthoringSaveWorkflowTestPeer
bool entities_visible() const
void RefreshMapProperties(int map_id=-1)
void ToggleEntityVisibility()
absl::Status Paste() override
void ScrollBlocksetCanvasToCurrentTile()
Scroll the blockset canvas to show the current selected tile16.
EditingMode previous_mode
int hovered_map_id() const
bool DeleteSelectedItem()
Delete selected item and preserve nearest-item selection continuity.
std::unique_ptr< TilePaintingManager > tile_painting_
gui::Canvas graphics_bin_canvas_
gfx::BitmapTable current_graphics_set_
bool show_custom_bg_color_editor_
zelda3::Overworld overworld_
absl::Status LoadGraphics()
Load the Bitmap objects for each OverworldMap.
void RefreshChildMapOnDemand(int map_index)
absl::Status Find() override
void DrawEntityContextMenu()
absl::Status LoadSpriteGraphics()
void SetRoomsetGraphicsUsageCallback(GfxGroupEditor::RoomsetUsageCallback callback)
gfx::IRenderer * renderer_
OverworldItemsSnapshot CaptureItemUndoSnapshot() const
void RequestJumpToRoom(int room_id)
Trigger a jump to a dungeon room.
absl::Status Save() override
void InitInteractionCoordinator()
absl::Status SaveScratchPad() const
std::unique_ptr< DebugWindowCard > debug_window_card_
void SelectMapForEditing(int map_id, bool respect_pin=true)
void SetCurrentMap(int map_id)
std::unique_ptr< OverworldInteractionCoordinator > interaction_coordinator_
zelda3::GameEntity * current_entity_
void SetEntityEditMode(EntityEditMode mode)
Entity focus (entrances/exits/items/sprites); NONE = all entities.
zelda3::OverworldExit edit_exit_
gui::Canvas properties_canvas_
void PrepareForSessionTeardown() override
int AutomationGetTile(int x, int y)
std::unique_ptr< EntityMutationService > entity_mutation_service_
gfx::SnesPalette palette_
gfx::Bitmap tile16_blockset_bmp_
std::string graphics_preview_config_path_
bool map_tile_save_transaction_open_
void ClearSelectedItem()
Clear active item selection.
std::string lyra_loaded_rom_sha1_
absl::Status DrawTile16Selector()
void InitTilePaintingManager()
Initialize the tile painting manager (called after graphics load)
bool SelectItemByIdentity(const zelda3::OverworldItem &item_identity)
Select an overworld item using value identity matching.
void SetMainGraphicsUsageCallback(GfxGroupEditor::MainUsageCallback callback)
OverworldEditor(Rom *rom)
const TilePaintingManager * tile_painting() const
Authoritative component for entity editing state and UI.
Allows the user to view and edit in game palettes.
A session-aware status bar displayed at the bottom of the application.
ImGui façade for Tile16 editing; domain state lives in Tile16EditSession.
void SetGameData(zelda3::GameData *game_data)
Manages tile painting, fill, selection, and eyedropper operations.
Represents a bitmap image optimized for SNES ROM hacking.
Shared graphical context across editors.
Defines an abstract interface for all rendering operations.
Represents a palette of colors for the Super Nintendo Entertainment System (SNES).
Modern, robust canvas for drawing and manipulating graphics.
Base class for all overworld and dungeon entities.
Represents an overworld exit that transitions from dungeon to overworld.
void set_current_world(int world)
void SetGameData(GameData *game_data)
bool is_lyra_preview() const
int inspected_map_count() const
auto overworld_map(int i) const
void set_current_map(int i)
A class for managing sprites in the overworld and underworld.
constexpr ImVec2 kOverworldCanvasSize(kOverworldMapSize *8, kOverworldMapSize *8)
constexpr absl::string_view kOWMapTable
constexpr ImGuiTableFlags kOWMapFlags
constexpr unsigned int kOverworldMapSize
constexpr absl::string_view kWorldList
constexpr absl::string_view kGamePartComboString
constexpr unsigned int kNumSheetsToLoad
constexpr ImVec2 kCurrentGfxCanvasSize(0x100+1, 0x10 *0x40+1)
constexpr ImVec2 kBlocksetCanvasSize(0x100+1, 0x4000+1)
constexpr ImVec2 kGraphicsBinCanvasSize(0x100+1, kNumSheetsToLoad *0x40+1)
constexpr unsigned int kByteSize
constexpr unsigned int k4BPP
constexpr unsigned int kMessageIdSize
std::unordered_map< int, std::unique_ptr< gfx::Bitmap > > BitmapTable
std::vector< std::vector< uint16_t > > OverworldBlockset
Represents tile32 data for the overworld.
Unified dependency container for all editor types.
GfxGroupWorkspaceState * gfx_group_workspace
std::vector< std::pair< std::pair< int, int >, int > > tile_changes
std::chrono::steady_clock::time_point timestamp
gfx::Bitmap scratch_bitmap
std::vector< ImVec2 > selected_tiles
std::array< std::array< int, 32 >, 32 > tile_data
std::vector< ImVec2 > selected_points
Snapshot of overworld item list + current item selection.
Tilemap structure for SNES tile-based graphics management.