{
  "contents": [
    {
      "columns": 12,
      "contents": [
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-the-road-down-from-the-high-pass",
          "kind": "entrance",
          "name": "The road down from the high pass",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p4",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "B7"
          ],
          "stat": null,
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-down-to-the-breach",
          "kind": "exit",
          "name": "Down to the breach",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p5",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "F6"
          ],
          "stat": null,
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": "Rolls on Siege reinforcements when the table opens.",
          "drawFrom": "siege-reinforcements",
          "id": "c-patrol-on-the-road",
          "kind": "creature",
          "name": "Patrol on the road",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p6",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "H7"
          ],
          "stat": {
            "packId": "dndmax.bestiary",
            "selector": "hobgoblin"
          },
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": "Found by a DC 14 Survival check or by asking Old Marn the shepherd (D2).",
          "drawFrom": null,
          "id": "c-goat-track-to-the-postern",
          "kind": "exit",
          "name": "Goat track to the postern",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p7",
          "readAloud": "A shepherd's track, invisible unless you know it, winding up under the castle walls.",
          "reveal": "when-found",
          "shape": [
            "D5"
          ],
          "stat": null,
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-hobgoblin-patrol-1",
          "kind": "creature",
          "name": "Hobgoblin patrol 1",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p8",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "C7"
          ],
          "stat": {
            "packId": "dndmax.bestiary",
            "selector": "hobgoblin"
          },
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-hobgoblin-patrol-2",
          "kind": "creature",
          "name": "Hobgoblin patrol 2",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p9",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "D7"
          ],
          "stat": {
            "packId": "dndmax.bestiary",
            "selector": "hobgoblin"
          },
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-hobgoblin-patrol-3",
          "kind": "creature",
          "name": "Hobgoblin patrol 3",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p10",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "E7"
          ],
          "stat": {
            "packId": "dndmax.bestiary",
            "selector": "hobgoblin"
          },
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-wolf-rider",
          "kind": "creature",
          "name": "Wolf rider",
          "provenance": "ai-generated",
          "publicName": "a goblin on a huge wolf",
          "publicRef": "p11",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "H7"
          ],
          "stat": {
            "packId": "dndmax.bestiary",
            "selector": "dire-wolf"
          },
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": "Knows the goat track to the postern gate. Wants his flock back from the hobgoblin camp, or 20 gp.",
          "drawFrom": null,
          "id": "c-old-marn-the-shepherd",
          "kind": "note",
          "name": "Old Marn the shepherd",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p12",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "D2"
          ],
          "stat": null,
          "tags": [
            "quest:Get Old Marn's flock back|Old Marn's sheep were taken to the hobgoblin camp. He'll show you the goat track to the postern gate — and wants his flock back, or 20 gold."
          ]
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": "Rope, rations, 2 potions of healing, and a crate of arrows.",
          "drawFrom": "war-spoils",
          "id": "c-abandoned-supply-wagon",
          "kind": "loot",
          "name": "Abandoned supply wagon",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p13",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "C6"
          ],
          "stat": null,
          "tags": [
            "item:Rope",
            "item:Rations (heals 1)",
            "item:2 potions of healing",
            "item:Crate of arrows [tool]"
          ]
        }
      ],
      "edges": [],
      "mapId": "m-the-thornkeep-pass",
      "regions": [
        {
          "dmCue": null,
          "dmNotes": null,
          "id": "r-thornkeep-town",
          "name": "Thornkeep town",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p1",
          "readAloud": "A walled town in a valley fork. Smoke. Half the roofs gone.",
          "reveal": "on-entry",
          "shape": [
            "E5:G6"
          ],
          "tags": []
        },
        {
          "dmCue": null,
          "dmNotes": "Grisk's camp. Morrow's signet ring is in the warlord's tent — trophy, and proof.",
          "id": "r-the-hobgoblin-camp",
          "name": "The hobgoblin camp",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p2",
          "readAloud": "Rows of tents in perfect lines, cook fires, drums.",
          "reveal": "on-entry",
          "shape": [
            "I3:K5"
          ],
          "tags": []
        },
        {
          "dmCue": null,
          "dmNotes": null,
          "id": "r-the-high-pass-road",
          "name": "The high pass road",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p3",
          "readAloud": "The only road over the mountains, and it is full of soldiers.",
          "reveal": "on-entry",
          "shape": [
            "A7:L7"
          ],
          "tags": []
        }
      ],
      "rows": 8,
      "dmNotes": "ADVENTURE OVERVIEW. Castellan Morrow is the traitor: Grisk promised him the keep and the Thorn lands. He signals from the tower top at night with a red lantern. At moonrise (the end of the second long rest, or whenever drama demands) he opens the gatehouse portcullis and the troll leads the assault. The party can: fight in through the breach; sneak in the postern path below the kitchens; unmask Morrow (evidence: the red lantern in his tower room, coded orders in his desk, his missing signet in the hobgoblin camp). Destroy the trebuchets to stop the bombardment. Reward: Lady Aveline grants land and a title."
    },
    {
      "columns": 24,
      "contents": [
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-down-from-the-pass",
          "kind": "entrance",
          "name": "Down from the pass",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p4",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "B15"
          ],
          "stat": null,
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-back-up-to-the-pass",
          "kind": "exit",
          "name": "Back up to the pass",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p5",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "A16"
          ],
          "stat": null,
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-climb-the-rubble-into-the-bailey",
          "kind": "exit",
          "name": "Climb the rubble into the bailey",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p6",
          "readAloud": "Over the rubble. Arrows from both sides.",
          "reveal": "always",
          "shape": [
            "K5"
          ],
          "stat": null,
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-the-gatehouse-door",
          "kind": "exit",
          "name": "The gatehouse door",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p7",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "R7"
          ],
          "stat": null,
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-breach-assault-hobgoblin-1",
          "kind": "creature",
          "name": "Breach assault hobgoblin 1",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p8",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "J7"
          ],
          "stat": {
            "packId": "dndmax.bestiary",
            "selector": "hobgoblin"
          },
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-breach-assault-hobgoblin-2",
          "kind": "creature",
          "name": "Breach assault hobgoblin 2",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p9",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "K8"
          ],
          "stat": {
            "packId": "dndmax.bestiary",
            "selector": "hobgoblin"
          },
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-breach-assault-hobgoblin-3",
          "kind": "creature",
          "name": "Breach assault hobgoblin 3",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p10",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "L7"
          ],
          "stat": {
            "packId": "dndmax.bestiary",
            "selector": "hobgoblin"
          },
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-breach-assault-hobgoblin-4",
          "kind": "creature",
          "name": "Breach assault hobgoblin 4",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p11",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "K9"
          ],
          "stat": {
            "packId": "dndmax.bestiary",
            "selector": "hobgoblin"
          },
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-trebuchet-crew-1",
          "kind": "creature",
          "name": "Trebuchet crew 1",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p12",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "F13"
          ],
          "stat": {
            "packId": "dndmax.bestiary",
            "selector": "goblin-sneak"
          },
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-trebuchet-crew-2",
          "kind": "creature",
          "name": "Trebuchet crew 2",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p13",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "H13"
          ],
          "stat": {
            "packId": "dndmax.bestiary",
            "selector": "goblin-sneak"
          },
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-trebuchet-crew-3",
          "kind": "creature",
          "name": "Trebuchet crew 3",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p14",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "R13"
          ],
          "stat": {
            "packId": "dndmax.bestiary",
            "selector": "goblin-sneak"
          },
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-trebuchet-crew-4",
          "kind": "creature",
          "name": "Trebuchet crew 4",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p15",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "T13"
          ],
          "stat": {
            "packId": "dndmax.bestiary",
            "selector": "goblin-sneak"
          },
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-siege-master-varr",
          "kind": "creature",
          "name": "Siege-master Varr",
          "provenance": "ai-generated",
          "publicName": "a bugbear with a speaking trumpet",
          "publicRef": "p16",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "M12"
          ],
          "stat": {
            "packId": "dndmax.bestiary",
            "selector": "bugbear"
          },
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": "Throws boulders at the wall when the trebuchets reload. Tired of the war; can be bribed with food (a whole ox) to go home.",
          "drawFrom": null,
          "id": "c-stone-hurler",
          "kind": "creature",
          "name": "Stone-hurler",
          "provenance": "ai-generated",
          "publicName": "a giant with a cart of boulders",
          "publicRef": "p17",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "W11"
          ],
          "stat": {
            "packId": "dndmax.bestiary",
            "selector": "hill-giant"
          },
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": "Destroy it (AC 15, 40 HP, fire doubles damage) to stop half the bombardment.",
          "drawFrom": null,
          "id": "c-west-trebuchet",
          "kind": "hazard",
          "name": "West trebuchet",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p18",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "E11:F14"
          ],
          "stat": null,
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": "Destroy it (AC 15, 40 HP, fire doubles damage) to stop half the bombardment.",
          "drawFrom": null,
          "id": "c-east-trebuchet",
          "kind": "hazard",
          "name": "East trebuchet",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p19",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "R11:S14"
          ],
          "stat": null,
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-rubble-of-the-breach",
          "kind": "terrain",
          "name": "Rubble of the breach",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p20",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "J4:L8"
          ],
          "stat": null,
          "tags": [
            "rubble"
          ]
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-ditch",
          "kind": "terrain",
          "name": "Ditch",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p21",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "A8:X9"
          ],
          "stat": null,
          "tags": [
            "difficult"
          ]
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-wrecked-siege-tower",
          "kind": "cover",
          "name": "Wrecked siege tower",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p22",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "B11:C12"
          ],
          "stat": null,
          "tags": [
            "heavy-cover"
          ]
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": "A defender's corpse in good plate: +1 longsword, 25 gp, and a letter from Lady Aveline sealed with her crest.",
          "drawFrom": "war-spoils",
          "id": "c-fallen-knight",
          "kind": "loot",
          "name": "Fallen knight",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p23",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "N10"
          ],
          "stat": null,
          "tags": [
            "item:+1 longsword",
            "coins:25 gp",
            "item:Letter from Lady Aveline [quest]"
          ]
        }
      ],
      "edges": [],
      "mapId": "m-the-breach",
      "regions": [
        {
          "dmCue": null,
          "dmNotes": "Every other round, a trebuchet throws: roll a d24 for the column it hits on the wall.",
          "id": "r-no-man-s-land",
          "name": "No man's land",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p1",
          "readAloud": "Churned mud, broken spears, and two trebuchets creaking as their crews wind them back for another throw.",
          "reveal": "on-entry",
          "shape": [
            "A9:X16"
          ],
          "tags": []
        },
        {
          "dmCue": null,
          "dmNotes": "A hobgoblin assault team is trying to climb the rubble.",
          "id": "r-the-breach",
          "name": "The breach",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p2",
          "readAloud": "A ragged gap in the wall, piled with rubble and bodies. Shouting from the other side.",
          "reveal": "on-entry",
          "shape": [
            "J4:L8"
          ],
          "tags": []
        },
        {
          "dmCue": null,
          "dmNotes": null,
          "id": "r-the-gate-approach",
          "name": "The gate approach",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p3",
          "readAloud": "A paved road to the great gate, and the gate still holds — for now.",
          "reveal": "on-entry",
          "shape": [
            "Q6:S9"
          ],
          "tags": []
        }
      ],
      "rows": 16,
      "dmNotes": "The battlefield outside the curtain wall. Two trebuchets keep hammering the wall; destroying them (AC 15, 40 HP each, or fire) stops the bombardment for the rest of the adventure. The breach at J5:L8 leads into the bailey; the gate towers at P2:T6 are the gatehouse."
    },
    {
      "columns": 12,
      "contents": [
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-the-drawbridge",
          "kind": "entrance",
          "name": "The drawbridge",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p6",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "G8"
          ],
          "stat": null,
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-out-across-the-drawbridge",
          "kind": "exit",
          "name": "Out across the drawbridge",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p7",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "F8"
          ],
          "stat": null,
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-through-the-inner-gate-to-the-bailey",
          "kind": "exit",
          "name": "Through the inner gate to the bailey",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p8",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "G1"
          ],
          "stat": null,
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-gate-defender-1",
          "kind": "creature",
          "name": "Gate defender 1",
          "provenance": "ai-generated",
          "publicName": "a castle crossbowman",
          "publicRef": "p9",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "D3"
          ],
          "stat": {
            "packId": "dndmax.bestiary",
            "selector": "crossbowman"
          },
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-gate-defender-2",
          "kind": "creature",
          "name": "Gate defender 2",
          "provenance": "ai-generated",
          "publicName": "a castle crossbowman",
          "publicRef": "p10",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "I3"
          ],
          "stat": {
            "packId": "dndmax.bestiary",
            "selector": "crossbowman"
          },
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": "Loyal. Suspects Morrow — 'He keeps sending my lads off the wall at night.'",
          "drawFrom": null,
          "id": "c-sergeant-bale",
          "kind": "creature",
          "name": "Sergeant Bale",
          "provenance": "ai-generated",
          "publicName": "a grizzled sergeant",
          "publicRef": "p11",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "E4"
          ],
          "stat": {
            "packId": "dndmax.bestiary",
            "selector": "knight-sworn"
          },
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": "Morrow's men. They try to work the winches at moonrise.",
          "drawFrom": null,
          "id": "c-morrow-s-turncoat-1",
          "kind": "creature",
          "name": "Morrow's turncoat 1",
          "provenance": "ai-generated",
          "publicName": "a guard at the winch",
          "publicRef": "p12",
          "readAloud": null,
          "reveal": "when-found",
          "shape": [
            "D6"
          ],
          "stat": {
            "packId": "dndmax.dogfood",
            "selector": "guard"
          },
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": "Morrow's men. They try to work the winches at moonrise.",
          "drawFrom": null,
          "id": "c-morrow-s-turncoat-2",
          "kind": "creature",
          "name": "Morrow's turncoat 2",
          "provenance": "ai-generated",
          "publicName": "a guard at the winch",
          "publicRef": "p13",
          "readAloud": null,
          "reveal": "when-found",
          "shape": [
            "J6"
          ],
          "stat": {
            "packId": "dndmax.dogfood",
            "selector": "guard"
          },
          "tags": []
        },
        {
          "behaviours": [
            {
              "id": "b-1",
              "on": "token-enters",
              "arrival": "walked-in",
              "autoFire": true,
              "does": {
                "kind": "tell-dm",
                "text": "This is the inner portcullis winch. At moonrise Morrow's men come here to open it."
              }
            }
          ],
          "dmCue": null,
          "dmNotes": "Turning it raises the inner portcullis.",
          "drawFrom": null,
          "id": "c-the-inner-winch",
          "kind": "hazard",
          "name": "The inner winch",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p14",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "D6"
          ],
          "stat": null,
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": "Attacks from the guard rooms above have advantage against anyone here.",
          "drawFrom": null,
          "hazard": {
            "damage": "1d6",
            "type": "piercing",
            "save": {
              "stat": "dex",
              "dc": 13
            },
            "rearms": true,
            "detectDc": 13
          },
          "id": "c-murder-holes",
          "kind": "hazard",
          "name": "Murder holes",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p15",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "F4:G5"
          ],
          "stat": null,
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": "Garrison wages: 150 gp, and a duty roster in Morrow's hand sending men off the walls every night at the same hour.",
          "drawFrom": null,
          "id": "c-gatehouse-strongbox",
          "kind": "loot",
          "name": "Gatehouse strongbox",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p16",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "J4"
          ],
          "stat": null,
          "tags": [
            "coins:150 gp",
            "item:Duty roster in Morrow's hand [quest]",
            "container"
          ]
        }
      ],
      "edges": [
        {
          "id": "e-field-f6s",
          "kind": "field",
          "state": "closed",
          "runs": [
            {
              "first": {
                "x": 5,
                "y": 5,
                "side": "S"
              },
              "last": {
                "x": 6,
                "y": 5,
                "side": "S"
              }
            }
          ],
          "provenance": "ai-generated"
        },
        {
          "id": "e-field-f2s",
          "kind": "field",
          "state": "closed",
          "runs": [
            {
              "first": {
                "x": 5,
                "y": 1,
                "side": "S"
              },
              "last": {
                "x": 6,
                "y": 1,
                "side": "S"
              }
            }
          ],
          "provenance": "ai-generated"
        }
      ],
      "mapId": "m-the-gatehouse",
      "regions": [
        {
          "dmCue": null,
          "dmNotes": "Murder holes: anyone in the passage can be attacked from the guard rooms above with advantage.",
          "id": "r-the-gate-passage",
          "name": "The gate passage",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p1",
          "readAloud": "A tunnel between two portcullises, murder holes in the ceiling, the outer gate shuddering under a ram.",
          "reveal": "on-entry",
          "shape": [
            "F2:G7"
          ],
          "tags": []
        },
        {
          "dmCue": null,
          "dmNotes": null,
          "id": "r-west-guard-room",
          "name": "West guard room",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p2",
          "readAloud": "Bunks and a table with a half-eaten meal.",
          "reveal": "on-entry",
          "shape": [
            "D3:E4"
          ],
          "tags": []
        },
        {
          "dmCue": null,
          "dmNotes": null,
          "id": "r-west-winch-room",
          "name": "West winch room",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p3",
          "readAloud": "A great winch and chain for the inner portcullis.",
          "reveal": "on-entry",
          "shape": [
            "D6:E6"
          ],
          "tags": []
        },
        {
          "dmCue": null,
          "dmNotes": null,
          "id": "r-east-guard-room",
          "name": "East guard room",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p4",
          "readAloud": "Bunks, a weapon rack, and a guard snoring through a siege.",
          "reveal": "on-entry",
          "shape": [
            "I3:J4"
          ],
          "tags": []
        },
        {
          "dmCue": null,
          "dmNotes": null,
          "id": "r-east-winch-room",
          "name": "East winch room",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p5",
          "readAloud": "A winch for the outer portcullis.",
          "reveal": "on-entry",
          "shape": [
            "I6:J6"
          ],
          "tags": []
        }
      ],
      "rows": 8,
      "dmNotes": "Two portcullises (F2:H2 and F6:H6), two winch rooms. At moonrise Castellan Morrow's men come here to raise the inner portcullis. Holding the winches holds the gate."
    },
    {
      "columns": 12,
      "contents": [
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-through-the-inner-gate",
          "kind": "entrance",
          "name": "Through the inner gate",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p5",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "F6"
          ],
          "stat": null,
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-out-through-the-inner-gate",
          "kind": "exit",
          "name": "Out through the inner gate",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p6",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "G7"
          ],
          "stat": null,
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-over-the-rubble-of-the-breach",
          "kind": "exit",
          "name": "Over the rubble of the breach",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p7",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "K6"
          ],
          "stat": null,
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-up-the-west-stair",
          "kind": "exit",
          "name": "Up the west stair",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p8",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "B2"
          ],
          "stat": null,
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-into-the-keep",
          "kind": "exit",
          "name": "Into the keep",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p9",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "F1"
          ],
          "stat": null,
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-through-the-smithy-to-the-kitchens",
          "kind": "exit",
          "name": "Through the smithy to the kitchens",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p10",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "J4"
          ],
          "stat": null,
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": "Exhausted, sharp, and running out of time. Pays 100 gp each now and land after. Trusts Morrow completely — it takes evidence to change that.",
          "drawFrom": null,
          "id": "c-lady-aveline-thorn",
          "kind": "note",
          "name": "Lady Aveline Thorn",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p11",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "F4"
          ],
          "stat": null,
          "tags": [
            "quest:Find the traitor in Thornkeep|Somebody inside the keep has been signalling the hobgoblins. Lady Aveline pays 100 gold each now, and land after."
          ]
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-bailey-defender",
          "kind": "creature",
          "name": "Bailey defender",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p12",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "D4"
          ],
          "stat": {
            "packId": "dndmax.dogfood",
            "selector": "guard"
          },
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": "A goblin who climbed the wall. Trying to poison the well.",
          "drawFrom": null,
          "id": "c-infiltrating-goblin",
          "kind": "creature",
          "name": "Infiltrating goblin",
          "provenance": "ai-generated",
          "publicName": "a small cloaked figure by the forge",
          "publicRef": "p13",
          "readAloud": null,
          "reveal": "when-found",
          "shape": [
            "I5"
          ],
          "stat": {
            "packId": "dndmax.bestiary",
            "selector": "goblin-sneak"
          },
          "tags": []
        },
        {
          "behaviours": [
            {
              "id": "b-2",
              "on": "token-enters",
              "arrival": "walked-in",
              "autoFire": true,
              "does": {
                "kind": "tell-dm",
                "text": "The goblin sneak is at the well. If not spotted (Perception DC 14), it poisons it next round."
              }
            }
          ],
          "dmCue": null,
          "dmNotes": "If the goblin is not stopped, the well is poisoned: anyone who drinks takes 2d6 poison.",
          "drawFrom": null,
          "id": "c-the-well",
          "kind": "hazard",
          "name": "The well",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p14",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "F4"
          ],
          "stat": null,
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": "Two +1 shields and a sheaf of fine arrows (+1, ten).",
          "drawFrom": "war-spoils",
          "id": "c-smith-s-spare-work",
          "kind": "loot",
          "name": "Smith's spare work",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p15",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "I3"
          ],
          "stat": null,
          "tags": [
            "item:Two +1 shields",
            "item:Fine arrows (+1, ten) [tool]"
          ]
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-wagon-barricade",
          "kind": "cover",
          "name": "Wagon barricade",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p16",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "D5:E5"
          ],
          "stat": null,
          "tags": [
            "heavy-cover"
          ]
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-the-forge",
          "kind": "light",
          "name": "The forge",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p17",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "I4"
          ],
          "stat": null,
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": "A trader (Issue 411): stand beside them and open your Bag to buy and sell.",
          "drawFrom": null,
          "id": "c-smith-agna",
          "kind": "creature",
          "name": "Smith Agna",
          "provenance": "ai-generated",
          "publicName": "the castle smith at her anvil",
          "publicRef": "p18",
          "readAloud": "The castle smith does not stop hammering. 'Siege prices. Coin first, then you can bleed on it.'",
          "reveal": "always",
          "shape": [
            "H7"
          ],
          "stat": {
            "packId": "dndmax.dogfood",
            "selector": "guard"
          },
          "tags": [
            "friendly",
            "trader",
            "currency:gold",
            "buys:60",
            "sells:Shield@10x4",
            "sells:Chain shirt@50x2",
            "sells:Chain mail@75x1",
            "sells:Longsword@15x3",
            "sells:Spear@2x4",
            "sells:Crossbow@25x2",
            "sells:Potion of healing@50x3"
          ]
        }
      ],
      "edges": [],
      "mapId": "m-the-bailey",
      "regions": [
        {
          "dmCue": null,
          "dmNotes": "Lady Aveline Thorn. She will hire the party on the spot.",
          "id": "r-the-yard",
          "name": "The yard",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p1",
          "readAloud": "Wounded soldiers on straw, a well with a queue at it, horses stamping in the stables, and a woman in dented armour shouting orders from a cart.",
          "reveal": "on-entry",
          "shape": [
            "C3:J6"
          ],
          "tags": []
        },
        {
          "dmCue": null,
          "dmNotes": null,
          "id": "r-the-stables",
          "name": "The stables",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p2",
          "readAloud": "Six horses, terrified by the bombardment.",
          "reveal": "on-entry",
          "shape": [
            "E2:H2"
          ],
          "tags": []
        },
        {
          "dmCue": null,
          "dmNotes": null,
          "id": "r-the-smithy-shed",
          "name": "The smithy shed",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p3",
          "readAloud": "A forge going full blast, the smith hammering arrowheads.",
          "reveal": "on-entry",
          "shape": [
            "I2:J5"
          ],
          "tags": []
        },
        {
          "dmCue": null,
          "dmNotes": null,
          "id": "r-the-west-stair",
          "name": "The west stair",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p4",
          "readAloud": "Stone steps up to the wall walk.",
          "reveal": "on-entry",
          "shape": [
            "B2:B5"
          ],
          "tags": []
        }
      ],
      "rows": 8,
      "dmNotes": "The heart of the defence. Lady Aveline is here, directing. From here: the wall walk (west stair), the keep hall (north), the lord's hall (via the keep), and the kitchens (east sheds)."
    },
    {
      "columns": 12,
      "contents": [
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-top-of-the-west-stair",
          "kind": "entrance",
          "name": "Top of the west stair",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p5",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "B4"
          ],
          "stat": null,
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-down-the-west-stair",
          "kind": "exit",
          "name": "Down the west stair",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p6",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "A4"
          ],
          "stat": null,
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-ladder-up-to-the-watch-platform",
          "kind": "exit",
          "name": "Ladder up to the watch platform",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p7",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "J3"
          ],
          "stat": null,
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-ladder-hobgoblin-1",
          "kind": "creature",
          "name": "Ladder hobgoblin 1",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p8",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "E5"
          ],
          "stat": {
            "packId": "dndmax.bestiary",
            "selector": "hobgoblin"
          },
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-ladder-hobgoblin-2",
          "kind": "creature",
          "name": "Ladder hobgoblin 2",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p9",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "G5"
          ],
          "stat": {
            "packId": "dndmax.bestiary",
            "selector": "hobgoblin"
          },
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-ladder-hobgoblin-3",
          "kind": "creature",
          "name": "Ladder hobgoblin 3",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p10",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "H5"
          ],
          "stat": {
            "packId": "dndmax.bestiary",
            "selector": "hobgoblin"
          },
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": "Carries a coded order: 'At moonrise, the gate. Our friend in the tower will see to it.'",
          "drawFrom": null,
          "id": "c-hobgoblin-captain",
          "kind": "creature",
          "name": "Hobgoblin captain",
          "provenance": "ai-generated",
          "publicName": "a hobgoblin in a plumed helm",
          "publicRef": "p11",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "F5"
          ],
          "stat": {
            "packId": "dndmax.bestiary",
            "selector": "knight-sworn"
          },
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-wall-archer-1",
          "kind": "creature",
          "name": "Wall archer 1",
          "provenance": "ai-generated",
          "publicName": "a defender",
          "publicRef": "p12",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "C3"
          ],
          "stat": {
            "packId": "dndmax.bestiary",
            "selector": "crossbowman"
          },
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-wall-archer-2",
          "kind": "creature",
          "name": "Wall archer 2",
          "provenance": "ai-generated",
          "publicName": "a defender",
          "publicRef": "p13",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "I3"
          ],
          "stat": {
            "packId": "dndmax.bestiary",
            "selector": "crossbowman"
          },
          "tags": []
        },
        {
          "behaviours": [
            {
              "id": "b-3",
              "on": "token-enters",
              "arrival": "walked-in",
              "autoFire": true,
              "does": {
                "kind": "say",
                "text": "A cauldron of oil bubbles on the hoarding. It would take one push."
              }
            }
          ],
          "dmCue": null,
          "dmNotes": "A cauldron of oil on the hoarding: tip it for 3d6 fire on everyone at the foot of the wall below.",
          "drawFrom": null,
          "hazard": {
            "damage": "3d6",
            "type": "fire",
            "save": {
              "stat": "dex",
              "dc": 14,
              "half": true
            },
            "condition": {
              "condition": "burning",
              "duration": {
                "kind": "save-ends"
              }
            },
            "detectDc": 11
          },
          "id": "c-boiling-oil",
          "kind": "hazard",
          "name": "Boiling oil",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p14",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "F6:H6"
          ],
          "stat": null,
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-crenellations",
          "kind": "cover",
          "name": "Crenellations",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p15",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "B3",
            "E3",
            "H3",
            "K3"
          ],
          "stat": null,
          "tags": [
            "heavy-cover"
          ]
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": "Coded order (see captain), 30 gp, a horn that the legion obeys.",
          "drawFrom": "war-spoils",
          "id": "c-captain-s-satchel",
          "kind": "loot",
          "name": "Captain's satchel",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p16",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "F5"
          ],
          "stat": null,
          "tags": [
            "item:Coded order [quest]",
            "coins:30 gp",
            "item:Horn the legion obeys [treasure, rare]"
          ]
        }
      ],
      "edges": [],
      "mapId": "m-the-wall-walk",
      "regions": [
        {
          "dmCue": null,
          "dmNotes": "Pushing a ladder off takes an action and a DC 12 Athletics.",
          "id": "r-the-parapet",
          "name": "The parapet",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p1",
          "readAloud": "A walkway between crenellations. Arrows hiss past. Ladders thump against the wall and the stones shake under trebuchet hits.",
          "reveal": "on-entry",
          "shape": [
            "B4:K5"
          ],
          "tags": []
        },
        {
          "dmCue": null,
          "dmNotes": null,
          "id": "r-west-tower",
          "name": "West tower",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p2",
          "readAloud": "A squat tower with an arrow slit.",
          "reveal": "on-entry",
          "shape": [
            "C3:D4"
          ],
          "tags": []
        },
        {
          "dmCue": null,
          "dmNotes": null,
          "id": "r-east-tower",
          "name": "East tower",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p3",
          "readAloud": "A squat tower, and a ladder up to the watch platform.",
          "reveal": "on-entry",
          "shape": [
            "I3:J4"
          ],
          "tags": []
        },
        {
          "dmCue": null,
          "dmNotes": null,
          "id": "r-the-hoarding",
          "name": "The hoarding",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p4",
          "readAloud": "A wooden gallery hanging out over the wall, with holes for dropping things.",
          "reveal": "on-entry",
          "shape": [
            "F6:H6"
          ],
          "tags": []
        }
      ],
      "rows": 8,
      "dmNotes": "The south wall, where ladders keep going up. Two towers (C3:D5 and I3:J5). Every other round, a new ladder appears and a hobgoblin climbs it."
    },
    {
      "columns": 12,
      "contents": [
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-top-of-the-tower-ladder",
          "kind": "entrance",
          "name": "Top of the tower ladder",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p3",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "I4"
          ],
          "stat": null,
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-down-the-ladder-to-the-wall-walk",
          "kind": "exit",
          "name": "Down the ladder to the wall walk",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p4",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "J4"
          ],
          "stat": null,
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-down-the-hatch",
          "kind": "exit",
          "name": "Down the hatch",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p5",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "E3"
          ],
          "stat": null,
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": "Grisk's scout: a goblin on a young drake. It swoops when the beacon is lit.",
          "drawFrom": null,
          "id": "c-wyvern-riding-goblin",
          "kind": "creature",
          "name": "Wyvern-riding goblin",
          "provenance": "ai-generated",
          "publicName": "wings against the clouds",
          "publicRef": "p6",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "K2"
          ],
          "stat": {
            "packId": "dndmax.bestiary",
            "selector": "young-drake"
          },
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": "Morrow's signal lantern. His initials are scratched in the base.",
          "drawFrom": null,
          "id": "c-red-glass-lantern",
          "kind": "prop",
          "name": "Red-glass lantern",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p7",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "H4"
          ],
          "stat": null,
          "tags": []
        },
        {
          "behaviours": [
            {
              "id": "b-4",
              "on": "token-enters",
              "arrival": "walked-in",
              "autoFire": true,
              "does": {
                "kind": "say",
                "text": "The beacon roars into flame. Far off, a horn answers. Closer, something with wings screams."
              }
            }
          ],
          "dmCue": null,
          "dmNotes": "Lighting it summons the relief column — and the drake.",
          "drawFrom": null,
          "id": "c-the-beacon",
          "kind": "hazard",
          "name": "The beacon",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p8",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "H3"
          ],
          "stat": null,
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": "Stone shot. Rolled off the edge: 2d10 to anything directly below.",
          "drawFrom": null,
          "id": "c-cannonball-pile",
          "kind": "loot",
          "name": "Cannonball pile",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p9",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "E6"
          ],
          "stat": null,
          "tags": [
            "item:Stone shot (2d10 in a 1-square burst, reach 2)",
            "container"
          ]
        }
      ],
      "edges": [],
      "mapId": "m-the-watch-platform",
      "regions": [
        {
          "dmCue": null,
          "dmNotes": "The red lantern is the signal. A DC 12 Insight notices fresh oil in it.",
          "id": "r-the-platform",
          "name": "The platform",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p1",
          "readAloud": "A flat stone roof, wind howling, the whole valley spread out below. The beacon brazier is cold. Beside it, a lantern with a pane of red glass.",
          "reveal": "on-entry",
          "shape": [
            "D3:I7"
          ],
          "tags": []
        },
        {
          "dmCue": null,
          "dmNotes": null,
          "id": "r-the-hatch",
          "name": "The hatch",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p2",
          "readAloud": "A trapdoor and a ladder down.",
          "reveal": "on-entry",
          "shape": [
            "E3"
          ],
          "tags": []
        }
      ],
      "rows": 8,
      "dmNotes": "The highest point on the wall, with a beacon brazier (H3). Morrow uses it to signal the camp with a red lantern. A hatch (E3) leads down into the tower room — his private quarters."
    },
    {
      "columns": 12,
      "contents": [
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-bottom-of-the-hatch-ladder",
          "kind": "entrance",
          "name": "Bottom of the hatch ladder",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p2",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "E3"
          ],
          "stat": null,
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-up-the-hatch",
          "kind": "exit",
          "name": "Up the hatch",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p3",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "D3"
          ],
          "stat": null,
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-down-the-spiral-stair",
          "kind": "exit",
          "name": "Down the spiral stair",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p4",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "D4"
          ],
          "stat": null,
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": "Knows everything. Talks if threatened with the noose.",
          "drawFrom": null,
          "id": "c-morrow-s-manservant",
          "kind": "creature",
          "name": "Morrow's manservant",
          "provenance": "ai-generated",
          "publicName": "a nervous servant",
          "publicRef": "p5",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "F5"
          ],
          "stat": {
            "packId": "dndmax.bestiary",
            "selector": "outlaw"
          },
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": "The cipher key to the coded orders, and a castle map marked with the postern and the gate.",
          "drawFrom": null,
          "id": "c-castellan-s-desk",
          "kind": "loot",
          "name": "Castellan's desk",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p6",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "F5"
          ],
          "stat": null,
          "tags": [
            "item:The cipher key to the coded orders [quest]",
            "item:Castle map marked with the postern [quest]",
            "container"
          ]
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": "500 gp in legion coin — Morrow's payment.",
          "drawFrom": null,
          "id": "c-safe-behind-the-tapestry",
          "kind": "loot",
          "name": "Safe behind the tapestry",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p7",
          "readAloud": null,
          "reveal": "when-found",
          "shape": [
            "H2"
          ],
          "stat": null,
          "tags": [
            "item:500 gp in legion coin",
            "container"
          ]
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": "Half-burned letters inside. A DC 13 Investigation pieces one together: 'moonrise'.",
          "drawFrom": null,
          "id": "c-the-stove",
          "kind": "prop",
          "name": "The stove",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p8",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "J5"
          ],
          "stat": null,
          "tags": []
        }
      ],
      "edges": [],
      "mapId": "m-castellan-s-tower-room",
      "regions": [
        {
          "dmCue": null,
          "dmNotes": "Hidden behind the tapestry (H2:I2): a safe with Grisk's gold.",
          "id": "r-the-tower-room",
          "name": "The tower room",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p1",
          "readAloud": "A sparse soldier's room: a cot, a desk, a stove, a tapestry of the Thorn family. The spiral stair in the corner goes down.",
          "reveal": "on-entry",
          "shape": [
            "D2:I7"
          ],
          "tags": []
        }
      ],
      "rows": 8,
      "dmNotes": "Morrow's quarters. Evidence of treason is everywhere if anyone looks: the coded cipher on the desk, a map of the castle marked with the postern and the gate, and an empty ring-box (his signet is in Grisk's tent)."
    },
    {
      "columns": 12,
      "contents": [
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-from-the-bailey",
          "kind": "entrance",
          "name": "From the bailey",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p4",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "G7"
          ],
          "stat": null,
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-back-out-to-the-bailey",
          "kind": "exit",
          "name": "Back out to the bailey",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p5",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "G8"
          ],
          "stat": null,
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-up-to-the-lord-s-hall",
          "kind": "exit",
          "name": "Up to the lord's hall",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p6",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "F1"
          ],
          "stat": null,
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": "Morrow's men. They fight only if exposed, or at moonrise.",
          "drawFrom": null,
          "id": "c-turncoat-soldier-1",
          "kind": "creature",
          "name": "Turncoat soldier 1",
          "provenance": "ai-generated",
          "publicName": "a soldier",
          "publicRef": "p7",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "D3"
          ],
          "stat": {
            "packId": "dndmax.dogfood",
            "selector": "guard"
          },
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": "Morrow's men. They fight only if exposed, or at moonrise.",
          "drawFrom": null,
          "id": "c-turncoat-soldier-2",
          "kind": "creature",
          "name": "Turncoat soldier 2",
          "provenance": "ai-generated",
          "publicName": "a soldier",
          "publicRef": "p8",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "D4"
          ],
          "stat": {
            "packId": "dndmax.dogfood",
            "selector": "guard"
          },
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": "Morrow's men. They fight only if exposed, or at moonrise.",
          "drawFrom": null,
          "id": "c-turncoat-soldier-3",
          "kind": "creature",
          "name": "Turncoat soldier 3",
          "provenance": "ai-generated",
          "publicName": "a soldier",
          "publicRef": "p9",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "I3"
          ],
          "stat": {
            "packId": "dndmax.dogfood",
            "selector": "guard"
          },
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": "Morrow's men. They fight only if exposed, or at moonrise.",
          "drawFrom": null,
          "id": "c-turncoat-soldier-4",
          "kind": "creature",
          "name": "Turncoat soldier 4",
          "provenance": "ai-generated",
          "publicName": "a soldier",
          "publicRef": "p10",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "I4"
          ],
          "stat": {
            "packId": "dndmax.dogfood",
            "selector": "guard"
          },
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-turncoat-crossbowman-1",
          "kind": "creature",
          "name": "Turncoat crossbowman 1",
          "provenance": "ai-generated",
          "publicName": "a soldier",
          "publicRef": "p11",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "E5"
          ],
          "stat": {
            "packId": "dndmax.bestiary",
            "selector": "crossbowman"
          },
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-turncoat-crossbowman-2",
          "kind": "creature",
          "name": "Turncoat crossbowman 2",
          "provenance": "ai-generated",
          "publicName": "a soldier",
          "publicRef": "p12",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "H5"
          ],
          "stat": {
            "packId": "dndmax.bestiary",
            "selector": "crossbowman"
          },
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": "Potions of healing (3), a healer's kit, and rope — far more than any garrison needs, enough to tie up Lady Aveline's guards.",
          "drawFrom": null,
          "id": "c-quartermaster-s-store",
          "kind": "loot",
          "name": "Quartermaster's store",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p13",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "D7"
          ],
          "stat": null,
          "tags": [
            "item:Potions of healing (3)",
            "item:Healer's kit (heals 1d6+2, three uses)",
            "item:Rope",
            "container"
          ]
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": "60 gp and dice.",
          "drawFrom": "war-spoils",
          "id": "c-sergeants-lockbox",
          "kind": "loot",
          "name": "Sergeants' lockbox",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p14",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "I7"
          ],
          "stat": null,
          "tags": [
            "coins:60 gp",
            "item:Loaded dice [treasure, worth: 5 gp]"
          ]
        }
      ],
      "edges": [
        {
          "id": "e-door-e6e",
          "kind": "door",
          "state": "closed",
          "runs": [
            {
              "first": {
                "x": 4,
                "y": 5,
                "side": "E"
              },
              "last": {
                "x": 4,
                "y": 5,
                "side": "E"
              }
            }
          ],
          "provenance": "ai-generated"
        },
        {
          "id": "e-door-g6e",
          "kind": "door",
          "state": "closed",
          "runs": [
            {
              "first": {
                "x": 6,
                "y": 5,
                "side": "E"
              },
              "last": {
                "x": 6,
                "y": 5,
                "side": "E"
              }
            }
          ],
          "provenance": "ai-generated"
        }
      ],
      "mapId": "m-the-keep-barracks",
      "regions": [
        {
          "dmCue": null,
          "dmNotes": "Six of them are Morrow's. Insight DC 14 notices they are the only ones awake.",
          "id": "r-the-barracks-hall",
          "name": "The barracks hall",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p1",
          "readAloud": "Bunks along both walls, a long table, armour drying on pegs. A dozen exhausted men.",
          "reveal": "on-entry",
          "shape": [
            "D2:I5"
          ],
          "tags": []
        },
        {
          "dmCue": null,
          "dmNotes": null,
          "id": "r-the-quartermaster-s-store",
          "name": "The quartermaster's store",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p2",
          "readAloud": "Supplies, and an awful lot of rope.",
          "reveal": "on-entry",
          "shape": [
            "D6:E7"
          ],
          "tags": []
        },
        {
          "dmCue": null,
          "dmNotes": null,
          "id": "r-the-sergeants-room",
          "name": "The sergeants' room",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p3",
          "readAloud": "Two bunks, a lockbox, a dice game in progress.",
          "reveal": "on-entry",
          "shape": [
            "H6:I7"
          ],
          "tags": []
        }
      ],
      "rows": 8,
      "dmNotes": "Where the off-duty garrison sleeps — and where Morrow's turncoats gather before moonrise."
    },
    {
      "columns": 12,
      "contents": [
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-the-great-doors",
          "kind": "entrance",
          "name": "The great doors",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p3",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "F7"
          ],
          "stat": null,
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-down-to-the-barracks",
          "kind": "exit",
          "name": "Down to the barracks",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p4",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "G8"
          ],
          "stat": null,
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-the-spiral-stair",
          "kind": "exit",
          "name": "The spiral stair",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p5",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "J2"
          ],
          "stat": null,
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": "Sworn knight with 80 HP. If beaten, he begs for Lady Aveline's mercy.",
          "drawFrom": null,
          "id": "c-castellan-morrow",
          "kind": "creature",
          "name": "Castellan Morrow",
          "provenance": "ai-generated",
          "publicName": "the castellan",
          "publicRef": "p6",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "F5"
          ],
          "stat": {
            "packId": "dndmax.bestiary",
            "selector": "knight-sworn"
          },
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": "Arrives only if moonrise comes and the gate opened. Fire stops its healing.",
          "drawFrom": null,
          "id": "c-grisk-s-troll",
          "kind": "creature",
          "name": "Grisk's troll",
          "provenance": "ai-generated",
          "publicName": "the doors burst open",
          "publicRef": "p7",
          "readAloud": null,
          "reveal": "when-found",
          "shape": [
            "G4"
          ],
          "stat": {
            "packId": "dndmax.bestiary",
            "selector": "troll"
          },
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-morrow-s-sworn-man-1",
          "kind": "creature",
          "name": "Morrow's sworn man 1",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p8",
          "readAloud": null,
          "reveal": "when-found",
          "shape": [
            "D4"
          ],
          "stat": {
            "packId": "dndmax.bestiary",
            "selector": "knight-sworn"
          },
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-morrow-s-sworn-man-2",
          "kind": "creature",
          "name": "Morrow's sworn man 2",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p9",
          "readAloud": null,
          "reveal": "when-found",
          "shape": [
            "I4"
          ],
          "stat": {
            "packId": "dndmax.bestiary",
            "selector": "knight-sworn"
          },
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": "Fire. A troll knocked into it stops regenerating for a round, and takes 2d6.",
          "drawFrom": null,
          "hazard": {
            "damage": "2d6",
            "type": "fire",
            "save": {
              "stat": "dex",
              "dc": 12,
              "half": true
            },
            "condition": {
              "condition": "burning",
              "duration": {
                "kind": "save-ends"
              }
            },
            "rearms": true
          },
          "id": "c-fire-pit",
          "kind": "hazard",
          "name": "Fire pit",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p10",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "F4:G4"
          ],
          "stat": null,
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": "Under the high seat: 1,000 gp, the Thorn family sword (+2 longsword, 'Briar'), and the deed of the Thorn lands — Lady Aveline's to grant.",
          "drawFrom": null,
          "id": "c-the-thorn-treasury",
          "kind": "loot",
          "name": "The Thorn treasury",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p11",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "F2"
          ],
          "stat": null,
          "tags": [
            "coins:1,000 gp",
            "item:Briar, the Thorn family sword (+2 longsword)",
            "item:Deed of the Thorn lands [quest]",
            "container"
          ]
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-hall-fire",
          "kind": "light",
          "name": "Hall fire",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p12",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "F4"
          ],
          "stat": null,
          "tags": []
        }
      ],
      "edges": [],
      "mapId": "m-the-lord-s-hall",
      "regions": [
        {
          "dmCue": null,
          "dmNotes": "Castellan Morrow. Denies everything until shown evidence; then fights, calling his turncoats.",
          "id": "r-the-great-hall",
          "name": "The great hall",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p1",
          "readAloud": "Banners of the Thorn family, a long table, a fire pit, and a high seat on a dais. Castellan Morrow stands by the fire in polished armour, perfectly calm.",
          "reveal": "on-entry",
          "shape": [
            "C3:J7"
          ],
          "tags": []
        },
        {
          "dmCue": null,
          "dmNotes": null,
          "id": "r-the-dais",
          "name": "The dais",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p2",
          "readAloud": "The high seat of Thornkeep.",
          "reveal": "on-entry",
          "shape": [
            "E2:H2"
          ],
          "tags": []
        }
      ],
      "rows": 8,
      "dmNotes": "THE FINALE, if the party unmasks Morrow before moonrise: confrontation in the great hall, with Lady Aveline present. If they don't, the gate opens and the troll arrives here instead."
    },
    {
      "columns": 12,
      "contents": [
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-the-postern",
          "kind": "entrance",
          "name": "The postern",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p4",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "G7"
          ],
          "stat": null,
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-out-the-postern-to-the-goat-track",
          "kind": "exit",
          "name": "Out the postern to the goat track",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p5",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "F8"
          ],
          "stat": null,
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-through-to-the-bailey",
          "kind": "exit",
          "name": "Through to the bailey",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p6",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "F1"
          ],
          "stat": null,
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-larder-goblin-1",
          "kind": "creature",
          "name": "Larder goblin 1",
          "provenance": "ai-generated",
          "publicName": "a moving ham",
          "publicRef": "p7",
          "readAloud": null,
          "reveal": "when-found",
          "shape": [
            "I5"
          ],
          "stat": {
            "packId": "dndmax.bestiary",
            "selector": "goblin-sneak"
          },
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-larder-goblin-2",
          "kind": "creature",
          "name": "Larder goblin 2",
          "provenance": "ai-generated",
          "publicName": "a moving ham",
          "publicRef": "p8",
          "readAloud": null,
          "reveal": "when-found",
          "shape": [
            "I6"
          ],
          "stat": {
            "packId": "dndmax.bestiary",
            "selector": "goblin-sneak"
          },
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": null,
          "drawFrom": null,
          "id": "c-larder-goblin-3",
          "kind": "creature",
          "name": "Larder goblin 3",
          "provenance": "ai-generated",
          "publicName": "a moving ham",
          "publicRef": "p9",
          "readAloud": null,
          "reveal": "when-found",
          "shape": [
            "J6"
          ],
          "stat": {
            "packId": "dndmax.bestiary",
            "selector": "goblin-sneak"
          },
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": "Carries poison for the garrison's soup.",
          "drawFrom": null,
          "id": "c-goblin-poisoner",
          "kind": "creature",
          "name": "Goblin poisoner",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p10",
          "readAloud": null,
          "reveal": "when-found",
          "shape": [
            "J5"
          ],
          "stat": {
            "packId": "dndmax.bestiary",
            "selector": "goblin-shaman"
          },
          "tags": []
        },
        {
          "behaviours": [
            {
              "id": "b-5",
              "on": "token-enters",
              "arrival": "walked-in",
              "autoFire": true,
              "does": {
                "kind": "say",
                "text": "A ham swings. Behind it, a goblin grins."
              }
            },
            {
              "id": "b-6",
              "on": "token-enters",
              "arrival": "walked-in",
              "autoFire": true,
              "does": {
                "kind": "reveal",
                "contentId": "c-larder-goblin-1"
              }
            },
            {
              "id": "b-7",
              "on": "token-enters",
              "arrival": "walked-in",
              "autoFire": true,
              "does": {
                "kind": "reveal",
                "contentId": "c-larder-goblin-2"
              }
            },
            {
              "id": "b-8",
              "on": "token-enters",
              "arrival": "walked-in",
              "autoFire": true,
              "does": {
                "kind": "reveal",
                "contentId": "c-larder-goblin-3"
              }
            },
            {
              "id": "b-9",
              "on": "token-enters",
              "arrival": "walked-in",
              "autoFire": true,
              "does": {
                "kind": "reveal",
                "contentId": "c-goblin-poisoner"
              }
            }
          ],
          "dmCue": null,
          "dmNotes": "Opening it reveals the goblins.",
          "drawFrom": null,
          "id": "c-the-larder-door",
          "kind": "hazard",
          "name": "The larder door",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p11",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "H5"
          ],
          "stat": null,
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": "Hot. Shoved in: 2d6 fire.",
          "drawFrom": null,
          "hazard": {
            "damage": "2d6",
            "type": "fire",
            "save": {
              "stat": "dex",
              "dc": 12
            },
            "rearms": true
          },
          "id": "c-the-ovens",
          "kind": "hazard",
          "name": "The ovens",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p12",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "E3"
          ],
          "stat": null,
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": "Hiding. Knows Morrow ordered the postern unbarred 'for deliveries' every night this week.",
          "drawFrom": null,
          "id": "c-cook-bramble",
          "kind": "note",
          "name": "Cook Bramble",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p13",
          "readAloud": null,
          "reveal": "always",
          "shape": [
            "D5"
          ],
          "stat": null,
          "tags": []
        },
        {
          "behaviours": [],
          "dmCue": null,
          "dmNotes": "Three vials of poison and a crude map showing the postern and the well.",
          "drawFrom": null,
          "id": "c-goblin-poison-satchel",
          "kind": "loot",
          "name": "Goblin poison satchel",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p14",
          "readAloud": null,
          "reveal": "when-found",
          "shape": [
            "J5"
          ],
          "stat": null,
          "tags": [
            "item:Three vials of poison",
            "item:Crude map of the postern and the well [quest]",
            "container"
          ]
        }
      ],
      "edges": [
        {
          "id": "e-door-f6s",
          "kind": "door",
          "state": "closed",
          "runs": [
            {
              "first": {
                "x": 5,
                "y": 5,
                "side": "S"
              },
              "last": {
                "x": 6,
                "y": 5,
                "side": "S"
              }
            }
          ],
          "provenance": "ai-generated"
        }
      ],
      "mapId": "m-postern-and-kitchens",
      "regions": [
        {
          "dmCue": null,
          "dmNotes": "Cook Bramble. Saw 'little green men' go into the larder an hour ago.",
          "id": "r-the-kitchen",
          "name": "The kitchen",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p1",
          "readAloud": "Ovens, a long table, sacks of flour, and the cook — a terrified halfling hiding in a cupboard.",
          "reveal": "on-entry",
          "shape": [
            "D3:G6"
          ],
          "tags": []
        },
        {
          "dmCue": null,
          "dmNotes": null,
          "id": "r-the-larder",
          "name": "The larder",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p2",
          "readAloud": "Hams hanging from hooks. One of them is moving.",
          "reveal": "on-entry",
          "shape": [
            "I5:J6"
          ],
          "tags": []
        },
        {
          "dmCue": null,
          "dmNotes": null,
          "id": "r-the-postern-passage",
          "name": "The postern passage",
          "provenance": "ai-generated",
          "publicName": null,
          "publicRef": "p3",
          "readAloud": "A narrow passage to a low, iron-bound door.",
          "reveal": "on-entry",
          "shape": [
            "F1:G2"
          ],
          "tags": []
        }
      ],
      "rows": 8,
      "dmNotes": "The castle's back door. The postern opens onto the goat track. A goblin infiltration team is already inside, hiding in the larder."
    }
  ],
  "edges": [],
  "entry": {
    "placementId": "m-the-thornkeep-pass"
  },
  "kind": "adventure",
  "lattices": [],
  "links": [
    {
      "id": "l-1",
      "fromMapId": "m-the-thornkeep-pass",
      "toMapId": "m-the-breach",
      "fromContentId": "c-down-to-the-breach",
      "fromPort": null,
      "toPort": null
    },
    {
      "id": "l-2",
      "fromMapId": "m-the-thornkeep-pass",
      "toMapId": "m-postern-and-kitchens",
      "fromContentId": "c-goat-track-to-the-postern",
      "fromPort": null,
      "toPort": null
    },
    {
      "id": "l-3",
      "fromMapId": "m-the-breach",
      "toMapId": "m-the-thornkeep-pass",
      "fromContentId": "c-back-up-to-the-pass",
      "fromPort": null,
      "toPort": null
    },
    {
      "id": "l-4",
      "fromMapId": "m-the-breach",
      "toMapId": "m-the-bailey",
      "fromContentId": "c-climb-the-rubble-into-the-bailey",
      "fromPort": null,
      "toPort": null
    },
    {
      "id": "l-5",
      "fromMapId": "m-the-breach",
      "toMapId": "m-the-gatehouse",
      "fromContentId": "c-the-gatehouse-door",
      "fromPort": null,
      "toPort": null
    },
    {
      "id": "l-6",
      "fromMapId": "m-the-gatehouse",
      "toMapId": "m-the-breach",
      "fromContentId": "c-out-across-the-drawbridge",
      "fromPort": null,
      "toPort": null
    },
    {
      "id": "l-7",
      "fromMapId": "m-the-gatehouse",
      "toMapId": "m-the-bailey",
      "fromContentId": "c-through-the-inner-gate-to-the-bailey",
      "fromPort": null,
      "toPort": null
    },
    {
      "id": "l-8",
      "fromMapId": "m-the-bailey",
      "toMapId": "m-the-gatehouse",
      "fromContentId": "c-out-through-the-inner-gate",
      "fromPort": null,
      "toPort": null
    },
    {
      "id": "l-9",
      "fromMapId": "m-the-bailey",
      "toMapId": "m-the-breach",
      "fromContentId": "c-over-the-rubble-of-the-breach",
      "fromPort": null,
      "toPort": null
    },
    {
      "id": "l-10",
      "fromMapId": "m-the-bailey",
      "toMapId": "m-the-wall-walk",
      "fromContentId": "c-up-the-west-stair",
      "fromPort": null,
      "toPort": null
    },
    {
      "id": "l-11",
      "fromMapId": "m-the-bailey",
      "toMapId": "m-the-keep-barracks",
      "fromContentId": "c-into-the-keep",
      "fromPort": null,
      "toPort": null
    },
    {
      "id": "l-12",
      "fromMapId": "m-the-bailey",
      "toMapId": "m-postern-and-kitchens",
      "fromContentId": "c-through-the-smithy-to-the-kitchens",
      "fromPort": null,
      "toPort": null
    },
    {
      "id": "l-13",
      "fromMapId": "m-the-wall-walk",
      "toMapId": "m-the-bailey",
      "fromContentId": "c-down-the-west-stair",
      "fromPort": null,
      "toPort": null
    },
    {
      "id": "l-14",
      "fromMapId": "m-the-wall-walk",
      "toMapId": "m-the-watch-platform",
      "fromContentId": "c-ladder-up-to-the-watch-platform",
      "fromPort": null,
      "toPort": null
    },
    {
      "id": "l-15",
      "fromMapId": "m-the-watch-platform",
      "toMapId": "m-the-wall-walk",
      "fromContentId": "c-down-the-ladder-to-the-wall-walk",
      "fromPort": null,
      "toPort": null
    },
    {
      "id": "l-16",
      "fromMapId": "m-the-watch-platform",
      "toMapId": "m-castellan-s-tower-room",
      "fromContentId": "c-down-the-hatch",
      "fromPort": null,
      "toPort": null
    },
    {
      "id": "l-17",
      "fromMapId": "m-castellan-s-tower-room",
      "toMapId": "m-the-watch-platform",
      "fromContentId": "c-up-the-hatch",
      "fromPort": null,
      "toPort": null
    },
    {
      "id": "l-18",
      "fromMapId": "m-castellan-s-tower-room",
      "toMapId": "m-the-lord-s-hall",
      "fromContentId": "c-down-the-spiral-stair",
      "fromPort": null,
      "toPort": null
    },
    {
      "id": "l-19",
      "fromMapId": "m-the-keep-barracks",
      "toMapId": "m-the-bailey",
      "fromContentId": "c-back-out-to-the-bailey",
      "fromPort": null,
      "toPort": null
    },
    {
      "id": "l-20",
      "fromMapId": "m-the-keep-barracks",
      "toMapId": "m-the-lord-s-hall",
      "fromContentId": "c-up-to-the-lord-s-hall",
      "fromPort": null,
      "toPort": null
    },
    {
      "id": "l-21",
      "fromMapId": "m-the-lord-s-hall",
      "toMapId": "m-the-keep-barracks",
      "fromContentId": "c-down-to-the-barracks",
      "fromPort": null,
      "toPort": null
    },
    {
      "id": "l-22",
      "fromMapId": "m-the-lord-s-hall",
      "toMapId": "m-castellan-s-tower-room",
      "fromContentId": "c-the-spiral-stair",
      "fromPort": null,
      "toPort": null
    },
    {
      "id": "l-23",
      "fromMapId": "m-postern-and-kitchens",
      "toMapId": "m-the-thornkeep-pass",
      "fromContentId": "c-out-the-postern-to-the-goat-track",
      "fromPort": null,
      "toPort": null
    },
    {
      "id": "l-24",
      "fromMapId": "m-postern-and-kitchens",
      "toMapId": "m-the-bailey",
      "fromContentId": "c-through-to-the-bailey",
      "fromPort": null,
      "toPort": null
    }
  ],
  "manifest": {
    "authors": [
      "DnD Max Scenario Gallery"
    ],
    "engineMin": "0.1.0",
    "formatVersion": 1,
    "id": "gallery-siege-of-thornkeep",
    "license": {
      "attribution": "DnD Max",
      "spdx": "CC0-1.0"
    },
    "name": "The Siege of Thornkeep",
    "requiresPack": [
      "dndmax.bestiary"
    ],
    "version": "1.0.0"
  },
  "maps": [
    {
      "backdrop": {
        "columns": 12,
        "gridVerified": true,
        "imageUrl": "/maps/library/region-mountain-pass.webp",
        "kind": "registered",
        "licence": {
          "attribution": null,
          "spdx": "CC0-1.0"
        },
        "nativeCellPx": 128,
        "rows": 8
      },
      "columns": 12,
      "id": "m-the-thornkeep-pass",
      "lattice": null,
      "name": "The Thornkeep pass",
      "ports": [],
      "provenance": "ai-generated",
      "rows": 8,
      "scale": {
        "tier": "region",
        "cell": {
          "unit": "days-travel",
          "magnitude": 1
        }
      },
      "source": {
        "kind": "library",
        "libraryMapId": "lib-region-mountain-pass",
        "version": "1"
      },
      "stack": null
    },
    {
      "backdrop": {
        "columns": 24,
        "gridVerified": true,
        "imageUrl": "/maps/library/breached-wall.webp",
        "kind": "registered",
        "licence": {
          "attribution": null,
          "spdx": "CC0-1.0"
        },
        "nativeCellPx": 64,
        "rows": 16
      },
      "columns": 24,
      "id": "m-the-breach",
      "lattice": null,
      "name": "The breach",
      "ports": [],
      "provenance": "ai-generated",
      "rows": 16,
      "scale": {
        "tier": "room",
        "cell": {
          "unit": "feet",
          "magnitude": 5
        }
      },
      "source": {
        "kind": "library",
        "libraryMapId": "lib-breached-wall",
        "version": "1"
      },
      "stack": null
    },
    {
      "backdrop": {
        "columns": 12,
        "gridVerified": true,
        "imageUrl": "/maps/library/castle-gatehouse.webp",
        "kind": "registered",
        "licence": {
          "attribution": null,
          "spdx": "CC0-1.0"
        },
        "nativeCellPx": 128,
        "rows": 8
      },
      "columns": 12,
      "id": "m-the-gatehouse",
      "lattice": null,
      "name": "The gatehouse",
      "ports": [],
      "provenance": "ai-generated",
      "rows": 8,
      "scale": {
        "tier": "room",
        "cell": {
          "unit": "feet",
          "magnitude": 5
        }
      },
      "source": {
        "kind": "library",
        "libraryMapId": "lib-castle-gatehouse",
        "version": "1"
      },
      "stack": null
    },
    {
      "backdrop": {
        "columns": 12,
        "gridVerified": true,
        "imageUrl": "/maps/library/castle-bailey.webp",
        "kind": "registered",
        "licence": {
          "attribution": null,
          "spdx": "CC0-1.0"
        },
        "nativeCellPx": 128,
        "rows": 8
      },
      "columns": 12,
      "id": "m-the-bailey",
      "lattice": null,
      "name": "The bailey",
      "ports": [],
      "provenance": "ai-generated",
      "rows": 8,
      "scale": {
        "tier": "room",
        "cell": {
          "unit": "feet",
          "magnitude": 5
        }
      },
      "source": {
        "kind": "library",
        "libraryMapId": "lib-castle-bailey",
        "version": "1"
      },
      "stack": null
    },
    {
      "backdrop": {
        "columns": 12,
        "gridVerified": true,
        "imageUrl": "/maps/library/castle-wall-walk.webp",
        "kind": "registered",
        "licence": {
          "attribution": null,
          "spdx": "CC0-1.0"
        },
        "nativeCellPx": 128,
        "rows": 8
      },
      "columns": 12,
      "id": "m-the-wall-walk",
      "lattice": null,
      "name": "The wall walk",
      "ports": [],
      "provenance": "ai-generated",
      "rows": 8,
      "scale": {
        "tier": "room",
        "cell": {
          "unit": "feet",
          "magnitude": 5
        }
      },
      "source": {
        "kind": "library",
        "libraryMapId": "lib-castle-wall-walk",
        "version": "1"
      },
      "stack": null
    },
    {
      "backdrop": {
        "columns": 12,
        "gridVerified": true,
        "imageUrl": "/maps/library/castle-watch-platform.webp",
        "kind": "registered",
        "licence": {
          "attribution": null,
          "spdx": "CC0-1.0"
        },
        "nativeCellPx": 128,
        "rows": 8
      },
      "columns": 12,
      "id": "m-the-watch-platform",
      "lattice": null,
      "name": "The watch platform",
      "ports": [],
      "provenance": "ai-generated",
      "rows": 8,
      "scale": {
        "tier": "room",
        "cell": {
          "unit": "feet",
          "magnitude": 5
        }
      },
      "source": {
        "kind": "library",
        "libraryMapId": "lib-castle-watch-platform",
        "version": "1"
      },
      "stack": null
    },
    {
      "backdrop": {
        "columns": 12,
        "gridVerified": true,
        "imageUrl": "/maps/library/castle-tower-room.webp",
        "kind": "registered",
        "licence": {
          "attribution": null,
          "spdx": "CC0-1.0"
        },
        "nativeCellPx": 128,
        "rows": 8
      },
      "columns": 12,
      "id": "m-castellan-s-tower-room",
      "lattice": null,
      "name": "Castellan's tower room",
      "ports": [],
      "provenance": "ai-generated",
      "rows": 8,
      "scale": {
        "tier": "room",
        "cell": {
          "unit": "feet",
          "magnitude": 5
        }
      },
      "source": {
        "kind": "library",
        "libraryMapId": "lib-castle-tower-room",
        "version": "1"
      },
      "stack": null
    },
    {
      "backdrop": {
        "columns": 12,
        "gridVerified": true,
        "imageUrl": "/maps/library/castle-keep-hall.webp",
        "kind": "registered",
        "licence": {
          "attribution": null,
          "spdx": "CC0-1.0"
        },
        "nativeCellPx": 128,
        "rows": 8
      },
      "columns": 12,
      "id": "m-the-keep-barracks",
      "lattice": null,
      "name": "The keep barracks",
      "ports": [],
      "provenance": "ai-generated",
      "rows": 8,
      "scale": {
        "tier": "room",
        "cell": {
          "unit": "feet",
          "magnitude": 5
        }
      },
      "source": {
        "kind": "library",
        "libraryMapId": "lib-castle-keep-hall",
        "version": "1"
      },
      "stack": null
    },
    {
      "backdrop": {
        "columns": 12,
        "gridVerified": true,
        "imageUrl": "/maps/library/castle-lords-hall.webp",
        "kind": "registered",
        "licence": {
          "attribution": null,
          "spdx": "CC0-1.0"
        },
        "nativeCellPx": 128,
        "rows": 8
      },
      "columns": 12,
      "id": "m-the-lord-s-hall",
      "lattice": null,
      "name": "The lord's hall",
      "ports": [],
      "provenance": "ai-generated",
      "rows": 8,
      "scale": {
        "tier": "room",
        "cell": {
          "unit": "feet",
          "magnitude": 5
        }
      },
      "source": {
        "kind": "library",
        "libraryMapId": "lib-castle-lords-hall",
        "version": "1"
      },
      "stack": null
    },
    {
      "backdrop": {
        "columns": 12,
        "gridVerified": true,
        "imageUrl": "/maps/library/castle-kitchen.webp",
        "kind": "registered",
        "licence": {
          "attribution": null,
          "spdx": "CC0-1.0"
        },
        "nativeCellPx": 128,
        "rows": 8
      },
      "columns": 12,
      "id": "m-postern-and-kitchens",
      "lattice": null,
      "name": "Postern and kitchens",
      "ports": [],
      "provenance": "ai-generated",
      "rows": 8,
      "scale": {
        "tier": "room",
        "cell": {
          "unit": "feet",
          "magnitude": 5
        }
      },
      "source": {
        "kind": "library",
        "libraryMapId": "lib-castle-kitchen",
        "version": "1"
      },
      "stack": null
    }
  ],
  "provenance": "ai-generated",
  "rollTables": [
    {
      "id": "siege-reinforcements",
      "name": "Siege reinforcements",
      "entries": [
        {
          "name": "Hobgoblin",
          "stat": {
            "packId": "dndmax.bestiary",
            "selector": "hobgoblin"
          }
        },
        {
          "name": "Goblin sneak",
          "stat": {
            "packId": "dndmax.bestiary",
            "selector": "goblin-sneak"
          }
        },
        {
          "name": "Bugbear",
          "stat": {
            "packId": "dndmax.bestiary",
            "selector": "bugbear"
          }
        },
        {
          "name": "Dire wolf",
          "stat": {
            "packId": "dndmax.bestiary",
            "selector": "dire-wolf"
          }
        },
        {
          "name": "A trebuchet stone lands nearby: 2d6 to anyone in a 2-square radius, DC 13 Dex for half",
          "stat": null
        },
        {
          "name": "Burning pitch arrows: one square catches fire",
          "stat": null
        }
      ]
    },
    {
      "id": "war-spoils",
      "name": "War spoils",
      "entries": [
        {
          "name": "A hobgoblin officer's pay purse (2d10 gp)",
          "stat": null
        },
        {
          "name": "A potion of healing",
          "stat": null
        },
        {
          "name": "A legion standard (worth a lot to the defenders' morale)",
          "stat": null
        },
        {
          "name": "A coded order from Warlord Grisk",
          "stat": null
        },
        {
          "name": "A dwarven-made crossbow and 20 bolts",
          "stat": null
        },
        {
          "name": "A bag of caltrops",
          "stat": null
        }
      ]
    }
  ]
}
