mirror of
https://gitlab.com/veloren/veloren.git
synced 2024-08-30 18:12:32 +00:00
Prevent castles being assailable from above.
This commit is contained in:
parent
609b26ce20
commit
5df1ee6382
@ -12,7 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||
|
||||
### Changed
|
||||
|
||||
- Improved town placement
|
||||
- Improved site placement
|
||||
|
||||
### Removed
|
||||
|
||||
|
@ -15,7 +15,7 @@ use common::{
|
||||
path::Path,
|
||||
spiral::Spiral2d,
|
||||
store::{Id, Store},
|
||||
terrain::{uniform_idx_as_vec2, MapSizeLg, TerrainChunkSize},
|
||||
terrain::{uniform_idx_as_vec2, MapSizeLg, TerrainChunkSize, TERRAIN_CHUNK_BLOCKS_LG},
|
||||
vol::RectVolSize,
|
||||
};
|
||||
use core::{fmt, hash::BuildHasherDefault, ops::Range};
|
||||
@ -1065,7 +1065,7 @@ fn find_site_loc(
|
||||
size: i32,
|
||||
site_kind: SiteKind,
|
||||
) -> Option<Vec2<i32>> {
|
||||
const MAX_ATTEMPTS: usize = 1000;
|
||||
const MAX_ATTEMPTS: usize = 10000;
|
||||
let mut loc = None;
|
||||
let (avoid_locs, distance) = avoid;
|
||||
for _ in 0..MAX_ATTEMPTS {
|
||||
@ -1096,6 +1096,7 @@ fn find_site_loc(
|
||||
)
|
||||
});
|
||||
}
|
||||
warn!("Failed to place site {:?}.", site_kind);
|
||||
None
|
||||
}
|
||||
|
||||
@ -1158,6 +1159,32 @@ impl SiteKind {
|
||||
sim.get(loc).map_or(false, |chunk| match self {
|
||||
SiteKind::Gnarling => (-0.3..0.4).contains(&chunk.temp) && chunk.tree_density > 0.75,
|
||||
SiteKind::GiantTree | SiteKind::Tree => chunk.tree_density > 0.4,
|
||||
SiteKind::Castle => {
|
||||
if chunk.tree_density > 0.4 || chunk.river.near_water() || chunk.near_cliffs() {
|
||||
return false;
|
||||
}
|
||||
const HILL_RADIUS: i32 = 3 * TERRAIN_CHUNK_BLOCKS_LG as i32;
|
||||
for x in (-HILL_RADIUS)..HILL_RADIUS {
|
||||
for y in (-HILL_RADIUS)..HILL_RADIUS {
|
||||
let check_loc = loc + Vec2::new(x, y);
|
||||
if let Some(true) = sim
|
||||
.get_alt_approx(check_loc)
|
||||
.map(|surrounding_alt| surrounding_alt > chunk.alt + 1.0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
// Castles are really big, so to avoid parts of them ending up underwater or
|
||||
// in other awkward positions we have to do this
|
||||
if sim
|
||||
.get(check_loc)
|
||||
.map_or(true, |c| c.is_underwater() || c.near_cliffs())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
true
|
||||
},
|
||||
SiteKind::Refactor | SiteKind::Settlement => {
|
||||
const RESOURCE_RADIUS: i32 = 1;
|
||||
let mut river_chunks = 0;
|
||||
|
Loading…
Reference in New Issue
Block a user