ppcontent.json reference¶
Put ppcontent.json at the root of your project folder. The root must be a JSON object. Keep key spelling as shown. replace, publish, and sounds are parsed as JSON arrays; an incomplete row is reported instead of silently accepted. The creature block and flat weapons rows have their own text readers, so keep their documented shapes.
“Required” below means required to use that feature. You can omit an entire optional section.
Root keys¶
| Key | Type | Required | Meaning | Example |
|---|---|---|---|---|
id |
string | Yes | This mod's identity and a folder component for patched copies. Use one plain name. | "author.mymod" |
bundle |
string | Yes | File name for this mod's own output in Dist. Use one plain name. |
"MyMod.bundle" |
scale |
number | No | Uniform rig-root scale. Absent or zero uses 1; a negative value is skipped and reported. | 0.005 |
loop |
string | No | Model clip names to loop, separated by commas or semicolons. Matching ignores case and accepts *. |
"Spider_Idle, Spider_Walk" |
play |
string | No | One model clip for the Animator to play; empty uses the first bakeable clip. | "Spider_Walk" |
replace |
array of objects | No | Changes shipped textures, materials, meshes, clips, or videos. | [{"bundle":"<shipped-bundle>","asset":"<asset-name>","texture":"<stem>"}] |
publish |
array of objects | No | Serves catalog keys from this mod's own bundle. | [{"key":"<key>","asset":"textures/<stem>","type":"Texture2D"}] |
sounds |
array of objects | No | Declares replacements of shipped sound media. | [{"media":<media-id>,"file":"<source-file>.ogg"}] |
creature |
object | No | Configures a custom-model creature or a shipped character's new body. | {"model":"<model-stem>"} |
weapons |
array of flat objects | No | Adds weapon definitions cloned from shipped weapons. | [{"id":"<weapon-def>","clone":"<shipped-weapon-def>","guid":"<fixed-guid>"}] |
id and bundle must each be a single safe file or folder name. See project files. Use the same identity in meta.json's ID.
replace rows¶
Each row selects exactly one of texture, material, mesh, clip, or video. A texture, material, mesh, or clip row also needs bundle and asset. A video row does not use bundle; an omitted asset adds a video instead of replacing a shipped one.
| Key | Type | Required | Meaning | Example |
|---|---|---|---|---|
bundle |
string | For texture, material, mesh, clip | Shipped bundle file to patch. | "<shipped-bundle>.bundle" |
asset |
string | For texture, material, mesh, clip; optional for video | Exact shipped asset name. For video, omit it to add a clip. | "<asset-name>" |
texture |
string | If this is a texture row | Stem of a file directly in Content\Textures. |
"<stem>" |
material |
string | If this is a material row | One material property and numeric value, written as property=value. |
"_GlossMapScale=0.15" |
mesh |
string | If this is a mesh row | Stem of an .obj or .glb in Content\Meshes. |
"<stem>" |
clip |
string | If this is a clip row | Multiplies a position or scale curve: position*<number> or scale*<number>. Rotation and a factor of 1 are refused. |
"position*3" |
video |
string | If this is a video row | Stem of a clip in Content\Videos. |
"<stem>" |
A target asset name must identify one shipped asset of the requested class. Use ct_list to obtain its spelling. Source stems are matched without regard to case; shipped asset names are exact.
publish rows¶
| Key | Type | Required | Meaning | Example |
|---|---|---|---|---|
key |
string | Yes | Address the game will request. | "morgott.sample/probe_tex" |
asset |
string | Yes | Path to the asset inside this mod's own bundle. | "textures/swatch" |
type |
string | Yes | Resource type of the asset: a UnityEngine class name (Texture2D, GameObject, Mesh, Material, AnimationClip) or an assembly-qualified type name. A missing or unknown type is refused. |
"Texture2D" |
deps |
string | No | Shipped bundle file names this asset needs mounted, separated by ;. |
"<bundle-a>;<bundle-b>" |
Publishing adds new keys only. A key the game's own catalog already has is refused; replace shipped content with a replace row instead. Bake the mod's bundle with ct_project <project> before applying its published keys.
sounds rows¶
| Key | Type | Required | Meaning | Example |
|---|---|---|---|---|
media |
nonnegative whole number, or a string containing one | Yes | Shipped Wwise media ID to replace; must fit an unsigned 32-bit integer. | 18839791 |
file |
string | Yes | File name in Content\Audio\Replace. |
"<source-file>.ogg" |
A file named <mediaId>.wav, <mediaId>.ogg, or <mediaId>.mp3 in Content\Audio\Replace can also declare its target by filename, without a sounds row. Run ct_sound bake <project> to create the replacement banks.
creature object¶
This block is optional. Its clip and event maps use names as keys, so their entries vary with the model. The other keys are fixed.
| Key | Type | Required | Meaning | Example |
|---|---|---|---|---|
clips |
object mapping clip name to role | For a creature using its own clips | Assigns model clips to roles. walk, idle, attack, and death are required roles; other supported roles include jump, reaction, ranged, and climb. |
{"Spider_Walk":"walk"} |
events |
object mapping role to event string | When that animation needs blocking events | Gives an event name and a fraction of the clip for each event, in playback order. | {"attack":"ActionDo 0.25, ShootShot 0.55, ActionEnd 0.90"} |
name |
string | No | Roster display name; empty keeps the donor's. | "Spider" |
model |
string | When more than one model is present | Stem of the .glb in Content\Models; a single model is selected automatically. |
"<model-stem>" |
donor |
string | No | Shipped character definition to clone. Defaults to Swarmer_TacCharacterDef. |
"Swarmer_TacCharacterDef" |
startingRoster |
boolean | No | Literal true adds the creature to a new campaign's starting roster. |
true |
useGameAnimations |
boolean | No | Literal true uses the game's clips on a compatible rig instead of shipping model clips. |
true |
replaceBody |
string | No | Shipped character definition whose body is replaced in place. This also uses that character as the structural template. | "<shipped-character-def>" |
up |
string of three comma-separated numbers | No | Up axis of the imported model. | "0,1,0" |
lift |
number | No | Distance from the model origin down to its lowest vertex, in file units. | 32.8288 |
health |
number | No | Enter-play health; zero leaves the donor's value. | 40 |
will |
number | No | Will stat override. | 10 |
speed |
number | No | Movement action points, distinct from animation pace. | 16 |
volume |
number | No | Creature volume setting. | 1 |
pace |
number | No | Traversal speed in tiles per second. Absent uses shipped pace; zero keeps the model clip's own pace. | 5.4284 |
climbPitch |
number | No | Nose-up pitch in degrees during a synthesized climb. | 90 |
ranged |
string | No | Shipped weapon definition to clone for a second, ranged attack. Empty keeps the creature melee-only. | "Crabman_Head_Spitter_WeaponDef" |
aiAction |
string | No | AI action for the ranged attack. Defaults to MoveAndShoot_AIActionDef. |
"MoveAndShoot_AIActionDef" |
shootBone |
string | No | Bone for the synthesized muzzle; empty lets the tool measure one. | "<bone-name>" |
accuracy |
number | No | Ranged accuracy percentage; zero leaves the donor's value. | 40 |
colliders |
string | No | "off" disables the generated colliders. |
"off" |
aim |
string | No | Name of the rig bone that marks the creature's aim point. | "<bone-name>" |
hitRadius |
number | No | Radius for generated hit colliders. | 0.5 |
hitBones |
string | No | Comma-separated bone names for hit colliders. | "<bone-a>,<bone-b>" |
For an authored creature, let the bake discover the .glb clips, then fill the roles it writes into clips. See the creature recipe.
weapons rows¶
Each entry must be flat: do not put a nested object in a weapon row. id, clone, and guid are mandatory. model is optional; without it, the clone keeps the shipped weapon's art. With a model, use "fit": "auto" or declare the shoot socket.
| Key | Type | Required | Meaning | Example |
|---|---|---|---|---|
id |
string | Yes | New weapon definition name. | "<weapon-def>" |
clone |
string | Yes | Shipped weapon definition to copy, including its class and handling tags. | "<shipped-weapon-def>" |
guid |
string | Yes | Fixed identity for the new weapon and derived definitions. Keep it stable across releases. | "<fixed-guid>" |
name |
string | No | Display name in the game. | "<display-name>" |
blurb |
string | No | Inventory description. | "<description>" |
icon |
string | No | Path to a PNG icon relative to the project folder. | "Icons/<icon>.png" |
model |
string | No | Published Addressables runtime key for this weapon's prefab. | "<model-key>" |
fit |
string | No | "auto" fits the authored model to the donor weapon and derives sockets. |
"auto" |
scale |
number | No | Positive scale override for the model fit. | 1 |
rotate |
string of three comma-separated numbers | No | Model rotation in degrees. | "0,0,0" |
offset |
string of three comma-separated numbers | No | Position correction, in metres, added to the fit. | "0,0,0" |
flip |
boolean | No | Reverses which end of an automatically fitted model points toward the muzzle. | true |
shoot |
string of three comma-separated numbers | If model is set without fit: auto |
Muzzle socket position. Zero is a valid declared position. | "0,0,0" |
aim |
string of three comma-separated numbers | No | Aim socket position. | "0,0,0" |
shell |
string of three comma-separated numbers | No | Shell-ejection socket position. | "0,0,0" |
damage |
number | No | Positive standard-damage override. | 40 |
spread |
number | No | Positive spread override in degrees. | 1 |
damagetype |
string | No | Shipped damage-type definition for the payload. | "<damage-type-def>" |
keywords |
string | No | Extra damage keyword definitions and values, separated by ;; each clause is DEFNAME=VALUE. |
"Burning_DamageKeywordEffectorDef=40" |
projectile |
string | No | Projectile definition, or a shipped weapon definition whose projectile to borrow. | "<projectile-or-weapon-def>" |
flash |
string | No | Shipped weapon definition whose muzzle effects to borrow. | "<shipped-weapon-def>" |
tint |
string | No | Hex color for a private copy of the projectile visuals. | "#RRGGBB" |
trail |
number | No | Positive trail lifetime in seconds. | 0.5 |
count |
number | No | How many of this weapon a new campaign's starting storage holds, on every difficulty. | 1 |
clips |
number | No | How many of the weapon's first compatible ammunition item go into that starting storage. | 1 |
Use the weapon-add recipe for the complete build and fit sequence.