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