The great hall of Ithaca from the game. Twelve bronze axe heads stand in a row down a long hall lit by braziers, with a bright doorway at the far end and a bow in the foreground.

ODYSSEY BOW TRIAL · BROWSER GAME · JUL 2026

WORK № 08

Three arrows to learn the bow, one that counts

Book 21 of the Odyssey, on a phone. String the bow and send an arrow through twelve axe heads. Three practice arrows teach the bow and take its help away one at a time; the fourth is the one that counts.

↓ READ THE CASE

ARROWS 1 – 4

The aiming line leaves one arrow at a time

A reticle alone misleads: it sits on a straight line, and at full power the arrow has dropped 0.43 m by 28 m out, about the radius of an axe hole. So while the string is drawn, glowing dots trace the real flight, computed with the same physics as the arrow.

Each practice arrow shows less of that line, and the arrow that counts shows none. The reticle fades too but never disappears, because on the last arrow it is the only thing saying where the bow points. Without it the shot would be blind, not hard.

  1. Arrow 1 · practice: The full line.
    Arrow 1 · practice

    The full line.

  2. Arrow 2 · practice: Fainter.
    Arrow 2 · practice

    Fainter.

  3. Arrow 3 · practice: A trace. It can confirm a line, not find one.
    Arrow 3 · practice

    A trace. It can confirm a line, not find one.

  4. Arrow 4 · the one that counts: No line.
    Arrow 4 · the one that counts

    No line.

Each frame is the live game at full draw, cropped to the first axe head.

DATE
27–28 JUL 2026
CONTEXT
Side project, made while learning game design
ROLE
Sole designer · Concept, game design, look and sound, playtesting
STACK
three.js · Cloudflare Workers · D1 · Web Audio · built with AI coding agents

THE 45-SECOND READ

PROBLEM

The contest is a single shot. Someone who opens a link has a phone, a few seconds and a bow they have never used, and they have to care about that one shot.

DECISION

Make the three practice arrows the tutorial. Take the aiming line away one arrow at a time, report every miss as a correction the player can apply, and give the fourth arrow nothing but what they learned. Then turn the score into a challenge to a friend.

PRODUCT

A four-arrow 3D archery game in Traditional Chinese and English, with a new wind and starting aim each run, a slow-motion final shot, eight archer types read from how you played, and a one-to-one challenge link.

STATUS

Live at odyssey.eliasshieh.com since 27 July 2026. The numbers near the end come live from the game's anonymous counter.

The film was out, social media was buzzing about it, and I happened to be learning to make games, so I made this little game.

Elias Shieh, on why it exists

THE DRAW

Aiming and drawing were one gesture

In the first version one finger did both: how far you pulled set the power, and the direction set the aim. Playtesting showed the game punished effort. Tapping without aiming threaded 9 of the 12 axes, and nudging the screen 10 px first dropped it to 4.

Now you drag the hall to aim and pull a pad to draw, and the aiming speed comes from the target. The old speed crossed the whole scoring window in 12.5 px of finger travel, less than a thumb’s own jitter. On a touchscreen it now takes 90 px. Try both here.

Drag each marker and let go inside the gold window

Before12.5 px

The whole window that threads all twelve axes.

 

After, on a touchscreen90 px

The same window at the new aiming speed.

 

Drawn at actual size. An illustration of the finding, not the game's code. The window is 0.0256 rad of aim; a mouse gets 64 px for it.

The bow came already aimed

At the right power, the bow’s starting aim threaded all twelve axes, so a player who never aimed scored a perfect 1,000. Now each run starts the bow at least 20 mrad off the line, an error no amount of power fixes, and adds a draught across the hall that pushes weak shots further than strong ones. The braziers lean and the dust drifts with it, so the hall shows the wind before the first arrow.

1,000Score for never aiming, before
3.6 / 12Axes threaded without aiming, on average, after
0 of 400Runs where not aiming threaded all twelve
400 of 400Runs still winnable with a perfect score

Measured over 400 generated runs with the starting offset at 20–30 mrad and a draught of 1.4–3.0 m/s². 20 mrad is the floor because below it a favourable draught alone could carry an unaimed shot through all twelve; the offset now sits just above it.

A miss you can act on

When an arrow misses, the callout says where: which axe, how far high or low, how far left or right. The game had recorded that from the start, but only used it to work out your archer type.

