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., | 
