Commit Graph

302 Commits (main)
 

Author SHA1 Message Date
name cf2e80a2d8 Merge branch 'game-polish' 2026-04-11 23:00:16 -07:00
name f81b979bdd hide flying arrows when game is paused
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 22:57:50 -07:00
name be07c87546 show exact body part missing in autopause message
Use framingHint from the gesture engine to tell the user exactly
what's out of frame — head or feet — instead of a generic message.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 22:54:04 -07:00
name 4ab97c6b2e fix immediate unpause and show context-aware pause reasons
Require 1 second after autopause before accepting arms-out gesture,
preventing stale gesture signals from immediately unpausing.

Messages now reflect actual calibration state:
- framing: "I can't see your feet! Step back."
- paused: uses framingHint or "I lost you! Step back into frame."
- ready (waiting for unpause): "Raise your arms to continue!"

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 22:52:19 -07:00
name 31852ed101 show red framing line whenever feet are out of frame
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 22:49:41 -07:00
name 54a46da09e fix unpause by using arms-out gesture signal instead of pos-center
Calibration skips pos-center when resuming from paused state, so
the previous approach never allowed unpause. Now watches the gesture
signal directly — arms-out while autopaused triggers resume.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 22:49:01 -07:00
name 2ac2584806 require arms-out to unpause, fix score shifting from combo
Autopause now stays active until user raises arms (pos-center→ready
transition). Simply stepping back into frame keeps the game paused.

Score HUD stacked vertically — combo sits above score so it doesn't
shift the score horizontally when appearing/disappearing.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 22:44:58 -07:00
name 143faeb640 debounce autopause resume and show context-aware pause messages
Resume requires 500ms of stable 'ready' calibration before
unpausing, preventing flicker when arms-out is detected briefly.

Pause message now varies by calibration state:
- framing: "I can't see your feet! Step back."
- paused: "Raise your arms to continue!"
- ready (resuming): "Resuming..."

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 22:41:48 -07:00
name ae48e5c1e7 add step debounce and logging to debug double-arrow burn
Debounce same-direction steps within 200ms to prevent a single
physical step from consuming two arrows. Log step events with
arrow count and match details.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 22:38:10 -07:00
name 9055cab8d8 widen hit windows and stop premature steps burning next arrow
Perfect window: 120ms → 180ms, Good window: 280ms → 350ms.
This makes perfect detection match the visual arrow position better.

