Meme Wars · design notes

Everything is a plugin.
Nothing is mandatory.

A room should be able to be anything — a full survival world, a plain deathmatch, or a blank void with no items, no weapons, nothing but bodies and ground. The engine stays; every rule above it is a plugin you can turn off. The hard part isn't the freedom — it's making that much choice feel effortless. Here are ways to compose plugins into game styles without the clutter.

Exploratory · options for a future Set, not a spec · authored while the wizard is in playtest
The premise

From a blank void to the works

Today "core" plugins (items, inventory, the meme arsenal) always load. The end state you want is that none of them are special: the create flow spans a spectrum, and where a room lands on it is just a set of enabled plugins. The engine primitives — bodies, terrain, movement, the network — are the only floor.

Void

plugins: [] — no items, no weapons. Just physics and a place to stand.

A style

A named bundle: Deathmatch, Survival, Build.

Style + tweaks

A bundle you've customised — swapped a plugin, changed an option.

Everything

Sandbox: every plugin on the shelf, yours to toggle.

The wizard already walks the right edge. The question is how to make the middle — "give me a good game without reading a plugin list" — the easy default, while the void and the everything stay one step away.

Four ways to tame the choice

Approaches

These aren't exclusive — they layer. Each is shown with what it would actually look like.

A
Composition

Bases as plugin bundles

A "base" is itself a plugin that composes others — it declares the plugins a style needs and the config it wants, and rides the exact dependency machinery the wizard already closes over. A style becomes a first-class, shippable, moddable thing.

  • Reuses needs + plugin.config — no new system.
  • A modder ships a style the same way they ship a mechanic.
  • Needs a rule for conflicts (two bases, overlapping config).
B
Entry point

A templates gallery

Create doesn't open on a checklist — it opens on a wall of styles. Pick one and the wizard is pre-filled; from there you play, or step in to customise. "Start from scratch" and "Everything on" are just two more cards.

  • Most people never see a plugin list — they see games.
  • The void is discoverable, not hidden behind unticking 12 boxes.
  • Templates can drift from what plugins currently exist.
C
Navigation

Categories & tags

When every mechanic is an optional plugin the list gets long. Group it — World, Survival, Combat, Cosmetic — so the custom path stays scannable no matter how many plugins exist. A plugin declares its own category.

  • Scales to dozens of plugins without a wall of checkboxes.
  • Pairs with bases: a base just pre-checks across categories.
  • Cross-cutting plugins don't always fit one bucket.
D
Disclosure

Curated default, "everything" on tap

The plugins step shows a short, sensible set by default with an Advanced / show everything reveal. The foundational plugins (items, inventory) sit in an always-on strip you can expand to turn off — the void is possible, never in your face.

  • Fixes today's clutter with the least new machinery.
  • Turning off "items" is a deliberate act, as it should be.
  • On its own it doesn't give you named styles.
Approach A · what it looks like

A base is just a plugin

It declares no systems of its own — only what it composes. The host already dependency-closes needs and resolves plugin.config; a base leans entirely on both.

-- content/bases/survival/main.lua — a BASE composes other plugins.
-- It runs no tick; it only declares a style, and rides the same dep +
-- config machinery every other plugin uses.
plugin.base({
  label = "Survival",
  blurb = "Scrounge to eat, dread the dark, don't starve.",
  emoji = "🏕️",
  -- the plugins this style turns on (dep-closed like any needs)
  needs  = { "items", "hunger", "rations", "daynight", "night-spawn" },
  -- the options it prefers — the player can still override in the wizard
  config = {
    daynight = { length = "long" },
    hunger   = { rate   = "fast" },
  },
})
Selecting it fills the wizard — the player still owns every box
World
Day / Night · long One Ground
Survival
Hunger · fast Rations Night Horde Agriculture off
Always on · from this base
Items needed by Survival Inventory needed by Items
Approach B · what it looks like

Create opens on styles, not a checklist

The first thing you see is a gallery of bases (each just a plugin from Approach A). One is selected; "Custom" drops you into the full wizard; "Void" ships nothing but the engine.

Each card is a base plugin; the grid is generated from whatever bases are installed, so a modded style shows up here with no UI change — the same way a new plugin already lights up the toggle list.

Approaches C + D · what they look like

The custom path stays sane

Behind the templates, the full wizard groups plugins by a category each one declares, and hides the always-on foundation behind a reveal — so "turn off items and give me a void" is possible, but never the first thing you trip over.

-- a plugin self-describes where it belongs; the wizard groups by this.
plugin.meta({ category = "survival", foundational = false })
-- items/inventory would set foundational = true → the "always on" strip,
-- collapsed by default, expandable to actually switch them off.
▸ Always on · 3 foundational plugins expand to turn off →
Combat
Meme Arsenal Jetpack
World
Day / Night Night Horde
Cosmetic
Embers
Putting it together

One stack, four layers

The nice thing is that these don't compete — each sits on the one below, and the whole tower stands on machinery that already exists.

templates

Gallery of styles

The face of Create. Cards, generated from installed bases. "Custom" and "Void" are cards too. (B)

wizard

Categorised toggles + options

The customise path. Groups by category, hides the foundation behind a reveal. (C, D)

bases

Style plugins

A base is a plugin that composes a set of plugins + config. Selecting one pre-fills the wizard. (A)

plugins

Optional mechanics

Everything — even items, inventory — is an optional plugin with needs, config, and a category.

engine

Primitives

Bodies, terrain, movement, network. The floor. A void room is this and nothing else.

If I had to pick a path

Build it bottom-up, and each layer is useful on its own the day it lands:

  1. Make the foundation optional — turn items / inventory / arsenal into real optional plugins with needs, so a truly empty plugins: [] room is legal. This alone unlocks the void.
  2. Add category + a foundational flag (C/D) — the cheapest fix for today's clutter, and it makes a long list survivable.
  3. Add plugin.base (A) — bases as composing plugins, reusing deps + config. Ship two or three (Survival, Deathmatch, Void) as content.
  4. Front it with the gallery (B) — once bases exist, the templates wall is a thin view over them, and Create stops being a checklist.

Every step reuses the dependency + config system the wizard already runs on. Nothing here is a new engine; it's the same idea — a plugin — pointed at itself.