yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
track_collision_generator.h
Go to the documentation of this file.
1#ifndef YAZE_ZELDA3_DUNGEON_TRACK_COLLISION_GENERATOR_H
2#define YAZE_ZELDA3_DUNGEON_TRACK_COLLISION_GENERATOR_H
3
4#include <cstdint>
5#include <string>
6#include <tuple>
7#include <utility>
8#include <vector>
9
10#include "absl/status/status.h"
11#include "absl/status/statusor.h"
12#include "rom/rom.h"
14#include "zelda3/dungeon/room.h"
15
16namespace yaze {
17namespace zelda3 {
18
19// Collision tile types used by the Oracle of Secrets minecart system.
20// The minecart sprite reads these via Sprite_GetTileAttr and dispatches
21// movement based on tile value.
22enum class TrackTileType : uint8_t {
23 HorizStraight = 0xB0,
24 VertStraight = 0xB1,
25 CornerTL = 0xB2, // top-left corner (exits: right, down)
26 CornerBL = 0xB3, // bottom-left corner (exits: right, up)
27 CornerTR = 0xB4, // top-right corner (exits: left, down)
28 CornerBR = 0xB5, // bottom-right corner (exits: left, up)
29 Intersection = 0xB6,
30 StopNorth = 0xB7, // endpoint: neighbor is south, cart departs south
31 StopSouth = 0xB8, // endpoint: neighbor is north, cart departs north
32 StopWest = 0xB9, // endpoint: neighbor is east, cart departs east
33 StopEast = 0xBA, // endpoint: neighbor is west, cart departs west
34 TJuncNorth = 0xBB,
35 TJuncSouth = 0xBC,
36 TJuncEast = 0xBD,
37 TJuncWest = 0xBE,
38 SwitchTL = 0xD0,
39 SwitchBL = 0xD1,
40 SwitchTR = 0xD2,
41 SwitchBR = 0xD3,
42};
43
53
55 // Track rail object ID to scan for (default: 0x31)
56 int track_object_id = 0x31;
57
58 // Positions to promote from regular corners to switch corners.
59 // Each pair is (tile_x, tile_y) in the 64x64 collision grid.
60 std::vector<std::pair<int, int>> switch_promotions;
61
62 // Manual stop direction overrides: (tile_x, tile_y, tile_type).
63 // Useful when the auto-detected direction isn't what you want.
64 std::vector<std::tuple<int, int, TrackTileType>> stop_overrides;
65};
66
67// Build a collision map from rail objects in a room.
68// Reads Object 0x31 (rail) positions, builds an occupancy grid,
69// then classifies each tile by its neighbor connectivity.
70absl::StatusOr<TrackCollisionResult> GenerateTrackCollision(
71 Room* room, const GeneratorOptions& options = {});
72
73// Write a generated collision map into the ROM.
74// Updates the pointer table at kCustomCollisionRoomPointers and appends
75// encoded data in single-tile format after existing collision data.
76absl::Status WriteTrackCollision(Rom* rom, int room_id,
77 const CustomCollisionMap& map);
78
79// Generate an ASCII visualization of a collision map for debug/review.
80std::string VisualizeCollisionMap(const CustomCollisionMap& map);
81
82} // namespace zelda3
83} // namespace yaze
84
85#endif // YAZE_ZELDA3_DUNGEON_TRACK_COLLISION_GENERATOR_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
absl::Status WriteTrackCollision(Rom *rom, int room_id, const CustomCollisionMap &map)
std::string VisualizeCollisionMap(const CustomCollisionMap &map)
absl::StatusOr< TrackCollisionResult > GenerateTrackCollision(Room *room, const GeneratorOptions &options)
std::vector< std::pair< int, int > > switch_promotions
std::vector< std::tuple< int, int, TrackTileType > > stop_overrides