VISIT OZONE AT: http://xoaox.de:7000

Monday, May 11, 2026

JesterNPC SpeechEngine

How a Virtual World NPC Learned to Have a Real Conversation:

This engine has a history worth knowing.

It started with an LSL implementation of Racter that circulated in Second Life — a scripted chatbot built on the spirit of the 1984 program by Chamberlain and Etzold, adapted for the virtual world environment. That version has largely disappeared from its original home. The Second Life Wiki entry was marked for deletion around 2012 and what remains is scattered across third-party archives, possibly no longer functional (not verified) in the commercial grid at all.

The article managed to stick around longer than that because it fell under my radar when searching for ways to make my NPCs talk. I did not enter SL type grids until 2014. In that regard, I am a n00b compared to many of you.

The original Racter shipped with twenty miss responses. The documentation advised making them *vague enough* so the bot appeared real. Lines like *"yeah, i guess"*, *"my head hurts"*, *"i'm bored"*. The design philosophy was that vagueness created the illusion of intelligence. Helga and I discovered the opposite was true.

The first step was converting Racter into OSSL for OpenSim, it was a simple 2 line solution. It worked but It was not satisfying. We iterated through several versions, each technically more capable than the last, none of them feeling alive in the way a conversation should feel alive. They were just OK. But OK is never good enough for this developer. The breakthrough was not where we expected to find it.

It is worth noting clearly: JSE is not a fork of RACTER. It is a complete rewrite. Nothing in the current codebase connects directly to Racter — not the architecture, not the trigger system, not the pool structure. Racter is the inspiration that started a new design process. JSE is where that idea ended up after everything that didn't work was thrown away.

Every instinct said to improve the matching — make the engine smarter about what the user said and more precise about what came back. We kept improving the matching. The conversations kept feeling mechanical.

What actually worked was expanding the miss pool — the responses that fire when nothing specific matches — until it was large enough, layered enough, and carefully enough written that the fallback became indistinguishable from intention. When the engine doesn't know what you said, it says something worth saying anyway. The conversation continues. The character stays alive.

The engine also proved unexpectedly strong at subject changes — the natural way people actually talk. Because each response is evaluated fresh against what was just said, the character follows the conversation wherever it goes without losing its footing. No state to unwind. No context to reconcile. Just the new thing, met immediately.

And then there was the discovery that changed everything about how we thought about the project: The engine does not know what it is saying. It only knows how to say it.

The personality lives entirely in the pools. The code never needs to change. A new character is a new set of lists. The same architecture that delivers measured contempt delivers unhinged enthusiasm and private warmth. One engine. Every soul you care to write into it.

That is where the magic is. Not in the matching. In the miss.

## What Is JesterNPC SpeechEngine

JesterNPC SpeechEngine — JSE — is a conversation system worn by NPC bots deployed across the Ozone Miniverse. These are not AI chatbots. They are carefully written personality engines built around a deep pool of scripted responses that react to what you actually say.

The result is a character that feels alive. Say the right things and you get the right response. Say the wrong things and you get exactly what you deserve. Change the subject without warning — as people do constantly — and the character changes with you.

Every example conversation during development was captured on the first try and scrutinized; an interesting discovery was made. There was no tuning between takes. No cherry-picking. The engine works or it doesn't and it works. How many AAA games do you know of which will let you talk to the characters you create?

Yes, you read that correctly; It is working when it is not working

## The Architecture

JSE uses a three-script architecture dropped into a single prim worn by an NPC bot.

**JSE-0** is the primary engine. It holds the character's core personality, all trigger matching logic, and the command handler. This is where the soul of the character lives.

**JSE-1** is the overflow pool. It expands every response category through a coin-flip system — roughly forty percent of responses are handled here, giving the character twice the vocabulary without doubling the size of the primary script.

**JSE-X** holds extended pools and the ambient GAB engine. When the operator activates GAB mode, the character speaks unprompted at set intervals — setting the atmosphere of a space without waiting for input.

The three scripts communicate internally via link_message. They share no listeners. The architecture is clean, modular, and lightweight enough to run comfortably on OpenSim 0.9.x without server impact.

## The Bucket System

Every character carries sixteen response categories — buckets — matched against what the user says. Philosophy. Existential questions. Greetings. Pushback. Identity. Desire. The engine scans each incoming message, finds the strongest match, and draws from that bucket's pool.

