1#ifndef YAZE_APP_EDITOR_OVERWORLDEDITOR_H
2#define YAZE_APP_EDITOR_OVERWORLDEDITOR_H
8#include "absl/status/status.h"
34#include "imgui/imgui.h"
86struct OverworldItemsSnapshot;
92constexpr unsigned int k4BPP = 4;
103 ImGuiTableFlags_Borders | ImGuiTableFlags_Resizable |
104 ImGuiTableFlags_RowBg | ImGuiTableFlags_SizingStretchProp;
107 "Light World\0Dark World\0Extra World\0";
168 absl::Status
Load()
override;
169 absl::Status
Update() final;
170 absl::Status
Undo() override;
171 absl::Status
Redo() override;
172 absl::Status
Cut()
override {
return absl::UnimplementedError(
"Cut"); }
173 absl::Status
Copy()
override;
174 absl::Status
Paste()
override;
175 absl::Status
Find()
override {
return absl::UnimplementedError(
"Find"); }
176 absl::Status
Save()
override;
177 absl::Status
Clear()
override;
193 return "No ROM loaded";
195 return "ROM failed to load";
196 return absl::StrFormat(
"ROM loaded: %s",
rom_->
title());
343 return absl::FailedPreconditionError(
"Renderer not initialized");
348 return absl::FailedPreconditionError(
"Renderer not initialized");
429 return absl::FailedPreconditionError(
430 "MapRefreshCoordinator not initialized");
439 return absl::FailedPreconditionError(
440 "MapRefreshCoordinator not initialized");
452 map_refresh_->RefreshSiblingMapGraphics(map_index, include_self);
541 std::vector<std::pair<std::pair<int, int>,
int>>
546 void CreateUndoPoint(
int map_id,
int world,
int x,
int y,
int old_tile_id);
552 std::string description);
646 std::string
name =
"Scratch Space";
679 std::array<gfx::Bitmap, zelda3::kNumOverworldMaps>
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.
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.
void SetWorkspaceState(GfxGroupWorkspaceState *state)
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.
std::unique_ptr< UsageStatisticsCard > usage_stats_card_
absl::Status Clear() override
std::unique_ptr< MapPropertiesSystem > map_properties_system_
std::unique_ptr< OverworldCanvasRenderer > canvas_renderer_
OverworldEntityWorkbench * GetWorkbench()
Resolve the entity workbench window content (may be null).
void HandleMapInteraction()
bool overworld_canvas_fullscreen_
bool map_blockset_loaded_
absl::Status DrawScratchSpace()
std::string insert_error_
zelda3::OverworldEntranceTileTypes entrance_tiletypes_
void CenterOverworldView()
void OpenEntityContextMenu(zelda3::GameEntity *entity)
void HandleTile16Edit()
Handle tile16 editing from context menu (MOUSE mode) Gets the tile16 under the cursor and opens the T...
zelda3::OverworldExit & edit_exit()
std::optional< OverworldUndoPoint > current_paint_operation_
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
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()
std::vector< int > selected_tile16_ids_
zelda3::OverworldEntrance edit_entrance_
zelda3::GameData * game_data_
gfx::Bitmap current_gfx_bmp_
gui::Canvas & ow_map_canvas()
gfx::Tilemap tile16_blockset_
absl::Status ClearScratchSpace()
void ProcessPendingEntityInsertion()
Process any pending entity insertion request Called from Update() - needed because ImGui::OpenPopup()...
void InitCanvasNavigationManager()
Initialize the canvas navigation manager (called during Initialize)
void InitMapRefreshCoordinator()
Initialize the map refresh coordinator (called during Initialize)
std::optional< zelda3::OverworldItem > selected_item_identity_
void CycleTileSelection(int delta)
zelda3::OverworldBlockset refresh_blockset_
gfx::Bitmap selected_tile_bmp_
void ResetOverworldView()
zelda3::OverworldItem & edit_item()
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_
ScratchSpace scratch_space_
void SetDependencies(const EditorDependencies &deps) override
bool DeleteItemByIdentity(const zelda3::OverworldItem &item_identity)
void NotifyEntityModified(zelda3::GameEntity *entity)
Notify that an entity has been modified, marking ROM as dirty.
void SwitchToWorld(int world)
absl::Status Undo() override
void HandleEntityInsertion(const std::string &entity_type)
Handle entity insertion from context menu.
zelda3::GameEntity * dragged_entity_
std::unique_ptr< MapRefreshCoordinator > map_refresh_
std::array< gfx::Bitmap, zelda3::kNumOverworldMaps > maps_bmp_
bool PickTile16FromHoveredCanvas()
bool show_map_properties_panel_
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.
void RefreshMapProperties()
void ContributeStatus(StatusBar *status_bar) override
EntityMutationService * entity_mutation_service()
Access the entity mutation service.
ImVec2 pending_insert_pos_
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)
std::optional< zelda3::OverworldItem > selected_item_identity() const
Get current selected item identity snapshot.
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)
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()
std::chrono::steady_clock::time_point last_paint_time_
void InvalidateGraphicsCache(int map_id=-1)
Invalidate cached graphics for a specific map or all maps.
void HandleOverworldPan()
DebugWindowCard * debug_window_card()
Access debug window card for panel.
std::optional< int > pending_tile16_selection_after_gfx_
bool dragged_entity_free_movement_
absl::Status SaveCurrentSelectionToScratch()
zelda3::OverworldItem * GetSelectedItem()
Resolve selected item identity to the current live item pointer.
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)
absl::Status RefreshMapPalette()
void DrawOverworldCanvas()
Draw the main overworld canvas.
gui::Canvas blockset_canvas_
absl::Status RefreshTile16Blockset()
void OpenEntityEditor(zelda3::GameEntity *entity)
zelda3::Overworld & overworld()
Access the underlying Overworld data.
void SetCurrentEntity(zelda3::GameEntity *entity)
Set the currently active entity for editing.
void UpdateBlocksetSelectorState()
zelda3::OverworldItem edit_item_
int current_map_id() const
void RefreshChildMap(int map_index)
ImVec2 & pending_insert_pos()
void FinalizePaintOperation()
std::unique_ptr< OverworldEntityRenderer > entity_renderer_
auto & GetWorldTiles(int world)
absl::Status Load() override
absl::Status UpdateGfxGroupEditor()
void EnsureMapTexture(int map_index)
Ensure a specific map has its texture created.
std::vector< gfx::Bitmap > sprite_previews_
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_
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.
GfxGroupEditor gfx_group_editor_
void ProcessDeferredTextures()
Create textures for deferred map bitmaps on demand.
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_
absl::Status Paste() override
void ScrollBlocksetCanvasToCurrentTile()
Scroll the blockset canvas to show the current selected tile16.
static constexpr auto kPaintBatchTimeout
EditingMode previous_mode
std::string pending_insert_type_
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()
gfx::IRenderer * renderer_
OverworldItemsSnapshot CaptureItemUndoSnapshot() const
void RequestJumpToRoom(int room_id)
Trigger a jump to a dungeon room.
absl::Status Save() override
void InitInteractionCoordinator()
std::unique_ptr< DebugWindowCard > debug_window_card_
void HandleOverworldZoom()
void SetCurrentMap(int map_id)
std::unique_ptr< OverworldInteractionCoordinator > interaction_coordinator_
zelda3::GameEntity * current_entity_
void HandleKeyboardShortcuts()
Handle overworld keyboard shortcuts and edit-mode hotkeys.
zelda3::OverworldExit edit_exit_
std::string & pending_insert_type()
gui::Canvas properties_canvas_
int AutomationGetTile(int x, int y)
std::unique_ptr< EntityMutationService > entity_mutation_service_
gfx::SnesPalette palette_
gfx::Bitmap tile16_blockset_bmp_
void ClearSelectedItem()
Clear active item selection.
absl::Status DrawTile16Selector()
void InitTilePaintingManager()
Initialize the tile painting manager (called after graphics load)
void ClampOverworldScroll()
bool SelectItemByIdentity(const zelda3::OverworldItem &item_identity)
Select an overworld item using value identity matching.
OverworldEditor(Rom *rom)
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.
Popup window to edit Tile16 data.
void SetGameData(zelda3::GameData *game_data)
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.
Represents the full Overworld data, light and dark world.
void set_current_world(int world)
void SetGameData(GameData *game_data)
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.
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.