steel_worldgen/structure/mansion/
walls.rs1use 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}