diff options
Diffstat (limited to 'server/src/game.rs')
| -rw-r--r-- | server/src/game.rs | 89 | 
1 files changed, 81 insertions, 8 deletions
| diff --git a/server/src/game.rs b/server/src/game.rs index 458a796b..fbbab0a4 100644 --- a/server/src/game.rs +++ b/server/src/game.rs @@ -1,9 +1,10 @@ -use crate::protocol::{Item, PacketC, PacketS, ID}; +use crate::protocol::{Item, PacketC, PacketS, Tile, ID};  use anyhow::{anyhow, Result}; -use glam::UVec2; +use glam::IVec2;  use std::collections::{HashMap, VecDeque};  struct TileData { +    kind: Tile,      items: Vec<ID>,      active: bool,  } @@ -16,7 +17,7 @@ struct Player {  #[derive(Default)]  pub struct Game {      item_id_counter: ID, -    tiles: HashMap<UVec2, TileData>, +    tiles: HashMap<IVec2, TileData>,      items: HashMap<ID, Item>,      players: HashMap<ID, Player>,      packet_out: VecDeque<PacketC>, @@ -24,13 +25,72 @@ pub struct Game {  impl Game {      pub fn new() -> Self { -        Self::default() +        let mut g = Self::default(); +        for x in -5..5 { +            for y in -5..5 { +                g.tiles.insert(IVec2 { x, y }, Tile::Floor.into()); +            } +        } +        for x in -5..5 { +            g.tiles.insert(IVec2 { x, y: -5 }, Tile::Table.into()); +            g.tiles.insert(IVec2 { x, y: 4 }, Tile::Table.into()); +        } +        for y in -5..5 { +            g.tiles.insert(IVec2 { x: -5, y }, Tile::Table.into()); +            g.tiles.insert(IVec2 { x: 4, y }, Tile::Table.into()); +        } + +        g.tiles.extend( +            [ +                ([-5, 1], Tile::Pan), +                ([-5, 2], Tile::Pan), +                ([4, 3], Tile::Pan), +            ] +            .map(|(k, v)| { +                ( +                    IVec2::from_array(k), +                    TileData { +                        active: false, +                        items: vec![], +                        kind: v, +                    }, +                ) +            }), +        ); + +        g      }      pub fn packet_out(&mut self) -> Option<PacketC> {          self.packet_out.pop_front()      } +    pub fn prime_client(&self, id: ID) -> Vec<PacketC> { +        let mut out = Vec::new(); +        for (&id, player) in &self.players { +            out.push(PacketC::AddPlayer { +                id, +                name: player.name.clone(), +                hand: player.hand.map(|i| (i, self.items[&i])), +            }) +        } +        for (&pos, tdata) in &self.tiles { +            out.push(PacketC::UpdateMap { +                pos, +                tile: tdata.kind, +            }); +            for &id in &tdata.items { +                out.push(PacketC::ProduceItem { +                    id, +                    pos, +                    kind: self.items[&id], +                }) +            } +        } +        out.push(PacketC::Joined { id }); +        out +    } +      pub fn packet_in(&mut self, player: ID, packet: PacketS) -> Result<()> {          match packet {              PacketS::Join { name } => { @@ -41,16 +101,19 @@ impl Game {                          name: name.clone(),                      },                  ); -                self.packet_out -                    .push_back(PacketC::AddPlayer { id: player, name }); +                self.packet_out.push_back(PacketC::AddPlayer { +                    id: player, +                    name, +                    hand: None, +                });              }              PacketS::Leave => {                  let p = self                      .players                      .remove(&player)                      .ok_or(anyhow!("player does not exist"))?; -                if let Some(_i) = p.hand { -                    // TODO what now? +                if let Some(id) = p.hand { +                    self.items.remove(&id).expect("hand item lost");                  }                  self.packet_out                      .push_back(PacketC::RemovePlayer { id: player }) @@ -84,3 +147,13 @@ impl Game {          Ok(())      }  } + +impl From<Tile> for TileData { +    fn from(kind: Tile) -> Self { +        Self { +            kind, +            active: false, +            items: vec![], +        } +    } +} | 
