backend-infra-engineer: Release v0.3.3 snapshot
This commit is contained in:
@@ -1,29 +1,29 @@
|
||||
#ifndef YAZE_APP_ZELDA3_DUNGEON_DUNGEON_EDITOR_SYSTEM_H
|
||||
#define YAZE_APP_ZELDA3_DUNGEON_DUNGEON_EDITOR_SYSTEM_H
|
||||
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
#include <unordered_map>
|
||||
#include <functional>
|
||||
#include <memory>
|
||||
#include <optional>
|
||||
#include <unordered_map>
|
||||
#include <vector>
|
||||
|
||||
#include "absl/status/status.h"
|
||||
#include "absl/status/statusor.h"
|
||||
#include "app/platform/window.h"
|
||||
#include "app/gfx/core/bitmap.h"
|
||||
#include "app/gfx/types/snes_palette.h"
|
||||
#include "app/platform/window.h"
|
||||
#include "app/rom.h"
|
||||
#include "zelda3/dungeon/room_object.h"
|
||||
#include "zelda3/dungeon/room.h"
|
||||
#include "zelda3/sprite/sprite.h"
|
||||
#include "dungeon_object_editor.h"
|
||||
#include "zelda3/dungeon/room.h"
|
||||
#include "zelda3/dungeon/room_object.h"
|
||||
#include "zelda3/sprite/sprite.h"
|
||||
|
||||
namespace yaze {
|
||||
namespace zelda3 {
|
||||
|
||||
/**
|
||||
* @brief Comprehensive dungeon editing system
|
||||
*
|
||||
*
|
||||
* This class provides a complete dungeon editing solution including:
|
||||
* - Object editing (walls, floors, decorations)
|
||||
* - Sprite management (enemies, NPCs, interactive elements)
|
||||
@@ -47,40 +47,40 @@ class DungeonEditorSystem {
|
||||
kProperties, // Room properties mode
|
||||
kGlobal // Dungeon-wide settings mode
|
||||
};
|
||||
|
||||
|
||||
// Sprite types and categories
|
||||
enum class SpriteType {
|
||||
kEnemy, // Hostile entities
|
||||
kNPC, // Non-player characters
|
||||
kInteractive, // Interactive objects
|
||||
kDecoration, // Decorative sprites
|
||||
kBoss, // Boss entities
|
||||
kSpecial // Special purpose sprites
|
||||
kEnemy, // Hostile entities
|
||||
kNPC, // Non-player characters
|
||||
kInteractive, // Interactive objects
|
||||
kDecoration, // Decorative sprites
|
||||
kBoss, // Boss entities
|
||||
kSpecial // Special purpose sprites
|
||||
};
|
||||
|
||||
|
||||
// Item types
|
||||
enum class ItemType {
|
||||
kWeapon, // Swords, bows, etc.
|
||||
kTool, // Hookshot, bombs, etc.
|
||||
kKey, // Keys and key items
|
||||
kHeart, // Heart containers and pieces
|
||||
kRupee, // Currency
|
||||
kBottle, // Bottles and contents
|
||||
kUpgrade, // Capacity upgrades
|
||||
kSpecial // Special items
|
||||
kWeapon, // Swords, bows, etc.
|
||||
kTool, // Hookshot, bombs, etc.
|
||||
kKey, // Keys and key items
|
||||
kHeart, // Heart containers and pieces
|
||||
kRupee, // Currency
|
||||
kBottle, // Bottles and contents
|
||||
kUpgrade, // Capacity upgrades
|
||||
kSpecial // Special items
|
||||
};
|
||||
|
||||
|
||||
// Entrance/exit types
|
||||
enum class EntranceType {
|
||||
kNormal, // Standard room entrance
|
||||
kStairs, // Staircase connection
|
||||
kDoor, // Door connection
|
||||
kCave, // Cave entrance
|
||||
kWarp, // Warp/teleport
|
||||
kBoss, // Boss room entrance
|
||||
kSpecial // Special entrance type
|
||||
kNormal, // Standard room entrance
|
||||
kStairs, // Staircase connection
|
||||
kDoor, // Door connection
|
||||
kCave, // Cave entrance
|
||||
kWarp, // Warp/teleport
|
||||
kBoss, // Boss room entrance
|
||||
kSpecial // Special entrance type
|
||||
};
|
||||
|
||||
|
||||
// Editor state
|
||||
struct EditorState {
|
||||
EditorMode current_mode = EditorMode::kObjects;
|
||||
@@ -89,7 +89,7 @@ class DungeonEditorSystem {
|
||||
bool auto_save_enabled = true;
|
||||
std::chrono::steady_clock::time_point last_save_time;
|
||||
};
|
||||
|
||||
|
||||
// Sprite editing data
|
||||
struct SpriteData {
|
||||
int sprite_id;
|
||||
@@ -100,7 +100,7 @@ class DungeonEditorSystem {
|
||||
std::unordered_map<std::string, std::string> properties;
|
||||
bool is_active = true;
|
||||
};
|
||||
|
||||
|
||||
// Item placement data
|
||||
struct ItemData {
|
||||
int item_id;
|
||||
@@ -111,7 +111,7 @@ class DungeonEditorSystem {
|
||||
bool is_hidden = false;
|
||||
std::unordered_map<std::string, std::string> properties;
|
||||
};
|
||||
|
||||
|
||||
// Entrance/exit data
|
||||
struct EntranceData {
|
||||
int entrance_id;
|
||||
@@ -124,7 +124,7 @@ class DungeonEditorSystem {
|
||||
bool is_bidirectional = true;
|
||||
std::unordered_map<std::string, std::string> properties;
|
||||
};
|
||||
|
||||
|
||||
// Door configuration data
|
||||
struct DoorData {
|
||||
int door_id;
|
||||
@@ -139,7 +139,7 @@ class DungeonEditorSystem {
|
||||
bool is_locked = false;
|
||||
std::unordered_map<std::string, std::string> properties;
|
||||
};
|
||||
|
||||
|
||||
// Chest data
|
||||
struct ChestData {
|
||||
int chest_id;
|
||||
@@ -151,21 +151,21 @@ class DungeonEditorSystem {
|
||||
bool is_opened = false;
|
||||
std::unordered_map<std::string, std::string> properties;
|
||||
};
|
||||
|
||||
|
||||
explicit DungeonEditorSystem(Rom* rom);
|
||||
~DungeonEditorSystem() = default;
|
||||
|
||||
|
||||
// System initialization and management
|
||||
absl::Status Initialize();
|
||||
absl::Status LoadDungeon(int dungeon_id);
|
||||
absl::Status SaveDungeon();
|
||||
absl::Status SaveRoom(int room_id);
|
||||
absl::Status ReloadRoom(int room_id);
|
||||
|
||||
|
||||
// Mode management
|
||||
void SetEditorMode(EditorMode mode);
|
||||
EditorMode GetEditorMode() const;
|
||||
|
||||
|
||||
// Room management
|
||||
absl::Status SetCurrentRoom(int room_id);
|
||||
int GetCurrentRoom() const;
|
||||
@@ -173,41 +173,46 @@ class DungeonEditorSystem {
|
||||
absl::Status CreateRoom(int room_id, const std::string& name = "");
|
||||
absl::Status DeleteRoom(int room_id);
|
||||
absl::Status DuplicateRoom(int source_room_id, int target_room_id);
|
||||
|
||||
|
||||
// Object editing (delegated to DungeonObjectEditor)
|
||||
std::shared_ptr<DungeonObjectEditor> GetObjectEditor();
|
||||
absl::Status SetObjectEditorMode();
|
||||
|
||||
|
||||
// Sprite management
|
||||
absl::Status AddSprite(const SpriteData& sprite_data);
|
||||
absl::Status RemoveSprite(int sprite_id);
|
||||
absl::Status UpdateSprite(int sprite_id, const SpriteData& sprite_data);
|
||||
absl::StatusOr<SpriteData> GetSprite(int sprite_id);
|
||||
absl::StatusOr<std::vector<SpriteData>> GetSpritesByRoom(int room_id);
|
||||
absl::StatusOr<std::vector<SpriteData>> GetSpritesByType(DungeonEditorSystem::SpriteType type);
|
||||
absl::StatusOr<std::vector<SpriteData>> GetSpritesByType(
|
||||
DungeonEditorSystem::SpriteType type);
|
||||
absl::Status MoveSprite(int sprite_id, int new_x, int new_y);
|
||||
absl::Status SetSpriteActive(int sprite_id, bool active);
|
||||
|
||||
|
||||
// Item management
|
||||
absl::Status AddItem(const ItemData& item_data);
|
||||
absl::Status RemoveItem(int item_id);
|
||||
absl::Status UpdateItem(int item_id, const ItemData& item_data);
|
||||
absl::StatusOr<ItemData> GetItem(int item_id);
|
||||
absl::StatusOr<std::vector<ItemData>> GetItemsByRoom(int room_id);
|
||||
absl::StatusOr<std::vector<ItemData>> GetItemsByType(DungeonEditorSystem::ItemType type);
|
||||
absl::StatusOr<std::vector<ItemData>> GetItemsByType(
|
||||
DungeonEditorSystem::ItemType type);
|
||||
absl::Status MoveItem(int item_id, int new_x, int new_y);
|
||||
absl::Status SetItemHidden(int item_id, bool hidden);
|
||||
|
||||
|
||||
// Entrance/exit management
|
||||
absl::Status AddEntrance(const EntranceData& entrance_data);
|
||||
absl::Status RemoveEntrance(int entrance_id);
|
||||
absl::Status UpdateEntrance(int entrance_id, const EntranceData& entrance_data);
|
||||
absl::Status UpdateEntrance(int entrance_id,
|
||||
const EntranceData& entrance_data);
|
||||
absl::StatusOr<EntranceData> GetEntrance(int entrance_id);
|
||||
absl::StatusOr<std::vector<EntranceData>> GetEntrancesByRoom(int room_id);
|
||||
absl::StatusOr<std::vector<EntranceData>> GetEntrancesByType(DungeonEditorSystem::EntranceType type);
|
||||
absl::Status ConnectRooms(int room1_id, int room2_id, int x1, int y1, int x2, int y2);
|
||||
absl::StatusOr<std::vector<EntranceData>> GetEntrancesByType(
|
||||
DungeonEditorSystem::EntranceType type);
|
||||
absl::Status ConnectRooms(int room1_id, int room2_id, int x1, int y1, int x2,
|
||||
int y2);
|
||||
absl::Status DisconnectRooms(int room1_id, int room2_id);
|
||||
|
||||
|
||||
// Door management
|
||||
absl::Status AddDoor(const DoorData& door_data);
|
||||
absl::Status RemoveDoor(int door_id);
|
||||
@@ -215,8 +220,9 @@ class DungeonEditorSystem {
|
||||
absl::StatusOr<DoorData> GetDoor(int door_id);
|
||||
absl::StatusOr<std::vector<DoorData>> GetDoorsByRoom(int room_id);
|
||||
absl::Status SetDoorLocked(int door_id, bool locked);
|
||||
absl::Status SetDoorKeyRequirement(int door_id, bool requires_key, int key_type);
|
||||
|
||||
absl::Status SetDoorKeyRequirement(int door_id, bool requires_key,
|
||||
int key_type);
|
||||
|
||||
// Chest management
|
||||
absl::Status AddChest(const ChestData& chest_data);
|
||||
absl::Status RemoveChest(int chest_id);
|
||||
@@ -225,7 +231,7 @@ class DungeonEditorSystem {
|
||||
absl::StatusOr<std::vector<ChestData>> GetChestsByRoom(int room_id);
|
||||
absl::Status SetChestItem(int chest_id, int item_id, int quantity);
|
||||
absl::Status SetChestOpened(int chest_id, bool opened);
|
||||
|
||||
|
||||
// Room properties and metadata
|
||||
struct RoomProperties {
|
||||
int room_id;
|
||||
@@ -240,10 +246,10 @@ class DungeonEditorSystem {
|
||||
int ambient_sound_id = 0;
|
||||
std::unordered_map<std::string, std::string> custom_properties;
|
||||
};
|
||||
|
||||
|
||||
absl::Status SetRoomProperties(int room_id, const RoomProperties& properties);
|
||||
absl::StatusOr<RoomProperties> GetRoomProperties(int room_id);
|
||||
|
||||
|
||||
// Dungeon-wide settings
|
||||
struct DungeonSettings {
|
||||
int dungeon_id;
|
||||
@@ -259,34 +265,34 @@ class DungeonEditorSystem {
|
||||
bool has_big_key = true;
|
||||
std::unordered_map<std::string, std::string> custom_settings;
|
||||
};
|
||||
|
||||
|
||||
absl::Status SetDungeonSettings(const DungeonSettings& settings);
|
||||
absl::StatusOr<DungeonSettings> GetDungeonSettings();
|
||||
|
||||
|
||||
// Validation and error checking
|
||||
absl::Status ValidateRoom(int room_id);
|
||||
absl::Status ValidateDungeon();
|
||||
std::vector<std::string> GetValidationErrors(int room_id);
|
||||
std::vector<std::string> GetDungeonValidationErrors();
|
||||
|
||||
|
||||
// Rendering and preview
|
||||
absl::StatusOr<gfx::Bitmap> RenderRoom(int room_id);
|
||||
absl::StatusOr<gfx::Bitmap> RenderRoomPreview(int room_id, EditorMode mode);
|
||||
absl::StatusOr<gfx::Bitmap> RenderDungeonMap();
|
||||
|
||||
|
||||
// Import/Export functionality
|
||||
absl::Status ImportRoomFromFile(const std::string& file_path, int room_id);
|
||||
absl::Status ExportRoomToFile(int room_id, const std::string& file_path);
|
||||
absl::Status ImportDungeonFromFile(const std::string& file_path);
|
||||
absl::Status ExportDungeonToFile(const std::string& file_path);
|
||||
|
||||
|
||||
// Undo/Redo system
|
||||
absl::Status Undo();
|
||||
absl::Status Redo();
|
||||
bool CanUndo() const;
|
||||
bool CanRedo() const;
|
||||
void ClearHistory();
|
||||
|
||||
|
||||
// Event callbacks
|
||||
using RoomChangedCallback = std::function<void(int room_id)>;
|
||||
using SpriteChangedCallback = std::function<void(int sprite_id)>;
|
||||
@@ -295,8 +301,9 @@ class DungeonEditorSystem {
|
||||
using DoorChangedCallback = std::function<void(int door_id)>;
|
||||
using ChestChangedCallback = std::function<void(int chest_id)>;
|
||||
using ModeChangedCallback = std::function<void(EditorMode mode)>;
|
||||
using ValidationCallback = std::function<void(const std::vector<std::string>& errors)>;
|
||||
|
||||
using ValidationCallback =
|
||||
std::function<void(const std::vector<std::string>& errors)>;
|
||||
|
||||
void SetRoomChangedCallback(RoomChangedCallback callback);
|
||||
void SetSpriteChangedCallback(SpriteChangedCallback callback);
|
||||
void SetItemChangedCallback(ItemChangedCallback callback);
|
||||
@@ -305,13 +312,13 @@ class DungeonEditorSystem {
|
||||
void SetChestChangedCallback(ChestChangedCallback callback);
|
||||
void SetModeChangedCallback(ModeChangedCallback callback);
|
||||
void SetValidationCallback(ValidationCallback callback);
|
||||
|
||||
|
||||
// Getters
|
||||
EditorState GetEditorState() const;
|
||||
Rom* GetROM() const;
|
||||
bool IsDirty() const;
|
||||
bool HasUnsavedChanges() const;
|
||||
|
||||
|
||||
// ROM management
|
||||
void SetROM(Rom* rom);
|
||||
|
||||
@@ -323,7 +330,7 @@ class DungeonEditorSystem {
|
||||
absl::Status InitializeEntranceSystem();
|
||||
absl::Status InitializeDoorSystem();
|
||||
absl::Status InitializeChestSystem();
|
||||
|
||||
|
||||
// Data management
|
||||
absl::Status LoadRoomData(int room_id);
|
||||
absl::Status SaveRoomData(int room_id);
|
||||
@@ -337,28 +344,28 @@ class DungeonEditorSystem {
|
||||
absl::Status SaveDoorData();
|
||||
absl::Status LoadChestData();
|
||||
absl::Status SaveChestData();
|
||||
|
||||
|
||||
// Validation helpers
|
||||
absl::Status ValidateSprite(const SpriteData& sprite);
|
||||
absl::Status ValidateItem(const ItemData& item);
|
||||
absl::Status ValidateEntrance(const EntranceData& entrance);
|
||||
absl::Status ValidateDoor(const DoorData& door);
|
||||
absl::Status ValidateChest(const ChestData& chest);
|
||||
|
||||
|
||||
// ID generation
|
||||
int GenerateSpriteId();
|
||||
int GenerateItemId();
|
||||
int GenerateEntranceId();
|
||||
int GenerateDoorId();
|
||||
int GenerateChestId();
|
||||
|
||||
|
||||
// Member variables
|
||||
Rom* rom_;
|
||||
std::shared_ptr<DungeonObjectEditor> object_editor_;
|
||||
|
||||
|
||||
EditorState editor_state_;
|
||||
DungeonSettings dungeon_settings_;
|
||||
|
||||
|
||||
// Data storage
|
||||
std::unordered_map<int, Room> rooms_;
|
||||
std::unordered_map<int, SpriteData> sprites_;
|
||||
@@ -367,14 +374,14 @@ class DungeonEditorSystem {
|
||||
std::unordered_map<int, DoorData> doors_;
|
||||
std::unordered_map<int, ChestData> chests_;
|
||||
std::unordered_map<int, RoomProperties> room_properties_;
|
||||
|
||||
|
||||
// ID counters
|
||||
int next_sprite_id_ = 1;
|
||||
int next_item_id_ = 1;
|
||||
int next_entrance_id_ = 1;
|
||||
int next_door_id_ = 1;
|
||||
int next_chest_id_ = 1;
|
||||
|
||||
|
||||
// Event callbacks
|
||||
RoomChangedCallback room_changed_callback_;
|
||||
SpriteChangedCallback sprite_changed_callback_;
|
||||
@@ -384,7 +391,7 @@ class DungeonEditorSystem {
|
||||
ChestChangedCallback chest_changed_callback_;
|
||||
ModeChangedCallback mode_changed_callback_;
|
||||
ValidationCallback validation_callback_;
|
||||
|
||||
|
||||
// Undo/Redo system
|
||||
struct UndoPoint {
|
||||
EditorState state;
|
||||
@@ -396,7 +403,7 @@ class DungeonEditorSystem {
|
||||
std::unordered_map<int, ChestData> chests;
|
||||
std::chrono::steady_clock::time_point timestamp;
|
||||
};
|
||||
|
||||
|
||||
std::vector<UndoPoint> undo_history_;
|
||||
std::vector<UndoPoint> redo_history_;
|
||||
static constexpr size_t kMaxUndoHistory = 100;
|
||||
@@ -411,7 +418,7 @@ std::unique_ptr<DungeonEditorSystem> CreateDungeonEditorSystem(Rom* rom);
|
||||
* @brief Sprite type utilities
|
||||
*/
|
||||
namespace SpriteTypes {
|
||||
|
||||
|
||||
/**
|
||||
* @brief Get sprite information by ID
|
||||
*/
|
||||
@@ -438,7 +445,7 @@ absl::StatusOr<std::string> GetSpriteCategory(int sprite_id);
|
||||
* @brief Item type utilities
|
||||
*/
|
||||
namespace ItemTypes {
|
||||
|
||||
|
||||
/**
|
||||
* @brief Get item information by ID
|
||||
*/
|
||||
@@ -465,7 +472,7 @@ absl::StatusOr<std::string> GetItemCategory(int item_id);
|
||||
* @brief Entrance type utilities
|
||||
*/
|
||||
namespace EntranceTypes {
|
||||
|
||||
|
||||
/**
|
||||
* @brief Get entrance information by ID
|
||||
*/
|
||||
@@ -482,7 +489,8 @@ struct EntranceInfo {
|
||||
|
||||
absl::StatusOr<EntranceInfo> GetEntranceInfo(int entrance_id);
|
||||
std::vector<EntranceInfo> GetAllEntranceInfos();
|
||||
std::vector<EntranceInfo> GetEntrancesByType(DungeonEditorSystem::EntranceType type);
|
||||
std::vector<EntranceInfo> GetEntrancesByType(
|
||||
DungeonEditorSystem::EntranceType type);
|
||||
|
||||
} // namespace EntranceTypes
|
||||
|
||||
|
||||
Reference in New Issue
Block a user