mirror of
https://gitlab.com/veloren/veloren.git
synced 2024-08-30 18:12:32 +00:00
Basic Castle Wall
This commit is contained in:
@ -329,11 +329,17 @@ impl Site {
|
|||||||
},
|
},
|
||||||
// Guard tower
|
// Guard tower
|
||||||
2 => {
|
2 => {
|
||||||
if let Some((aabr, _)) = attempt(10, || {
|
if let Some((aabr, entrance_tile)) = attempt(10, || {
|
||||||
site.find_roadside_aabr(&mut rng, 4..4, Extent2::new(2, 2))
|
site.find_roadside_aabr(&mut rng, 4..4, Extent2::new(2, 2))
|
||||||
}) {
|
}) {
|
||||||
let plot = site.create_plot(Plot {
|
let plot = site.create_plot(Plot {
|
||||||
kind: PlotKind::Castle,
|
kind: PlotKind::Castle(plot::Castle::generate(
|
||||||
|
land,
|
||||||
|
&mut rng,
|
||||||
|
&site,
|
||||||
|
entrance_tile,
|
||||||
|
aabr,
|
||||||
|
)),
|
||||||
root_tile: aabr.center(),
|
root_tile: aabr.center(),
|
||||||
tiles: aabr_tiles(aabr).collect(),
|
tiles: aabr_tiles(aabr).collect(),
|
||||||
seed: rng.gen(),
|
seed: rng.gen(),
|
||||||
@ -381,11 +387,17 @@ impl Site {
|
|||||||
},
|
},
|
||||||
// Castle
|
// Castle
|
||||||
4 if castles < 1 => {
|
4 if castles < 1 => {
|
||||||
if let Some((aabr, _)) = attempt(10, || {
|
if let Some((aabr, entrance_tile)) = attempt(10, || {
|
||||||
site.find_roadside_aabr(&mut rng, 16 * 16..18 * 18, Extent2::new(16, 16))
|
site.find_roadside_aabr(&mut rng, 16 * 16..18 * 18, Extent2::new(16, 16))
|
||||||
}) {
|
}) {
|
||||||
let plot = site.create_plot(Plot {
|
let plot = site.create_plot(Plot {
|
||||||
kind: PlotKind::Castle,
|
kind: PlotKind::Castle(plot::Castle::generate(
|
||||||
|
land,
|
||||||
|
&mut rng,
|
||||||
|
&site,
|
||||||
|
entrance_tile,
|
||||||
|
aabr,
|
||||||
|
)),
|
||||||
root_tile: aabr.center(),
|
root_tile: aabr.center(),
|
||||||
tiles: aabr_tiles(aabr).collect(),
|
tiles: aabr_tiles(aabr).collect(),
|
||||||
seed: rng.gen(),
|
seed: rng.gen(),
|
||||||
@ -626,6 +638,7 @@ impl Site {
|
|||||||
for plot in plots_to_render {
|
for plot in plots_to_render {
|
||||||
let (prim_tree, fills) = match &self.plots[plot].kind {
|
let (prim_tree, fills) = match &self.plots[plot].kind {
|
||||||
PlotKind::House(house) => house.render_collect(self),
|
PlotKind::House(house) => house.render_collect(self),
|
||||||
|
PlotKind::Castle(castle) => castle.render_collect(self),
|
||||||
_ => continue,
|
_ => continue,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
|
mod castle;
|
||||||
mod house;
|
mod house;
|
||||||
|
|
||||||
pub use self::house::House;
|
pub use self::{castle::Castle, house::House};
|
||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::util::DHashSet;
|
use crate::util::DHashSet;
|
||||||
@ -28,6 +29,6 @@ pub enum PlotKind {
|
|||||||
Field,
|
Field,
|
||||||
House(House),
|
House(House),
|
||||||
Plaza,
|
Plaza,
|
||||||
Castle,
|
Castle(Castle),
|
||||||
Road(Path<Vec2<i32>>),
|
Road(Path<Vec2<i32>>),
|
||||||
}
|
}
|
||||||
|
101
world/src/site2/plot/castle.rs
Normal file
101
world/src/site2/plot/castle.rs
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
use super::*;
|
||||||
|
use crate::{util::SQUARE_4, Land};
|
||||||
|
use common::terrain::{Block, BlockKind, SpriteKind};
|
||||||
|
use rand::prelude::*;
|
||||||
|
use vek::*;
|
||||||
|
|
||||||
|
pub struct Castle {
|
||||||
|
entrance_tile: Vec2<i32>,
|
||||||
|
tile_aabr: Aabr<i32>,
|
||||||
|
bounds: Aabr<i32>,
|
||||||
|
alt: i32,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Castle {
|
||||||
|
pub fn generate(
|
||||||
|
land: &Land,
|
||||||
|
rng: &mut impl Rng,
|
||||||
|
site: &Site,
|
||||||
|
entrance_tile: Vec2<i32>,
|
||||||
|
tile_aabr: Aabr<i32>,
|
||||||
|
) -> Self {
|
||||||
|
Self {
|
||||||
|
entrance_tile,
|
||||||
|
tile_aabr,
|
||||||
|
bounds: Aabr {
|
||||||
|
min: site.tile_wpos(tile_aabr.min),
|
||||||
|
max: site.tile_wpos(tile_aabr.max),
|
||||||
|
},
|
||||||
|
alt: land.get_alt_approx(site.tile_center_wpos(entrance_tile)) as i32,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Structure for Castle {
|
||||||
|
fn render<F: FnMut(Primitive) -> Id<Primitive>, G: FnMut(Id<Primitive>, Fill)>(
|
||||||
|
&self,
|
||||||
|
site: &Site,
|
||||||
|
mut prim: F,
|
||||||
|
mut fill: G,
|
||||||
|
) {
|
||||||
|
let wall_height = 24;
|
||||||
|
let thickness = 12;
|
||||||
|
let parapet_height = 2;
|
||||||
|
let parapet_width = 1;
|
||||||
|
let downwards = 40;
|
||||||
|
for x in 0..self.tile_aabr.size().w {
|
||||||
|
for y in 0..self.tile_aabr.size().h {
|
||||||
|
let tile_pos = self.tile_aabr.min + Vec2::new(x, y);
|
||||||
|
let wpos_center = site.tile_center_wpos(tile_pos);
|
||||||
|
let wpos = site.tile_wpos(tile_pos);
|
||||||
|
match site.tiles.get(tile_pos).kind.clone() {
|
||||||
|
TileKind::Wall => {
|
||||||
|
let ori = if x == 0 || x == self.tile_aabr.size().w - 1 {
|
||||||
|
Vec2::new(1, 0)
|
||||||
|
} else {
|
||||||
|
Vec2::new(0, 1)
|
||||||
|
};
|
||||||
|
let wall = prim(Primitive::Aabb(Aabb {
|
||||||
|
min: wpos.with_z(self.alt),
|
||||||
|
max: (wpos + 7).with_z(self.alt + wall_height + parapet_height),
|
||||||
|
}));
|
||||||
|
let cut_path = prim(Primitive::Aabb(Aabb {
|
||||||
|
min: Vec3::new(
|
||||||
|
wpos.x + parapet_width * ori.x,
|
||||||
|
wpos.y + parapet_width * ori.y,
|
||||||
|
self.alt + wall_height,
|
||||||
|
),
|
||||||
|
max: Vec3::new(
|
||||||
|
wpos.x + (7 - parapet_width) * ori.x + 7 * ori.y,
|
||||||
|
wpos.y + (7 - parapet_width) * ori.y + 7 * ori.x,
|
||||||
|
self.alt + wall_height + parapet_height,
|
||||||
|
),
|
||||||
|
}));
|
||||||
|
let cut_sides1 = prim(Primitive::Aabb(Aabb {
|
||||||
|
min: Vec3::new(wpos.x, wpos.y, self.alt + wall_height + 1),
|
||||||
|
max: Vec3::new(
|
||||||
|
wpos.x + 7 * ori.x + ori.y,
|
||||||
|
wpos.y + 7 * ori.y + ori.x,
|
||||||
|
self.alt + wall_height + parapet_height,
|
||||||
|
),
|
||||||
|
}));
|
||||||
|
fill(
|
||||||
|
prim(Primitive::Xor(wall, cut_path)),
|
||||||
|
Fill::Block(Block::new(BlockKind::Rock, Rgb::new(33, 33, 33))),
|
||||||
|
);
|
||||||
|
fill(cut_sides1, Fill::Block(Block::air(SpriteKind::Empty)));
|
||||||
|
},
|
||||||
|
_ => {
|
||||||
|
fill(
|
||||||
|
prim(Primitive::Aabb(Aabb {
|
||||||
|
min: wpos_center.with_z(self.alt + 9),
|
||||||
|
max: (wpos_center + 1).with_z(self.alt + 10),
|
||||||
|
})),
|
||||||
|
Fill::Block(Block::new(BlockKind::Rock, Rgb::new(255, 255, 255))),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user