- Extract Preloader component (get from public/index.html)
- Remove dynamic layout
- Create script for generating media queries for game page Search: Does media query include scrollbar? Actually, the whole point is to avoid a scrollbar
- Design game UI screens (new game, pausing)
- Add user list to GamePanel
- Design new game state (with Flow types)
- Put
curUser
in Redux state - Derive playing state from
users(status=playing).len
- Put
- Add missing screens for multiplayer flows
- PIVOT: Turn collaborative Flatris (2-8 players) into competitive 1vs1 Flatris
- Redesign state and actions
- Make MOVE, ROTATE, ENABLE_ACCELERATION, DISABLE_ACCELERATION userId based
- Cancel ADVANCE loop on unmount
- Disable acceleration on line drop
- ADVANCE action for current user
- Remove START/STOP actions
- Clear onboarding screens (postpone UI this time until game mechanics are confirmed)
- Update fixtures and tests
- Add 2nd player
- Start game when both players are ready
- Render other player's grid in the background
- Redesign state and actions
- Create server MVP database
- Split client logic between starting or joining a game
- Rename state.game to state.curGame
- Add blocks to other player when clearing lines
- Bring back "falling" block transition when lines are cleared
- Transitions when clearing lines
- Cleared lines should go down (not instantly disappear)
- Lines from enemy should come up (not instantly appear)
- getNextCellId(gameState) abstraction
- Fix concomitant line clearing between players
- Fix multiplayer test case: Clearing lines that aren't bottom ones
- Expand memory db to multi games
- Green/red wall flash when clearing lines (own vs enemy)
- Earthquake effect when clearing lines
- Make enemy grid visible on Firefox
- Add hidden keyboard shortcut for stopping game
- Clean up server scripts (Keep server with client together in prod, separate in dev)
- [WORKING PROTOTYPE]
- Handle wrong game ID with 404
- Create server-side user sessions
- Read game (Redux) state from server side in Page.getInitialProps
- Use HTTP request instead of socket event to create game
- Load entire game state on load
- Don't join game if 2 players are already in
- Create join/:id route
- Turn sessionId, userId & gameId numbers into hashes
- Grayscale loading state until JS is loaded
- Subscribe to game events on game page, once JS is loaded
- Continue game after hard refresh
- Add fixtures for all components
- Add disabled state to buttons (get rid of early exists in handlers)
- Create "Invite or play" screen
- Create "Game full" screen
- Create "Join game" screen
- Create "Get ready" screen
- Create "Waiting for other" screen
- Create "Game over" screen
- Allow players to restart once game is over
- Different layouts per device type/orientation
- No controls on desktop
- Drop Tetromino on SPACE key
- Style "Auth" screen
- When joining
- When creating
- Restrict name length
- Reuse old public assets
- Add meta tags from old index.html
- Style GamePanel
- Show both players' score in game panel
- Show player READY state
- New Flatris logo
- Humanize numbers over 1K
- Show lines instead of "wins" for single player
- Make "2P insert coin" clickable
- Add global score (how many games each player won)
- Add ability to PING other player
- Allow users to just watch
- Onboarding screen
- Left, right, up, down & space keys for desktop
- Point to controls
- Explain Flatris invention: line transferring
- [ALPHA TESTING] feedback
- Disable in-game auth after entering 1st time
- Fade in game screens
- Generate new Tetromino random sequence per game turn
- Improve ending UI: Add WON green badge under player name
- Regression: Change "WON" badge to not block user score
- Encourage players to play "best x out of y"
- Disable controls when user isn't playing
- Side controls on landscape mobile
- Extract portrait controls out of FlatrisGame
- Don't request user auth when game is full (allow guests to watch)
- Add copy to clipboard btn to "Invite or play" screen
- Show share button when clicking on "2P insert coin"
- [BEAUTIFUL MVP]
- Ensure action consistency
- Create action backfill if user has old state and new actions
- Create action.id, action.prevId and game.player.lastActionId
- Store actions on the server
- Create backfill operation
- Create action backfill if user has old state and new actions
- UX: Disable Auth buttons while performing IO
- UX: Disable buttons while JS is loading
- 2P Insert Coin in GamePanel
- screens/Auth name field
- screens/GameFull Watch
- screens/GameOver Again
- screens/GetReady Ready
- screens/JoinGame Watch and Join
- screens/NewGame Play and Copy
- screens/WaitingForOther Ping
- Add pause & end game state for solo players with invite screen
- Index page
- Create reduxState.games
- List all games
- Beautiful grid
- Animating games
- Strip game effects when going back to index page
- Push new games to dashboard
- Remove inactive games
- Mark inactive after 30 seconds
- Remove expired after 15 minutes
- Redirect to dashboard from expired game page
- Style
- Style NEW GAME button
- Add Flatris header
- Show blank state when no active games exist
- Fade in fade out transition game previews
- Highlight already joined games
- BUG: Broadcast new game to
global
(without requiring an action) - BUG: Reset losses when 2nd player joins
- Minimize network communication: Don't send noop actions
- Throttle key down events
- Profile browser performance (detect unnecessary renders)
- Redesign onboarding
- Screen 1: Game intro
- Screen 2: Multiplayer game
- Screen 3: Line transferring
- Screen 4: Controls
- Custom 404 page
- Error page (via componentDidCatch)
- Add empty game shell to Dashboard blank state
- Link to Github
- Game footer
- Disable active Tetromino movement when game over (via mobile buttons)
- [1.0]
- Merge to master
- Rollbar server
- Rollbar client
- https://flatris.space
- Embed Teko font in JS bundle
- Record stats
- Store in Firebase (users, games)
- Count Turns and lines
- Count actions (left, right, accelerate, rotate)
- Count time
- BUG: Gracefully invalidate session after re-deploy
- Sync game after player disconnect
- Real time stats page
- [2.0]
- Share on HN, PH, Reddit, etc
- Fix: Polyfill Set/Map https://reactjs.org/docs/javascript-environment-requirements.html
- Increase speed logarithmically (game currently ends too abruptly)
- "Paused" state for solo players (useful in dashboard to see if person paused or disappeared)
- How about "idle" state?
- Ask for permission to join game
- "Waiting for permission..." screen
- "Allow player to join?" screen
- "Denied" screen
- End of game screen
BACKLOG
- Back/home button in end game screen
- Allow watcher to select current player
- Show current player visually
- Don't show onboarding after every deploy
- Freeze game on player disconnect
- Create drop shadow from active Tetromino
- Draw game status
- Zoom in animation when opening game from dashboard
- Algorithm for dispatching bundled actions at time interval
- Sounds
PERF
- Separate client from server (and run multiple instances of client)
- Minimize state footprint
- Batch dashboard actions
CHORES
- Upgrade to Babel7
- Extract ReduxActions Cosmos proxy
UX
- Reconnect when focusing idle tab (socketio/socket.io-client#1067)