Files
diariet/README.md
Fredrik Johansson 5e5ed2ec7e
All checks were successful
Docker / build-and-push (push) Successful in 49s
Add real replay variety: 15 new reports, random per-day roster
Same fix as Retur (which this engine is descended from): every
playthrough showed the same fixed 25 reports in the same order, with
zero randomization anywhere. Added 15 new reports (3 per day,
d26-d40) citing more of Djupet's event pool (the bridge's impossible
vibration frequency, the investigator in the grey suit whose shadow
didn't follow, a mirror showing an older version of the room),
bringing each day's pool to 8, and changed the engine to draw
PER_DAY_COUNT (5) at random per game instead of a fixed set.

Same shape as Retur's fix: buildRoster() shuffles and slices each
day's pool, GameState carries a `roster` generated once at
createState() and persisted, reportsForDay/currentReport read through
it. Save key bumped to v2 for the same reason — no backfill for old
saves, just start fresh.

Tests rewritten the same way: buildRoster() property tests plus
engine tests that either check general correctness or construct an
explicit roster when a specific report's behavior needs locking in
(d04's escalation-even-when-correct case).

Verified: 12/12 vitest, tsc clean, real browser test confirming 4
distinct first-report sources across 5 fresh games.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-28 21:12:32 +02:00

2.6 KiB

Diariet

Du får aldrig hela bilden. Det är jobbet.

A short bureaucratic horror game. You process five shifts of incoming tips and incident reports for a municipal office that officially handles nuisance complaints and unofficially exists to keep Djupet's cult — and whatever it's actually in contact with — off the front page. Read each report, consult an accumulating and occasionally contradictory set of guidelines, then route it: dismiss it, file it as known, flag it for your own team, or escalate it upward and lose visibility into what happens next.

You are never told the full story. Neither is the player.

Where this sits in the family

Same visual lineage as djupet and retur — identical :root palette (#0d0d1a background, the same borders and text colors) — but its own accent color (a cold institutional cyan, #4fc3d9, instead of Retur's stamp-red or Djupet's eldritch purple) and its own mechanical shape: retur's engine (routeLetter/nextDay) is the direct ancestor of this one (routeReport/nextShift), same 4-route-per-item, trust/insight-instead-of-composure/suspicion, day-by-day guideline accumulation structure.

The reports aren't invented from nothing — several cite real events from djupet's own event pool (the bleeding IKEA LACK table, Göran accidentally added to the cult's Discord, the Värnhemstorget pigeons, Turning Torso rotating), reframed as outside tips filed by ordinary Malmö residents who saw a fragment of something they don't understand. Same universe, different desk, a level further from the truth.

The mechanical twist

Unlike Retur, escalating always costs you something, whether or not it was the correct call — the Insyn (insight/notice) meter rises by one every time you choose ESKALERA, on top of any wrong-route penalty. The regulations sometimes tell you the right move is to escalate; doing so is never free. That's the core tension: being correct doesn't make you invisible.

Each shift also draws 5 reports at random from a larger pool (currently 8) — same pattern as Retur — so which reports you see, and in what order, varies between playthroughs.

Development

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

Stack

Vanilla TypeScript + Vite, zero runtime dependencies, localStorage only — no accounts, no backend. Same Docker/nginx/Gitea Actions shape as the rest of this family's small static games.