Remove the logic that marked the nearest future arrow as a miss
when stepping with nothing in range. Now premature steps are
simply ignored instead of punishing the player.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 22:37:37 -07:00
name b4efd63b5e make hardware acceleration warning dismissible
Show softer wording ('might be janky') with a Continue Anyway
button to bypass the warning.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 22:35:38 -07:00
name 00d2b8f7e1 fix missing useEffect import on IntroPage
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 22:33:21 -07:00
name ce6e01aede warn user on intro page if hardware acceleration is disabled
Check WebGL renderer for SwiftShader/software indicators. If
detected, show a red warning telling the user to enable GPU
acceleration in browser settings.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 22:32:43 -07:00
name e446b24b10 mention head explicitly in auto-pause message
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 22:29:52 -07:00
name ac82b4b8f5 clarify auto-pause message and hide framing line during gameplay
Show "PAUSED — I can't see you! Step back into frame." when the
game auto-pauses. Hide the red framing line once the game has
started so only the pause message appears.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 22:29:16 -07:00
name e22b3b4291 move combo indicator to bottom HUD next to score
Remove combo from ArrowGame's top-left ag-score div. Track combo
in GamePage and display it as "Nx" in pink next to the score in
the bottom HUD, above the progress bar.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 22:28:25 -07:00
name b22a9be20b fix SSC parser not recognizing comma+comment measure separators
Commas followed by comments (e.g. ',  // measure 1') were not
recognized as measure separators, causing all notes to be parsed
as a single measure with compressed timing. This is why all arrows
spawned at once on most songs (except Get Lucky which had plain
commas).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 22:20:12 -07:00
name 4e2abdd857 add extensive debug logging and LOG button to game page
Logs audio lifecycle (loadstart, loadeddata, canplaythrough, error,
ended), active transitions, arrow spawning, calibration changes,
and periodic state dumps. LOG button in top-right copies all logs
to clipboard for debugging.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 22:18:01 -07:00
HumanoidSandvichDispenser bb9f285051 fix padding in leaderboard (#7) 2026-04-11 22:04:09 -07:00
name 5a8a5564f2 fix black arrows, audio buffering, and auto-pause on out-of-frame
Arrows: update CSS lane color selectors to match new positions
(30/40/60/70% instead of 12.5/37.5/62.5/87.5%).

Audio: wait for canplaythrough event before attempting play(). This
fixes songs other than Get Lucky failing because the audio wasn't
buffered yet (Get Lucky worked because the preview cached it).

Auto-pause: track autoPaused state based on calibrationStatus. When
the user leaves frame (calibration goes to paused/framing), the game
pauses with "I lost track of you" message. Auto-resumes when they
return to frame.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 22:01:36 -07:00
name f939ecf3f9 rewrite audio/spawn as single polling interval, add debug logging
Replace fragile multi-effect coordination with one effect + one
interval that polls activeRef for state transitions. No more
missed play() calls from effects not re-running.

Added console.log for: effect init/cleanup, first play, resume,
pause, and play success.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 21:54:06 -07:00
name c608e992aa move arrow lanes closer together (30-70% instead of 12.5-87.5%)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 21:52:07 -07:00
name 06585ca056 fix audio never starting when calibration finishes before chart loads
Root cause: pause/resume effect depended only on [active]. If active
was already true when chartNotes loaded, the audio loading effect
created the audio but the pause/resume effect never re-ran to play
it — songStartRef stayed null, no arrows spawned.

Fix: audio loading effect now tries to play immediately if active is
already true (via activeRef). Pause/resume effect handles both first
play (songStartRef null) and resume (pausedAtRef > 0) cases.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 21:48:03 -07:00
name b1d074bd7b fix arrow spawning by consolidating audio/spawn into one effect
Root cause: three separate effects (audio load, pause/resume, spawn)
with overlapping deps caused race conditions — spawn interval could
start with stale refs, active toggling would recreate intervals
losing spawn state, and random mode could fire before chart loaded.

Fix: single effect for audio + spawn lifecycle (depends only on
chartNotes/audioUrl, not active). Spawn interval runs continuously
and checks songStartRef. Separate pause/resume effect depends only
on active, shifts arrow timestamps on resume. Removed random mode
fallback.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 21:37:07 -07:00
Max 6b9fe9f5a0 Feature/homescreen (#6)
homescreen.
2026-04-11 21:36:40 -07:00
name 0e67f8b285 fix game pausing/unpausing when calibration status flickers
Use gameStarted (latched true once ready) instead of gameReady for
the ArrowGame active prop. Once the game starts, calibration status
changes no longer interrupt gameplay.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 21:31:52 -07:00
name 895b90c8bb increase score font size from 36px to 48px
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 21:31:22 -07:00
name 533aae182a thicken song progress bar from 6px to 14px
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 21:30:43 -07:00
name e8bb1afed4 fix pause/resume losing arrow timing and song progress
On resume, shift all existing arrow targetTimes forward by the
pause duration so they don't immediately register as misses.
Track pause timestamp to compute the exact offset.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 21:30:11 -07:00
name 412652b1ab add global fullscreen button when not in fullscreen mode
Shows a small button in the bottom-right corner on all screens.
Listens to fullscreenchange events and hides when already fullscreen.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 21:26:41 -07:00
name 3c5aee0ec9 fix score jitter, add progress bar, improve pause behavior
Score: move to bottom center above progress bar, remove key-based
remounting that caused layout shifts. Delta now fades in place.

Progress bar: magenta gradient bar at the very bottom showing song
progress via onProgress callback from ArrowGame.

Pause: decouple audio lifecycle from active prop so pausing doesn't
reset the song. Audio pauses/resumes cleanly with timing preserved.

Auto-pause: once game has started, show "I lost track of you" when
calibration pauses instead of the calibration overlay. Suppresses
"ARMS OUT" text during gameplay.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 21:24:40 -07:00
name e2042cd4ef fix end-of-game showing default score when finishing early with 0
Consider store results valid when a song is selected, not just when
score > 0. Prevents fallback to DEFAULT_SCORE on early finish.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 20:19:24 -07:00
name 812bc72450 stack camera hint below button, keep fullscreen/windowed side by side
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 20:18:38 -07:00
name 5fb6cd45c0 remove webcam background from intro page
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 20:17:49 -07:00
name 7b4c73f0a0 integrate camera permission into intro page flow
Show 'ENABLE CAMERA' button first with a hint explaining why. After
permission is granted, webcam shows as background and fullscreen/
windowed buttons appear. If denied, show error with retry option.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 20:17:20 -07:00
name 9d73756cfc show webcam feed as subtle background on intro page
Embed the camera stream into the page as a low-opacity mirrored
background. This makes the permission prompt feel integrated rather
than a random browser popup. Stream is cleaned up on unmount.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 20:15:59 -07:00
name f7d4834bb6 request camera permission on intro page load
Prompt for webcam access early so the permission dialog appears
before the user reaches the game. Stream is immediately stopped
after permission is granted.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 20:14:33 -07:00
name 55cde08790 merge main: resolve conflicts, add sound effects to pause menu
Keep our real game engine, score HUD, and viewport-fit layouts.
Incorporate main's sound effects (playSound) and dvh units. Add
sound effects to pause menu buttons.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 20:12:38 -07:00
name 4e039ad649 increase gap between carousel and info bar in fullscreen
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 20:09:53 -07:00
name bbd2f664a8 fit song select to viewport height, scale down for windowed mode
Use height: 100vh with overflow hidden. Add max-height: 820px media
query to shrink carousel cards, info bar, and header when the
viewport is short (windowed/non-fullscreen).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 20:09:26 -07:00
name 8f94e3f022 fit intro page to viewport height with no scrollbar
Use height: 100vh with overflow: hidden, tighten gaps and padding.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 20:07:43 -07:00
name 60b5c71031 reduce grayscale on sponsor logos for more color visibility
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 20:05:58 -07:00
name 9f55ac143e increase sponsor logo size from 32px to 48px
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 20:05:22 -07:00
name e72b350f73 remove border path from UNR logo to fix uneven white edge
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 20:01:53 -07:00
name d6e0aeb419 clean up UNR SVG to fix uneven border rendering
Remove fixed width/height attributes, duplicate rect, and class.
Let CSS control dimensions via viewBox only.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 20:00:43 -07:00
name b09d3291b7 make sponsor logos clickable with links to their websites
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 20:00:07 -07:00
name 32d70fb35c invert Type III logo so it's visible on dark background
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 19:57:33 -07:00
name 48066c8dc1 official intro page with hackathon branding and sponsor logos
Add Biggest Little Hackathon 2026 branding, UNR logo, and all five
sponsor logos (Bently Nevada, Microsoft, Ridgeline, Coffee n Comics,
Type III). Logos shown in grayscale with hover-to-color effect.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 19:56:25 -07:00
name 99975af037 redirect to intro when navigating directly to game or end-of-game
GamePage redirects if no song is selected. EndOfGamePage redirects
if no song and no score prop. Prevents broken state from direct URL
access or page refresh.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 19:51:13 -07:00
name 109bb84110 full screen loading overlay with spinner for pose detection
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 19:49:25 -07:00