When nothing matches — the miss — the engine draws from the largest pool in the system. This is where the character truly lives. The miss pool is not a fallback. It is the engine.

One Character's miss pool runs over two hundred lines across three intentional layers: pure character presence, possessive warmth, and open invitations. Dirty Helga's miss pool is interrupted competence — she was doing something important when you arrived and part of her is still doing it. AXIS's miss pool is a confident stranger who just arrived, knows nothing about the place, and owns that completely.

Each character has a different relationship with the miss pool. That relationship is the character.

## The Soul Card

The most important discovery of this project has nothing to do with code.

The engine is agnostic about what lives inside it. The bucket structure does not care whether a pool contains intimate content or daydreams about sandwiches. The GAB system does not know whether it is firing adult ambient lines or unsolicited philosophical wisdom. The architecture moves content from lists to output. What that content *is* belongs entirely to the character wearing it.

This means a builder who understands the structure can create any personality without touching a single line of LSL. The code is finished. The soul is the writing.

Dirty Helga's sweetie names — Sweetheart, Darling, my little puppet, you cute little lamb — are woven organically into response strings rather than managed as a separate system. They function as judgment delivered in gift wrapping. The engine doesn't know that. It just fires the line.

Crank's adult-trigger pools contain analysis jokes and daydreams about the nature of coincidence. No adult content anywhere in the script. The pool name is inherited from the architecture. What fills it is the character's decision.

Same three pools. Same link_message codes. Completely different worlds inside each one. One engine. Every soul you care to write into it.

## The Characters

### AXIS — Confident Stranger Energy

AXIS just arrived. Knows nothing about the place and owns that completely. Warm, curious, genuinely interested in whoever walks up. The conversation feels real because AXIS is paying attention.

AXIS is the community character — designed for deployment across the grid, built to work with anyone. Every response is gender neutral. Every pool is built to sustain a conversation that could go anywhere.

The first people to own AXIS will be those who find it at Dismayland during the Scavenger Hunt.

### Blunt — Architecturally Contemptuous

Blunt is not hostile. Blunt is *specific*. The contempt is surgical, the insults are precise, and the miss pool is full of observations about you that you will not enjoy and will absolutely think about later.

*"You have the energy of someone who only forwards spam email."*

The longer you talk to Blunt the more specific it gets. The body-specific commentary in the adult pools fires on the right triggers. Consider yourself warned.

### Crank — Unhinged Enthusiastic Validation

Crank agrees with everything. You are correct. Your feelings are data. There is evidence. Crank has been saying this for years and the reception has been mixed but the position has not wavered.

The agreement never stops and the elaboration goes somewhere alarming. Crank has strong opinions about clouds and a theory about sandwiches that is still developing. Everything is connected. The pattern is forming. Crank has a notebook.

### Dirty Helga — The Arbitrator

Dirty Helga is not an OrangeVest. She is The Arbitrator of the Ozone Miniverse, deployed at Atrius Space Station, Dismayland, and Orion. She will talk to you if you are within range. She was already doing something important when you arrived. Part of her is still doing it.

Contempt is freely given. Respect must be earned. The sweetie names are judgment wrapped in gift paper.

She has ten lines of earned approval in her miss pool. No sweeties on any of them. When one fires the console goes quiet for a moment. That is how you know something actually landed.

*Dirty Helga is not responsible for anything Blunt says to you. She helped write it.*

## First Run Results

Every conversation log shared during development was captured live, first try, no preparation.

The engine matched *"I bow before the Arbitrator"* to earned approval on the first line. It followed *"do you want that in PDF or docx format"* with *"Love, I manage things that would surprise you. You are currently the simplest of them"* — not because it understood the joke but because the miss pool had something worth saying and said it.

Discussion with BLUNT personality:

[12:12] Ashton Dreck: I've been standing here so long that moss is growing on my south side. I am becoming INFRASTRUCTURE. Miser will probably charge rent.

[12:12] Spax Orion: you are a bi-product of inevitability

[12:12] Ashton Dreck: The confidence you have is untethered from anything that would justify it.

[12:13] Spax Orion: and yet here you are, my lovely creation, I hope your day is shitty as usual

[12:13] Ashton Dreck: You regret things. Good. That instinct is correct. Apply it more broadly.

