diff --git a/client/public/version.js b/client/public/version.js index b4846c6..59ed5ba 100644 --- a/client/public/version.js +++ b/client/public/version.js @@ -1,5 +1,5 @@ // Maintainer-controlled web client version. // Format: YYYY.MM.DD Rn (example: 2026.02.20 R2) -window.CHGRID_WEB_VERSION = "2026.02.22 R175"; +window.CHGRID_WEB_VERSION = "2026.02.22 R176"; // Optional display timezone for timestamps. Falls back to America/Detroit if unset/invalid. window.CHGRID_TIME_ZONE = "America/Detroit"; diff --git a/client/src/main.ts b/client/src/main.ts index d48e604..e2f3a8c 100644 --- a/client/src/main.ts +++ b/client/src/main.ts @@ -1110,7 +1110,7 @@ function handleMovement(): void { persistPlayerPosition(); state.player.lastMoveTime = now; void refreshAudioSubscriptions(true); - void audio.playSample(randomFootstepUrl(), FOOTSTEP_GAIN, 40); + void audio.playSample(randomFootstepUrl(), FOOTSTEP_GAIN, 100); signaling.send({ type: 'update_position', x: nextX, y: nextY }); const namesOnTile = getPeerNamesAtPosition(nextX, nextY); diff --git a/client/src/session/connectionFlow.ts b/client/src/session/connectionFlow.ts index 5385fca..9e836cb 100644 --- a/client/src/session/connectionFlow.ts +++ b/client/src/session/connectionFlow.ts @@ -1,5 +1,7 @@ import type { GameState } from '../state/gameState'; +const WELCOME_TIMEOUT_MS = 8_000; + type DomRefs = { preconnectNickname: HTMLInputElement; nicknameContainer: HTMLDivElement; @@ -103,6 +105,16 @@ export async function runConnectFlow(deps: ConnectFlowDeps): Promise { try { await deps.signalingConnect(deps.onMessage); + window.setTimeout(() => { + if (deps.state.running || !deps.mediaIsConnecting()) { + return; + } + deps.mediaStopLocalMedia(); + deps.signalingDisconnect(); + deps.mediaSetConnecting(false); + deps.updateConnectAvailability(); + deps.updateStatus('Connect failed. Timed out waiting for server welcome.'); + }, WELCOME_TIMEOUT_MS); } catch (error) { console.error(error); deps.mediaStopLocalMedia();