mirror of
https://gitlab.com/veloren/veloren.git
synced 2024-08-30 18:12:32 +00:00
root walls, minor tweaks
This commit is contained in:
@ -34,7 +34,7 @@ struct Tunnels {
|
|||||||
|
|
||||||
enum GnarlingStructure {
|
enum GnarlingStructure {
|
||||||
Hut,
|
Hut,
|
||||||
Longhut,
|
VeloriteHut,
|
||||||
Totem,
|
Totem,
|
||||||
ChieftainHut,
|
ChieftainHut,
|
||||||
WatchTower,
|
WatchTower,
|
||||||
@ -45,7 +45,7 @@ impl GnarlingStructure {
|
|||||||
fn required_separation(&self, other: &Self) -> i32 {
|
fn required_separation(&self, other: &Self) -> i32 {
|
||||||
match (self, other) {
|
match (self, other) {
|
||||||
(Self::Hut, Self::Hut) => 13,
|
(Self::Hut, Self::Hut) => 13,
|
||||||
(_, Self::Longhut) | (Self::Longhut, _) => 25,
|
(_, Self::VeloriteHut) | (Self::VeloriteHut, _) => 25,
|
||||||
(_, Self::Banner) | (Self::Banner, _) => 15,
|
(_, Self::Banner) | (Self::Banner, _) => 15,
|
||||||
|
|
||||||
(Self::Hut, Self::Totem) | (Self::Totem, Self::Hut) => 20,
|
(Self::Hut, Self::Totem) | (Self::Totem, Self::Hut) => 20,
|
||||||
@ -179,7 +179,7 @@ impl GnarlingFortification {
|
|||||||
// Choose structure kind
|
// Choose structure kind
|
||||||
let structure_kind = match rng.gen_range(0..10) {
|
let structure_kind = match rng.gen_range(0..10) {
|
||||||
0 => GnarlingStructure::Totem,
|
0 => GnarlingStructure::Totem,
|
||||||
1..=3 => GnarlingStructure::Longhut,
|
1..=3 => GnarlingStructure::VeloriteHut,
|
||||||
4..=5 => GnarlingStructure::Banner,
|
4..=5 => GnarlingStructure::Banner,
|
||||||
_ => GnarlingStructure::Hut,
|
_ => GnarlingStructure::Hut,
|
||||||
};
|
};
|
||||||
@ -378,7 +378,7 @@ impl GnarlingFortification {
|
|||||||
GnarlingStructure::Hut => {
|
GnarlingStructure::Hut => {
|
||||||
supplement.add_entity(random_gnarling(wpos, dynamic_rng));
|
supplement.add_entity(random_gnarling(wpos, dynamic_rng));
|
||||||
},
|
},
|
||||||
GnarlingStructure::Longhut => {
|
GnarlingStructure::VeloriteHut => {
|
||||||
supplement.add_entity(random_gnarling(wpos, dynamic_rng));
|
supplement.add_entity(random_gnarling(wpos, dynamic_rng));
|
||||||
},
|
},
|
||||||
GnarlingStructure::Banner => {
|
GnarlingStructure::Banner => {
|
||||||
@ -431,7 +431,7 @@ impl Structure for GnarlingFortification {
|
|||||||
for (point, next_point) in self.wall_segments.iter() {
|
for (point, next_point) in self.wall_segments.iter() {
|
||||||
// This adds additional points for the wall on the line between two points,
|
// This adds additional points for the wall on the line between two points,
|
||||||
// allowing the wall to better handle slopes
|
// allowing the wall to better handle slopes
|
||||||
const SECTIONS_PER_WALL_SEGMENT: usize = 3;
|
const SECTIONS_PER_WALL_SEGMENT: usize = 8;
|
||||||
|
|
||||||
(0..(SECTIONS_PER_WALL_SEGMENT as i32))
|
(0..(SECTIONS_PER_WALL_SEGMENT as i32))
|
||||||
.into_iter()
|
.into_iter()
|
||||||
@ -446,90 +446,73 @@ impl Structure for GnarlingFortification {
|
|||||||
let start_wpos = point + self.origin;
|
let start_wpos = point + self.origin;
|
||||||
let end_wpos = next_point + self.origin;
|
let end_wpos = next_point + self.origin;
|
||||||
|
|
||||||
// Wall base
|
|
||||||
let wall_depth = 3.0;
|
|
||||||
let start = start_wpos
|
|
||||||
.as_()
|
|
||||||
.with_z(land.get_alt_approx(start_wpos) - wall_depth);
|
|
||||||
let end = end_wpos
|
|
||||||
.as_()
|
|
||||||
.with_z(land.get_alt_approx(end_wpos) - wall_depth);
|
|
||||||
|
|
||||||
let wall_base_thickness = 3.0;
|
|
||||||
let wall_base_height = 3.0;
|
|
||||||
let darkwood = Fill::Brick(BlockKind::Wood, Rgb::new(55, 25, 8), 12);
|
let darkwood = Fill::Brick(BlockKind::Wood, Rgb::new(55, 25, 8), 12);
|
||||||
let lightwood = Fill::Brick(BlockKind::Wood, Rgb::new(115, 58, 26), 12);
|
let lightwood = Fill::Brick(BlockKind::Wood, Rgb::new(71, 33, 11), 12);
|
||||||
|
let moss = Fill::Brick(BlockKind::Wood, Rgb::new(22, 36, 20), 24);
|
||||||
|
|
||||||
painter
|
let start = (start_wpos + 2)
|
||||||
.segment_prism(
|
.as_()
|
||||||
start,
|
.with_z(land.get_alt_approx(start_wpos) + 0.0);
|
||||||
end,
|
let end = (end_wpos + 2)
|
||||||
wall_base_thickness,
|
.as_()
|
||||||
wall_base_height + wall_depth as f32,
|
.with_z(land.get_alt_approx(end_wpos) + 0.0);
|
||||||
)
|
let randstart = start % 10.0 - 5.;
|
||||||
.fill(darkwood.clone());
|
let randend = end % 10.0 - 5.0;
|
||||||
|
let mid = (start + end) / 2.0;
|
||||||
|
let startshift = Vec3::new(
|
||||||
|
randstart.x * 5.0,
|
||||||
|
randstart.y * 5.0,
|
||||||
|
randstart.z * 1.0 + 5.0,
|
||||||
|
);
|
||||||
|
let endshift =
|
||||||
|
Vec3::new(randend.x * 5.0, randend.y * 5.0, randend.z * 1.0 + 5.0);
|
||||||
|
|
||||||
// Middle of wall
|
let mossroot =
|
||||||
let start = start_wpos.as_().with_z(land.get_alt_approx(start_wpos));
|
painter.cubic_bezier(start, mid + startshift, mid + endshift, end, 3.0);
|
||||||
let end = end_wpos.as_().with_z(land.get_alt_approx(end_wpos));
|
|
||||||
|
|
||||||
let wall_mid_thickness = 1.0;
|
|
||||||
let wall_mid_height = 5.0 + wall_base_height;
|
|
||||||
|
|
||||||
painter
|
|
||||||
.segment_prism(start, end, wall_mid_thickness, wall_mid_height)
|
|
||||||
.fill(lightwood);
|
|
||||||
|
|
||||||
// Top of wall
|
|
||||||
let start = start_wpos
|
let start = start_wpos
|
||||||
.as_()
|
.as_()
|
||||||
.with_z(land.get_alt_approx(start_wpos) + wall_mid_height);
|
.with_z(land.get_alt_approx(start_wpos) - 2.0);
|
||||||
let end = end_wpos
|
let end = end_wpos.as_().with_z(land.get_alt_approx(end_wpos) - 2.0);
|
||||||
|
let randstart = start % 10.0 - 5.;
|
||||||
|
let randend = end % 10.0 - 5.0;
|
||||||
|
let mid = (start + end) / 2.0;
|
||||||
|
let startshift =
|
||||||
|
Vec3::new(randstart.x * 2.0, randstart.y * 2.0, randstart.z * 0.5);
|
||||||
|
let endshift = Vec3::new(randend.x * 2.0, randend.y * 2.0, randend.z * 0.5);
|
||||||
|
|
||||||
|
let root1 =
|
||||||
|
painter.cubic_bezier(start, mid + startshift, mid + endshift, end, 5.0);
|
||||||
|
|
||||||
|
let mosstop1 = root1.translate(Vec3::new(0, 0, 1));
|
||||||
|
|
||||||
|
root1.fill(darkwood.clone());
|
||||||
|
|
||||||
|
let start = (start_wpos + 3)
|
||||||
.as_()
|
.as_()
|
||||||
.with_z(land.get_alt_approx(end_wpos) + wall_mid_height);
|
.with_z(land.get_alt_approx(start_wpos) + 0.0);
|
||||||
|
let end = (end_wpos + 3)
|
||||||
let wall_top_thickness = 2.0;
|
.as_()
|
||||||
let wall_top_height = 1.0;
|
.with_z(land.get_alt_approx(end_wpos) + 0.0);
|
||||||
|
let randstart = start % 10.0 - 5.;
|
||||||
painter
|
let randend = end % 10.0 - 5.0;
|
||||||
.segment_prism(start, end, wall_top_thickness, wall_top_height)
|
let mid = (start + end) / 2.0;
|
||||||
.fill(darkwood.clone());
|
let startshift = Vec3::new(
|
||||||
|
randstart.x * 3.0,
|
||||||
// Wall parapets
|
randstart.y * 3.0,
|
||||||
let parapet_z_offset = 1.0;
|
randstart.z * 2.0 + 5.0,
|
||||||
|
|
||||||
let start = Vec3::new(
|
|
||||||
point.x as f32 * (self.wall_radius as f32 + 1.0)
|
|
||||||
/ (self.wall_radius as f32)
|
|
||||||
+ self.origin.x as f32,
|
|
||||||
point.y as f32 * (self.wall_radius as f32 + 1.0)
|
|
||||||
/ (self.wall_radius as f32)
|
|
||||||
+ self.origin.y as f32,
|
|
||||||
land.get_alt_approx(start_wpos) + wall_mid_height + wall_top_height
|
|
||||||
- parapet_z_offset,
|
|
||||||
);
|
|
||||||
let end = Vec3::new(
|
|
||||||
next_point.x as f32 * (self.wall_radius as f32 + 1.0)
|
|
||||||
/ (self.wall_radius as f32)
|
|
||||||
+ self.origin.x as f32,
|
|
||||||
next_point.y as f32 * (self.wall_radius as f32 + 1.0)
|
|
||||||
/ (self.wall_radius as f32)
|
|
||||||
+ self.origin.y as f32,
|
|
||||||
land.get_alt_approx(end_wpos) + wall_mid_height + wall_top_height
|
|
||||||
- parapet_z_offset,
|
|
||||||
);
|
);
|
||||||
|
let endshift =
|
||||||
|
Vec3::new(randend.x * 3.0, randend.y * 3.0, randend.z * 2.0 + 5.0);
|
||||||
|
let root2 =
|
||||||
|
painter.cubic_bezier(start, mid + startshift, mid + endshift, end, 2.0);
|
||||||
|
|
||||||
let wall_par_thickness = tweak!(0.8);
|
let mosstop2 = root2.translate(Vec3::new(0, 0, 1));
|
||||||
let wall_par_height = 1.0;
|
|
||||||
|
|
||||||
painter
|
root2.fill(lightwood.clone());
|
||||||
.segment_prism(
|
|
||||||
start,
|
mosstop1.intersect(mossroot).fill(moss.clone());
|
||||||
end,
|
mosstop2.intersect(mossroot).fill(moss.clone());
|
||||||
wall_par_thickness,
|
|
||||||
wall_par_height + parapet_z_offset as f32,
|
|
||||||
)
|
|
||||||
.fill(darkwood);
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -548,10 +531,26 @@ impl Structure for GnarlingFortification {
|
|||||||
let randz = (land.get_alt_approx(wpos) as i32).abs() % 10;
|
let randz = (land.get_alt_approx(wpos) as i32).abs() % 10;
|
||||||
//layers of rings, starting at exterior
|
//layers of rings, starting at exterior
|
||||||
let darkwood = Fill::Brick(BlockKind::Wood, Rgb::new(55, 25, 8), 12);
|
let darkwood = Fill::Brick(BlockKind::Wood, Rgb::new(55, 25, 8), 12);
|
||||||
let midwood = Fill::Brick(BlockKind::Wood, Rgb::new(71, 33, 11), 12);
|
let lightwood = Fill::Brick(BlockKind::Wood, Rgb::new(71, 33, 11), 12);
|
||||||
let moss = Fill::Brick(BlockKind::Wood, Rgb::new(22, 36, 20), 24);
|
let moss = Fill::Brick(BlockKind::Wood, Rgb::new(22, 36, 20), 24);
|
||||||
let red = Fill::Brick(BlockKind::Wood, Rgb::new(102, 31, 2), 12);
|
let red = Fill::Brick(BlockKind::Wood, Rgb::new(102, 31, 2), 12);
|
||||||
|
|
||||||
|
let twist = painter.cubic_bezier(
|
||||||
|
tower_base_pos + Vec3::new(4, 4, 8),
|
||||||
|
tower_base_pos + Vec3::new(-9, 9, 14),
|
||||||
|
tower_base_pos + Vec3::new(-11, -11, 16),
|
||||||
|
tower_base_pos + Vec3::new(4, -4, 21),
|
||||||
|
1.5,
|
||||||
|
);
|
||||||
|
let mosstwist = twist.translate(Vec3::new(0, 0, 1));
|
||||||
|
let mossarea = twist.translate(Vec3::new(1, 0, 1));
|
||||||
|
|
||||||
|
mossarea
|
||||||
|
.intersect(mosstwist)
|
||||||
|
.without(twist)
|
||||||
|
.fill(moss.clone());
|
||||||
|
twist.fill(darkwood.clone());
|
||||||
|
|
||||||
let outside = painter
|
let outside = painter
|
||||||
.prim(Primitive::cylinder(
|
.prim(Primitive::cylinder(
|
||||||
wpos.with_z(land.get_alt_approx(wpos) as i32),
|
wpos.with_z(land.get_alt_approx(wpos) as i32),
|
||||||
@ -563,7 +562,7 @@ impl Structure for GnarlingFortification {
|
|||||||
tower_radius - 1.0,
|
tower_radius - 1.0,
|
||||||
tower_height,
|
tower_height,
|
||||||
)));
|
)));
|
||||||
outside.fill(midwood.clone());
|
outside.fill(lightwood.clone());
|
||||||
painter
|
painter
|
||||||
.prim(Primitive::cylinder(
|
.prim(Primitive::cylinder(
|
||||||
wpos.with_z(land.get_alt_approx(wpos) as i32),
|
wpos.with_z(land.get_alt_approx(wpos) as i32),
|
||||||
@ -577,7 +576,7 @@ impl Structure for GnarlingFortification {
|
|||||||
tower_radius - 2.0,
|
tower_radius - 2.0,
|
||||||
tower_height,
|
tower_height,
|
||||||
))
|
))
|
||||||
.fill(midwood.clone());
|
.fill(lightwood.clone());
|
||||||
painter
|
painter
|
||||||
.prim(Primitive::cylinder(
|
.prim(Primitive::cylinder(
|
||||||
wpos.with_z(land.get_alt_approx(wpos) as i32),
|
wpos.with_z(land.get_alt_approx(wpos) as i32),
|
||||||
@ -591,7 +590,7 @@ impl Structure for GnarlingFortification {
|
|||||||
tower_radius - 4.0,
|
tower_radius - 4.0,
|
||||||
tower_height,
|
tower_height,
|
||||||
))
|
))
|
||||||
.fill(midwood);
|
.fill(lightwood.clone());
|
||||||
//top layer, green above the tower
|
//top layer, green above the tower
|
||||||
painter
|
painter
|
||||||
.prim(Primitive::cylinder(
|
.prim(Primitive::cylinder(
|
||||||
@ -728,10 +727,10 @@ impl Structure for GnarlingFortification {
|
|||||||
let randx = wpos.x.abs() % 10;
|
let randx = wpos.x.abs() % 10;
|
||||||
let randy = wpos.y.abs() % 10;
|
let randy = wpos.y.abs() % 10;
|
||||||
let randz = alt.abs() % 10;
|
let randz = alt.abs() % 10;
|
||||||
let hut_wall_height = hut_wall_height + randy as f32 / 3.0;
|
let hut_wall_height = hut_wall_height + randy as f32 * 1.5;
|
||||||
|
|
||||||
let darkwood = Fill::Brick(BlockKind::Wood, Rgb::new(55, 25, 8), 12);
|
let darkwood = Fill::Brick(BlockKind::Wood, Rgb::new(55, 25, 8), 12);
|
||||||
let midwood = Fill::Brick(BlockKind::Wood, Rgb::new(71, 33, 11), 12);
|
let lightwood = Fill::Brick(BlockKind::Wood, Rgb::new(71, 33, 11), 12);
|
||||||
let moss = Fill::Brick(BlockKind::Leaves, Rgb::new(22, 36, 20), 24);
|
let moss = Fill::Brick(BlockKind::Leaves, Rgb::new(22, 36, 20), 24);
|
||||||
|
|
||||||
// Floor
|
// Floor
|
||||||
@ -749,7 +748,7 @@ impl Structure for GnarlingFortification {
|
|||||||
hut_radius,
|
hut_radius,
|
||||||
hut_wall_height + 3.0,
|
hut_wall_height + 3.0,
|
||||||
))
|
))
|
||||||
.fill(midwood.clone());
|
.fill(lightwood.clone());
|
||||||
painter
|
painter
|
||||||
.prim(Primitive::cylinder(
|
.prim(Primitive::cylinder(
|
||||||
floor_pos,
|
floor_pos,
|
||||||
@ -763,7 +762,7 @@ impl Structure for GnarlingFortification {
|
|||||||
hut_radius - 2.0,
|
hut_radius - 2.0,
|
||||||
hut_wall_height + 3.0,
|
hut_wall_height + 3.0,
|
||||||
))
|
))
|
||||||
.fill(midwood);
|
.fill(lightwood.clone());
|
||||||
painter
|
painter
|
||||||
.prim(Primitive::cylinder(
|
.prim(Primitive::cylinder(
|
||||||
floor_pos,
|
floor_pos,
|
||||||
@ -815,15 +814,17 @@ impl Structure for GnarlingFortification {
|
|||||||
))
|
))
|
||||||
.fill(moss.clone());
|
.fill(moss.clone());
|
||||||
|
|
||||||
//small bits handing from huts
|
//small bits hanging from huts
|
||||||
let tendril1 = painter.line(
|
let tendril1 = painter.line(
|
||||||
Vec2::new(wpos.x - 3, wpos.y - 5).with_z(alt + 1 + hut_wall_height as i32),
|
Vec2::new(wpos.x - 3, wpos.y - 5)
|
||||||
|
.with_z(alt + (hut_wall_height * 0.75) as i32),
|
||||||
Vec2::new(wpos.x - 3, wpos.y - 5).with_z(alt + 3 + hut_wall_height as i32),
|
Vec2::new(wpos.x - 3, wpos.y - 5).with_z(alt + 3 + hut_wall_height as i32),
|
||||||
1.0,
|
1.0,
|
||||||
);
|
);
|
||||||
|
|
||||||
let tendril2 = painter.line(
|
let tendril2 = painter.line(
|
||||||
Vec2::new(wpos.x + 4, wpos.y + 2).with_z(alt + 2 + hut_wall_height as i32),
|
Vec2::new(wpos.x + 4, wpos.y + 2)
|
||||||
|
.with_z(alt + 1 + (hut_wall_height * 0.75) as i32),
|
||||||
Vec2::new(wpos.x + 4, wpos.y + 2).with_z(alt + 3 + hut_wall_height as i32),
|
Vec2::new(wpos.x + 4, wpos.y + 2).with_z(alt + 3 + hut_wall_height as i32),
|
||||||
1.0,
|
1.0,
|
||||||
);
|
);
|
||||||
@ -844,7 +845,7 @@ impl Structure for GnarlingFortification {
|
|||||||
.fill(Fill::Block(Block::empty()));
|
.fill(Fill::Block(Block::empty()));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn generate_longhut(
|
fn generate_chieftainhut(
|
||||||
painter: &Painter,
|
painter: &Painter,
|
||||||
wpos: Vec2<i32>,
|
wpos: Vec2<i32>,
|
||||||
alt: i32,
|
alt: i32,
|
||||||
@ -856,7 +857,7 @@ impl Structure for GnarlingFortification {
|
|||||||
_roof_overhang: f32,
|
_roof_overhang: f32,
|
||||||
) {
|
) {
|
||||||
let darkwood = Fill::Brick(BlockKind::Wood, Rgb::new(55, 25, 8), 12);
|
let darkwood = Fill::Brick(BlockKind::Wood, Rgb::new(55, 25, 8), 12);
|
||||||
let midwood = Fill::Brick(BlockKind::Wood, Rgb::new(71, 33, 11), 12);
|
let lightwood = Fill::Brick(BlockKind::Wood, Rgb::new(71, 33, 11), 12);
|
||||||
let moss = Fill::Brick(BlockKind::Wood, Rgb::new(22, 36, 20), 24);
|
let moss = Fill::Brick(BlockKind::Wood, Rgb::new(22, 36, 20), 24);
|
||||||
let red = Fill::Brick(BlockKind::Wood, Rgb::new(102, 31, 2), 12);
|
let red = Fill::Brick(BlockKind::Wood, Rgb::new(102, 31, 2), 12);
|
||||||
|
|
||||||
@ -865,7 +866,7 @@ impl Structure for GnarlingFortification {
|
|||||||
let base = wpos.with_z(alt);
|
let base = wpos.with_z(alt);
|
||||||
painter
|
painter
|
||||||
.prim(Primitive::cylinder(base, hut_radius + 1.0, 2.0))
|
.prim(Primitive::cylinder(base, hut_radius + 1.0, 2.0))
|
||||||
.fill(darkwood.clone());
|
.fill(lightwood.clone());
|
||||||
|
|
||||||
let platform = painter.aabb(Aabb {
|
let platform = painter.aabb(Aabb {
|
||||||
min: (wpos - 20).with_z(alt + raise),
|
min: (wpos - 20).with_z(alt + raise),
|
||||||
@ -905,11 +906,10 @@ impl Structure for GnarlingFortification {
|
|||||||
let rad_1 = 18.0;
|
let rad_1 = 18.0;
|
||||||
let rad_2 = 15.0;
|
let rad_2 = 15.0;
|
||||||
|
|
||||||
// Wall
|
|
||||||
let floor_pos = wpos.with_z(alt + 1 + raise);
|
let floor_pos = wpos.with_z(alt + 1 + raise);
|
||||||
painter
|
painter
|
||||||
.prim(Primitive::cylinder(floor_pos, rad_1, height_1))
|
.prim(Primitive::cylinder(floor_pos, rad_1, height_1))
|
||||||
.fill(midwood.clone());
|
.fill(lightwood.clone());
|
||||||
painter
|
painter
|
||||||
.prim(Primitive::cylinder(floor_pos, rad_1 - 1.0, height_1))
|
.prim(Primitive::cylinder(floor_pos, rad_1 - 1.0, height_1))
|
||||||
.fill(Fill::Block(Block::empty()));
|
.fill(Fill::Block(Block::empty()));
|
||||||
@ -917,7 +917,7 @@ impl Structure for GnarlingFortification {
|
|||||||
let floor2_pos = wpos.with_z(alt + 1 + raise + height_1 as i32);
|
let floor2_pos = wpos.with_z(alt + 1 + raise + height_1 as i32);
|
||||||
painter
|
painter
|
||||||
.prim(Primitive::cylinder(floor2_pos, rad_2, height_2))
|
.prim(Primitive::cylinder(floor2_pos, rad_2, height_2))
|
||||||
.fill(midwood);
|
.fill(lightwood.clone());
|
||||||
|
|
||||||
// Roof
|
// Roof
|
||||||
let roof_radius = rad_1 + 5.0;
|
let roof_radius = rad_1 + 5.0;
|
||||||
@ -978,15 +978,17 @@ impl Structure for GnarlingFortification {
|
|||||||
.union(roof_support_3)
|
.union(roof_support_3)
|
||||||
.union(roof_support_4);
|
.union(roof_support_4);
|
||||||
|
|
||||||
painter.fill(roof_support, darkwood.clone());
|
painter.fill(roof_support, red.clone());
|
||||||
|
|
||||||
let spike_1 = painter.line(
|
let spike_high = painter.cubic_bezier(
|
||||||
(wpos + rad_2 as i32 - 5).with_z(alt + raise + height_1 as i32 + 2),
|
(wpos + rad_2 as i32 - 5).with_z(alt + raise + height_1 as i32 + 2),
|
||||||
(wpos + rad_2 as i32 - 1).with_z(alt + raise + height_1 as i32 + 8),
|
(wpos + rad_2 as i32 - 2).with_z(alt + raise + height_1 as i32 + 2),
|
||||||
|
(wpos + rad_2 as i32 - 1).with_z(alt + raise + height_1 as i32 + 5),
|
||||||
|
(wpos + rad_2 as i32).with_z(alt + raise + height_1 as i32 + 8),
|
||||||
1.3,
|
1.3,
|
||||||
);
|
);
|
||||||
|
let spike_low = spike_high.rotate(Mat3::new(1, 0, 0, 0, 1, 0, 0, 0, -1));
|
||||||
let spike_1 = centerspot.union(spike_1);
|
let spike_1 = centerspot.union(spike_low).union(spike_high);
|
||||||
|
|
||||||
let spike_2 = spike_1.rotate(Mat3::new(1, 0, 0, 0, -1, 0, 0, 0, 1));
|
let spike_2 = spike_1.rotate(Mat3::new(1, 0, 0, 0, -1, 0, 0, 0, 1));
|
||||||
let spike_3 = spike_1.rotate(Mat3::new(-1, 0, 0, 0, 1, 0, 0, 0, 1));
|
let spike_3 = spike_1.rotate(Mat3::new(-1, 0, 0, 0, 1, 0, 0, 0, 1));
|
||||||
@ -995,7 +997,7 @@ impl Structure for GnarlingFortification {
|
|||||||
|
|
||||||
painter.fill(
|
painter.fill(
|
||||||
spikes,
|
spikes,
|
||||||
Fill::Brick(BlockKind::Wood, Rgb::new(184, 177, 134), 24),
|
Fill::Brick(BlockKind::Wood, Rgb::new(112, 110, 99), 24),
|
||||||
);
|
);
|
||||||
//Open doorways (top floor)
|
//Open doorways (top floor)
|
||||||
painter
|
painter
|
||||||
@ -1129,16 +1131,21 @@ impl Structure for GnarlingFortification {
|
|||||||
roof_overhang,
|
roof_overhang,
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
GnarlingStructure::Longhut => {
|
GnarlingStructure::VeloriteHut => {
|
||||||
let randx = wpos.x.abs() % 10;
|
let rand = Vec3::new(
|
||||||
let randy = wpos.y.abs() % 10;
|
wpos.x.abs() % 10,
|
||||||
let randz = alt.abs() % 10;
|
wpos.y.abs() % 10,
|
||||||
|
(land.get_alt_approx(wpos) as i32).abs() % 10,
|
||||||
|
);
|
||||||
|
|
||||||
let length = 14;
|
let length = 14;
|
||||||
let width = 6;
|
let width = 6;
|
||||||
let height = alt + 12;
|
let height = alt + 12;
|
||||||
let darkwood = Fill::Brick(BlockKind::Wood, Rgb::new(55, 25, 8), 12);
|
let darkwood = Fill::Brick(BlockKind::Wood, Rgb::new(55, 25, 8), 12);
|
||||||
let midwood = Fill::Brick(BlockKind::Wood, Rgb::new(71, 33, 11), 12);
|
let lightwood = Fill::Brick(BlockKind::Wood, Rgb::new(71, 33, 11), 12);
|
||||||
let moss = Fill::Brick(BlockKind::Wood, Rgb::new(22, 36, 20), 24);
|
let moss = Fill::Brick(BlockKind::Wood, Rgb::new(22, 36, 20), 24);
|
||||||
|
let red = Fill::Brick(BlockKind::Wood, Rgb::new(102, 31, 2), 12);
|
||||||
|
|
||||||
let low1 = painter.aabb(Aabb {
|
let low1 = painter.aabb(Aabb {
|
||||||
min: Vec2::new(wpos.x - width, wpos.y - length).with_z(height + 1),
|
min: Vec2::new(wpos.x - width, wpos.y - length).with_z(height + 1),
|
||||||
max: Vec2::new(wpos.x + width, wpos.y + length).with_z(height + 2),
|
max: Vec2::new(wpos.x + width, wpos.y + length).with_z(height + 2),
|
||||||
@ -1167,11 +1174,11 @@ impl Structure for GnarlingFortification {
|
|||||||
let roof = low1.union(low2).union(top1).union(top2);
|
let roof = low1.union(low2).union(top1).union(top2);
|
||||||
let roofmoss = roof.translate(Vec3::new(0, 0, 1)).without(top).without(low);
|
let roofmoss = roof.translate(Vec3::new(0, 0, 1)).without(top).without(low);
|
||||||
top.fill(darkwood.clone());
|
top.fill(darkwood.clone());
|
||||||
low.fill(midwood);
|
low.fill(lightwood.clone());
|
||||||
roofmoss.fill(moss);
|
roofmoss.fill(moss.clone());
|
||||||
painter
|
painter
|
||||||
.prim(Primitive::sphere(
|
.prim(Primitive::sphere(
|
||||||
Vec2::new(wpos.x + randy - 5, wpos.y + randz - 5)
|
Vec2::new(wpos.x + rand.y - 5, wpos.y + rand.z - 5)
|
||||||
.with_z(height + 4),
|
.with_z(height + 4),
|
||||||
7.0,
|
7.0,
|
||||||
))
|
))
|
||||||
@ -1179,7 +1186,7 @@ impl Structure for GnarlingFortification {
|
|||||||
.fill(Fill::Block(Block::empty()));
|
.fill(Fill::Block(Block::empty()));
|
||||||
painter
|
painter
|
||||||
.prim(Primitive::sphere(
|
.prim(Primitive::sphere(
|
||||||
Vec2::new(wpos.x + randx - 5, wpos.y + randy - 5)
|
Vec2::new(wpos.x + rand.x - 5, wpos.y + rand.y - 5)
|
||||||
.with_z(height + 4),
|
.with_z(height + 4),
|
||||||
4.0,
|
4.0,
|
||||||
))
|
))
|
||||||
@ -1187,46 +1194,46 @@ impl Structure for GnarlingFortification {
|
|||||||
.fill(Fill::Block(Block::empty()));
|
.fill(Fill::Block(Block::empty()));
|
||||||
painter
|
painter
|
||||||
.prim(Primitive::sphere(
|
.prim(Primitive::sphere(
|
||||||
Vec2::new(wpos.x + 2 * (randz - 5), wpos.y + 2 * (randx - 5))
|
Vec2::new(wpos.x + 2 * (rand.z - 5), wpos.y + 2 * (rand.x - 5))
|
||||||
.with_z(height + 4),
|
.with_z(height + 4),
|
||||||
4.0,
|
4.0,
|
||||||
))
|
))
|
||||||
.intersect(roofmoss)
|
.intersect(roofmoss)
|
||||||
.fill(Fill::Block(Block::empty()));
|
.fill(Fill::Block(Block::empty()));
|
||||||
//outside leg
|
|
||||||
painter
|
|
||||||
.aabb(Aabb {
|
|
||||||
min: Vec2::new(wpos.x - length, wpos.y - width).with_z(alt),
|
|
||||||
max: Vec2::new(wpos.x - length + 1, wpos.y - width + 1)
|
|
||||||
.with_z(height + 1),
|
|
||||||
})
|
|
||||||
.fill(darkwood.clone());
|
|
||||||
|
|
||||||
//inside leg
|
//inside leg
|
||||||
let legp1 = painter.aabb(Aabb {
|
let leg1 = painter.aabb(Aabb {
|
||||||
min: Vec2::new(wpos.x - width, wpos.y - width).with_z(alt),
|
min: Vec2::new(wpos.x - width, wpos.y - width).with_z(height - 12),
|
||||||
max: Vec2::new(wpos.x - width + 2, wpos.y - width + 2)
|
max: Vec2::new(wpos.x - width + 2, wpos.y - width + 2)
|
||||||
.with_z(height + 2),
|
.with_z(height + 2),
|
||||||
});
|
});
|
||||||
let legp2 = painter.line(
|
let legsupport1 = painter.line(
|
||||||
Vec2::new(wpos.x - width, wpos.y - width).with_z(height - 6),
|
Vec2::new(wpos.x - width, wpos.y - width).with_z(height - 6),
|
||||||
Vec2::new(wpos.x - width + 3, wpos.y - width + 3).with_z(height),
|
Vec2::new(wpos.x - width + 3, wpos.y - width + 3).with_z(height),
|
||||||
1.0,
|
1.0,
|
||||||
);
|
);
|
||||||
|
|
||||||
let leg1 = legp1.union(legp2);
|
let leg2 = leg1.translate(Vec3::new(0, width * 2 - 2, 0));
|
||||||
let leg2 = leg1
|
let leg3 = leg1.translate(Vec3::new(width * 2 - 2, 0, 0));
|
||||||
|
let leg4 = leg1.translate(Vec3::new(width * 2 - 2, width * 2 - 2, 0));
|
||||||
|
let legsupport2 = legsupport1
|
||||||
.rotate(Mat3::new(0, 1, 0, -1, 0, 0, 0, 0, 1))
|
.rotate(Mat3::new(0, 1, 0, -1, 0, 0, 0, 0, 1))
|
||||||
.translate(Vec3::new(1, width * 2 + 1, 0));
|
.translate(Vec3::new(1, width * 2 + 1, 0));
|
||||||
let leg3 = leg1
|
let legsupport3 = legsupport1
|
||||||
.rotate(Mat3::new(0, -1, 0, 1, 0, 0, 0, 0, 1))
|
.rotate(Mat3::new(0, -1, 0, 1, 0, 0, 0, 0, 1))
|
||||||
.translate(Vec3::new(width * 2 + 1, 1, 0));
|
.translate(Vec3::new(width * 2 + 1, 1, 0));
|
||||||
let leg4 = leg1
|
let legsupport4 = legsupport1
|
||||||
.rotate(Mat3::new(-1, 0, 0, 0, -1, 0, 0, 0, 1))
|
.rotate(Mat3::new(-1, 0, 0, 0, -1, 0, 0, 0, 1))
|
||||||
.translate(Vec3::new(width * 2 + 2, width * 2 + 2, 0));
|
.translate(Vec3::new(width * 2 + 2, width * 2 + 2, 0));
|
||||||
|
|
||||||
|
let legsupports = legsupport1
|
||||||
|
.union(legsupport2)
|
||||||
|
.union(legsupport3)
|
||||||
|
.union(legsupport4);
|
||||||
|
|
||||||
let legs = leg1.union(leg2).union(leg3).union(leg4);
|
let legs = leg1.union(leg2).union(leg3).union(leg4);
|
||||||
legs.fill(darkwood);
|
legs.fill(darkwood);
|
||||||
|
legsupports.without(legs).fill(red);
|
||||||
|
|
||||||
let spike1 = painter.line(
|
let spike1 = painter.line(
|
||||||
Vec2::new(wpos.x - 12, wpos.y + 2).with_z(height + 3),
|
Vec2::new(wpos.x - 12, wpos.y + 2).with_z(height + 3),
|
||||||
@ -1248,7 +1255,7 @@ impl Structure for GnarlingFortification {
|
|||||||
.translate(Vec3::new(16, -9, 0));
|
.translate(Vec3::new(16, -9, 0));
|
||||||
let spikesall = spikeshalf.union(spikesotherhalf);
|
let spikesall = spikeshalf.union(spikesotherhalf);
|
||||||
|
|
||||||
spikesall.fill(Fill::Brick(BlockKind::Wood, Rgb::new(184, 177, 134), 24));
|
spikesall.fill(Fill::Brick(BlockKind::Wood, Rgb::new(112, 110, 99), 24));
|
||||||
let crystal1 = painter.aabb(Aabb {
|
let crystal1 = painter.aabb(Aabb {
|
||||||
min: Vec2::new(wpos.x - 2, wpos.y - 3).with_z(alt),
|
min: Vec2::new(wpos.x - 2, wpos.y - 3).with_z(alt),
|
||||||
max: Vec2::new(wpos.x + 2, wpos.y + 1).with_z(alt + 7),
|
max: Vec2::new(wpos.x + 2, wpos.y + 1).with_z(alt + 7),
|
||||||
@ -1302,7 +1309,7 @@ impl Structure for GnarlingFortification {
|
|||||||
let roof_height = 3.0;
|
let roof_height = 3.0;
|
||||||
let roof_overhang = 1.0;
|
let roof_overhang = 1.0;
|
||||||
|
|
||||||
generate_longhut(
|
generate_chieftainhut(
|
||||||
painter,
|
painter,
|
||||||
wpos,
|
wpos,
|
||||||
alt,
|
alt,
|
||||||
@ -1316,14 +1323,12 @@ impl Structure for GnarlingFortification {
|
|||||||
},
|
},
|
||||||
|
|
||||||
GnarlingStructure::Banner => {
|
GnarlingStructure::Banner => {
|
||||||
let randx = ((wpos.x.abs() as f32 / 10.0
|
let rand = Vec3::new(
|
||||||
- (wpos.x.abs() as f32 / 10.0).trunc())
|
wpos.x.abs() % 10,
|
||||||
* 10.0) as i32;
|
wpos.y.abs() % 10,
|
||||||
let randy = ((wpos.y.abs() as f32 / 10.0
|
(land.get_alt_approx(wpos) as i32).abs() % 10,
|
||||||
- (wpos.y.abs() as f32 / 10.0).trunc())
|
);
|
||||||
* 10.0) as i32;
|
|
||||||
let randz = ((alt.abs() as f32 / 10.0 - (alt.abs() as f32 / 10.0).trunc())
|
|
||||||
* 10.0) as i32;
|
|
||||||
let darkwood = Fill::Brick(BlockKind::Wood, Rgb::new(55, 25, 8), 12);
|
let darkwood = Fill::Brick(BlockKind::Wood, Rgb::new(55, 25, 8), 12);
|
||||||
let moss = Fill::Brick(BlockKind::Leaves, Rgb::new(22, 36, 20), 24);
|
let moss = Fill::Brick(BlockKind::Leaves, Rgb::new(22, 36, 20), 24);
|
||||||
let red = Fill::Brick(BlockKind::Wood, Rgb::new(102, 31, 2), 12);
|
let red = Fill::Brick(BlockKind::Wood, Rgb::new(102, 31, 2), 12);
|
||||||
@ -1376,19 +1381,19 @@ impl Structure for GnarlingFortification {
|
|||||||
//tatters
|
//tatters
|
||||||
painter
|
painter
|
||||||
.line(
|
.line(
|
||||||
Vec2::new(wpos.x + 3 + randx / 5, wpos.y - 1)
|
Vec2::new(wpos.x + 3 + rand.x / 5, wpos.y - 1)
|
||||||
.with_z(alt + 15 + randy),
|
.with_z(alt + 15 + rand.y),
|
||||||
Vec2::new(wpos.x + 3 + randy / 5, wpos.y - 1).with_z(alt + 5),
|
Vec2::new(wpos.x + 3 + rand.y / 5, wpos.y - 1).with_z(alt + 5),
|
||||||
0.9 * randz as f32 / 4.0,
|
0.9 * rand.z as f32 / 4.0,
|
||||||
)
|
)
|
||||||
.fill(Fill::Block(Block::empty()));
|
.fill(Fill::Block(Block::empty()));
|
||||||
painter
|
painter
|
||||||
.line(
|
.line(
|
||||||
Vec2::new(wpos.x + 4 + randz / 2, wpos.y - 1)
|
Vec2::new(wpos.x + 4 + rand.z / 2, wpos.y - 1)
|
||||||
.with_z(alt + 20 + randx),
|
.with_z(alt + 20 + rand.x),
|
||||||
Vec2::new(wpos.x + 4 + randz / 2, wpos.y - 1)
|
Vec2::new(wpos.x + 4 + rand.z / 2, wpos.y - 1)
|
||||||
.with_z(alt + 17 + randy),
|
.with_z(alt + 17 + rand.y),
|
||||||
0.9 * randz as f32 / 6.0,
|
0.9 * rand.z as f32 / 6.0,
|
||||||
)
|
)
|
||||||
.fill(Fill::Block(Block::empty()));
|
.fill(Fill::Block(Block::empty()));
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user