It works as advice because nothing else moves between arrows. The aim stays where you left it and the hall stays the same. A version that re-drew the bow’s offset every arrow was measured and dropped, because it broke the correction in 74% of runs.

Live game: arrow 1 misses 0.46 m left at axe 4. One drag by that amount, and arrow 2 threads all twelve. The player is a script that reads only the callout.

The arrow that counts

No line and no second try, and it is worth four times as much: 40 points an axe instead of 10, plus 160 for all twelve. On release the camera cuts to a spectator’s view from the side and follows the arrow through the axes in slow motion, then the score counts up axe by axe onto a challenge card.

The recording is silent. In the game, original music changes with the entrance, the draw, the slow motion, the tally and the result.

Live game: no line, a slow-motion side view, the tally, then the challenge card.

THE ARCHERS

Eight archers, and four nobody could get

After the final arrow the game names your style. A check of the scoring found that four of the eight archers could never be awarded. One input measured speed per millisecond against thresholds meant for per second, so steadiness always read as perfect and gave every run 45 free points, and the axis it fed never fell below 65.

Now a signal the run couldn’t observe is left out instead of scored, because not moving is not the same as moving steadily. The archer is the nearest of eight centres rather than three hard cuts at 50, so a small wobble no longer swaps the name on a result made to be shared. The tests play 13 synthetic styles and require all eight archers to appear.

  • Portrait of the Wind-Reader: an archer in a torch-lit Greek hall, holding a bow.
    讀風者Wind-Reader

    你會先觀察,再讓箭沿著最穩的路線飛出去。

  • Portrait of the Keeper of the String: an archer in a torch-lit Greek hall, holding a bow.
    守弦者Keeper of the String

    你找到一條可靠的箭線,之後每一箭都穩穩守住。

  • Portrait of the Adaptive Tactician: an archer in a torch-lit Greek hall, holding a bow.
    應變策士Adaptive Tactician

    你會先判斷,再在出手時快速修正方向。

  • Portrait of the Hunter of Ithaca: an archer in a torch-lit Greek hall, holding a bow.
    伊薩卡獵手Hunter of Ithaca

    你確認目標後就果斷放箭,不浪費任何動作。

  • Portrait of the Wave-Listener: an archer in a torch-lit Greek hall, holding a bow.
    聽浪者Wave-Listener

    你憑直覺察覺變化,也能在下一箭立刻調整。

  • Portrait of the Steady Bow: an archer in a torch-lit Greek hall, holding a bow.
    穩弓者Steady Bow

    你的動作直接而穩定,弓在手裡幾乎成了本能。

  • Portrait of the Wave-Breaker: an archer in a torch-lit Greek hall, holding a bow.
    破浪者Wave-Breaker

    你不怕在動作中改變方向,反應速度就是你的優勢。

  • Portrait of the Fearless Archer: an archer in a torch-lit Greek hall, holding a bow.
    無畏弓手Fearless Archer

    你一旦選定目標,就會毫不猶豫地射向中心。

The names, lines and portraits as the game shows them.

Sharing that works where people share

The game gets passed around in LINE and Instagram, and sharing broke in both: their in-app browsers can’t open the blob: link the download relied on. Now they get the card full-screen with “press and hold to save”, LINE links open in the phone’s own browser, and cards are drawn during the tally, so the link card dropped from a 1.4 MB download plus a multi-megabyte PNG to 71 KB.

The numbers then showed that LINE and copy-link carried every real handoff, so the sheet leads with those two. And sharing became a challenge: the score waits on a card for your signature, and after you send it, your rival’s side stays blank.

The challenge card: 990 / 1000, final arrow 12/12, rank 弓之主人, signed "Elias", with the buttons 送出挑戰到 LINE ("send the challenge on LINE") and 存成 IG 限時動態 ("save as an Instagram story").
The share sheet: a preview of the card, a gold button 用 LINE 挑戰朋友 ("challenge a friend on LINE"), a button to copy the challenge link, and one folded row for the card image, Instagram stories, download, X and Threads.
The waiting page after sending: the player's portrait and 990 on the left, a blank circle with a question mark on the right waiting for the rival, and a link to eliasshieh.com.
THE CHALLENGE CARD · THE SHARE SHEET · THE WAITING PAGE

How many people took the shot

The game counts its own visitors anonymously, and this page reads the totals live.

CONNECTING
Checking the public aggregate…
FIRST-PARTY ANONYMOUS EVENTSNO NAMES · NO IP ADDRESSES · NO RAW IDENTIFIERS