refactoring

This commit is contained in:
Thilo Behnke
2022-06-28 22:35:54 +02:00
parent 45a977921e
commit ff31e0618e
8 changed files with 64 additions and 60 deletions

View File

@@ -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>

View File

@@ -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;

View 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);
})
})

View File

@@ -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 },

View File

@@ -0,0 +1,6 @@
export type Input = {
input: 'UP' | 'DOWN',
obj_id: number,
player: number
}

View File

@@ -1,4 +1,4 @@
import type {Input} from "../session";
import type {Input} from "./input";
export enum SessionState {
PENDING = 'PENDING', RUNNING = 'RUNNING', CLOSED = 'CLOSED'

View File

@@ -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)])
})

View File

@@ -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));