{
  "challenge": "last-game-v1",
  "logicHz": 60,
  "viewport": [
    960,
    540
  ],
  "map": {
    "id": 4,
    "name": "最后一局",
    "width": 960,
    "height": 540,
    "spawnBlue": {
      "x": 60,
      "y": 448
    },
    "spawnOrange": {
      "x": 60,
      "y": 248
    },
    "platforms": [
      {
        "x": 0,
        "y": 0,
        "w": 20,
        "h": 540
      },
      {
        "x": 940,
        "y": 0,
        "w": 20,
        "h": 540
      },
      {
        "x": 0,
        "y": 0,
        "w": 960,
        "h": 20
      },
      {
        "x": 0,
        "y": 480,
        "w": 580,
        "h": 60
      },
      {
        "x": 628,
        "y": 480,
        "w": 332,
        "h": 60
      },
      {
        "x": 20,
        "y": 280,
        "w": 280,
        "h": 20
      },
      {
        "x": 360,
        "y": 280,
        "w": 160,
        "h": 20
      },
      {
        "x": 600,
        "y": 280,
        "w": 180,
        "h": 20
      }
    ],
    "hazards": [
      {
        "x": 580,
        "y": 520,
        "w": 48,
        "h": 20
      }
    ],
    "buttons": [
      {
        "id": "btn4_orange",
        "bounds": {
          "x": 420,
          "y": 270,
          "w": 40,
          "h": 10
        },
        "type": "latch",
        "gateId": "gate4_blue"
      },
      {
        "id": "btn4_blue",
        "bounds": {
          "x": 460,
          "y": 470,
          "w": 40,
          "h": 10
        },
        "type": "latch",
        "gateId": "gate4_orange"
      }
    ],
    "gates": [
      {
        "id": "gate4_blue",
        "bounds": {
          "x": 340,
          "y": 380,
          "w": 20,
          "h": 100
        },
        "buttonId": "btn4_orange"
      },
      {
        "id": "gate4_orange",
        "bounds": {
          "x": 550,
          "y": 180,
          "w": 20,
          "h": 120
        },
        "buttonId": "btn4_blue"
      }
    ],
    "exit": {
      "x": 840,
      "y": 416,
      "w": 80,
      "h": 64
    }
  },
  "rules": [
    "Integer fixed-step physics; input masks are persistent states, not one-frame commands.",
    "Jump and interact require a rising edge. Release before triggering again.",
    "The two characters do not collide with each other. Gates require both contributions.",
    "A latched switch stays on. A closed gate is solid. Orange waits safely at the end."
  ]
}
