The unofficial ninth member of the Straphanger / Stand Clear / nyc-conductor / Subway Rat / Platform Pigeon / Subway Cockroach / Platform Cat platform: the one that actually made the news — a stocky gray-brown raccoon with a black bandit mask, pointed ears, a cream muzzle, and a bushy ring-striped tail, down on the tracks like it owns the place. Two animation loops — an idle (still body, gentle bob, an eye that blinks shut on the second frame) and a waddle (four-frame walk cycle built on the real mechanism behind a raccoon’s rolling gait, not a generic quadruped trot).
Reuse
export/raccoon-sheet.png— 204×16 strip, six 34×16 frames in order:idle-0,idle-1,waddle-0,waddle-1,waddle-2,waddle-3.raccoon-{idle,waddle}-*.png— the individual frames.raccoon@8x.png— prescaled 8× hero shot for docs/previews.
Render at integer scales with nearest-neighbor filtering or the edges smear.
Idle plays at 2 fps, waddle at 7 fps (ANIMATIONS in the module carries both).
Source
No .aseprite — the canonical source is source/subway-raccoon.mjs: a
framework-free ES module holding the pixel grids as character maps (one char
per pixel, palette at the top). Edit a grid and regenerate everything with:
node source/render.mjs
(needs site/node_modules installed — the script resolves Playwright from
there.) That one command rewrites export/, media/, thumb.png, and
the demo’s bundled copy of the module, so nothing drifts.
How the frames are built
A frame is three layers composited on the 34×16 canvas, back to front: TAIL
(a local grid, fixed anchor, attaches under the rump), LEGS (fixed anchor,
full width, peek out from under the body), then BODY on top at the frame’s
bob offset — the mask, ears and muzzle all live in one static grid, since
only the whole body moves vertically. The rump in BODY deliberately
retreats away from column 0 as it drops (row 8 starts at column 5, row 11 at
column 11), leaving a clear gap at the lower-left that TAIL hangs into —
without that retreat the body’s own silhouette paints straight over the tail
and the rings never show, the same failure mode platform-cat’s tail note
warns about. The waddle gait is a pace, not a trot: LEGS.sideA/sideB
swing the front and rear leg on the same side forward together, which is
the actual mechanism behind a real raccoon’s rolling waddle (short legs,
flat plantigrade feet) — swapping in a diagonal alternating gait reads as a
generic four-legged run, not a raccoon.
Gotchas
validateGrids()throws if any row isn’t the expected width, or a frame references a missing legs/tail pattern or eye color — call it after editing, or just runrender.mjs, which calls it first.demo/subway-raccoon.jsis generated. Editsource/subway-raccoon.mjsand re-render.- Keep the rump’s leftward retreat in
BODY(rows 8–11) if you resize anything — tighten it and the tail vanishes behind the body again, same as movingTAIL_Ytoo high without checking what row ofBODYnow sits on top of it. - The demo draws the sprite from the character maps at runtime, fine at this
size. A game should blit
raccoon-sheet.pnginstead.
Port notes
paintFrame is grid-walking with no DOM dependency beyond a 2D context —
same shape as subway-rat’s (tail/legs fixed-anchor, body bobs) — so a
DragonRuby port translates directly: keep the grids as strings, map cells to
args.outputs.solids, or just consume raccoon-sheet.png as a spritesheet
with source_x = frame * 34.