How NPCs Learned to Talk#

When NPCs first got “their own voice,” individual lines became livelier, but the conversation did not come together. In v0.11, the simulation already owned the facts and decided what to do: speak, deflect, change the subject, or admit that the NPC knew nothing. The model did not invent facts — it chose manner and wording, while the game supplied the factual part on the NPC’s behalf.

From Scripted Lines to a Single Turn#

Response options were prepared in advance and saved. If a line failed validation, a fallback answer remained. That gave variety within a single reply, but not dialogue: the parser read each player line separately, so fragments like “what’s it made of?” or “did he go right away or what?” had nothing to anchor them. Scripted lines did not add up to a conversation.

One Turn, Strict Bounds#

In v0.12, the task changed: not “find a line for a known action,” but “give one NPC one reply with a short conversation history.” For the reader, this is a micro-agent — not a permanent, omniscient character, but a single turn with context, tools, and one line.

The turn receives the speaker, the listener, the place, the time, the player’s words, and several recent lines. The NPC can request only the facts and location information available to them. Secrets are filtered out before the model sees them, the reply is checked afterward, and the result is recorded so the exchange can be reproduced exactly.

The player calls Savva Gromov “Shchava” three times. Savva first corrects the name naturally, then, in his answer about Nizhny Novgorod, adds an extra fact about his route. After the player says “so the contract was for the wrong man,” Savva is immediately killed with a crossbow.
The same bounded turn inside a world that is not paused for conversation. The screen is an English rendering of the journalled Russian session.

Why Characters Began to Speak Differently#

Early runs exposed errors that instructions alone could not fix: Kuzma called his workshop “in Kuzma’s workshop” instead of “in my workshop,” Mara’s niece did not recognize her aunt standing next to her, and an NPC sometimes retold the player’s own actions back to the player. Some of these were fixed through game rules rather than model instructions: first-person references for one’s own places, family relationships, awareness of what the other person has already seen or heard, and skipping the player’s own actions.

Then it turned out that everyone spoke in the same folk register — “sir,” “my good sir,” “we’re scraping by.” The turn knew the character’s personality, gender, feelings, and formality, but not how the character actually spoke. Each NPC received a speech profile: tempo, syntax, vocabulary, forms of address, emotional reactions. The profile controls manner, not knowledge; it does not suggest facts, names, or sources.

Before the profiles, Kuzma sounded like this:

Old Kuzma: “I’m making them, sure. I made a bolt with a red thread in Kuzma’s workshop — that’s the whole tale.”

Afterward, he remained himself but spoke differently:

Old Kuzma: “I didn’t pull this out of thin air, friend. The Watch ordered a batch of bolts from me — to the Watch house by 20:00, for 3 rubles. And the work needs hands: 49 pieces in the batch are ready.”

And Mara got her own rhythm:

Mara: “A detective! Ha! And here I thought you were coming to clean my fish. Well, did you find anything?”

This is not a controlled experiment where everyone answers the same question; these are examples of how each character gained a recognizable voice.

How NPCs Stopped Repeating the Obvious#

In v0.13, an NPC remembers only a few recent lines and takes into account what the player has already seen or heard. This makes conversations slightly more coherent, but the memory is still short.

Sometimes the logic broke down: Kuzma retold the player something the player had just seen, and the newspaperman confirmed the obvious fact about the tavern’s only door. Agafya again offered a contract the player had already accepted in her presence. Yashka spoke three times about the search for Savva’s killer, even though Yashka had killed Savva himself. Agafya recalled Savva’s morning plan even though she already knew about his death.

Now obvious facts no longer appear in a normal reply, but an NPC can repeat them when directly asked. The deceased’s outdated plan is removed as soon as the speaker learns of the death.

The Model Chooses the Words#

We want conversation with an NPC to feel comfortable without pretending the NPC is a player. Keep the game convention visible—that is honest. The character feels alive because it shares a world, knows only what it has seen, reacts to recent context, speaks in a recognizable voice, and follows clear rules.

The model does not decide what is true. The game remembers what the character saw and heard and determines which actions are possible. The model only chooses words and tone. This clear division of work, not long prompts, is what makes the result convincing.