Skip to main content

steel_worldgen/structure/mansion/
walls.rs

1use super::{Direction, Rotation};
2use super::{
3    grid::{SimpleGrid, is_house},
4    placement::PlacementData,
5    template::{MansionTemplatePiece, Mirror, add_piece, compose_rotation, relative},
6};
7
8pub(super) fn place_entrance(pieces: &mut Vec<MansionTemplatePiece>, data: &mut PlacementData) {
9    let pos = relative(data.position, data.rotation, Direction::West, 9);
10    add_piece(pieces, "entrance", pos, data.rotation, Mirror::None);
11    data.position = relative(data.position, data.rotation, Direction::South, 16);
12}
13
14pub(super) fn traverse_wall_piece(
15    pieces: &mut Vec<MansionTemplatePiece>,
16    data: &mut PlacementData,
17) {
18    let pos = relative(data.position, data.rotation, Direction::East, 7);
19    add_piece(pieces, data.wall_type, pos, data.rotation, Mirror::None);
20    data.position = relative(data.position, data.rotation, Direction::South, 8);
21}
22
23pub(super) fn traverse_turn(pieces: &mut Vec<MansionTemplatePiece>, data: &mut PlacementData) {
24    data.position = relative(data.position, data.rotation, Direction::South, -1);
25    add_piece(
26        pieces,
27        "wall_corner",
28        data.position,
29        data.rotation,
30        Mirror::None,
31    );
32    data.position = relative(data.position, data.rotation, Direction::South, -7);
33    data.position = relative(data.position, data.rotation, Direction::West, -6);
34    data.rotation = compose_rotation(data.rotation, Rotation::Clockwise90);
35}
36
37pub(super) fn traverse_inner_turn(
38    _pieces: &mut Vec<MansionTemplatePiece>,
39    data: &mut PlacementData,
40) {
41    data.position = relative(data.position, data.rotation, Direction::South, 6);
42    data.position = relative(data.position, data.rotation, Direction::East, 8);
43    data.rotation = compose_rotation(data.rotation, Rotation::CounterClockwise90);
44}
45
46#[expect(
47    clippy::too_many_arguments,
48    reason = "mirrors vanilla's traverseOuterWalls signature"
49)]
50pub(super) fn traverse_outer_walls(
51    pieces: &mut Vec<MansionTemplatePiece>,
52    data: &mut PlacementData,
53    grid: &SimpleGrid,
54    initial_dir: Direction,
55    start_x: i32,
56    start_y: i32,
57    end_x: i32,
58    end_y: i32,
59) {
60    let mut grid_x = start_x;
61    let mut grid_y = start_y;
62    let mut dir = initial_dir;
63    let start_dir = dir;
64
65    loop {
66        let (dx, dz) = dir.offset_xz();
67        if !is_house(grid, grid_x + dx, grid_y + dz) {
68            traverse_turn(pieces, data);
69            dir = dir.rotate_y_clockwise();
70            if grid_x != end_x || grid_y != end_y || start_dir != dir {
71                traverse_wall_piece(pieces, data);
72            }
73        } else if is_house(grid, grid_x + dx, grid_y + dz)
74            && is_house(
75                grid,
76                grid_x + dx + dir.rotate_y_counter_clockwise().offset_vec().x,
77                grid_y + dz + dir.rotate_y_counter_clockwise().offset_vec().z,
78            )
79        {
80            traverse_inner_turn(pieces, data);
81            grid_x += dx;
82            grid_y += dz;
83            dir = dir.rotate_y_counter_clockwise();
84        } else {
85            grid_x += dx;
86            grid_y += dz;
87            if grid_x != end_x || grid_y != end_y || start_dir != dir {
88                traverse_wall_piece(pieces, data);
89            }
90        }
91
92        if grid_x == end_x && grid_y == end_y && start_dir == dir {
93            break;
94        }
95    }
96}