I Built the Most Robotic NPC I Could — To Prove Why NPCs Feel Fake (And How to Fix It)

Summary
I built the most robotic, predictable NPC dialogue system I could — on purpose.
Not because I wanted a bad character… but to expose why most NPCs feel fake.
The answer? No memory, no context, no personality.
This simple rule-based system (Python + JSON) is the baseline — and the first step toward fixing it.
Code: https://github.com/adheeb2/DialogueEngine (Github repo)
Meet the Dumbest NPC I Could Build
He doesn't remember your name.
He says the same thing every time.
He doesn't care if the player talks with him or not.
He's intentionally dumb — because I needed to see the problem up close.
This isn't AI-powered NPCs. It's not voice-driven. It has no emotion.
It's just a rule-based NPC built with Python and JSON — and it feels exactly like the NPCs most games still use today.
And that's the point.
You can't build lifelike AI NPCs for games until you understand what's missing.
🗂️ Project Structure
DialogueEngine/
├── main.py # Entry point and command interface
├── dialogue-manager.py # Core dialogue logic
├── player.py # Player state, inventory, quests
├── utils.py # Helper functions
├── data/ # Dialogue configs in JSON
│ └── hermit.json # Sample NPC dialogue
├── LICENSE # MIT License
├── images # Images
💬 Talking to the Hermit (A Conversation That Never Changes)
Here's how it works(I don’t have a UI for now, so i went on to create it in a terminal) :
> talk to hermit # Start conversation
> give_amulet # Add "amulet_of_light" to inventory
> status # Check inventory and quests
> quit # Exit
And here's the JSON that drives it:
{
"npc": {
"name": "old hermit",
"start_node": "greet"
},
"nodes": {
"greet": {
"text": "hello my dear traveller",
"options": [
{ "text": "who are you", "next": "explain" },
{ "text": "what do you want", "next": "quest_check" }
]
},
"explain": {
"text": "I am old hermit,May i know your name?",
"options": [
{ "text": "i dont care who you are, im going", "next": "farewell" },
{ "text": "what do you want", "next": "quest_check" }
]
},
"quest_check": {
"condition": "has_item:amulet_of_light",
"true_next": "quest_ready",
"false_next": "quest_locked"
},
"quest_ready": {
"text": "Ah, you carry the Amulet of Light! Then you are worthy.",
"options": [
{
"text": "yes here it is",
"next": "quest_give",
"action": "remove_item:amulet_of_light,give_quest:slay_dragon"
},
{ "text": "On second thought, not now", "next": "greet" }
]
},
"quest_locked": {
"text": "Only the worthy may receive my quest... Return when you have the Amulet of Light.",
"options": [{ "text": "I'll be back later", "next": "greet" }]
},
"quest_give": {
"text": "Then go! Slay the dragon!",
"options": [{ "text": "I won’t fail you", "next": "farewell" }]
},
"farewell": {
"text": "farewell",
"is_end": true
}
}
}
Same every time. No variation. No memory.
Predictable = Fake
So Why Do NPCs Feel Fake? (The Core Problems)
After building this "dumb" NPC, I confirmed what many players already feel:
1. No Memory
The hermit doesn't remember if you've talked before.
Every interaction is Day 1, no matter how many times you return.
2. No Context Awareness
It doesn’t respond differently to different users. There is no immersion.
What we need is an NPC that is aware of its surroundings.
3. No Personality
Flat tone. No sarcasm, no emotional depth.
Just text on a screen.
These aren't small issues.
They're the reason NPCs feel fake — even in AAA titles.
How This "Dumb" NPC Is Actually Smart (Long-Term)
Yes, this NPC is robotic.
But that's because it's designed to evolve.
This system uses:
✅ JSON-driven dialogue → Easy to edit without touching code
✅ Conditional branching → Reacts to player inventory/choices
✅ Modular design → Ready for memory, voice, and AI layers
So while today he feels fake…
Tomorrow, he'll be an AI-driven NPC with personality, memory, and emotion.
This is Project 1 of 15 — not the final product.
❓ FAQ
Q: Why build a bad NPC on purpose?
A: To understand the baseline. You can't improve something until you see its flaws clearly.
Q. How are AI NPCs different from traditional NPCs?
A. Traditional NPCs are scripted, while AI NPCs use real-time language models to create unscripted, interactive conversations.
Q: Can this scale to real games?
A: Not alone. But it's the foundation. Future layers (memory, voice, AI) will make it production-ready.
Q: Why use JSON instead of hardcoded dialogue?
A: So designers can edit dialogue without breaking code. It makes the system flexible and maintainable.
Q. Is AI the future of NPCs?
A. Absolutely. Artificial Intelligence is already transforming NPCs from predictable characters to dynamic, memory driven entitites. Companies like Convai, Inworld AI build NPCs that acts and remembers accordingly to the user.
Q: Where's the code?
A: 👉 https://github.com/adheeb2/DialogueEngine (Github Repo)
👋 Closing
This NPC is fake.
And that's the whole point.
Most NPCs feel fake because they're built like this — static, predictable, disconnected.
But now I've got the baseline.
Next up: Project 2 — Giving This NPC a Personality
Same code. Same JSON. But now he'll have some personality and sounds authentic — not a robot.
Stay tuned.
Built by Adheeb Anvar — Conversational AI Developer
(Not Anwar — yes, I get the emails)
Subscribe to my newsletter
Read articles from Adheeb Anvar directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by

Adheeb Anvar
Adheeb Anvar
I’m a backend engineer diving deep into conversational AI — building chatbots and NPCs that don’t just reply, but remember, react, and feel alive. Most of my projects start with solid backends — NestJS, FastAPI, Go, Postgres, Redis — but my focus is on turning those systems into the foundation for more human-like AI interactions. This is where I share that journey: the experiments, the missteps, and the wins. From procedural NPC dialogue to multi-agent AI systems, I’m documenting the whole process here