WIP: Add multiplayer Snake game
N-player (2-8) real-time Snake game alongside Connect 4. Lobby has tabs to switch between games. Players join via invite link with 10-second countdown. Game loop runs at tick-based intervals with NATS pub/sub for state sync. Keyboard input not yet working (Datastar keydown binding issue still under investigation).
This commit is contained in:
@@ -15,7 +15,7 @@ WHERE id = ?;
|
||||
DELETE FROM games WHERE id = ?;
|
||||
|
||||
-- name: GetActiveGames :many
|
||||
SELECT * FROM games WHERE status < 2;
|
||||
SELECT * FROM games WHERE game_type = 'connect4' AND status < 2;
|
||||
|
||||
-- name: CreateGamePlayer :exec
|
||||
INSERT INTO game_players (game_id, user_id, guest_player_id, nickname, color, slot)
|
||||
@@ -41,5 +41,5 @@ SELECT
|
||||
FROM games g
|
||||
JOIN game_players gp_user ON g.id = gp_user.game_id AND gp_user.user_id = ?
|
||||
LEFT JOIN game_players gp_opponent ON g.id = gp_opponent.game_id AND gp_opponent.slot != gp_user.slot
|
||||
WHERE g.status < 2
|
||||
WHERE g.game_type = 'connect4' AND g.status < 2
|
||||
ORDER BY g.updated_at DESC;
|
||||
|
||||
37
db/queries/snake_games.sql
Normal file
37
db/queries/snake_games.sql
Normal file
@@ -0,0 +1,37 @@
|
||||
-- name: CreateSnakeGame :one
|
||||
INSERT INTO games (id, board, current_turn, status, game_type, grid_width, grid_height, max_players)
|
||||
VALUES (?, ?, 0, ?, 'snake', ?, ?, 8)
|
||||
RETURNING *;
|
||||
|
||||
-- name: GetSnakeGame :one
|
||||
SELECT * FROM games WHERE id = ? AND game_type = 'snake';
|
||||
|
||||
-- name: UpdateSnakeGame :exec
|
||||
UPDATE games
|
||||
SET board = ?, status = ?, winner_user_id = ?, rematch_game_id = ?, updated_at = CURRENT_TIMESTAMP
|
||||
WHERE id = ? AND game_type = 'snake';
|
||||
|
||||
-- name: DeleteSnakeGame :exec
|
||||
DELETE FROM games WHERE id = ? AND game_type = 'snake';
|
||||
|
||||
-- name: GetActiveSnakeGames :many
|
||||
SELECT * FROM games WHERE game_type = 'snake' AND status < 2;
|
||||
|
||||
-- name: CreateSnakePlayer :exec
|
||||
INSERT INTO game_players (game_id, user_id, guest_player_id, nickname, color, slot)
|
||||
VALUES (?, ?, ?, ?, ?, ?);
|
||||
|
||||
-- name: GetSnakePlayers :many
|
||||
SELECT * FROM game_players WHERE game_id = ? ORDER BY slot;
|
||||
|
||||
-- name: GetUserActiveSnakeGames :many
|
||||
SELECT
|
||||
g.id,
|
||||
g.status,
|
||||
g.grid_width,
|
||||
g.grid_height,
|
||||
g.updated_at
|
||||
FROM games g
|
||||
JOIN game_players gp_user ON g.id = gp_user.game_id AND gp_user.user_id = ?
|
||||
WHERE g.game_type = 'snake' AND g.status < 3
|
||||
ORDER BY g.updated_at DESC;
|
||||
Reference in New Issue
Block a user