Commit Graph

13 Commits

Author SHA1 Message Date
jozamudi 35a90e9c78 Tune DAS timing and enable tapping 2026-03-24 21:39:52 -07:00
callylin 3a307dbc80 Implement DAS/ARR for smooth horizontal piece movement 2026-03-24 17:59:55 -07:00
callylin 36965dc887 Change hold to shift from C 2026-03-24 17:04:01 -07:00
jozamudi 7d385806df Fix ready button state after game over
- Enable ready button in resetLobbyState() so players can ready up
- Remove redundant ready button state reset from endGame()
- Ensure ready button is enabled when returning to lobby

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-21 04:30:09 +00:00
jozamudi 4d28189205 Reset lobby UI state when returning from game over
- Add resetLobbyState() to UIManager to clear player lists and reset ready button
- Call resetLobbyState() when player-joined event has null player (game over reset)
- Reset ready button state in endGame() before showing game over screen

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-21 04:19:15 +00:00
jozamudi 1b11a60acc Remove client-side game over check to prevent premature game end
The client was checking activePlayers.length <= 1 and calling endGame()
prematurely, before the server's authoritative game-over event.

Now the client only ends the game when the server explicitly sends the
'game-over' event.

Added server-side logging to track active player count and winner.
2026-03-21 03:13:08 +00:00
jozamudi e3f594e44e Show garbage received on player elimination
- Add garbageReceived array to player objects
- Track garbage in addGarbageToPlayer() with sender name
- Include garbageReceived in getStates() output
- Update endGame() to pass garbage stats to UI
- Update showGameOver() to display garbage count per player
- Add CSS styling for eliminated players and garbage column
- Bump CSS version for cache refresh

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-21 02:44:39 +00:00
jozamudi a0ab4ff5cd Add spectator mode for late-joining players
- Server: Late joiners are added as spectators instead of players
- Server: Send forced-spectator event only to joining spectator (not broadcast)
- Server: Track spectators separately and move them to players after game ends
- Client: Handle forced-spectator event to show all player boards
- Client: Spectators see all boards equally without main/spectator highlighting
- Client: Mobile view shows scrollable vertical list of all boards for spectators
- Fix: All cleared lines are sent as garbage to each opponent (not randomized)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 18:26:48 +00:00
jozamudi 4a49c76cdc Add hold piece feature
- Added holdPiece and canHold state to TetrisGame class
- Implemented hold() method to swap current piece with held piece
- Added player-hold socket event on server
- Added HOLD preview canvas showing held piece (grayed when unavailable)
- Added C key keyboard shortcut and touch button for hold
- Fixed canHold reset on piece spawn for proper swap functionality

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 08:50:52 -07:00
jozamudi bc89948584 Create focused arena layout with main player centered
- Main player board is large and centered with cyan glow
- Opponent boards are smaller (50% scale) and positioned around edges
- Layout adapts for 1, 2, or 3+ players
- Spectator boards have reduced opacity to reduce distraction
2026-03-20 08:01:25 -07:00
jozamudi 833256d18f Fix lobby: only show players who have joined
Changes:
- Added socket.join(LOBBY_ROOM) when player joins lobby
- Changed io.emit() to io.to(LOBBY_ROOM).emit() for all lobby events
- Players only see lobby events after they click JOIN LOBBY
- Fixed player list to update correctly when players join/ready
- Game now starts properly when all players are ready

Files modified:
- server/index.js: Use Socket.io rooms for lobby scoping
- public/js/app.js: Show lobby screen on player-joined event
- public/js/ui.js: Removed duplicate listener override
2026-03-20 07:30:42 -07:00
jozamudi e7917a338e Refactor to single global lobby
Changes:
- Removed room-based architecture, now using single global lobby
- Players only need to enter their name to join
- Game starts when all players in lobby are ready (min 2, max 8)
- Simplified UI - no room name field, shows "Global Lobby" header
- Updated all server events to use io.emit instead of io.to(roomName)

Files modified:
- server/index.js: Replaced rooms Map with single lobby object
- public/index.html: Removed room name input, updated button text
- public/js/network.js: Renamed joinRoom/leaveRoom to joinLobby/leaveLobby
- public/js/ui.js: Simplified join flow, removed room name validation
- public/js/app.js: Updated game header to show "GLOBAL LOBBY"
- PLAN.md: Marked all phases as complete
2026-03-20 07:09:51 -07:00
jozamudi 5da6033704 Initial commit: Tetris Battle Royale multiplayer game
Features:
- 2-8 player multiplayer via Socket.io WebSocket
- Real-time board synchronization - all players see all boards
- Battle royale mechanic: clearing rows sends garbage to opponents
- Classic Tetris gameplay with all 7 tetrominoes
- Retro visual styling with CRT scanlines and pixel font
- Automatic level progression and speed increase
- Player elimination and winner announcement

Files:
- server/index.js: Node.js + Socket.io game server
- public/js/: Frontend game logic, rendering, network, and UI
- public/css/style.css: Retro Tetris styling
- README.md: Setup and usage instructions
- PLAN.md: Implementation plan with all phases completed
2026-03-20 00:34:06 -07:00