diff --git a/client/svelte-client/src/App.svelte b/client/svelte-client/src/App.svelte
index 49af7f9..339a0e8 100644
--- a/client/svelte-client/src/App.svelte
+++ b/client/svelte-client/src/App.svelte
@@ -68,7 +68,7 @@
diff --git a/client/svelte-client/src/components/InstrumentedTickWrapper.svelte b/client/svelte-client/src/components/InstrumentedTickWrapper.svelte
index e803b93..c244c9d 100644
--- a/client/svelte-client/src/components/InstrumentedTickWrapper.svelte
+++ b/client/svelte-client/src/components/InstrumentedTickWrapper.svelte
@@ -1,15 +1,19 @@
{#if session && sessionInputs}
-
+
{/if}
diff --git a/client/svelte-client/src/components/Score.svelte b/client/svelte-client/src/components/Score.svelte
index 035c13d..172fd3f 100644
--- a/client/svelte-client/src/components/Score.svelte
+++ b/client/svelte-client/src/components/Score.svelte
@@ -1,7 +1,6 @@
-
+
diff --git a/client/svelte-client/src/store/engine.ts b/client/svelte-client/src/store/engine.ts
index 05d28af..703427a 100644
--- a/client/svelte-client/src/store/engine.ts
+++ b/client/svelte-client/src/store/engine.ts
@@ -68,7 +68,7 @@ export type GameFieldState = {
export type GameFieldStore = Readable & {tick: (inputs: Input[], dt: number) => void, update: (objects: GameObject[], state: GameState) => void};
function createGameFieldStore(): GameFieldStore {
- const {subscribe, set} = writable({ts: 0, objects: [], state: {score: {player1: 0, player2: 0}}});
+ const {subscribe, set} = writable({ts: 0, objects: [], state: {score: {player_1: 0, player_2: 0}}});
const field = FieldWrapper.new();
diff --git a/client/svelte-client/src/store/model/event.ts b/client/svelte-client/src/store/model/event.ts
index 4228258..0c712a6 100644
--- a/client/svelte-client/src/store/model/event.ts
+++ b/client/svelte-client/src/store/model/event.ts
@@ -1,4 +1,4 @@
-import type {GameObject, NetworkSession, Session} from "./session";
+import type {GameObject, GameState, NetworkSession, Session} from "./session";
import type {Input} from "./input";
export type SessionEventPayload = {
@@ -28,6 +28,11 @@ export type TickEventPayload = {
ts: number
}
+export type StatusEventPayload = {
+ session_id: string,
+ state: GameState
+}
+
export type SessionEvenWrapper = {
topic: 'session',
event: SessionEventPayload
@@ -48,7 +53,12 @@ export type MoveEventWrapper = {
event: GameObject
}
-export type GameEventWrapper = SessionEvenWrapper | InputEventWrapper | MoveEventWrapper | TickEventWrapper;
+export type StatusEventWrapper = {
+ topic: 'status',
+ event: StatusEventPayload
+}
+
+export type GameEventWrapper = SessionEvenWrapper | InputEventWrapper | MoveEventWrapper | TickEventWrapper | StatusEventWrapper;
export const isSessionEvent = (event: GameEventWrapper): event is SessionEvenWrapper => {
return event.topic === 'session';
@@ -65,3 +75,7 @@ export const isMoveEvent = (event: GameEventWrapper): event is MoveEventWrapper
export const isTickEvent = (event: GameEventWrapper): event is TickEventWrapper => {
return event.topic === 'tick';
}
+
+export const isStatusEvent = (event: GameEventWrapper): event is StatusEventWrapper => {
+ return event.topic === 'status';
+}
diff --git a/client/svelte-client/src/store/model/session.ts b/client/svelte-client/src/store/model/session.ts
index 574e39a..bfb2ccd 100644
--- a/client/svelte-client/src/store/model/session.ts
+++ b/client/svelte-client/src/store/model/session.ts
@@ -63,8 +63,8 @@ export function isLocalSession(session: Session): session is LocalSession {
}
export type GameScore = {
- player1: number,
- player2: number,
+ player_1: number,
+ player_2: number,
}
export type GameState = {
diff --git a/client/svelte-client/src/store/session.ts b/client/svelte-client/src/store/session.ts
index 50dd83f..0a81176 100644
--- a/client/svelte-client/src/store/session.ts
+++ b/client/svelte-client/src/store/session.ts
@@ -1,15 +1,21 @@
import {derived, get, Readable, readable, Unsubscriber, writable} from "svelte/store";
import api from "../api/session";
-import type {LocalSession, Message, NetworkSession, Session, SessionSnapshot} from "./model/session";
+import type {GameState, LocalSession, Message, NetworkSession, Session, SessionSnapshot} from "./model/session";
import {isLocalSession, isNetworkSession, MessageType, SessionState, SessionType} from "./model/session";
import type {NetworkStore} from "./network";
-import type {GameEventWrapper, InputEventPayload, SessionEventPayload, TickEventPayload} from "./model/event";
-import {isInputEvent, isMoveEvent, isSessionEvent, isTickEvent} from "./model/event";
+import type {
+ GameEventWrapper,
+ InputEventPayload,
+ SessionEventPayload,
+ StatusEventPayload,
+ TickEventPayload
+} from "./model/event";
+import {isInputEvent, isMoveEvent, isSessionEvent, isStatusEvent, isTickEvent} from "./model/event";
import {getPlayerKeyboardInputs, playerKeyboardInputs} from "./input";
import type {Subscriber} from "svelte/types/runtime/store";
import {combined} from "./utils";
import type {Input} from "./model/input";
-import {init, tick} from "svelte/internal";
+import {init, subscribe, tick} from "svelte/internal";
const sessionStore = writable(null);
@@ -134,6 +140,30 @@ export const networkSessionStateEvents = readable([], set
}
});
+export const gameStateEvents = (function() {
+ const lastEvent = writable(null);
+ const unsubNetworkEvents = networkEvents.subscribe($events => {
+ const events = $events.filter(isStatusEvent);
+ if (!events.length) {
+ return;
+ }
+ const latest = events[events.length - 1];
+ lastEvent.set(latest.event);
+ })
+
+ const customSubscribe = (run: Subscriber, invalidate): Unsubscriber => {
+ const unsub = lastEvent.subscribe(run, invalidate);
+ return () => {
+ unsub();
+ unsubNetworkEvents();
+ }
+ }
+
+ return {
+ subscribe: customSubscribe
+ }
+}())
+
export type NetworkTickEventState = {
hasNext: boolean;
events: TickEventPayload[]
diff --git a/server/src/event.rs b/server/src/event.rs
index 6d4ff20..5564e72 100644
--- a/server/src/event.rs
+++ b/server/src/event.rs
@@ -29,7 +29,7 @@ pub enum PongEvent {
#[derive(Debug, Serialize, Deserialize)]
pub struct MoveEventPayload {
pub session_id: String,
- pub id: i32,
+ pub id: String,
pub orientation_x: f64,
pub orientation_y: f64,
pub shape_param_1: f64,
diff --git a/server/src/websocket_handler.rs b/server/src/websocket_handler.rs
index 51e2427..c8a5497 100644
--- a/server/src/websocket_handler.rs
+++ b/server/src/websocket_handler.rs
@@ -455,7 +455,7 @@ struct ObserverSessionSnapshotDTO {
#[derive(Deserialize)]
struct GameObjectStateDTO {
- pub id: i32,
+ pub id: String,
pub orientation_x: f64,
pub orientation_y: f64,
pub shape_param_1: f64,
@@ -471,7 +471,7 @@ impl GameObjectStateDTO {
MoveEventPayload {
session_id: session_id.to_owned(),
ts,
- id: self.id,
+ id: self.id.clone(),
x: self.x,
y: self.y,
orientation_x: self.orientation_x,