Add game join UI and OnlineGame scaffold

Rename JoinMenu to GameJoinMenu and add a JoinGameObject model + OTP input for entering a 6-digit game code. Introduce a new JoinGameObject interface file. Update OnlineMode.vue to import and render GameJoinMenu and GameEndedMenu, add refs for joiningModel, game, gameField, currentSelectionIndex and gameEndedInformation, wire create/ join handlers (stubbed) and the main game view (Field and InfoField). Refactor LocalGame to OnlineGame, export it as default and add a stubbed drop method; adjust import path formatting. Several functions remain as stubs to be implemented in follow-up commits.
This commit is contained in:
2026-03-08 20:33:21 +01:00
committed by Jonas
parent a5019fc27a
commit 466c1c387d
4 changed files with 70 additions and 6 deletions
+41 -1
View File
@@ -1,7 +1,12 @@
<script setup lang="ts">
import CreateOrJoinMenu from '@/components/CreateOrJoinMenu.vue';
import GameCreationMenu from '@/components/GameCreationMenu.vue';
import GameEndedMenu from '@/components/GameEndedMenu.vue';
import GameJoinMenu from '@/components/GameJoinMenu.vue';
import type { GameSettings } from '@/scripts/interfaces/GameSettings';
import type JoinGameObject from '@/scripts/interfaces/JoinGameObject';
import OnlineGame from '@/scripts/logic/onlineMode/OnlineGame';
import type { GameEnded } from '@/scripts/logic/signalR/GameConnection';
import { ref } from 'vue';
enum CurrentState {
@@ -18,7 +23,19 @@ let settings = ref<GameSettings>({
fieldSize: { x: 7, y: 6 },
});
let joiningModel = ref<JoinGameObject>({
failed: false,
});
var currentState = ref<CurrentState>(CurrentState.CreateOrJoinSelection);
const game = ref<OnlineGame>(new OnlineGame(settings.value));
const gameField = ref<number[][]>([]);
const currentSelectionIndex = ref<number | null>(null);
const gameEndedInformation = ref<GameEnded | null>(null);
async function createGame() {}
async function tryToJoin() {}
</script>
<template>
@@ -30,9 +47,32 @@ var currentState = ref<CurrentState>(CurrentState.CreateOrJoinSelection);
<GameCreationMenu
v-model:settings="settings"
@create-game="console.log('create game')"
@create-game="createGame()"
v-if="currentState === CurrentState.CreatingGame"
/>
<GameJoinMenu
:joinGameObject="joiningModel"
v-if="currentState === CurrentState.JoiningGame"
@join="tryToJoin()"
/>
<GameEndedMenu
:game-ended-information="gameEndedInformation"
v-else-if="currentState === CurrentState.EndScreen"
></GameEndedMenu>
<div id="game" v-else>
<div class="game-content">
<Field
:game-state="gameField"
v-model:current-selection-index="currentSelectionIndex"
@click-on-game-field="game.drop(currentSelectionIndex ?? 1)"
/>
<InfoField :msg="game.currentDescription"></InfoField>
</div>
</div>
</template>
<style scoped></style>