Skip to main content

steel_core/worldgen/structure/piece_placer/ocean_monument/
shell.rs

1use super::{
2    ScatteredFeaturePlacer, base_black, base_gray, base_light, dot_deco, generate_water_box, lamp,
3};
4
5pub(super) fn place_monument_building_shell(placer: &mut ScatteredFeaturePlacer<'_, '_>) {
6    let water_height = placer.sea_level().max(64) - placer.world_pos(0, 0, 0).y();
7    generate_water_box(placer, 0, 0, 0, 58, water_height, 58);
8    generate_wing(placer, false, 0);
9    generate_wing(placer, true, 33);
10    generate_entrance_archs(placer);
11    generate_entrance_wall(placer);
12    generate_roof_piece(placer);
13    generate_lower_wall(placer);
14    generate_middle_wall(placer);
15    generate_upper_wall(placer);
16
17    for pillar_x in 0..7 {
18        let mut pillar_z = 0;
19        while pillar_z < 7 {
20            if pillar_z == 0 && pillar_x == 3 {
21                pillar_z = 6;
22            }
23
24            let bx = pillar_x * 9;
25            let bz = pillar_z * 9;
26            for w in 0..4 {
27                for d in 0..4 {
28                    placer.place_block(base_light(), bx + w, 0, bz + d);
29                    placer.fill_column_down(base_light(), bx + w, -1, bz + d);
30                }
31            }
32
33            if pillar_x != 0 && pillar_x != 6 {
34                pillar_z += 6;
35            } else {
36                pillar_z += 1;
37            }
38        }
39    }
40
41    for i in 0..5 {
42        generate_water_box(placer, -1 - i, i * 2, -1 - i, -1 - i, 23, 58 + i);
43        generate_water_box(placer, 58 + i, i * 2, -1 - i, 58 + i, 23, 58 + i);
44        generate_water_box(placer, -i, i * 2, -1 - i, 57 + i, 23, -1 - i);
45        generate_water_box(placer, -i, i * 2, 58 + i, 57 + i, 23, 58 + i);
46    }
47}
48
49#[expect(
50    clippy::too_many_lines,
51    reason = "direct port of vanilla MonumentBuilding.generateWing"
52)]
53fn generate_wing(placer: &mut ScatteredFeaturePlacer<'_, '_>, is_flipped: bool, xoff: i32) {
54    if !placer.chunk_intersects(xoff, 0, xoff + 23, 20) {
55        return;
56    }
57
58    placer.generate_box(
59        xoff,
60        0,
61        0,
62        xoff + 24,
63        0,
64        20,
65        base_gray(),
66        base_gray(),
67        false,
68    );
69    generate_water_box(placer, xoff, 1, 0, xoff + 24, 10, 20);
70
71    for i in 0..4 {
72        placer.generate_box(
73            xoff + i,
74            i + 1,
75            i,
76            xoff + i,
77            i + 1,
78            20,
79            base_light(),
80            base_light(),
81            false,
82        );
83        placer.generate_box(
84            xoff + i + 7,
85            i + 5,
86            i + 7,
87            xoff + i + 7,
88            i + 5,
89            20,
90            base_light(),
91            base_light(),
92            false,
93        );
94        placer.generate_box(
95            xoff + 17 - i,
96            i + 5,
97            i + 7,
98            xoff + 17 - i,
99            i + 5,
100            20,
101            base_light(),
102            base_light(),
103            false,
104        );
105        placer.generate_box(
106            xoff + 24 - i,
107            i + 1,
108            i,
109            xoff + 24 - i,
110            i + 1,
111            20,
112            base_light(),
113            base_light(),
114            false,
115        );
116        placer.generate_box(
117            xoff + i + 1,
118            i + 1,
119            i,
120            xoff + 23 - i,
121            i + 1,
122            i,
123            base_light(),
124            base_light(),
125            false,
126        );
127        placer.generate_box(
128            xoff + i + 8,
129            i + 5,
130            i + 7,
131            xoff + 16 - i,
132            i + 5,
133            i + 7,
134            base_light(),
135            base_light(),
136            false,
137        );
138    }
139
140    placer.generate_box(
141        xoff + 4,
142        4,
143        4,
144        xoff + 6,
145        4,
146        20,
147        base_gray(),
148        base_gray(),
149        false,
150    );
151    placer.generate_box(
152        xoff + 7,
153        4,
154        4,
155        xoff + 17,
156        4,
157        6,
158        base_gray(),
159        base_gray(),
160        false,
161    );
162    placer.generate_box(
163        xoff + 18,
164        4,
165        4,
166        xoff + 20,
167        4,
168        20,
169        base_gray(),
170        base_gray(),
171        false,
172    );
173    placer.generate_box(
174        xoff + 11,
175        8,
176        11,
177        xoff + 13,
178        8,
179        20,
180        base_gray(),
181        base_gray(),
182        false,
183    );
184    placer.place_block(dot_deco(), xoff + 12, 9, 12);
185    placer.place_block(dot_deco(), xoff + 12, 9, 15);
186    placer.place_block(dot_deco(), xoff + 12, 9, 18);
187
188    let left_pos = xoff + if is_flipped { 19 } else { 5 };
189    let right_pos = xoff + if is_flipped { 5 } else { 19 };
190    for z in (5..=20).rev().step_by(3) {
191        placer.place_block(dot_deco(), left_pos, 5, z);
192    }
193    for z in (7..=19).rev().step_by(3) {
194        placer.place_block(dot_deco(), right_pos, 5, z);
195    }
196    for i in 0..4 {
197        let pos = if is_flipped {
198            xoff + 24 - (17 - i * 3)
199        } else {
200            xoff + 17 - i * 3
201        };
202        placer.place_block(dot_deco(), pos, 5, 5);
203    }
204
205    placer.place_block(dot_deco(), right_pos, 5, 5);
206    placer.generate_box(
207        xoff + 11,
208        1,
209        12,
210        xoff + 13,
211        7,
212        12,
213        base_gray(),
214        base_gray(),
215        false,
216    );
217    placer.generate_box(
218        xoff + 12,
219        1,
220        11,
221        xoff + 12,
222        7,
223        13,
224        base_gray(),
225        base_gray(),
226        false,
227    );
228}
229
230fn generate_entrance_archs(placer: &mut ScatteredFeaturePlacer<'_, '_>) {
231    if !placer.chunk_intersects(22, 5, 35, 17) {
232        return;
233    }
234
235    generate_water_box(placer, 25, 0, 0, 32, 8, 20);
236    for i in 0..4 {
237        let z = 5 + i * 4;
238        placer.generate_box(24, 2, z, 24, 4, z, base_light(), base_light(), false);
239        placer.generate_box(22, 4, z, 23, 4, z, base_light(), base_light(), false);
240        placer.place_block(base_light(), 25, 5, z);
241        placer.place_block(base_light(), 26, 6, z);
242        placer.place_block(lamp(), 26, 5, z);
243        placer.generate_box(33, 2, z, 33, 4, z, base_light(), base_light(), false);
244        placer.generate_box(34, 4, z, 35, 4, z, base_light(), base_light(), false);
245        placer.place_block(base_light(), 32, 5, z);
246        placer.place_block(base_light(), 31, 6, z);
247        placer.place_block(lamp(), 31, 5, z);
248        placer.generate_box(27, 6, z, 30, 6, z, base_gray(), base_gray(), false);
249    }
250}
251
252fn generate_entrance_wall(placer: &mut ScatteredFeaturePlacer<'_, '_>) {
253    if !placer.chunk_intersects(15, 20, 42, 21) {
254        return;
255    }
256
257    placer.generate_box(15, 0, 21, 42, 0, 21, base_gray(), base_gray(), false);
258    generate_water_box(placer, 26, 1, 21, 31, 3, 21);
259    placer.generate_box(21, 12, 21, 36, 12, 21, base_gray(), base_gray(), false);
260    placer.generate_box(17, 11, 21, 40, 11, 21, base_gray(), base_gray(), false);
261    placer.generate_box(16, 10, 21, 41, 10, 21, base_gray(), base_gray(), false);
262    placer.generate_box(15, 7, 21, 42, 9, 21, base_gray(), base_gray(), false);
263    placer.generate_box(16, 6, 21, 41, 6, 21, base_gray(), base_gray(), false);
264    placer.generate_box(17, 5, 21, 40, 5, 21, base_gray(), base_gray(), false);
265    placer.generate_box(21, 4, 21, 36, 4, 21, base_gray(), base_gray(), false);
266    placer.generate_box(22, 3, 21, 26, 3, 21, base_gray(), base_gray(), false);
267    placer.generate_box(31, 3, 21, 35, 3, 21, base_gray(), base_gray(), false);
268    placer.generate_box(23, 2, 21, 25, 2, 21, base_gray(), base_gray(), false);
269    placer.generate_box(32, 2, 21, 34, 2, 21, base_gray(), base_gray(), false);
270    placer.generate_box(28, 4, 20, 29, 4, 21, base_light(), base_light(), false);
271    placer.place_block(base_light(), 27, 3, 21);
272    placer.place_block(base_light(), 30, 3, 21);
273    placer.place_block(base_light(), 26, 2, 21);
274    placer.place_block(base_light(), 31, 2, 21);
275    placer.place_block(base_light(), 25, 1, 21);
276    placer.place_block(base_light(), 32, 1, 21);
277
278    for i in 0..7 {
279        placer.place_block(base_black(), 28 - i, 6 + i, 21);
280        placer.place_block(base_black(), 29 + i, 6 + i, 21);
281    }
282    for i in 0..4 {
283        placer.place_block(base_black(), 28 - i, 9 + i, 21);
284        placer.place_block(base_black(), 29 + i, 9 + i, 21);
285    }
286    placer.place_block(base_black(), 28, 12, 21);
287    placer.place_block(base_black(), 29, 12, 21);
288    for i in 0..3 {
289        placer.place_block(base_black(), 22 - i * 2, 8, 21);
290        placer.place_block(base_black(), 22 - i * 2, 9, 21);
291        placer.place_block(base_black(), 35 + i * 2, 8, 21);
292        placer.place_block(base_black(), 35 + i * 2, 9, 21);
293    }
294
295    generate_water_box(placer, 15, 13, 21, 42, 15, 21);
296    generate_water_box(placer, 15, 1, 21, 15, 6, 21);
297    generate_water_box(placer, 16, 1, 21, 16, 5, 21);
298    generate_water_box(placer, 17, 1, 21, 20, 4, 21);
299    generate_water_box(placer, 21, 1, 21, 21, 3, 21);
300    generate_water_box(placer, 22, 1, 21, 22, 2, 21);
301    generate_water_box(placer, 23, 1, 21, 24, 1, 21);
302    generate_water_box(placer, 42, 1, 21, 42, 6, 21);
303    generate_water_box(placer, 41, 1, 21, 41, 5, 21);
304    generate_water_box(placer, 37, 1, 21, 40, 4, 21);
305    generate_water_box(placer, 36, 1, 21, 36, 3, 21);
306    generate_water_box(placer, 33, 1, 21, 34, 1, 21);
307    generate_water_box(placer, 35, 1, 21, 35, 2, 21);
308}
309
310fn generate_roof_piece(placer: &mut ScatteredFeaturePlacer<'_, '_>) {
311    if !placer.chunk_intersects(21, 21, 36, 36) {
312        return;
313    }
314
315    placer.generate_box(21, 0, 22, 36, 0, 36, base_gray(), base_gray(), false);
316    generate_water_box(placer, 21, 1, 22, 36, 23, 36);
317    for i in 0..4 {
318        placer.generate_box(
319            21 + i,
320            13 + i,
321            21 + i,
322            36 - i,
323            13 + i,
324            21 + i,
325            base_light(),
326            base_light(),
327            false,
328        );
329        placer.generate_box(
330            21 + i,
331            13 + i,
332            36 - i,
333            36 - i,
334            13 + i,
335            36 - i,
336            base_light(),
337            base_light(),
338            false,
339        );
340        placer.generate_box(
341            21 + i,
342            13 + i,
343            22 + i,
344            21 + i,
345            13 + i,
346            35 - i,
347            base_light(),
348            base_light(),
349            false,
350        );
351        placer.generate_box(
352            36 - i,
353            13 + i,
354            22 + i,
355            36 - i,
356            13 + i,
357            35 - i,
358            base_light(),
359            base_light(),
360            false,
361        );
362    }
363
364    placer.generate_box(25, 16, 25, 32, 16, 32, base_gray(), base_gray(), false);
365    placer.generate_box(25, 17, 25, 25, 19, 25, base_light(), base_light(), false);
366    placer.generate_box(32, 17, 25, 32, 19, 25, base_light(), base_light(), false);
367    placer.generate_box(25, 17, 32, 25, 19, 32, base_light(), base_light(), false);
368    placer.generate_box(32, 17, 32, 32, 19, 32, base_light(), base_light(), false);
369    placer.place_block(base_light(), 26, 20, 26);
370    placer.place_block(base_light(), 27, 21, 27);
371    placer.place_block(lamp(), 27, 20, 27);
372    placer.place_block(base_light(), 26, 20, 31);
373    placer.place_block(base_light(), 27, 21, 30);
374    placer.place_block(lamp(), 27, 20, 30);
375    placer.place_block(base_light(), 31, 20, 31);
376    placer.place_block(base_light(), 30, 21, 30);
377    placer.place_block(lamp(), 30, 20, 30);
378    placer.place_block(base_light(), 31, 20, 26);
379    placer.place_block(base_light(), 30, 21, 27);
380    placer.place_block(lamp(), 30, 20, 27);
381    placer.generate_box(28, 21, 27, 29, 21, 27, base_gray(), base_gray(), false);
382    placer.generate_box(27, 21, 28, 27, 21, 29, base_gray(), base_gray(), false);
383    placer.generate_box(28, 21, 30, 29, 21, 30, base_gray(), base_gray(), false);
384    placer.generate_box(30, 21, 28, 30, 21, 29, base_gray(), base_gray(), false);
385}
386
387fn generate_lower_wall(placer: &mut ScatteredFeaturePlacer<'_, '_>) {
388    if placer.chunk_intersects(0, 21, 6, 58) {
389        placer.generate_box(0, 0, 21, 6, 0, 57, base_gray(), base_gray(), false);
390        generate_water_box(placer, 0, 1, 21, 6, 7, 57);
391        placer.generate_box(4, 4, 21, 6, 4, 53, base_gray(), base_gray(), false);
392        for i in 0..4 {
393            placer.generate_box(
394                i,
395                i + 1,
396                21,
397                i,
398                i + 1,
399                57 - i,
400                base_light(),
401                base_light(),
402                false,
403            );
404        }
405        for z in (23..53).step_by(3) {
406            placer.place_block(dot_deco(), 5, 5, z);
407        }
408        placer.place_block(dot_deco(), 5, 5, 52);
409        for i in 0..4 {
410            placer.generate_box(
411                i,
412                i + 1,
413                21,
414                i,
415                i + 1,
416                57 - i,
417                base_light(),
418                base_light(),
419                false,
420            );
421        }
422        placer.generate_box(4, 1, 52, 6, 3, 52, base_gray(), base_gray(), false);
423        placer.generate_box(5, 1, 51, 5, 3, 53, base_gray(), base_gray(), false);
424    }
425
426    if placer.chunk_intersects(51, 21, 58, 58) {
427        placer.generate_box(51, 0, 21, 57, 0, 57, base_gray(), base_gray(), false);
428        generate_water_box(placer, 51, 1, 21, 57, 7, 57);
429        placer.generate_box(51, 4, 21, 53, 4, 53, base_gray(), base_gray(), false);
430        for i in 0..4 {
431            placer.generate_box(
432                57 - i,
433                i + 1,
434                21,
435                57 - i,
436                i + 1,
437                57 - i,
438                base_light(),
439                base_light(),
440                false,
441            );
442        }
443        for z in (23..53).step_by(3) {
444            placer.place_block(dot_deco(), 52, 5, z);
445        }
446        placer.place_block(dot_deco(), 52, 5, 52);
447        placer.generate_box(51, 1, 52, 53, 3, 52, base_gray(), base_gray(), false);
448        placer.generate_box(52, 1, 51, 52, 3, 53, base_gray(), base_gray(), false);
449    }
450
451    if placer.chunk_intersects(0, 51, 57, 57) {
452        placer.generate_box(7, 0, 51, 50, 0, 57, base_gray(), base_gray(), false);
453        generate_water_box(placer, 7, 1, 51, 50, 10, 57);
454        for i in 0..4 {
455            placer.generate_box(
456                i + 1,
457                i + 1,
458                57 - i,
459                56 - i,
460                i + 1,
461                57 - i,
462                base_light(),
463                base_light(),
464                false,
465            );
466        }
467    }
468}
469
470fn generate_middle_wall(placer: &mut ScatteredFeaturePlacer<'_, '_>) {
471    if placer.chunk_intersects(7, 21, 13, 50) {
472        placer.generate_box(7, 0, 21, 13, 0, 50, base_gray(), base_gray(), false);
473        generate_water_box(placer, 7, 1, 21, 13, 10, 50);
474        placer.generate_box(11, 8, 21, 13, 8, 53, base_gray(), base_gray(), false);
475        for i in 0..4 {
476            placer.generate_box(
477                i + 7,
478                i + 5,
479                21,
480                i + 7,
481                i + 5,
482                54,
483                base_light(),
484                base_light(),
485                false,
486            );
487        }
488        for z in (21..=45).step_by(3) {
489            placer.place_block(dot_deco(), 12, 9, z);
490        }
491    }
492
493    if placer.chunk_intersects(44, 21, 50, 54) {
494        placer.generate_box(44, 0, 21, 50, 0, 50, base_gray(), base_gray(), false);
495        generate_water_box(placer, 44, 1, 21, 50, 10, 50);
496        placer.generate_box(44, 8, 21, 46, 8, 53, base_gray(), base_gray(), false);
497        for i in 0..4 {
498            placer.generate_box(
499                50 - i,
500                i + 5,
501                21,
502                50 - i,
503                i + 5,
504                54,
505                base_light(),
506                base_light(),
507                false,
508            );
509        }
510        for z in (21..=45).step_by(3) {
511            placer.place_block(dot_deco(), 45, 9, z);
512        }
513    }
514
515    if placer.chunk_intersects(8, 44, 49, 54) {
516        placer.generate_box(14, 0, 44, 43, 0, 50, base_gray(), base_gray(), false);
517        generate_water_box(placer, 14, 1, 44, 43, 10, 50);
518        for x in (12..=45).step_by(3) {
519            placer.place_block(dot_deco(), x, 9, 45);
520            placer.place_block(dot_deco(), x, 9, 52);
521            if matches!(x, 12 | 18 | 24 | 33 | 39 | 45) {
522                placer.place_block(dot_deco(), x, 9, 47);
523                placer.place_block(dot_deco(), x, 9, 50);
524                placer.place_block(dot_deco(), x, 10, 45);
525                placer.place_block(dot_deco(), x, 10, 46);
526                placer.place_block(dot_deco(), x, 10, 51);
527                placer.place_block(dot_deco(), x, 10, 52);
528                placer.place_block(dot_deco(), x, 11, 47);
529                placer.place_block(dot_deco(), x, 11, 50);
530                placer.place_block(dot_deco(), x, 12, 48);
531                placer.place_block(dot_deco(), x, 12, 49);
532            }
533        }
534        for i in 0..3 {
535            placer.generate_box(
536                8 + i,
537                5 + i,
538                54,
539                49 - i,
540                5 + i,
541                54,
542                base_gray(),
543                base_gray(),
544                false,
545            );
546        }
547        placer.generate_box(11, 8, 54, 46, 8, 54, base_light(), base_light(), false);
548        placer.generate_box(14, 8, 44, 43, 8, 53, base_gray(), base_gray(), false);
549    }
550}
551
552fn generate_upper_wall(placer: &mut ScatteredFeaturePlacer<'_, '_>) {
553    if placer.chunk_intersects(14, 21, 20, 43) {
554        placer.generate_box(14, 0, 21, 20, 0, 43, base_gray(), base_gray(), false);
555        generate_water_box(placer, 14, 1, 22, 20, 14, 43);
556        placer.generate_box(18, 12, 22, 20, 12, 39, base_gray(), base_gray(), false);
557        placer.generate_box(18, 12, 21, 20, 12, 21, base_light(), base_light(), false);
558        for i in 0..4 {
559            placer.generate_box(
560                i + 14,
561                i + 9,
562                21,
563                i + 14,
564                i + 9,
565                43 - i,
566                base_light(),
567                base_light(),
568                false,
569            );
570        }
571        for z in (23..=39).step_by(3) {
572            placer.place_block(dot_deco(), 19, 13, z);
573        }
574    }
575
576    if placer.chunk_intersects(37, 21, 43, 43) {
577        placer.generate_box(37, 0, 21, 43, 0, 43, base_gray(), base_gray(), false);
578        generate_water_box(placer, 37, 1, 22, 43, 14, 43);
579        placer.generate_box(37, 12, 22, 39, 12, 39, base_gray(), base_gray(), false);
580        placer.generate_box(37, 12, 21, 39, 12, 21, base_light(), base_light(), false);
581        for i in 0..4 {
582            placer.generate_box(
583                43 - i,
584                i + 9,
585                21,
586                43 - i,
587                i + 9,
588                43 - i,
589                base_light(),
590                base_light(),
591                false,
592            );
593        }
594        for z in (23..=39).step_by(3) {
595            placer.place_block(dot_deco(), 38, 13, z);
596        }
597    }
598
599    if placer.chunk_intersects(15, 37, 42, 43) {
600        placer.generate_box(21, 0, 37, 36, 0, 43, base_gray(), base_gray(), false);
601        generate_water_box(placer, 21, 1, 37, 36, 14, 43);
602        placer.generate_box(21, 12, 37, 36, 12, 39, base_gray(), base_gray(), false);
603        for i in 0..4 {
604            placer.generate_box(
605                15 + i,
606                i + 9,
607                43 - i,
608                42 - i,
609                i + 9,
610                43 - i,
611                base_light(),
612                base_light(),
613                false,
614            );
615        }
616        for x in (21..=36).step_by(3) {
617            placer.place_block(dot_deco(), x, 13, 38);
618        }
619    }
620}