Skip to content

feat: seat Dexter at the coffee machine with his gifts - #154

Merged
arudaev merged 4 commits into
mainfrom
feature/52-coffee-visit
Oct 24, 2026
Merged

arudaev merged 4 commits into
mainfrom
feature/52-coffee-visit

Conversation

@arudaev

@arudaev arudaev commented Oct 24, 2026

Copy link
Copy Markdown
Member

Part of #52 – Dexter waits at the coffee machine with the pocket computer.

What changes

  • Three new boards, drawn from the Mensa and lab photos (make_boards.py, gpt-image-2.5): coffee-machine (idle 3 · pour 4), mensa-food (muffin, cake, wafer, Leberkäse roll) and pocket-computer (bob 4 · open 3). They aren't exported to the game yet: that happens after your review, as it did for Dexter.
  • CoffeeVisit (game/src/story/): when the stage starts, Dexter already sits next to each coffee machine with a Dexter spawn nearby (Rusty Creek: coffee-1 and dexter-1 in rc-1-0). On the first save there he bows, sweats, then tosses the pocket computer and a muffin to the hero, and the map unlocks. Each enemy-defeated leaves a black-fluid pool where the enemy fell, and he absorbs those at your next save. That way the beat works whether or not you fought.
  • Story scenes share one atlas loader (story/atlases.ts), so Ending and CoffeeVisit no longer load dexter twice, which used to log "Texture key already in use".
  • Docs: a docs/03 diagram and sizes for the visit, plus rows in docs/07, docs/13 and the CONTRIBUTING test table.
flowchart LR
  S["stage starts"] --> W["waiting<br/>Dexter idle, 27 px"]
  F["enemy-defeated"] -.-> P["pool stays<br/>where it fell"]
  W -->|"first save"| B["bow"] --> SW["sweat"] --> G["give<br/>pocket computer + muffin"]
  G --> U["map unlocks"]
  G --> A{"pools?"}
  W -->|"later saves"| A
  P -.-> A
  A -->|yes| AB["absorb, one per pool"] --> A
  A -->|no| I["idle"]
Loading

Comparison (reference fidelity)

The sprites placed at their spots in the Rusty Creek art (rc-1-0, ×3), next to the approved hero (76 px) and Dexter (27 px):

lineup

Sprite Measured in game Against
Coffee machine 42 × 80 px the 40 × 80 coffee-1 collision box; a little taller than the hero, on its base cabinet as in photos 125138/125141
Pocket computer, closed 19 × 10 px about 45 cm at 183 cm = 76 px: the photographed lab suitcase (125955/130000) shrunk to carry
Food 13–18 px the documented 16 px pickup icons (docs/07)

Board pages: coffee machine · food · pocket computer.

Things to look at:

  • The food board took three draws. The first two drew only the muffin, so the third uses the coffee-machine sheet as a style anchor.
  • The model drew one frame per food item, not the sparkle pairs, so the game will draw the sparkle in code.

How to test

git switch feature/52-coffee-visit
python scripts/export_atlas.py coffee-machine mensa-food pocket-computer   # local only, until you approve
npm --prefix game run dev

Start, then Shift + F4:

  1. Dexter appears with a pool to his right.
  2. He bows, then sweats.
  3. The case and the muffin arc to the left.
  4. He absorbs the pool.

After that, Tab opens the map. Without the export, grey placeholder blocks of the measured sizes stand in for the items. In the real stage the visit starts when lane B's coffee save sends save with checkpoint: 'coffee-1'; that comes with Codex's #144.

Checks: typecheck passes, 49 game tests pass (6 new in coffeeSequence.test.ts), the build passes, check_docs.py passes, and 92 script tests pass.

Still open in #52

  • Export the three atlases once you approve them.
  • Codex's CoffeePoints still draws coffee-placeholder. After export, it can switch to the coffee-machine atlas (idle, with pour on save). That code is in lane B's file, so it waits until Codex's stack has landed.

Three boards from the Mensa and lab photos, sized against the 76 px hero: the coffee machine at 80 px fills its 40 x 80 save box, the food pickups are 13-18 px, the pocket computer is a 19 x 10 px case. Awaiting review; not exported yet.
CoffeeVisit seats Dexter beside every coffee machine that has a Dexter spawn. The first save there plays bow, sweat and the pocket computer and muffin gift, which unlocks the map. Pools from defeated enemies wait until the next save, when he absorbs them. Story scenes now share one atlas loader so their preloads no longer collide. Dev: Shift + F4.
@vercel

vercel Bot commented Oct 24, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
wincs Ready Ready Preview Oct 24, 2026 1:43am UTC

Request Review

@github-actions github-actions Bot added area:art Sprite sheets, stage plates, direction pack area:story Prologue, Dexter, crossings, ending area:ui HUD, crash window, title, menus area:docs Design docs, README, contributor guides labels Oct 24, 2026
Both branches added a scene to the registry: Flow from the stack and CoffeeVisit here. Fixes found playing it on the merged stage: Preload loads every atlas (story scenes loading the same keys stalled it), the machine uses the approved coffee-machine atlas, and Dexter's first pose follows a save made between frames. Dev builds expose window.game.
@github-actions github-actions Bot added area:combat Chair, guard, health, damage, save points, pickups area:stage Chunks, layers, collision, clean/anomaly states labels Oct 24, 2026
@arudaev
arudaev merged commit 294b195 into main Oct 24, 2026
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:art Sprite sheets, stage plates, direction pack area:combat Chair, guard, health, damage, save points, pickups area:docs Design docs, README, contributor guides area:stage Chunks, layers, collision, clean/anomaly states area:story Prologue, Dexter, crossings, ending area:ui HUD, crash window, title, menus

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant