From 9bdb81bb34bd6a7e33c47d6fcb3dced1c5bda991 Mon Sep 17 00:00:00 2001 From: metamuffin Date: Tue, 18 Jun 2024 09:57:39 +0200 Subject: can start passive recipes --- server/src/game.rs | 19 +++++++++++++++++-- server/src/interaction.rs | 11 +++++++---- server/src/main.rs | 4 +++- server/src/protocol.rs | 2 +- server/src/recipes.rs | 8 ++++++++ 5 files changed, 36 insertions(+), 8 deletions(-) (limited to 'server/src') diff --git a/server/src/game.rs b/server/src/game.rs index 3b16cc05..f207e8f6 100644 --- a/server/src/game.rs +++ b/server/src/game.rs @@ -22,6 +22,7 @@ pub struct Tile { kind: TileIndex, items: Vec, active: Option, + last_active: bool, } struct Player { @@ -77,8 +78,8 @@ impl Game { g.tiles.extend( [ - ([-5, 1], "pan"), - ([-5, 2], "pan"), + ([2, 4], "pan"), + ([3, 4], "pan"), ([4, 3], "meat-spawn"), ([4, 1], "trash"), ] @@ -210,6 +211,19 @@ impl Game { } Ok(()) } + + pub fn tick(&mut self, dt: f32) { + for (&pos, tile) in &mut self.tiles { + if let Some(active) = &mut tile.active { + active.progress += dt / self.data.recipes[active.recipe].action.duration(); + self.packet_out.push_back(PacketC::SetActive { + tile: pos, + progress: Some(active.progress), + }); + } + tile.last_active = tile.active.is_some() + } + } } impl From for Tile { @@ -217,6 +231,7 @@ impl From for Tile { Self { kind, items: vec![], + last_active: false, active: None, } } diff --git a/server/src/interaction.rs b/server/src/interaction.rs index 7ef4a9b4..fadfe8d9 100644 --- a/server/src/interaction.rs +++ b/server/src/interaction.rs @@ -38,6 +38,11 @@ pub fn interact( return; } + if !items.is_empty() && hand.is_none() { + out(Take(items.len() - 1)); + return; + } + if let Some(hi) = hand { if allowed.contains(&hi) { out(Put); @@ -66,6 +71,7 @@ pub fn interact( match r.action { Action::Passive(_) => { + info!("use recipe {r:?}"); *active = Some(ActiveRecipe { recipe: ri, progress: 0., @@ -85,14 +91,11 @@ pub fn interact( if !r.outputs.is_empty() { out(Take(r.outputs.len() - 1)); } + items.clear(); break 'rloop; } Action::Never => (), } } } - - if !items.is_empty() && hand.is_none() { - out(Take(items.len() - 1)); - } } diff --git a/server/src/main.rs b/server/src/main.rs index 441487e8..d747e737 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -36,15 +36,17 @@ async fn main() -> Result<()> { { let game = game.clone(); spawn(async move { + let dt = 1. / 25.; loop { { let mut g = game.write().await; + g.tick(dt); while let Some(p) = g.packet_out() { debug!("-> {p:?}"); let _ = tx.send(p); } } - sleep(Duration::from_millis(20)).await; + sleep(Duration::from_secs_f32(dt)).await; } }); } diff --git a/server/src/protocol.rs b/server/src/protocol.rs index fa34954b..ef731b0d 100644 --- a/server/src/protocol.rs +++ b/server/src/protocol.rs @@ -56,7 +56,7 @@ pub enum PacketC { }, SetActive { tile: IVec2, - progress: f32, + progress: Option, }, UpdateMap { pos: IVec2, diff --git a/server/src/recipes.rs b/server/src/recipes.rs index 11c455ba..b99cd21e 100644 --- a/server/src/recipes.rs +++ b/server/src/recipes.rs @@ -73,3 +73,11 @@ impl Gamedata { self.tile_names.iter().position(|t| t == name) } } +impl Action { + pub fn duration(&self) -> f32 { + match self { + Action::Instant | Action::Never => 0., + Action::Passive(x) | Action::Active(x) => *x, + } + } +} -- cgit v1.2.3-70-g09d2