{
  "game": "stack",
  "displayName": "Stack",
  "rtpPercent": 99.0,
  "rtpE8": 99000000,
  "engine": "uint32",
  "biasClass": "modulo",
  "params": [
    {
      "name": "difficulty",
      "desc": "starting window width: easy/medium/hard/insane"
    },
    {
      "name": "sides",
      "desc": "0–12 leans, one per floor climbed: left/right"
    }
  ],
  "maxFloors": 12,
  "sides": [
    "left",
    "right"
  ],
  "difficulty": {
    "easy": {
      "D": 8,
      "w0": 6,
      "windows": {
        "1": {
          "left": {
            "residues": [
              0
            ],
            "perfect": 0
          },
          "right": {
            "residues": [
              7
            ],
            "perfect": 7
          },
          "stepNum": 8,
          "stepDen": 1,
          "nextEdge": 1
        },
        "2": {
          "left": {
            "residues": [
              0,
              1
            ],
            "perfect": 0
          },
          "right": {
            "residues": [
              6,
              7
            ],
            "perfect": 6
          },
          "stepNum": 8,
          "stepDen": 2,
          "nextEdge": 1
        },
        "3": {
          "left": {
            "residues": [
              0,
              1,
              2
            ],
            "perfect": 1
          },
          "right": {
            "residues": [
              5,
              6,
              7
            ],
            "perfect": 6
          },
          "stepNum": 8,
          "stepDen": 3,
          "nextEdge": 2
        },
        "4": {
          "left": {
            "residues": [
              0,
              1,
              2,
              3
            ],
            "perfect": 1
          },
          "right": {
            "residues": [
              4,
              5,
              6,
              7
            ],
            "perfect": 5
          },
          "stepNum": 8,
          "stepDen": 4,
          "nextEdge": 3
        },
        "5": {
          "left": {
            "residues": [
              0,
              1,
              2,
              3,
              4
            ],
            "perfect": 2
          },
          "right": {
            "residues": [
              3,
              4,
              5,
              6,
              7
            ],
            "perfect": 5
          },
          "stepNum": 8,
          "stepDen": 5,
          "nextEdge": 4
        },
        "6": {
          "left": {
            "residues": [
              0,
              1,
              2,
              3,
              4,
              5
            ],
            "perfect": 2
          },
          "right": {
            "residues": [
              2,
              3,
              4,
              5,
              6,
              7
            ],
            "perfect": 4
          },
          "stepNum": 8,
          "stepDen": 6,
          "nextEdge": 5
        }
      }
    },
    "medium": {
      "D": 8,
      "w0": 4,
      "windows": {
        "1": {
          "left": {
            "residues": [
              0
            ],
            "perfect": 0
          },
          "right": {
            "residues": [
              7
            ],
            "perfect": 7
          },
          "stepNum": 8,
          "stepDen": 1,
          "nextEdge": 1
        },
        "2": {
          "left": {
            "residues": [
              0,
              1
            ],
            "perfect": 0
          },
          "right": {
            "residues": [
              6,
              7
            ],
            "perfect": 6
          },
          "stepNum": 8,
          "stepDen": 2,
          "nextEdge": 1
        },
        "3": {
          "left": {
            "residues": [
              0,
              1,
              2
            ],
            "perfect": 1
          },
          "right": {
            "residues": [
              5,
              6,
              7
            ],
            "perfect": 6
          },
          "stepNum": 8,
          "stepDen": 3,
          "nextEdge": 2
        },
        "4": {
          "left": {
            "residues": [
              0,
              1,
              2,
              3
            ],
            "perfect": 1
          },
          "right": {
            "residues": [
              4,
              5,
              6,
              7
            ],
            "perfect": 5
          },
          "stepNum": 8,
          "stepDen": 4,
          "nextEdge": 3
        }
      }
    },
    "hard": {
      "D": 8,
      "w0": 3,
      "windows": {
        "1": {
          "left": {
            "residues": [
              0
            ],
            "perfect": 0
          },
          "right": {
            "residues": [
              7
            ],
            "perfect": 7
          },
          "stepNum": 8,
          "stepDen": 1,
          "nextEdge": 1
        },
        "2": {
          "left": {
            "residues": [
              0,
              1
            ],
            "perfect": 0
          },
          "right": {
            "residues": [
              6,
              7
            ],
            "perfect": 6
          },
          "stepNum": 8,
          "stepDen": 2,
          "nextEdge": 1
        },
        "3": {
          "left": {
            "residues": [
              0,
              1,
              2
            ],
            "perfect": 1
          },
          "right": {
            "residues": [
              5,
              6,
              7
            ],
            "perfect": 6
          },
          "stepNum": 8,
          "stepDen": 3,
          "nextEdge": 2
        }
      }
    },
    "insane": {
      "D": 8,
      "w0": 2,
      "windows": {
        "1": {
          "left": {
            "residues": [
              0
            ],
            "perfect": 0
          },
          "right": {
            "residues": [
              7
            ],
            "perfect": 7
          },
          "stepNum": 8,
          "stepDen": 1,
          "nextEdge": 1
        },
        "2": {
          "left": {
            "residues": [
              0,
              1
            ],
            "perfect": 0
          },
          "right": {
            "residues": [
              6,
              7
            ],
            "perfect": 6
          },
          "stepNum": 8,
          "stepDen": 2,
          "nextEdge": 1
        }
      }
    }
  },
  "note": "one uint32 per played floor gives r = u mod D (D = 8 divides 2^32, so the reduction is exactly uniform — zero modulo bias); the lean survives iff r is in that side's baked w-residue window (left {0..w-1}, right {D-w..D-1}), the window's dead-centre residue is a 'perfect' that keeps the width while any other catch trims it to nextEdge (min 1), and the multiplier is one floor over the baked per-floor odds: floor(rtp · ∏ stepNum / ∏ stepDen) = rtp·D^k // (w_1·…·w_k)."
}
