Hexapuss Meteor Attack: Game Design Document
Title: Hexapuss Meteor Attack
Spelling: Hexapuss (two s)
Owner: Steve Hinan
Doc date: 2026-09-18
Build: HTML5 Canvas 2D web
Version: 1.0
Public GDD path: experimental/gdd/meteor-attack/
Play: https://stevehinanpresents.com/meteor-attack/
1. What it is
You play one of the three Hexapuss band members on the street in front of a music venue. Meteors fall. Dodge them. Later, they crack open into cats. Jump those. If you step in glowing poo, you lose control and walk into the cat's mouth.
One thumb on a phone. One run. Three lives: the three members. No banners on the playfield.
Platform: HTML5 web game, portrait 9:16, hosted at stevehinanpresents.com/meteor-attack. Not Unity. Not Android. Not Google Play.
2. Why it exists
This is the Hexapuss game we are making. It has to feel like the short film: dark graphic novel, not a cartoon, not pixel art. Hexapuss is the universe; Meteor Attack is the game. Official HEXAPUSS dripping wordmark on the TITLE plate only, with METEOR ATTACK as the game name under/with it in the UI font. PLAY venue marquee has no HEXAPUSS / HEXAPUS text. Official band sheets. Script cats. Nothing else.
Do not invent lore. Cats and possession come from the Hexapuss short film script.
3. Design pillars
- Smash, then threat. Every wave yells WAVE N, then that meteor falls. Never the other way around.
- You play a Hexapuss member. Vocalist, guitarist, or drummer. Not the tentacle mascot. Not a made-up human.
- The street is the ad. First run is clean. The only ad is a rewarded extra life from a real tap on WATCH AD. Never a banner.
4. Playable characters
Pick one before the run, and again after a death if anyone is still alive. Same loop for all three until Steve writes different moves. Official sheet is law. Do not change the face, hair, clothes, or gear.
Rowan Quinn: Sable
Role: lead vocalist / lyricist
Age: 39. Height: 5'6". Athletic, elongated. Ireland.
Look: long copper-red hair, fair skin, freckles, faint scar on the left cheek. Worn black leather jacket, black knit tank, dark slim denim, black ankle boots. Dark metal Celtic knot pendant. Simple silver band. Leather lyric notebook. Vintage dark mic.
Art: official Sable sheet. Graphic-novel, not cartoon.
Cole Lawson: Dredge
Role: guitarist
Age: 49. Height: 5'11". Wiry / lean muscle. Northern England.
Look: long dark messy hair, angular face, faint scar on the left cheekbone, deep-set eyes. Worn black leather jacket, fitted black tee, slim dark jeans, scuffed black boots. Signature black electric guitar. Aged leather strap with picks. No tattoos, no extra jewelry, no piercings.
Art: official Dredge sheet. Graphic-novel, not cartoon.
Steve "Slinky" Hinan
Role: drummer
Age: 49. Height: 5'10". Lean / strong.
Look: short beard, salt-and-pepper hair. White / off-white hoodie, white track pants with a black stripe, grey runners, drumsticks.
Art: official Slinky sheet. Graphic-novel, not cartoon.
The chosen character stands on the lot, above the bottom thumb strip, not glued to the bottom of the screen.
5. Character select
After PLAY NOW, pick a member. The screen works like Golden Axe: living members in a row, you move left / right, confirm one, then the run starts (or continues).
Order, left to right, skipping anyone who is already dead:
- Sable (vocals): default if she is alive. Cursor starts on the leftmost living member, which is Sable unless she is out.
- Dredge (guitar)
- Slinky (drums)
Show the official look. Name and role under each. No extra story text. No mascot on this screen. Dead members are not shown.
If the player hits confirm without moving, they get the default living member (Sable if she is alive).
6. How you play
Left and Right to dodge. Jump to vault hazards.
Phone
- LEFT arrow, bottom-left
- RIGHT arrow, bottom-right
- JUMP pad, bottom-center
- Air-steer while jumping: extra finger on the playfield, plus keyboard. Mouse-move with no button down is not a hold (no hover-walk, no right-drift).
Keyboard still works: arrows or A / D, jump with Space, W, or up arrow.
One meteor at a time.
Jump over a hazard (meteor, cat, bite, poo pile) while airborne: +1 once per threat. Crush, bite, and possession do not pay that point. Wave CLEAR still +100.
When +1 hits, the player must know it scored in that beat: gold flash / scale / burst ON the character sprite (official sheet, no new pose, no pixel art), a +1 VAULT popup, and the jump-over sting.
7. The run
Title screen: opaque 720×1280 title plate. Official HEXAPUSS wordmark is UI in the top black band. Under/with it, the big game name METEOR ATTACK in the existing UI font. Hexapuss is the universe; Meteor Attack is the game. Three how-to lines and PLAY NOW are UI in the bottom black band:
- Avoid the cats from space.
- The cats can bite.
- Beware of cat poo, it will charm you.
Do not draw the venue plate under TITLE. Pause still shows the frozen playfield.
PLAY NOW → Golden Axe select (all three alive, Sable default) → run.
Wave 1 smash. Orange meteor. Dodge. Wave 2 smash. Green meteor. Dodge. Wave 3 smash. Purple meteor. Dodge.
The first meteor of a run, and the first meteor after an extra-life resume, must not land on the spawn cell. Stand still is not an instant crush.
Wave 4 onward: smash, meteor, cat. The cat is the same color as the meteor that just crashed. Jump the cat. Special is a bite or poop-in-place (static glowing pile). Cats do not throw poo.
Three lives = the three band members (portraits as lives). One life each. A complete game is three characters.
When the current member dies:
- They are out for the rest of this run (unless an extra life later).
- Go back to character select. Dead members are hidden. Only living members can be picked.
- Start again at the current wave they died on (WAVE N smash, then that meteor). Keep the score.
- Deaths 1 and 2: no ads.
When the third member dies (all three out):
- Straight to GAME OVER. No auto interstitial. No auto ad.
- GAME OVER shows: SCORE, NAME under SCORE, then LEADERBOARD (NAME must not clip the heading), then WATCH AD FOR EXTRA LIFE (hidden if extra life was already used), then START AGAIN below it.
Extra life (once per run, only from a real tap on WATCH AD FOR EXTRA LIFE):
- Try a rewarded ad. Ads are live (publisher
ca-pub-1247659112467753). No-fill does not grant. While H5 Games Ads is in Google review, if needed the code falls back to a ~4s TEST AD overlay with TAP TO SKIP, then grant. - Then a dedicated EXTRA LIFE screen (not SELECT): all three members, pick one, PLAY confirms.
- Resume same wave + score. First meteor after resume must not spawn-camp the spawn cell.
- When that extra life dies: GAME OVER. Hide WATCH AD. No second extra. No auto ad.
START AGAIN: roster all living, wave 1, score 0, character select.
Score is how far you got. No ads on the playfield.
8. Waves
| Wave | Smash | Then |
|---|---|---|
| 1 | WAVE 1 (slim, on marquee) | Orange meteor only, compressed |
| 2 | WAVE 2 (slim, on marquee) | Green meteor only, compressed |
| 3 | WAVE 3 | Purple meteor. Cat comes out. Bite or poo-in-place. |
| 4+ | WAVE N | Meteor cracks. Cat comes out in that meteor's color. Bite or poop-in-place (static pile). |
Waves 1-2 have no cats (compressed meteor-only). Cats start on wave 3. Meteor color = cat color.
9. Threats
Meteor
Falls from the sky. One at a time. Orange, then green, then purple. Get crushed and you die.
Cat
Black silhouette. Glowing eyes and tail. Colors from the short film only: orange, green, purple, cyan, yellow, magenta. Splits in the film are Orange+Cyan, Green+Magenta, Purple+Yellow. Do not invent new cats.
The meteor that crashes sets the cat's color. Orange meteor → orange cat. Green → green. Purple → purple. Same rule on later waves. Do not spawn a cat whose color does not match that meteor.
Bite
A lunge. Jump it.
Poo (in place, not thrown)
Cats do not throw poo. The cat poops where it stands, then walks off the pile. The pile stays as a static ground obstacle the player jumps. Contact is a hit (possession): the chosen member glows, loses control, walks straight at the cat, and the cat eats them. Jumping over the pile is +1 with the existing juice / sting. One pile at a time; it persists across CLEAR / next waves until consumed or a new run. Mist-from-landing-poo is gone.
10. Look
Match the short film.
Do
- Dark graphic novel: ink, hard shadows, grain
- Official dripping HEXAPUSS wordmark on the TITLE plate only, plus METEOR ATTACK as the game name in the UI font
- Official Sable, Dredge, and Slinky sheets
- Venue as one 720×1280 plate
Do not
- Pixel art or chunky 8-bit sprites
- Bright cartoon
- Invent a HEXAPUSS typeface
- Invent a different human or extra tentacles on the mark
- Draw the player, meteors, cats, wordmark, or UI onto the venue plate
- Composite the official wordmark onto the PLAY venue marquee
- Put HEXAPUSS or HEXAPUS lettering on the in-play marquee
- Put banners on the playfield
Venue plate: paint the night, the building, the doors, the street, the lot. PLAY marquee is blank or says TONIGHT ONLY only. No HEXAPUSS on that plate.
11. Screen
Portrait 9:16. Virtual size 720×1280. Letterbox to fit.
The chosen member's feet sit on the lot, above the footer. Level chrome is only the header and the footer.
12. User Interface
This is the in-level HUD. Title and character select are separate screens.
Header
Wave count and score. Top of the playfield. Nothing else in the header. Slim WAVE on marquee.
Footer
Player navigation buttons. Bottom of the playfield.
- LEFT, bottom-left
- JUMP, bottom-center
- RIGHT, bottom-right
No banners. No extra chrome on the playfield. Keyboard still works (arrows or A / D, jump with Space, W, or up).
13. Ads
Google AdSense H5 Games Ads (Ad Placement API). Same stack as a normal web page on stevehinanpresents.com. The only ad is rewarded extra life from WATCH AD FOR EXTRA LIFE. No Unity Ads. No Google Play. No banners on the playfield.
Publisher: ca-pub-1247659112467753. Ads are live (Steve removed data-adbreak-test=on on 2026-08-31). Do not put the test flag back. No spend beyond AdSense. Overlay auto-closes when the ad finishes.
| Moment | What happens |
|---|---|
| First run, TITLE, SELECT, PLAY | Clean. No ads. |
| Death 1 or 2 (someone still living) | No ad. That member is out. Character select with only the living. Resume same wave + score. |
| Death 3 (all three out) | Straight GAME OVER. No auto interstitial. No auto ad. |
| WATCH AD FOR EXTRA LIFE | Only this button fires an ad. Real tap. Rewarded extra-life, once per run, above START AGAIN. Live no-fill does not grant. Fallback stub when needed in code: ~4s TEST AD with TAP TO SKIP (no-fill fallback while H5 Games Ads is in Google review). |
| Extra life dies | GAME OVER. Hide WATCH AD. No second extra. No auto ad. |
WATCH AD must be a real tap (user gesture) so showAdFn is allowed.
14. Leaderboard
Shown on GAME OVER.
SHARED on the host. Same origin.
- GET/POST https://stevehinanpresents.com/meteor-attack/leaderboard/scores.ashx
leaderboard/scores.jsonlives on the server, created on first write. Never ship it. Never overwrite it on later uploads.- Top 10 by score, then wave.
- Fields: name (max 12, A-Z a-z 0-9 space _ - , default PLAYER), score, wave, date, runId.
- NAME remembered in localStorage. Default
PLAYER. In-game NAME overlay, neverwindow.prompt. - If the handler fails, GAME OVER falls back to the localStorage board so the screen is not empty.
- Extra-life continue is the same runId: update that row if the score got higher.
- No Firebase. No extra UI.
15. Audio
SFX are short original MP3 files in audio/ (explosion, poop, bite, jump, meow-start/stop variants), loaded by the game. Web Audio oscillator / noise remains fallback only when an MP3 is missing. Shared AudioContext. Guarded so missing AudioContext is a no-op.
- Jump-over sting (locked) when +1 vaults
- Meteor boom when a meteor hits the ground (FALL → IMPACT)
- Poo create (wet / low) when the pile is dropped
- Bite sting when a cat bite hits the player
- Meow start when the cat starts moving (EMERGE → CHASE, and when it walks off a fresh pile)
- Meow stop variant when the cat stops (CHASE → SPECIAL). Meows rotate a few pitch / duration flavors.
Soundtrack: audio/hexapuss.mp3 beside game/ (same level as game/ and leaderboard/), never inside game/. Game loads exactly audio/hexapuss.mp3 (relative to index.html). Loops during TITLE / SELECT / PLAY / EXTRALIFE / PAUSE. Fade / stop on GAME OVER. Resume when leaving GAME OVER back to SELECT / TITLE. Unlock / play on first user gesture (pointer down / PLAY NOW).
16. What this is not
Not Hexapuss Quest pinball.
Not a Unity / Android / Google Play game.
Not a catalogue pitch (Rift, Latch, Pack, Divide). Those stay in the pitch book. This is the game we are making.
Not a new mascot game. Playable cats are the script cats.
No spend beyond AdSense. No banners.
17. Locked design notes
- Cats from wave 3; waves 1-2 compressed meteor-only
- Poo-in-place (not thrown); vault = +1
- WATCH AD above START AGAIN; once per run
- NAME under SCORE / LEADERBOARD lower
- Portraits as lives; slim WAVE on marquee; +1 VAULT popup
- Title wordmark + METEOR ATTACK; no HEXAPUSS on PLAY marquee
- Shared board URL unchanged
- Ads live (no
data-adbreak-test); stub ~4s tap-to-skip no-fill fallback - Audio folder is
audio/(notmusic/)
18. Publish / next
- Live play URL: https://stevehinanpresents.com/meteor-attack/
- Public GDD (Phil): experimental site page under
experimental/gdd/meteor-attack/(linked from Experimental). One GDD per game. - Game Engineer does not publish live.