Out-of-tree Bunnyland plugin that adds paranormal monster-detecting devices. A device makes noise (a wail, a hiss, a buzz, a hum, a beep…) whose volume rises when entities carrying a particular marker component share its room. Two variants ship out of the box:
- Ghost detector — reacts to
SpectralMarkerComponent(monsters, spirits, the undead). - Radio — reacts to
RadioSourceMarkerComponent(transmitters, beacons, broadcasters).
v2 bundles two survival-horror mechanics on top of the detectors:
- Sanity — a dread meter (
SanityComponent) that drains near spectral presences and in the dark, recovers in safe or bright spirit-free rooms, and injects escalating first-person distortion lines ("Your hands won't stop shaking.", whispering, a hallucinated presence) into the afflicted character's own prompt. - Rituals & wards —
draw-wardprotects a room andperform-ritualchannels a held ritual kit to weaken and finally banish a spectral presence; a warded room also erodes any trapped presence passively.
v3 bundles two more:
- EVP / evidence log — the
log-readingverb captures eerie proof of a haunting (EVP recordings, cold spots, orb sightings, detector spikes) into an investigator's privateEvidenceLogComponent, recordable only when a spectral presence or a reacting detector is actually present. Evidence content is deterministic, and prompt fragments tally the log ("Your evidence log holds 3 EVP captures."). - Fog — a
FogComponenton rooms whose density drifts and thickens over time (thicker at night and in spectral-heavy rooms) and shrinks perception, so a fog-bound character sees fewer entities and loses sight of the exits.
This repo intentionally keeps all detector work outside the main bunnyland-server repo.
server/- Python Bunnyland plugin package with the marker/detector components, the detection consequence, prompt fragments, a worldgen enrichment hook, the two player/AI verbs, spawn factories, and tests.
The plugin exposes bunnyland_spectersim.bunnyland_plugins() and contributes:
SpectralMarkerComponent,RadioSourceMarkerComponent- detectable markers.GhostDetectorComponent,RadioDetectorComponent- the devices.DetectionConsequence- sets each detector'svolumefrom same-room markers every tick and pulses aNoiseComponentso the device is audible via the server's existing hearing pipeline. Works for held and floor-resting detectors, as long as they are powered on.spectersim_fragments- renders device state into both human and AI prompts.SpecterWorldgenHook- tags generated enemies (and broadcasters) with the markers.power-detectorandset-detector-volume- verbs for the holder (human or AI).spawn_ghost_detector,spawn_radio- spawn factories.
v2 additionally contributes:
SanityComponentandSanityConsequence- the per-tick dread meter, with band-crossingSanityChangedEvents and first-personsanity_fragments.WardComponent,RitualKitComponent, andWardConsequence- room protection plus the passive weaken/banish pass, withWardDrawnEvent,PresenceWeakenedEvent, andPresenceBanishedEvent.draw-wardandperform-ritual- verbs for placing wards and banishing presences.ritual_fragments- renders ward protection and the held-kit line into prompts.spawn_ritual_kit,spawn_ward- spawn factories.- Optional Bunnyland 3D integration gives wards an emissive model with a restrained, strength-compatible spectral aura anchored to the ward focus.
v3 additionally contributes:
EvidenceComponent,EvidenceLogComponent, and thelog-readingverb - capturing and reviewing spectral evidence into an investigator's private log, withEvidenceRecordedEventand first-personevidence_fragments.FogComponentandFogConsequence- drifting/thickening room fog withFogChangedEvents;perceive_through_fogshrinks the core perception projection andfog_fragmentsdescribe the murk.spawn_recorder- spawn factory for an EVP recorder.
This package builds no containers. It is loaded into the stock server via --module:
bunnyland serve --module bunnyland_spectersimdefault_enabled=True, so no --plugin flag is required once the module is imported. The
bunnyland_spectersim package must be importable by the server (installed into the
server's environment, or on PYTHONPATH).
Run server tests against a sibling bunnyland-server checkout (no install required —
server/tests/conftest.py puts both packages on sys.path). From server/:
uv run --project ../../bunnyland-server -m pytest
uv run --project ../../bunnyland-server ruff check src testsSee server/README.md for more detail.
This plugin follows the Bunnyland project's
contribution guidelines and code of conduct,
which point back to the bunnyland-server repository.
Licensed under the GNU Affero General Public License v3.0. See LICENSE.