aboutsummaryrefslogtreecommitdiff
path: root/server/src/game.rs
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/game.rs')
-rw-r--r--server/src/game.rs133
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.,