yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
dungeon_editor_system.cc
Go to the documentation of this file.
2
3#include <algorithm>
4#include <chrono>
5
6#include "absl/strings/str_format.h"
7
8namespace yaze {
9namespace zelda3 {
10
12
14 if (rom_ == nullptr) {
15 return absl::InvalidArgumentError("ROM is null");
16 }
17
18 // Initialize default dungeon settings
20 dungeon_settings_.name = "Default Dungeon";
21 dungeon_settings_.description = "A dungeon created with the editor";
30
31 return absl::OkStatus();
32}
33
34absl::Status DungeonEditorSystem::LoadDungeon(int dungeon_id) {
35 // TODO: Implement actual dungeon loading from ROM
37 editor_state_.is_dirty = false;
39 editor_state_.last_save_time = std::chrono::steady_clock::now();
40
41 return absl::OkStatus();
42}
43
45 // TODO: Implement actual dungeon saving to ROM
46 editor_state_.is_dirty = false;
47 editor_state_.last_save_time = std::chrono::steady_clock::now();
48
49 return absl::OkStatus();
50}
51
52absl::Status DungeonEditorSystem::SaveRoom(int room_id) {
53 // TODO: Implement actual room saving to ROM
54 return absl::OkStatus();
55}
56
57absl::Status DungeonEditorSystem::ReloadRoom(int room_id) {
58 // TODO: Implement actual room reloading from ROM
59 return absl::OkStatus();
60}
61
65
69
70absl::Status DungeonEditorSystem::SetCurrentRoom(int room_id) {
71 if (room_id < 0 || room_id >= NumberOfRooms) {
72 return absl::InvalidArgumentError("Invalid room ID");
73 }
74
76 return absl::OkStatus();
77}
78
82
83absl::StatusOr<Room> DungeonEditorSystem::GetRoom(int room_id) {
84 if (room_id < 0 || room_id >= NumberOfRooms) {
85 return absl::InvalidArgumentError("Invalid room ID");
86 }
87
88 // TODO: Load room from ROM or return cached room
89 return Room(room_id, rom_);
90}
91
92absl::Status DungeonEditorSystem::CreateRoom(int room_id, const std::string& name) {
93 // TODO: Implement room creation
94 return absl::OkStatus();
95}
96
97absl::Status DungeonEditorSystem::DeleteRoom(int room_id) {
98 // TODO: Implement room deletion
99 return absl::OkStatus();
100}
101
102absl::Status DungeonEditorSystem::DuplicateRoom(int source_room_id, int target_room_id) {
103 // TODO: Implement room duplication
104 return absl::OkStatus();
105}
106
107std::shared_ptr<DungeonObjectEditor> DungeonEditorSystem::GetObjectEditor() {
108 if (!object_editor_) {
109 object_editor_ = std::make_shared<DungeonObjectEditor>(rom_);
110 }
111 return object_editor_;
112}
113
116 return absl::OkStatus();
117}
118
119// Sprite management
120absl::Status DungeonEditorSystem::AddSprite(const SpriteData& sprite_data) {
121 int sprite_id = GenerateSpriteId();
122 sprites_[sprite_id] = sprite_data;
123 sprites_[sprite_id].sprite_id = sprite_id;
124
126 sprite_changed_callback_(sprite_id);
127 }
128
129 return absl::OkStatus();
130}
131
132absl::Status DungeonEditorSystem::RemoveSprite(int sprite_id) {
133 auto it = sprites_.find(sprite_id);
134 if (it == sprites_.end()) {
135 return absl::NotFoundError("Sprite not found");
136 }
137
138 sprites_.erase(it);
139 return absl::OkStatus();
140}
141
142absl::Status DungeonEditorSystem::UpdateSprite(int sprite_id, const SpriteData& sprite_data) {
143 auto it = sprites_.find(sprite_id);
144 if (it == sprites_.end()) {
145 return absl::NotFoundError("Sprite not found");
146 }
147
148 it->second = sprite_data;
149 it->second.sprite_id = sprite_id;
150
152 sprite_changed_callback_(sprite_id);
153 }
154
155 return absl::OkStatus();
156}
157
158absl::StatusOr<DungeonEditorSystem::SpriteData> DungeonEditorSystem::GetSprite(int sprite_id) {
159 auto it = sprites_.find(sprite_id);
160 if (it == sprites_.end()) {
161 return absl::NotFoundError("Sprite not found");
162 }
163
164 return it->second;
165}
166
167absl::StatusOr<std::vector<DungeonEditorSystem::SpriteData>> DungeonEditorSystem::GetSpritesByRoom(int room_id) {
168 std::vector<SpriteData> room_sprites;
169
170 for (const auto& [id, sprite] : sprites_) {
171 if (sprite.x >= 0 && sprite.y >= 0) { // Simple room assignment logic
172 room_sprites.push_back(sprite);
173 }
174 }
175
176 return room_sprites;
177}
178
179absl::StatusOr<std::vector<DungeonEditorSystem::SpriteData>> DungeonEditorSystem::GetSpritesByType(SpriteType type) {
180 std::vector<SpriteData> typed_sprites;
181
182 for (const auto& [id, sprite] : sprites_) {
183 if (sprite.type == type) {
184 typed_sprites.push_back(sprite);
185 }
186 }
187
188 return typed_sprites;
189}
190
191absl::Status DungeonEditorSystem::MoveSprite(int sprite_id, int new_x, int new_y) {
192 auto it = sprites_.find(sprite_id);
193 if (it == sprites_.end()) {
194 return absl::NotFoundError("Sprite not found");
195 }
196
197 it->second.x = new_x;
198 it->second.y = new_y;
199
201 sprite_changed_callback_(sprite_id);
202 }
203
204 return absl::OkStatus();
205}
206
207absl::Status DungeonEditorSystem::SetSpriteActive(int sprite_id, bool active) {
208 auto it = sprites_.find(sprite_id);
209 if (it == sprites_.end()) {
210 return absl::NotFoundError("Sprite not found");
211 }
212
213 it->second.is_active = active;
214
216 sprite_changed_callback_(sprite_id);
217 }
218
219 return absl::OkStatus();
220}
221
222// Item management
223absl::Status DungeonEditorSystem::AddItem(const ItemData& item_data) {
224 int item_id = GenerateItemId();
225 items_[item_id] = item_data;
226 items_[item_id].item_id = item_id;
227
229 item_changed_callback_(item_id);
230 }
231
232 return absl::OkStatus();
233}
234
235absl::Status DungeonEditorSystem::RemoveItem(int item_id) {
236 auto it = items_.find(item_id);
237 if (it == items_.end()) {
238 return absl::NotFoundError("Item not found");
239 }
240
241 items_.erase(it);
242 return absl::OkStatus();
243}
244
245absl::Status DungeonEditorSystem::UpdateItem(int item_id, const ItemData& item_data) {
246 auto it = items_.find(item_id);
247 if (it == items_.end()) {
248 return absl::NotFoundError("Item not found");
249 }
250
251 it->second = item_data;
252 it->second.item_id = item_id;
253
255 item_changed_callback_(item_id);
256 }
257
258 return absl::OkStatus();
259}
260
261absl::StatusOr<DungeonEditorSystem::ItemData> DungeonEditorSystem::GetItem(int item_id) {
262 auto it = items_.find(item_id);
263 if (it == items_.end()) {
264 return absl::NotFoundError("Item not found");
265 }
266
267 return it->second;
268}
269
270absl::StatusOr<std::vector<DungeonEditorSystem::ItemData>> DungeonEditorSystem::GetItemsByRoom(int room_id) {
271 std::vector<ItemData> room_items;
272
273 for (const auto& [id, item] : items_) {
274 if (item.room_id == room_id) {
275 room_items.push_back(item);
276 }
277 }
278
279 return room_items;
280}
281
282absl::StatusOr<std::vector<DungeonEditorSystem::ItemData>> DungeonEditorSystem::GetItemsByType(ItemType type) {
283 std::vector<ItemData> typed_items;
284
285 for (const auto& [id, item] : items_) {
286 if (item.type == type) {
287 typed_items.push_back(item);
288 }
289 }
290
291 return typed_items;
292}
293
294absl::Status DungeonEditorSystem::MoveItem(int item_id, int new_x, int new_y) {
295 auto it = items_.find(item_id);
296 if (it == items_.end()) {
297 return absl::NotFoundError("Item not found");
298 }
299
300 it->second.x = new_x;
301 it->second.y = new_y;
302
304 item_changed_callback_(item_id);
305 }
306
307 return absl::OkStatus();
308}
309
310absl::Status DungeonEditorSystem::SetItemHidden(int item_id, bool hidden) {
311 auto it = items_.find(item_id);
312 if (it == items_.end()) {
313 return absl::NotFoundError("Item not found");
314 }
315
316 it->second.is_hidden = hidden;
317
319 item_changed_callback_(item_id);
320 }
321
322 return absl::OkStatus();
323}
324
325// Entrance/exit management
326absl::Status DungeonEditorSystem::AddEntrance(const EntranceData& entrance_data) {
327 int entrance_id = GenerateEntranceId();
328 entrances_[entrance_id] = entrance_data;
329 entrances_[entrance_id].entrance_id = entrance_id;
330
332 entrance_changed_callback_(entrance_id);
333 }
334
335 return absl::OkStatus();
336}
337
338absl::Status DungeonEditorSystem::RemoveEntrance(int entrance_id) {
339 auto it = entrances_.find(entrance_id);
340 if (it == entrances_.end()) {
341 return absl::NotFoundError("Entrance not found");
342 }
343
344 entrances_.erase(it);
345 return absl::OkStatus();
346}
347
348absl::Status DungeonEditorSystem::UpdateEntrance(int entrance_id, const EntranceData& entrance_data) {
349 auto it = entrances_.find(entrance_id);
350 if (it == entrances_.end()) {
351 return absl::NotFoundError("Entrance not found");
352 }
353
354 it->second = entrance_data;
355 it->second.entrance_id = entrance_id;
356
358 entrance_changed_callback_(entrance_id);
359 }
360
361 return absl::OkStatus();
362}
363
364absl::StatusOr<DungeonEditorSystem::EntranceData> DungeonEditorSystem::GetEntrance(int entrance_id) {
365 auto it = entrances_.find(entrance_id);
366 if (it == entrances_.end()) {
367 return absl::NotFoundError("Entrance not found");
368 }
369
370 return it->second;
371}
372
373absl::StatusOr<std::vector<DungeonEditorSystem::EntranceData>> DungeonEditorSystem::GetEntrancesByRoom(int room_id) {
374 std::vector<EntranceData> room_entrances;
375
376 for (const auto& [id, entrance] : entrances_) {
377 if (entrance.source_room_id == room_id || entrance.target_room_id == room_id) {
378 room_entrances.push_back(entrance);
379 }
380 }
381
382 return room_entrances;
383}
384
385absl::StatusOr<std::vector<DungeonEditorSystem::EntranceData>> DungeonEditorSystem::GetEntrancesByType(EntranceType type) {
386 std::vector<EntranceData> typed_entrances;
387
388 for (const auto& [id, entrance] : entrances_) {
389 if (entrance.type == type) {
390 typed_entrances.push_back(entrance);
391 }
392 }
393
394 return typed_entrances;
395}
396
397absl::Status DungeonEditorSystem::ConnectRooms(int room1_id, int room2_id, int x1, int y1, int x2, int y2) {
398 EntranceData entrance_data;
399 entrance_data.source_room_id = room1_id;
400 entrance_data.target_room_id = room2_id;
401 entrance_data.source_x = x1;
402 entrance_data.source_y = y1;
403 entrance_data.target_x = x2;
404 entrance_data.target_y = y2;
405 entrance_data.type = EntranceType::kNormal;
406 entrance_data.is_bidirectional = true;
407
408 return AddEntrance(entrance_data);
409}
410
411absl::Status DungeonEditorSystem::DisconnectRooms(int room1_id, int room2_id) {
412 // Find and remove entrance between rooms
413 for (auto it = entrances_.begin(); it != entrances_.end();) {
414 const auto& entrance = it->second;
415 if ((entrance.source_room_id == room1_id && entrance.target_room_id == room2_id) ||
416 (entrance.source_room_id == room2_id && entrance.target_room_id == room1_id)) {
417 it = entrances_.erase(it);
418 } else {
419 ++it;
420 }
421 }
422
423 return absl::OkStatus();
424}
425
426// Door management
427absl::Status DungeonEditorSystem::AddDoor(const DoorData& door_data) {
428 int door_id = GenerateDoorId();
429 doors_[door_id] = door_data;
430 doors_[door_id].door_id = door_id;
431
433 door_changed_callback_(door_id);
434 }
435
436 return absl::OkStatus();
437}
438
439absl::Status DungeonEditorSystem::RemoveDoor(int door_id) {
440 auto it = doors_.find(door_id);
441 if (it == doors_.end()) {
442 return absl::NotFoundError("Door not found");
443 }
444
445 doors_.erase(it);
446 return absl::OkStatus();
447}
448
449absl::Status DungeonEditorSystem::UpdateDoor(int door_id, const DoorData& door_data) {
450 auto it = doors_.find(door_id);
451 if (it == doors_.end()) {
452 return absl::NotFoundError("Door not found");
453 }
454
455 it->second = door_data;
456 it->second.door_id = door_id;
457
459 door_changed_callback_(door_id);
460 }
461
462 return absl::OkStatus();
463}
464
465absl::StatusOr<DungeonEditorSystem::DoorData> DungeonEditorSystem::GetDoor(int door_id) {
466 auto it = doors_.find(door_id);
467 if (it == doors_.end()) {
468 return absl::NotFoundError("Door not found");
469 }
470
471 return it->second;
472}
473
474absl::StatusOr<std::vector<DungeonEditorSystem::DoorData>> DungeonEditorSystem::GetDoorsByRoom(int room_id) {
475 std::vector<DoorData> room_doors;
476
477 for (const auto& [id, door] : doors_) {
478 if (door.room_id == room_id) {
479 room_doors.push_back(door);
480 }
481 }
482
483 return room_doors;
484}
485
486absl::Status DungeonEditorSystem::SetDoorLocked(int door_id, bool locked) {
487 auto it = doors_.find(door_id);
488 if (it == doors_.end()) {
489 return absl::NotFoundError("Door not found");
490 }
491
492 it->second.is_locked = locked;
493
495 door_changed_callback_(door_id);
496 }
497
498 return absl::OkStatus();
499}
500
501absl::Status DungeonEditorSystem::SetDoorKeyRequirement(int door_id, bool requires_key, int key_type) {
502 auto it = doors_.find(door_id);
503 if (it == doors_.end()) {
504 return absl::NotFoundError("Door not found");
505 }
506
507 it->second.requires_key = requires_key;
508 it->second.key_type = key_type;
509
511 door_changed_callback_(door_id);
512 }
513
514 return absl::OkStatus();
515}
516
517// Chest management
519 int chest_id = GenerateChestId();
520 chests_[chest_id] = chest_data;
521 chests_[chest_id].chest_id = chest_id;
522
524 chest_changed_callback_(chest_id);
525 }
526
527 return absl::OkStatus();
528}
529
530absl::Status DungeonEditorSystem::RemoveChest(int chest_id) {
531 auto it = chests_.find(chest_id);
532 if (it == chests_.end()) {
533 return absl::NotFoundError("Chest not found");
534 }
535
536 chests_.erase(it);
537 return absl::OkStatus();
538}
539
540absl::Status DungeonEditorSystem::UpdateChest(int chest_id, const ChestData& chest_data) {
541 auto it = chests_.find(chest_id);
542 if (it == chests_.end()) {
543 return absl::NotFoundError("Chest not found");
544 }
545
546 it->second = chest_data;
547 it->second.chest_id = chest_id;
548
550 chest_changed_callback_(chest_id);
551 }
552
553 return absl::OkStatus();
554}
555
556absl::StatusOr<DungeonEditorSystem::ChestData> DungeonEditorSystem::GetChest(int chest_id) {
557 auto it = chests_.find(chest_id);
558 if (it == chests_.end()) {
559 return absl::NotFoundError("Chest not found");
560 }
561
562 return it->second;
563}
564
565absl::StatusOr<std::vector<DungeonEditorSystem::ChestData>> DungeonEditorSystem::GetChestsByRoom(int room_id) {
566 std::vector<ChestData> room_chests;
567
568 for (const auto& [id, chest] : chests_) {
569 if (chest.room_id == room_id) {
570 room_chests.push_back(chest);
571 }
572 }
573
574 return room_chests;
575}
576
577absl::Status DungeonEditorSystem::SetChestItem(int chest_id, int item_id, int quantity) {
578 auto it = chests_.find(chest_id);
579 if (it == chests_.end()) {
580 return absl::NotFoundError("Chest not found");
581 }
582
583 it->second.item_id = item_id;
584 it->second.item_quantity = quantity;
585
587 chest_changed_callback_(chest_id);
588 }
589
590 return absl::OkStatus();
591}
592
593absl::Status DungeonEditorSystem::SetChestOpened(int chest_id, bool opened) {
594 auto it = chests_.find(chest_id);
595 if (it == chests_.end()) {
596 return absl::NotFoundError("Chest not found");
597 }
598
599 it->second.is_opened = opened;
600
602 chest_changed_callback_(chest_id);
603 }
604
605 return absl::OkStatus();
606}
607
608// Room properties and metadata
609absl::Status DungeonEditorSystem::SetRoomProperties(int room_id, const RoomProperties& properties) {
610 room_properties_[room_id] = properties;
611
613 room_changed_callback_(room_id);
614 }
615
616 return absl::OkStatus();
617}
618
619absl::StatusOr<DungeonEditorSystem::RoomProperties> DungeonEditorSystem::GetRoomProperties(int room_id) {
620 auto it = room_properties_.find(room_id);
621 if (it == room_properties_.end()) {
622 // Return default properties
623 RoomProperties default_properties;
624 default_properties.room_id = room_id;
625 default_properties.name = absl::StrFormat("Room %d", room_id);
626 default_properties.description = "";
627 default_properties.dungeon_id = 0;
628 default_properties.floor_level = 0;
629 default_properties.is_boss_room = false;
630 default_properties.is_save_room = false;
631 default_properties.is_shop_room = false;
632 default_properties.music_id = 0;
633 default_properties.ambient_sound_id = 0;
634 return default_properties;
635 }
636
637 return it->second;
638}
639
640// Dungeon-wide settings
642 dungeon_settings_ = settings;
643 return absl::OkStatus();
644}
645
646absl::StatusOr<DungeonEditorSystem::DungeonSettings> DungeonEditorSystem::GetDungeonSettings() {
647 return dungeon_settings_;
648}
649
650// Validation and error checking
651absl::Status DungeonEditorSystem::ValidateRoom(int room_id) {
652 // TODO: Implement room validation
653 return absl::OkStatus();
654}
655
657 // TODO: Implement dungeon validation
658 return absl::OkStatus();
659}
660
661std::vector<std::string> DungeonEditorSystem::GetValidationErrors(int room_id) {
662 // TODO: Implement validation error collection
663 return {};
664}
665
667 // TODO: Implement dungeon validation error collection
668 return {};
669}
670
671// Rendering and preview
672absl::StatusOr<gfx::Bitmap> DungeonEditorSystem::RenderRoom(int room_id) {
673 // TODO: Implement room rendering
674 return gfx::Bitmap();
675}
676
677absl::StatusOr<gfx::Bitmap> DungeonEditorSystem::RenderRoomPreview(int room_id, EditorMode mode) {
678 // TODO: Implement room preview rendering
679 return gfx::Bitmap();
680}
681
682absl::StatusOr<gfx::Bitmap> DungeonEditorSystem::RenderDungeonMap() {
683 // TODO: Implement dungeon map rendering
684 return gfx::Bitmap();
685}
686
687// Import/Export functionality
688absl::Status DungeonEditorSystem::ImportRoomFromFile(const std::string& file_path, int room_id) {
689 // TODO: Implement room import
690 return absl::OkStatus();
691}
692
693absl::Status DungeonEditorSystem::ExportRoomToFile(int room_id, const std::string& file_path) {
694 // TODO: Implement room export
695 return absl::OkStatus();
696}
697
698absl::Status DungeonEditorSystem::ImportDungeonFromFile(const std::string& file_path) {
699 // TODO: Implement dungeon import
700 return absl::OkStatus();
701}
702
703absl::Status DungeonEditorSystem::ExportDungeonToFile(const std::string& file_path) {
704 // TODO: Implement dungeon export
705 return absl::OkStatus();
706}
707
708// Undo/Redo system
710 if (!CanUndo()) {
711 return absl::FailedPreconditionError("Nothing to undo");
712 }
713
714 // TODO: Implement undo functionality
715 return absl::OkStatus();
716}
717
719 if (!CanRedo()) {
720 return absl::FailedPreconditionError("Nothing to redo");
721 }
722
723 // TODO: Implement redo functionality
724 return absl::OkStatus();
725}
726
728 return !undo_history_.empty();
729}
730
732 return !redo_history_.empty();
733}
734
736 undo_history_.clear();
737 redo_history_.clear();
738}
739
740// Event callbacks
744
748
752
756
760
764
768
772
773// Helper methods
777
781
785
789
793
795 return rom_;
796}
797
801
803 rom_ = rom;
804 // Update object editor with new ROM if it exists
805 if (object_editor_) {
806 object_editor_->SetROM(rom);
807 }
808}
809
810// Factory function
811std::unique_ptr<DungeonEditorSystem> CreateDungeonEditorSystem(Rom* rom) {
812 return std::make_unique<DungeonEditorSystem>(rom);
813}
814
815} // namespace zelda3
816} // namespace yaze
The Rom class is used to load, save, and modify Rom data.
Definition rom.h:71
Represents a bitmap image optimized for SNES ROM hacking.
Definition bitmap.h:66
absl::StatusOr< DungeonSettings > GetDungeonSettings()
void SetSpriteChangedCallback(SpriteChangedCallback callback)
absl::Status UpdateItem(int item_id, const ItemData &item_data)
absl::Status DuplicateRoom(int source_room_id, int target_room_id)
absl::Status UpdateDoor(int door_id, const DoorData &door_data)
absl::StatusOr< EntranceData > GetEntrance(int entrance_id)
std::unordered_map< int, DoorData > doors_
absl::Status ExportRoomToFile(int room_id, const std::string &file_path)
std::function< void(const std::vector< std::string > &errors)> ValidationCallback
std::unordered_map< int, EntranceData > entrances_
absl::StatusOr< std::vector< SpriteData > > GetSpritesByType(DungeonEditorSystem::SpriteType type)
absl::Status SetRoomProperties(int room_id, const RoomProperties &properties)
absl::Status RemoveEntrance(int entrance_id)
absl::Status SetChestOpened(int chest_id, bool opened)
std::function< void(int sprite_id)> SpriteChangedCallback
std::unordered_map< int, SpriteData > sprites_
absl::StatusOr< std::vector< DoorData > > GetDoorsByRoom(int room_id)
std::function< void(int door_id)> DoorChangedCallback
absl::StatusOr< SpriteData > GetSprite(int sprite_id)
absl::Status MoveSprite(int sprite_id, int new_x, int new_y)
EntranceChangedCallback entrance_changed_callback_
absl::Status SetDoorKeyRequirement(int door_id, bool requires_key, int key_type)
void SetRoomChangedCallback(RoomChangedCallback callback)
void SetEntranceChangedCallback(EntranceChangedCallback callback)
std::vector< std::string > GetValidationErrors(int room_id)
absl::StatusOr< RoomProperties > GetRoomProperties(int room_id)
std::shared_ptr< DungeonObjectEditor > object_editor_
absl::Status AddSprite(const SpriteData &sprite_data)
std::shared_ptr< DungeonObjectEditor > GetObjectEditor()
absl::Status SetSpriteActive(int sprite_id, bool active)
void SetChestChangedCallback(ChestChangedCallback callback)
absl::Status SetCurrentRoom(int room_id)
absl::StatusOr< std::vector< ItemData > > GetItemsByType(DungeonEditorSystem::ItemType type)
absl::Status ConnectRooms(int room1_id, int room2_id, int x1, int y1, int x2, int y2)
absl::StatusOr< gfx::Bitmap > RenderRoomPreview(int room_id, EditorMode mode)
std::vector< std::string > GetDungeonValidationErrors()
std::unordered_map< int, ChestData > chests_
std::unordered_map< int, ItemData > items_
absl::Status AddDoor(const DoorData &door_data)
std::function< void(int item_id)> ItemChangedCallback
absl::StatusOr< std::vector< EntranceData > > GetEntrancesByRoom(int room_id)
absl::Status SetDungeonSettings(const DungeonSettings &settings)
absl::Status ImportDungeonFromFile(const std::string &file_path)
absl::StatusOr< gfx::Bitmap > RenderRoom(int room_id)
absl::Status UpdateEntrance(int entrance_id, const EntranceData &entrance_data)
void SetModeChangedCallback(ModeChangedCallback callback)
absl::StatusOr< gfx::Bitmap > RenderDungeonMap()
absl::Status DisconnectRooms(int room1_id, int room2_id)
std::unordered_map< int, RoomProperties > room_properties_
absl::Status ExportDungeonToFile(const std::string &file_path)
std::function< void(EditorMode mode)> ModeChangedCallback
absl::Status RemoveSprite(int sprite_id)
absl::StatusOr< std::vector< ChestData > > GetChestsByRoom(int room_id)
absl::Status LoadDungeon(int dungeon_id)
absl::StatusOr< std::vector< ItemData > > GetItemsByRoom(int room_id)
std::function< void(int room_id)> RoomChangedCallback
absl::Status MoveItem(int item_id, int new_x, int new_y)
absl::StatusOr< ChestData > GetChest(int chest_id)
absl::StatusOr< DoorData > GetDoor(int door_id)
absl::Status SetChestItem(int chest_id, int item_id, int quantity)
absl::StatusOr< std::vector< SpriteData > > GetSpritesByRoom(int room_id)
absl::Status UpdateChest(int chest_id, const ChestData &chest_data)
void SetDoorChangedCallback(DoorChangedCallback callback)
std::function< void(int chest_id)> ChestChangedCallback
absl::Status UpdateSprite(int sprite_id, const SpriteData &sprite_data)
absl::StatusOr< std::vector< EntranceData > > GetEntrancesByType(DungeonEditorSystem::EntranceType type)
absl::Status SetItemHidden(int item_id, bool hidden)
void SetItemChangedCallback(ItemChangedCallback callback)
absl::Status CreateRoom(int room_id, const std::string &name="")
absl::Status AddEntrance(const EntranceData &entrance_data)
absl::Status ImportRoomFromFile(const std::string &file_path, int room_id)
absl::StatusOr< ItemData > GetItem(int item_id)
absl::Status AddChest(const ChestData &chest_data)
absl::StatusOr< Room > GetRoom(int room_id)
absl::Status SetDoorLocked(int door_id, bool locked)
void SetValidationCallback(ValidationCallback callback)
std::function< void(int entrance_id)> EntranceChangedCallback
absl::Status AddItem(const ItemData &item_data)
constexpr int NumberOfRooms
Definition room.h:60
std::unique_ptr< DungeonEditorSystem > CreateDungeonEditorSystem(Rom *rom)
Factory function to create dungeon editor system.
Main namespace for the application.
Legacy chest data structure.
Definition zelda.h:437
Treasure chest.
Definition zelda.h:424
std::chrono::steady_clock::time_point last_save_time