diff options
author | metamuffin <metamuffin@disroot.org> | 2024-06-18 21:04:11 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2024-06-23 19:21:22 +0200 |
commit | f4bc78d9dffda792cde848e0ae8040a98959591b (patch) | |
tree | 271ff06cbda6955eb5e093f83a952b9cb7b3e2a6 /server/src/game.rs | |
parent | 48934ff63ee14d4759eda36512af87361dd915dd (diff) | |
download | hurrycurry-f4bc78d9dffda792cde848e0ae8040a98959591b.tar hurrycurry-f4bc78d9dffda792cde848e0ae8040a98959591b.tar.bz2 hurrycurry-f4bc78d9dffda792cde848e0ae8040a98959591b.tar.zst |
passive works
Diffstat (limited to 'server/src/game.rs')
-rw-r--r-- | server/src/game.rs | 127 |
1 files changed, 76 insertions, 51 deletions
diff --git a/server/src/game.rs b/server/src/game.rs index d481dc4f..46bc0569 100644 --- a/server/src/game.rs +++ b/server/src/game.rs @@ -1,6 +1,6 @@ use crate::{ data::Gamedata, - interaction::interact, + interaction::{interact, tick_tile, InteractEffect, TickEffect}, protocol::{ItemIndex, PacketC, PacketS, PlayerID, RecipeIndex, TileIndex}, }; use anyhow::{anyhow, bail, Result}; @@ -12,12 +12,14 @@ use std::{ sync::Arc, }; +#[derive(Debug, PartialEq)] pub struct Involvement { pub recipe: RecipeIndex, pub progress: f32, pub working: usize, } +#[derive(Debug, PartialEq)] pub struct Item { pub kind: ItemIndex, pub active: Option<Involvement>, @@ -80,8 +82,8 @@ impl Game { }); if let Some(item) = &tdata.item { out.push(PacketC::ProduceItem { - item: item.kind, tile, + item: item.kind, }) } } @@ -111,7 +113,7 @@ impl Game { .players .remove(&player) .ok_or(anyhow!("player does not exist"))?; - if let Some(id) = p.item { + if let Some(_id) = p.item { // TODO place on ground } self.packet_out @@ -121,6 +123,10 @@ impl Game { self.packet_out .push_back(PacketC::Position { player, pos, rot }); } + PacketS::Collide { player, force } => { + self.packet_out + .push_back(PacketC::Collide { player, force }); + } PacketS::Interact { pos, edge } => { info!("interact {pos:?} edge={edge}"); @@ -139,64 +145,83 @@ impl Game { } let tile_had_item = tile.item.is_some(); + let player_had_item = tile.item.is_some(); - interact(&self.data, edge, tile, player); - - // interact( - // &self.data, - // edge, - // tilekind, - // &mut tile.active, - // item, - // hand, - // |out| match out { - // Out::Take(index) => { - // info!("take"); - // let item = tile.items.remove(index); - // player.hand = Some(item); - // self.packet_out - // .push_back(PacketC::TakeItem { item, player: pid }) - // } - // Out::Put => { - // info!("put"); - // let hand = player.hand.take().unwrap(); - // tile.items.push(hand); - // self.packet_out - // .push_back(PacketC::PutItem { item: hand, pos }) - // } - // Out::Produce(kind) => { - // info!("produce"); - // let id = self.item_id_counter; - // self.item_id_counter += 1; - // self.items.insert(id, kind); - // tile.items.push(id); - // self.packet_out - // .push_back(PacketC::ProduceItem { id, pos, kind }); - // } - // Out::Consume(index) => { - // info!("consume"); - // let id = tile.items.remove(index); - // info!("left {:?}", tile.items); - // self.packet_out.push_back(PacketC::ConsumeItem { id, pos }); - // } - // Out::SetActive(progress) => { - // self.packet_out.push_back(PacketC::SetActive { - // tile: pos, - // progress, - // }); - // } - // }, - // ); + if let Some(effect) = interact(&self.data, edge, tile, player) { + match effect { + InteractEffect::Put => self.packet_out.push_back(PacketC::PutItem { + player: pid, + tile: pos, + }), + InteractEffect::Take => self.packet_out.push_back(PacketC::TakeItem { + player: pid, + tile: pos, + }), + InteractEffect::Produce => { + if tile_had_item { + self.packet_out + .push_back(PacketC::ConsumeItem { tile: pos }); + } + if player_had_item { + self.packet_out.push_back(PacketC::PutItem { + player: pid, + tile: pos, + }); + self.packet_out + .push_back(PacketC::ConsumeItem { tile: pos }); + } + if let Some(i) = &player.item { + self.packet_out.push_back(PacketC::ProduceItem { + tile: pos, + item: i.kind, + }); + self.packet_out.push_back(PacketC::TakeItem { + player: pid, + tile: pos, + }) + } + if let Some(i) = &tile.item { + self.packet_out.push_back(PacketC::ProduceItem { + tile: pos, + item: i.kind, + }); + } + } + } + } player.interacting = edge; } - PacketS::Collide { player, force } => {} } Ok(()) } pub fn tick(&mut self, dt: f32) { for (&pos, tile) in &mut self.tiles { + if let Some(effect) = tick_tile(dt, &self.data, tile) { + match effect { + TickEffect::Progress => self.packet_out.push_back(PacketC::SetActive { + tile: pos, + progress: tile + .item + .as_ref() + .unwrap() + .active + .as_ref() + .map(|i| i.progress), + }), + TickEffect::Produce => { + self.packet_out + .push_back(PacketC::ConsumeItem { tile: pos }); + if let Some(item) = &tile.item { + self.packet_out.push_back(PacketC::ProduceItem { + tile: pos, + item: item.kind, + }); + } + } + } + } // let items = tile.items.iter().map(|e| self.items[e]).collect::<Vec<_>>(); // tick_tile( // dt, |