mirror of
https://gitlab.com/veloren/veloren.git
synced 2024-08-30 18:12:32 +00:00
Improved rtsim entity pathfinding
This commit is contained in:
parent
1d76d484bb
commit
60b7528199
@ -167,7 +167,9 @@ impl Entity {
|
||||
.iter()
|
||||
.filter(|s| s.1.is_settlement() || s.1.is_castle())
|
||||
.min_by_key(|(_, site)| {
|
||||
let wpos = site.center * TerrainChunk::RECT_SIZE.map(|e| e as i32);
|
||||
let wpos = site.center.map2(TerrainChunk::RECT_SIZE, |e, sz| {
|
||||
e * sz as i32 + sz as i32 / 2
|
||||
});
|
||||
wpos.map(|e| e as f32).distance_squared(self.pos.xy()) as u32
|
||||
})
|
||||
.map(|(id, _)| id)
|
||||
@ -177,7 +179,9 @@ impl Entity {
|
||||
// with at least one path, we need to get them to a town that does.
|
||||
let nearest_site = &world.civs().sites[nearest_site_id];
|
||||
let site_wpos =
|
||||
nearest_site.center * TerrainChunk::RECT_SIZE.map(|e| e as i32);
|
||||
nearest_site.center.map2(TerrainChunk::RECT_SIZE, |e, sz| {
|
||||
e * sz as i32 + sz as i32 / 2
|
||||
});
|
||||
let dist =
|
||||
site_wpos.map(|e| e as f32).distance_squared(self.pos.xy()) as u32;
|
||||
if dist < 64_u32.pow(2) {
|
||||
@ -208,7 +212,9 @@ impl Entity {
|
||||
})
|
||||
.filter(|_| thread_rng().gen_range(0i32..4) == 0)
|
||||
.min_by_key(|(_, site)| {
|
||||
let wpos = site.center * TerrainChunk::RECT_SIZE.map(|e| e as i32);
|
||||
let wpos = site.center.map2(TerrainChunk::RECT_SIZE, |e, sz| {
|
||||
e * sz as i32 + sz as i32 / 2
|
||||
});
|
||||
let dist =
|
||||
wpos.map(|e| e as f32).distance_squared(self.pos.xy()) as u32;
|
||||
dist + if dist < 96_u32.pow(2) { 100_000_000 } else { 0 }
|
||||
@ -219,8 +225,10 @@ impl Entity {
|
||||
(Normal::new(0.0, 64.0), Normal::new(0.0, 256.0))
|
||||
{
|
||||
let mut path = Vec::<Vec2<i32>>::default();
|
||||
let target_site_pos = site.center.map(|e| e as f32)
|
||||
* TerrainChunk::RECT_SIZE.map(|e| e as f32);
|
||||
let target_site_pos =
|
||||
site.center.map2(TerrainChunk::RECT_SIZE, |e, sz| {
|
||||
(e * sz as i32 + sz as i32 / 2) as f32
|
||||
});
|
||||
let offset_site_pos =
|
||||
target_site_pos.map(|v| v + normalpos.sample(&mut rng));
|
||||
let offset_dir = (offset_site_pos - self.pos.xy()).normalized();
|
||||
@ -256,7 +264,9 @@ impl Entity {
|
||||
})
|
||||
.filter(|_| thread_rng().gen_range(0i32..4) == 0)
|
||||
.min_by_key(|(_, site)| {
|
||||
let wpos = site.center * TerrainChunk::RECT_SIZE.map(|e| e as i32);
|
||||
let wpos = site.center.map2(TerrainChunk::RECT_SIZE, |e, sz| {
|
||||
e * sz as i32 + sz as i32 / 2
|
||||
});
|
||||
let dist =
|
||||
wpos.map(|e| e as f32).distance_squared(self.pos.xy()) as u32;
|
||||
dist + if dist < 96_u32.pow(2) { 100_000 } else { 0 }
|
||||
@ -279,7 +289,9 @@ impl Entity {
|
||||
.neighbors(site_id)
|
||||
.filter(|sid| {
|
||||
let site = world.civs().sites.get(*sid);
|
||||
let wpos = site.center * TerrainChunk::RECT_SIZE.map(|e| e as i32);
|
||||
let wpos = site.center.map2(TerrainChunk::RECT_SIZE, |e, sz| {
|
||||
e * sz as i32 + sz as i32 / 2
|
||||
});
|
||||
let dist = wpos.map(|e| e as f32).distance_squared(self.pos.xy()) as u32;
|
||||
dist > 96_u32.pow(2)
|
||||
})
|
||||
@ -314,7 +326,9 @@ impl Entity {
|
||||
.filter(|s| s.1.is_settlement() | s.1.is_castle())
|
||||
.filter(|_| thread_rng().gen_range(0i32..4) == 0)
|
||||
.min_by_key(|(_, site)| {
|
||||
let wpos = site.center * TerrainChunk::RECT_SIZE.map(|e| e as i32);
|
||||
let wpos = site.center.map2(TerrainChunk::RECT_SIZE, |e, sz| {
|
||||
e * sz as i32 + sz as i32 / 2
|
||||
});
|
||||
let dist = wpos.map(|e| e as f32).distance_squared(self.pos.xy()) as u32;
|
||||
dist + if dist < 96_u32.pow(2) { 100_000 } else { 0 }
|
||||
})
|
||||
@ -337,7 +351,9 @@ impl Entity {
|
||||
.site_tmp
|
||||
.map_or("".to_string(), |id| index.sites[id].name().to_string());
|
||||
|
||||
let wpos = site.center * TerrainChunk::RECT_SIZE.map(|e| e as i32);
|
||||
let wpos = site.center.map2(TerrainChunk::RECT_SIZE, |e, sz| {
|
||||
e * sz as i32 + sz as i32 / 2
|
||||
});
|
||||
let dist = wpos.map(|e| e as f32).distance_squared(self.pos.xy()) as u32;
|
||||
|
||||
if dist < 64_u32.pow(2) {
|
||||
@ -439,7 +455,9 @@ impl Entity {
|
||||
};
|
||||
|
||||
if let Some(sim_pos) = track.path().iter().nth(nth) {
|
||||
let chunkpos = sim_pos * TerrainChunk::RECT_SIZE.map(|e| e as i32);
|
||||
let chunkpos = sim_pos.map2(TerrainChunk::RECT_SIZE, |e, sz| {
|
||||
e * sz as i32 + sz as i32 / 2
|
||||
});
|
||||
let wpos = if let Some(pathdata) = world.sim().get_nearest_path(chunkpos) {
|
||||
pathdata.1.map(|e| e as i32)
|
||||
} else {
|
||||
@ -527,7 +545,9 @@ impl Entity {
|
||||
.site_tmp
|
||||
.map_or("".to_string(), |id| index.sites[id].name().to_string());
|
||||
|
||||
let wpos = dest_site.center * TerrainChunk::RECT_SIZE.map(|e| e as i32);
|
||||
let wpos = dest_site.center.map2(TerrainChunk::RECT_SIZE, |e, sz| {
|
||||
e * sz as i32 + sz as i32 / 2
|
||||
});
|
||||
let dist = wpos.map(|e| e as f32).distance_squared(self.pos.xy()) as u32;
|
||||
|
||||
// Once at site, stay for a bit, then move to other site
|
||||
|
Loading…
Reference in New Issue
Block a user