Fredrik Johansson 7224027a77
All checks were successful
Docker / build-and-push (push) Successful in 34s
More punch: consequence text for every letter, tiered endings
Letters l01-l20 only ever hit the generic default consequence lines
(engine.ts's DEFAULT_WRONG_CONSEQUENCES / a generic correct-route
line) — l21-l30 already had the good stuff. Gave all 20 their own
correctConsequence and wrongConsequences, matching the dry,
institutional dread already established, tied to each letter's own
specific details (the cardigan, the wrong key, the room removed from
the blueprint, Avdelning Noll's negative floors, the future self
warning about 16:42). Bumped a few penalty overrides (l04, l06, l08,
l09, l13, l15, l18) where the wrong choice is narratively worse than
the default 1/1 cost, same pattern already used on l22/l26.

Also split the single win/loss ending into four tiers based on final
suspicion: a clean TILLSVIDARE vs. a "TILLSVIDARE, VILLKORLIGT" win,
and an OMPLACERAD (composure-driven) vs. AVFÖRD (suspicion-maxed)
loss — same stamp-and-personnel-file frame, different outcome text,
so a second playthrough has something new to see even on the same
ending type.

Verified: tsc clean, 8/8 vitest (added a data-integrity check that
every letter has a correctConsequence, plus a test locking in l04's
new penalty), a real browser playthrough of l01's new consequence
text, and all four ending variants rendered by injecting finished
game states directly rather than scripting a fragile 30-letter
keyboard sequence.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-26 19:34:17 +02:00
2026-07-20 20:03:54 +02:00

Retur

Avdelningen för obeställbara försändelser.

A short bureaucratic supernatural sorting game. You have five shifts at a municipal dead-letter office. Read each letter, consult an expanding and occasionally contradictory rulebook, then route it to delivery, sender, Archive 9, or quarantine.

Later regulations override earlier ones. The letters know this too.

Stack

Vanilla TypeScript + Vite. No framework, backend, or runtime dependencies. State is kept in localStorage.

The visual language deliberately follows djupet: JetBrains Mono, near-black blue panels, restrained eldritch color, compact administrative labels, and pressure expressed through a screen-edge vignette. Retur replaces Djupet's Malmö map and idle resources with a paper desk, physical stamps, and a regulation sidebar.

Development

npm install
npm run dev       # http://localhost:5691
npm run typecheck
npm test
npm run build

Rules

  • Inspect the sender, recipient, address, postmark, letter text, and marks.
  • Select one of four routes and stamp the decision.
  • New regulations arrive each morning. Later and more specific rules take precedence.
  • Incorrect sorting costs composure and raises suspicion.
  • A completed day restores one composure; suspicion persists.
  • Survive all five days to receive a permanent position. This is not necessarily a reward.

Keyboard: 14 selects a route, Enter stamps or continues, ? opens help.

Deployment

The production image is a static Vite build served by nginx. A push to main triggers the Gitea Actions workflow, which builds and publishes repo.explewd.com/explewd/retur:latest plus an immutable short-SHA tag. The deployment host pulls that image through Docker Compose.

docker compose pull
docker compose up -d

Live: retur.games.goonk.se

Description
No description provided
Readme 304 KiB
Languages
TypeScript 84.1%
CSS 14.9%
HTML 0.7%
Dockerfile 0.3%