yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
dungeon_coordinates.h
Go to the documentation of this file.
1#ifndef YAZE_APP_EDITOR_DUNGEON_DUNGEON_COORDINATES_H_
2#define YAZE_APP_EDITOR_DUNGEON_DUNGEON_COORDINATES_H_
3
4#include <cstdint>
5#include <utility>
6
7namespace yaze {
8namespace editor {
9
29namespace dungeon_coords {
30
31// Room constants
32constexpr int kTileSize = 8; // Dungeon tiles are 8x8 pixels
33constexpr int kRoomTileWidth = 64; // Room width in tiles
34constexpr int kRoomTileHeight = 64; // Room height in tiles
35constexpr int kRoomPixelWidth = 512; // 64 * 8
36constexpr int kRoomPixelHeight = 512; // 64 * 8
37constexpr int kRoomCount = 0x128; // 296 rooms total
38constexpr int kEntranceCount = 0x8C; // 140 entrances total
39
40// Sprite coordinate system uses 16-pixel units
41constexpr int kSpriteTileSize = 16;
42constexpr int kSpriteGridMax = 31; // 0-31 range for sprites
43
44// Camera/World coordinate constants
45constexpr uint16_t kCameraBaseOffset = 0x1000; // Base offset for dungeon camera
46constexpr int kDungeonGridWidth = 16; // Rooms per row in dungeon grid
47
54inline std::pair<int, int> RoomToCanvas(int room_x, int room_y) {
55 return {room_x * kTileSize, room_y * kTileSize};
56}
57
64inline std::pair<int, int> CanvasToRoom(int canvas_x, int canvas_y) {
65 return {canvas_x / kTileSize, canvas_y / kTileSize};
66}
67
75inline std::pair<int, int> ScreenToCanvas(int screen_x, int screen_y,
76 float scale) {
77 if (scale <= 0.0f) scale = 1.0f;
78 return {static_cast<int>(screen_x / scale),
79 static_cast<int>(screen_y / scale)};
80}
81
89inline std::pair<int, int> CanvasToScreen(int canvas_x, int canvas_y,
90 float scale) {
91 return {static_cast<int>(canvas_x * scale),
92 static_cast<int>(canvas_y * scale)};
93}
94
101inline bool IsWithinBounds(int canvas_x, int canvas_y, int margin = 0) {
102 return canvas_x >= -margin && canvas_y >= -margin &&
103 canvas_x < kRoomPixelWidth + margin &&
104 canvas_y < kRoomPixelHeight + margin;
105}
106
113inline std::pair<int, int> ClampToRoom(int room_x, int room_y) {
114 if (room_x < 0) room_x = 0;
115 if (room_x >= kRoomTileWidth) room_x = kRoomTileWidth - 1;
116 if (room_y < 0) room_y = 0;
117 if (room_y >= kRoomTileHeight) room_y = kRoomTileHeight - 1;
118 return {room_x, room_y};
119}
120
126inline bool IsValidRoomId(int room_id) {
127 return room_id >= 0 && room_id < kRoomCount;
128}
129
130// ============================================================================
131// Camera/World Coordinate System
132// ============================================================================
133
139inline std::pair<int, int> RoomIdToGridPosition(int room_id) {
140 return {room_id % kDungeonGridWidth, room_id / kDungeonGridWidth};
141}
142
153inline uint16_t CalculateCameraX(int room_id, int local_pixel_x) {
154 auto [col, row] = RoomIdToGridPosition(room_id);
155 return kCameraBaseOffset + (col * kRoomPixelWidth) + local_pixel_x;
156}
157
165inline uint16_t CalculateCameraY(int room_id, int local_pixel_y) {
166 auto [col, row] = RoomIdToGridPosition(room_id);
167 return kCameraBaseOffset + (row * kRoomPixelWidth) + local_pixel_y;
168}
169
180inline std::pair<uint16_t, uint16_t> TileToCameraCoords(int room_id,
181 int tile_x,
182 int tile_y) {
183 int pixel_x = tile_x * kTileSize;
184 int pixel_y = tile_y * kTileSize;
185 return {CalculateCameraX(room_id, pixel_x),
186 CalculateCameraY(room_id, pixel_y)};
187}
188
203
204inline CameraToLocalResult CameraToLocalCoords(uint16_t camera_x,
205 uint16_t camera_y) {
206 // Remove base offset
207 int world_x = camera_x - kCameraBaseOffset;
208 int world_y = camera_y - kCameraBaseOffset;
209
210 // Calculate grid position
211 int col = world_x / kRoomPixelWidth;
212 int row = world_y / kRoomPixelHeight;
213
214 // Calculate local position
215 int local_x = world_x % kRoomPixelWidth;
216 int local_y = world_y % kRoomPixelHeight;
217
218 // Handle negative values (shouldn't happen normally)
219 if (world_x < 0) { col = 0; local_x = 0; }
220 if (world_y < 0) { row = 0; local_y = 0; }
221
222 return {
223 row * kDungeonGridWidth + col, // room_id
224 local_x, // local_pixel_x
225 local_y, // local_pixel_y
226 local_x / kTileSize, // local_tile_x
227 local_y / kTileSize // local_tile_y
228 };
229}
230
241inline std::pair<uint16_t, uint16_t> SpriteToCameraCoords(int room_id,
242 int sprite_x,
243 int sprite_y) {
244 int pixel_x = sprite_x * kSpriteTileSize;
245 int pixel_y = sprite_y * kSpriteTileSize;
246 return {CalculateCameraX(room_id, pixel_x),
247 CalculateCameraY(room_id, pixel_y)};
248}
249
250} // namespace dungeon_coords
251} // namespace editor
252} // namespace yaze
253
254#endif // YAZE_APP_EDITOR_DUNGEON_DUNGEON_COORDINATES_H_
bool IsValidRoomId(int room_id)
Validate room ID is within valid range.
std::pair< uint16_t, uint16_t > TileToCameraCoords(int room_id, int tile_x, int tile_y)
Calculate camera coordinates from room and tile position.
std::pair< int, int > CanvasToScreen(int canvas_x, int canvas_y, float scale)
Convert canvas coordinates to screen coordinates (apply scale)
uint16_t CalculateCameraX(int room_id, int local_pixel_x)
Calculate absolute camera X coordinate from room and local position.
std::pair< int, int > ScreenToCanvas(int screen_x, int screen_y, float scale)
Convert screen coordinates to canvas coordinates (undo scale)
std::pair< int, int > RoomToCanvas(int room_x, int room_y)
Convert room tile coordinates to canvas pixel coordinates.
bool IsWithinBounds(int canvas_x, int canvas_y, int margin=0)
Check if coordinates are within room bounds.
uint16_t CalculateCameraY(int room_id, int local_pixel_y)
Calculate absolute camera Y coordinate from room and local position.
std::pair< int, int > RoomIdToGridPosition(int room_id)
Get the grid position (column, row) for a room ID.
CameraToLocalResult CameraToLocalCoords(uint16_t camera_x, uint16_t camera_y)
std::pair< uint16_t, uint16_t > SpriteToCameraCoords(int room_id, int sprite_x, int sprite_y)
Calculate sprite-format coordinates (16-pixel units)
std::pair< int, int > CanvasToRoom(int canvas_x, int canvas_y)
Convert canvas pixel coordinates to room tile coordinates.
std::pair< int, int > ClampToRoom(int room_x, int room_y)
Clamp room tile coordinates to valid range.
Convert camera coordinates back to room ID and local position.