Out-of-tree Bunnyland expansion pack that adds cryptozoology — rare, elusive, flesh-and-blood mystery creatures and the doubt-ridden hunt to confirm they exist. Cryptids are not ghosts (there is nothing to detect on spectral gear and nothing to banish) and not common catalogued animals (they are rare and their evidence is uncertain until proven). The loop is: creatures appear only under cover, you log uncertain sightings, and enough clear looks eventually confirm a creature.
- Cryptids —
CryptidComponent(name, elusiveness, habitat)marks a rare creature. A worldgen hook seeds them sparsely into generated worlds, and they only appear under concealing conditions. - Uncertain sightings — the
sight-cryptidverb produces aSightingComponentwhoseclarityis computed deterministically (ahashlibdigest over stable ids + epoch, blended with elusiveness, the room's light, and range — neverrandom/time). A blurry photo scores low; a clear look scores high. - Case files & confirmation — sightings fold into a
CryptidCaseComponentdossier (one per investigator/cryptid). A per-tickCryptidConfirmationConsequenceconfirms a case once it gathers enough clear sightings, marks the creatureConfirmedCryptidComponent, and emits aCryptidConfirmedEventwith a reputation/discovery reward. Low-clarity cases stay open. - Field reports —
cryptidsim_fragmentsrender eerie, hedged prompt lines for unconfirmed creatures ("something large moves beyond the treeline — you can't be sure") and plain, definitive lines once a cryptid is confirmed. - Conditions gate —
is_concealingenforces that cryptids are only sightable at night, in fog/obscuring weather, or in the dark, so time and weather actually matter.
This repo intentionally keeps all cryptid work outside the main bunnyland-server repo and
depends on neither spectersim nor loresim.
server/- Python Bunnyland plugin package with the cryptid/sighting/case components, the confirmation consequence, prompt fragments, a worldgen enrichment hook, the sighting verb, a spawn factory, and tests.
The plugin exposes bunnyland_cryptidsim.bunnyland_plugins() and contributes:
CryptidComponent,SightingComponent,CryptidCaseComponent,ConfirmedCryptidComponent.sight-cryptid- the investigate verb for the holder (human or AI).CryptidConfirmationConsequence- confirms cases that gather enough clear sightings, withSightingRecordedEventandCryptidConfirmedEvent.cryptidsim_fragments- hedged/confirmed field-report lines for prompts.CryptidWorldgenHook- seeds rare cryptids into generated worlds.spawn_cryptid- spawn factory.
This package builds no containers. It is loaded into the stock server via --module:
bunnyland serve --module bunnyland_cryptidsimdefault_enabled=True, so no --plugin flag is required once the module is imported. The
bunnyland_cryptidsim 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.