From f3405890721b5092d60cd7a470e3711c4b86e204 Mon Sep 17 00:00:00 2001 From: metamuffin Date: Sun, 16 Jun 2024 21:58:21 +0200 Subject: stuff --- src/game.rs | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 src/game.rs (limited to 'src/game.rs') diff --git a/src/game.rs b/src/game.rs new file mode 100644 index 00000000..0d1e8c3b --- /dev/null +++ b/src/game.rs @@ -0,0 +1,88 @@ +use crate::protocol::{Item, PacketC, PacketS, ID}; +use anyhow::{anyhow, Result}; +use glam::UVec2; +use std::collections::{HashMap, VecDeque}; + +struct ItemData {} + +struct TileData { + items: Vec, + active: bool, +} + +struct Player { + name: String, + hand: Option, +} + +#[derive(Default)] +pub struct Game { + item_id_counter: ID, + tiles: HashMap, + items: HashMap, + players: HashMap, + packet_out: VecDeque, +} + +impl Game { + pub fn new() -> Self { + Self::default() + } + + pub fn packet_out(&mut self) -> Option { + self.packet_out.pop_front() + } + + pub fn packet_in(&mut self, player: ID, packet: PacketS) -> Result<()> { + match packet { + PacketS::Join { name } => { + self.players.insert( + player, + Player { + hand: None, + name: name.clone(), + }, + ); + self.packet_out + .push_back(PacketC::AddPlayer { id: player, name }); + } + PacketS::Leave => { + let p = self + .players + .remove(&player) + .ok_or(anyhow!("player does not exist"))?; + if let Some(_i) = p.hand { + // TODO what now? + } + self.packet_out + .push_back(PacketC::RemovePlayer { id: player }) + } + PacketS::Position { pos, rot } => { + self.packet_out + .push_back(PacketC::Position { player, pos, rot }); + } + PacketS::Interact { pos } => { + let tile = self + .tiles + .get_mut(&pos) + .ok_or(anyhow!("interacting with empty tile"))?; + let player_data = self + .players + .get_mut(&player) + .ok_or(anyhow!("player does not exist"))?; + + if let Some(item) = player_data.hand.take() { + tile.items.push(item); + self.packet_out.push_back(PacketC::PutItem { item, pos }) + } else { + if let Some(item) = tile.items.pop() { + player_data.hand = Some(item); + self.packet_out + .push_back(PacketC::TakeItem { item, player }) + } + } + } + } + Ok(()) + } +} -- cgit v1.2.3-70-g09d2