1#ifndef YAZE_APP_EDITOR_OVERWORLDEDITOR_H
2#define YAZE_APP_EDITOR_OVERWORLDEDITOR_H
8#include "absl/status/status.h"
42#include "imgui/imgui.h"
94struct OverworldItemsSnapshot;
111 ImGuiTableFlags_Borders | ImGuiTableFlags_Resizable |
112 ImGuiTableFlags_RowBg | ImGuiTableFlags_SizingStretchProp;
115 "Light World\0Dark World\0Extra World\0";
190 absl::Status
Load()
override;
191 absl::Status
Update() final;
192 absl::Status
Undo() override;
193 absl::Status
Redo() override;
194 absl::Status
Cut()
override {
return absl::UnimplementedError(
"Cut"); }
195 absl::Status
Copy()
override;
196 absl::Status
Paste()
override;
199 int map_id,
const std::vector<GuardedTileCell>& cells);
200 absl::Status
Find()
override {
return absl::UnimplementedError(
"Find"); }
201 absl::Status
Save()
override;
205 absl::Status
Clear()
override;
251 return "No ROM loaded";
253 return "ROM failed to load";
254 return absl::StrFormat(
"ROM loaded: %s",
rom_->
title());
267 const std::string& project_path);
413 const std::optional<OverworldContextTarget>& target);
508 ImGui::TextDisabled(
"Lyra preview: area graphics editing unavailable");
509 return absl::OkStatus();
512 if (ImGui::Button(
"Edit / Import Project Graphics"))
515 return absl::FailedPreconditionError(
"Renderer not initialized");
520 ImGui::TextDisabled(
"Lyra preview: Tile16 editing unavailable");
521 return absl::OkStatus();
524 return absl::FailedPreconditionError(
"Renderer not initialized");
529 ImGui::TextDisabled(
"Lyra preview: map properties editing unavailable");
547 ImGui::TextDisabled(
"Lyra preview: Tile8 editing unavailable");
556 ImGui::TextDisabled(
"Lyra preview: overworld settings unavailable");
663 return absl::OkStatus();
666 return absl::FailedPreconditionError(
667 "MapRefreshCoordinator not initialized");
676 return absl::OkStatus();
679 return absl::FailedPreconditionError(
680 "MapRefreshCoordinator not initialized");
692 map_refresh_->RefreshSiblingMapGraphics(map_index, include_self);
739 void PrimeWorldMaps(
int world,
bool process_texture_queue =
false);
784 std::vector<std::pair<std::pair<int, int>,
int>>
789 void CreateUndoPoint(
int map_id,
int world,
int x,
int y,
int old_tile_id);
795 std::string description);
797 bool record_undo =
true);
799 const std::vector<OverworldPropertyEdit>& edits,
800 const std::string& description,
bool record_undo =
true);
803 const std::string& label);
947 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_
project::YazeProject * project() const
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)
void ProjectSaveCommitted()
absl::Status EditAuthoring(core::LyraAuthoringState after, zelda3::Overworld &overworld, UndoManager &history)
void FinishStroke(UndoManager &history)
Handles all canvas drawing and panel rendering for the overworld editor.
Main UI class for editing overworld maps in A Link to the Past.
absl::Status ApplyEntranceEdit(zelda3::OverworldEntrance *target, const zelda3::OverworldEntrance &draft)
void ToggleItemListWindow()
ProjectGraphicsImportBindings graphics_import_applied_bindings_
gfx::Bitmap scratch_bitmap_
bool IsProjectTerrainMap(int map_id) const
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
uint64_t scratch_name_id_
std::unique_ptr< MapPropertiesSystem > map_properties_system_
std::unique_ptr< OverworldCanvasRenderer > canvas_renderer_
bool item_insert_popup_requested_
uint64_t scratch_preview_revision_
OverworldEntityWorkbench * GetWorkbench()
Resolve the entity workbench window content (may be null).
void HandleMapInteraction()
bool overworld_canvas_fullscreen_
absl::Status scratch_load_status_
bool map_blockset_loaded_
void DrawEditorMenu() override
int DisplayedMapCount() const
void InitMapTextureCoordinator()
absl::Status DrawScratchSpace()
std::string insert_error_
zelda3::OverworldEntranceTileTypes entrance_tiletypes_
int graphics_source_tile_
absl::Status SaveProjectTerrainAs(project::YazeProject *project, const std::string &project_path)
void CenterOverworldView()
void OpenEntityContextMenu(zelda3::GameEntity *entity)
std::string graphics_source_message_
std::array< gfx::Bitmap, zelda3::kExpandedMapCount > maps_bmp_
zelda3::OverworldExit & edit_exit()
EditorContextSnapshot BuildContextSnapshot() const override
bool scratch_paint_gesture_owned_
std::string graphics_import_pack_
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.
absl::Status scratch_action_status_
absl::Status PrepareProjectSave()
std::array< char, 1024 > graphics_import_path_
int graphics_source_palette_
std::array< char, 129 > scratch_name_buffer_
void CreateUndoPoint(int map_id, int world, int x, int y, int old_tile_id)
absl::StatusOr< int > ApplyTile16Stencil(int map_id, const std::vector< GuardedTileCell > &cells)
Select map_id and apply a guarded stencil as one undoable paint.
absl::Status Cut() override
void ClearSelectionBrush()
void CommitSaveTransaction() override
absl::Status LoadScratchToSelection()
void ForceRefreshGraphics(int map_index)
zelda3::GameEntity * ResolveEditingEntity()
void RequestTile16Selection(int tile_id)
void RestoreItemUndoSnapshot(const OverworldItemsSnapshot &snapshot)
absl::Status EditProjectMapAuthoring(core::LyraAuthoringState after)
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_
absl::Status ApplyProjectGraphicsImport(const std::string &pack, const ProjectGraphicsImportBindings &bindings)
gui::Canvas & ow_map_canvas()
gfx::Tilemap tile16_blockset_
absl::Status ClearScratchSpace()
void InitCanvasNavigationManager()
Initialize the canvas navigation manager (called during Initialize)
zelda3::OverworldGraphicsPreview graphics_preview_baseline_
void JumpToMap(int map_id)
void InitMapRefreshCoordinator()
Initialize the map refresh coordinator (called during Initialize)
ScratchWorkspace scratch_workspace_
void RequestItemInsertPopup(const std::optional< OverworldContextTarget > &target)
std::string ProjectGraphicsPath() const
bool scratch_select_active_
std::optional< zelda3::OverworldItem > selected_item_identity_
void CycleTileSelection(int delta)
void SetSelectionBrush(TileBrush brush)
absl::Status RefreshMapPalette(int map_id=-1)
zelda3::OverworldBlockset refresh_blockset_
gfx::Bitmap selected_tile_bmp_
void ResetOverworldView()
zelda3::OverworldItem & edit_item()
absl::Status PaintLyraA0Terrain(int map_id, int x, int y, uint16_t tile)
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_
bool Tile16MenuEnabled() const
absl::Status SyncProjectGraphicsPreview(bool force=false)
void SetDependencies(const EditorDependencies &deps) override
absl::Status graphics_source_status_
bool DeleteItemByIdentity(const zelda3::OverworldItem &item_identity)
absl::StatusOr< ProjectGraphicsImportPlan > PreviewProjectGraphicsImport(const std::string &pack, const ProjectGraphicsImportBindings &bindings)
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 OpenLyraTerrain(const std::string &path)
friend class OverworldScratchTestPeer
absl::Status Undo() override
std::optional< ScratchWorkspaceState > scratch_edit_before_
void ToggleTile16EditorWindow()
ImVec2 scratch_drag_start_
void SetPreviewStoryState(int state)
zelda3::GameEntity * dragged_entity_
void DrawItemInsertPopup()
std::unique_ptr< MapRefreshCoordinator > map_refresh_
void MarkScratchSpaceDirty()
absl::Status OpenProjectGraphicsSource()
absl::Status ReloadProjectGraphics()
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
bool PickTile16FromHoveredCanvas()
void RefreshOverworldMap()
void CheckForOverworldEdits()
Check for tile edits - delegates to TilePaintingManager.
void DrawEditMenuItems() override
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)
ImVec2 scratch_select_max_
std::optional< OverworldContextTarget > item_insert_target_
void SetProjectContextProvider(std::function< project::YazeProject *()> provider)
absl::Status ApplyOverworldPropertyEdits(const std::vector< OverworldPropertyEdit > &edits, const std::string &description, bool record_undo=true)
ImVec2 scratch_select_min_
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...
absl::Status SaveScratchPad()
gui::Canvas current_gfx_canvas_
void set_current_tile16(int tile_id)
absl::Status RefreshPendingProjectGraphics()
void Initialize() override
bool show_overlay_editor_
std::unique_ptr< OverworldSidebar > sidebar_
std::string & insert_error()
friend class ProjectGraphicsImportSaveTestPeer
void ProjectSaveCommitted()
absl::Status Redo() override
void SetupCanvasAutomation()
int GetTile16UsageCount(int tile_id) const
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_
const TileBrush * selection_brush() const
DebugWindowCard * debug_window_card()
Access debug window card for panel.
void FinishScratchEdit(const std::string &description)
void DrawProjectGraphicsSource()
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...
static bool NormalizeMapSelection(int ¤t_world, int ¤t_map, int map_count=zelda3::kNumOverworldMaps)
Clamp a possibly stale world/map selection back into a valid overworld range.
bool HasUnpublishedProjectGraphics() const
void SetEditingMode(EditingMode mode)
Tool change from the toolbar or keys 1/2: also leaves entity modes.
LyraTerrainCanvas lyra_canvas_
bool dragged_entity_free_movement_
bool graphics_import_applied_
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 scratch_save_status_
absl::Status RefreshTile16Blockset()
void OpenEntityEditor(zelda3::GameEntity *entity)
void DrawProjectGraphicsImport()
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()
absl::Status RestoreScratchState(const ScratchWorkspaceState &state)
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
std::string GetTile16ScopeLabel() const
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()
friend class ProjectGraphicsImportWorkflowTestPeer
absl::Status RebuildScratchBitmapFromTileData()
std::filesystem::path scratch_path_
void EnsureMapTexture(int map_index)
Ensure a specific map has its texture created.
gui::AdaptiveSheetScaleMode scratch_scale_mode_
const gfx::Bitmap & current_gfx_bmp_for_testing() const
std::vector< gfx::Bitmap > sprite_previews_
bool scratch_initialized_
absl::Status OpenGraphicsForTile16Quadrant(int tile16_id, int quadrant)
std::shared_ptr< ProjectGraphicsSource > graphics_source_
std::unique_ptr< CanvasNavigationManager > canvas_nav_
absl::Status SaveLyraA0TerrainAs(const std::string &filename)
OverworldEditor(Rom *rom, const EditorDependencies &deps)
absl::Status Copy() override
std::string GetRomStatus() const override
bool graphics_import_ranges_reviewed_
bool NudgeSelectedItem(int delta_x, int delta_y)
Move selected item by signed pixel deltas.
absl::Status DrawAreaGraphics()
EntityEditMode entity_edit_mode_
const project::YazeProject * graphics_source_project_
bool graphics_source_open_
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
project::YazeProject * TerrainProject() const
void RefreshMapProperties(int map_id=-1)
absl::Status CreateLyraTerrain()
void ToggleEntityVisibility()
absl::Status Paste() override
void ScrollBlocksetCanvasToCurrentTile()
Scroll the blockset canvas to show the current selected tile16.
EditingMode previous_mode
std::optional< ProjectGraphicsImportPlan > graphics_import_plan_
int hovered_map_id() const
absl::Status PlaceProjectGraphicsImport(int world_x, int world_y)
bool DeleteSelectedItem()
Delete selected item and preserve nearest-item selection continuity.
std::unique_ptr< TilePaintingManager > tile_painting_
absl::Status PublishProjectGraphicsSource()
absl::Status lyra_canvas_status_
gui::Canvas graphics_bin_canvas_
std::function< project::YazeProject *()> project_context_provider_
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)
bool HasPendingProjectDraftChanges() const
absl::Status Find() override
void DrawEntityContextMenu()
absl::Status LoadSpriteGraphics()
void SetRoomsetGraphicsUsageCallback(GfxGroupEditor::RoomsetUsageCallback callback)
gfx::IRenderer * renderer_
std::array< int, 2 > scratch_resize_dimensions_
OverworldItemsSnapshot CaptureItemUndoSnapshot() const
void RequestJumpToRoom(int room_id)
Trigger a jump to a dungeon room.
absl::Status Save() override
void InitInteractionCoordinator()
ProjectGraphicsImportBindings graphics_import_bindings_
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_
absl::StatusOr< ProjectGraphicsImportContext > GraphicsImportContext()
void SetEntityEditMode(EntityEditMode mode)
Entity focus (entrances/exits/items/sprites); NONE = all entities.
int graphics_source_index_
zelda3::OverworldExit edit_exit_
bool lyra_a0_terrain_writable() const
gui::Canvas properties_canvas_
std::optional< ProjectGraphicsImportAsset > graphics_import_asset_
void PrepareForSessionTeardown() override
uint64_t scratch_resize_id_
int AutomationGetTile(int x, int y)
std::unique_ptr< EntityMutationService > entity_mutation_service_
gfx::SnesPalette palette_
absl::Status ApplyExitEdit(zelda3::OverworldExit *target, const zelda3::OverworldExit &draft)
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 lyra_a0_terrain_writable() const
bool is_lyra_preview() 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
constexpr int kNumOverworldMaps
std::vector< std::vector< uint16_t > > OverworldBlockset
Represents tile32 data for the overworld.
std::map< int, AreaGraphicsPreview > OverworldGraphicsPreview
Unified dependency container for all editor types.
project::YazeProject * project
GfxGroupWorkspaceState * gfx_group_workspace
std::vector< std::pair< std::pair< int, int >, int > > tile_changes
std::chrono::steady_clock::time_point timestamp
Snapshot of overworld item list + current item selection.
Tilemap structure for SNES tile-based graphics management.
Modern project structure with comprehensive settings consolidation.