yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
dungeon_editor_system.h
Go to the documentation of this file.
1#ifndef YAZE_APP_ZELDA3_DUNGEON_DUNGEON_EDITOR_SYSTEM_H
2#define YAZE_APP_ZELDA3_DUNGEON_DUNGEON_EDITOR_SYSTEM_H
3
4#include <chrono>
5#include <functional>
6#include <memory>
7#include <string>
8#include <unordered_map>
9#include <vector>
10
11#include "absl/status/status.h"
12#include "absl/status/statusor.h"
14#include "rom/rom.h"
15#include "zelda3/dungeon/room.h"
17#include "zelda3/game_data.h"
18
19namespace yaze {
20namespace zelda3 {
21
34 public:
35 // Editor state
36 struct EditorState {
38 bool is_dirty = false;
39 std::chrono::steady_clock::time_point last_save_time;
40 };
41
42 explicit DungeonEditorSystem(Rom* rom, GameData* game_data = nullptr);
44
45 void SetGameData(GameData* game_data) { game_data_ = game_data; }
46
47 // System initialization and management
48 absl::Status Initialize();
49 absl::Status LoadDungeon(int dungeon_id);
50 absl::Status SaveDungeon();
51 absl::Status SaveRoom(int room_id);
52 absl::Status ReloadRoom(int room_id);
53
54 // Room management
55 absl::Status SetCurrentRoom(int room_id);
56 int GetCurrentRoom() const;
57 absl::StatusOr<Room> GetRoom(int room_id);
58
59 // Object editing (delegated to DungeonObjectEditor)
60 std::shared_ptr<DungeonObjectEditor> GetObjectEditor();
61
62 // Undo/Redo system
63 absl::Status Undo();
64 absl::Status Redo();
65 bool CanUndo() const;
66 bool CanRedo() const;
67 void ClearHistory();
68
69 // Event callbacks
70 using RoomChangedCallback = std::function<void(int room_id)>;
72
73 // Getters
75 Rom* GetROM() const;
76 bool IsDirty() const;
77
78 // ROM management
79 void SetROM(Rom* rom);
80 void SetExternalRoom(Room* room);
81
82 private:
83 absl::Status InitializeObjectEditor();
84 absl::Status LoadRoomData(int room_id);
85 absl::Status SaveRoomData(int room_id);
86
88 GameData* game_data_ = nullptr;
89 std::shared_ptr<DungeonObjectEditor> object_editor_;
90
92
93 // Room data storage
94 std::unordered_map<int, Room> rooms_;
95
96 // Event callbacks
98
99 // Undo/Redo system - stores room object snapshots
100 struct UndoPoint {
102 std::unordered_map<int, Room> rooms;
103 std::chrono::steady_clock::time_point timestamp;
104 };
105
106 std::vector<UndoPoint> undo_history_;
107 std::vector<UndoPoint> redo_history_;
108 static constexpr size_t kMaxUndoHistory = 100;
109};
110
114std::unique_ptr<DungeonEditorSystem> CreateDungeonEditorSystem(
115 Rom* rom, GameData* game_data = nullptr);
116
124absl::StatusOr<std::string> ExportRoomLayoutTemplate(const Room& room);
125
133absl::Status ApplyRoomLayoutTemplate(Room& room, const std::string& json,
134 bool apply_properties = false);
135
136} // namespace zelda3
137} // namespace yaze
138
139#endif // YAZE_APP_ZELDA3_DUNGEON_DUNGEON_EDITOR_SYSTEM_H
The Rom class is used to load, save, and modify Rom data. This is a generic SNES ROM container and do...
Definition rom.h:28
void SetGameData(GameData *game_data)
void SetRoomChangedCallback(RoomChangedCallback callback)
std::shared_ptr< DungeonObjectEditor > object_editor_
DungeonEditorSystem(Rom *rom, GameData *game_data=nullptr)
std::shared_ptr< DungeonObjectEditor > GetObjectEditor()
absl::Status SetCurrentRoom(int room_id)
std::unordered_map< int, Room > rooms_
absl::Status LoadDungeon(int dungeon_id)
std::function< void(int room_id)> RoomChangedCallback
absl::StatusOr< Room > GetRoom(int room_id)
nlohmann::json json
absl::Status ApplyRoomLayoutTemplate(Room &room, const std::string &json_str, bool apply_properties)
Apply a previously exported layout template to a room.
absl::StatusOr< std::string > ExportRoomLayoutTemplate(const Room &room)
Export a room's layout as a JSON template string.
std::unique_ptr< DungeonEditorSystem > CreateDungeonEditorSystem(Rom *rom, GameData *game_data)
Factory function to create dungeon editor system.
std::chrono::steady_clock::time_point last_save_time
std::chrono::steady_clock::time_point timestamp