{
  "schema": "modtrick.mod-catalog/v1",
  "version": "1.0.0",
  "updated": "2026-07-31",
  "conventions": {
    "factory": "createX(scene, options)",
    "configApi": ["getConfig", "configure", "setConfig", "setEnabled"],
    "hostInject": ["camera", "renderer", "domElement", "THREE", "bus"],
    "sharedKit": "/mods/_shared/mod-kit-v2.js",
    "docs": "/docs/MOD-CONFIG.md"
  },
  "bus": {
    "playerPos": "Vector3 â€” collector / weather / npc look-at",
    "playerYaw": "number radians",
    "character": "Object3D",
    "sunDir": "Vector3",
    "sunColor": "Color",
    "score": "number",
    "collected": "number",
    "currency": "number",
    "currencyDelta": "number delta applied by currency mod",
    "health": "number",
    "dead": "boolean",
    "damage": "number one-shot consumed by health",
    "heal": "number one-shot",
    "sfx": "string one-shot for audio-bus",
    "toast": "string one-shot",
    "dialogue": "string | {lines, speaker}",
    "timeOfDay": "0-24",
    "fps": "number"
  },
  "mods": [
    {
      "id": "threejs-collectibles",
      "export": "createCollectibles",
      "presets": ["gems", "coins", "dense", "sparse"],
      "config": {
        "count": { "type": "number", "default": 12, "hot": true },
        "radius": { "type": "number", "default": 28, "hot": true },
        "collectDistance": { "type": "number", "default": 1.6, "hot": true },
        "color": { "type": "color", "default": "0x3dd6c6", "hot": true },
        "value": { "type": "number", "default": 1, "hot": true },
        "shape": { "type": "enum", "values": ["ico", "coin", "box", "sphere"], "default": "ico" },
        "respawn": { "type": "boolean", "default": false, "hot": true },
        "respawnDelay": { "type": "number", "default": 8, "hot": true },
        "bob": { "type": "boolean", "default": true, "hot": true },
        "spin": { "type": "boolean", "default": true, "hot": true },
        "enabled": { "type": "boolean", "default": true, "hot": true }
      },
      "busOut": ["score", "collected", "remaining", "currencyDelta", "sfx", "toast"]
    },
    {
      "id": "threejs-third-person",
      "export": "createThirdPerson",
      "needsHost": ["camera", "domElement"],
      "config": {
        "target": { "type": "Object3D", "required": true },
        "distance": { "type": "number", "default": 6, "hot": true },
        "height": { "type": "number", "default": 2.2, "hot": true },
        "speed": { "type": "number", "default": 7, "hot": true },
        "sprintMultiplier": { "type": "number", "default": 1.6, "hot": true },
        "lookSpeed": { "type": "number", "default": 0.0025, "hot": true },
        "smoothing": { "type": "number", "default": 8, "hot": true },
        "bounds": { "type": "object", "default": null, "hot": true },
        "enabled": { "type": "boolean", "default": true, "hot": true }
      },
      "busOut": ["playerPos", "playerYaw", "camera", "character"]
    },
    {
      "id": "threejs-health",
      "export": "createHealth",
      "config": {
        "max": { "type": "number", "default": 100, "hot": true },
        "showBar": { "type": "boolean", "default": true, "hot": true },
        "barPosition": { "type": "enum", "values": ["bottom-left", "bottom-right", "top-left"], "hot": true },
        "invulnerableMs": { "type": "number", "default": 0, "hot": true },
        "regenPerSecond": { "type": "number", "default": 0, "hot": true },
        "regenDelay": { "type": "number", "default": 3, "hot": true }
      },
      "busIn": ["damage", "heal"],
      "busOut": ["health", "healthMax", "dead"]
    },
    {
      "id": "threejs-particles",
      "export": "createParticles",
      "presets": ["fire", "smoke", "sparks", "magic", "embers", "snow"],
      "config": {
        "preset": { "type": "string", "hot": true },
        "size": { "type": "number", "hot": true },
        "speed": { "type": "number", "hot": true },
        "life": { "type": "number", "hot": true },
        "spread": { "type": "number", "hot": true },
        "gravity": { "type": "number", "hot": true },
        "color": { "type": "color", "hot": true },
        "opacity": { "type": "number", "hot": true },
        "enabled": { "type": "boolean", "hot": true }
      }
    },
    {
      "id": "threejs-easyfire",
      "export": "createEasyFire",
      "presets": ["campfire", "torch", "inferno", "arcane"],
      "busOut": ["fire", "fireIntensity"],
      "modes": ["webgl", "upstream"],
      "config": {
        "mode": { "type": "string", "hot": false },
        "intensity": { "type": "number", "hot": true },
        "steps": { "type": "number", "hot": true },
        "width": { "type": "number", "hot": true },
        "height": { "type": "number", "hot": true },
        "depth": { "type": "number", "hot": true },
        "rise": { "type": "number", "hot": true },
        "turbulence": { "type": "number", "hot": true },
        "noiseScale": { "type": "number", "hot": true },
        "specialMix": { "type": "number", "hot": true },
        "enabled": { "type": "boolean", "hot": true }
      }
    },
    {
      "id": "threejs-snowflow",
      "export": "createSnowflow",
      "presets": ["calm", "blizzard", "dusk", "packed"],
      "busIn": ["playerPos", "playerYaw", "camera"],
      "busOut": ["weather", "snow", "snowHeight"],
      "config": {
        "windAngle": { "type": "number", "hot": true },
        "sss": { "type": "number", "hot": true },
        "glint": { "type": "number", "hot": true },
        "ambient": { "type": "number", "hot": true },
        "flakeSpeed": { "type": "number", "hot": true },
        "flakeDrift": { "type": "number", "hot": true },
        "deformDepth": { "type": "number", "hot": true },
        "autoFootprints": { "type": "boolean", "hot": true },
        "enabled": { "type": "boolean", "hot": true }
      }
    },
    {
      "id": "threejs-clouds",
      "export": "createClouds",
      "busIn": ["sunDir"],
      "busOut": ["clouds"],
      "config": {
        "coverage": { "type": "number", "hot": true },
        "density": { "type": "number", "hot": true },
        "steps": { "type": "number", "hot": true },
        "speed": { "type": "number", "hot": true },
        "enabled": { "type": "boolean", "hot": true }
      }
    },
    {
      "id": "threejs-grass",
      "export": "createGrass",
      "busIn": ["sunDir", "windAngle"],
      "busOut": ["grass"],
      "config": {
        "wind": { "type": "number", "hot": true },
        "windAngle": { "type": "number", "hot": true },
        "gust": { "type": "number", "hot": true },
        "enabled": { "type": "boolean", "hot": true }
      }
    },
    {
      "id": "threejs-godrays",
      "export": "createGodrays",
      "needsHost": ["camera"],
      "busIn": ["camera", "sunDir"],
      "busOut": ["godrays"],
      "config": {
        "intensity": { "type": "number", "hot": true },
        "density": { "type": "number", "hot": true },
        "exposure": { "type": "number", "hot": true },
        "enabled": { "type": "boolean", "hot": true }
      }
    },
    {
      "id": "threejs-stars",
      "export": "createStars",
      "busIn": ["camera"],
      "busOut": ["stars"],
      "config": {
        "size": { "type": "number", "hot": true },
        "twinkle": { "type": "number", "hot": true },
        "rotationSpeed": { "type": "number", "hot": true },
        "enabled": { "type": "boolean", "hot": true }
      }
    },
    {
      "id": "threejs-lightning",
      "export": "createLightning",
      "busOut": ["lightning", "lightningActive"],
      "config": {
        "autoStrike": { "type": "boolean", "hot": true },
        "interval": { "type": "number", "hot": true },
        "enabled": { "type": "boolean", "hot": true }
      }
    },
    {
      "id": "threejs-water-ripple",
      "export": "createWaterRipple",
      "busOut": ["waterRipple"],
      "config": {
        "displacement": { "type": "number", "hot": true },
        "damping": { "type": "number", "hot": true },
        "opacity": { "type": "number", "hot": true },
        "enabled": { "type": "boolean", "hot": true }
      }
    },
    {
      "id": "threejs-trails",
      "export": "createTrails",
      "busIn": ["playerPos", "character"],
      "busOut": ["trails"],
      "config": {
        "opacity": { "type": "number", "hot": true },
        "enabled": { "type": "boolean", "hot": true }
      }
    },
    {
      "id": "threejs-fog-volume",
      "export": "createFogVolume",
      "busOut": ["fogVolume"],
      "config": {
        "fogDensity": { "type": "number", "hot": true },
        "density": { "type": "number", "hot": true },
        "enabled": { "type": "boolean", "hot": true }
      }
    },
    {
      "id": "threejs-wind-field",
      "export": "createWindField",
      "busIn": ["playerPos", "camera"],
      "busOut": ["windField", "windAngle", "windStrength"],
      "config": {
        "strength": { "type": "number", "hot": true },
        "windAngle": { "type": "number", "hot": true },
        "speed": { "type": "number", "hot": true },
        "enabled": { "type": "boolean", "hot": true }
      }
    },
    {
      "id": "threejs-hud",
      "export": "createHud",
      "config": {
        "title": { "type": "string", "hot": true },
        "prompt": { "type": "string", "hot": true },
        "showCrosshair": { "type": "boolean", "hot": true },
        "showTitle": { "type": "boolean", "hot": true },
        "showPrompt": { "type": "boolean", "hot": true },
        "showStats": { "type": "boolean", "hot": true },
        "theme": { "type": "object", "hot": true },
        "zIndex": { "type": "number", "hot": true }
      },
      "busIn": ["hudTitle", "hudPrompt", "hudStats"]
    },
    {
      "id": "threejs-orbit-camera",
      "export": "createOrbitCamera",
      "needsHost": ["camera", "domElement"]
    },
    {
      "id": "threejs-fps-controller",
      "export": "createFpsController",
      "needsHost": ["camera", "domElement"]
    },
    {
      "id": "threejs-sky",
      "export": "createSky",
      "config": {
        "timeOfDay": { "type": "number", "hot": true },
        "cloudCoverage": { "type": "number", "hot": true },
        "cloudSpeed": { "type": "number", "hot": true },
        "turbidity": { "type": "number", "hot": true }
      },
      "busOut": ["sunDir", "sunColor", "fogHints"]
    },
    {
      "id": "threejs-ocean",
      "export": "createOcean",
      "config": {
        "windSpeed": { "type": "number" },
        "choppiness": { "type": "number", "hot": true },
        "foamIntensity": { "type": "number", "hot": true },
        "causticsStrength": { "type": "number", "hot": true }
      },
      "busIn": ["sunDir", "sunColor"]
    },
    {
      "id": "threejs-post-fx",
      "export": "createPostFx",
      "needsHost": ["renderer", "camera"],
      "config": {
        "bloom": { "type": "number", "hot": true },
        "vignette": { "type": "number", "hot": true },
        "contrast": { "type": "number", "hot": true },
        "saturation": { "type": "number", "hot": true }
      },
      "renderPath": "handle.render(time) or runtime.render(time)"
    },
    { "id": "threejs-quest", "export": "createQuest", "busIn": ["collected"], "busOut": ["quests"] },
    { "id": "threejs-portal", "export": "createPortal", "busIn": ["playerPos", "character"] },
    { "id": "threejs-day-cycle", "export": "createDayCycle", "busOut": ["timeOfDay"] },
    { "id": "threejs-toast", "export": "createToast", "busIn": ["toast"] },
    { "id": "threejs-debug-stats", "export": "createDebugStats", "needsHost": ["renderer"], "busOut": ["fps"] },
    { "id": "threejs-currency", "export": "createCurrency", "busIn": ["currencyDelta"], "busOut": ["currency"] },
    { "id": "threejs-dialogue-box", "export": "createDialogueBox", "busIn": ["dialogue"] },
    { "id": "threejs-light-rig", "export": "createLightRig", "busIn": ["sunDir", "sunColor"] },
    { "id": "threejs-minimap", "export": "createMinimap", "busIn": ["playerPos", "playerYaw", "minimapMarkers"] },
    { "id": "threejs-inventory", "export": "createInventory", "busOut": ["inventory"] },
    { "id": "threejs-checkpoint", "export": "createCheckpoint", "busIn": ["playerPos"], "busOut": ["checkpoint"] },
    { "id": "threejs-audio-bus", "export": "createAudioBus", "busIn": ["sfx"] },
    { "id": "threejs-npc", "export": "createNpc", "busIn": ["playerPos"] },
    { "id": "threejs-weather-rain", "export": "createWeatherRain", "busIn": ["playerPos"], "busOut": ["weather"] },
    { "id": "threejs-timer", "export": "createTimer", "busOut": ["timer"] },
    { "id": "threejs-grid-floor", "export": "createGridFloor" },
    { "id": "threejs-simple-character", "export": "createSimpleCharacter", "busOut": ["playerPos", "playerYaw"] },
    { "id": "threejs-interact", "export": "createInteract", "needsHost": ["camera", "domElement"] },
    { "id": "threejs-gltf-kit", "export": "createGltfKit" },
    { "id": "threejs-billboards", "export": "createBillboards" }
  ]
}
