Skip to content

Content packs

A mod is a content pack folder (or a zip of that folder). The game discovers packs under local Mods, Steam Workshop installs, and staged upload candidates.

Required identity

Field Purpose
UniqueModName Stable prefix for all ids (modname.thing)
DisplayName Mods browser / Workshop title
Description Listing text

Author modinfo.json (Mod Prep does not accept modinfo.lua-only packs).

Typical layout

MyPack/
  modinfo.json
  item_my_sword.json
  structure_my_box.json
  Items/my_sword.lua
  worldprofile_my_world.json   # optional sandbox world type
  WorldGenerator/…             # optional world-gen details / icon
  Spawning/…                   # optional spawn groups for world profiles
  Parallax/…                   # optional sky definition for world profiles
  recipes.xml                  # optional craft recipes
  preview.png                  # optional Workshop preview (Mod Prep)

A full worked example is Example Mod (Energysabre, Shotel, Glick, Tahz, Scrap Helmet, Chickenmancer clothing, Jacked Kangit, Flatlands / Moon world profiles, recipes).

Content JSON filenames must use known prefixes (item_, structure_, flora_, projectile_, creature_, worldprofile_, …) or the game will ignore them. Body armor and clothing use item_*.json with an "ArmorItem" root (equip + damage reduction + EquipmentEffects, optional LuaScriptPathArmor / self.armor). Helmet/hat use WornSpriteMalePath / WornSpriteFemalePath. Body slots use WornBonesMale / WornBonesFemale (role→PNG: neck, ribcage, stomach, pelvis, thigh, lowerLeg, boot, upperArm, forearm, glove). Padded frames pivot on the canvas center.

Pack creatures

creature_*.json uses a "Creature" root. Animation is one of:

  • SpriterAnimationPath to one .scml, optional DefaultAnimation (Example Mod Jacked Kangit)
  • DeminaAnimationData name→.anim map (no AnimationPath)

Optional LuaScriptPath binds the Creature base and self.creature. Melee should use Hog-style contact (MeleeBones plus Spriter bite/swipe clips, or Demina enableCollisions / disableCollisions triggers); author BodyWidth / BodyHeight / AnimationOffset*.

HP, melee damage, description, and codex live in a nested RegistrationData object (not Balance — that key is ignored). Example:

"RegistrationData": {
  "Health": 140,
  "MeleeDamage": 18,
  "Description": "…",
  "CodexCategory": "FAUNA"
}

Spawn with World:spawnCreature("ExampleMod.jackedkangit") or SPWN {"CreatureTypeId":"ExampleMod.jackedkangit","Weight":4}. Example Mod ships Jacked Kangit under Creatures/JackedKangit/.

Sandbox world profiles

Packs can add Sandbox menu world types with worldprofile_*.json plus WorldGenerator/, Spawning/, and optional Parallax/ data. See Sandbox world profiles and Authoring world-gen details.

Inventory sprites

Set InventorySpritePath to a pack-relative PNG (for example Items/MySword/Sprites/sword.png). Optional secondary paths (ChargeBarSpritePath, GrowingSpritePath, …) are packed with it at load time. Older packs that still use InventorySpriteSheetPath + map + name continue to work. Hand-authored animation sheets stay as you packed them.

Recipes and configs

Optional root files such as recipes.xml, grindRecipes.xml, and known config JSON names (playerConfig.json, worldConfig.json) are validated by Mod Prep. Smelt / cook / chemistry recipes go in recipes.xml with processType="smelt" (or cook / chemistry). Grind recipes stay in grindRecipes.xml. Do not ship smeltingrecipes.xml — the game does not load it.

Publishing

  1. Validate with Mod Prep.
  2. Stage a WorkshopUpload/ package.
  3. In-game Mods → Upload / Update submits to Steam (Mod Prep itself does not talk to Steam).

After Steam creates the item, the source project remembers its Workshop ID in .solmodproject.json. Keep that file with the project: Mod Prep does not include it in the downloadable mod, and it prevents a cleaned staging folder from accidentally becoming a second Workshop item on the next publish.

Hot load and disable

  • Load Now merges a pack into a running single-player session when eligible.
  • A newly subscribed, enabled Workshop pack automatically performs the same safe single-player merge after Steam finishes installing it.
  • Disable marks a pack off for the next launch; unloading mid-session reloads content and recreates Lua scripts.

Multiplayer does not offer Load Now for untrusted mid-session merges.

Example Mod

The installed game includes a complete source pack in its top-level ExampleMod/ directory. Copy that directory into your user-data Mods/ folder before loading it; the shipped copy intentionally does not enable itself.

Example Mod is a cookbook for established projects: it includes weapons, Lua, animations, sounds, armor, clothing, recipes, a creature, and sandbox world profiles. Start with Mod Prep's one-item project first, then copy individual patterns from Example Mod as you need them.