Player minimum of 3 to start a game or scene

Enforced server-side in lobby/start and confirm_scene_setup via
crud_base.has_min_players; Dev Mode bypasses it so local single-player
testing still works. Lobby and scene-setup UIs show a player-count
message instead of the start button when below the minimum.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-06-12 16:16:49 -07:00
parent 5ad9c9db07
commit 121f2f7498
7 changed files with 94 additions and 6 deletions

View File

@@ -74,14 +74,14 @@
<div class="lobby-action">
{#if state.player.is_admin}
{#if state.players.length >= 1}
<button on:click={startGame}
{#if state.players.length >= 3 || state.game.dev_mode}
<button on:click={startGame}
disabled={starting}
class="btn btn-primary btn-large glow-effect">
{starting ? 'Starting...' : 'Start Character Creation'}
</button>
{:else}
<button class="btn btn-primary btn-large" disabled>Waiting for players...</button>
<button class="btn btn-primary btn-large" disabled>Waiting for players... ({state.players.length}/3 minimum)</button>
{/if}
{:else}
<div class="waiting-indicator">

View File

@@ -44,7 +44,8 @@
$: allRolesAssigned = state.players.every(p => p.role !== null || p.needs_reroll);
$: deepPlayer = state.players.find(p => p.role === 'deep');
$: piratPlayer = state.players.find(p => p.role === 'pirat');
$: canStart = allRolesAssigned && deepPlayer && piratPlayer && (state.player.is_admin || state.player.role === 'deep');
$: enoughPlayers = state.players.length >= 3 || state.game.dev_mode;
$: canStart = enoughPlayers && allRolesAssigned && deepPlayer && piratPlayer && (state.player.is_admin || state.player.role === 'deep');
</script>
<div class="scene-setup-view text-center">
@@ -137,6 +138,8 @@
class="btn btn-primary btn-large glow-effect">
{starting ? 'Starting Scene...' : 'Confirm Roles & Shuffle Deck'}
</button>
{:else if !enoughPlayers}
<p class="text-danger italic mt-4">You need at least 3 players to start a scene — share the join link!</p>
{:else if !allRolesAssigned}
<p class="text-muted italic mt-4">Waiting for all players to choose a role...</p>
{:else if !deepPlayer}