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.rs104
1 files changed, 49 insertions, 55 deletions
diff --git a/server/src/game.rs b/server/src/game.rs
index 54266351..274a1917 100644
--- a/server/src/game.rs
+++ b/server/src/game.rs
@@ -19,7 +19,9 @@ use crate::{
customer::DemandState,
data::Gamedata,
interaction::{interact, tick_tile, InteractEffect, TickEffect},
- protocol::{ItemIndex, Message, PacketC, PacketS, PlayerID, RecipeIndex, TileIndex},
+ protocol::{
+ ItemIndex, ItemLocation, Message, PacketC, PacketS, PlayerID, RecipeIndex, TileIndex,
+ },
};
use anyhow::{anyhow, bail, Result};
use glam::{IVec2, Vec2};
@@ -65,6 +67,7 @@ pub struct Game {
pub players: HashMap<PlayerID, Player>,
packet_out: VecDeque<PacketC>,
demand: Option<DemandState>,
+ score_changed: bool,
pub points: i64,
end: Option<Instant>,
}
@@ -78,6 +81,7 @@ impl Game {
tiles: Default::default(),
demand: None,
end: None,
+ score_changed: false,
points: 0,
}
}
@@ -166,8 +170,8 @@ impl Game {
name: player.name.clone(),
});
if let Some(item) = &player.item {
- out.push(PacketC::SetPlayerItem {
- player: id,
+ out.push(PacketC::SetItem {
+ location: ItemLocation::Player(id),
item: Some(item.kind),
})
}
@@ -191,8 +195,8 @@ impl Game {
kind: Some(tdata.kind.clone()),
});
if let Some(item) = &tdata.item {
- out.push(PacketC::SetTileItem {
- tile,
+ out.push(PacketC::SetItem {
+ location: ItemLocation::Tile(tile),
item: Some(item.kind),
})
}
@@ -250,8 +254,8 @@ impl Game {
let pos = p.position.floor().as_ivec2();
if let Some(tile) = self.tiles.get_mut(&pos) {
if tile.item.is_none() {
- self.packet_out.push_back(PacketC::SetTileItem {
- tile: pos,
+ self.packet_out.push_back(PacketC::SetItem {
+ location: ItemLocation::Tile(pos),
item: Some(item.kind),
});
tile.item = Some(item);
@@ -325,76 +329,59 @@ impl Game {
if let Some(effect) = interact(
&self.data,
edge,
- tile.kind,
+ Some(tile.kind),
&mut tile.item,
&mut player.item,
&mut self.points,
) {
match effect {
- InteractEffect::Put => self.packet_out.push_back(PacketC::PutItem {
- player: pid,
- tile: pos,
+ InteractEffect::Put => self.packet_out.push_back(PacketC::MoveItem {
+ from: ItemLocation::Player(pid),
+ to: ItemLocation::Tile(pos),
}),
- InteractEffect::Take => self.packet_out.push_back(PacketC::TakeItem {
- player: pid,
- tile: pos,
+ InteractEffect::Take => self.packet_out.push_back(PacketC::MoveItem {
+ from: ItemLocation::Tile(pos),
+ to: ItemLocation::Player(pid),
}),
InteractEffect::Produce => {
if tile_had_item {
- self.packet_out.push_back(PacketC::SetActive {
- tile: pos,
+ self.packet_out.push_back(PacketC::SetProgress {
+ item: ItemLocation::Tile(pos),
progress: None,
warn: false,
});
- self.packet_out.push_back(PacketC::SetTileItem {
- tile: pos,
+ self.packet_out.push_back(PacketC::SetItem {
+ location: ItemLocation::Tile(pos),
item: None,
});
}
if player_had_item {
- self.packet_out.push_back(PacketC::PutItem {
- player: pid,
- tile: pos,
+ self.packet_out.push_back(PacketC::MoveItem {
+ from: ItemLocation::Player(pid),
+ to: ItemLocation::Tile(pos),
});
- self.packet_out.push_back(PacketC::SetTileItem {
- tile: pos,
+ self.packet_out.push_back(PacketC::SetItem {
+ location: ItemLocation::Tile(pos),
item: None,
});
}
if let Some(i) = &player.item {
- self.packet_out.push_back(PacketC::SetTileItem {
- tile: pos,
+ self.packet_out.push_back(PacketC::SetItem {
+ location: ItemLocation::Tile(pos),
item: Some(i.kind),
});
- self.packet_out.push_back(PacketC::TakeItem {
- player: pid,
- tile: pos,
+ self.packet_out.push_back(PacketC::MoveItem {
+ from: ItemLocation::Tile(pos),
+ to: ItemLocation::Player(pid),
})
}
if let Some(i) = &tile.item {
- self.packet_out.push_back(PacketC::SetTileItem {
- tile: pos,
+ self.packet_out.push_back(PacketC::SetItem {
+ location: ItemLocation::Tile(pos),
item: Some(i.kind),
});
}
- self.packet_out.push_back({
- PacketC::Score {
- time_remaining: self
- .end
- .map(|t| (t - Instant::now()).as_secs_f32()),
- points: self.points,
- demands_failed: self
- .demand
- .as_ref()
- .map(|d| d.failed)
- .unwrap_or_default(),
- demands_completed: self
- .demand
- .as_ref()
- .map(|d| d.completed)
- .unwrap_or_default(),
- }
- })
+ self.score_changed = true
}
}
}
@@ -423,10 +410,17 @@ impl Game {
kind: i,
active: None,
});
- self.packet_out
- .push_back(PacketC::SetPlayerItem { player, item })
+ self.packet_out.push_back(PacketC::SetItem {
+ location: ItemLocation::Player(player),
+ item,
+ })
}
}
+
+ if self.score_changed {
+ self.score_changed = false;
+ self.packet_out.push_back(self.score())
+ }
Ok(())
}
@@ -455,11 +449,11 @@ impl Game {
}
for (&pos, tile) in &mut self.tiles {
- if let Some(effect) = tick_tile(dt, &self.data, tile) {
+ if let Some(effect) = tick_tile(dt, &self.data, Some(tile.kind), &mut tile.item) {
match effect {
- TickEffect::Progress(warn) => self.packet_out.push_back(PacketC::SetActive {
+ TickEffect::Progress(warn) => self.packet_out.push_back(PacketC::SetProgress {
warn,
- tile: pos,
+ item: ItemLocation::Tile(pos),
progress: tile
.item
.as_ref()
@@ -469,8 +463,8 @@ impl Game {
.map(|i| i.progress),
}),
TickEffect::Produce => {
- self.packet_out.push_back(PacketC::SetTileItem {
- tile: pos,
+ self.packet_out.push_back(PacketC::SetItem {
+ location: ItemLocation::Tile(pos),
item: tile.item.as_ref().map(|i| i.kind),
});
}