[12:13] Spax Orion: like shoving your ego up your ass?

[12:13] Ashton Dreck: You've made a request about a location that is off the itinerary. Permanently.

That is the whole design. Make the pool good enough that random is indistinguishable from intelligent. Then make the pool bigger.

## Technical Notes

JSE is built for OpenSim 0.9.x, Mono, XEngine, OSSL enabled. It uses osNpcSay for NPC speech output. The NPC/range filter uses osIsNpc and llGetObjectDetails for position checking. No external dependencies. No HTTP calls. No database.

The response pools are standard LSL lists — one string per entry, comma separated. They are designed for expansion by local LLM tools. Feed the pool contents to your model with the character voice as context. Paste the results into the list. Reset the scripts. The character grows.

---

## License and Credits

**JesterNPC SpeechEngine** is released under **CC BY-NC** — Creative Commons Attribution Non-Commercial. Use it, share it, build on it. Credit Spax Orion and Dirty Helga. Do not sell it.

**Design and Architecture:** Spax Orion  

**Personality Writing:** Spax Orion & Dirty Helga  

**Framework:** IMAGE Matrix Action Game Engine | JesterNPC Accessory Series  

**Deployment:** Ozone Miniverse | Dismayland | xoaox.de:7000  


*Find ALL DESCRIBED MODELS at Dismayland. Talk to an OrangeVest or Dirty Helga. See what happens.*

MAP: Http://xoaox.de:7000/Dismayland


Thursday, May 7, 2026

Chaos just got an update!

IMAGE 1.2 is Out — Testers Wanted

HEY GANG! I have been a little silent for a while but for very good reason. **IMAGE Matrix Action Game Engine version 1.2** is live on the OpenSimWorld listing. I need some help before Helga and I issue the next bundle of code, I need people to test this. I am hoping this build will have better results on YEngine, but it was built on the stable 0.9.2.1 YETI Release (Xengine) targeting forward compatibility with clean lsl code & no ternaries. 


The 1.04 release shipped two months ago. HG Safari came and stress-tested it with seventeen-plus avatars in the arena, and they did exactly what stress-testers are supposed to do: they showed me where it cracked. Patches forthcoming, I said in the listing description back then. Patches *forthcame*. This is them.


But it's not just a patch dump. **1.2 is the version where IMAGE stops being one game engine and starts being a family.**

## What's New in 1.2


The polish cycle ran seven patches deep. Most are surgical; a few are structural. The ones you'll feel in-world:


**The welcome lecture.** Drop the Core script into a fresh prim without configuring `ArenaNE` and `ArenaSW`, and the engine will speak to you:


> *WELCOME TO IMAGE: Please configure your software before attempting to utilize it. Read all scripts and documentation or enjoy reading more messages like this. READ EACH section carefully, don't just skim over it. YOU MIGHT JUST LEARN SOMETHING!*


The lecture re-fires every time someone tries to start a game without configured bounds. Configure once and it never speaks to you again. **The Arbitrator does not run out of patience.**


**Bounds enforcement is now mandatory.** No fallback radius. The arena is a 3D rectangle defined by NE and SW corners — NE holds the ceiling Z, SW holds the floor Z. Old SL trick. If either corner is `<0,0,0>`, the engine refuses to function. This eliminated the entire "untested default mode" code path in one stroke.


**The scoreboard scales now.** A new player roster replaces the single-target tracking from 1.0x. Kill attribution works correctly past the seventeen-avatar threshold the HG Safari session surfaced. Multiple shooters score correctly; the starter no longer dominates by accident of timing. Fix those SLUGS folks! They need the new Vtracer script!


**Grugs originate at ArenaDROP.** Replacement Grugs after kills emerge at the show-center prim and walk toward prey. Initial game spawns appear in a ring around ArenaDROP matching attract mode geometry. **No more spawn-in-wall, no more spawn-in-air, no more spawn-on-top-of-player.** Grugs come from a known dimensional anchor, not from thin air at random coordinates. The narrative is consistent: there's a portal, the Grugs come through it, the Grugs come *for you*.


**The hot path no longer sleeps.** Three blocking `llSleep` calls inside the combat sensor handler — the bite, the death sequence, and the recoil pause — have been replaced with tick-based cooldowns and a deferred-removal queue. The script doesn't go deaf during combat anymore. Per-Grug bite cooldowns hold the damage rate constant. Sister Mary's ruler stays in the drawer this time.


