1use super::*;
2use crate::{
3 CONFIG, Land,
4 site::generation::{PrimitiveTransform, spiral_staircase},
5 util::{DIAGONALS, NEIGHBORS, RandomField, sampler::Sampler, within_distance},
6};
7use common::{
8 generation::EntityInfo,
9 terrain::{Block, BlockKind, SpriteKind},
10};
11
12use rand::prelude::*;
13use std::{
14 f32::consts::{PI, TAU},
15 sync::Arc,
16};
17
18use vek::*;
19
20pub struct SeaChapel {
21 pub(crate) center: Vec2<i32>,
22 pub(crate) alt: i32,
23}
24impl SeaChapel {
25 pub fn generate(_land: &Land, _rng: &mut impl Rng, site: &Site, tile_aabr: Aabr<i32>) -> Self {
26 let bounds = Aabr {
27 min: site.tile_wpos(tile_aabr.min),
28 max: site.tile_wpos(tile_aabr.max),
29 };
30 let center = bounds.center();
31 Self {
32 center,
33 alt: CONFIG.sea_level as i32,
34 }
35 }
36}
37
38impl Structure for SeaChapel {
39 #[cfg(feature = "dyn-lib")]
40 #[unsafe(export_name = "as_dyn_structure_seachapel")]
41 fn as_dyn_outer(&self) -> Option<(&dyn Structure, &'static str)> {
42 Some((Self::as_dyn_impl(self), "as_dyn_structure_seachapel"))
43 }
44
45 fn spawn_rules_inner(
46 &self,
47 spawn_rules: &mut SpawnRules,
48 _land: &Land,
49 wpos: Vec2<i32>,
50 _weight: f32,
51 ) {
52 spawn_rules.trees &= !within_distance(wpos, self.center, 100);
53 spawn_rules.waypoints = false;
54 }
55
56 fn render_inner(&self, _site: &Site, _land: &Land, painter: &Painter) {
57 let base = self.alt + 1;
58 let center = self.center;
59 let diameter = 54;
60 let variant = center.with_z(base);
61 let mut rng = rand::rng();
62 let (top, washed) = match (RandomField::new(0).get(variant)) % 2 {
64 0 => {
65 (
67 Fill::Brick(BlockKind::Rock, Rgb::new(0, 51, 209), 24),
68 Fill::Brick(BlockKind::Rock, Rgb::new(24, 115, 242), 12),
69 )
70 },
71 _ => {
72 (
74 Fill::Brick(BlockKind::Rock, Rgb::new(0, 55, 71), 24),
75 Fill::Brick(BlockKind::Rock, Rgb::new(2, 106, 129), 24),
76 )
77 },
78 };
79 let water = Fill::Block(Block::new(BlockKind::Water, Rgb::zero()));
80 let rope = Fill::Block(Block::air(SpriteKind::Rope));
81 let ropefix1 = Fill::Brick(BlockKind::Rock, Rgb::new(80, 75, 35), 24);
82 let ropefix2 = Fill::Brick(BlockKind::Rock, Rgb::new(172, 172, 172), 4);
83 let white = Fill::Brick(BlockKind::Rock, Rgb::new(202, 202, 202), 24);
84 let floor_blue = Fill::Sampling(Arc::new(|variant| {
85 Some(
86 match (RandomField::new(0).get(Vec3::new(variant.z, variant.x, variant.y))) % 9 {
87 0 => Block::new(BlockKind::Rock, Rgb::new(38, 118, 179)),
88 1 => Block::new(BlockKind::Rock, Rgb::new(34, 52, 126)),
89 2 => Block::new(BlockKind::Rock, Rgb::new(69, 179, 228)),
90 3 => Block::new(BlockKind::Rock, Rgb::new(32, 45, 113)),
91 4 => Block::new(BlockKind::Rock, Rgb::new(252, 253, 248)),
92 5 => Block::new(BlockKind::Rock, Rgb::new(40, 106, 167)),
93 6 => Block::new(BlockKind::Rock, Rgb::new(69, 182, 240)),
94 7 => Block::new(BlockKind::Rock, Rgb::new(69, 182, 240)),
95 _ => Block::new(BlockKind::Rock, Rgb::new(240, 240, 238)),
96 },
97 )
98 }));
99 let floor_white = white.clone();
100 let floor_color = match (RandomField::new(0).get(center.with_z(base - 1))) % 2 {
101 0 => floor_white,
102 _ => floor_blue,
103 };
104 let gold = Fill::Brick(BlockKind::GlowingRock, Rgb::new(245, 232, 0), 10);
105 let gold_chain = Fill::Block(Block::air(SpriteKind::SeaDecorChain));
106 let gold_decor = Fill::Block(Block::air(SpriteKind::SeaDecorBlock));
107 let window_ver = Fill::Block(Block::air(SpriteKind::SeaDecorWindowVer));
108 let window_ver2 = Fill::Block(
109 Block::air(SpriteKind::SeaDecorWindowVer)
110 .with_ori(2)
111 .unwrap(),
112 );
113 let window_hor = Fill::Block(Block::air(SpriteKind::SeaDecorWindowHor));
114 let glass_barrier = Fill::Block(Block::air(SpriteKind::GlassBarrier));
115 let glass_keyhole = Fill::Block(Block::air(SpriteKind::GlassKeyhole));
116 let mut connect_gate_types = vec![
118 SpriteKind::GlassBarrier,
119 SpriteKind::SeaDecorWindowHor,
120 SpriteKind::SeaDecorWindowHor,
121 SpriteKind::SeaDecorWindowHor,
122 ];
123 let sprite_fill = Fill::Sampling(Arc::new(|center| {
124 Some(match (RandomField::new(0).get(center)) % 200 {
125 0 => Block::air(SpriteKind::CoralChest),
126 1..=5 => Block::air(SpriteKind::SeaDecorPillar),
127 6..=25 => Block::air(SpriteKind::SeashellLantern),
128 _ => Block::new(BlockKind::Air, Rgb::new(0, 0, 0)),
129 })
130 }));
131 let pos_var = RandomField::new(0).get(center.with_z(base)) % 5;
132 let radius = diameter / 2; let tubes = 7.0 + pos_var as f32;
134 let phi = TAU / tubes;
135 let up = diameter / 16;
136 painter
138 .sphere(Aabb {
139 min: (center - (diameter / 2)).with_z(base - (diameter / 8)),
140 max: (center + (diameter / 2)).with_z(base - (diameter / 8) + diameter),
141 })
142 .fill(white.clone());
143 let main_upper_half = painter.aabb(Aabb {
144 min: (center - (diameter / 2)).with_z(base - (diameter / 8) + (diameter / 2)),
145 max: (center + (diameter / 2)).with_z(base - (diameter / 8) + diameter),
146 });
147 painter
149 .sphere(Aabb {
150 min: (center - (diameter / 2)).with_z(base - (diameter / 8)),
151 max: (center + (diameter / 2)).with_z(base - (diameter / 8) + diameter),
152 })
153 .intersect(main_upper_half)
154 .fill(washed.clone());
155 painter
157 .sphere(Aabb {
158 min: (center - (diameter / 2) + 1).with_z(base - (diameter / 8) + 1),
159 max: (center + (diameter / 2)).with_z(base - (diameter / 8) + diameter),
160 })
161 .intersect(main_upper_half)
162 .fill(top.clone());
163 painter
165 .cylinder(Aabb {
166 min: (center - (diameter / 2)).with_z(base - (diameter / 8) + (diameter / 2) + 1),
167 max: (center + (diameter / 2)).with_z(base - (diameter / 8) + (diameter / 2) + 2),
168 })
169 .fill(gold.clone());
170
171 painter
173 .sphere(Aabb {
174 min: (center - (diameter / 3))
175 .with_z(base - (diameter / 8) + diameter - (diameter / 3)),
176 max: (center + (diameter / 3))
177 .with_z(base - (diameter / 8) + diameter + (diameter / 3)),
178 })
179 .fill(white.clone());
180 let small_upper_half = painter.aabb(Aabb {
181 min: (center - (diameter / 3)).with_z(base - (diameter / 8) + diameter),
182 max: (center + (diameter / 3))
183 .with_z(base - (diameter / 8) + diameter + (diameter / 3)),
184 });
185 painter
187 .sphere(Aabb {
188 min: (center - (diameter / 3))
189 .with_z(base - (diameter / 8) + diameter - (diameter / 3)),
190 max: (center + (diameter / 3))
191 .with_z(base - (diameter / 8) + diameter + (diameter / 3)),
192 })
193 .intersect(small_upper_half)
194 .fill(washed.clone());
195 painter
197 .sphere(Aabb {
198 min: (center - (diameter / 3) + 1)
199 .with_z(base - (diameter / 8) + diameter - (diameter / 3) + 1),
200 max: (center + (diameter / 3))
201 .with_z(base - (diameter / 8) + diameter + (diameter / 3)),
202 })
203 .intersect(small_upper_half)
204 .fill(top.clone());
205 painter
207 .cylinder(Aabb {
208 min: (center - (diameter / 3)).with_z(base - (diameter / 8) + diameter + 1),
209 max: (center + (diameter / 3)).with_z(base - (diameter / 8) + diameter + 2),
210 })
211 .fill(gold.clone());
212 painter
214 .sphere(Aabb {
215 min: (center - (diameter / 3) + 1)
216 .with_z(base - (diameter / 8) + diameter - (diameter / 3) + 1),
217 max: (center + (diameter / 3) - 1)
218 .with_z(base - (diameter / 8) + diameter + (diameter / 3) - 1),
219 })
220 .clear();
221
222 let emblem_4 = painter.aabb(Aabb {
224 min: Vec3::new(
225 center.x - 7,
226 center.y - 1,
227 base - (diameter / 8) + diameter + (diameter / 3) + 9,
228 ),
229 max: Vec3::new(
230 center.x + 7,
231 center.y + 1,
232 base - (diameter / 8) + diameter + (diameter / 3) + 11,
233 ),
234 });
235 emblem_4.fill(gold.clone());
236 let emblem_4_clear = painter.aabb(Aabb {
237 min: Vec3::new(
238 center.x - 3,
239 center.y - 1,
240 base - (diameter / 8) + diameter + (diameter / 3) + 9,
241 ),
242 max: Vec3::new(
243 center.x + 3,
244 center.y + 1,
245 base - (diameter / 8) + diameter + (diameter / 3) + 11,
246 ),
247 });
248 emblem_4_clear.clear();
249 emblem_4
250 .rotate_about(Mat3::rotation_z(PI / 2.0).as_(), center.with_z(base))
251 .fill(gold.clone());
252 emblem_4_clear
253 .rotate_about(Mat3::rotation_z(PI / 2.0).as_(), center.with_z(base))
254 .clear();
255
256 let emblem_5 = painter.aabb(Aabb {
257 min: Vec3::new(
258 center.x - 9,
259 center.y - 1,
260 base - (diameter / 8) + diameter + (diameter / 3) + 11,
261 ),
262 max: Vec3::new(
263 center.x + 9,
264 center.y + 1,
265 base - (diameter / 8) + diameter + (diameter / 3) + 13,
266 ),
267 });
268 emblem_5.fill(gold.clone());
269 let emblem_5_clear = painter.aabb(Aabb {
270 min: Vec3::new(
271 center.x - 5,
272 center.y - 1,
273 base - (diameter / 8) + diameter + (diameter / 3) + 11,
274 ),
275 max: Vec3::new(
276 center.x + 5,
277 center.y + 1,
278 base - (diameter / 8) + diameter + (diameter / 3) + 13,
279 ),
280 });
281 emblem_5_clear.clear();
282 emblem_5
283 .rotate_about(Mat3::rotation_z(PI / 2.0).as_(), center.with_z(base))
284 .fill(gold.clone());
285 emblem_5_clear
286 .rotate_about(Mat3::rotation_z(PI / 2.0).as_(), center.with_z(base))
287 .clear();
288 let emblem_6 = painter.aabb(Aabb {
289 min: Vec3::new(
290 center.x - 11,
291 center.y - 1,
292 base - (diameter / 8) + diameter + (diameter / 3) + 13,
293 ),
294 max: Vec3::new(
295 center.x + 11,
296 center.y + 1,
297 base - (diameter / 8) + diameter + (diameter / 3) + 17,
298 ),
299 });
300 emblem_6.fill(gold.clone());
301 let emblem_6_clear = painter.aabb(Aabb {
302 min: Vec3::new(
303 center.x - 7,
304 center.y - 1,
305 base - (diameter / 8) + diameter + (diameter / 3) + 13,
306 ),
307 max: Vec3::new(
308 center.x + 7,
309 center.y + 1,
310 base - (diameter / 8) + diameter + (diameter / 3) + 17,
311 ),
312 });
313 emblem_6_clear.clear();
314 emblem_6
315 .rotate_about(Mat3::rotation_z(PI / 2.0).as_(), center.with_z(base))
316 .fill(gold.clone());
317 emblem_6_clear
318 .rotate_about(Mat3::rotation_z(PI / 2.0).as_(), center.with_z(base))
319 .clear();
320 let emblem_7 = painter.aabb(Aabb {
321 min: Vec3::new(
322 center.x - 11,
323 center.y - 1,
324 base - (diameter / 8) + diameter + (diameter / 3) + 13,
325 ),
326 max: Vec3::new(
327 center.x + 11,
328 center.y + 1,
329 base - (diameter / 8) + diameter + (diameter / 3) + 17,
330 ),
331 });
332 emblem_7.fill(gold.clone());
333 let emblem_7_clear = painter.aabb(Aabb {
334 min: Vec3::new(
335 center.x - 5,
336 center.y - 1,
337 base - (diameter / 8) + diameter + (diameter / 3) + 17,
338 ),
339 max: Vec3::new(
340 center.x + 5,
341 center.y + 1,
342 base - (diameter / 8) + diameter + (diameter / 3) + 19,
343 ),
344 });
345 emblem_7_clear.clear();
346 emblem_7
347 .rotate_about(Mat3::rotation_z(PI / 2.0).as_(), center.with_z(base))
348 .fill(gold.clone());
349 emblem_7_clear
350 .rotate_about(Mat3::rotation_z(PI / 2.0).as_(), center.with_z(base))
351 .clear();
352
353 let emblem_8 = painter.aabb(Aabb {
354 min: Vec3::new(
355 center.x - 9,
356 center.y - 1,
357 base - (diameter / 8) + diameter + (diameter / 3) + 19,
358 ),
359 max: Vec3::new(
360 center.x + 9,
361 center.y + 1,
362 base - (diameter / 8) + diameter + (diameter / 3) + 21,
363 ),
364 });
365 emblem_8.fill(gold.clone());
366 let emblem_8_clear = painter.aabb(Aabb {
367 min: Vec3::new(
368 center.x - 3,
369 center.y - 1,
370 base - (diameter / 8) + diameter + (diameter / 3) + 19,
371 ),
372 max: Vec3::new(
373 center.x + 3,
374 center.y + 1,
375 base - (diameter / 8) + diameter + (diameter / 3) + 21,
376 ),
377 });
378 emblem_8_clear.clear();
379 emblem_8
380 .rotate_about(Mat3::rotation_z(PI / 2.0).as_(), center.with_z(base))
381 .fill(gold.clone());
382 emblem_8_clear
383 .rotate_about(Mat3::rotation_z(PI / 2.0).as_(), center.with_z(base))
384 .clear();
385 let emblem_9 = painter.aabb(Aabb {
386 min: Vec3::new(
387 center.x - 11,
388 center.y - 1,
389 base - (diameter / 8) + diameter + (diameter / 3) + 21,
390 ),
391 max: Vec3::new(
392 center.x + 11,
393 center.y + 1,
394 base - (diameter / 8) + diameter + (diameter / 3) + 23,
395 ),
396 });
397 emblem_9.fill(gold.clone());
398 let emblem_9_clear = painter.aabb(Aabb {
399 min: Vec3::new(
400 center.x - 7,
401 center.y - 1,
402 base - (diameter / 8) + diameter + (diameter / 3) + 21,
403 ),
404 max: Vec3::new(
405 center.x + 7,
406 center.y + 1,
407 base - (diameter / 8) + diameter + (diameter / 3) + 23,
408 ),
409 });
410 emblem_9_clear.clear();
411 emblem_9
412 .rotate_about(Mat3::rotation_z(PI / 2.0).as_(), center.with_z(base))
413 .fill(gold.clone());
414 emblem_9_clear
415 .rotate_about(Mat3::rotation_z(PI / 2.0).as_(), center.with_z(base))
416 .clear();
417 let emblem_10 = painter.aabb(Aabb {
418 min: Vec3::new(
419 center.x - 11,
420 center.y - 1,
421 base - (diameter / 8) + diameter + (diameter / 3) + 23,
422 ),
423 max: Vec3::new(
424 center.x + 11,
425 center.y + 1,
426 base - (diameter / 8) + diameter + (diameter / 3) + 25,
427 ),
428 });
429 emblem_10.fill(gold.clone());
430 let emblem_10_clear = painter.aabb(Aabb {
431 min: Vec3::new(
432 center.x - 5,
433 center.y - 1,
434 base - (diameter / 8) + diameter + (diameter / 3) + 23,
435 ),
436 max: Vec3::new(
437 center.x + 5,
438 center.y + 1,
439 base - (diameter / 8) + diameter + (diameter / 3) + 25,
440 ),
441 });
442 emblem_10_clear.clear();
443 emblem_10
444 .rotate_about(Mat3::rotation_z(PI / 2.0).as_(), center.with_z(base))
445 .fill(gold.clone());
446 emblem_10_clear
447 .rotate_about(Mat3::rotation_z(PI / 2.0).as_(), center.with_z(base))
448 .clear();
449 let emblem_11 = painter.aabb(Aabb {
450 min: Vec3::new(
451 center.x - 9,
452 center.y - 1,
453 base - (diameter / 8) + diameter + (diameter / 3) + 25,
454 ),
455 max: Vec3::new(
456 center.x + 9,
457 center.y + 1,
458 base - (diameter / 8) + diameter + (diameter / 3) + 27,
459 ),
460 });
461 emblem_11.fill(gold.clone());
462 let emblem_11_clear = painter.aabb(Aabb {
463 min: Vec3::new(
464 center.x - 3,
465 center.y - 1,
466 base - (diameter / 8) + diameter + (diameter / 3) + 25,
467 ),
468 max: Vec3::new(
469 center.x + 3,
470 center.y + 1,
471 base - (diameter / 8) + diameter + (diameter / 3) + 27,
472 ),
473 });
474 emblem_11_clear.clear();
475 emblem_11
476 .rotate_about(Mat3::rotation_z(PI / 2.0).as_(), center.with_z(base))
477 .fill(gold.clone());
478 emblem_11_clear
479 .rotate_about(Mat3::rotation_z(PI / 2.0).as_(), center.with_z(base))
480 .clear();
481
482 let emblem_12 = painter.aabb(Aabb {
483 min: Vec3::new(
484 center.x - 5,
485 center.y - 1,
486 base - (diameter / 8) + diameter + (diameter / 3) + 27,
487 ),
488 max: Vec3::new(
489 center.x + 5,
490 center.y + 1,
491 base - (diameter / 8) + diameter + (diameter / 3) + 29,
492 ),
493 });
494 emblem_12.fill(gold.clone());
495 let emblem_12_clear = painter.aabb(Aabb {
496 min: Vec3::new(
497 center.x - 3,
498 center.y - 1,
499 base - (diameter / 8) + diameter + (diameter / 3) + 27,
500 ),
501 max: Vec3::new(
502 center.x + 3,
503 center.y + 1,
504 base - (diameter / 8) + diameter + (diameter / 3) + 29,
505 ),
506 });
507 emblem_12_clear.clear();
508 emblem_12
509 .rotate_about(Mat3::rotation_z(PI / 2.0).as_(), center.with_z(base))
510 .fill(gold.clone());
511 emblem_12_clear
512 .rotate_about(Mat3::rotation_z(PI / 2.0).as_(), center.with_z(base))
513 .clear();
514 let emblem_13 = painter.aabb(Aabb {
515 min: Vec3::new(
516 center.x - 7,
517 center.y - 1,
518 base - (diameter / 8) + diameter + (diameter / 3) + 29,
519 ),
520 max: Vec3::new(
521 center.x + 7,
522 center.y + 1,
523 base - (diameter / 8) + diameter + (diameter / 3) + 31,
524 ),
525 });
526 emblem_13.fill(gold.clone());
527 let emblem_13_clear = painter.aabb(Aabb {
528 min: Vec3::new(
529 center.x - 5,
530 center.y - 1,
531 base - (diameter / 8) + diameter + (diameter / 3) + 29,
532 ),
533 max: Vec3::new(
534 center.x + 5,
535 center.y + 1,
536 base - (diameter / 8) + diameter + (diameter / 3) + 31,
537 ),
538 });
539 emblem_13_clear.clear();
540 emblem_13
541 .rotate_about(Mat3::rotation_z(PI / 2.0).as_(), center.with_z(base))
542 .fill(gold.clone());
543 emblem_13_clear
544 .rotate_about(Mat3::rotation_z(PI / 2.0).as_(), center.with_z(base))
545 .clear();
546 painter
548 .sphere(Aabb {
549 min: (center - 4).with_z(base - (diameter / 8) + diameter + (diameter / 3) - 3),
550 max: (center + 4).with_z(base - (diameter / 8) + diameter + (diameter / 3) + 5),
551 })
552 .fill(gold.clone());
553 painter
555 .aabb(Aabb {
556 min: (center - 1).with_z(base - (diameter / 8) + diameter + (diameter / 3) + 5),
557 max: (center + 1).with_z(base - (diameter / 8) + diameter + (diameter / 3) + 21),
558 })
559 .fill(gold.clone());
560
561 let emblem_1 = painter.aabb(Aabb {
562 min: Vec3::new(
563 center.x - 3,
564 center.y - 1,
565 base - (diameter / 8) + diameter + (diameter / 3) + 11,
566 ),
567 max: Vec3::new(
568 center.x + 3,
569 center.y + 1,
570 base - (diameter / 8) + diameter + (diameter / 3) + 19,
571 ),
572 });
573 emblem_1.fill(gold.clone());
574 emblem_1
575 .rotate_about(Mat3::rotation_z(PI / 2.0).as_(), center.with_z(base))
576 .fill(gold.clone());
577 let emblem_2 = painter.aabb(Aabb {
578 min: Vec3::new(
579 center.x - 5,
580 center.y - 1,
581 base - (diameter / 8) + diameter + (diameter / 3) + 21,
582 ),
583 max: Vec3::new(
584 center.x + 5,
585 center.y + 1,
586 base - (diameter / 8) + diameter + (diameter / 3) + 23,
587 ),
588 });
589 emblem_2.fill(gold.clone());
590 emblem_2
591 .rotate_about(Mat3::rotation_z(PI / 2.0).as_(), center.with_z(base))
592 .fill(gold.clone());
593 let emblem_3 = painter.aabb(Aabb {
594 min: Vec3::new(
595 center.x - 5,
596 center.y - 1,
597 base - (diameter / 8) + diameter + (diameter / 3) + 7,
598 ),
599 max: Vec3::new(
600 center.x + 5,
601 center.y + 1,
602 base - (diameter / 8) + diameter + (diameter / 3) + 9,
603 ),
604 });
605 emblem_3.fill(gold.clone());
606 emblem_3
607 .rotate_about(Mat3::rotation_z(PI / 2.0).as_(), center.with_z(base))
608 .fill(gold.clone());
609
610 painter
612 .sphere(Aabb {
613 min: (center - (diameter / 2)).with_z(base - (2 * (diameter / 3))),
614 max: (center + (diameter / 2)).with_z(base - (2 * (diameter / 3)) + diameter),
615 })
616 .fill(white.clone());
617 painter
619 .sphere(Aabb {
620 min: (center - (diameter / 2) + 1).with_z(base - (2 * (diameter / 3)) + 1),
621 max: (center + (diameter / 2) - 1)
622 .with_z(base - (2 * (diameter / 3)) + diameter - 1),
623 })
624 .clear();
625 let cellar_sea_croc_pos = (center - (diameter / 4)).with_z(base - (diameter / 2));
627 for _ in 0..(3 + ((RandomField::new(0).get((cellar_sea_croc_pos).with_z(base))) % 5)) {
628 painter.spawn(EntityInfo::at(cellar_sea_croc_pos.as_()).with_asset_expect(
629 "common.entity.wild.aggressive.sea_crocodile",
630 &mut rng,
631 None,
632 ))
633 }
634 painter
636 .sphere(Aabb {
637 min: (center - (diameter / 2) + 1).with_z(base - (diameter / 8) + 1),
638 max: (center + (diameter / 2) - 1).with_z(base - (diameter / 8) + diameter - 1),
639 })
640 .clear();
641
642 painter
644 .cylinder(Aabb {
645 min: (center - (diameter / 3) + 2).with_z(base - (diameter / 8) + diameter - 7),
646 max: (center + (diameter / 3) - 2).with_z(base - (diameter / 8) + diameter - 6),
647 })
648 .fill(gold_decor.clone());
649 painter
650 .cylinder(Aabb {
651 min: (center - (diameter / 3) + 3).with_z(base - (diameter / 8) + diameter - 7),
652 max: (center + (diameter / 3) - 3).with_z(base - (diameter / 8) + diameter - 6),
653 })
654 .fill(floor_color.clone());
655 painter
657 .cylinder(Aabb {
658 min: (center - (diameter / 3) + 3).with_z(base - (diameter / 8) + diameter - 6),
659 max: (center + (diameter / 3) - 3).with_z(base - (diameter / 8) + diameter - 5),
660 })
661 .fill(sprite_fill.clone());
662 painter
663 .cylinder(Aabb {
664 min: (center - (diameter / 3) + 4).with_z(base - (diameter / 8) + diameter - 6),
665 max: (center + (diameter / 3) - 4).with_z(base - (diameter / 8) + diameter - 5),
666 })
667 .clear();
668 let center_w = center + 4;
670 painter
671 .cylinder(Aabb {
672 min: (center_w - 6).with_z(base - (diameter / 8) + diameter - 7),
673 max: (center_w + 6).with_z(base - (diameter / 8) + diameter - 6),
674 })
675 .fill(gold_decor.clone());
676 painter
677 .cylinder(Aabb {
678 min: (center_w - 5).with_z(base - (diameter / 8) + diameter - 7),
679 max: (center_w + 5).with_z(base - (diameter / 8) + diameter - 6),
680 })
681 .fill(window_hor);
682 let center_o2 = center - 4;
684 painter
685 .cylinder(Aabb {
686 min: (center_o2 - 4).with_z(base - (diameter / 8) + diameter - 6),
687 max: (center_o2 + 4).with_z(base - (diameter / 8) + diameter - 5),
688 })
689 .fill(gold_decor.clone());
690 painter
691 .cylinder(Aabb {
692 min: (center_o2 - 3).with_z(base - (diameter / 8) + diameter - 6),
693 max: (center_o2 + 3).with_z(base - (diameter / 8) + diameter - 5),
694 })
695 .fill(floor_color.clone());
696 let first_floor_organ_pos = center_o2.with_z(base - (diameter / 8) + diameter - 4);
698 painter.spawn(
699 EntityInfo::at(first_floor_organ_pos.as_()).with_asset_expect(
700 "common.entity.dungeon.sea_chapel.organ",
701 &mut rng,
702 None,
703 ),
704 );
705 let first_floor_spawn_pos = (center_o2 - 2).with_z(base - (diameter / 8) + diameter - 4);
707 for _ in 0..(2 + ((RandomField::new(0).get((first_floor_spawn_pos).with_z(base))) % 2)) {
708 painter.spawn(
709 EntityInfo::at(first_floor_spawn_pos.as_()).with_asset_expect(
710 "common.entity.dungeon.sea_chapel.sea_cleric",
711 &mut rng,
712 None,
713 ),
714 )
715 }
716 painter.spawn(
717 EntityInfo::at(first_floor_spawn_pos.as_()).with_asset_expect(
718 "common.entity.dungeon.sea_chapel.sea_bishop",
719 &mut rng,
720 None,
721 ),
722 );
723 painter
725 .cylinder(Aabb {
726 min: (center - (diameter / 2) + 3).with_z(base - 1),
727 max: (center + (diameter / 2) - 3).with_z(base),
728 })
729 .fill(gold_decor.clone());
730 painter
731 .cylinder(Aabb {
732 min: (center - (diameter / 2) + 5).with_z(base - 1),
733 max: (center + (diameter / 2) - 5).with_z(base),
734 })
735 .fill(floor_color.clone());
736 painter
738 .cylinder(Aabb {
739 min: (center - (diameter / 2) + 5).with_z(base),
740 max: (center + (diameter / 2) - 5).with_z(base + 1),
741 })
742 .fill(sprite_fill.clone());
743 painter
744 .cylinder(Aabb {
745 min: (center - (diameter / 2) + 6).with_z(base),
746 max: (center + (diameter / 2) - 6).with_z(base + 1),
747 })
748 .clear();
749 let center_o1 = center + (diameter / 8);
751 painter
752 .cylinder(Aabb {
753 min: (center_o1 - 4).with_z(base),
754 max: (center_o1 + 4).with_z(base + 1),
755 })
756 .fill(gold_decor.clone());
757 painter
758 .cylinder(Aabb {
759 min: (center_o1 - 3).with_z(base),
760 max: (center_o1 + 3).with_z(base + 1),
761 })
762 .fill(floor_color.clone());
763 let first_floor_organ_pos = center_o1.with_z(base + 2);
765 painter.spawn(
766 EntityInfo::at(first_floor_organ_pos.as_()).with_asset_expect(
767 "common.entity.dungeon.sea_chapel.organ",
768 &mut rng,
769 None,
770 ),
771 );
772 let main_room_sea_clerics_pos = (center_o1 - 2).with_z(base + 2);
774 for _ in 0..(3 + ((RandomField::new(0).get((main_room_sea_clerics_pos).with_z(base))) % 3))
775 {
776 painter.spawn(
777 EntityInfo::at(main_room_sea_clerics_pos.as_()).with_asset_expect(
778 "common.entity.dungeon.sea_chapel.sea_cleric",
779 &mut rng,
780 None,
781 ),
782 )
783 }
784 painter.spawn(
786 EntityInfo::at((first_floor_organ_pos + 2).as_()).with_asset_expect(
787 "common.entity.dungeon.sea_chapel.coralgolem",
788 &mut rng,
789 None,
790 ),
791 );
792 painter.spawn(
793 EntityInfo::at((first_floor_organ_pos + 4).as_()).with_asset_expect(
794 "common.entity.dungeon.sea_chapel.sea_bishop",
795 &mut rng,
796 None,
797 ),
798 );
799 let center_g = center - diameter / 7;
801 painter
802 .cylinder(Aabb {
803 min: (center_g - 4).with_z(base - 1),
804 max: (center_g + 4).with_z(base),
805 })
806 .fill(gold_decor.clone());
807 painter
808 .cylinder(Aabb {
809 min: (center_g - 3).with_z(base - 1),
810 max: (center_g + 3).with_z(base),
811 })
812 .fill(glass_barrier.clone());
813 painter
814 .cylinder(Aabb {
815 min: (center_g - 1).with_z(base - 1),
816 max: (center_g).with_z(base),
817 })
818 .fill(glass_keyhole.clone());
819
820 painter
822 .cylinder(Aabb {
823 min: (center - (diameter / 2) + 1).with_z(base - (diameter / 4) - 5),
824 max: (center + (diameter / 2) - 1).with_z(base - (diameter / 4) - 4),
825 })
826 .fill(gold_decor.clone());
827 painter
828 .cylinder(Aabb {
829 min: (center - (diameter / 2) + 3).with_z(base - (diameter / 4) - 5),
830 max: (center + (diameter / 2) - 3).with_z(base - (diameter / 4) - 4),
831 })
832 .fill(floor_color.clone());
833 painter
835 .cylinder(Aabb {
836 min: (center - (diameter / 2) + 3).with_z(base - (diameter / 4) - 4),
837 max: (center + (diameter / 2) - 3).with_z(base - (diameter / 4) - 3),
838 })
839 .fill(sprite_fill.clone());
840 painter
841 .cylinder(Aabb {
842 min: (center - (diameter / 2) + 4).with_z(base - (diameter / 4) - 4),
843 max: (center + (diameter / 2) - 4).with_z(base - (diameter / 4) - 3),
844 })
845 .clear();
846 let stairs_pos = center_g + 1;
848 let stair_radius1 = 5.0;
849 let stairs_clear1 = painter.cylinder(Aabb {
850 min: (stairs_pos - stair_radius1 as i32).with_z(base - (diameter / 4) - 5),
851 max: (stairs_pos + stair_radius1 as i32).with_z(base - 1),
852 });
853 stairs_clear1
854 .sample(spiral_staircase(
855 stairs_pos.with_z(base - (diameter / 8) + diameter - (diameter / 8)),
856 stair_radius1,
857 0.5,
858 7.0,
859 ))
860 .fill(gold.clone());
861 stairs_clear1
862 .sample(spiral_staircase(
863 stairs_pos.with_z(base - (diameter / 8) + diameter - (diameter / 8)),
864 stair_radius1 - 1.0,
865 0.5,
866 7.0,
867 ))
868 .fill(white.clone());
869 let cr_sea_clerics_pos = (center - (diameter / 5)).with_z(base - (diameter / 4) - 3);
871 for _ in 0..(2 + ((RandomField::new(0).get((cr_sea_clerics_pos).with_z(base))) % 3)) {
872 painter.spawn(EntityInfo::at(cr_sea_clerics_pos.as_()).with_asset_expect(
873 "common.entity.dungeon.sea_chapel.sea_cleric",
874 &mut rng,
875 None,
876 ))
877 }
878 let cr_cardinal_pos = (center - (diameter / 6)).with_z(base - (diameter / 4) - 3);
880 painter.spawn(EntityInfo::at(cr_cardinal_pos.as_()).with_asset_expect(
881 "common.entity.dungeon.sea_chapel.cardinal",
882 &mut rng,
883 None,
884 ));
885 painter
887 .cylinder(Aabb {
888 min: (center - 3).with_z(base - (diameter / 4) - 5),
889 max: (center + 3).with_z(base - (diameter / 4) - 4),
890 })
891 .fill(gold_decor.clone());
892 painter
893 .cylinder(Aabb {
894 min: (center - 2).with_z(base - (diameter / 4) - 5),
895 max: (center + 2).with_z(base - (diameter / 4) - 4),
896 })
897 .fill(glass_barrier.clone());
898 painter
899 .cylinder(Aabb {
900 min: (center - 1).with_z(base - (diameter / 4) - 5),
901 max: (center).with_z(base - (diameter / 4) - 4),
902 })
903 .fill(glass_keyhole.clone());
904
905 painter
907 .aabb(Aabb {
908 min: Vec3::new(
909 center.x - (diameter / 3),
910 center.y - 2,
911 base - (diameter / 8) + diameter - 2,
912 ),
913 max: Vec3::new(
914 center.x - (diameter / 3) + 1,
915 center.y + 2,
916 base - (diameter / 8) + diameter - 1,
917 ),
918 })
919 .fill(window_ver2.clone());
920
921 painter
922 .aabb(Aabb {
923 min: Vec3::new(
924 center.x - (diameter / 3),
925 center.y - 1,
926 base - (diameter / 8) + diameter - 3,
927 ),
928 max: Vec3::new(
929 center.x - (diameter / 3) + 1,
930 center.y + 1,
931 base - (diameter / 8) + diameter - 2,
932 ),
933 })
934 .fill(window_ver2.clone());
935
936 painter
938 .aabb(Aabb {
939 min: Vec3::new(
940 center.x + (diameter / 3) - 1,
941 center.y - 2,
942 base - (diameter / 8) + diameter - 2,
943 ),
944 max: Vec3::new(
945 center.x + (diameter / 3),
946 center.y + 2,
947 base - (diameter / 8) + diameter - 1,
948 ),
949 })
950 .clear();
951
952 painter
953 .aabb(Aabb {
954 min: Vec3::new(
955 center.x + (diameter / 3) - 1,
956 center.y - 1,
957 base - (diameter / 8) + diameter - 3,
958 ),
959 max: Vec3::new(
960 center.x + (diameter / 3),
961 center.y + 1,
962 base - (diameter / 8) + diameter - 2,
963 ),
964 })
965 .clear();
966
967 painter
969 .aabb(Aabb {
970 min: Vec3::new(
971 center.x - 2,
972 center.y + (diameter / 3) - 1,
973 base - (diameter / 8) + diameter - 2,
974 ),
975 max: Vec3::new(
976 center.x + 2,
977 center.y + (diameter / 3),
978 base - (diameter / 8) + diameter - 1,
979 ),
980 })
981 .clear();
982 painter
983 .aabb(Aabb {
984 min: Vec3::new(
985 center.x - 1,
986 center.y + (diameter / 3) - 1,
987 base - (diameter / 8) + diameter - 3,
988 ),
989 max: Vec3::new(
990 center.x + 1,
991 center.y + (diameter / 3),
992 base - (diameter / 8) + diameter - 2,
993 ),
994 })
995 .clear();
996 painter
998 .aabb(Aabb {
999 min: Vec3::new(
1000 center.x - 2,
1001 center.y - (diameter / 3),
1002 base - (diameter / 8) + diameter - 2,
1003 ),
1004 max: Vec3::new(
1005 center.x + 2,
1006 center.y - (diameter / 3) + 1,
1007 base - (diameter / 8) + diameter - 1,
1008 ),
1009 })
1010 .fill(window_ver.clone());
1011
1012 painter
1013 .aabb(Aabb {
1014 min: Vec3::new(
1015 center.x - 1,
1016 center.y - (diameter / 3),
1017 base - (diameter / 8) + diameter - 3,
1018 ),
1019 max: Vec3::new(
1020 center.x + 1,
1021 center.y - (diameter / 3) + 1,
1022 base - (diameter / 8) + diameter - 2,
1023 ),
1024 })
1025 .fill(window_ver.clone());
1026
1027 painter
1029 .aabb(Aabb {
1030 min: Vec3::new(
1031 center.x - (diameter / 2),
1032 center.y - 4,
1033 base - (diameter / 8) + (diameter / 2) - 2,
1034 ),
1035 max: Vec3::new(
1036 center.x - (diameter / 2) + 1,
1037 center.y + 4,
1038 base - (diameter / 8) + (diameter / 2) - 1,
1039 ),
1040 })
1041 .fill(window_ver2.clone());
1042
1043 painter
1044 .aabb(Aabb {
1045 min: Vec3::new(
1046 center.x - (diameter / 2),
1047 center.y - 3,
1048 base - (diameter / 8) + (diameter / 2) - 3,
1049 ),
1050 max: Vec3::new(
1051 center.x - (diameter / 2) + 1,
1052 center.y + 3,
1053 base - (diameter / 8) + (diameter / 2) - 2,
1054 ),
1055 })
1056 .fill(window_ver2.clone());
1057 painter
1058 .aabb(Aabb {
1059 min: Vec3::new(
1060 center.x - (diameter / 2),
1061 center.y - 2,
1062 base - (diameter / 8) + (diameter / 2) - 4,
1063 ),
1064 max: Vec3::new(
1065 center.x - (diameter / 2) + 1,
1066 center.y + 2,
1067 base - (diameter / 8) + (diameter / 2) - 3,
1068 ),
1069 })
1070 .fill(window_ver2.clone());
1071
1072 painter
1074 .aabb(Aabb {
1075 min: Vec3::new(
1076 center.x + (diameter / 2) - 1,
1077 center.y - 4,
1078 base - (diameter / 8) + (diameter / 2) - 2,
1079 ),
1080 max: Vec3::new(
1081 center.x + (diameter / 2),
1082 center.y + 4,
1083 base - (diameter / 8) + (diameter / 2) - 1,
1084 ),
1085 })
1086 .fill(window_ver2.clone());
1087 painter
1088 .aabb(Aabb {
1089 min: Vec3::new(
1090 center.x + (diameter / 2) - 1,
1091 center.y - 3,
1092 base - (diameter / 8) + (diameter / 2) - 3,
1093 ),
1094 max: Vec3::new(
1095 center.x + (diameter / 2),
1096 center.y + 3,
1097 base - (diameter / 8) + (diameter / 2) - 2,
1098 ),
1099 })
1100 .fill(window_ver2.clone());
1101 painter
1102 .aabb(Aabb {
1103 min: Vec3::new(
1104 center.x + (diameter / 2) - 1,
1105 center.y - 2,
1106 base - (diameter / 8) + (diameter / 2) - 4,
1107 ),
1108 max: Vec3::new(
1109 center.x + (diameter / 2),
1110 center.y + 2,
1111 base - (diameter / 8) + (diameter / 2) - 3,
1112 ),
1113 })
1114 .fill(window_ver2.clone());
1115 painter
1117 .aabb(Aabb {
1118 min: Vec3::new(
1119 center.x - 4,
1120 center.y + (diameter / 2) - 1,
1121 base - (diameter / 8) + (diameter / 2) - 2,
1122 ),
1123 max: Vec3::new(
1124 center.x + 4,
1125 center.y + (diameter / 2),
1126 base - (diameter / 8) + (diameter / 2) - 1,
1127 ),
1128 })
1129 .fill(window_ver.clone());
1130 painter
1131 .aabb(Aabb {
1132 min: Vec3::new(
1133 center.x - 3,
1134 center.y + (diameter / 2) - 1,
1135 base - (diameter / 8) + (diameter / 2) - 3,
1136 ),
1137 max: Vec3::new(
1138 center.x + 3,
1139 center.y + (diameter / 2),
1140 base - (diameter / 8) + (diameter / 2) - 2,
1141 ),
1142 })
1143 .fill(window_ver.clone());
1144 painter
1145 .aabb(Aabb {
1146 min: Vec3::new(
1147 center.x - 2,
1148 center.y + (diameter / 2) - 1,
1149 base - (diameter / 8) + (diameter / 2) - 4,
1150 ),
1151 max: Vec3::new(
1152 center.x + 2,
1153 center.y + (diameter / 2),
1154 base - (diameter / 8) + (diameter / 2) - 3,
1155 ),
1156 })
1157 .fill(window_ver.clone());
1158
1159 painter
1161 .aabb(Aabb {
1162 min: Vec3::new(
1163 center.x - 4,
1164 center.y - (diameter / 2) + 1,
1165 base - (diameter / 8) + (diameter / 2) - 2,
1166 ),
1167 max: Vec3::new(
1168 center.x + 4,
1169 center.y - (diameter / 2),
1170 base - (diameter / 8) + (diameter / 2) - 1,
1171 ),
1172 })
1173 .fill(window_ver.clone());
1174 painter
1175 .aabb(Aabb {
1176 min: Vec3::new(
1177 center.x - 3,
1178 center.y - (diameter / 2) + 1,
1179 base - (diameter / 8) + (diameter / 2) - 3,
1180 ),
1181 max: Vec3::new(
1182 center.x + 3,
1183 center.y - (diameter / 2),
1184 base - (diameter / 8) + (diameter / 2) - 2,
1185 ),
1186 })
1187 .fill(window_ver.clone());
1188 painter
1189 .aabb(Aabb {
1190 min: Vec3::new(
1191 center.x - 2,
1192 center.y - (diameter / 2) + 1,
1193 base - (diameter / 8) + (diameter / 2) - 4,
1194 ),
1195 max: Vec3::new(
1196 center.x + 2,
1197 center.y - (diameter / 2),
1198 base - (diameter / 8) + (diameter / 2) - 3,
1199 ),
1200 })
1201 .fill(window_ver.clone());
1202
1203 painter.rotated_sprite(
1205 center.with_z(base + (diameter / 4)),
1206 SpriteKind::SeaDecorEmblem,
1207 2_u8,
1208 );
1209 painter
1210 .aabb(Aabb {
1211 min: Vec3::new(center.x, center.y, base + (diameter / 4) + 1),
1212 max: Vec3::new(
1213 center.x + 1,
1214 center.y + 1,
1215 base - (diameter / 8) + diameter - 7,
1216 ),
1217 })
1218 .fill(gold_chain.clone());
1219
1220 for n in 1..=tubes as i32 {
1221 let pos = Vec2::new(
1222 center.x + (radius as f32 * ((n as f32 * phi).cos())) as i32,
1223 center.y + (radius as f32 * ((n as f32 * phi).sin())) as i32,
1224 );
1225
1226 let storeys = 2 + (RandomField::new(0).get(pos.with_z(base)) as i32 % 2);
1227 let steps = 7;
1228 for n in 0..2 {
1229 for t in 0..storeys {
1230 let mut points = vec![];
1231 for s in 0..steps {
1232 let step_pos = Vec2::new(
1233 pos.x + (8_f32 * ((s as f32 * phi).cos())) as i32,
1234 pos.y + (8_f32 * ((s as f32 * phi).sin())) as i32,
1235 );
1236 points.push(step_pos);
1237 }
1238 if t == (storeys - 1) {
1239 painter
1241 .sphere(Aabb {
1242 min: (points[0] - (diameter / 6)).with_z(
1243 base + (6 * up) + (t * (steps - 1) * up) - (diameter / 6),
1244 ),
1245
1246 max: (points[0] + (diameter / 6)).with_z(
1247 base + (6 * up) + (t * (steps - 1) * up) + (diameter / 6),
1248 ),
1249 })
1250 .fill(white.clone());
1251
1252 let room_upper_half = painter.aabb(Aabb {
1253 min: (points[0] - (diameter / 6))
1254 .with_z(base + (6 * up) + (t * (steps - 1) * up)),
1255 max: (points[0] + (diameter / 6))
1256 .with_z(base + (6 * up) + (t * (steps - 1) * up) + (diameter / 6)),
1257 });
1258 painter
1260 .sphere(Aabb {
1261 min: (points[0] - (diameter / 6)).with_z(
1262 base + (6 * up) + (t * (steps - 1) * up) - (diameter / 6),
1263 ),
1264 max: (points[0] + (diameter / 6)).with_z(
1265 base + (6 * up) + (t * (steps - 1) * up) + (diameter / 6),
1266 ),
1267 })
1268 .intersect(room_upper_half)
1269 .fill(washed.clone());
1270 painter
1272 .sphere(Aabb {
1273 min: (points[0] - (diameter / 6) + 1).with_z(
1274 base + (6 * up) + (t * (steps - 1) * up) - (diameter / 6) + 1,
1275 ),
1276 max: (points[0] + (diameter / 6)).with_z(
1277 base + (6 * up) + (t * (steps - 1) * up) + (diameter / 6),
1278 ),
1279 })
1280 .intersect(room_upper_half)
1281 .fill(top.clone());
1282 painter
1284 .cylinder(Aabb {
1285 min: (points[0] - (diameter / 6))
1286 .with_z(base + (6 * up) + (t * (steps - 1) * up) + 1),
1287 max: (points[0] + (diameter / 6))
1288 .with_z(base + (6 * up) + (t * (steps - 1) * up) + 2),
1289 })
1290 .fill(gold.clone());
1291 painter
1293 .sphere(Aabb {
1294 min: (points[0] - (diameter / 6) + 1).with_z(
1295 base + (6 * up) + (t * (steps - 1) * up) - (diameter / 6) + 1,
1296 ),
1297
1298 max: (points[0] + (diameter / 6) - 1).with_z(
1299 base + (6 * up) + (t * (steps - 1) * up) + (diameter / 6) - 1,
1300 ),
1301 })
1302 .clear();
1303 painter
1305 .aabb(Aabb {
1306 min: Vec3::new(
1307 points[0].x + (diameter / 6) - 1,
1308 points[0].y - 2,
1309 base + (6 * up) + (t * (steps - 1) * up) - (diameter / 6) + 7,
1310 ),
1311 max: Vec3::new(
1312 points[0].x + (diameter / 6),
1313 points[0].y + 2,
1314 base + (6 * up) + (t * (steps - 1) * up) - (diameter / 6) + 8,
1315 ),
1316 })
1317 .fill(window_ver2.clone());
1318 painter
1320 .aabb(Aabb {
1321 min: Vec3::new(
1322 points[0].x - 2,
1323 points[0].y + (diameter / 6) - 1,
1324 base + (6 * up) + (t * (steps - 1) * up) - (diameter / 6) + 7,
1325 ),
1326 max: Vec3::new(
1327 points[0].x + 2,
1328 points[0].y + (diameter / 6),
1329 base + (6 * up) + (t * (steps - 1) * up) - (diameter / 6) + 8,
1330 ),
1331 })
1332 .fill(window_ver.clone());
1333 painter
1335 .aabb(Aabb {
1336 min: Vec3::new(
1337 points[0].x - 2,
1338 points[0].y - (diameter / 6) + 1,
1339 base + (6 * up) + (t * (steps - 1) * up) - (diameter / 6) + 7,
1340 ),
1341 max: Vec3::new(
1342 points[0].x + 2,
1343 points[0].y - (diameter / 6),
1344 base + (6 * up) + (t * (steps - 1) * up) - (diameter / 6) + 8,
1345 ),
1346 })
1347 .fill(window_ver.clone());
1348 }
1349 let stairs_decor = painter
1350 .cubic_bezier(
1351 points[0].with_z(base - 4 + (n * 2) + (t * (steps - 1) * up)),
1352 points[1].with_z(base - 4 + (n * 2) + up + (t * (steps - 1) * up)),
1353 points[2]
1354 .with_z(base - 4 + (n * 2) + (2 * up) + (t * (steps - 1) * up)),
1355 points[3]
1356 .with_z(base - 4 + (n * 2) + (3 * up) + (t * (steps - 1) * up)),
1357 1.0,
1358 )
1359 .union(
1360 painter.cubic_bezier(
1361 points[3]
1362 .with_z(base - 4 + (n * 2) + (3 * up) + (t * (steps - 1) * up)),
1363 points[4]
1364 .with_z(base - 4 + (n * 2) + (4 * up) + (t * (steps - 1) * up)),
1365 points[5]
1366 .with_z(base - 4 + (n * 2) + (5 * up) + (t * (steps - 1) * up)),
1367 points[0]
1368 .with_z(base - 4 + (n * 2) + (6 * up) + (t * (steps - 1) * up)),
1369 1.0,
1370 ),
1371 );
1372 let stairs = painter
1373 .cubic_bezier(
1374 points[0].with_z(base + (n * 2) + (t * (steps - 1) * up)),
1375 points[1].with_z(base + (n * 2) + up + (t * (steps - 1) * up)),
1376 points[2].with_z(base + (n * 2) + (2 * up) + (t * (steps - 1) * up)),
1377 points[3].with_z(base + (n * 2) + (3 * up) + (t * (steps - 1) * up)),
1378 4.0,
1379 )
1380 .union(painter.cubic_bezier(
1381 points[3].with_z(base + (n * 2) + (3 * up) + (t * (steps - 1) * up)),
1382 points[4].with_z(base + (n * 2) + (4 * up) + (t * (steps - 1) * up)),
1383 points[5].with_z(base + (n * 2) + (5 * up) + (t * (steps - 1) * up)),
1384 points[0].with_z(base + (n * 2) + (6 * up) + (t * (steps - 1) * up)),
1385 4.0,
1386 ));
1387 match n {
1388 0 => {
1389 stairs_decor.fill(gold.clone());
1390 stairs.fill(white.clone())
1391 },
1392 _ => stairs.clear(),
1393 };
1394 if t == (storeys - 1) {
1395 painter
1397 .cylinder(Aabb {
1398 min: (points[0] - (diameter / 6) + 2)
1399 .with_z(base + (6 * up) + (t * (steps - 1) * up) - 5),
1400 max: (points[0] + (diameter / 6) - 2)
1401 .with_z(base + (6 * up) + (t * (steps - 1) * up) - 4),
1402 })
1403 .fill(gold_decor.clone());
1404 painter
1405 .cylinder(Aabb {
1406 min: (points[0] - (diameter / 6) + 3)
1407 .with_z(base + (6 * up) + (t * (steps - 1) * up) - 7),
1408 max: (points[0] + (diameter / 6) - 3)
1409 .with_z(base + (6 * up) + (t * (steps - 1) * up) - 4),
1410 })
1411 .fill(floor_color.clone());
1412 painter
1414 .cylinder(Aabb {
1415 min: (points[0] - (diameter / 6) + 3)
1416 .with_z(base + (6 * up) + (t * (steps - 1) * up) - 3),
1417 max: (points[0] + (diameter / 6) - 3)
1418 .with_z(base + (6 * up) + (t * (steps - 1) * up) - 4),
1419 })
1420 .fill(sprite_fill.clone());
1421 painter
1422 .cylinder(Aabb {
1423 min: (points[0] - (diameter / 6) + 4)
1424 .with_z(base + (6 * up) + (t * (steps - 1) * up) - 3),
1425 max: (points[0] + (diameter / 6) - 4)
1426 .with_z(base + (6 * up) + (t * (steps - 1) * up) - 4),
1427 })
1428 .clear();
1429 let room_clerics_pos =
1431 (points[0] + 2).with_z(base + (6 * up) + (t * (steps - 1) * up) - 4);
1432 painter.spawn(EntityInfo::at(room_clerics_pos.as_()).with_asset_expect(
1433 "common.entity.dungeon.sea_chapel.sea_cleric",
1434 &mut rng,
1435 None,
1436 ));
1437 };
1438 if t == 2 {
1440 let bldg_gold_top1 = Aabb {
1441 min: (points[0] - 2).with_z(
1442 base + 1 + (6 * up) + (t * (steps - 1) * up) + (diameter / 6) - 3,
1443 ),
1444 max: (points[0] + 2).with_z(
1445 base + 1 + (6 * up) + (t * (steps - 1) * up) + (diameter / 6) + 1,
1446 ),
1447 };
1448 let bldg_gold_top_pole = Aabb {
1449 min: (points[0] - 1).with_z(
1450 base + 1 + (6 * up) + (t * (steps - 1) * up) + (diameter / 6) + 1,
1451 ),
1452 max: (points[0] + 1).with_z(
1453 base + 1 + (6 * up) + (t * (steps - 1) * up) + (diameter / 6) + 7,
1454 ),
1455 };
1456 let bldg_gold_top_antlers1 = Aabb {
1457 min: Vec3::new(
1458 points[0].x - 2,
1459 points[0].y - 1,
1460 base + 1 + (6 * up) + (t * (steps - 1) * up) + (diameter / 6) + 1,
1461 ),
1462 max: Vec3::new(
1463 points[0].x + 2,
1464 points[0].y + 1,
1465 base + 1 + (6 * up) + (t * (steps - 1) * up) + (diameter / 6) + 2,
1466 ),
1467 };
1468 let bldg_gold_top_antlers2 = painter.aabb(Aabb {
1469 min: Vec3::new(
1470 points[0].x - 3,
1471 points[0].y - 1,
1472 base + 1 + (6 * up) + (t * (steps - 1) * up) + (diameter / 6) + 2,
1473 ),
1474
1475 max: Vec3::new(
1476 points[0].x + 3,
1477 points[0].y + 1,
1478 base + 1 + (6 * up) + (t * (steps - 1) * up) + (diameter / 6) + 3,
1479 ),
1480 });
1481 let bldg_gold_top_antlers2_clear = painter.aabb(Aabb {
1482 min: Vec3::new(
1483 points[0].x - 2,
1484 points[0].y - 1,
1485 base + 1 + (6 * up) + (t * (steps - 1) * up) + (diameter / 6) + 2,
1486 ),
1487
1488 max: Vec3::new(
1489 points[0].x + 2,
1490 points[0].y + 1,
1491 base + 1 + (6 * up) + (t * (steps - 1) * up) + (diameter / 6) + 3,
1492 ),
1493 });
1494 let bldg_gold_top_antlers3 = Aabb {
1495 min: Vec3::new(
1496 points[0].x - 3,
1497 points[0].y - 1,
1498 base + 1 + (6 * up) + (t * (steps - 1) * up) + (diameter / 6) + 4,
1499 ),
1500 max: Vec3::new(
1501 points[0].x + 3,
1502 points[0].y + 1,
1503 base + 1 + (6 * up) + (t * (steps - 1) * up) + (diameter / 6) + 5,
1504 ),
1505 };
1506 let bldg_gold_top_antlers4 = painter.aabb(Aabb {
1507 min: Vec3::new(
1508 points[0].x - 5,
1509 points[0].y - 1,
1510 base + 1 + (6 * up) + (t * (steps - 1) * up) + (diameter / 6) + 5,
1511 ),
1512
1513 max: Vec3::new(
1514 points[0].x + 5,
1515 points[0].y + 1,
1516 base + 1 + (6 * up) + (t * (steps - 1) * up) + (diameter / 6) + 6,
1517 ),
1518 });
1519 let bldg_gold_top_antlers4_clear = painter.aabb(Aabb {
1520 min: Vec3::new(
1521 points[0].x - 2,
1522 points[0].y - 1,
1523 base + 1 + (6 * up) + (t * (steps - 1) * up) + (diameter / 6) + 5,
1524 ),
1525
1526 max: Vec3::new(
1527 points[0].x + 2,
1528 points[0].y + 1,
1529 base + 1 + (6 * up) + (t * (steps - 1) * up) + (diameter / 6) + 6,
1530 ),
1531 });
1532 let bldg_gold_top_antlers5 = painter.aabb(Aabb {
1533 min: Vec3::new(
1534 points[0].x - 2,
1535 points[0].y - 1,
1536 base + 1 + (6 * up) + (t * (steps - 1) * up) + (diameter / 6) + 7,
1537 ),
1538
1539 max: Vec3::new(
1540 points[0].x + 2,
1541 points[0].y + 1,
1542 base + 1 + (6 * up) + (t * (steps - 1) * up) + (diameter / 6) + 8,
1543 ),
1544 });
1545 let bldg_gold_top_antlers5_clear = painter.aabb(Aabb {
1546 min: Vec3::new(
1547 points[0].x - 1,
1548 points[0].y - 1,
1549 base + 1 + (6 * up) + (t * (steps - 1) * up) + (diameter / 6) + 7,
1550 ),
1551 max: Vec3::new(
1552 points[0].x + 1,
1553 points[0].y + 1,
1554 base + 1 + (6 * up) + (t * (steps - 1) * up) + (diameter / 6) + 8,
1555 ),
1556 });
1557 bldg_gold_top_antlers2.fill(gold.clone());
1558 bldg_gold_top_antlers2_clear.clear();
1559 bldg_gold_top_antlers4.fill(gold.clone());
1560 bldg_gold_top_antlers4_clear.clear();
1561 bldg_gold_top_antlers5.fill(gold.clone());
1562 bldg_gold_top_antlers5_clear.clear();
1563 painter.sphere(bldg_gold_top1).fill(gold.clone());
1564 painter.aabb(bldg_gold_top_pole).fill(gold.clone());
1565 painter.aabb(bldg_gold_top_antlers1).fill(gold.clone());
1566 painter.aabb(bldg_gold_top_antlers3).fill(gold.clone());
1567 };
1568 }
1569 }
1570 }
1571
1572 painter
1574 .sphere_with_radius(
1575 center.with_z(base - (2 * diameter) + (diameter / 4)),
1576 (diameter + (diameter / 5) + 1) as f32,
1577 )
1578 .fill(white.clone());
1579 let water_basin = painter.sphere_with_radius(
1580 center.with_z(base - (2 * diameter) + (diameter / 4) + 1),
1581 (diameter + (diameter / 5)) as f32,
1582 );
1583 water_basin.fill(water.clone());
1584 water_basin
1586 .intersect(
1587 painter.aabb(Aabb {
1588 min: (center - (diameter + (diameter / 5)))
1589 .with_z(base - (4 * (diameter / 4)) + 1),
1590 max: (center + (diameter + (diameter / 5)))
1591 .with_z(base - diameter + (diameter / 5) + (diameter / 4) + 1),
1592 }),
1593 )
1594 .clear();
1595 painter
1597 .cylinder_with_radius(
1598 center.with_z(base - (3 * diameter) + (diameter / 2)),
1599 (diameter - 4) as f32,
1600 1.0,
1601 )
1602 .fill(gold.clone());
1603 painter
1604 .cylinder_with_radius(
1605 center.with_z(base - (3 * diameter) + (diameter / 2)),
1606 (diameter - 5) as f32,
1607 1.0,
1608 )
1609 .fill(water.clone());
1610
1611 painter
1613 .sphere_with_radius(
1614 center.with_z(base - (3 * diameter) + (diameter / 2)),
1615 ((diameter / 2) + 2) as f32,
1616 )
1617 .fill(white.clone());
1618
1619 painter
1620 .sphere_with_radius(
1621 center.with_z(base - (3 * diameter) + (diameter / 2)),
1622 (diameter / 2) as f32,
1623 )
1624 .fill(water.clone());
1625
1626 painter
1628 .aabb(Aabb {
1629 min: Vec3::new(
1630 center.x - (diameter / 2) - 2,
1631 center.y - 2,
1632 base - (3 * diameter) + (diameter / 3) - 8,
1633 ),
1634 max: Vec3::new(
1635 center.x + (diameter / 2) + 2,
1636 center.y + 2,
1637 base - (3 * diameter) + (diameter / 3) + 4,
1638 ),
1639 })
1640 .fill(water.clone());
1641 painter
1643 .aabb(Aabb {
1644 min: Vec3::new(
1645 center.x - 2,
1646 center.y - (diameter / 2) - 2,
1647 base - (3 * diameter) + (diameter / 3) - 8,
1648 ),
1649 max: Vec3::new(
1650 center.x + 2,
1651 center.y + (diameter / 2) + 2,
1652 base - (3 * diameter) + (diameter / 3) + 4,
1653 ),
1654 })
1655 .fill(water);
1656 painter
1658 .sphere_with_radius(
1659 center.with_z(base - (3 * diameter) + (diameter / 2)),
1660 ((diameter / 2) + 2) as f32,
1661 )
1662 .intersect(
1663 painter.aabb(Aabb {
1664 min: (center - (diameter / 2) - 3)
1665 .with_z(base - (3 * diameter) + (diameter / 2) - 1),
1666 max: (center + (diameter / 2) + 3).with_z(base - (3 * diameter) + diameter + 2),
1667 }),
1668 )
1669 .fill(top.clone());
1670 painter
1672 .sphere_with_radius(
1673 center.with_z(base - (3 * diameter) + (diameter / 2)),
1674 (diameter / 2) as f32,
1675 )
1676 .intersect(
1677 painter.aabb(Aabb {
1678 min: (center - (diameter / 2) - 3)
1679 .with_z(base - (3 * diameter) + (diameter / 2) - 1),
1680 max: (center + (diameter / 2) + 3).with_z(base - (3 * diameter) + diameter + 2),
1681 }),
1682 )
1683 .clear();
1684 painter
1686 .cylinder_with_radius(
1687 center.with_z(base - (3 * diameter) + (diameter / 2)),
1688 ((diameter / 2) + 2) as f32,
1689 1.0,
1690 )
1691 .fill(gold.clone());
1692 painter
1693 .cylinder_with_radius(
1694 center.with_z(base - (3 * diameter) + (diameter / 2)),
1695 ((diameter / 2) + 1) as f32,
1696 1.0,
1697 )
1698 .fill(floor_color.clone());
1699 painter
1700 .cylinder_with_radius(
1701 center.with_z(base - (3 * diameter) + (diameter / 2) - 1),
1702 ((diameter / 2) + 1) as f32,
1703 1.0,
1704 )
1705 .fill(floor_color.clone());
1706 let underwater_organ_pos =
1708 (center - (diameter / 4)).with_z(base - (3 * diameter) + (diameter / 2) + 1);
1709 painter.spawn(
1710 EntityInfo::at(underwater_organ_pos.as_()).with_asset_expect(
1711 "common.entity.dungeon.sea_chapel.organ",
1712 &mut rng,
1713 None,
1714 ),
1715 );
1716 painter
1718 .cylinder_with_radius(
1719 center.with_z(base - (3 * diameter) + (diameter / 2) + 1),
1720 (diameter / 2) as f32,
1721 1.0,
1722 )
1723 .fill(gold_decor.clone());
1724 painter
1725 .cylinder_with_radius(
1726 center.with_z(base - (3 * diameter) + (diameter / 2) + 1),
1727 ((diameter / 2) - 1) as f32,
1728 1.0,
1729 )
1730 .clear();
1731
1732 painter
1734 .cylinder_with_radius(
1735 center.with_z(base - (3 * diameter) + (diameter / 2) + 1),
1736 ((diameter / 2) - 1) as f32,
1737 1.0,
1738 )
1739 .fill(sprite_fill);
1740 painter
1741 .cylinder_with_radius(
1742 center.with_z(base - (3 * diameter) + (diameter / 2) + 1),
1743 ((diameter / 2) - 2) as f32,
1744 1.0,
1745 )
1746 .clear();
1747 painter.rotated_sprite(
1749 center.with_z(base - (3 * diameter) + (diameter / 2) + (diameter / 4)),
1750 SpriteKind::SeaDecorEmblem,
1751 2_u8,
1752 );
1753 painter
1754 .aabb(Aabb {
1755 min: Vec3::new(
1756 center.x,
1757 center.y,
1758 base - (3 * diameter) + (diameter / 2) + (diameter / 4) + 1,
1759 ),
1760 max: Vec3::new(
1761 center.x + 1,
1762 center.y + 1,
1763 base - (3 * diameter) + diameter + 1,
1764 ),
1765 })
1766 .fill(gold_chain);
1767 let cellar_miniboss_pos = (center + 6).with_z(base - (3 * diameter) + (diameter / 2) + 1);
1769 painter.spawn(EntityInfo::at(cellar_miniboss_pos.as_()).with_asset_expect(
1770 "common.entity.dungeon.sea_chapel.dagon",
1771 &mut rng,
1772 None,
1773 ));
1774 painter
1776 .cylinder_with_radius(
1777 center.with_z(base - (3 * diameter) + (diameter / 2)),
1778 3.0,
1779 1.0,
1780 )
1781 .fill(white.clone());
1782 painter
1783 .cylinder_with_radius(
1784 center.with_z(base - (3 * diameter) + (diameter / 2) + 3),
1785 3.0,
1786 1.0,
1787 )
1788 .fill(gold_decor.clone());
1789 painter
1790 .cylinder_with_radius(
1791 center.with_z(base - (3 * diameter) + (diameter / 2)),
1792 3.0,
1793 3.0,
1794 )
1795 .fill(white.clone());
1796 painter
1797 .cylinder_with_radius(
1798 center.with_z(base - (3 * diameter) + (diameter / 2) - 1),
1799 3.0,
1800 1.0,
1801 )
1802 .fill(gold.clone());
1803 painter
1804 .cylinder_with_radius(
1805 center.with_z(base - (3 * diameter) + (diameter / 2) - 1),
1806 2.0,
1807 7.0,
1808 )
1809 .clear();
1810 painter
1812 .cylinder_with_radius(
1813 center.with_z(base - (3 * diameter) + (diameter / 3) - 9),
1814 (diameter / 2) as f32,
1815 1.0,
1816 )
1817 .fill(floor_color.clone());
1818
1819 for dir in DIAGONALS {
1821 let bldg_center = center + dir * (2 * (diameter / 3));
1822 let bldg_variant = (RandomField::new(0).get((bldg_center).with_z(base))) % 10;
1823 let tower_height = (diameter / 4) + (3 * (bldg_variant as i32));
1824 let bldg_diameter = diameter;
1825 let bldg_cellar = Aabb {
1826 min: (bldg_center - (bldg_diameter / 4)).with_z(base - (bldg_diameter / 3)),
1827 max: (bldg_center + (bldg_diameter / 4))
1828 .with_z(base - (bldg_diameter / 3) + (bldg_diameter / 2)),
1829 };
1830 let bldg_cellar_clear = Aabb {
1831 min: (bldg_center - (bldg_diameter / 4) + 1).with_z(base - (bldg_diameter / 3) + 1),
1832 max: (bldg_center + (bldg_diameter / 4) - 1)
1833 .with_z(base - (bldg_diameter / 3) + (bldg_diameter / 2) - 1),
1834 };
1835 let bldg_room = Aabb {
1836 min: (bldg_center - (bldg_diameter / 4)).with_z(base - (bldg_diameter / 15)),
1837 max: (bldg_center + (bldg_diameter / 4))
1838 .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 2)),
1839 };
1840 let bldg_hut_entry_clear1 = Aabb {
1841 min: Vec3::new(
1842 bldg_center.x - (bldg_diameter / 4) - 2,
1843 bldg_center.y - 2,
1844 base + (bldg_diameter / 15),
1845 ),
1846 max: Vec3::new(
1847 bldg_center.x + (bldg_diameter / 4) + 2,
1848 bldg_center.y + 2,
1849 base + (bldg_diameter / 15) + 4,
1850 ),
1851 };
1852 let bldg_hut_entry_clear2 = Aabb {
1853 min: Vec3::new(
1854 bldg_center.x - (bldg_diameter / 4) - 2,
1855 bldg_center.y - 1,
1856 base + (bldg_diameter / 15) + 4,
1857 ),
1858 max: Vec3::new(
1859 bldg_center.x + (bldg_diameter / 4) + 2,
1860 bldg_center.y + 1,
1861 base + (bldg_diameter / 15) + 5,
1862 ),
1863 };
1864 let bldg_pavillon_entry_clear1 = Aabb {
1865 min: Vec3::new(
1866 bldg_center.x - (bldg_diameter / 4),
1867 bldg_center.y - 6,
1868 base + (bldg_diameter / 15),
1869 ),
1870 max: Vec3::new(
1871 bldg_center.x + (bldg_diameter / 4),
1872 bldg_center.y + 6,
1873 base + (bldg_diameter / 15) + 4,
1874 ),
1875 };
1876 let bldg_pavillon_entry_clear2 = Aabb {
1877 min: Vec3::new(
1878 bldg_center.x - (bldg_diameter / 4),
1879 bldg_center.y - 5,
1880 base + (bldg_diameter / 15) + 4,
1881 ),
1882 max: Vec3::new(
1883 bldg_center.x + (bldg_diameter / 4),
1884 bldg_center.y + 5,
1885 base + (bldg_diameter / 15) + 5,
1886 ),
1887 };
1888 let bldg_pavillon_entry_clear3 = Aabb {
1889 min: Vec3::new(
1890 bldg_center.x - (bldg_diameter / 4),
1891 bldg_center.y - 4,
1892 base + (bldg_diameter / 15) + 5,
1893 ),
1894 max: Vec3::new(
1895 bldg_center.x + (bldg_diameter / 4),
1896 bldg_center.y + 4,
1897 base + (bldg_diameter / 15) + 6,
1898 ),
1899 };
1900 let bldg_pavillon_entry_clear4 = Aabb {
1901 min: Vec3::new(
1902 bldg_center.x - 6,
1903 bldg_center.y - (bldg_diameter / 4),
1904 base + (bldg_diameter / 15),
1905 ),
1906 max: Vec3::new(
1907 bldg_center.x + 6,
1908 bldg_center.y + (bldg_diameter / 4),
1909 base + (bldg_diameter / 15) + 4,
1910 ),
1911 };
1912 let bldg_pavillon_entry_clear5 = Aabb {
1913 min: Vec3::new(
1914 bldg_center.x - 5,
1915 bldg_center.y - (bldg_diameter / 4),
1916 base + (bldg_diameter / 15) + 4,
1917 ),
1918 max: Vec3::new(
1919 bldg_center.x + 5,
1920 bldg_center.y + (bldg_diameter / 4),
1921 base + (bldg_diameter / 15) + 5,
1922 ),
1923 };
1924 let bldg_pavillon_entry_clear6 = Aabb {
1925 min: Vec3::new(
1926 bldg_center.x - 4,
1927 bldg_center.y - (bldg_diameter / 4),
1928 base + (bldg_diameter / 15) + 5,
1929 ),
1930 max: Vec3::new(
1931 bldg_center.x + 4,
1932 bldg_center.y + (bldg_diameter / 4),
1933 base + (bldg_diameter / 15) + 6,
1934 ),
1935 };
1936 let bldg_room_windows_1 = painter.aabb(Aabb {
1937 min: Vec3::new(
1938 bldg_center.x - 1,
1939 bldg_center.y - (bldg_diameter / 4),
1940 base - (bldg_diameter / 15) + (bldg_diameter / 4) - 2,
1941 ),
1942 max: Vec3::new(
1943 bldg_center.x + 1,
1944 bldg_center.y - (bldg_diameter / 4) + 1,
1945 base - (bldg_diameter / 15) + (bldg_diameter / 4) - 1,
1946 ),
1947 });
1948 let bldg_room_windows_2 = painter.aabb(Aabb {
1949 min: Vec3::new(
1950 bldg_center.x - 1,
1951 bldg_center.y + (bldg_diameter / 4) - 1,
1952 base - (bldg_diameter / 15) + (bldg_diameter / 4) - 2,
1953 ),
1954 max: Vec3::new(
1955 bldg_center.x + 1,
1956 bldg_center.y + (bldg_diameter / 4),
1957 base - (bldg_diameter / 15) + (bldg_diameter / 4) - 1,
1958 ),
1959 });
1960 let bldg_top_half = painter.aabb(Aabb {
1961 min: (bldg_center - (bldg_diameter / 4))
1962 .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 4)),
1963 max: (bldg_center + (bldg_diameter / 4))
1964 .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 2)),
1965 });
1966 let bldg_washed_top = painter
1967 .sphere(Aabb {
1968 min: (bldg_center - (bldg_diameter / 4)).with_z(base - (bldg_diameter / 15)),
1969 max: (bldg_center + (bldg_diameter / 4))
1970 .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 2)),
1971 })
1972 .intersect(bldg_top_half);
1973 let bldg_top = painter
1974 .sphere(Aabb {
1975 min: (bldg_center - (bldg_diameter / 4) + 1)
1976 .with_z(base - (bldg_diameter / 15) + 1),
1977 max: (bldg_center + (bldg_diameter / 4))
1978 .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 2)),
1979 })
1980 .intersect(bldg_top_half);
1981 let bldg_room_goldring = painter.cylinder(Aabb {
1982 min: (bldg_center - (bldg_diameter / 4))
1983 .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 4) + 1),
1984 max: (bldg_center + (bldg_diameter / 4))
1985 .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 4) + 2),
1986 });
1987 let bldg_room_goldring_clear = painter.cylinder(Aabb {
1988 min: (bldg_center - (bldg_diameter / 4) + 1)
1989 .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 4) + 1),
1990 max: (bldg_center + (bldg_diameter / 4) - 1)
1991 .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 4) + 2),
1992 });
1993 let bldg_room_clear = Aabb {
1994 min: (bldg_center - (bldg_diameter / 4) + 1)
1995 .with_z(base - (bldg_diameter / 15) + 1),
1996 max: (bldg_center + (bldg_diameter / 4) - 1)
1997 .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 2) - 1),
1998 };
1999 let bldg_room_floor = Aabb {
2000 min: (bldg_center - (bldg_diameter / 4) + 1)
2001 .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 4) + 1),
2002 max: (bldg_center + (bldg_diameter / 4) - 1)
2003 .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 4) + 2),
2004 };
2005 let bldg_hut_floors_clear = Aabb {
2006 min: (bldg_center - 3).with_z(base - (bldg_diameter / 3) + 2),
2007 max: (bldg_center + 3)
2008 .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 2) - 2),
2009 };
2010 let bldg_room2 = Aabb {
2011 min: (bldg_center - (bldg_diameter / 6)).with_z(
2012 base - (bldg_diameter / 15) + (bldg_diameter / 2) - (bldg_diameter / 6),
2013 ),
2014 max: (bldg_center + (bldg_diameter / 6)).with_z(
2015 base - (bldg_diameter / 15) + (bldg_diameter / 2) + (bldg_diameter / 6),
2016 ),
2017 };
2018 let bldg_room2_windows1 = painter.aabb(Aabb {
2019 min: Vec3::new(
2020 bldg_center.x - 1,
2021 bldg_center.y - (bldg_diameter / 6),
2022 base - (bldg_diameter / 15) + (bldg_diameter / 2) - 2,
2023 ),
2024 max: Vec3::new(
2025 bldg_center.x + 1,
2026 bldg_center.y - (bldg_diameter / 6) + 1,
2027 base - (bldg_diameter / 15) + (bldg_diameter / 2) - 1,
2028 ),
2029 });
2030 let bldg_room2_windows2 = painter.aabb(Aabb {
2031 min: Vec3::new(
2032 bldg_center.x - 1,
2033 bldg_center.y + (bldg_diameter / 6) - 1,
2034 base - (bldg_diameter / 15) + (bldg_diameter / 2) - 2,
2035 ),
2036 max: Vec3::new(
2037 bldg_center.x + 1,
2038 bldg_center.y + (bldg_diameter / 6),
2039 base - (bldg_diameter / 15) + (bldg_diameter / 2) - 1,
2040 ),
2041 });
2042 let bldg_room2_windows3 = painter.aabb(Aabb {
2043 min: Vec3::new(
2044 bldg_center.x - (bldg_diameter / 6),
2045 bldg_center.y - 1,
2046 base - (bldg_diameter / 15) + (bldg_diameter / 2) - 2,
2047 ),
2048 max: Vec3::new(
2049 bldg_center.x - (bldg_diameter / 6) + 1,
2050 bldg_center.y + 1,
2051 base - (bldg_diameter / 15) + (bldg_diameter / 2) - 1,
2052 ),
2053 });
2054 let bldg_room2_windows4 = painter.aabb(Aabb {
2055 min: Vec3::new(
2056 bldg_center.x + (bldg_diameter / 6) - 1,
2057 bldg_center.y - 1,
2058 base - (bldg_diameter / 15) + (bldg_diameter / 2) - 2,
2059 ),
2060 max: Vec3::new(
2061 bldg_center.x + (bldg_diameter / 6),
2062 bldg_center.y + 1,
2063 base - (bldg_diameter / 15) + (bldg_diameter / 2) - 1,
2064 ),
2065 });
2066 let bldg_room2_top_half = painter.aabb(Aabb {
2067 min: (bldg_center - (bldg_diameter / 6) + 1)
2068 .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 2)),
2069 max: (bldg_center + (bldg_diameter / 6)).with_z(
2070 base - (bldg_diameter / 15) + (bldg_diameter / 2) + (bldg_diameter / 6),
2071 ),
2072 });
2073 let bldg_room2_top = painter
2074 .sphere(Aabb {
2075 min: (bldg_center - (bldg_diameter / 6) + 1).with_z(
2076 base - (bldg_diameter / 15) + (bldg_diameter / 2) - (bldg_diameter / 6) + 1,
2077 ),
2078 max: (bldg_center + (bldg_diameter / 6)).with_z(
2079 base - (bldg_diameter / 15) + (bldg_diameter / 2) + (bldg_diameter / 6),
2080 ),
2081 })
2082 .intersect(bldg_room2_top_half);
2083 let bldg_room2_washed_top = painter
2084 .sphere(Aabb {
2085 min: (bldg_center - (bldg_diameter / 6)).with_z(
2086 base - (bldg_diameter / 15) + (bldg_diameter / 2) - (bldg_diameter / 6),
2087 ),
2088 max: (bldg_center + (bldg_diameter / 6)).with_z(
2089 base - (bldg_diameter / 15) + (bldg_diameter / 2) + (bldg_diameter / 6),
2090 ),
2091 })
2092 .intersect(bldg_room2_top_half);
2093 let bldg_room2_goldring = painter.cylinder(Aabb {
2094 min: (bldg_center - (bldg_diameter / 6))
2095 .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 2) + 1),
2096 max: (bldg_center + (bldg_diameter / 6))
2097 .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 2) + 2),
2098 });
2099 let bldg_room2_goldring_clear = painter.cylinder(Aabb {
2100 min: (bldg_center - (bldg_diameter / 6) + 1)
2101 .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 2) + 1),
2102 max: (bldg_center + (bldg_diameter / 6) - 1)
2103 .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 2) + 2),
2104 });
2105 let bldg_room2_clear = Aabb {
2106 min: (bldg_center - (bldg_diameter / 6) + 1).with_z(
2107 base - (bldg_diameter / 15) + (bldg_diameter / 2) - (bldg_diameter / 6),
2108 ),
2109 max: (bldg_center + (bldg_diameter / 6) - 1).with_z(
2110 base - (bldg_diameter / 15) + (bldg_diameter / 2) + (bldg_diameter / 6),
2111 ),
2112 };
2113 let bldg_room2_floor = Aabb {
2114 min: (bldg_center - (bldg_diameter / 6) + 1).with_z(
2115 base - (bldg_diameter / 15) + (bldg_diameter / 2) - (bldg_diameter / 10),
2116 ),
2117 max: (bldg_center + (bldg_diameter / 6) - 1).with_z(
2118 base - (bldg_diameter / 15) + (bldg_diameter / 2) - (bldg_diameter / 10) + 1,
2119 ),
2120 };
2121 let bldg_tube = painter.cylinder(Aabb {
2122 min: (bldg_center - 4).with_z(
2123 base - (bldg_diameter / 15) + (bldg_diameter / 2) + (bldg_diameter / 6) - 1,
2124 ),
2125 max: (bldg_center + 4)
2126 .with_z(base - (bldg_diameter / 15) + tower_height + (bldg_diameter / 4)),
2127 });
2128 let bldg_tube_clear = painter.cylinder(Aabb {
2129 min: (bldg_center - 3).with_z(
2130 base - (bldg_diameter / 15) + (bldg_diameter / 2) - (bldg_diameter / 6) - 1,
2131 ),
2132 max: (bldg_center + 3)
2133 .with_z(base - (bldg_diameter / 15) + tower_height + (bldg_diameter / 4)),
2134 });
2135 let bldg_tube_windows1 = Aabb {
2136 min: Vec3::new(
2137 bldg_center.x + 3,
2138 bldg_center.y - 1,
2139 base - (bldg_diameter / 15) + (bldg_diameter / 2) + (bldg_diameter / 6),
2140 ),
2141 max: Vec3::new(
2142 bldg_center.x + 4,
2143 bldg_center.y + 1,
2144 base - (bldg_diameter / 15) + tower_height + (bldg_diameter / 4) - 2,
2145 ),
2146 };
2147 let bldg_tube_windows2 = Aabb {
2148 min: Vec3::new(
2149 bldg_center.x - 4,
2150 bldg_center.y - 1,
2151 base - (bldg_diameter / 15) + (bldg_diameter / 2) + (bldg_diameter / 6),
2152 ),
2153 max: Vec3::new(
2154 bldg_center.x - 3,
2155 bldg_center.y + 1,
2156 base - (bldg_diameter / 15) + tower_height + (bldg_diameter / 4) - 2,
2157 ),
2158 };
2159 let bldg_tube_windows3 = Aabb {
2160 min: Vec3::new(
2161 bldg_center.x - 1,
2162 bldg_center.y - 4,
2163 base - (bldg_diameter / 15) + (bldg_diameter / 2) + (bldg_diameter / 6),
2164 ),
2165 max: Vec3::new(
2166 bldg_center.x + 1,
2167 bldg_center.y - 3,
2168 base - (bldg_diameter / 15) + tower_height + (bldg_diameter / 4) - 2,
2169 ),
2170 };
2171 let bldg_tube_windows4 = Aabb {
2172 min: Vec3::new(
2173 bldg_center.x - 1,
2174 bldg_center.y + 3,
2175 base - (bldg_diameter / 15) + (bldg_diameter / 2) + (bldg_diameter / 6),
2176 ),
2177 max: Vec3::new(
2178 bldg_center.x + 1,
2179 bldg_center.y + 4,
2180 base - (bldg_diameter / 15) + tower_height + (bldg_diameter / 4) - 2,
2181 ),
2182 };
2183 let bldg_room3 = Aabb {
2184 min: (bldg_center - (bldg_diameter / 7))
2185 .with_z(base - (bldg_diameter / 15) + tower_height + (bldg_diameter / 4) - 2),
2186 max: (bldg_center + (bldg_diameter / 7)).with_z(
2187 base - (bldg_diameter / 15)
2188 + tower_height
2189 + (bldg_diameter / 4)
2190 + (2 * (bldg_diameter / 7))
2191 - 2,
2192 ),
2193 };
2194 let bldg_room3_washed_top_half = painter.aabb(Aabb {
2195 min: (bldg_center - (bldg_diameter / 7)).with_z(
2196 base - (bldg_diameter / 15)
2197 + tower_height
2198 + (bldg_diameter / 4)
2199 + (bldg_diameter / 7)
2200 - 2,
2201 ),
2202 max: (bldg_center + (bldg_diameter / 7)).with_z(
2203 base - (bldg_diameter / 15)
2204 + tower_height
2205 + (bldg_diameter / 4)
2206 + (2 * (bldg_diameter / 7))
2207 - 2,
2208 ),
2209 });
2210 let bldg_room3_washed_top = painter
2211 .sphere(Aabb {
2212 min: (bldg_center - (bldg_diameter / 7)).with_z(
2213 base - (bldg_diameter / 15) + tower_height + (bldg_diameter / 4) - 2,
2214 ),
2215 max: (bldg_center + (bldg_diameter / 7)).with_z(
2216 base - (bldg_diameter / 15)
2217 + tower_height
2218 + (bldg_diameter / 4)
2219 + (2 * (bldg_diameter / 7))
2220 - 2,
2221 ),
2222 })
2223 .intersect(bldg_room3_washed_top_half);
2224 let bldg_room3_top = painter
2225 .sphere(Aabb {
2226 min: (bldg_center - (bldg_diameter / 7) + 1).with_z(
2227 base - (bldg_diameter / 15) + tower_height + (bldg_diameter / 4) - 1,
2228 ),
2229 max: (bldg_center + (bldg_diameter / 7)).with_z(
2230 base - (bldg_diameter / 15)
2231 + tower_height
2232 + (bldg_diameter / 4)
2233 + (2 * (bldg_diameter / 7))
2234 - 2,
2235 ),
2236 })
2237 .intersect(bldg_room3_washed_top_half);
2238 let bldg_room3_goldring = Aabb {
2239 min: (bldg_center - (bldg_diameter / 7)).with_z(
2240 base - (bldg_diameter / 15)
2241 + tower_height
2242 + (bldg_diameter / 4)
2243 + (bldg_diameter / 7)
2244 - 1,
2245 ),
2246 max: (bldg_center + (bldg_diameter / 7)).with_z(
2247 base - (bldg_diameter / 15)
2248 + tower_height
2249 + (bldg_diameter / 4)
2250 + (bldg_diameter / 7),
2251 ),
2252 };
2253 let bldg_room3_clear = Aabb {
2254 min: (bldg_center - (bldg_diameter / 7) + 1)
2255 .with_z(base - (bldg_diameter / 15) + tower_height + (bldg_diameter / 4) - 1),
2256 max: (bldg_center + (bldg_diameter / 7) - 1).with_z(
2257 base - (bldg_diameter / 15)
2258 + tower_height
2259 + (bldg_diameter / 4)
2260 + (2 * (bldg_diameter / 7))
2261 - 3,
2262 ),
2263 };
2264 let bldg_room3_floor = painter.cylinder(Aabb {
2265 min: (bldg_center - 3).with_z(
2266 base - (bldg_diameter / 15)
2267 + tower_height
2268 + (bldg_diameter / 4)
2269 + (bldg_diameter / 7)
2270 - 8,
2271 ),
2272 max: (bldg_center + 3).with_z(
2273 base - (bldg_diameter / 15)
2274 + tower_height
2275 + (bldg_diameter / 4)
2276 + (bldg_diameter / 7)
2277 - 7,
2278 ),
2279 });
2280 let bldg_room3_floor_clear = painter.cylinder(Aabb {
2281 min: (bldg_center - 2).with_z(
2282 base - (bldg_diameter / 15)
2283 + tower_height
2284 + (bldg_diameter / 4)
2285 + (bldg_diameter / 7)
2286 - 8,
2287 ),
2288 max: (bldg_center + 2).with_z(
2289 base - (bldg_diameter / 15)
2290 + tower_height
2291 + (bldg_diameter / 4)
2292 + (bldg_diameter / 7)
2293 - 7,
2294 ),
2295 });
2296 let bldg_tower_floors_clear = Aabb {
2297 min: (bldg_center - 3).with_z(base - (bldg_diameter / 3) + 2),
2298 max: (bldg_center + 3).with_z(
2299 base - (bldg_diameter / 15)
2300 + tower_height
2301 + (bldg_diameter / 4)
2302 + (bldg_diameter / 4)
2303 - 3,
2304 ),
2305 };
2306 let bldg_room3_entry_clear1 = Aabb {
2307 min: Vec3::new(
2308 bldg_center.x - (bldg_diameter / 7),
2309 bldg_center.y - 3,
2310 base - (bldg_diameter / 15)
2311 + tower_height
2312 + (bldg_diameter / 4)
2313 + (bldg_diameter / 7)
2314 - 6,
2315 ),
2316 max: Vec3::new(
2317 bldg_center.x + (bldg_diameter / 7),
2318 bldg_center.y + 3,
2319 base - (bldg_diameter / 15)
2320 + tower_height
2321 + (bldg_diameter / 4)
2322 + (bldg_diameter / 7)
2323 - 4,
2324 ),
2325 };
2326 let bldg_room3_entry_clear2 = Aabb {
2327 min: Vec3::new(
2328 bldg_center.x - (bldg_diameter / 7),
2329 bldg_center.y - 2,
2330 base - (bldg_diameter / 15)
2331 + tower_height
2332 + (bldg_diameter / 4)
2333 + (bldg_diameter / 7)
2334 - 4,
2335 ),
2336 max: Vec3::new(
2337 bldg_center.x + (bldg_diameter / 7),
2338 bldg_center.y + 2,
2339 base - (bldg_diameter / 15)
2340 + tower_height
2341 + (bldg_diameter / 4)
2342 + (bldg_diameter / 7)
2343 - 3,
2344 ),
2345 };
2346 let bldg_room3_entry_clear3 = Aabb {
2347 min: Vec3::new(
2348 bldg_center.x - 3,
2349 bldg_center.y - (bldg_diameter / 7),
2350 base - (bldg_diameter / 15)
2351 + tower_height
2352 + (bldg_diameter / 4)
2353 + (bldg_diameter / 7)
2354 - 6,
2355 ),
2356 max: Vec3::new(
2357 bldg_center.x + 3,
2358 bldg_center.y + (bldg_diameter / 7),
2359 base - (bldg_diameter / 15)
2360 + tower_height
2361 + (bldg_diameter / 4)
2362 + (bldg_diameter / 7)
2363 - 4,
2364 ),
2365 };
2366 let bldg_room3_entry_clear4 = Aabb {
2367 min: Vec3::new(
2368 bldg_center.x - 2,
2369 bldg_center.y - (bldg_diameter / 7),
2370 base - (bldg_diameter / 15)
2371 + tower_height
2372 + (bldg_diameter / 4)
2373 + (bldg_diameter / 7)
2374 - 4,
2375 ),
2376 max: Vec3::new(
2377 bldg_center.x + 2,
2378 bldg_center.y + (bldg_diameter / 7),
2379 base - (bldg_diameter / 15)
2380 + tower_height
2381 + (bldg_diameter / 4)
2382 + (bldg_diameter / 7)
2383 - 3,
2384 ),
2385 };
2386 let bldg_gold_top1 = Aabb {
2387 min: (bldg_center - 2).with_z(
2388 base - (bldg_diameter / 15)
2389 + tower_height
2390 + (bldg_diameter / 4)
2391 + (2 * (bldg_diameter / 7))
2392 - 3,
2393 ),
2394 max: (bldg_center + 2).with_z(
2395 base - (bldg_diameter / 15)
2396 + tower_height
2397 + (bldg_diameter / 4)
2398 + (2 * (bldg_diameter / 7))
2399 + 1,
2400 ),
2401 };
2402 let bldg_gold_top_pole = Aabb {
2403 min: (bldg_center - 1).with_z(
2404 base - (bldg_diameter / 15)
2405 + tower_height
2406 + (bldg_diameter / 4)
2407 + (2 * (bldg_diameter / 7))
2408 + 1,
2409 ),
2410 max: (bldg_center + 1).with_z(
2411 base - (bldg_diameter / 15)
2412 + tower_height
2413 + (bldg_diameter / 4)
2414 + (2 * (bldg_diameter / 7))
2415 + 7,
2416 ),
2417 };
2418 let bldg_gold_top_antlers1 = Aabb {
2419 min: Vec3::new(
2420 bldg_center.x - 2,
2421 bldg_center.y - 1,
2422 base - (bldg_diameter / 15)
2423 + tower_height
2424 + (bldg_diameter / 4)
2425 + (2 * (bldg_diameter / 7))
2426 + 1,
2427 ),
2428 max: Vec3::new(
2429 bldg_center.x + 2,
2430 bldg_center.y + 1,
2431 base - (bldg_diameter / 15)
2432 + tower_height
2433 + (bldg_diameter / 4)
2434 + (2 * (bldg_diameter / 7))
2435 + 2,
2436 ),
2437 };
2438 let bldg_gold_top_antlers2 = painter.aabb(Aabb {
2439 min: Vec3::new(
2440 bldg_center.x - 3,
2441 bldg_center.y - 1,
2442 base - (bldg_diameter / 15)
2443 + tower_height
2444 + (bldg_diameter / 4)
2445 + (2 * (bldg_diameter / 7))
2446 + 2,
2447 ),
2448
2449 max: Vec3::new(
2450 bldg_center.x + 3,
2451 bldg_center.y + 1,
2452 base - (bldg_diameter / 15)
2453 + tower_height
2454 + (bldg_diameter / 4)
2455 + (2 * (bldg_diameter / 7))
2456 + 3,
2457 ),
2458 });
2459 let bldg_gold_top_antlers2_clear = painter.aabb(Aabb {
2460 min: Vec3::new(
2461 bldg_center.x - 2,
2462 bldg_center.y - 1,
2463 base - (bldg_diameter / 15)
2464 + tower_height
2465 + (bldg_diameter / 4)
2466 + (2 * (bldg_diameter / 7))
2467 + 2,
2468 ),
2469
2470 max: Vec3::new(
2471 bldg_center.x + 2,
2472 bldg_center.y + 1,
2473 base - (bldg_diameter / 15)
2474 + tower_height
2475 + (bldg_diameter / 4)
2476 + (2 * (bldg_diameter / 7))
2477 + 3,
2478 ),
2479 });
2480 let bldg_gold_top_antlers3 = Aabb {
2481 min: Vec3::new(
2482 bldg_center.x - 3,
2483 bldg_center.y - 1,
2484 base - (bldg_diameter / 15)
2485 + tower_height
2486 + (bldg_diameter / 4)
2487 + (2 * (bldg_diameter / 7))
2488 + 4,
2489 ),
2490 max: Vec3::new(
2491 bldg_center.x + 3,
2492 bldg_center.y + 1,
2493 base - (bldg_diameter / 15)
2494 + tower_height
2495 + (bldg_diameter / 4)
2496 + (2 * (bldg_diameter / 7))
2497 + 5,
2498 ),
2499 };
2500 let bldg_gold_top_antlers4 = painter.aabb(Aabb {
2501 min: Vec3::new(
2502 bldg_center.x - 5,
2503 bldg_center.y - 1,
2504 base - (bldg_diameter / 15)
2505 + tower_height
2506 + (bldg_diameter / 4)
2507 + (2 * (bldg_diameter / 7))
2508 + 5,
2509 ),
2510
2511 max: Vec3::new(
2512 bldg_center.x + 5,
2513 bldg_center.y + 1,
2514 base - (bldg_diameter / 15)
2515 + tower_height
2516 + (bldg_diameter / 4)
2517 + (2 * (bldg_diameter / 7))
2518 + 6,
2519 ),
2520 });
2521 let bldg_gold_top_antlers4_clear = painter.aabb(Aabb {
2522 min: Vec3::new(
2523 bldg_center.x - 2,
2524 bldg_center.y - 1,
2525 base - (bldg_diameter / 15)
2526 + tower_height
2527 + (bldg_diameter / 4)
2528 + (2 * (bldg_diameter / 7))
2529 + 5,
2530 ),
2531
2532 max: Vec3::new(
2533 bldg_center.x + 2,
2534 bldg_center.y + 1,
2535 base - (bldg_diameter / 15)
2536 + tower_height
2537 + (bldg_diameter / 4)
2538 + (2 * (bldg_diameter / 7))
2539 + 6,
2540 ),
2541 });
2542 let bldg_gold_top_antlers5 = painter.aabb(Aabb {
2543 min: Vec3::new(
2544 bldg_center.x - 2,
2545 bldg_center.y - 1,
2546 base - (bldg_diameter / 15)
2547 + tower_height
2548 + (bldg_diameter / 4)
2549 + (2 * (bldg_diameter / 7))
2550 + 7,
2551 ),
2552
2553 max: Vec3::new(
2554 bldg_center.x + 2,
2555 bldg_center.y + 1,
2556 base - (bldg_diameter / 15)
2557 + tower_height
2558 + (bldg_diameter / 4)
2559 + (2 * (bldg_diameter / 7))
2560 + 8,
2561 ),
2562 });
2563 let bldg_gold_top_antlers5_clear = painter.aabb(Aabb {
2564 min: Vec3::new(
2565 bldg_center.x - 1,
2566 bldg_center.y - 1,
2567 base - (bldg_diameter / 15)
2568 + tower_height
2569 + (bldg_diameter / 4)
2570 + (2 * (bldg_diameter / 7))
2571 + 7,
2572 ),
2573 max: Vec3::new(
2574 bldg_center.x + 1,
2575 bldg_center.y + 1,
2576 base - (bldg_diameter / 15)
2577 + tower_height
2578 + (bldg_diameter / 4)
2579 + (2 * (bldg_diameter / 7))
2580 + 8,
2581 ),
2582 });
2583 let bldg_tower_ropefix1 = Aabb {
2584 min: (bldg_center - 2).with_z(
2585 base - (bldg_diameter / 15)
2586 + tower_height
2587 + (bldg_diameter / 4)
2588 + (2 * (bldg_diameter / 7))
2589 - 4,
2590 ),
2591 max: (bldg_center + 2).with_z(
2592 base - (bldg_diameter / 15)
2593 + tower_height
2594 + (bldg_diameter / 4)
2595 + (2 * (bldg_diameter / 7))
2596 - 3,
2597 ),
2598 };
2599 let bldg_tower_ropefix2 = Aabb {
2600 min: (bldg_center).with_z(
2601 base - (bldg_diameter / 15)
2602 + tower_height
2603 + (bldg_diameter / 4)
2604 + (2 * (bldg_diameter / 7))
2605 - 5,
2606 ),
2607 max: (bldg_center + 1).with_z(
2608 base - (bldg_diameter / 15)
2609 + tower_height
2610 + (bldg_diameter / 4)
2611 + (2 * (bldg_diameter / 7))
2612 - 4,
2613 ),
2614 };
2615 let bldg_tower_rope = Aabb {
2616 min: bldg_center.with_z(base - (5 * (bldg_diameter / 4)) - 5),
2617 max: (bldg_center + 1).with_z(
2618 base - (bldg_diameter / 15)
2619 + tower_height
2620 + (bldg_diameter / 4)
2621 + (2 * (bldg_diameter / 7))
2622 - 5,
2623 ),
2624 };
2625 let bldg_hut_ropefix1 = Aabb {
2626 min: (bldg_center - 2)
2627 .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 2) - 3),
2628 max: (bldg_center + 2)
2629 .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 2) - 2),
2630 };
2631 let bldg_hut_ropefix2 = Aabb {
2632 min: bldg_center.with_z(base - (bldg_diameter / 15) + (bldg_diameter / 2) - 4),
2633 max: (bldg_center + 1)
2634 .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 2) - 3),
2635 };
2636 let bldg_hut_rope = Aabb {
2637 min: bldg_center.with_z(base - (5 * (bldg_diameter / 4)) - 5),
2638 max: (bldg_center + 1)
2639 .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 2) - 4),
2640 };
2641 let bldg_room_lantern_pos = (bldg_center + 2).with_z(base - (bldg_diameter / 15) + 2);
2642 let bldg_floor_lantern_pos =
2643 (bldg_center + 2).with_z(base - (bldg_diameter / 15) + (bldg_diameter / 4) + 2);
2644 let bldg_floor2_lantern_pos = Vec3::new(
2645 bldg_center.x + 3,
2646 bldg_center.y + 2,
2647 base - (bldg_diameter / 15) + (bldg_diameter / 2) - (bldg_diameter / 10) + 1,
2648 );
2649 let bldg_floor3_lantern_pos = (bldg_center + 2).with_z(
2650 base - (bldg_diameter / 15)
2651 + tower_height
2652 + (bldg_diameter / 4)
2653 + (bldg_diameter / 7)
2654 - 7,
2655 );
2656 let bldg_floor3_drawer_pos = (bldg_center - 3).with_z(
2657 base - (bldg_diameter / 15)
2658 + tower_height
2659 + (bldg_diameter / 4)
2660 + (bldg_diameter / 7)
2661 - 7,
2662 );
2663 let bldg_floor3_potion_pos = (bldg_center - 3).with_z(
2664 base - (bldg_diameter / 15)
2665 + tower_height
2666 + (bldg_diameter / 4)
2667 + (bldg_diameter / 7)
2668 - 6,
2669 );
2670 let bldg_cellar_chest_pos = Vec3::new(
2671 bldg_center.x - (bldg_diameter / 8),
2672 bldg_center.y,
2673 base - (bldg_diameter / 3) + 3,
2674 );
2675 let bldg_floor_bed_pos = Vec3::new(
2676 bldg_center.x - (bldg_diameter / 6),
2677 bldg_center.y,
2678 base - (bldg_diameter / 15) + (bldg_diameter / 4) + 2,
2679 );
2680 let bldg_floor_drawer_pos = (bldg_center - (bldg_diameter / 8))
2681 .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 4) + 2);
2682 let bldg_floor_potion_pos = (bldg_center - (bldg_diameter / 8))
2683 .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 4) + 3);
2684 let bldg_floor2_wall = Aabb {
2685 min: (bldg_center - 4).with_z(
2686 base - (bldg_diameter / 15) + (bldg_diameter / 2) - (bldg_diameter / 10) + 1,
2687 ),
2688 max: (bldg_center + 4).with_z(
2689 base - (bldg_diameter / 15) + (bldg_diameter / 2) + (bldg_diameter / 6) - 2,
2690 ),
2691 };
2692
2693 let bldg_underwater_exit_pos_1 =
2694 center + dir * (2 * ((diameter / 3) - (diameter / 10)));
2695 let bldg_underwater_exit_pos_2 = center + dir * (2 * ((diameter / 3) - (diameter / 7)));
2696 let bldg_underwater_tube = painter.cubic_bezier(
2697 bldg_center.with_z(base - (5 * (bldg_diameter / 4)) + 2),
2698 bldg_center.with_z(base - (6 * (bldg_diameter / 4))),
2699 bldg_underwater_exit_pos_1.with_z(base - (6 * (bldg_diameter / 4))),
2700 bldg_underwater_exit_pos_2.with_z(base - (5 * (bldg_diameter / 4))),
2701 ((bldg_diameter / 10) + 1) as f32,
2702 );
2703 let bldg_underwater_tube_clear = painter.cubic_bezier(
2704 bldg_center.with_z(base - (5 * (bldg_diameter / 4)) + 2),
2705 bldg_center.with_z(base - (6 * (bldg_diameter / 4))),
2706 bldg_underwater_exit_pos_1.with_z(base - (6 * (bldg_diameter / 4))),
2707 bldg_underwater_exit_pos_2.with_z(base - (5 * (bldg_diameter / 4))),
2708 (bldg_diameter / 10) as f32,
2709 );
2710 let bldg_underwater_exit = painter.cylinder(Aabb {
2711 min: (bldg_underwater_exit_pos_2 - (bldg_diameter / 10) - 1)
2712 .with_z(base - (5 * (bldg_diameter / 4)) + 1),
2713 max: (bldg_underwater_exit_pos_2 + (bldg_diameter / 10) + 1)
2714 .with_z(base - (4 * (bldg_diameter / 4)) + 2),
2715 });
2716 let bldg_underwater_exit_clear = painter.cylinder(Aabb {
2717 min: (bldg_underwater_exit_pos_2 - (bldg_diameter / 10))
2718 .with_z(base - (5 * (bldg_diameter / 4)) + 1),
2719 max: (bldg_underwater_exit_pos_2 + (bldg_diameter / 10))
2720 .with_z(base - (4 * (bldg_diameter / 4)) + 1),
2721 });
2722 let bldg_connect_tube = Aabb {
2723 min: (bldg_center - (bldg_diameter / 10))
2724 .with_z(base - (5 * (bldg_diameter / 4)) + 2),
2725 max: (bldg_center + (bldg_diameter / 10)).with_z(base - (bldg_diameter / 3) + 1),
2726 };
2727 let bldg_connect_step_1 = Aabb {
2728 min: (bldg_center - (bldg_diameter / 10) + 1)
2729 .with_z(base - (2 * (bldg_diameter / 4))),
2730 max: (bldg_center + (bldg_diameter / 10) - 1)
2731 .with_z(base - (2 * (bldg_diameter / 4)) + 1),
2732 };
2733 let bldg_connect_step_1_clear = Aabb {
2734 min: (bldg_center - (bldg_diameter / 10) + 2)
2735 .with_z(base - (2 * (bldg_diameter / 4))),
2736 max: (bldg_center + (bldg_diameter / 10) - 2)
2737 .with_z(base - (2 * (bldg_diameter / 4)) + 1),
2738 };
2739 let bldg_connect_step_2 = Aabb {
2740 min: (bldg_center - (bldg_diameter / 10) + 1)
2741 .with_z(base - (3 * (bldg_diameter / 4))),
2742 max: (bldg_center + (bldg_diameter / 10) - 1)
2743 .with_z(base - (3 * (bldg_diameter / 4)) + 1),
2744 };
2745 let bldg_connect_step_2_clear = Aabb {
2746 min: (bldg_center - (bldg_diameter / 10) + 2)
2747 .with_z(base - (3 * (bldg_diameter / 4))),
2748 max: (bldg_center + (bldg_diameter / 10) - 2)
2749 .with_z(base - (3 * (bldg_diameter / 4)) + 1),
2750 };
2751 let bldg_connect_step_3 = Aabb {
2752 min: (bldg_center - (bldg_diameter / 10) + 1)
2753 .with_z(base - (4 * (bldg_diameter / 4)) - 3),
2754 max: (bldg_center + (bldg_diameter / 10) - 1)
2755 .with_z(base - (4 * (bldg_diameter / 4)) - 2),
2756 };
2757 let bldg_connect_step_3_clear = Aabb {
2758 min: (bldg_center - (bldg_diameter / 10) + 2)
2759 .with_z(base - (4 * (bldg_diameter / 4)) - 3),
2760 max: (bldg_center + (bldg_diameter / 10) - 2)
2761 .with_z(base - (4 * (bldg_diameter / 4)) - 2),
2762 };
2763 let bldg_connect_tube_gold_ring = Aabb {
2764 min: (bldg_underwater_exit_pos_2 - (bldg_diameter / 10) + 1)
2765 .with_z(base - (4 * (bldg_diameter / 4)) + 1),
2766 max: (bldg_underwater_exit_pos_2 + (bldg_diameter / 10) - 1)
2767 .with_z(base - (4 * (bldg_diameter / 4)) + 2),
2768 };
2769 let bldg_connect_decor_ring = Aabb {
2770 min: (bldg_underwater_exit_pos_2 - (bldg_diameter / 10))
2771 .with_z(base - (4 * (bldg_diameter / 4))),
2772 max: (bldg_underwater_exit_pos_2 + (bldg_diameter / 10))
2773 .with_z(base - (4 * (bldg_diameter / 4)) + 1),
2774 };
2775 let bldg_connect_decor_ring_clear = Aabb {
2776 min: (bldg_underwater_exit_pos_2 - (bldg_diameter / 10) + 1)
2777 .with_z(base - (4 * (bldg_diameter / 4))),
2778 max: (bldg_underwater_exit_pos_2 + (bldg_diameter / 10) - 1)
2779 .with_z(base - (4 * (bldg_diameter / 4)) + 1),
2780 };
2781 let bldg_connect_clear = Aabb {
2782 min: (bldg_center - (bldg_diameter / 10) + 1)
2783 .with_z(base - (5 * (bldg_diameter / 4)) + 1),
2784 max: (bldg_center + (bldg_diameter / 10) - 1)
2785 .with_z(base - (bldg_diameter / 3) + 2),
2786 };
2787 let bldg_connect_gate = Aabb {
2788 min: (bldg_underwater_exit_pos_2 - 2).with_z(base - (4 * (bldg_diameter / 4)) + 1),
2789 max: (bldg_underwater_exit_pos_2 + 2).with_z(base - (4 * (bldg_diameter / 4)) + 2),
2790 };
2791 let bldg_connect_keyhole = Aabb {
2792 min: (bldg_underwater_exit_pos_2 - 1).with_z(base - (4 * (bldg_diameter / 4)) + 1),
2793 max: (bldg_underwater_exit_pos_2).with_z(base - (4 * (bldg_diameter / 4)) + 2),
2794 };
2795 let bldg_floor_sea_cleric_pos = (bldg_center + (bldg_diameter / 8))
2796 .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 4) + 2);
2797 let bldg_floor3_sea_cleric_pos = (bldg_center + 2).with_z(
2798 base - (bldg_diameter / 15)
2799 + tower_height
2800 + (bldg_diameter / 4)
2801 + (bldg_diameter / 7)
2802 - 6,
2803 );
2804 let bldg_cellar_sea_croc_pos = bldg_center.with_z(base - (5 * (bldg_diameter / 4)) - 5);
2806 for _ in
2807 0..(2 + ((RandomField::new(0).get((bldg_cellar_sea_croc_pos).with_z(base))) % 2))
2808 {
2809 painter.spawn(
2810 EntityInfo::at(bldg_cellar_sea_croc_pos.as_()).with_asset_expect(
2811 "common.entity.wild.aggressive.sea_crocodile",
2812 &mut rng,
2813 None,
2814 ),
2815 )
2816 }
2817 match bldg_variant {
2818 0..=2 => {
2819 painter.sphere(bldg_cellar).fill(white.clone());
2821 painter.sphere(bldg_cellar_clear).clear();
2822 painter.sphere(bldg_room).fill(white.clone());
2823 painter.aabb(bldg_hut_entry_clear1).clear();
2824 painter.aabb(bldg_hut_entry_clear2).clear();
2825 bldg_room_windows_1.fill(window_ver.clone());
2826 bldg_room_windows_2.fill(window_ver.clone());
2827 bldg_washed_top.fill(washed.clone());
2828 bldg_top.fill(top.clone());
2829 painter.sphere(bldg_room_clear).clear();
2830 bldg_room_goldring.fill(gold.clone());
2831 bldg_room_goldring_clear.clear();
2832 painter.cylinder(bldg_room_floor).fill(floor_color.clone());
2833 painter.cylinder(bldg_hut_floors_clear).clear();
2834 painter.cylinder(bldg_hut_ropefix1).fill(ropefix1.clone());
2835 painter.aabb(bldg_hut_ropefix2).fill(ropefix2.clone());
2836 bldg_underwater_tube.fill(white.clone());
2837 bldg_underwater_tube_clear.clear();
2838 bldg_underwater_exit.fill(white.clone());
2839 bldg_underwater_exit_clear.clear();
2840 painter.cylinder(bldg_connect_tube).fill(white.clone());
2841 painter
2842 .cylinder(bldg_connect_tube_gold_ring)
2843 .fill(gold.clone());
2844 painter.cylinder(bldg_connect_clear).clear();
2845 painter
2846 .cylinder(bldg_connect_decor_ring)
2847 .fill(gold_decor.clone());
2848 painter.cylinder(bldg_connect_decor_ring_clear).clear();
2849 painter.cylinder(bldg_connect_step_1).fill(white.clone());
2850 painter.cylinder(bldg_connect_step_1_clear).clear();
2851 painter.cylinder(bldg_connect_step_2).fill(white.clone());
2852 painter.cylinder(bldg_connect_step_2_clear).clear();
2853 painter.cylinder(bldg_connect_step_3).fill(white.clone());
2854 painter.cylinder(bldg_connect_step_3_clear).clear();
2855 painter.aabb(bldg_hut_rope).fill(rope.clone());
2856 painter.sprite(bldg_room_lantern_pos, SpriteKind::SeashellLantern);
2857 painter.sprite(bldg_floor_lantern_pos, SpriteKind::SeashellLantern);
2858 painter.sprite(bldg_cellar_chest_pos, SpriteKind::DungeonChest1);
2859 painter.sprite(bldg_floor_bed_pos, SpriteKind::BedWoodWoodlandHead);
2860 painter.sprite(bldg_floor_drawer_pos, SpriteKind::DrawerWoodWoodlandS);
2861 painter.sprite(bldg_floor_potion_pos, SpriteKind::PotionMinor);
2862 for _ in 0..(1
2864 + ((RandomField::new(0).get((bldg_floor_sea_cleric_pos).with_z(base))) % 2))
2865 {
2866 painter.spawn(
2867 EntityInfo::at(bldg_floor_sea_cleric_pos.as_()).with_asset_expect(
2868 "common.entity.dungeon.sea_chapel.sea_cleric",
2869 &mut rng,
2870 None,
2871 ),
2872 )
2873 }
2874 },
2875 3..=5 => {
2876 painter.sphere(bldg_cellar).fill(white.clone());
2878 painter.sphere(bldg_cellar_clear).clear();
2879 painter.sphere(bldg_room).fill(white.clone());
2880 painter.aabb(bldg_pavillon_entry_clear1).clear();
2881 painter.aabb(bldg_pavillon_entry_clear2).clear();
2882 painter.aabb(bldg_pavillon_entry_clear3).clear();
2883 painter.aabb(bldg_pavillon_entry_clear4).clear();
2884 painter.aabb(bldg_pavillon_entry_clear5).clear();
2885 painter.aabb(bldg_pavillon_entry_clear6).clear();
2886 bldg_washed_top.fill(washed.clone());
2887 bldg_top.fill(top.clone());
2888 painter.sphere(bldg_room_clear).clear();
2889 bldg_room_goldring.fill(gold.clone());
2890 bldg_room_goldring_clear.clear();
2891 painter.cylinder(bldg_hut_floors_clear).clear();
2892 painter.cylinder(bldg_hut_ropefix1).fill(ropefix1.clone());
2893 painter.aabb(bldg_hut_ropefix2).fill(ropefix2.clone());
2894 bldg_underwater_tube.fill(white.clone());
2895 bldg_underwater_tube_clear.clear();
2896 bldg_underwater_exit.fill(white.clone());
2897 bldg_underwater_exit_clear.clear();
2898 painter.cylinder(bldg_connect_tube).fill(white.clone());
2899 painter
2900 .cylinder(bldg_connect_tube_gold_ring)
2901 .fill(gold.clone());
2902 painter.cylinder(bldg_connect_clear).clear();
2903 painter
2904 .cylinder(bldg_connect_decor_ring)
2905 .fill(gold_decor.clone());
2906 painter.cylinder(bldg_connect_decor_ring_clear).clear();
2907 painter.cylinder(bldg_connect_step_1).fill(white.clone());
2908 painter.cylinder(bldg_connect_step_1_clear).clear();
2909 painter.cylinder(bldg_connect_step_2).fill(white.clone());
2910 painter.cylinder(bldg_connect_step_2_clear).clear();
2911 painter.cylinder(bldg_connect_step_3).fill(white.clone());
2912 painter.cylinder(bldg_connect_step_3_clear).clear();
2913 painter.aabb(bldg_hut_rope).fill(rope.clone());
2914 painter.sprite(bldg_room_lantern_pos, SpriteKind::SeashellLantern);
2915 painter.sprite(bldg_cellar_chest_pos, SpriteKind::DungeonChest1);
2916 },
2917 6..=9 => {
2918 painter.sphere(bldg_cellar).fill(white.clone());
2920 painter.sphere(bldg_cellar_clear).clear();
2921 painter.sphere(bldg_room).fill(white.clone());
2922 painter.aabb(bldg_hut_entry_clear1).clear();
2923 painter.aabb(bldg_hut_entry_clear2).clear();
2924 bldg_room_windows_1.fill(window_ver.clone());
2925 bldg_room_windows_2.fill(window_ver.clone());
2926 bldg_washed_top.fill(washed.clone());
2927 bldg_top.fill(top.clone());
2928 painter.sphere(bldg_room2).fill(white.clone());
2929 bldg_room2_windows1.fill(window_ver.clone());
2930 bldg_room2_windows2.fill(window_ver.clone());
2931 bldg_room2_windows3.fill(window_ver2.clone());
2932 bldg_room2_windows4.fill(window_ver2.clone());
2933 bldg_room2_washed_top.fill(washed.clone());
2934 bldg_room2_top.fill(top.clone());
2935 painter.sphere(bldg_room2_clear).clear();
2936 bldg_room2_goldring.fill(gold.clone());
2937 bldg_room2_goldring_clear.clear();
2938 painter.sphere(bldg_room_clear).clear();
2939 bldg_room_goldring.fill(gold.clone());
2940 bldg_room_goldring_clear.clear();
2941 painter.cylinder(bldg_room_floor).fill(floor_color.clone());
2942 painter.cylinder(bldg_room2_floor).fill(floor_color.clone());
2943 bldg_tube.fill(white.clone());
2944 bldg_tube_clear.clear();
2945 painter.aabb(bldg_tube_windows1).fill(window_ver2.clone());
2946 painter.aabb(bldg_tube_windows2).fill(window_ver2.clone());
2947 painter.aabb(bldg_tube_windows3).fill(window_ver.clone());
2948 painter.aabb(bldg_tube_windows4).fill(window_ver.clone());
2949 painter.sphere(bldg_room3).fill(white.clone());
2950 bldg_room3_washed_top.fill(washed.clone());
2951 bldg_room3_top.fill(top.clone());
2952 painter.cylinder(bldg_room3_goldring).fill(gold.clone());
2953 painter.sphere(bldg_room3_clear).clear();
2954 painter.aabb(bldg_room3_entry_clear1).clear();
2955 painter.aabb(bldg_room3_entry_clear2).clear();
2956 painter.aabb(bldg_room3_entry_clear3).clear();
2957 painter.aabb(bldg_room3_entry_clear4).clear();
2958 painter.cylinder(bldg_floor2_wall).fill(white.clone());
2959 painter.cylinder(bldg_tower_floors_clear).clear();
2960 bldg_room3_floor.fill(floor_color.clone());
2961 bldg_room3_floor_clear.clear();
2962 painter.cylinder(bldg_tower_ropefix1).fill(ropefix1.clone());
2963 painter.aabb(bldg_tower_ropefix2).fill(ropefix2.clone());
2964 bldg_gold_top_antlers2.fill(gold.clone());
2965 bldg_gold_top_antlers2_clear.clear();
2966 bldg_gold_top_antlers4.fill(gold.clone());
2967 bldg_gold_top_antlers4_clear.clear();
2968 bldg_gold_top_antlers5.fill(gold.clone());
2969 bldg_gold_top_antlers5_clear.clear();
2970 painter.sphere(bldg_gold_top1).fill(gold.clone());
2971 painter.aabb(bldg_gold_top_pole).fill(gold.clone());
2972 painter.aabb(bldg_gold_top_antlers1).fill(gold.clone());
2973 painter.aabb(bldg_gold_top_antlers3).fill(gold.clone());
2974 bldg_underwater_tube.fill(white.clone());
2975 bldg_underwater_tube_clear.clear();
2976 bldg_underwater_exit.fill(white.clone());
2977 bldg_underwater_exit_clear.clear();
2978 painter.cylinder(bldg_connect_tube).fill(white.clone());
2979 painter
2980 .cylinder(bldg_connect_tube_gold_ring)
2981 .fill(gold.clone());
2982 painter.cylinder(bldg_connect_clear).clear();
2983 painter
2984 .cylinder(bldg_connect_decor_ring)
2985 .fill(gold_decor.clone());
2986 painter.cylinder(bldg_connect_decor_ring_clear).clear();
2987 painter.cylinder(bldg_connect_step_1).fill(white.clone());
2988 painter.cylinder(bldg_connect_step_1_clear).clear();
2989 painter.cylinder(bldg_connect_step_2).fill(white.clone());
2990 painter.cylinder(bldg_connect_step_2_clear).clear();
2991 painter.cylinder(bldg_connect_step_3).fill(white.clone());
2992 painter.cylinder(bldg_connect_step_3_clear).clear();
2993 painter.aabb(bldg_tower_rope).fill(rope.clone());
2994 painter.sprite(bldg_room_lantern_pos, SpriteKind::SeashellLantern);
2995 painter.sprite(bldg_floor_lantern_pos, SpriteKind::SeashellLantern);
2996 painter.sprite(bldg_floor2_lantern_pos, SpriteKind::SeashellLantern);
2997 painter.sprite(bldg_floor3_lantern_pos, SpriteKind::SeashellLantern);
2998 painter.sprite(bldg_floor3_drawer_pos, SpriteKind::DrawerWoodWoodlandS);
2999 painter.sprite(bldg_floor3_potion_pos, SpriteKind::PotionMinor);
3000 painter.sprite(bldg_cellar_chest_pos, SpriteKind::DungeonChest1);
3001 painter.sprite(bldg_floor_bed_pos, SpriteKind::BedWoodWoodlandHead);
3002 painter.sprite(bldg_floor_drawer_pos, SpriteKind::DrawerWoodWoodlandS);
3003 painter.sprite(bldg_floor_potion_pos, SpriteKind::PotionMinor);
3004 for _ in 0..(1
3006 + ((RandomField::new(0).get((bldg_floor_sea_cleric_pos).with_z(base))) % 2))
3007 {
3008 painter.spawn(
3009 EntityInfo::at(bldg_floor_sea_cleric_pos.as_()).with_asset_expect(
3010 "common.entity.dungeon.sea_chapel.sea_cleric",
3011 &mut rng,
3012 None,
3013 ),
3014 )
3015 }
3016 for _ in 0..(1
3018 + ((RandomField::new(0).get((bldg_floor3_sea_cleric_pos).with_z(base)))
3019 % 2))
3020 {
3021 painter.spawn(
3022 EntityInfo::at(bldg_floor3_sea_cleric_pos.as_()).with_asset_expect(
3023 "common.entity.dungeon.sea_chapel.sea_cleric",
3024 &mut rng,
3025 None,
3026 ),
3027 )
3028 }
3029 },
3030 _ => {},
3031 };
3032 let connect_gate_type = connect_gate_types.swap_remove(
3033 RandomField::new(0).get((center + dir).with_z(base)) as usize
3034 % connect_gate_types.len(),
3035 );
3036 painter
3037 .cylinder(bldg_connect_gate)
3038 .fill(Fill::Block(Block::air(connect_gate_type)));
3039 if connect_gate_type == SpriteKind::GlassBarrier {
3040 painter
3041 .cylinder(bldg_connect_keyhole)
3042 .fill(glass_keyhole.clone());
3043 };
3044 }
3045 for dir in NEIGHBORS {
3047 let su_bldg_variant =
3048 ((RandomField::new(0).get((center - dir).with_z(base))) % 10) as i32;
3049 let su_bldg_center = center + dir * (diameter + (3 * su_bldg_variant));
3050 let su_bldg_base = base - 2 + (su_bldg_variant / 2);
3051 let su_bldg_diameter = diameter;
3052
3053 let foundling_bottom1 = Aabb {
3054 min: (su_bldg_center - (su_bldg_diameter / 8) - 3)
3055 .with_z(su_bldg_base - (su_bldg_diameter / 5) - (su_bldg_diameter / 2)),
3056 max: (su_bldg_center + (su_bldg_diameter / 8) + 3)
3057 .with_z(su_bldg_base - (su_bldg_diameter / 5) - (su_bldg_diameter / 4) + 6),
3058 };
3059 let foundling_bottom2 = Aabb {
3060 min: (su_bldg_center - (su_bldg_diameter / 8) - 1)
3061 .with_z(su_bldg_base - (su_bldg_diameter / 5) - (su_bldg_diameter / 4) + 2),
3062 max: (su_bldg_center + (su_bldg_diameter / 8) + 1)
3063 .with_z(su_bldg_base - (su_bldg_diameter / 5) + 2),
3064 };
3065 let foundling_top = Aabb {
3066 min: (su_bldg_center - (su_bldg_diameter / 8))
3067 .with_z(su_bldg_base - (su_bldg_diameter / 5) - 1),
3068 max: (su_bldg_center + (su_bldg_diameter / 8))
3069 .with_z(su_bldg_base - (su_bldg_diameter / 5) + (su_bldg_diameter / 4) - 1),
3070 };
3071 let su_bldg_bottom1 = Aabb {
3072 min: (su_bldg_center - (su_bldg_diameter / 6) - 1)
3073 .with_z(su_bldg_base - (2 * (su_bldg_diameter / 3)) + 1),
3074 max: (su_bldg_center + (su_bldg_diameter / 6) + 1)
3075 .with_z(su_bldg_base - (su_bldg_diameter / 3) + 1),
3076 };
3077 let su_bldg_bottom2 = Aabb {
3078 min: (su_bldg_center - (su_bldg_diameter / 6))
3079 .with_z(su_bldg_base - (su_bldg_diameter / 3)),
3080 max: (su_bldg_center + (su_bldg_diameter / 6))
3081 .with_z(su_bldg_base - (su_bldg_diameter / 3) + (su_bldg_diameter / 3)),
3082 };
3083 let su_bldg_room = Aabb {
3084 min: (su_bldg_center - (su_bldg_diameter / 6))
3085 .with_z(su_bldg_base - (su_bldg_diameter / 15)),
3086 max: (su_bldg_center + (su_bldg_diameter / 6))
3087 .with_z(su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 3)),
3088 };
3089 let su_bldg_hut_entries1 = Aabb {
3090 min: Vec3::new(
3091 su_bldg_center.x - (su_bldg_diameter / 6) - 2,
3092 su_bldg_center.y - 2,
3093 su_bldg_base + (su_bldg_diameter / 15) - 2,
3094 ),
3095 max: Vec3::new(
3096 su_bldg_center.x + (su_bldg_diameter / 6) + 2,
3097 su_bldg_center.y + 2,
3098 su_bldg_base + (su_bldg_diameter / 15) + 1,
3099 ),
3100 };
3101 let su_bldg_hut_entries2 = Aabb {
3102 min: Vec3::new(
3103 su_bldg_center.x - (su_bldg_diameter / 6) - 2,
3104 su_bldg_center.y - 1,
3105 su_bldg_base + (su_bldg_diameter / 15) + 1,
3106 ),
3107 max: Vec3::new(
3108 su_bldg_center.x + (su_bldg_diameter / 6) + 2,
3109 su_bldg_center.y + 1,
3110 su_bldg_base + (su_bldg_diameter / 15) + 2,
3111 ),
3112 };
3113 let su_bldg_top_half = painter.aabb(Aabb {
3114 min: (su_bldg_center - (su_bldg_diameter / 6))
3115 .with_z(su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 6)),
3116 max: (su_bldg_center + (su_bldg_diameter / 6))
3117 .with_z(su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 3)),
3118 });
3119 let su_bldg_washed_top = painter
3120 .sphere(Aabb {
3121 min: (su_bldg_center - (su_bldg_diameter / 6))
3122 .with_z(su_bldg_base - (su_bldg_diameter / 15)),
3123 max: (su_bldg_center + (su_bldg_diameter / 6))
3124 .with_z(su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 3)),
3125 })
3126 .intersect(su_bldg_top_half);
3127 let su_bldg_top = painter
3128 .sphere(Aabb {
3129 min: (su_bldg_center - (su_bldg_diameter / 6) + 1)
3130 .with_z(su_bldg_base - (su_bldg_diameter / 15) + 1),
3131 max: (su_bldg_center + (su_bldg_diameter / 6))
3132 .with_z(su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 3)),
3133 })
3134 .intersect(su_bldg_top_half);
3135 let su_bldg_goldring = Aabb {
3136 min: (su_bldg_center - (su_bldg_diameter / 6))
3137 .with_z(su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 6) + 1),
3138 max: (su_bldg_center + (su_bldg_diameter / 6))
3139 .with_z(su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 6) + 2),
3140 };
3141 let su_bldg_room_clear = Aabb {
3142 min: (su_bldg_center - (su_bldg_diameter / 6) + 1)
3143 .with_z(su_bldg_base - (su_bldg_diameter / 15) + 1),
3144 max: (su_bldg_center + (su_bldg_diameter / 6) - 1)
3145 .with_z(su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 3) - 1),
3146 };
3147 let su_bldg_floor = Aabb {
3148 min: (su_bldg_center - (su_bldg_diameter / 6) + 1)
3149 .with_z(su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 6) + 1),
3150 max: (su_bldg_center + (su_bldg_diameter / 6) - 1)
3151 .with_z(su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 6) + 2),
3152 };
3153 let su_bldg_room_lantern_pos =
3154 (su_bldg_center + 2).with_z(su_bldg_base - (su_bldg_diameter / 15) + 2);
3155 let su_bldg_floor_lantern_pos = (su_bldg_center + 2)
3156 .with_z(su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 6) + 2);
3157 let su_bldg_floor_drawer_pos = (su_bldg_center - (su_bldg_diameter / 10))
3158 .with_z(su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 6) + 2);
3159 let su_bldg_floor_potion_pos = (su_bldg_center - (su_bldg_diameter / 10))
3160 .with_z(su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 6) + 3);
3161 let su_bldg_floor_bed_pos = Vec3::new(
3162 su_bldg_center.x - (su_bldg_diameter / 8),
3163 su_bldg_center.y,
3164 su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 6) + 2,
3165 );
3166 let su_bldg_floor_entry = Aabb {
3167 min: (su_bldg_center - 3)
3168 .with_z(su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 6) + 1),
3169 max: (su_bldg_center + 3)
3170 .with_z(su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 6) + 2),
3171 };
3172 let su_bldg_ropefix1 = Aabb {
3173 min: (su_bldg_center - 2)
3174 .with_z(su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 3) - 3),
3175 max: (su_bldg_center + 2)
3176 .with_z(su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 3) - 2),
3177 };
3178 let su_bldg_ropefix2 = Aabb {
3179 min: (su_bldg_center)
3180 .with_z(su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 3) - 4),
3181 max: (su_bldg_center + 1)
3182 .with_z(su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 3) - 3),
3183 };
3184 let su_bldg_rope = Aabb {
3185 min: (su_bldg_center).with_z(su_bldg_base - (su_bldg_diameter / 15) + 3),
3186 max: (su_bldg_center + 1)
3187 .with_z(su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 3) - 4),
3188 };
3189 let su_bldg_pavillon_entries1 = Aabb {
3190 min: Vec3::new(
3191 su_bldg_center.x - (su_bldg_diameter / 6),
3192 su_bldg_center.y - 4,
3193 su_bldg_base + (su_bldg_diameter / 15) - 2,
3194 ),
3195 max: Vec3::new(
3196 su_bldg_center.x + (su_bldg_diameter / 6),
3197 su_bldg_center.y + 4,
3198 su_bldg_base + (su_bldg_diameter / 15),
3199 ),
3200 };
3201 let su_bldg_pavillon_entries2 = Aabb {
3202 min: Vec3::new(
3203 su_bldg_center.x - (su_bldg_diameter / 6),
3204 su_bldg_center.y - 3,
3205 su_bldg_base + (su_bldg_diameter / 15),
3206 ),
3207 max: Vec3::new(
3208 su_bldg_center.x + (su_bldg_diameter / 6),
3209 su_bldg_center.y + 3,
3210 su_bldg_base + (su_bldg_diameter / 15) + 1,
3211 ),
3212 };
3213 let su_bldg_pavillon_entries3 = Aabb {
3214 min: Vec3::new(
3215 su_bldg_center.x - (su_bldg_diameter / 6),
3216 su_bldg_center.y - 2,
3217 su_bldg_base + (su_bldg_diameter / 15) + 1,
3218 ),
3219 max: Vec3::new(
3220 su_bldg_center.x + (su_bldg_diameter / 6),
3221 su_bldg_center.y + 2,
3222 su_bldg_base + (su_bldg_diameter / 15) + 2,
3223 ),
3224 };
3225 let su_bldg_pavillon_entries4 = Aabb {
3226 min: Vec3::new(
3227 su_bldg_center.x - 4,
3228 su_bldg_center.y - (su_bldg_diameter / 6),
3229 su_bldg_base + (su_bldg_diameter / 15) - 2,
3230 ),
3231 max: Vec3::new(
3232 su_bldg_center.x + 4,
3233 su_bldg_center.y + (su_bldg_diameter / 6),
3234 su_bldg_base + (su_bldg_diameter / 15),
3235 ),
3236 };
3237 let su_bldg_pavillon_entries5 = Aabb {
3238 min: Vec3::new(
3239 su_bldg_center.x - 3,
3240 su_bldg_center.y - (su_bldg_diameter / 6),
3241 su_bldg_base + (su_bldg_diameter / 15),
3242 ),
3243 max: Vec3::new(
3244 su_bldg_center.x + 3,
3245 su_bldg_center.y + (su_bldg_diameter / 6),
3246 su_bldg_base + (su_bldg_diameter / 15) + 1,
3247 ),
3248 };
3249 let su_bldg_pavillon_entries6 = Aabb {
3250 min: Vec3::new(
3251 su_bldg_center.x - 2,
3252 su_bldg_center.y - (su_bldg_diameter / 6),
3253 su_bldg_base + (su_bldg_diameter / 15) + 1,
3254 ),
3255 max: Vec3::new(
3256 su_bldg_center.x + 2,
3257 su_bldg_center.y + (su_bldg_diameter / 6),
3258 su_bldg_base + (su_bldg_diameter / 15) + 2,
3259 ),
3260 };
3261 let su_bldg_pavillon_entries7 = Aabb {
3262 min: Vec3::new(
3263 su_bldg_center.x - 4,
3264 su_bldg_center.y,
3265 su_bldg_base + (su_bldg_diameter / 15) - 2,
3266 ),
3267 max: Vec3::new(
3268 su_bldg_center.x + 4,
3269 su_bldg_center.y + (su_bldg_diameter / 6),
3270 su_bldg_base + (su_bldg_diameter / 15),
3271 ),
3272 };
3273 let su_bldg_pavillon_entries8 = Aabb {
3274 min: Vec3::new(
3275 su_bldg_center.x - 2,
3276 su_bldg_center.y,
3277 su_bldg_base + (su_bldg_diameter / 15) + 1,
3278 ),
3279 max: Vec3::new(
3280 su_bldg_center.x + 2,
3281 su_bldg_center.y + (su_bldg_diameter / 6),
3282 su_bldg_base + (su_bldg_diameter / 15) + 2,
3283 ),
3284 };
3285 let su_bldg_pavillon_barriers_1 = Aabb {
3286 min: Vec3::new(
3287 su_bldg_center.x - 3,
3288 su_bldg_center.y + (su_bldg_diameter / 6) - 3,
3289 su_bldg_base + (su_bldg_diameter / 15),
3290 ),
3291 max: Vec3::new(
3292 su_bldg_center.x + 3,
3293 su_bldg_center.y + (su_bldg_diameter / 6) - 2,
3294 su_bldg_base + (su_bldg_diameter / 15) + 1,
3295 ),
3296 };
3297 let su_bldg_pavillon_barriers_2 = Aabb {
3298 min: Vec3::new(
3299 su_bldg_center.x - 4,
3300 su_bldg_center.y + (su_bldg_diameter / 6) - 3,
3301 su_bldg_base + (su_bldg_diameter / 15) - 1,
3302 ),
3303 max: Vec3::new(
3304 su_bldg_center.x + 4,
3305 su_bldg_center.y + (su_bldg_diameter / 6) - 2,
3306 su_bldg_base + (su_bldg_diameter / 15),
3307 ),
3308 };
3309 let su_bldg_pavillon_barriers_keyhole = Aabb {
3310 min: Vec3::new(
3311 su_bldg_center.x - 1,
3312 su_bldg_center.y + (su_bldg_diameter / 6) - 3,
3313 su_bldg_base + (su_bldg_diameter / 15) - 2,
3314 ),
3315 max: Vec3::new(
3316 su_bldg_center.x,
3317 su_bldg_center.y + (su_bldg_diameter / 6) - 2,
3318 su_bldg_base + (su_bldg_diameter / 15) - 1,
3319 ),
3320 };
3321 match su_bldg_variant {
3322 0..=5 => {
3323 painter.sphere(su_bldg_bottom1).fill(white.clone());
3325 painter.sphere(su_bldg_bottom2).fill(white.clone());
3326 painter.sphere(su_bldg_room).fill(white.clone());
3327 su_bldg_washed_top.fill(washed.clone());
3328 su_bldg_top.fill(top.clone());
3329 painter.cylinder(su_bldg_goldring).fill(gold.clone());
3330 painter.sphere(su_bldg_room_clear).clear();
3331 painter.sprite(su_bldg_room_lantern_pos, SpriteKind::SeashellLantern);
3332 match su_bldg_variant {
3333 0..=3 => {
3334 painter.aabb(su_bldg_hut_entries1).clear();
3336 painter.aabb(su_bldg_hut_entries2).clear();
3337 painter.cylinder(su_bldg_floor).fill(white.clone());
3338 painter.cylinder(su_bldg_floor_entry).clear();
3339 painter.aabb(su_bldg_ropefix1).fill(ropefix1.clone());
3340 painter.aabb(su_bldg_ropefix2).fill(ropefix2.clone());
3341 painter.aabb(su_bldg_rope).fill(rope.clone());
3342 painter.sprite(su_bldg_floor_lantern_pos, SpriteKind::SeashellLantern);
3343 painter
3344 .sprite(su_bldg_floor_drawer_pos, SpriteKind::DrawerWoodWoodlandS);
3345 painter.sprite(su_bldg_floor_potion_pos, SpriteKind::PotionMinor);
3346 painter.sprite(su_bldg_floor_bed_pos, SpriteKind::BedWoodWoodlandHead);
3347 },
3348 _ => {
3349 if su_bldg_variant > 4 {
3351 painter.aabb(su_bldg_pavillon_entries2).clear();
3352 painter.aabb(su_bldg_pavillon_entries7).clear();
3353 painter.aabb(su_bldg_pavillon_entries5).clear();
3354 painter.aabb(su_bldg_pavillon_entries8).clear();
3355 painter
3356 .aabb(su_bldg_pavillon_barriers_1)
3357 .fill(glass_barrier.clone());
3358 painter
3359 .aabb(su_bldg_pavillon_barriers_2)
3360 .fill(glass_barrier.clone());
3361 painter
3362 .aabb(su_bldg_pavillon_barriers_keyhole)
3363 .fill(glass_keyhole.clone());
3364 let prisoner_pos = su_bldg_center.with_z(base + 2);
3365 for _ in 0..(6
3366 + ((RandomField::new(0).get((prisoner_pos).with_z(base))) % 6))
3367 {
3368 painter.spawn(
3369 EntityInfo::at(prisoner_pos.as_()).with_asset_expect(
3370 "common.entity.dungeon.sea_chapel.prisoner",
3371 &mut rng,
3372 None,
3373 ),
3374 )
3375 }
3376 } else {
3377 painter.aabb(su_bldg_pavillon_entries1).clear();
3378 painter.aabb(su_bldg_pavillon_entries2).clear();
3379 painter.aabb(su_bldg_pavillon_entries3).clear();
3380 painter.aabb(su_bldg_pavillon_entries4).clear();
3381 painter.aabb(su_bldg_pavillon_entries5).clear();
3382 painter.aabb(su_bldg_pavillon_entries6).clear();
3383 };
3384 },
3385 }
3386 },
3387 6..=7 => {
3388 painter.sphere(foundling_bottom1).fill(white.clone());
3390 painter.sphere(foundling_bottom2).fill(white.clone());
3391 painter.sphere(foundling_top).fill(white.clone());
3392 },
3393 _ => {},
3394 };
3395 }
3396 }
3397}