From f256c54fa7ad85ce4a42564649f85fca205cd00c Mon Sep 17 00:00:00 2001 From: hheik <4469778+hheik@users.noreply.github.com> Date: Wed, 28 May 2025 23:58:46 +0300 Subject: [PATCH] Wip: implementing travel groups --- src/sim/creature.rs | 2 +- src/sim/site.rs | 6 ++--- src/sim/travel_group.rs | 55 +++++++++++++++++++++++++++++++++++++++-- src/sim/util.rs | 2 ++ src/sim/world.rs | 1 + 5 files changed, 60 insertions(+), 6 deletions(-) diff --git a/src/sim/creature.rs b/src/sim/creature.rs index 29850a2..c61ce3b 100644 --- a/src/sim/creature.rs +++ b/src/sim/creature.rs @@ -21,7 +21,7 @@ impl CreatureId { impl Display for CreatureId { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "c-{}", self.0) + write!(f, "crea-{}", self.0) } } diff --git a/src/sim/site.rs b/src/sim/site.rs index da7eb2d..46cc3c0 100644 --- a/src/sim/site.rs +++ b/src/sim/site.rs @@ -16,17 +16,17 @@ impl SiteId { impl Display for SiteId { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "s-{}", self.0) + write!(f, "site-{}", self.0) } } #[derive(Debug, Serialize, Deserialize)] pub struct Site { id: SiteId, - pub name: String, - pub definition: SiteDef, areas: Vec, accumulated_time: Duration, + pub name: String, + pub definition: SiteDef, } impl Site { diff --git a/src/sim/travel_group.rs b/src/sim/travel_group.rs index 4e3926e..fde99ab 100644 --- a/src/sim/travel_group.rs +++ b/src/sim/travel_group.rs @@ -1,21 +1,72 @@ +use std::{fmt::Display, time::Duration}; + use serde::{Deserialize, Serialize}; +use uuid::Uuid; use super::prelude::*; -#[derive(Eq, PartialEq, Hash, Debug, Serialize, Deserialize)] +#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash, Serialize, Deserialize)] +pub struct TravelGroupId(Uuid); + +impl TravelGroupId { + pub fn generate() -> Self { + Self(Uuid::new_v4()) + } +} + +impl Display for TravelGroupId { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "trav-{}", self.0) + } +} + +#[derive(Eq, PartialEq, Debug, Serialize, Deserialize)] +pub enum WorldPoint { + Coords(WorldCoords), + Site(SiteId), +} + +#[derive(Eq, PartialEq, Debug, Serialize, Deserialize)] pub struct TravelGroup { + id: TravelGroupId, + accumulated_movement: Kilometer, pub creatures: Vec, pub position: WorldCoords, + pub origin: Option, + pub destination: Option, } impl TravelGroup { - pub fn new(creatures: Vec, position: WorldCoords) -> Self { + pub fn new( + creatures: Vec, + position: WorldCoords, + origin: Option, + destination: Option, + ) -> Self { Self { + id: TravelGroupId::generate(), + accumulated_movement: 0., creatures, position, + origin, + destination, } } + pub fn id(&self) -> TravelGroupId { + self.id + } + + /// The travel speed of the group in km/h + pub fn speed(&self) -> Kilometer { + // TODO: hard-coded, should depend on the creatures in the group + 5.0 + } + + pub fn advance_time(&mut self, time: Duration) { + self.accumulated_movement += time.as_secs_f32() / 3600. * self.speed(); + } + pub fn insert(&mut self, creature: Creature) { self.creatures.push(creature) } diff --git a/src/sim/util.rs b/src/sim/util.rs index 4b4de2d..eacbfa3 100644 --- a/src/sim/util.rs +++ b/src/sim/util.rs @@ -1,5 +1,7 @@ use serde::{Deserialize, Serialize}; +pub type Kilometer = f32; + #[derive(Clone, Copy, Debug, Default, Serialize, Deserialize, PartialEq, Eq, Hash)] pub struct WorldCoords { pub x: i32, diff --git a/src/sim/world.rs b/src/sim/world.rs index 4281c97..5e89abd 100644 --- a/src/sim/world.rs +++ b/src/sim/world.rs @@ -7,6 +7,7 @@ use super::prelude::*; #[derive(Debug, Default, Serialize, Deserialize)] pub struct World { pub sites: Vec, + pub travel_groups: Vec, } impl World {