aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--server/src/customer/mod.rs13
-rw-r--r--server/src/game.rs15
-rw-r--r--server/src/protocol.rs2
-rw-r--r--test-client/main.ts6
-rw-r--r--test-client/visual.ts9
5 files changed, 42 insertions, 3 deletions
diff --git a/server/src/customer/mod.rs b/server/src/customer/mod.rs
index ba65a5e2..9e474b8f 100644
--- a/server/src/customer/mod.rs
+++ b/server/src/customer/mod.rs
@@ -41,6 +41,10 @@ pub struct DemandState {
chairs: HashMap<IVec2, bool>,
customer_id_counter: PlayerID,
customers: HashMap<PlayerID, Customer>,
+
+ pub completed: usize,
+ pub failed: usize,
+ pub score_changed: bool,
}
enum CustomerState {
@@ -73,6 +77,9 @@ impl DemandState {
pub fn new(data: Arc<Gamedata>, map: &HashMap<IVec2, Tile>) -> Self {
let chair = data.get_tile_by_name("chair");
Self {
+ score_changed: true,
+ completed: 0,
+ failed: 0,
walkable: map
.iter()
.filter(|(_, v)| !data.is_tile_colliding(v.kind))
@@ -157,6 +164,8 @@ impl DemandState {
)
.expect("no path to exit");
*self.chairs.get_mut(&chair).unwrap() = true;
+ self.failed += 1;
+ self.score_changed = true;
p.state = CustomerState::Exiting { path }
} else {
let demand_data = &data.demand(*demand);
@@ -219,6 +228,8 @@ impl DemandState {
)
.ok_or(anyhow!("no path to exit"))?;
*self.chairs.get_mut(&chair).unwrap() = true;
+ self.completed += 1;
+ self.score_changed = true;
p.state = CustomerState::Exiting { path }
}
}
@@ -238,7 +249,7 @@ impl DemandState {
Ok(())
}
- pub fn select_chair(&mut self) -> Option<IVec2> {
+ fn select_chair(&mut self) -> Option<IVec2> {
use rand::seq::IteratorRandom;
let (chosen, free) = self
.chairs
diff --git a/server/src/game.rs b/server/src/game.rs
index 20f479c7..ad777584 100644
--- a/server/src/game.rs
+++ b/server/src/game.rs
@@ -188,6 +188,14 @@ impl Game {
})
}
}
+ out.push(PacketC::Score {
+ 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(),
+ });
out
}
@@ -388,6 +396,13 @@ impl Game {
if let Err(err) = demand.tick(&mut packet_out, &mut self.tiles, &self.data, dt) {
warn!("demand tick {err}");
}
+ if demand.score_changed {
+ self.packet_out.push_back(PacketC::Score {
+ demands_failed: demand.failed,
+ demands_completed: demand.completed,
+ });
+ demand.score_changed = false
+ }
for (player, packet) in packet_out {
if let Err(err) = self.packet_in(player, packet) {
warn!("demand packet {err}");
diff --git a/server/src/protocol.rs b/server/src/protocol.rs
index daa5c8af..92e2a639 100644
--- a/server/src/protocol.rs
+++ b/server/src/protocol.rs
@@ -132,7 +132,7 @@ pub enum PacketC {
},
Score {
demands_failed: usize,
- demands_complete: usize,
+ demands_completed: usize,
},
Error {
message: String,
diff --git a/test-client/main.ts b/test-client/main.ts
index c2619f6e..b0b492ce 100644
--- a/test-client/main.ts
+++ b/test-client/main.ts
@@ -99,6 +99,8 @@ export const items_removed = new Set<ItemData>()
export let data: Gamedata = { item_names: [], tile_names: [], spawn: [0, 0], tile_collide: [], tile_interact: [] }
export let my_id: PlayerID = -1
+export let demands_completed = 0
+export let demands_failed = 0
export const camera: V2 = { x: 0, y: 0 }
export let camera_scale = 0.05;
export const interact_target_anim: V2 = { x: 0, y: 0 }
@@ -191,6 +193,10 @@ function packet(p: PacketC) {
else player.message = undefined
break;
}
+ case "score":
+ demands_completed = p.demands_completed
+ demands_failed = p.demands_failed
+ break;
case "error":
console.warn(p.message)
break;
diff --git a/test-client/visual.ts b/test-client/visual.ts
index 6a02dbee..1b4363e8 100644
--- a/test-client/visual.ts
+++ b/test-client/visual.ts
@@ -15,7 +15,7 @@
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
-import { ItemData, MessageData, PlayerData, TileData, camera, camera_scale, canvas, ctx, data, get_interact_target, interact_active_anim, interact_possible_anim, interact_target_anim, items_removed, keys_down, my_id, players, tiles } from "./main.ts";
+import { ItemData, MessageData, PlayerData, TileData, camera, camera_scale, canvas, ctx, data, demands_completed, demands_failed, get_interact_target, interact_active_anim, interact_possible_anim, interact_target_anim, items_removed, keys_down, my_id, players, tiles } from "./main.ts";
import { PLAYER_SIZE } from "./movement.ts";
import { FALLBACK_TILE, ITEMS, TILES, FALLBACK_ITEM } from "./tiles.ts";
import { V2, ceil_v2, floor_v2 } from "./util.ts";
@@ -74,6 +74,13 @@ export function draw_ingame() {
ctx.restore()
+ ctx.fillStyle = "white"
+ ctx.textAlign = "left"
+ ctx.textBaseline = "bottom"
+ ctx.font = "20px sans-serif"
+ ctx.fillText(`Completed: ${demands_completed}`, 10, canvas.height - 10)
+ ctx.fillText(`Failed: ${demands_failed}`, 10, canvas.height - 30)
+
if (keys_down.has("KeyP")) {
draw_debug()
}