Out-of-tree Bunnyland plugin about collections and curation — a museum that accepts donations, appraises rarities, and fills up as the world's players explore. The trophy case for everything the other packs produce.
Items across packs can carry an open CollectibleComponent(category, rarity) — a fossil, a
legendary fish, a spirit relic. This package defines that component itself, so Museumsim
is a self-contained sink other packs opt into rather than a dependency they must import.
The bundle:
- Collectible tags —
CollectibleComponent(category, rarity)plus a fixed rarity ladder (common->legendary) with an appraised value per tier. - Donation — a
donateverb gives a held collectible to aMuseumComponentroom, which records it in a persistent, de-duplicated ledger and refuses duplicates. - Appraisal — an
appraiseverb reports a reachable collectible's category, rarity, and value without changing any state. - Exhibits & completion — per-category
ExhibitComponententities track wanted vs. donated pieces; a lightMuseumConsequencecompletes a filled exhibit exactly once, emits an event, and raises the donor's standing with the curator (reusing the coreSocialBondreputation layer). - Display cases — donated pieces rest in a
DisplayCaseComponent, and the museum's prompt fragments list the most notable pieces on display plus a running "N of M donated" tally.
The v2 expansion makes the museum feel like part of one living world:
- Authentication & forgeries (headline) — every collectible carries a hidden ground truth
on an
AuthenticityComponent; anauthenticateverb examines a reachable piece and settles whether it is genuine or a forgery. An exposed forgery becomes a notable world moment. - Restoration — a damaged piece carries a
ConditionComponent; arestoreverb brings it back to pristine display condition and stamps who did the work. - Visitors & tours — atmospheric prompt lines (a quiet gallery, a steady stream, a guided tour around the star piece) derived deterministically from what is on display; no ticketing or admission accounting.
- Provenance through core systems — each donation writes a world-history record,
requests a generated display image (imagegen), files a memory journal line, projects
the donor's deed reputation, and accrues a
PatronOftyped edge for donor recognition. - Storyteller — when a museum's collection grows into a famous draw, it raises a core
famous_exhibitincident so world pressure is paced and other packs can react.
A worldgen hook furnishes museum-like generated rooms (curator, exhibits, a display case, and a few seeded collectibles — including a hidden forgery and a damaged piece so the v2 verbs have something to act on) and tags collectible-looking generated objects, all deterministically.
donate— give a held collectible to the museum you stand in.appraise— read a reachable collectible's category, rarity, and value (no state change).authenticate— examine a reachable collectible to confirm it is genuine or expose a forgery.restore— restore a reachable damaged collectible to pristine condition.
Museumsim reads the dependency-free CollectibleComponent surface, so it runs fully standalone.
It only recommends collection-source packs (anglersim, wildsim, aquasim, loresim, cryptidsim)
to light up wings fed by other packs — never requires them.
This repo intentionally keeps all museum work outside the main bunnyland-server repo.
server/- Python Bunnyland plugin package with the collectible/museum/exhibit components, the donate and appraise verbs, the exhibit-completion consequence, display prompt fragments, a worldgen enrichment hook, spawn factories, and tests.
The plugin exposes bunnyland_museumsim.bunnyland_plugins() and contributes:
CollectibleComponent,MuseumComponent,ExhibitComponent,DisplayCaseComponent,AuthenticityComponent,ConditionComponent, and thePatronOftyped edge.donate,appraise,authenticate, andrestore- the four player/AI verbs.MuseumConsequence- completes filled exhibits and rewards donors each tick.MuseumStorytellerConsequence- raises afamous_exhibitincident when a museum becomes a draw.MuseumProvenanceReactor- routes donations/verdicts through core history, imagegen, memory, and reputation.museum_fragmentsandvisitor_fragments- render notable pieces, the donation tally, and the current crowd into prompts.MuseumWorldgenHook- furnishes museum rooms and tags collectible objects in generated worlds.spawn_collectible,spawn_museum,spawn_exhibit,spawn_display_case,spawn_curator- spawn factories.
This package builds no containers. It is loaded into the stock server via --module:
bunnyland serve --module bunnyland_museumsimdefault_enabled=True, so no --plugin flag is required once the module is imported. The
bunnyland_museumsim 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.