# Mopi Reaction Master Set

The single source of truth for every Mopi reaction export — GIPHY, Kakao
emoticons, Discord/Telegram/WhatsApp/LINE packs, and anything after those.
Regenerate with:

```sh
node scripts/run-python.mjs scripts/build_reaction_masters.py
```

Do not hand-edit files in here, and do not draw a new Mopi per platform. Every
platform pack crops or converts from this set so the character stays identical
everywhere it lands (`docs/FREE_CONTENT.md`).

## Formats, and which platform each one feeds

| File | Format | Goes to |
| --- | --- | --- |
| `mopi-<morph>-<reaction>.webp` | transparent animated WebP, 256×256 | GIPHY **stickers** — the sticker search inside Instagram, TikTok, Snap |
| `mopi-<morph>-<reaction>.gif` | opaque animated GIF on the cream plate | GIPHY **GIFs** — Facebook, X, WhatsApp |

The GIF variant is deliberately not transparent. GIF's 1-bit alpha cannot hold
an antialiased silhouette edge, so a transparent GIF fringes on every surface
that composites it; flattening onto the brand cream (`#f7f0e0`) avoids that.

Frame timings come from the desktop app's own `STATE_DEFS` (`site/script.js`),
so an exported reaction plays at the speed the character actually moves.

## Coverage

11 of the 20 reactions named in `docs/FREE_CONTENT.md` are built. The other 9
have no source animation and need new art before they can ship:

```text
confused    curled-up   dangling    falling    nodding
shy         tiny-wave   tired       touched
```

`falling` is desktop drop physics and `touched`/`dangling` are the iOS mesh
deforming live under a finger — neither is a frame sequence, so both need to be
authored rather than extracted. The rest have no sprite row at all.

Nothing was mapped onto a near-enough state to pad the count. These get
uploaded to a search index where the label is how people find them, so a
mislabeled reaction makes the whole set less findable, not more complete.

### Cream is the gap that matters

| Morph | Reactions covered |
| --- | --- |
| patch, dusty, blush, speckle, tip, fluffy, odd | all 11 |
| **cream** | **3** — `sleeping`, `waiting`, `waking` |

Cream predates the Sprite Gen pipeline and only ever got idle/sleep/wake/walk
exported per-frame. It is also the default morph, the app icon, and the face on
every marketing surface — so the first GIPHY channel and the first Kakao
emoticon proposal either lead with a different morph, or Cream gets run through
the sprite pipeline for its missing 7 states first. That is an open decision,
not an oversight.

See `reaction-masters.json` for the full generated inventory.
