diff options
| -rw-r--r-- | server/src/customer/mod.rs | 13 | ||||
| -rw-r--r-- | server/src/game.rs | 15 | ||||
| -rw-r--r-- | server/src/protocol.rs | 2 | ||||
| -rw-r--r-- | test-client/main.ts | 6 | ||||
| -rw-r--r-- | test-client/visual.ts | 9 | 
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()      } | 
