← 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.
WASD / arrows WalkClick Walk to a spotE Talk to, pet or pick up whatever you are next to
What this game actually sends
- PersonaHow they talk. Authored once.
- BackstoryWho they are because of what happened. Authored once.
- SituationWhat is going on around them right now. Sent by the game.
- 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 →