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 LuaScriptPath → Armor /
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:
- Spriter —
AnimationPathto one.scml, optionalDefaultAnimation(Example Mod Jacked Kangit) - Demina —
AnimationDataname→.animmap (noAnimationPath)
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¶
- Validate with Mod Prep.
- Stage a
WorkshopUpload/package. - 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.