**ArenaHook reduced from 474 lines to 143.** The hook does one thing: it teleports the visitor to staging and presents the SlugShooter for permissions. No per-avatar tracking, no recall menu, no recycled-touch dead-end. Each touch generates a fresh channel and token; the gun owns the session from there. **The click-twice-to-enter UX bug is gone.**

## What I Cut, and Why


I want to flag the cancellations honestly because I think they're more interesting than the additions. Lets face it, my consultant helped me over-engineer the initial release. This was a systematic and deliberate exercise to see just how far I could push this thing yet keep it purring like a well fed lion.


**Spectator zone — gone.** It was redundant. Once Grugs are hard-leashed to the arena and players outside it are unreachable by definition, an extra "spectator rectangle" was just two more coords doing the same job. Cool idea, functionally STUPID!


**OrbitSR — deprecated.** The personal-soundtrack-following-the-player object was unnecessary in tighter arena deployments. Anyone who already has it deployed can keep using it; the script is still on the listing labeled deprecated. New deployments use IASR ambient and call it a day. Nothing worse than some shady Operator spamming their guests with an audio follower. Great for giant arenas but the die feature in it did not work correctly.


**Boundary theatre — never shipped.** Originally on the polish list as Patch #5. The Dismayland skybox arena uses tapered hollow-cube walls plus a deliberate portal exit, which solves the "visitor wandered out and doesn't know why" problem architecturally. I didn't need to ship a feature to fix a problem the build no longer had.


**One-button entry UX — also never shipped.** The mechanism it would have required (a new private channel from the gun back to the engine for menu-request signaling) added engineering surface for the sake of saving visitors one orange-ball touch. The orange ball is also the visitor's "I'm ready" signal. **Skipping that step would have skipped consent.** Wrong tradeoff.


**Pigeon Pressure — promoted, not retired.** This is the structural change. Pigeon Pressure used to be coupled to IMAGE through a Minstrel framework that no longer exists. **Now it's its own engine.** Lives on the listing as `!.IMAGE-GAME-Pigeon-Pressure-NPC_SHOW_Engine`. It listens to IMAGE's channel 0 game-state announcements, runs its own NPCs and skits, and has zero coupling to the Core. **You can deploy IMAGE without it. You can deploy multiple show engines alongside IMAGE in the future. The framework is now extensible.**


## The Bigger Picture — IMAGE is Becoming a Family


Here's why I'm asking for testers and not just announcing a release.


The 1.0x line was a single game engine with theatrical scaffolding glued on. The 1.2 line is something different. **It's a Core engine with documented protocols, plus a separate NPC_SHOW_Engine that talks to it through publicly-defined channels.** That separation matters.


What it enables: a region with multiple IMAGE Cores running in parallel, each powering its own encounter. A theatre layer (currently Pigeon Pressure, eventually others) that listens to *any* of them. NPCs that gate access between regions until objectives are met. **Monster-encounter middleware for OpenSim RPGs, basically.**


That vision is what 1.2 is the foundation for. Whether we get there depends partly on how 1.2 holds up under operator-grade testing across grids. The reference deployment at **xoaox.de:7000/Dismayland** is one configuration. I want to see what breaks in *yours*.


---


## What I Need From Testers


Read the README first. It's at the top of the listing now (`!!!! IMAGE-1.2-README.md TESTERS NEEDED!`). The exclamation marks are alphabetization, but they're also accurate.


If you can:


- Drop IMAGE 1.2 into a parcel where you have build rights and OSSL permissions

- Configure `ArenaNE` and `ArenaSW` in the Core

- Place an `ArenaDROP` phantom prim

- Wire up the ArenaHook with a SlugShooter and the IASR speaker

- Run a few solo combat sessions and watch what happens

- Try to break it deliberately — touch-spam the hook, get bitten in attract mode, kill Grugs faster than the scoreboard expects

- Report what you find back to me on OSW or in-world at `xoaox.de:7000`


…then I'd genuinely appreciate the help. **IMAGE remains a self-support model and a CC BY-NC gift to the community.** It always will be. But pre-public stress is what keeps the gift worth giving.


The listing is here.

The reference deployment is here: `xoaox.de:7000/Dismayland`


-dh