← All demos
The hobbyistBudget: $0One person, one weekend

Last Harvest

A farm boy is digging his little sister's grave. The fever took his whole family and he has caught it too. The game is held together with tape, but Tom has a past and a present: his backstory is authored once, and the game tells him what is happening right now.

Loading Last Harvest…
Click the game to focus it, then use the controls below.
WASD / arrows WalkClick Walk to a spotE Talk to, pet or pick up whatever you are next to
Make something happen in the world
Do something as the player

What this game actually sends

  1. PersonaHow they talk. Authored once.
  2. BackstoryWho they are because of what happened. Authored once.
  3. SituationWhat is going on around them right now. Sent by the game.
  4. EventThe thing that just happened. This is what they react to.
import { npc } from '@npc/client';

// The backstory lives on the server: authored once, never in game code.
const tom = npc({ key: 'pk_live_…', id: 'tom' });

// Rebuilt from game state whenever the scene changes.
tom.setSituation(
  "Dusk. Cold rain is falling. Tom is digging Lily's grave. A stranger stands right beside him.",
);

// The sparrow lands. That is the whole integration.
const r = await tom.react("A black sparrow lands on Lily's tombstone and watches him.");

switch (r.behaviour) {
  case 'whisper_to_grave': kneelAtGrave(); break;
  case 'weep':             hangHead();     break;
  case 'shoo_bird':        swingShovel();  break;
  default:                 keepDigging();
}
if (r.say) showBubble(r.say);

The panel on the right is the real trace of those calls, not a mock-up. Characters here are cast from 8 demo NPCs across three games. Read the docs →