Inspiration

Earned Valor began with a question: what if training your character meant moving your own body?

I wanted to bring fitness, adventure and friendly competition to the living-room TV. A medieval mentor, a story to follow and a squire to develop give practice a purpose beyond a repetition counter. The goal is an experience that families and friends can enjoy together and return to for their own progress.

The phone becomes the movement controller, while Fire TV brings the adventure to a shared screen. The longer-term vision extends from local play to friends and family across households, followed by opt-in matches against new rivals and clans.

What it does

Earned Valor combines three connected experiences:

  • Story: Explore a first-person 3D courtyard, meet voiced characters, make dialogue choices, learn sword and shield techniques, and face a duel where timing, guard direction, distance and stamina matter.
  • Training: Visit Sir Alden's training hall for squat and push-up variations. Choose a pace and variation, follow exercise-specific calibration, and complete assigned reps, sets and rest with voice guidance. Completed camera routines earn capped XP and modest bonuses for story combat.
  • Clan duels: Form teams of one to three fighters and challenge another clan. Corresponding players fight live duels, with each result contributing to a shared clan score. The current prototype supports local/LAN multiplayer through a shared server, using an independent screen and controller session for each fighter.

Six local squire profiles keep separate story, equipment, calibration and training progress. Weekly practice goals and recent training history give players a reason to return. Completed clan results and records persist on the server.

An Android phone estimates body joints using its camera. The right wrist and forearm control the sword, while the left wrist controls the shield. Leaning and crouching provide additional movement inputs. The TV remote handles menus, dialogue and navigation.

Camera video stays on the phone. Only movement landmarks and tracking information are transmitted for gameplay.

How we built it

The TV application combines React and TypeScript with a Java Android WebView wrapper. Three.js renders the first-person environment, characters and weapons. The native wrapper supports D-pad, Select, Back and Play/Pause controls.

The phone runs MediaPipe Pose Landmarker locally in its browser. A Node.js server connects the phone and TV over WebSockets and manages multiplayer sessions. The server resolves health, results and clan scoring so both participants receive the same match state.

Exercise counting uses dedicated calibration and repetition rules. It checks visible joints, calibrated movement range, timing and complete lower-and-return cycles. Tracking interruptions clear an unfinished attempt instead of awarding a repetition when the player returns.

Story dialogue and instructor guidance use prerecorded synthetic voices generated with Kokoro, alongside the project's original music, ambience, sound effects and captions.

The demonstration video records the native Android TV emulator with labelled synthetic skeleton controllers, including two scripted controllers for clan play. It demonstrates the real software path rather than live camera capture. Training and rest are shortened in the edit, and the progress shown belongs to an isolated test profile.

Challenges we faced

Turning estimated body positions into useful combat controls required filtering, calibration and careful interruption handling. A sudden change after tracking returns must not become an unintended sword strike. Camera restarts also needed clear ownership so an old session could not stop its replacement.

Exercise counting presented a different challenge: recognising a complete, controlled movement rather than rewarding partial repetitions. Different exercise variations also need appropriate camera views and their own calibration.

Designing for a TV remote affected every menu. Clan names and invite codes needed an on-screen keyboard, visible focus and predictable Back behaviour.

Accomplishments

I built a complete first-chapter story path, a voiced training instructor, exercise-driven story progression, separate local squire profiles and live local clan duels with saved results.

The current suite passes 128 automated tests and 10 browser checks, covering combat, training, multiplayer, pairing, camera recovery, saved state, profiles, navigation and rendering. Camera inference recovery and replacement-session cleanup are implemented and covered by regression checks.

A fresh GitHub clone passed dependency installation, the production build, HTTPS/WebSocket checks and the Android APK build. Native Android TV emulator checks also verified remote navigation and a 1920 × 1080 rendering buffer.

What we learned

Calibration and clear guidance are central to a movement game. Players need to understand where to stand, whether their body is visible and what movement the game expects next. Recovery behaviour matters just as much as the initial connection.

Training and competition also need different reward rules. Exercise progress strengthens the story experience, while clan duels use common starter equipment without training bonuses. That separation gives personal progress a purpose while keeping competitive matches on shared starting terms.

What's next

The next steps are broader playtesting across phones, measured camera-to-display latency, physical Fire TV performance profiling, improved character animation, more training routines and later story regions.

The longer-term vision is online play with family and friends across homes, followed by opt-in matches against new rivals and clans. That expansion needs internet hosting, accounts, matchmaking and player protections. These are planned features; the current multiplayer experience runs on a local/LAN server. Local profiles and saved clan records are already implemented.

Built With

Share this project:

Updates

Submission history