2.7 KiB
Task 10: CorridorCarver Pass
Depends on: Task 6
Context Files
.dev/2026-05-28-procgen-map-core/spec/design.md— §4.7 (Connector role), §5 (data flow)..dev/2026-05-28-procgen-map-core/README.md— inter-pass data contract (CorridorCarver row).reikhelm-core/src/pass.rs—Pass,GenContext(Task 6).reikhelm-core/src/region.rs,reikhelm-core/src/map.rs—ConnGraph,Region,RegionKind::Corridor,Tile::Floor.reikhelm-core/src/geometry.rs—Line,Point(Task 2).reikhelm-core/src/passes/mod.rs— append the module declaration here.
Files
- Create:
reikhelm-core/src/passes/corridor.rs—CorridorCarver. - Modify:
reikhelm-core/src/passes/mod.rs— appendpub mod corridor;and re-exportCorridorCarver.
What to Build
A connector (spec §4.7) that physically carves the connections chosen by MstConnect. For each edge in ctx.graph, carve an L-shaped corridor (one horizontal run + one vertical run, joined at an elbow; randomize which leg comes first) of Tile::Floor between the two rooms' centers. Append a Region { kind: Corridor, .. } describing each carved corridor's cells. All grid writes go through bounds-safe accessors (never panic). Carving over an existing Floor cell is fine (corridors may pass through or merge).
This pass does not set door tiles or edge.at — that's DoorPlacer. It reads ctx.graph + Room region centers and writes ctx.tiles + Corridor regions. Tests construct the precondition (rooms + a graph) directly.
Interface Dependencies
- Consumes:
Pass,GenContext,Rng(Task 6);ConnGraph,Region,Tile(Task 5);Line,Point(Task 2). - Produces:
struct CorridorCarver { /* unit or small config; Default */ }—default()/new();impl Passwithname() == "corridor_carver".- Writes to context:
Floorcorridors inctx.tiles; oneCorridorregion per edge.
Tests
- Given two rooms (carved Floor rects) and one graph edge between them, after running: a contiguous
Floorpath connects the two room interiors (verify by flood-fill: both room centers are in the same connected floor component). - An L-corridor's cells are all in-bounds; carving never panics even if a center is near the map edge.
- One
Corridorregion is added per edge. - Determinism: same seed/sub-stream → identical carved corridors.
Success Criteria
CorridorCarvercarves L-shapedFloorcorridors for every graph edge and adds Corridor regions; rooms become floor-connected.- Bounds-safe; sets no doors and does not touch
edge.at. pub mod corridor;appended topasses/mod.rs.- Tests pass:
cargo test -p reikhelm-core corridor
Commit
"feat(core): CorridorCarver pass"