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