diff options
Diffstat (limited to 'server/src/game.rs')
-rw-r--r-- | server/src/game.rs | 133 |
1 files changed, 67 insertions, 66 deletions
diff --git a/server/src/game.rs b/server/src/game.rs index a9ee8f3d..a7a07881 100644 --- a/server/src/game.rs +++ b/server/src/game.rs @@ -1,60 +1,81 @@ -use crate::protocol::{Item, PacketC, PacketS, Tile, ID}; +use crate::{ + protocol::{ItemID, ItemIndex, PacketC, PacketS, PlayerID, TileIndex}, + recipes::Gamedata, +}; use anyhow::{anyhow, Result}; use glam::IVec2; -use log::info; -use std::collections::{HashMap, VecDeque}; +use std::{ + collections::{HashMap, VecDeque}, + ops::Deref, + sync::Arc, +}; -struct TileData { - kind: Tile, - items: Vec<ID>, +pub struct Tile { + kind: TileIndex, + items: Vec<ItemID>, active: bool, progress: f32, } struct Player { name: String, - hand: Option<ID>, + hand: Option<ItemID>, } -#[derive(Default)] pub struct Game { - item_id_counter: ID, - tiles: HashMap<IVec2, TileData>, - items: HashMap<ID, Item>, - players: HashMap<ID, Player>, + data: Arc<Gamedata>, + item_id_counter: ItemID, + tiles: HashMap<IVec2, Tile>, + items: HashMap<ItemID, ItemIndex>, + players: HashMap<PlayerID, Player>, packet_out: VecDeque<PacketC>, } impl Game { - pub fn new() -> Self { - let mut g = Self::default(); + pub fn new(gamedata: Arc<Gamedata>) -> Self { + let mut g = Self { + data: gamedata.clone(), + item_id_counter: 0, + items: Default::default(), + packet_out: Default::default(), + players: Default::default(), + tiles: Default::default(), + }; for x in -5..5 { for y in -5..5 { g.tiles - .insert(IVec2 { x, y }, Tile("floor".to_string()).into()); + .insert(IVec2 { x, y }, gamedata.get_tile("floor").unwrap().into()); } } for x in -5..5 { - g.tiles - .insert(IVec2 { x, y: -5 }, Tile("table".to_string()).into()); - g.tiles - .insert(IVec2 { x, y: 4 }, Tile("table".to_string()).into()); + g.tiles.insert( + IVec2 { x, y: -5 }, + gamedata.get_tile("table").unwrap().into(), + ); + g.tiles.insert( + IVec2 { x, y: 4 }, + gamedata.get_tile("table").unwrap().into(), + ); } for y in -5..5 { - g.tiles - .insert(IVec2 { x: -5, y }, Tile("table".to_string()).into()); - g.tiles - .insert(IVec2 { x: 4, y }, Tile("table".to_string()).into()); + g.tiles.insert( + IVec2 { x: -5, y }, + gamedata.get_tile("table").unwrap().into(), + ); + g.tiles.insert( + IVec2 { x: 4, y }, + gamedata.get_tile("table").unwrap().into(), + ); } g.tiles.extend( - [([-5, 1], "pan"), ([-5, 2], "pan"), ([4, 3], "flour_bag")].map(|(k, v)| { + [([-5, 1], "pan"), ([-5, 2], "pan"), ([4, 3], "meat-spawn")].map(|(k, v)| { ( IVec2::from_array(k), - TileData { + Tile { active: false, items: vec![], - kind: Tile(v.to_string()).into(), + kind: gamedata.get_tile(v).unwrap().into(), progress: 0., }, ) @@ -68,7 +89,7 @@ impl Game { self.packet_out.pop_front() } - pub fn prime_client(&self, id: ID) -> Vec<PacketC> { + pub fn prime_client(&self, id: PlayerID) -> Vec<PacketC> { let mut out = Vec::new(); for (&id, player) in &self.players { out.push(PacketC::AddPlayer { @@ -90,11 +111,14 @@ impl Game { }) } } - out.push(PacketC::Joined { id }); + out.push(PacketC::Joined { + id, + data: self.data.deref().to_owned(), + }); out } - pub fn packet_in(&mut self, player: ID, packet: PacketS) -> Result<()> { + pub fn packet_in(&mut self, player: PlayerID, packet: PacketS) -> Result<()> { match packet { PacketS::Join { name } => { self.players.insert( @@ -126,50 +150,27 @@ impl Game { .push_back(PacketC::Position { player, pos, rot }); } PacketS::Interact { pos, edge } => { - if !edge { - return Ok(()); - } - 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 tile.kind.0 == "flour_bag" { - info!("new flour"); - let item = Item("flour".to_string()); - self.items.insert(self.item_id_counter, item.clone()); - tile.items.push(self.item_id_counter); - self.packet_out.push_back(PacketC::ProduceItem { - id: self.item_id_counter, - pos, - kind: item, - }); - self.item_id_counter += 1; - } - if let Some(item) = player_data.hand.take() { - info!("put {item}"); - tile.items.push(item); - self.packet_out.push_back(PacketC::PutItem { item, pos }) - } else { - if let Some(item) = tile.items.pop() { - info!("take {item}"); - player_data.hand = Some(item); - self.packet_out - .push_back(PacketC::TakeItem { item, player }) - } - } + // if let Some(item) = player_data.hand.take() { + // info!("put {item}"); + // tile.items.push(item); + // self.packet_out.push_back(PacketC::PutItem { item, pos }) + // } else { + // if let Some(item) = tile.items.pop() { + // info!("take {item}"); + // player_data.hand = Some(item); + // self.packet_out + // .push_back(PacketC::TakeItem { item, player }) + // } + // } } } Ok(()) } } -impl From<Tile> for TileData { - fn from(kind: Tile) -> Self { +impl From<TileIndex> for Tile { + fn from(kind: TileIndex) -> Self { Self { kind, progress: 0., |