mirror of
https://github.com/thilo-behnke/wasm-pong.git
synced 2026-07-12 11:09:38 +00:00
refactoring
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
<script lang="ts">
|
||||
import {sessionInputs} from "../store/session";
|
||||
import type {LocalSession, Session} from "../store/model/session";
|
||||
import type {LocalSession} from "../store/model/session";
|
||||
|
||||
export let session: LocalSession;
|
||||
</script>
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
<script lang="ts">
|
||||
|
||||
import {keyboardInputs, networkEvents, networkSessionStateEvents, sessionInputs} from "../store/session";
|
||||
import {networkEvents, networkSessionStateEvents, sessionInputs} from "../store/session";
|
||||
import type {NetworkSession} from "../store/model/session";
|
||||
import {SessionState, SessionType} from "../store/model/session";
|
||||
import CopyToClipboard from "./CopyToClipboard.svelte";
|
||||
import api from "../api/session";
|
||||
import {playerKeyboardInputs} from "../store/input";
|
||||
|
||||
export let session: NetworkSession;
|
||||
let joinLink;
|
||||
@@ -12,7 +13,7 @@
|
||||
let cachedSessionId;
|
||||
|
||||
let relevantKeyboardEvents;
|
||||
$: relevantKeyboardEvents = $keyboardInputs.filter(({player}) => player === session.you.nr);
|
||||
$: relevantKeyboardEvents = $playerKeyboardInputs.filter(({player}) => player === session.you.nr);
|
||||
|
||||
$: if(!cachedSessionId && session) {
|
||||
cachedSessionId = session.session_id;
|
||||
|
||||
26
client/svelte-client/src/store/input.ts
Normal file
26
client/svelte-client/src/store/input.ts
Normal file
@@ -0,0 +1,26 @@
|
||||
import {derived, readable} from "svelte/store";
|
||||
import {keysPressed} from "./io";
|
||||
import type {Input} from "./model/input";
|
||||
|
||||
export const playerKeyboardInputs = derived(keysPressed, $keysPressed => {
|
||||
return $keysPressed.map((key): Input => {
|
||||
switch (key.toLowerCase()) {
|
||||
case 'w':
|
||||
return {input: 'UP', obj_id: 0, player: 1};
|
||||
case 's':
|
||||
return {input: 'DOWN', obj_id: 0, player: 1}
|
||||
case 'arrowup':
|
||||
return {input: 'UP', obj_id: 1, player: 2}
|
||||
case 'arrowdown':
|
||||
return {input: 'DOWN', obj_id: 1, player: 2}
|
||||
default:
|
||||
return null
|
||||
}
|
||||
}).filter(it => !!it);
|
||||
})
|
||||
|
||||
export const getPlayerKeyboardInputs = (player_nr: number) => readable([], set => {
|
||||
return playerKeyboardInputs.subscribe(inputs => {
|
||||
return inputs.filter(({player}) => player === player_nr);
|
||||
})
|
||||
})
|
||||
@@ -1,5 +1,5 @@
|
||||
import type {Input} from "../session";
|
||||
import type {NetworkSession, Session} from "./session";
|
||||
import type {Input} from "./input";
|
||||
|
||||
export type SessionEventPayload = {
|
||||
actor: { id: string },
|
||||
|
||||
6
client/svelte-client/src/store/model/input.ts
Normal file
6
client/svelte-client/src/store/model/input.ts
Normal file
@@ -0,0 +1,6 @@
|
||||
export type Input = {
|
||||
input: 'UP' | 'DOWN',
|
||||
obj_id: number,
|
||||
player: number
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import type {Input} from "../session";
|
||||
import type {Input} from "./input";
|
||||
|
||||
export enum SessionState {
|
||||
PENDING = 'PENDING', RUNNING = 'RUNNING', CLOSED = 'CLOSED'
|
||||
|
||||
@@ -3,46 +3,14 @@ import {keysPressed} from "./io";
|
||||
import api from "../api/session";
|
||||
import session from "../api/session";
|
||||
import type {LocalSession, Message, NetworkSession, Session, SessionSnapshot} from "./model/session";
|
||||
import {isLocalSession, MessageType, SessionState, SessionType} from "./model/session";
|
||||
import {isLocalSession, isNetworkSession, MessageType, SessionState, SessionType} from "./model/session";
|
||||
import type {NetworkStore} from "./network";
|
||||
import type {GameEventWrapper, SessionEventPayload} from "./model/event";
|
||||
import type {GameEventWrapper, InputEventPayload, InputEventWrapper, SessionEventPayload} from "./model/event";
|
||||
import {isInputEvent} from "./model/event";
|
||||
import {getPlayerKeyboardInputs, playerKeyboardInputs} from "./input";
|
||||
|
||||
const sessionStore = writable<Session>(null)
|
||||
|
||||
export type Input = {
|
||||
input: 'UP' | 'DOWN',
|
||||
obj_id: number,
|
||||
player: number
|
||||
}
|
||||
|
||||
export const keyboardInputs = derived(keysPressed, $keysPressed => {
|
||||
return $keysPressed.map((key): Input => {
|
||||
switch (key.toLowerCase()) {
|
||||
case 'w':
|
||||
return {input: 'UP', obj_id: 0, player: 1};
|
||||
case 's':
|
||||
return {input: 'DOWN', obj_id: 0, player: 1}
|
||||
case 'arrowup':
|
||||
return {input: 'UP', obj_id: 1, player: 2}
|
||||
case 'arrowdown':
|
||||
return {input: 'DOWN', obj_id: 1, player: 2}
|
||||
default:
|
||||
return null
|
||||
}
|
||||
}).filter(it => !!it);
|
||||
})
|
||||
|
||||
const player1KeyboardInputs = derived(
|
||||
keyboardInputs,
|
||||
$keyboardInputs => $keyboardInputs.filter(({player}) => player === 1)
|
||||
)
|
||||
|
||||
const player2KeyboardInputs = derived(
|
||||
keyboardInputs,
|
||||
$keyboardInputs => $keyboardInputs.filter(({player}) => player === 2)
|
||||
)
|
||||
|
||||
function createNetworkEvents() {
|
||||
const {subscribe, set, update} = writable<GameEventWrapper[]>([]);
|
||||
|
||||
@@ -143,7 +111,19 @@ const networkInputEvents = derived([networkEvents, sessionStore], ([$sessionEven
|
||||
return false;
|
||||
}
|
||||
return wrapper.event.player_id !== ($sessionStore as NetworkSession).you.id
|
||||
}).map(({event}) => event));
|
||||
}).map(({event}) => event as InputEventPayload));
|
||||
|
||||
const getPlayerNetworkInputEvents = (player_nr: number) => derived(networkInputEvents, $networkInputEvents => {
|
||||
const session = get(sessionStore);
|
||||
if (!isNetworkSession(session)) {
|
||||
return [];
|
||||
}
|
||||
const player = session.players.find(({nr}) => player_nr === nr);
|
||||
if (!player) {
|
||||
return [];
|
||||
}
|
||||
return $networkInputEvents.filter(({player_id}) => player.id === player_id);
|
||||
});
|
||||
|
||||
export const sessionInputs = readable([], function (setInputs) {
|
||||
let player1Inputs = writable([]);
|
||||
@@ -152,26 +132,17 @@ export const sessionInputs = readable([], function (setInputs) {
|
||||
|
||||
const unsubscribe = sessionStore.subscribe(session => {
|
||||
if (isLocalSession(session)) {
|
||||
const unsub1 = player1KeyboardInputs.subscribe(inputs => {
|
||||
player1Inputs.set(inputs)
|
||||
setInputs([...get(player1Inputs), ...get(player2Inputs)])
|
||||
})
|
||||
const unsub2 = player2KeyboardInputs.subscribe(inputs => {
|
||||
player2Inputs.set(inputs)
|
||||
setInputs([...get(player1Inputs), ...get(player2Inputs)])
|
||||
})
|
||||
return () => {
|
||||
unsub1();
|
||||
unsub2();
|
||||
}
|
||||
return playerKeyboardInputs.subscribe(inputs => {
|
||||
setInputs(inputs);
|
||||
});
|
||||
}
|
||||
|
||||
if (session.type === SessionType.HOST) {
|
||||
const unsub1 = player1KeyboardInputs.subscribe(inputs => {
|
||||
const unsub1 = getPlayerKeyboardInputs(1).subscribe(inputs => {
|
||||
player1Inputs.set(inputs)
|
||||
setInputs([...get(player1Inputs), ...get(player2Inputs)])
|
||||
})
|
||||
const unsub2 = networkInputEvents.subscribe(inputs => {
|
||||
const unsub2 = getPlayerNetworkInputEvents(2).subscribe(inputs => {
|
||||
player2Inputs.set(inputs)
|
||||
setInputs([...get(player1Inputs), ...get(player2Inputs)])
|
||||
})
|
||||
@@ -181,11 +152,11 @@ export const sessionInputs = readable([], function (setInputs) {
|
||||
}
|
||||
}
|
||||
if (session.type === SessionType.PEER) {
|
||||
const unsub1 = networkInputEvents.subscribe(inputs => {
|
||||
const unsub1 = getPlayerNetworkInputEvents(1).subscribe(inputs => {
|
||||
player1Inputs.set(inputs)
|
||||
setInputs([...get(player1Inputs), ...get(player2Inputs)])
|
||||
})
|
||||
const unsub2 = player2KeyboardInputs.subscribe(inputs => {
|
||||
const unsub2 = getPlayerKeyboardInputs(2).subscribe(inputs => {
|
||||
player2Inputs.set(inputs)
|
||||
setInputs([...get(player1Inputs), ...get(player2Inputs)])
|
||||
})
|
||||
@@ -195,12 +166,11 @@ export const sessionInputs = readable([], function (setInputs) {
|
||||
}
|
||||
}
|
||||
if (session.type === SessionType.OBSERVER) {
|
||||
const events = networkInputEvents;
|
||||
const unsub1 = events.subscribe(inputs => {
|
||||
const unsub1 = getPlayerNetworkInputEvents(1).subscribe(inputs => {
|
||||
player1Inputs.set(inputs)
|
||||
setInputs([...get(player1Inputs), ...get(player2Inputs)])
|
||||
})
|
||||
const unsub2 = events.subscribe(inputs => {
|
||||
const unsub2 = getPlayerNetworkInputEvents(2).subscribe(inputs => {
|
||||
player2Inputs.set(inputs)
|
||||
setInputs([...get(player1Inputs), ...get(player2Inputs)])
|
||||
})
|
||||
|
||||
@@ -197,6 +197,7 @@ impl WebsocketHandler for DefaultWebsocketHandler {
|
||||
);
|
||||
loop {
|
||||
trace(&websocket_session_write_copy, "reading messages from kafka");
|
||||
// TODO: Should perform more filtering, e.g. inputs of player are not relevant.
|
||||
let events = event_reader.read_from_session();
|
||||
if let Err(e) = events {
|
||||
error(&websocket_session_write_copy, &format!("Failed to read messages from kafka: {:?}", e));
|
||||
|
||||
Reference in New Issue
Block a user