Skip to content

Style packs ​

A style pack re-skins the whole game, including every extension, with no code: art, fonts and theme tokens only. Any pack from anyone is safe to install.

Layout ​

stylepacks/<id>/
  stylepack.json      {id, name, version, author, covers: [...]}
  theme.json          tokens: colors, fonts, font_sizes, panels (9-slice refs)
  core/               overrides for core paths: characters/, tilesets/, items/, props/, ui/, fonts/, portraits/
  <extension-id>/     overrides for that extension's assets/ paths
  preview.png         launcher thumbnail, 320x180
  README.md

How overriding works ​

Every visual resource is loaded through Style.res("<owner>/<relative path>"). The resolver checks, in order: the active pack, then the owning extension's assets/, then the default pack. First hit wins, so a pack can be partial. Pack images are plain PNGs loaded at runtime; no Godot import step is involved.

Contracts (what to match for a full replacement) ​

Match these to replace a category completely:

CategorySpec
Characterscore/characters/<group>/<name>/ with sprite.json and frames <state>_<dir>_<nn>.png; states idle, walk, attack, death; dirs south, south-east, east, north-east, north, north-west, west, south-west. sprite.json: {size: [w,h], pivot: [x,y], fps: {...}, states: {state: {dir: [files]}}}.
Tilesetscore/tilesets/<name>/tileset.png + metadata.json (PixelLab tileset export: each tile's bounding_box and NW/NE/SW/SE corners).
Icon setscore/items/<set>/NN_name.png (32x32) + index.json mapping index to file. Same for skills, skills/status_effects, ui/icons, ui/emotes, projectiles.
Propscore/props/<set>/ 64x64 (128x128 buildings) + index.json.
UISheets under core/ui/; theme.json panels point 9-slice regions at them.
Fonts.ttf under core/fonts/, referenced by theme.json fonts.ui / title / damage.
Portraitscore/portraits/<name>.png.

theme.json tokens: colors (bg, panel, panel_border, text, text_muted, text_light, field_bg, accent, danger, success, chat_*), fonts, font_sizes (small, body, title), panels (panel, tooltip, button, button_pressed, slot: {texture, region, margin, content_margin}).

Starting small ​

A pack only needs stylepack.json and the files it changes. Recolor the interface with a theme.json holding a few colors, then add sprites, tiles or fonts one category at a time; whatever is missing comes from the default pack. List what you replace in covers (ui, characters, tiles, items, props, fonts, portraits) so hosts know what they are getting.

Trying and sharing a pack ​

Work in a world's packs/ folder, like an extension:

worlds/test/packs/<id>/stylepack.json

Create a test world with --stylepack <id> (or set "style_pack": "<id>" in an existing world's world.json) and restart the server after each change; clients download the new version when they join. When it is ready:

mmorun-server --pack ./worlds/test/packs/<id>
#   -> <id>.stylepack.pck

Hosts drop the file into their world's packs/ folder and pick it for the world. One style pack per world; every player on that world sees it. See Your first extension for the full walkthrough.

MMO Run: host your own pixel-art MMO.