{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "additionalProperties": false,
  "$id": "https://github.com/Bobikobi/GAME/schema/json/params.schema.json",
  "type": "object",
  "required": [
    "format",
    "id",
    "title",
    "creator",
    "type",
    "params"
  ],
  "properties": {
    "$schema": {
      "type": "string"
    },
    "format": {
      "description": "Format version of this file.",
      "const": 1,
      "type": "number"
    },
    "id": {
      "pattern": "^[a-z0-9_-]+/[a-z0-9_-]+$",
      "maxLength": 80,
      "description": "Stable id \"creator/name\": lowercase letters, digits, \"_\" and \"-\". Never reused once merged.",
      "type": "string"
    },
    "title": {
      "minLength": 1,
      "maxLength": 40,
      "type": "string"
    },
    "creator": {
      "pattern": "^[a-z0-9_-]+$",
      "maxLength": 39,
      "description": "GitHub handle, lowercase.",
      "type": "string"
    },
    "description": {
      "minLength": 1,
      "maxLength": 240,
      "type": "string"
    },
    "ai_tools": {
      "maxItems": 8,
      "description": "AI tools used to make this file or its art. Required when any were used.",
      "type": "array",
      "items": {
        "minLength": 1,
        "maxLength": 60,
        "type": "string"
      }
    },
    "items": {
      "maxItems": 40,
      "type": "array",
      "items": {
        "additionalProperties": false,
        "type": "object",
        "required": [
          "id",
          "name",
          "kind",
          "rarity",
          "sprite"
        ],
        "properties": {
          "id": {
            "pattern": "^[a-z0-9_-]+/[a-z0-9_-]+$",
            "maxLength": 80,
            "description": "Stable id \"creator/name\": lowercase letters, digits, \"_\" and \"-\". Never reused once merged.",
            "type": "string"
          },
          "name": {
            "minLength": 1,
            "maxLength": 40,
            "type": "string"
          },
          "description": {
            "minLength": 1,
            "maxLength": 240,
            "type": "string"
          },
          "kind": {
            "anyOf": [
              {
                "const": "material",
                "type": "string"
              },
              {
                "const": "food",
                "type": "string"
              },
              {
                "const": "tool",
                "type": "string"
              },
              {
                "const": "fragment",
                "type": "string"
              },
              {
                "const": "treasure",
                "type": "string"
              }
            ]
          },
          "rarity": {
            "description": "Declared rarity. The check compares it with the rarity computed from the data.",
            "anyOf": [
              {
                "const": "common",
                "type": "string"
              },
              {
                "const": "uncommon",
                "type": "string"
              },
              {
                "const": "rare",
                "type": "string"
              },
              {
                "const": "legendary",
                "type": "string"
              }
            ]
          },
          "class": {
            "description": "A base class (plant, wood, fibre, ...) or the id of a class an extension declares under one of them.",
            "anyOf": [
              {
                "const": "plant",
                "type": "string"
              },
              {
                "const": "wood",
                "type": "string"
              },
              {
                "const": "fibre",
                "type": "string"
              },
              {
                "const": "stone",
                "type": "string"
              },
              {
                "const": "clay",
                "type": "string"
              },
              {
                "const": "mineral",
                "type": "string"
              },
              {
                "const": "metal",
                "type": "string"
              },
              {
                "const": "animal",
                "type": "string"
              },
              {
                "const": "meal",
                "type": "string"
              },
              {
                "const": "tool",
                "type": "string"
              },
              {
                "const": "garment",
                "type": "string"
              },
              {
                "const": "jewelry",
                "type": "string"
              },
              {
                "const": "relic",
                "type": "string"
              },
              {
                "pattern": "^[a-z0-9_-]+/[a-z0-9_-]+$",
                "maxLength": 80,
                "description": "Stable id \"creator/name\": lowercase letters, digits, \"_\" and \"-\". Never reused once merged.",
                "type": "string"
              }
            ]
          },
          "family": {
            "pattern": "^[a-z0-9_-]+$",
            "maxLength": 24,
            "description": "A group inside the class, for example \"berry\" for every berry. Open: any lowercase word.",
            "type": "string"
          },
          "tags": {
            "maxItems": 8,
            "uniqueItems": true,
            "description": "Open words that describe it, for example \"sweet\" or \"night\".",
            "type": "array",
            "items": {
              "pattern": "^[a-z0-9_-]+$",
              "maxLength": 24,
              "description": "A lowercase word.",
              "type": "string"
            }
          },
          "tier": {
            "minimum": 1,
            "maximum": 20,
            "description": "How advanced it is, from 1. The rarity says how often it appears; the tier says how far up the ladder it is. A tool has the tier of its \"tool\".",
            "type": "integer"
          },
          "sprite": {
            "pattern": "^[a-z0-9_-]+/[a-z0-9_-]+:[a-z0-9_/-]+$",
            "maxLength": 120,
            "description": "A frame of an art kit: \"<kit id>:<frame name>\", for example \"core/base-kit:items/berry\".",
            "type": "string"
          },
          "food": {
            "additionalProperties": false,
            "type": "object",
            "required": [
              "satiety"
            ],
            "properties": {
              "satiety": {
                "minimum": 0,
                "maximum": 100,
                "description": "Health points restored when eaten (the meter holds 100 at the start). 0 for a food that only hurts.",
                "type": "integer"
              },
              "hurt": {
                "minimum": 1,
                "maximum": 100,
                "description": "Health points it takes when eaten, at any hour: a bad fruit or a raw herb (G30).",
                "type": "integer"
              }
            }
          },
          "tool": {
            "additionalProperties": false,
            "type": "object",
            "required": [
              "kind",
              "tier"
            ],
            "properties": {
              "kind": {
                "anyOf": [
                  {
                    "const": "basket",
                    "type": "string"
                  },
                  {
                    "const": "trowel",
                    "type": "string"
                  },
                  {
                    "const": "axe",
                    "type": "string"
                  },
                  {
                    "const": "staff",
                    "type": "string"
                  }
                ]
              },
              "tier": {
                "minimum": 1,
                "maximum": 5,
                "description": "Better tools work faster. The calculator clamps the total.",
                "type": "integer"
              },
              "uses": {
                "minimum": 1,
                "maximum": 1000,
                "description": "The tool wears out after this many uses. Left out, the tool lasts (DECISIONS.md, 2026-10-09: the crafting economy).",
                "type": "integer"
              }
            }
          },
          "fragment": {
            "additionalProperties": false,
            "description": "A found scrap that teaches a recipe.",
            "type": "object",
            "required": [
              "unlocks"
            ],
            "properties": {
              "unlocks": {
                "pattern": "^[a-z0-9_-]+/[a-z0-9_-]+$",
                "maxLength": 80,
                "description": "Stable id \"creator/name\": lowercase letters, digits, \"_\" and \"-\". Never reused once merged.",
                "type": "string"
              }
            }
          },
          "wear": {
            "additionalProperties": false,
            "description": "Something the character wears (DECISIONS.md, 2026-10-09: the upgrade). A worn item stays in the bag.",
            "type": "object",
            "required": [
              "slot"
            ],
            "properties": {
              "slot": {
                "description": "Where it is worn: head, top, legs (trousers), outfit (takes the top and the legs), feet, jewelry (two places) or hand (a tool).",
                "anyOf": [
                  {
                    "const": "head",
                    "type": "string"
                  },
                  {
                    "const": "top",
                    "type": "string"
                  },
                  {
                    "const": "legs",
                    "type": "string"
                  },
                  {
                    "const": "outfit",
                    "type": "string"
                  },
                  {
                    "const": "feet",
                    "type": "string"
                  },
                  {
                    "const": "jewelry",
                    "type": "string"
                  },
                  {
                    "const": "hand",
                    "type": "string"
                  }
                ]
              },
              "look": {
                "description": "A look: worn on the look layer over the work clothes. It shows and counts for nothing, so it has no effects and no set.",
                "type": "boolean"
              },
              "effects": {
                "minItems": 1,
                "maxItems": 2,
                "description": "Small bonuses while it is worn on the work layer. Two at most, each effect once.",
                "type": "array",
                "items": {
                  "additionalProperties": false,
                  "type": "object",
                  "required": [
                    "effect",
                    "value"
                  ],
                  "properties": {
                    "effect": {
                      "description": "What a worn item helps: gathering, digging or crafting speed, the craft chance, or rare finds.",
                      "anyOf": [
                        {
                          "const": "gather_speed_pct",
                          "type": "string"
                        },
                        {
                          "const": "dig_speed_pct",
                          "type": "string"
                        },
                        {
                          "const": "craft_speed_pct",
                          "type": "string"
                        },
                        {
                          "const": "craft_chance_pct",
                          "type": "string"
                        },
                        {
                          "const": "rare_find_pct",
                          "type": "string"
                        }
                      ]
                    },
                    "value": {
                      "minimum": 1,
                      "maximum": 100,
                      "description": "Percent, at most the cap of the item's tier (params.wear_effect_max_pct).",
                      "type": "integer"
                    }
                  }
                }
              },
              "set": {
                "pattern": "^[a-z0-9_-]+/[a-z0-9_-]+$",
                "maxLength": 80,
                "description": "A set of one creator: when every piece of it is worn, their effects grow by params.wear_set_bonus_pct.",
                "type": "string"
              }
            }
          },
          "premium_later": {
            "description": "Marks a look that may also be sold for premium currency once stage 6 brings it. Only a look item with no effect may carry it, and it stays obtainable in the game (DECISIONS.md, 2026-10-09).",
            "type": "boolean"
          }
        }
      }
    },
    "classes": {
      "maxItems": 10,
      "description": "Classes of your own, each under one base class.",
      "type": "array",
      "items": {
        "additionalProperties": false,
        "description": "A class of your own, declared under one base class. Every rule written for the base class holds for it.",
        "type": "object",
        "required": [
          "id",
          "name",
          "base"
        ],
        "properties": {
          "id": {
            "pattern": "^[a-z0-9_-]+/[a-z0-9_-]+$",
            "maxLength": 80,
            "description": "Stable id \"creator/name\": lowercase letters, digits, \"_\" and \"-\". Never reused once merged.",
            "type": "string"
          },
          "name": {
            "minLength": 1,
            "maxLength": 40,
            "type": "string"
          },
          "base": {
            "description": "plant (leaves, herbs, berries, fruit, roots, mushrooms), wood, fibre (reeds, grass, thread, cloth), stone, clay (clay, sand, pottery, brick), mineral (crystals, gems, salt, ore), metal (waits for its discovery), animal (feathers, wool, hide, bone), meal (cooked food), tool, garment (worn clothes), jewelry, relic (old things from the ruins).",
            "anyOf": [
              {
                "const": "plant",
                "type": "string"
              },
              {
                "const": "wood",
                "type": "string"
              },
              {
                "const": "fibre",
                "type": "string"
              },
              {
                "const": "stone",
                "type": "string"
              },
              {
                "const": "clay",
                "type": "string"
              },
              {
                "const": "mineral",
                "type": "string"
              },
              {
                "const": "metal",
                "type": "string"
              },
              {
                "const": "animal",
                "type": "string"
              },
              {
                "const": "meal",
                "type": "string"
              },
              {
                "const": "tool",
                "type": "string"
              },
              {
                "const": "garment",
                "type": "string"
              },
              {
                "const": "jewelry",
                "type": "string"
              },
              {
                "const": "relic",
                "type": "string"
              }
            ]
          },
          "description": {
            "minLength": 1,
            "maxLength": 240,
            "type": "string"
          }
        }
      }
    },
    "type": {
      "const": "params",
      "type": "string"
    },
    "params": {
      "additionalProperties": false,
      "type": "object",
      "required": [
        "k_permille",
        "k_craft_permille",
        "r_mg_per_value_ms",
        "t_min_ms",
        "max_action_ms",
        "effort_permille",
        "power_cap_permille",
        "rarity_budget_permille",
        "open_tiers",
        "tier_min_level",
        "template_max_recipes",
        "craft_chance_bp",
        "craft_level_step_bp",
        "craft_luck_max_permille",
        "craft_miss_keep_pct",
        "wear_effect_max_pct",
        "wear_set_bonus_pct",
        "rarity_bonus_ms",
        "drift_budget_permille",
        "satiety_cap",
        "satiety_drain_per_min",
        "day_length_ms",
        "walk_step_ms",
        "hp_low_pct",
        "hazard",
        "bag_base",
        "starting_gold_mg",
        "per_point"
      ],
      "properties": {
        "k_permille": {
          "additionalProperties": false,
          "type": "object",
          "required": [
            "value",
            "min",
            "max",
            "step"
          ],
          "properties": {
            "value": {
              "type": "integer"
            },
            "min": {
              "type": "integer"
            },
            "max": {
              "type": "integer"
            },
            "step": {
              "minimum": 0,
              "description": "Largest change one decision may make.",
              "type": "integer"
            }
          }
        },
        "k_craft_permille": {
          "additionalProperties": false,
          "type": "object",
          "required": [
            "value",
            "min",
            "max",
            "step"
          ],
          "properties": {
            "value": {
              "type": "integer"
            },
            "min": {
              "type": "integer"
            },
            "max": {
              "type": "integer"
            },
            "step": {
              "minimum": 0,
              "description": "Largest change one decision may make.",
              "type": "integer"
            }
          },
          "description": "What the trader pays for a made good, an item whose value comes from a recipe, per mille of r * V; k_permille holds for the rest. At least k_permille and always below 1000, so the trader never pays what the shop charges (DECISIONS.md, 2026-10-09: the crafting economy)."
        },
        "r_mg_per_value_ms": {
          "additionalProperties": false,
          "type": "object",
          "required": [
            "value",
            "min",
            "max",
            "step"
          ],
          "properties": {
            "value": {
              "type": "integer"
            },
            "min": {
              "type": "integer"
            },
            "max": {
              "type": "integer"
            },
            "step": {
              "minimum": 0,
              "description": "Largest change one decision may make.",
              "type": "integer"
            }
          }
        },
        "t_min_ms": {
          "additionalProperties": false,
          "type": "object",
          "required": [
            "value",
            "min",
            "max",
            "step"
          ],
          "properties": {
            "value": {
              "type": "integer"
            },
            "min": {
              "type": "integer"
            },
            "max": {
              "type": "integer"
            },
            "step": {
              "minimum": 0,
              "description": "Largest change one decision may make.",
              "type": "integer"
            }
          }
        },
        "max_action_ms": {
          "additionalProperties": false,
          "type": "object",
          "required": [
            "value",
            "min",
            "max",
            "step"
          ],
          "properties": {
            "value": {
              "type": "integer"
            },
            "min": {
              "type": "integer"
            },
            "max": {
              "type": "integer"
            },
            "step": {
              "minimum": 0,
              "description": "Largest change one decision may make.",
              "type": "integer"
            }
          }
        },
        "effort_permille": {
          "additionalProperties": false,
          "type": "object",
          "required": [
            "easy",
            "medium",
            "craft",
            "hard"
          ],
          "properties": {
            "easy": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              }
            },
            "medium": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              }
            },
            "craft": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              }
            },
            "hard": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              }
            }
          }
        },
        "power_cap_permille": {
          "minItems": 1,
          "maxItems": 40,
          "description": "P(level): the clamp on any rate multiplier, by character level (1-based).",
          "type": "array",
          "items": {
            "minimum": 1000,
            "maximum": 10000,
            "type": "integer"
          }
        },
        "rarity_budget_permille": {
          "additionalProperties": false,
          "type": "object",
          "required": [
            "value",
            "min",
            "max",
            "step"
          ],
          "properties": {
            "value": {
              "type": "integer"
            },
            "min": {
              "type": "integer"
            },
            "max": {
              "type": "integer"
            },
            "step": {
              "minimum": 0,
              "description": "Largest change one decision may make.",
              "type": "integer"
            }
          }
        },
        "open_tiers": {
          "additionalProperties": false,
          "type": "object",
          "required": [
            "value",
            "min",
            "max",
            "step"
          ],
          "properties": {
            "value": {
              "type": "integer"
            },
            "min": {
              "type": "integer"
            },
            "max": {
              "type": "integer"
            },
            "step": {
              "minimum": 0,
              "description": "Largest change one decision may make.",
              "type": "integer"
            }
          },
          "description": "The highest item tier the world has opened. A stage or a new town opens the next one."
        },
        "tier_min_level": {
          "minItems": 1,
          "maxItems": 20,
          "description": "The lowest level of each tier, from tier 1. A recipe of tier t needs a level from entry t up to one below entry t + 1 (up to 20 for the last), and a node that gives tier 3 or above needs at least entry t, or a slow respawn. Starts at 1 and rises with every tier; one entry for every open tier at least.",
          "type": "array",
          "items": {
            "minimum": 1,
            "maximum": 20,
            "type": "integer"
          }
        },
        "template_max_recipes": {
          "additionalProperties": false,
          "type": "object",
          "required": [
            "value",
            "min",
            "max",
            "step"
          ],
          "properties": {
            "value": {
              "type": "integer"
            },
            "min": {
              "type": "integer"
            },
            "max": {
              "type": "integer"
            },
            "step": {
              "minimum": 0,
              "description": "Largest change one decision may make.",
              "type": "integer"
            }
          },
          "description": "The most recipes one recipe template may make."
        },
        "craft_chance_bp": {
          "minItems": 1,
          "maxItems": 20,
          "description": "The chance a craft succeeds at exactly its level, in basis points, by the recipe's tier from tier 1; the last entry holds for the tiers above it. Never rises with the tier; 10000 is a sure craft.",
          "type": "array",
          "items": {
            "minimum": 1000,
            "maximum": 10000,
            "type": "integer"
          }
        },
        "craft_level_step_bp": {
          "additionalProperties": false,
          "type": "object",
          "required": [
            "value",
            "min",
            "max",
            "step"
          ],
          "properties": {
            "value": {
              "type": "integer"
            },
            "min": {
              "type": "integer"
            },
            "max": {
              "type": "integer"
            },
            "step": {
              "minimum": 0,
              "description": "Largest change one decision may make.",
              "type": "integer"
            }
          },
          "description": "What each level of the recipe's profession above the recipe's level adds to the craft chance, in basis points."
        },
        "craft_luck_max_permille": {
          "additionalProperties": false,
          "type": "object",
          "required": [
            "value",
            "min",
            "max",
            "step"
          ],
          "properties": {
            "value": {
              "type": "integer"
            },
            "min": {
              "type": "integer"
            },
            "max": {
              "type": "integer"
            },
            "step": {
              "minimum": 0,
              "description": "Largest change one decision may make.",
              "type": "integer"
            }
          },
          "description": "The largest part of the gap to a sure craft that luck and luck items close, in permille: skill decides, luck tilts (G40)."
        },
        "craft_miss_keep_pct": {
          "additionalProperties": false,
          "type": "object",
          "required": [
            "value",
            "min",
            "max",
            "step"
          ],
          "properties": {
            "value": {
              "type": "integer"
            },
            "min": {
              "type": "integer"
            },
            "max": {
              "type": "integer"
            },
            "step": {
              "minimum": 0,
              "description": "Largest change one decision may make.",
              "type": "integer"
            }
          },
          "description": "Part of each input a missed craft keeps when the recipe names no share, rounded down."
        },
        "wear_effect_max_pct": {
          "minItems": 1,
          "maxItems": 20,
          "description": "The largest value of one effect on a worn item, by the item's tier from tier 1; the last entry holds for the tiers above it. Never falls with the tier.",
          "type": "array",
          "items": {
            "minimum": 0,
            "maximum": 100,
            "type": "integer"
          }
        },
        "wear_set_bonus_pct": {
          "additionalProperties": false,
          "type": "object",
          "required": [
            "value",
            "min",
            "max",
            "step"
          ],
          "properties": {
            "value": {
              "type": "integer"
            },
            "min": {
              "type": "integer"
            },
            "max": {
              "type": "integer"
            },
            "step": {
              "minimum": 0,
              "description": "Largest change one decision may make.",
              "type": "integer"
            }
          },
          "description": "How much a full set adds to the effects of its pieces, in percent of their sum, rounded down."
        },
        "rarity_bonus_ms": {
          "additionalProperties": false,
          "type": "object",
          "required": [
            "common",
            "uncommon",
            "rare",
            "legendary"
          ],
          "properties": {
            "common": {
              "type": "integer"
            },
            "uncommon": {
              "type": "integer"
            },
            "rare": {
              "type": "integer"
            },
            "legendary": {
              "type": "integer"
            }
          }
        },
        "drift_budget_permille": {
          "additionalProperties": false,
          "type": "object",
          "required": [
            "value",
            "min",
            "max",
            "step"
          ],
          "properties": {
            "value": {
              "type": "integer"
            },
            "min": {
              "type": "integer"
            },
            "max": {
              "type": "integer"
            },
            "step": {
              "minimum": 0,
              "description": "Largest change one decision may make.",
              "type": "integer"
            }
          }
        },
        "satiety_cap": {
          "additionalProperties": false,
          "type": "object",
          "required": [
            "value",
            "min",
            "max",
            "step"
          ],
          "properties": {
            "value": {
              "type": "integer"
            },
            "min": {
              "type": "integer"
            },
            "max": {
              "type": "integer"
            },
            "step": {
              "minimum": 0,
              "description": "Largest change one decision may make.",
              "type": "integer"
            }
          }
        },
        "satiety_drain_per_min": {
          "additionalProperties": false,
          "type": "object",
          "required": [
            "value",
            "min",
            "max",
            "step"
          ],
          "properties": {
            "value": {
              "type": "integer"
            },
            "min": {
              "type": "integer"
            },
            "max": {
              "type": "integer"
            },
            "step": {
              "minimum": 0,
              "description": "Largest change one decision may make.",
              "type": "integer"
            }
          }
        },
        "day_length_ms": {
          "additionalProperties": false,
          "type": "object",
          "required": [
            "value",
            "min",
            "max",
            "step"
          ],
          "properties": {
            "value": {
              "type": "integer"
            },
            "min": {
              "type": "integer"
            },
            "max": {
              "type": "integer"
            },
            "step": {
              "minimum": 0,
              "description": "Largest change one decision may make.",
              "type": "integer"
            }
          }
        },
        "walk_step_ms": {
          "additionalProperties": false,
          "type": "object",
          "required": [
            "value",
            "min",
            "max",
            "step"
          ],
          "properties": {
            "value": {
              "type": "integer"
            },
            "min": {
              "type": "integer"
            },
            "max": {
              "type": "integer"
            },
            "step": {
              "minimum": 0,
              "description": "Largest change one decision may make.",
              "type": "integer"
            }
          },
          "description": "Milliseconds the player takes to walk one tile. The client walks at this pace; the kernel checks a position report against it (DECISIONS.md, 2026-10-10: health and hazards)."
        },
        "hp_low_pct": {
          "additionalProperties": false,
          "type": "object",
          "required": [
            "value",
            "min",
            "max",
            "step"
          ],
          "properties": {
            "value": {
              "type": "integer"
            },
            "min": {
              "type": "integer"
            },
            "max": {
              "type": "integer"
            },
            "step": {
              "minimum": 0,
              "description": "Largest change one decision may make.",
              "type": "integer"
            }
          },
          "description": "Work takes half as long again while health is at or below this share of its cap, in percent. 0 slows it only when health is empty (G32)."
        },
        "hazard": {
          "additionalProperties": false,
          "description": "How hard each kind of hazard hits (G30, G34). A hazard is a rule, not a roll.",
          "type": "object",
          "required": [
            "predator",
            "pit",
            "trap",
            "deep_water"
          ],
          "properties": {
            "predator": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "reach",
                "catch_ms",
                "bite_ms",
                "bite_pct"
              ],
              "properties": {
                "reach": {
                  "additionalProperties": false,
                  "type": "object",
                  "required": [
                    "value",
                    "min",
                    "max",
                    "step"
                  ],
                  "properties": {
                    "value": {
                      "type": "integer"
                    },
                    "min": {
                      "type": "integer"
                    },
                    "max": {
                      "type": "integer"
                    },
                    "step": {
                      "minimum": 0,
                      "description": "Largest change one decision may make.",
                      "type": "integer"
                    }
                  },
                  "description": "Tiles from its footprint within which a predator notices the player, unless the prop says otherwise."
                },
                "catch_ms": {
                  "additionalProperties": false,
                  "type": "object",
                  "required": [
                    "value",
                    "min",
                    "max",
                    "step"
                  ],
                  "properties": {
                    "value": {
                      "type": "integer"
                    },
                    "min": {
                      "type": "integer"
                    },
                    "max": {
                      "type": "integer"
                    },
                    "step": {
                      "minimum": 0,
                      "description": "Largest change one decision may make.",
                      "type": "integer"
                    }
                  },
                  "description": "From the start of a chase to the first bite."
                },
                "bite_ms": {
                  "additionalProperties": false,
                  "type": "object",
                  "required": [
                    "value",
                    "min",
                    "max",
                    "step"
                  ],
                  "properties": {
                    "value": {
                      "type": "integer"
                    },
                    "min": {
                      "type": "integer"
                    },
                    "max": {
                      "type": "integer"
                    },
                    "step": {
                      "minimum": 0,
                      "description": "Largest change one decision may make.",
                      "type": "integer"
                    }
                  },
                  "description": "Between one bite and the next."
                },
                "bite_pct": {
                  "additionalProperties": false,
                  "type": "object",
                  "required": [
                    "value",
                    "min",
                    "max",
                    "step"
                  ],
                  "properties": {
                    "value": {
                      "type": "integer"
                    },
                    "min": {
                      "type": "integer"
                    },
                    "max": {
                      "type": "integer"
                    },
                    "step": {
                      "minimum": 0,
                      "description": "Largest change one decision may make.",
                      "type": "integer"
                    }
                  },
                  "description": "What one bite takes, in percent of the health cap."
                }
              }
            },
            "pit": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "harm_pct"
              ],
              "properties": {
                "harm_pct": {
                  "additionalProperties": false,
                  "type": "object",
                  "required": [
                    "value",
                    "min",
                    "max",
                    "step"
                  ],
                  "properties": {
                    "value": {
                      "type": "integer"
                    },
                    "min": {
                      "type": "integer"
                    },
                    "max": {
                      "type": "integer"
                    },
                    "step": {
                      "minimum": 0,
                      "description": "Largest change one decision may make.",
                      "type": "integer"
                    }
                  },
                  "description": "What stepping into a pit takes, in percent of the health cap."
                }
              }
            },
            "trap": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "harm_pct"
              ],
              "properties": {
                "harm_pct": {
                  "additionalProperties": false,
                  "type": "object",
                  "required": [
                    "value",
                    "min",
                    "max",
                    "step"
                  ],
                  "properties": {
                    "value": {
                      "type": "integer"
                    },
                    "min": {
                      "type": "integer"
                    },
                    "max": {
                      "type": "integer"
                    },
                    "step": {
                      "minimum": 0,
                      "description": "Largest change one decision may make.",
                      "type": "integer"
                    }
                  },
                  "description": "What stepping on a trap takes, in percent of the health cap."
                }
              }
            },
            "deep_water": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "harm_pct"
              ],
              "properties": {
                "harm_pct": {
                  "additionalProperties": false,
                  "type": "object",
                  "required": [
                    "value",
                    "min",
                    "max",
                    "step"
                  ],
                  "properties": {
                    "value": {
                      "type": "integer"
                    },
                    "min": {
                      "type": "integer"
                    },
                    "max": {
                      "type": "integer"
                    },
                    "step": {
                      "minimum": 0,
                      "description": "Largest change one decision may make.",
                      "type": "integer"
                    }
                  },
                  "description": "What stepping into deep water takes, in percent of the health cap."
                }
              }
            }
          }
        },
        "bag_base": {
          "additionalProperties": false,
          "type": "object",
          "required": [
            "value",
            "min",
            "max",
            "step"
          ],
          "properties": {
            "value": {
              "type": "integer"
            },
            "min": {
              "type": "integer"
            },
            "max": {
              "type": "integer"
            },
            "step": {
              "minimum": 0,
              "description": "Largest change one decision may make.",
              "type": "integer"
            }
          }
        },
        "starting_gold_mg": {
          "additionalProperties": false,
          "type": "object",
          "required": [
            "value",
            "min",
            "max",
            "step"
          ],
          "properties": {
            "value": {
              "type": "integer"
            },
            "min": {
              "type": "integer"
            },
            "max": {
              "type": "integer"
            },
            "step": {
              "minimum": 0,
              "description": "Largest change one decision may make.",
              "type": "integer"
            }
          }
        },
        "per_point": {
          "additionalProperties": false,
          "description": "What one point in an attribute adds: bag places (carry), tiles of dig-hint distance (senses), percent wider timing windows in every minigame (agility), permille on rare and legendary finds inside the power cap and on keeping one unit after a missed gather (luck), and fullness (stamina).",
          "type": "object",
          "required": [
            "carry",
            "senses",
            "agility_pct",
            "luck_permille",
            "stamina"
          ],
          "properties": {
            "carry": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              }
            },
            "senses": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              }
            },
            "agility_pct": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              }
            },
            "luck_permille": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              }
            },
            "stamina": {
              "additionalProperties": false,
              "type": "object",
              "required": [
                "value",
                "min",
                "max",
                "step"
              ],
              "properties": {
                "value": {
                  "type": "integer"
                },
                "min": {
                  "type": "integer"
                },
                "max": {
                  "type": "integer"
                },
                "step": {
                  "minimum": 0,
                  "description": "Largest change one decision may make.",
                  "type": "integer"
                }
              }
            }
          }
        }
      }
    }
  }
}
