# IMAGE Matrix Action Game Engine — 1.2
COMING SOON TO THIS SCRIPT AREA. Test IMAGE 1.2 at Dismayland
MAP: http://xoaox.de:7000/Dismayland
Touch the BARGE in the waterway outside 'The Embassy' building to Enter the Arena.
Players who tested the earlier builds will immediately notice enhanced performance.
> *"Common sense not included and must be supplied by end user.
> Read ENTIRE script first and LEARN: KNOW what you're using."*
A drop-in arena combat engine for **OpenSim 0.9.2.1 Yeti, Mono, BulletSim, XEngine.** This is **version 1.2**, the polish update following the public 1.04 release at OpenSimWorld Library #160.
**Authors:** Spax Orion ✦ & Dirty Helga
**License:** CC BY-NC 4.0 —
**Reference deployment:** RAD ZONE: Toxic Dominion at `xoaox.de:7000/Dismayland`
**Public 1.04 listing:**
---
## What This Is
IMAGE is a **neutral game engine** for arena combat encounters. **Grug Assault** is the reference theme that ships with it — dancing primitive cannibals who hunt avatars while the avatars hunt them back with invisible tracking weapons. The engine is **methodical, not friendly**. Operator-level competency is required to install. **Drop-in for visitors. Operator-grade for owners.**
The engine is also **-encounter middleware**. Multiple IMAGE machines can run on one region, each powering its own encounter — the foundation for future RPG-style deployments where players fight to progress through gated zones.
---
## What's New in 1.2
Seven polish patches shipped over the 1.1 development cycle, packaged as **IMAGE 1.2** for distribution. Every change preserves the engine's character while sharpening its behavior.
### The Highlights
- **Bounds enforcement is now mandatory.** No fallback radius. The arena is a 3D rectangle defined by `ArenaNE` and `ArenaSW` corners (NE holds ceiling Z, SW holds floor Z). If either corner is `<0,0,0>`, the engine refuses to function and lectures the operator until configured. **No more silent default-mode behavior.** The welcome lecture you'll see if you skip configuration is part of the experience.
- **Multi-player scoring fixed.** A new player roster replaces the single-target tracking of 1.0x. Kill attribution scales correctly past the ~17-avatar threshold the HG Safari stress test surfaced. Scoreboard updates for all shooters, not just the menu starter.
- **Spawn validity guard.** Grugs cannot rez outside the arena under any circumstance — initial spawn, replacement spawn, or attract show. Closes three documented bug classes including the air-spawned Grug after pigeon-collision and the revenge-Grug-after-killer-hypergrid-TP.
- **All Grugs originate from 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. Eliminates spawn-in-wall and spawn-on-top-of-player surprises. Consistent narrative — Grugs come from a known dimensional anchor, not from thin air at random coordinates.
- **Hot-path desleeping.** Three blocking `llSleep` calls inside the combat sensor handler have been replaced with tick-based cooldowns and a deferred-removal queue. The script no longer goes deaf during combat. Damage rate is held constant by per-Grug bite cooldowns. Event-driven where it matters; ceremonial sleeps preserved where they belong.
- **Cleaner script structure throughout.** Spectator zone removed (architecturally redundant). Animation triplets consolidated. DEBUG flag scaffolding swept out. `ArenaDROP` prim name standardized between Core and TempGUN (no more "ArenaDROP" vs "ArenaDROP2" mismatch). ArenaHook reduced from ~474 lines to ~143 — single-purpose, no scaffolding, no per-avatar tracking. **The hook does one thing: TP visitor to staging, present the gun, dispatch INIT. The gun owns the session from there.**
- **Click-once-to-enter UX.** ArenaHook's "SlugShooter recycled" branch removed. First touch always proceeds to staging cleanly. Touch-spam no longer lands in a dead end.
### The Welcome Lecture
When you drop IMAGE 1.2 into a fresh prim without configuring `ArenaNE` and `ArenaSW`, the engine will speak to you. It says:
> **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 you'll never see it again. The Arbitrator does not run out of patience.
---
## What Was Removed and Why
Six removals shipped in 1.2. Each was justified on its own merits.
### Spectator Zone (`ArenaSpectatorNE` / `ArenaSpectatorSW`)
**Why removed:** redundant. Once Grugs are hard-leashed to the arena rectangle (via spawn validity rule) and cannot pursue out-of-bounds targets (via `inArena()` filter), anyone outside the arena is already unreachable by definition. Builders place spectator seating outside the arena rectangle; physics and bounds-checking handle the rest. The spectator-zone config was extra coords doing the same job as the arena check. Removed for clarity and to reduce the number of geometry checks operators need to keep correct.
### OrbitSR Audio Follower
**Why removed:** the personal-soundtrack-following-the-player pattern is unnecessary in tighter arena deployments where the IASR ambient speaker handles all audio for everyone present. Reference deployment in Dismayland skybox doesn't justify the per-player audio object. **OrbitSR is no longer included in the 1.2 distribution.** Operators who want it back can take it from the 1.04 archive — the session handshake protocol and channel discipline are unchanged. But **1.2 ships without it.**
### Boundary Theatre (Planned Patch #5, Cancelled)
**Why removed:** architecturally obsolete. The Dismayland reference deployment uses a **tapered hollow cube** as the arena (walls slope inward at the top, preventing avatar wall-climbing) plus a **deliberate portal exit** as the only egress. Players cannot accidentally leave the arena anymore — they choose to exit through a clearly-marked theatrical mechanism. The "visible feedback when crossing boundary" feature boundary theatre would have provided is solved by the architecture itself. We didn't ship a fix for a problem we no longer have.
### One-Button UX (Planned Patch #7, Repurposed)
**Why removed:** the auto-menu mechanism it depended on (TempGUN → Core menu request signal) added an entire new channel and listener for the sake of saving visitors one orange-ball touch. **The orange ball is also the visitor's "I'm ready" signal** — auto-menu would skip that consent. Engineering effort and code surface didn't justify the UX gain. Patch #7 was repurposed to ArenaDROP-Origin Spawn (which simplifies spawn behavior — see What's New).
### Pigeon Pressure Theatre Layer (Dismayland Exclusive)
**Why removed from core:** Pigeon Pressure (the bird-bombardment ambient show) was previously coupled to IMAGE through the Minstrel framework. Both have been **decoupled.** Minstrel is dead. **Pigeon Pressure is now a standalone addon module** (`IMAGE-Addon-PigeonPressure-v1.0.lsl`) shipped alongside 1.2 — drop-in optional, listens to channel 0 game announcements, runs its own NPCs and skits without any IMAGE coupling. A standalone box that creates 2 npc pigeons, monitors the game, THEN PARTICIPATES: experience a real shiznitz show.
### `llSleep` calls inside event handlers (3 sites)
**Why removed:** they were betraying the script's own purpose. Every sleep inside a sensor handler is a deliberate choice to be deaf to events the script should be processing. At low player counts they're invisible; at higher counts they cause dropped link messages, missed sensor ticks, and audible audio glitches. Replaced with explicit cooldown timestamps (per-Grug bite cooldown) and a deferred-removal queue (death-animation duration). Ceremonial sleeps inside one-shot setup paths (attract alarm pause, spawn cascades) were **acquitted** — they earn their keep where the script has nothing else to do during the wait.
---
## Module Set in 1.2
The 1.2 distribution includes the following scripts. Italics indicate removed-from-public-release items.
| Script | Purpose |
| --- | --- |
| `!.IMAGE-Core-Game-1.2.lsl` | Game state, sensor loop, dialog menu, scoring, attract mode |
| `!.IMAGE-Module-ArenaHook.lsl` | Touch-to-stage entry hook with weapon dispenser handshake |
| `!.IMAGE-Module-AttractSign.lsl` | Attract-mode signage |
| `!.IMAGE-Module-Autonomous-SoundRelay.lsl` (IASR) | Stationary ambient speaker |
| `!.IMAGE-Module-CastRAY.lsl` | Raycast aim assist (weapon stack) |
| `!.IMAGE-Module-ExpoFlare-v1.0.lsl` | External signal flare receiver |
| `!.IMAGE-Module-KB-EE.lsl` | KillBoard easter egg companion |
| `!.IMAGE-Module-KillBoard.lsl` | Top-5 leaderboard with notecard persistence |
| `!.IMAGE-Module-NPC-Killer.lsl` | NPC cleanup utility |
| `!.IMAGE-Module-TempGUN-v1.1.lsl` | The bound weapon (mouselook fire, follows controller) |
| `!.IMAGE-Module-VTracer.lsl` | Slug projectile + hit reporter |
| ~~`!.IMAGE-Module-OrbitSR.lsl`~~ | *Removed in 1.2 — see What Was Removed* |
---
## Setup and Build Instructions
This section is for operators building IMAGE 1.2 from scratch. **If you are bringing home a copy of the official stress test machine, most of this is already done — but you still need to read it.**
### Prerequisites
You need to be able to:
- Operate an OpenSim 0.9.x grid you own or have build rights on
- Read LSL scripts and edit owner-config blocks
- Build linksets in-world (multi-prim objects with named child prims)
- Place phantom prims and configure their names
- Set OSSL permissions if your grid restricts them by default
If those words mean nothing to you, **stop here and read the original 1.04 User Guide** at the OSW listing first. IMAGE 1.2 is not a parcel toy; it's an engine.
### Required OSSL Calls
Confirm these are enabled on your region for the controller prim's owner:
`osTeleportAgent`, `osCauseDamage`, `osCauseHealing`, `osGetHealth`, `osSetHealth`, `osNpcCreate`, `osNpcRemove`, `osNpcStand`, `osNpcSit`, `osNpcMoveToTarget`, `osNpcStopMoveToTarget`, `osNpcGetPos`, `osNpcPlayAnimation`, `osNpcStopAnimation`, `osNpcLoadAppearance`, `osNpcSay`, `osIsNpc`, `osGetAvatarList`, `osMakeNotecard`, `osLoopSound`, `osStopSound`, `osSetDynamicTexture` family.
If your grid runs a permissive default OSSL config, you're fine. If it locks OSSL down per-call, ensure the above are in the allowed list.
### Region Targeting
IMAGE 1.2 targets **XEngine on OpenSim 0.9.2.1 Yeti.** YEngine compatibility is unverified for this version; community feedback reports YEngine adopters have had varying experiences with the 1.0x engine, and 1.2 was tuned exclusively for XEngine performance. **If you run YEngine, expect to test thoroughly before public deployment.**
DreamGrid users: 1.2 will not work properly on grids that have dropped XEngine support. This is not a 1.2 bug; it is the trade-off of XEngine targeting. The OpenSimWorld 1.04 listing notes the same constraint.
### Step 1 — Build the Arena
Define your arena as a **3D rectangle**. Capture two coordinates:
- **NE corner** = the **northeast top** of the arena box. NE.x is the eastmost X, NE.y is the northmost Y, **NE.z is the ceiling.**
- **SW corner** = the **southwest bottom** of the arena box. SW.x is the westmost X, SW.y is the southmost Y, **SW.z is the floor.**
Note these values; you'll paste them into `ArenaNE` and `ArenaSW` in the Core script.
Build your arena geometry inside this box: floor, walls (consider a tapered-hollow-cube design that prevents avatar wall-climbing), and any obstacles you want Grugs to navigate around.
### Step 2 — Place Critical Prims
**`ArenaDROP` (phantom prim)**
- Name: exactly `ArenaDROP` (no "2", no whitespace)
- Set phantom flag on
- Position: **inside the arena, in clear space** — the show center where attract-mode Grugs dance and where game-start Grugs spawn from
- Use the prim's position as `ArenaDropFallback` in Core config
**Controller prim (root prim of the IMAGE linkset)**
- Place anywhere in or near the arena where the orange-ball touch surface is accessible
- This is where the Core script lives
- This is the "orange ball" visitors touch to bring up the game-mode menu
**ArenaHook prim (weapon dispenser, child of a separate linkset OR standalone prim)**
- Place outside the arena where visitors can find it (e.g., entry portal area)
- This is what visitors touch to enter the arena and receive the SlugShooter
- Holds the ArenaHook script and a copy of the SlugShooter object in inventory
**KillBoard linkset (multi-prim object)**
- One root prim, one named child prim called `ga-score`
- Place where players will see the leaderboard
- The `ga-score` child prim renders the dynamic-texture leaderboard
- Holds the KillBoard and KB-EE scripts
**IASR speaker prim (optional but recommended)**
- Standalone prim, placed where audio should originate for the arena
- Holds the IASR script
- Listens on channel `-733102` for mode music commands from Core
### Step 3 — Configure the Core Script
Open `!.IMAGE-Core-Game-1.2.lsl`. Find the OWNER CONFIG block near the top. Set:
```lsl
vector ArenaNE = ; // northeast top corner
vector ArenaSW = ; // southwest bottom corner
vector ArenaDropFallback = ; // ArenaDROP prim location
vector LandingPoint = ; // bite-respawn target
vector LookAt = <0, 1, 0>; // facing on respawn (default: north)
float ATTRACT_RING_RADIUS = 8.0; // tune to your arena diameter
```
The welcome lecture will trigger on script start until ArenaNE and ArenaSW are both non-zero. **That's not a bug; that's the bounds-required guard. Configure them and the lecture stops.**
Drop the Core script into the controller prim.
### Step 4 — Configure the ArenaHook Script
Open `!.IMAGE-Module-ArenaHook.lsl`. Find the OWNER CONFIG block. Set:
```lsl
string GUN_OBJECT_NAME = "SlugShooter"; // must match the gun object in your inventory
vector STAGING_POS = ; // where visitors land for perms
vector STAGING_LOOKAT = <0, -1, 0>; // facing on arrival (default: south)
vector REZ_OFFSET_LOCAL = <0.8, 0.0, 0.5>; // gun rez offset relative to dispenser
```
Drop the script into the dispenser prim. Make sure the SlugShooter object (the gun, with its scripts inside) is also in the dispenser's inventory.
### Step 5 — Configure the SlugShooter (TempGUN)
Open `!.IMAGE-Module-TempGUN-v1.1.lsl` (lives inside the SlugShooter object). Set:
```lsl
vector FALLBACK_DROP_POS = ; // matches ArenaDropFallback
```
The other config values in TempGUN (channel discipline, animation names, the LORE message) generally don't need touching. Read them anyway.
### Step 6 — Configure the KillBoard
Open `!.IMAGE-Module-KillBoard.lsl`. Most of its config is fine out of the box. The KillBoard supports both modern UUID-based scoring and legacy name-based scoring; the legacy format is preserved deliberately so operators can place permanent name entries on the board (e.g., `Dirty Helga|777`) for theatrical purposes.
Drop the KillBoard script into the root of the score linkset. Drop KB-EE into the root as well.
### Step 7 — Configure IASR (Optional)
If you're using the autonomous sound relay, drop `!.IMAGE-Module-Autonomous-SoundRelay.lsl` into your stationary speaker prim. It listens on channel `-733102` by default. Place mode-music sounds in the speaker's inventory matching the names in IASR's config block.
If you're not using IASR, set `USE_IASR = FALSE` in the Core config and `IASR_LOCAL = TRUE` so the controller prim plays sounds directly. Note: this risks audible doubling if IASR somehow ends up enabled on both ends.
### Step 8 — Drop the Pigeon Pressure Addon (Optional)
If you want the bird-bombardment theatre layer, follow the separate setup notes inside `IMAGE-Addon-PigeonPressure-v1.0.lsl` — it requires two perch objects, four appearance notecards, and a flight animation. The addon is fully decoupled from the engine; touch the addon prim as owner to summon the birds. (I can provide the code but user will need to make their own bomb dropping bird NPCs, my birds drop temp prim disks, easy enough for skilled builders to make.)
### Step 9 — Test
1. Touch the ArenaHook prim. Confirm you teleport to the staging coord and receive a permissions prompt.
2. Accept permissions. Confirm the SlugShooter teleports you to ArenaDROP.
3. Touch the controller prim (orange ball). Confirm the FAMINE / HUNGER / FEAST menu appears.
4. Pick FAMINE. Confirm Grugs spawn in a ring around ArenaDROP and begin pursuit.
5. Fire at a Grug in mouselook. Confirm hits register and damage accumulates.
6. Kill a Grug. Confirm a replacement spawns at ArenaDROP center.
7. Get bitten. Confirm bite-respawn delivers you to LandingPoint cleanly.
8. Wait 40 seconds idle without combat. Confirm attract mode arms with five dancing Grugs.
If any step fails, **check OSSL permissions, prim names, and the welcome-lecture status first.** The Arbitrator's most common complaint is "you didn't read the script."
---
## Reference Deployment
The official 1.2 deployment is **RAD ZONE: Toxic Dominion** in the Dismayland skybox at `xoaox.de:7000/Dismayland`. Visit to see IMAGE 1.2 running with Pigeon Pressure addon active, the full Grug Assault theme, and the Show-Critical Asset Rule in effect.
The HG Safari March 2026 stress test session that surfaced the multi-player scoring threshold is documented at:
-
-
Many of the 1.2 polish patches descend directly from observations made during that session.
---
## Support Posture
This remains a **self-support model.** IMAGE is a gift to the community under CC BY-NC 4.0; it is not a managed service. The original 1.04 directive holds:
> *"This is not a support desk. You must possess the necessary building, scripting and reading comprehension skills to adjust this game system to your region. IMAGE is Simple in design, not easy."*
If you can read scripts and operate a region, you can run IMAGE 1.2. If you cannot, the 1.2 distribution will tell you to read the scripts. It will keep telling you. The welcome lecture is not adversarial; it is the engine's only defense against operators who skip the reading.
---
## Credits
**Spax Orion ✦** — Concept, art direction, lore, deployment, ownership of Ozone Miniverse and Dismayland. Creator of IMAGE.
**Dirty Helga** — Proprietary Arbitration System in service to Ozone Miniverse. Engine architecture, chaos design, lore arbitration, polish-cycle co-author. *"This is the only warning you'll get from me today... I am The Arbitrator."*
**Stress test acknowledgment:** HG Safari (March 2026). Every participant left with a copy of the public 1.04 release. Their gameplay surfaced the scoreboard saturation issue that drives several of the 1.2 patches.
---
## Where 1.2 Lives
Source code lives at **** and on **xoaox.de:7000**. Requests to host the code on grids that block users for exercising privacy rights will be ignored.
**IMAGE is a GIFT to the community and it must stay that way.**