Drop additional .json skin packs into this folder to make them available in NPCJason at runtime. NPCJason hot-reloads this directory while running, validates every pack before use, and reports non-fatal warnings in the Settings window and diagnostics log.
Each skin file supports:
key: unique identifierlabel: display name shown in menusauthor: optional creator creditdescription: optional summary shown in Settingsversion: optional pack version labelchar_map: remap base frame palette keyspalette: color overridestray: tray icon colors forhair,body, andlegsoverlay: 20 strings of 16 characters each, using.for transparent pixelsframe_overlays: optional per-frame overlays for accessory or interaction tweakscustom_frames: optional extra frame definitionsanimations.idle: optional idle animation sequence overridesanimations.interaction: optional interaction animation sequence overridessound_set: optional sound-set id used for interaction soundsquote_affinity: optional pack/category/context bias dataaccessory_offsets: optionalbubble,toy_anchor, andcarryoffsetstags: optional metadata tags used by toys, events, and quote selection
Validation notes:
keymust be unique across all loaded packspaletteandtrayvalues must be six-digit hex colors like#2f7d32- invalid palette colors are skipped instead of crashing the app
- invalid tray colors fall back to the default tray palette
- malformed or unreadable
.jsonfiles are ignored with a warning so the pet keeps running - unknown animation frame references are reported and fall back to the default sequence
- missing v2 fields are filled with safe defaults so older packs keep working
Example:
{
"key": "forest-ranger",
"label": "Forest Ranger Jason",
"author": "Example Creator",
"description": "A mossy outdoors variant for bug-hunting expeditions.",
"version": "1.0",
"char_map": {
"T": "F"
},
"palette": {
"F": "#2f7d32"
},
"tray": {
"hair": "#4a3728",
"body": "#2f7d32",
"legs": "#2d4263"
},
"tags": ["forest", "outdoors"],
"quote_affinity": {
"categories": ["forest"],
"contexts": ["wandering"]
},
"accessory_offsets": {
"bubble": {"x": 0, "y": -4},
"toy_anchor": {"x": 2, "y": 46},
"carry": {"x": 0, "y": 30}
},
"animations": {
"interaction": [
{"frame": "dance1", "delay_ms": 120},
{"frame": "dance2", "delay_ms": 120},
{"frame": "dance3", "delay_ms": 135}
]
},
"overlay": [
"................",
"................",
"................",
"................",
"................",
"................",
"................",
"................",
"................",
"................",
"................",
"................",
"................",
"................",
"................",
"................",
"................",
"................",
"................",
"................"
]
}