Files
yaze/src/app/zelda3/dungeon/room_layout.h
scawful 8481cd9366 refactor: Update Dungeon Rendering Logic for Enhanced Tile Management (WIP)
- Refactored DungeonCanvasViewer to utilize LoadLayoutTilesToBuffer for rendering layout tiles, improving the separation of concerns in the rendering process.
- Updated ObjectDrawer to draw using 8x8 tiles instead of 16x16, enhancing tile rendering accuracy and efficiency.
- Modified Room and RoomLayoutObject classes to support room-specific graphics buffers, ensuring correct tile usage during rendering.
- Removed legacy methods and classes related to tile handling, streamlining the codebase and improving maintainability.
2025-10-09 23:50:12 -04:00

122 lines
3.5 KiB
C++

#ifndef YAZE_APP_ZELDA3_DUNGEON_ROOM_LAYOUT_H
#define YAZE_APP_ZELDA3_DUNGEON_ROOM_LAYOUT_H
#include <cstdint>
#include <vector>
#include "absl/status/status.h"
#include "absl/status/statusor.h"
#include "app/gfx/snes_tile.h"
#include "app/rom.h"
namespace yaze {
namespace zelda3 {
/**
* @brief Represents a room layout object (wall, floor, etc.)
*
* Room layout objects are the basic building blocks of dungeon rooms.
* They include walls, floors, ceilings, and other structural elements.
* Unlike regular room objects, these are loaded from the room layout data
* and represent the fundamental geometry of the room.
*/
class RoomLayoutObject {
public:
enum class Type {
kWall = 0,
kFloor = 1,
kCeiling = 2,
kPit = 3,
kWater = 4,
kStairs = 5,
kDoor = 6,
kUnknown = 7
};
RoomLayoutObject(int16_t id, uint8_t x, uint8_t y, Type type, uint8_t layer = 0)
: id_(id), x_(x), y_(y), type_(type), layer_(layer) {}
// Getters
int16_t id() const { return id_; }
uint8_t x() const { return x_; }
uint8_t y() const { return y_; }
Type type() const { return type_; }
uint8_t layer() const { return layer_; }
// Setters
void set_id(int16_t id) { id_ = id; }
void set_x(uint8_t x) { x_ = x; }
void set_y(uint8_t y) { y_ = y; }
void set_type(Type type) { type_ = type; }
void set_layer(uint8_t layer) { layer_ = layer; }
// Get tile data for this layout object
// NOTE: Layout codes need to be mapped to actual VRAM tile IDs
// The room_gfx_buffer provides the assembled graphics for this specific room
absl::StatusOr<gfx::Tile16> GetTile(const uint8_t* room_gfx_buffer = nullptr) const;
// Get the name/description of this layout object type
std::string GetTypeName() const;
private:
int16_t id_;
uint8_t x_;
uint8_t y_;
Type type_;
uint8_t layer_;
};
/**
* @brief Manages room layout data and objects
*
* This class handles loading and managing room layout objects from ROM data.
* It provides efficient access to wall, floor, and other layout elements
* without copying large amounts of data.
*/
class RoomLayout {
public:
RoomLayout() = default;
explicit RoomLayout(Rom* rom) : rom_(rom) {}
// Load layout data from ROM for a specific room
absl::Status LoadLayout(int room_id);
// Load layout data from a specific address
absl::Status LoadLayoutData(int layout_data_address);
// Get all layout objects of a specific type
std::vector<RoomLayoutObject> GetObjectsByType(RoomLayoutObject::Type type) const;
// Get layout object at specific coordinates
absl::StatusOr<RoomLayoutObject> GetObjectAt(uint8_t x, uint8_t y, uint8_t layer = 0) const;
// Get all layout objects
const std::vector<RoomLayoutObject>& GetObjects() const { return objects_; }
// Check if a position has a wall
bool HasWall(uint8_t x, uint8_t y, uint8_t layer = 0) const;
// Check if a position has a floor
bool HasFloor(uint8_t x, uint8_t y, uint8_t layer = 0) const;
// Get room dimensions
std::pair<uint8_t, uint8_t> GetDimensions() const { return {width_, height_}; }
private:
Rom* rom_ = nullptr;
std::vector<RoomLayoutObject> objects_;
uint8_t width_ = 16; // Default room width in tiles
uint8_t height_ = 11; // Default room height in tiles
// Parse layout data from ROM
absl::Status ParseLayoutData(const std::vector<uint8_t>& data);
// Create layout object from tile data
RoomLayoutObject CreateLayoutObject(int16_t tile_id, uint8_t x, uint8_t y, uint8_t layer);
};
} // namespace zelda3
} // namespace yaze
#endif // YAZE_APP_ZELDA3_DUNGEON_ROOM_LAYOUT_H