import { Direction, PuzzleData } from '../core/types.js';
export type ExampleDifficulty = 'easy' | 'medium' | 'hard';
export interface CampaignExamplePuzzleData extends Omit<PuzzleData, 'pressurePlate' | 'barrier'> {
pressurePlate: PuzzleData['pressurePlate'] | null;
barrier: PuzzleData['barrier'] | null;
}
export interface CampaignLevelExample {
levelNumber: number;
id: string;
name: string;
difficulty: ExampleDifficulty;
par: number;
shortestMoves: number | null;
mechanics: string[];
solution: Direction[];
hardnessDrivers: string[];
designTakeaway: string;
puzzleData: CampaignExamplePuzzleData;
}
export const CAMPAIGN_LEVEL_EXAMPLES: CampaignLevelExample[] = [
{
"levelNumber": 1,
"id": "level_1",
"name": "First Steps",
"difficulty": "easy",
"par": 6,
"shortestMoves": 6,
"mechanics": [
"rocks"
],
"solution": [
"right",
"up",
"left",
"down",
"left",
"up"
],
"hardnessDrivers": [
"Teaches pure stop-point routing with no hazards"
],
"designTakeaway": "Use this to show that each stop should offer at least two plausible continuations.",
"puzzleData": {
"id": "level_1",
"name": "First Steps",
"theme": "calgary",
"width": 9,
"height": 8,
"par": 6,
"start": {
"x": 1,
"y": 6
},
"goal": {
"x": 4,
"y": 1
},
"obstacles": [
{
"x": 5,
"y": 1,
"type": "rock"
},
{
"x": 3,
"y": 2,
"type": "rock"
},
{
"x": 1,
"y": 3,
"type": "rock"
},
{
"x": 2,
"y": 3,
"type": "rock"
},
{
"x": 6,
"y": 3,
"type": "rock"
},
{
"x": 4,
"y": 4,
"type": "rock"
},
{
"x": 3,
"y": 5,
"type": "rock"
},
{
"x": 6,
"y": 5,
"type": "rock"
}
],
"warps": [],
"thinIceTiles": [],
"pushableRocks": [],
"pressurePlate": null,
"barrier": null
}
},
{
"levelNumber": 2,
"id": "level_2",
"name": "Rocks Mastery",
"difficulty": "easy",
"par": 8,
"shortestMoves": 8,
"mechanics": [
"rocks"
],
"solution": [
"right",
"down",
"left",
"down",
"right",
"up",
"right",
"down"
],
"hardnessDrivers": [
"Longer rock-only route introduces commitment mistakes"
],
"designTakeaway": "Rock-only levels can still be challenging if stop order matters and backtracking is punished by move count.",
"puzzleData": {
"id": "level_2",
"name": "Rocks Mastery",
"theme": "calgary",
"width": 14,
"height": 13,
"par": 8,
"start": {
"x": 1,
"y": 1
},
"goal": {
"x": 12,
"y": 11
},
"obstacles": [
{
"x": 11,
"y": 11,
"type": "rock"
},
{
"x": 1,
"y": 2,
"type": "rock"
},
{
"x": 1,
"y": 3,
"type": "rock"
},
{
"x": 1,
"y": 4,
"type": "rock"
},
{
"x": 9,
"y": 1,
"type": "rock"
},
{
"x": 10,
"y": 1,
"type": "rock"
},
{
"x": 12,
"y": 2,
"type": "rock"
},
{
"x": 12,
"y": 3,
"type": "rock"
},
{
"x": 12,
"y": 4,
"type": "rock"
},
{
"x": 11,
"y": 5,
"type": "rock"
},
{
"x": 10,
"y": 5,
"type": "rock"
},
{
"x": 8,
"y": 6,
"type": "rock"
},
{
"x": 8,
"y": 7,
"type": "rock"
},
{
"x": 8,
"y": 8,
"type": "rock"
},
{
"x": 7,
"y": 9,
"type": "rock"
},
{
"x": 6,
"y": 9,
"type": "rock"
},
{
"x": 4,
"y": 8,
"type": "rock"
},
{
"x": 4,
"y": 7,
"type": "rock"
},
{
"x": 4,
"y": 6,
"type": "rock"
},
{
"x": 2,
"y": 4,
"type": "rock"
},
{
"x": 3,
"y": 2,
"type": "rock"
},
{
"x": 5,
"y": 1,
"type": "rock"
},
{
"x": 7,
"y": 2,
"type": "rock"
},
{
"x": 10,
"y": 3,
"type": "rock"
},
{
"x": 9,
"y": 5,
"type": "rock"
},
{
"x": 6,
"y": 6,
"type": "rock"
},
{
"x": 5,
"y": 8,
"type": "rock"
},
{
"x": 2,
"y": 8,
"type": "rock"
},
{
"x": 9,
"y": 10,
"type": "rock"
}
],
"warps": [],
"thinIceTiles": [],
"pushableRocks": [],
"pressurePlate": null,
"barrier": null
}
},
{
"levelNumber": 3,
"id": "level_3",
"name": "Heat Death Reversed",
"difficulty": "medium",
"par": 10,
"shortestMoves": 10,
"mechanics": [
"rocks",
"lava"
],
"solution": [
"left",
"down",
"right",
"down",
"left",
"up",
"right",
"down",
"left",
"down"
],
"hardnessDrivers": [
"First lava pressure while preserving clean shortest path readability"
],
"designTakeaway": "Introduce one lethal hazard at a time and force one intentional near-miss to teach respect for slide length.",
"puzzleData": {
"id": "level_3",
"name": "Heat Death Reversed",
"theme": "calgary",
"width": 16,
"height": 15,
"par": 10,
"start": {
"x": 14,
"y": 1
},
"goal": {
"x": 1,
"y": 13
},
"obstacles": [
{
"x": 2,
"y": 13,
"type": "rock"
},
{
"x": 14,
"y": 8,
"type": "lava"
},
{
"x": 5,
"y": 7,
"type": "lava"
},
{
"x": 11,
"y": 2,
"type": "rock"
},
{
"x": 11,
"y": 3,
"type": "rock"
},
{
"x": 11,
"y": 4,
"type": "rock"
},
{
"x": 11,
"y": 5,
"type": "rock"
},
{
"x": 11,
"y": 6,
"type": "rock"
},
{
"x": 7,
"y": 1,
"type": "rock"
},
{
"x": 7,
"y": 2,
"type": "rock"
},
{
"x": 7,
"y": 3,
"type": "rock"
},
{
"x": 7,
"y": 4,
"type": "rock"
},
{
"x": 7,
"y": 5,
"type": "rock"
},
{
"x": 7,
"y": 6,
"type": "rock"
},
{
"x": 3,
"y": 1,
"type": "rock"
},
{
"x": 3,
"y": 2,
"type": "rock"
},
{
"x": 3,
"y": 3,
"type": "rock"
},
{
"x": 3,
"y": 4,
"type": "rock"
},
{
"x": 3,
"y": 5,
"type": "rock"
},
{
"x": 9,
"y": 7,
"type": "rock"
},
{
"x": 8,
"y": 7,
"type": "rock"
},
{
"x": 4,
"y": 7,
"type": "rock"
},
{
"x": 12,
"y": 10,
"type": "rock"
},
{
"x": 11,
"y": 10,
"type": "rock"
},
{
"x": 10,
"y": 10,
"type": "rock"
},
{
"x": 6,
"y": 11,
"type": "rock"
},
{
"x": 5,
"y": 11,
"type": "rock"
},
{
"x": 2,
"y": 9,
"type": "rock"
},
{
"x": 1,
"y": 9,
"type": "rock"
}
],
"warps": [],
"thinIceTiles": [],
"pushableRocks": [],
"pressurePlate": null,
"barrier": null
}
},
{
"levelNumber": 4,
"id": "level_4",
"name": "Hot Coals Carousel",
"difficulty": "medium",
"par": 12,
"shortestMoves": 12,
"mechanics": [
"rocks",
"lava",
"hot_coals"
],
"solution": [
"left",
"up",
"right",
"up",
"left",
"down",
"left",
"up",
"right",
"up",
"left",
"up"
],
"hardnessDrivers": [
"Mixes lava and hot coals to create risk/reward branches"
],
"designTakeaway": "Hot coals work best as costly-but-survivable bait while lava remains absolute failure.",
"puzzleData": {
"id": "level_4",
"name": "Hot Coals Carousel",
"theme": "calgary",
"width": 16,
"height": 15,
"par": 12,
"start": {
"x": 14,
"y": 13
},
"goal": {
"x": 1,
"y": 1
},
"obstacles": [
{
"x": 2,
"y": 1,
"type": "rock"
},
{
"x": 14,
"y": 6,
"type": "lava"
},
{
"x": 5,
"y": 7,
"type": "lava"
},
{
"x": 9,
"y": 6,
"type": "hot_coals"
},
{
"x": 2,
"y": 3,
"type": "hot_coals"
},
{
"x": 11,
"y": 12,
"type": "rock"
},
{
"x": 11,
"y": 11,
"type": "rock"
},
{
"x": 11,
"y": 10,
"type": "rock"
},
{
"x": 11,
"y": 9,
"type": "rock"
},
{
"x": 11,
"y": 8,
"type": "rock"
},
{
"x": 7,
"y": 13,
"type": "rock"
},
{
"x": 7,
"y": 12,
"type": "rock"
},
{
"x": 7,
"y": 11,
"type": "rock"
},
{
"x": 7,
"y": 10,
"type": "rock"
},
{
"x": 7,
"y": 9,
"type": "rock"
},
{
"x": 7,
"y": 8,
"type": "rock"
},
{
"x": 3,
"y": 13,
"type": "rock"
},
{
"x": 3,
"y": 12,
"type": "rock"
},
{
"x": 3,
"y": 11,
"type": "rock"
},
{
"x": 3,
"y": 10,
"type": "rock"
},
{
"x": 3,
"y": 9,
"type": "rock"
},
{
"x": 9,
"y": 7,
"type": "rock"
},
{
"x": 8,
"y": 7,
"type": "rock"
},
{
"x": 4,
"y": 7,
"type": "rock"
},
{
"x": 12,
"y": 4,
"type": "rock"
},
{
"x": 11,
"y": 4,
"type": "rock"
},
{
"x": 10,
"y": 4,
"type": "rock"
},
{
"x": 6,
"y": 3,
"type": "rock"
},
{
"x": 5,
"y": 3,
"type": "rock"
},
{
"x": 2,
"y": 5,
"type": "rock"
},
{
"x": 1,
"y": 5,
"type": "rock"
},
{
"x": 6,
"y": 6,
"type": "rock"
}
],
"warps": [],
"thinIceTiles": [],
"pushableRocks": [],
"pressurePlate": null,
"barrier": null
}
},
{
"levelNumber": 5,
"id": "level_5",
"name": "Broken Compass",
"difficulty": "hard",
"par": 16,
"shortestMoves": 16,
"mechanics": [
"rocks",
"lava",
"hot_coals"
],
"solution": [
"right",
"up",
"left",
"down",
"right",
"down",
"left",
"up",
"right",
"up",
"right",
"up",
"left",
"down",
"right",
"up"
],
"hardnessDrivers": [
"16-move route with repeated orientation shifts",
"Multiple plausible wrong branches"
],
"designTakeaway": "Hardness can come from route memory load, not only density of hazards.",
"puzzleData": {
"id": "level_5",
"name": "Broken Compass",
"theme": "calgary",
"width": 16,
"height": 15,
"par": 16,
"start": {
"x": 1,
"y": 13
},
"goal": {
"x": 14,
"y": 1
},
"obstacles": [
{
"x": 12,
"y": 5,
"type": "rock"
},
{
"x": 3,
"y": 11,
"type": "rock"
},
{
"x": 14,
"y": 13,
"type": "rock"
},
{
"x": 8,
"y": 7,
"type": "rock"
},
{
"x": 14,
"y": 9,
"type": "rock"
},
{
"x": 8,
"y": 8,
"type": "rock"
},
{
"x": 5,
"y": 4,
"type": "rock"
},
{
"x": 6,
"y": 13,
"type": "rock"
},
{
"x": 9,
"y": 3,
"type": "rock"
},
{
"x": 1,
"y": 9,
"type": "rock"
},
{
"x": 13,
"y": 5,
"type": "rock"
},
{
"x": 11,
"y": 13,
"type": "rock"
},
{
"x": 7,
"y": 8,
"type": "rock"
},
{
"x": 1,
"y": 10,
"type": "rock"
},
{
"x": 10,
"y": 5,
"type": "rock"
},
{
"x": 11,
"y": 11,
"type": "rock"
},
{
"x": 6,
"y": 12,
"type": "rock"
},
{
"x": 3,
"y": 13,
"type": "rock"
},
{
"x": 10,
"y": 9,
"type": "rock"
},
{
"x": 11,
"y": 6,
"type": "rock"
},
{
"x": 7,
"y": 4,
"type": "rock"
},
{
"x": 12,
"y": 1,
"type": "rock"
},
{
"x": 4,
"y": 10,
"type": "rock"
},
{
"x": 8,
"y": 2,
"type": "rock"
},
{
"x": 11,
"y": 10,
"type": "rock"
},
{
"x": 14,
"y": 10,
"type": "rock"
},
{
"x": 10,
"y": 8,
"type": "rock"
},
{
"x": 9,
"y": 11,
"type": "rock"
},
{
"x": 13,
"y": 10,
"type": "rock"
},
{
"x": 8,
"y": 1,
"type": "rock"
},
{
"x": 4,
"y": 4,
"type": "rock"
},
{
"x": 12,
"y": 4,
"type": "rock"
},
{
"x": 7,
"y": 6,
"type": "rock"
},
{
"x": 10,
"y": 13,
"type": "rock"
},
{
"x": 10,
"y": 6,
"type": "rock"
},
{
"x": 6,
"y": 3,
"type": "lava"
},
{
"x": 8,
"y": 10,
"type": "lava"
},
{
"x": 4,
"y": 1,
"type": "lava"
},
{
"x": 14,
"y": 7,
"type": "lava"
},
{
"x": 3,
"y": 7,
"type": "lava"
},
{
"x": 6,
"y": 7,
"type": "lava"
},
{
"x": 7,
"y": 7,
"type": "lava"
},
{
"x": 14,
"y": 3,
"type": "hot_coals"
},
{
"x": 5,
"y": 11,
"type": "hot_coals"
}
],
"warps": [],
"thinIceTiles": [],
"pushableRocks": [],
"pressurePlate": null,
"barrier": null
}
},
{
"levelNumber": 6,
"id": "level_6",
"name": "Cold Relay",
"difficulty": "hard",
"par": 17,
"shortestMoves": 17,
"mechanics": [
"rocks",
"lava",
"hot_coals"
],
"solution": [
"up",
"right",
"down",
"right",
"down",
"left",
"up",
"right",
"up",
"right",
"up",
"left",
"up",
"right",
"down",
"right",
"up"
],
"hardnessDrivers": [
"Sustained long traversal with hazard-threading"
],
"designTakeaway": "Use map breadth to create relay pacing where each stop sets up a distant future stop.",
"puzzleData": {
"id": "level_6",
"name": "Cold Relay",
"theme": "calgary",
"width": 16,
"height": 15,
"par": 17,
"start": {
"x": 1,
"y": 13
},
"goal": {
"x": 14,
"y": 1
},
"obstacles": [
{
"x": 10,
"y": 8,
"type": "rock"
},
{
"x": 9,
"y": 8,
"type": "rock"
},
{
"x": 6,
"y": 12,
"type": "rock"
},
{
"x": 1,
"y": 8,
"type": "rock"
},
{
"x": 14,
"y": 8,
"type": "rock"
},
{
"x": 1,
"y": 5,
"type": "rock"
},
{
"x": 6,
"y": 4,
"type": "rock"
},
{
"x": 11,
"y": 5,
"type": "rock"
},
{
"x": 4,
"y": 4,
"type": "rock"
},
{
"x": 5,
"y": 11,
"type": "rock"
},
{
"x": 6,
"y": 8,
"type": "rock"
},
{
"x": 14,
"y": 12,
"type": "rock"
},
{
"x": 6,
"y": 6,
"type": "rock"
},
{
"x": 2,
"y": 2,
"type": "rock"
},
{
"x": 4,
"y": 10,
"type": "rock"
},
{
"x": 14,
"y": 6,
"type": "rock"
},
{
"x": 7,
"y": 4,
"type": "rock"
},
{
"x": 10,
"y": 13,
"type": "rock"
},
{
"x": 10,
"y": 3,
"type": "rock"
},
{
"x": 1,
"y": 6,
"type": "rock"
},
{
"x": 8,
"y": 12,
"type": "rock"
},
{
"x": 5,
"y": 7,
"type": "rock"
},
{
"x": 2,
"y": 13,
"type": "rock"
},
{
"x": 12,
"y": 13,
"type": "rock"
},
{
"x": 8,
"y": 6,
"type": "rock"
},
{
"x": 9,
"y": 9,
"type": "rock"
},
{
"x": 3,
"y": 6,
"type": "rock"
},
{
"x": 2,
"y": 8,
"type": "rock"
},
{
"x": 11,
"y": 1,
"type": "rock"
},
{
"x": 13,
"y": 8,
"type": "rock"
},
{
"x": 5,
"y": 8,
"type": "rock"
},
{
"x": 13,
"y": 4,
"type": "lava"
},
{
"x": 11,
"y": 13,
"type": "lava"
},
{
"x": 9,
"y": 13,
"type": "lava"
},
{
"x": 9,
"y": 11,
"type": "lava"
},
{
"x": 7,
"y": 2,
"type": "lava"
},
{
"x": 7,
"y": 3,
"type": "lava"
},
{
"x": 11,
"y": 7,
"type": "lava"
},
{
"x": 2,
"y": 9,
"type": "hot_coals"
},
{
"x": 12,
"y": 4,
"type": "lava"
},
{
"x": 5,
"y": 1,
"type": "hot_coals"
},
{
"x": 14,
"y": 13,
"type": "hot_coals"
}
],
"warps": [],
"thinIceTiles": [],
"pushableRocks": [],
"pressurePlate": null,
"barrier": null
}
},
{
"levelNumber": 7,
"id": "level_7",
"name": "Warp Relay",
"difficulty": "hard",
"par": 17,
"shortestMoves": 17,
"mechanics": [
"rocks",
"lava",
"hot_coals",
"warps"
],
"solution": [
"right",
"down",
"left",
"right",
"right",
"up",
"left",
"down",
"left",
"down",
"left",
"up",
"right",
"down",
"right",
"down",
"right"
],
"hardnessDrivers": [
"Warp usage adds non-local planning",
"Hazard pressure around warp lines"
],
"designTakeaway": "Warp exits should be safe enough to read, but nearby tiles should still punish autopilot movement.",
"puzzleData": {
"id": "level_7",
"name": "Warp Relay",
"theme": "calgary",
"width": 15,
"height": 16,
"par": 17,
"start": {
"x": 1,
"y": 1
},
"goal": {
"x": 13,
"y": 14
},
"obstacles": [
{
"x": 4,
"y": 8,
"type": "rock"
},
{
"x": 8,
"y": 11,
"type": "rock"
},
{
"x": 8,
"y": 7,
"type": "rock"
},
{
"x": 2,
"y": 14,
"type": "rock"
},
{
"x": 11,
"y": 6,
"type": "rock"
},
{
"x": 5,
"y": 7,
"type": "rock"
},
{
"x": 10,
"y": 10,
"type": "rock"
},
{
"x": 5,
"y": 13,
"type": "rock"
},
{
"x": 2,
"y": 6,
"type": "rock"
},
{
"x": 12,
"y": 4,
"type": "rock"
},
{
"x": 11,
"y": 3,
"type": "rock"
},
{
"x": 13,
"y": 7,
"type": "rock"
},
{
"x": 7,
"y": 4,
"type": "rock"
},
{
"x": 10,
"y": 12,
"type": "rock"
},
{
"x": 11,
"y": 14,
"type": "rock"
},
{
"x": 13,
"y": 11,
"type": "rock"
},
{
"x": 1,
"y": 9,
"type": "rock"
},
{
"x": 2,
"y": 3,
"type": "rock"
},
{
"x": 13,
"y": 13,
"type": "rock"
},
{
"x": 1,
"y": 7,
"type": "rock"
},
{
"x": 7,
"y": 2,
"type": "rock"
},
{
"x": 6,
"y": 3,
"type": "rock"
},
{
"x": 6,
"y": 7,
"type": "rock"
},
{
"x": 13,
"y": 6,
"type": "rock"
},
{
"x": 11,
"y": 10,
"type": "rock"
},
{
"x": 10,
"y": 8,
"type": "rock"
},
{
"x": 8,
"y": 10,
"type": "rock"
},
{
"x": 12,
"y": 5,
"type": "rock"
},
{
"x": 7,
"y": 14,
"type": "rock"
},
{
"x": 4,
"y": 12,
"type": "rock"
},
{
"x": 13,
"y": 1,
"type": "rock"
},
{
"x": 5,
"y": 14,
"type": "rock"
},
{
"x": 8,
"y": 1,
"type": "rock"
},
{
"x": 3,
"y": 1,
"type": "rock"
},
{
"x": 12,
"y": 3,
"type": "lava"
},
{
"x": 11,
"y": 9,
"type": "lava"
},
{
"x": 6,
"y": 8,
"type": "lava"
},
{
"x": 9,
"y": 9,
"type": "lava"
},
{
"x": 3,
"y": 11,
"type": "lava"
},
{
"x": 10,
"y": 11,
"type": "lava"
},
{
"x": 8,
"y": 4,
"type": "lava"
},
{
"x": 7,
"y": 3,
"type": "lava"
},
{
"x": 6,
"y": 14,
"type": "hot_coals"
},
{
"x": 8,
"y": 6,
"type": "hot_coals"
},
{
"x": 4,
"y": 1,
"type": "hot_coals"
},
{
"x": 1,
"y": 5,
"type": "hot_coals"
}
],
"warps": [
{
"x": 2,
"y": 2,
"id": "w1"
},
{
"x": 12,
"y": 1,
"id": "w1"
}
],
"thinIceTiles": [],
"pushableRocks": [],
"pressurePlate": null,
"barrier": null
}
},
{
"levelNumber": 8,
"id": "level_8",
"name": "Portal Switchback",
"difficulty": "hard",
"par": 17,
"shortestMoves": 17,
"mechanics": [
"rocks",
"lava",
"hot_coals",
"warps"
],
"solution": [
"up",
"right",
"up",
"right",
"down",
"left",
"down",
"right",
"down",
"up",
"down",
"right",
"down",
"left",
"up",
"right",
"up"
],
"hardnessDrivers": [
"Switchback structure with repeated re-orientation",
"High path-length pressure"
],
"designTakeaway": "Good hard levels reuse space with different intent rather than only adding more obstacles.",
"puzzleData": {
"id": "level_8",
"name": "Portal Switchback",
"theme": "calgary",
"width": 16,
"height": 15,
"par": 17,
"start": {
"x": 1,
"y": 13
},
"goal": {
"x": 14,
"y": 1
},
"obstacles": [
{
"x": 5,
"y": 9,
"type": "rock"
},
{
"x": 14,
"y": 4,
"type": "rock"
},
{
"x": 5,
"y": 10,
"type": "rock"
},
{
"x": 7,
"y": 12,
"type": "rock"
},
{
"x": 6,
"y": 13,
"type": "rock"
},
{
"x": 4,
"y": 2,
"type": "rock"
},
{
"x": 8,
"y": 3,
"type": "rock"
},
{
"x": 8,
"y": 4,
"type": "rock"
},
{
"x": 9,
"y": 1,
"type": "rock"
},
{
"x": 1,
"y": 2,
"type": "rock"
},
{
"x": 2,
"y": 7,
"type": "rock"
},
{
"x": 10,
"y": 11,
"type": "rock"
},
{
"x": 1,
"y": 11,
"type": "rock"
},
{
"x": 3,
"y": 7,
"type": "rock"
},
{
"x": 1,
"y": 7,
"type": "rock"
},
{
"x": 1,
"y": 10,
"type": "rock"
},
{
"x": 4,
"y": 5,
"type": "rock"
},
{
"x": 11,
"y": 9,
"type": "rock"
},
{
"x": 14,
"y": 7,
"type": "rock"
},
{
"x": 10,
"y": 6,
"type": "rock"
},
{
"x": 11,
"y": 6,
"type": "rock"
},
{
"x": 5,
"y": 5,
"type": "rock"
},
{
"x": 1,
"y": 5,
"type": "rock"
},
{
"x": 1,
"y": 8,
"type": "rock"
},
{
"x": 8,
"y": 9,
"type": "rock"
},
{
"x": 5,
"y": 1,
"type": "rock"
},
{
"x": 3,
"y": 2,
"type": "rock"
},
{
"x": 5,
"y": 13,
"type": "rock"
},
{
"x": 3,
"y": 5,
"type": "rock"
},
{
"x": 11,
"y": 4,
"type": "rock"
},
{
"x": 4,
"y": 10,
"type": "rock"
},
{
"x": 1,
"y": 9,
"type": "rock"
},
{
"x": 10,
"y": 2,
"type": "rock"
},
{
"x": 12,
"y": 1,
"type": "rock"
},
{
"x": 7,
"y": 6,
"type": "rock"
},
{
"x": 1,
"y": 3,
"type": "rock"
},
{
"x": 13,
"y": 13,
"type": "rock"
},
{
"x": 8,
"y": 10,
"type": "lava"
},
{
"x": 4,
"y": 6,
"type": "lava"
},
{
"x": 13,
"y": 12,
"type": "lava"
},
{
"x": 11,
"y": 7,
"type": "lava"
},
{
"x": 4,
"y": 4,
"type": "lava"
},
{
"x": 14,
"y": 5,
"type": "hot_coals"
},
{
"x": 9,
"y": 8,
"type": "lava"
},
{
"x": 3,
"y": 13,
"type": "lava"
},
{
"x": 9,
"y": 11,
"type": "hot_coals"
}
],
"warps": [
{
"x": 2,
"y": 8,
"id": "w1"
},
{
"x": 7,
"y": 4,
"id": "w1"
}
],
"thinIceTiles": [],
"pushableRocks": [],
"pressurePlate": null,
"barrier": null
}
},
{
"levelNumber": 9,
"id": "level_9",
"name": "Black Ice Marathon",
"difficulty": "hard",
"par": 22,
"shortestMoves": 22,
"mechanics": [
"rocks",
"lava",
"hot_coals",
"thin_ice"
],
"solution": [
"right",
"down",
"right",
"up",
"left",
"down",
"right",
"down",
"left",
"up",
"right",
"down",
"right",
"down",
"left",
"up",
"left",
"down",
"right",
"up",
"right",
"down"
],
"hardnessDrivers": [
"Thin-ice route permanence creates one-way commitment",
"22-move endurance path"
],
"designTakeaway": "Thin ice should convert early choices into irreversible late-game consequences.",
"puzzleData": {
"id": "level_9",
"name": "Black Ice Marathon",
"theme": "calgary",
"width": 15,
"height": 16,
"par": 22,
"start": {
"x": 1,
"y": 1
},
"goal": {
"x": 13,
"y": 14
},
"obstacles": [
{
"x": 9,
"y": 8,
"type": "rock"
},
{
"x": 13,
"y": 8,
"type": "rock"
},
{
"x": 1,
"y": 7,
"type": "rock"
},
{
"x": 10,
"y": 4,
"type": "rock"
},
{
"x": 10,
"y": 8,
"type": "rock"
},
{
"x": 3,
"y": 3,
"type": "rock"
},
{
"x": 4,
"y": 1,
"type": "rock"
},
{
"x": 12,
"y": 7,
"type": "rock"
},
{
"x": 3,
"y": 14,
"type": "rock"
},
{
"x": 2,
"y": 6,
"type": "rock"
},
{
"x": 2,
"y": 10,
"type": "rock"
},
{
"x": 9,
"y": 10,
"type": "rock"
},
{
"x": 13,
"y": 5,
"type": "rock"
},
{
"x": 12,
"y": 11,
"type": "rock"
},
{
"x": 7,
"y": 5,
"type": "rock"
},
{
"x": 13,
"y": 10,
"type": "rock"
},
{
"x": 8,
"y": 11,
"type": "rock"
},
{
"x": 12,
"y": 6,
"type": "rock"
},
{
"x": 11,
"y": 11,
"type": "rock"
},
{
"x": 3,
"y": 11,
"type": "rock"
},
{
"x": 10,
"y": 12,
"type": "rock"
},
{
"x": 4,
"y": 14,
"type": "rock"
},
{
"x": 12,
"y": 9,
"type": "rock"
},
{
"x": 13,
"y": 9,
"type": "rock"
},
{
"x": 13,
"y": 12,
"type": "rock"
},
{
"x": 11,
"y": 6,
"type": "rock"
},
{
"x": 7,
"y": 8,
"type": "rock"
},
{
"x": 5,
"y": 5,
"type": "rock"
},
{
"x": 2,
"y": 12,
"type": "rock"
},
{
"x": 12,
"y": 5,
"type": "rock"
},
{
"x": 7,
"y": 4,
"type": "rock"
},
{
"x": 9,
"y": 2,
"type": "rock"
},
{
"x": 12,
"y": 14,
"type": "lava"
},
{
"x": 7,
"y": 10,
"type": "lava"
},
{
"x": 3,
"y": 8,
"type": "lava"
},
{
"x": 7,
"y": 7,
"type": "lava"
},
{
"x": 2,
"y": 4,
"type": "lava"
},
{
"x": 9,
"y": 14,
"type": "lava"
},
{
"x": 8,
"y": 2,
"type": "hot_coals"
},
{
"x": 8,
"y": 12,
"type": "hot_coals"
}
],
"warps": [],
"thinIceTiles": [
{
"x": 3,
"y": 9
},
{
"x": 5,
"y": 3
},
{
"x": 4,
"y": 10
},
{
"x": 11,
"y": 13
},
{
"x": 6,
"y": 12
},
{
"x": 6,
"y": 1
}
],
"pushableRocks": [],
"pressurePlate": null,
"barrier": null
}
},
{
"levelNumber": 10,
"id": "level_10",
"name": "Push Rock Primer",
"difficulty": "hard",
"par": 18,
"shortestMoves": 18,
"mechanics": [
"rocks",
"lava",
"hot_coals",
"pushable_rocks"
],
"solution": [
"right",
"up",
"left",
"up",
"right",
"up",
"up",
"left",
"up",
"right",
"down",
"down",
"down",
"down",
"left",
"down",
"right",
"up"
],
"hardnessDrivers": [
"Pushable rock timing",
"Hazard pressure while sequencing pushes"
],
"designTakeaway": "Push mechanics are strongest when each shove both opens one route and closes another.",
"puzzleData": {
"id": "level_10",
"name": "Push Rock Primer",
"theme": "calgary",
"width": 16,
"height": 15,
"par": 18,
"start": {
"x": 1,
"y": 13
},
"goal": {
"x": 14,
"y": 1
},
"obstacles": [
{
"x": 3,
"y": 1,
"type": "rock"
},
{
"x": 3,
"y": 2,
"type": "rock"
},
{
"x": 3,
"y": 3,
"type": "rock"
},
{
"x": 3,
"y": 4,
"type": "rock"
},
{
"x": 3,
"y": 6,
"type": "rock"
},
{
"x": 3,
"y": 7,
"type": "rock"
},
{
"x": 3,
"y": 8,
"type": "rock"
},
{
"x": 3,
"y": 9,
"type": "rock"
},
{
"x": 3,
"y": 10,
"type": "rock"
},
{
"x": 3,
"y": 11,
"type": "rock"
},
{
"x": 6,
"y": 2,
"type": "rock"
},
{
"x": 6,
"y": 4,
"type": "rock"
},
{
"x": 6,
"y": 5,
"type": "rock"
},
{
"x": 6,
"y": 6,
"type": "rock"
},
{
"x": 6,
"y": 7,
"type": "rock"
},
{
"x": 6,
"y": 8,
"type": "rock"
},
{
"x": 6,
"y": 9,
"type": "rock"
},
{
"x": 6,
"y": 10,
"type": "rock"
},
{
"x": 6,
"y": 11,
"type": "rock"
},
{
"x": 6,
"y": 13,
"type": "rock"
},
{
"x": 9,
"y": 2,
"type": "rock"
},
{
"x": 9,
"y": 3,
"type": "rock"
},
{
"x": 9,
"y": 4,
"type": "rock"
},
{
"x": 9,
"y": 5,
"type": "rock"
},
{
"x": 9,
"y": 6,
"type": "rock"
},
{
"x": 9,
"y": 7,
"type": "rock"
},
{
"x": 9,
"y": 8,
"type": "rock"
},
{
"x": 9,
"y": 10,
"type": "rock"
},
{
"x": 9,
"y": 12,
"type": "rock"
},
{
"x": 9,
"y": 13,
"type": "rock"
},
{
"x": 12,
"y": 1,
"type": "rock"
},
{
"x": 12,
"y": 2,
"type": "rock"
},
{
"x": 12,
"y": 3,
"type": "rock"
},
{
"x": 12,
"y": 4,
"type": "rock"
},
{
"x": 12,
"y": 5,
"type": "rock"
},
{
"x": 12,
"y": 6,
"type": "rock"
},
{
"x": 12,
"y": 7,
"type": "rock"
},
{
"x": 12,
"y": 8,
"type": "rock"
},
{
"x": 12,
"y": 9,
"type": "rock"
},
{
"x": 12,
"y": 10,
"type": "rock"
},
{
"x": 12,
"y": 11,
"type": "rock"
},
{
"x": 10,
"y": 13,
"type": "rock"
},
{
"x": 13,
"y": 9,
"type": "rock"
},
{
"x": 4,
"y": 7,
"type": "rock"
},
{
"x": 7,
"y": 13,
"type": "rock"
},
{
"x": 5,
"y": 9,
"type": "rock"
},
{
"x": 7,
"y": 12,
"type": "rock"
},
{
"x": 7,
"y": 7,
"type": "rock"
},
{
"x": 1,
"y": 7,
"type": "rock"
},
{
"x": 8,
"y": 7,
"type": "rock"
},
{
"x": 11,
"y": 11,
"type": "rock"
},
{
"x": 1,
"y": 11,
"type": "lava"
},
{
"x": 10,
"y": 7,
"type": "lava"
},
{
"x": 1,
"y": 4,
"type": "lava"
},
{
"x": 10,
"y": 5,
"type": "lava"
},
{
"x": 4,
"y": 6,
"type": "lava"
},
{
"x": 7,
"y": 10,
"type": "hot_coals"
},
{
"x": 14,
"y": 13,
"type": "hot_coals"
},
{
"x": 11,
"y": 13,
"type": "hot_coals"
},
{
"x": 13,
"y": 1,
"type": "hot_coals"
}
],
"warps": [],
"thinIceTiles": [],
"pushableRocks": [
{
"x": 5,
"y": 4
},
{
"x": 11,
"y": 6
}
],
"pressurePlate": null,
"barrier": null
}
},
{
"levelNumber": 11,
"id": "level_11",
"name": "Plate and Gate",
"difficulty": "hard",
"par": 19,
"shortestMoves": 19,
"mechanics": [
"rocks",
"lava",
"hot_coals",
"pressure_gate"
],
"solution": [
"up",
"up",
"right",
"up",
"left",
"down",
"right",
"down",
"left",
"up",
"right",
"down",
"left",
"up",
"right",
"up",
"left",
"up",
"right"
],
"hardnessDrivers": [
"Pressure plate / barrier ordering constraint",
"Hazards around activation path"
],
"designTakeaway": "Gate puzzles should require explicit precondition setup before goal approach is legal.",
"puzzleData": {
"id": "level_11",
"name": "Plate and Gate",
"theme": "calgary",
"width": 16,
"height": 15,
"par": 19,
"start": {
"x": 1,
"y": 13
},
"goal": {
"x": 14,
"y": 1
},
"obstacles": [
{
"x": 3,
"y": 1,
"type": "rock"
},
{
"x": 3,
"y": 2,
"type": "rock"
},
{
"x": 3,
"y": 3,
"type": "rock"
},
{
"x": 3,
"y": 4,
"type": "rock"
},
{
"x": 3,
"y": 6,
"type": "rock"
},
{
"x": 3,
"y": 7,
"type": "rock"
},
{
"x": 3,
"y": 10,
"type": "rock"
},
{
"x": 3,
"y": 11,
"type": "rock"
},
{
"x": 3,
"y": 12,
"type": "rock"
},
{
"x": 3,
"y": 13,
"type": "rock"
},
{
"x": 6,
"y": 2,
"type": "rock"
},
{
"x": 6,
"y": 3,
"type": "rock"
},
{
"x": 6,
"y": 4,
"type": "rock"
},
{
"x": 6,
"y": 5,
"type": "rock"
},
{
"x": 6,
"y": 6,
"type": "rock"
},
{
"x": 6,
"y": 7,
"type": "rock"
},
{
"x": 6,
"y": 9,
"type": "rock"
},
{
"x": 6,
"y": 10,
"type": "rock"
},
{
"x": 6,
"y": 11,
"type": "rock"
},
{
"x": 6,
"y": 12,
"type": "rock"
},
{
"x": 6,
"y": 13,
"type": "rock"
},
{
"x": 9,
"y": 1,
"type": "rock"
},
{
"x": 9,
"y": 2,
"type": "rock"
},
{
"x": 9,
"y": 3,
"type": "rock"
},
{
"x": 9,
"y": 4,
"type": "rock"
},
{
"x": 9,
"y": 5,
"type": "rock"
},
{
"x": 9,
"y": 6,
"type": "rock"
},
{
"x": 9,
"y": 8,
"type": "rock"
},
{
"x": 9,
"y": 9,
"type": "rock"
},
{
"x": 9,
"y": 11,
"type": "rock"
},
{
"x": 9,
"y": 12,
"type": "rock"
},
{
"x": 9,
"y": 13,
"type": "rock"
},
{
"x": 12,
"y": 2,
"type": "rock"
},
{
"x": 12,
"y": 3,
"type": "rock"
},
{
"x": 12,
"y": 4,
"type": "rock"
},
{
"x": 12,
"y": 5,
"type": "rock"
},
{
"x": 12,
"y": 6,
"type": "rock"
},
{
"x": 12,
"y": 7,
"type": "rock"
},
{
"x": 12,
"y": 8,
"type": "rock"
},
{
"x": 12,
"y": 10,
"type": "rock"
},
{
"x": 12,
"y": 12,
"type": "rock"
},
{
"x": 12,
"y": 13,
"type": "rock"
},
{
"x": 5,
"y": 1,
"type": "rock"
},
{
"x": 11,
"y": 2,
"type": "rock"
},
{
"x": 5,
"y": 2,
"type": "rock"
},
{
"x": 4,
"y": 3,
"type": "rock"
},
{
"x": 13,
"y": 5,
"type": "rock"
},
{
"x": 1,
"y": 6,
"type": "rock"
},
{
"x": 13,
"y": 2,
"type": "rock"
},
{
"x": 4,
"y": 7,
"type": "rock"
},
{
"x": 2,
"y": 11,
"type": "lava"
},
{
"x": 10,
"y": 12,
"type": "lava"
},
{
"x": 13,
"y": 10,
"type": "lava"
},
{
"x": 13,
"y": 9,
"type": "lava"
},
{
"x": 10,
"y": 8,
"type": "lava"
},
{
"x": 7,
"y": 7,
"type": "hot_coals"
},
{
"x": 1,
"y": 10,
"type": "hot_coals"
},
{
"x": 5,
"y": 12,
"type": "hot_coals"
}
],
"warps": [],
"thinIceTiles": [],
"pushableRocks": [],
"pressurePlate": {
"x": 1,
"y": 9
},
"barrier": {
"x": 9,
"y": 7
}
}
},
{
"levelNumber": 12,
"id": "level_12",
"name": "Gated Pushworks",
"difficulty": "hard",
"par": 21,
"shortestMoves": 21,
"mechanics": [
"rocks",
"lava",
"hot_coals",
"pushable_rocks",
"pressure_gate"
],
"solution": [
"up",
"right",
"down",
"left",
"up",
"right",
"down",
"down",
"right",
"up",
"left",
"down",
"right",
"up",
"left",
"down",
"down",
"down",
"right",
"up",
"up"
],
"hardnessDrivers": [
"Combines push + plate/barrier in long solve",
"Multiple failure points across mechanic transitions"
],
"designTakeaway": "Combo levels should test mechanic handoff accuracy, not just each mechanic in isolation.",
"puzzleData": {
"id": "level_12",
"name": "Gated Pushworks",
"theme": "calgary",
"width": 16,
"height": 15,
"par": 21,
"start": {
"x": 1,
"y": 13
},
"goal": {
"x": 14,
"y": 1
},
"obstacles": [
{
"x": 3,
"y": 2,
"type": "rock"
},
{
"x": 3,
"y": 3,
"type": "rock"
},
{
"x": 3,
"y": 4,
"type": "rock"
},
{
"x": 3,
"y": 5,
"type": "rock"
},
{
"x": 3,
"y": 6,
"type": "rock"
},
{
"x": 3,
"y": 7,
"type": "rock"
},
{
"x": 3,
"y": 8,
"type": "rock"
},
{
"x": 3,
"y": 9,
"type": "rock"
},
{
"x": 3,
"y": 11,
"type": "rock"
},
{
"x": 3,
"y": 12,
"type": "rock"
},
{
"x": 3,
"y": 13,
"type": "rock"
},
{
"x": 6,
"y": 1,
"type": "rock"
},
{
"x": 6,
"y": 2,
"type": "rock"
},
{
"x": 6,
"y": 3,
"type": "rock"
},
{
"x": 6,
"y": 4,
"type": "rock"
},
{
"x": 6,
"y": 5,
"type": "rock"
},
{
"x": 6,
"y": 6,
"type": "rock"
},
{
"x": 6,
"y": 7,
"type": "rock"
},
{
"x": 6,
"y": 8,
"type": "rock"
},
{
"x": 6,
"y": 9,
"type": "rock"
},
{
"x": 6,
"y": 10,
"type": "rock"
},
{
"x": 6,
"y": 12,
"type": "rock"
},
{
"x": 9,
"y": 1,
"type": "rock"
},
{
"x": 9,
"y": 2,
"type": "rock"
},
{
"x": 9,
"y": 3,
"type": "rock"
},
{
"x": 9,
"y": 4,
"type": "rock"
},
{
"x": 9,
"y": 6,
"type": "rock"
},
{
"x": 9,
"y": 7,
"type": "rock"
},
{
"x": 9,
"y": 8,
"type": "rock"
},
{
"x": 9,
"y": 9,
"type": "rock"
},
{
"x": 9,
"y": 10,
"type": "rock"
},
{
"x": 9,
"y": 11,
"type": "rock"
},
{
"x": 9,
"y": 13,
"type": "rock"
},
{
"x": 12,
"y": 2,
"type": "rock"
},
{
"x": 12,
"y": 3,
"type": "rock"
},
{
"x": 12,
"y": 4,
"type": "rock"
},
{
"x": 12,
"y": 5,
"type": "rock"
},
{
"x": 12,
"y": 6,
"type": "rock"
},
{
"x": 12,
"y": 7,
"type": "rock"
},
{
"x": 12,
"y": 8,
"type": "rock"
},
{
"x": 12,
"y": 9,
"type": "rock"
},
{
"x": 12,
"y": 10,
"type": "rock"
},
{
"x": 12,
"y": 12,
"type": "rock"
},
{
"x": 11,
"y": 10,
"type": "rock"
},
{
"x": 2,
"y": 13,
"type": "rock"
},
{
"x": 10,
"y": 3,
"type": "rock"
},
{
"x": 10,
"y": 1,
"type": "rock"
},
{
"x": 8,
"y": 1,
"type": "rock"
},
{
"x": 7,
"y": 6,
"type": "rock"
},
{
"x": 12,
"y": 13,
"type": "rock"
},
{
"x": 10,
"y": 13,
"type": "lava"
},
{
"x": 13,
"y": 6,
"type": "lava"
},
{
"x": 4,
"y": 12,
"type": "lava"
},
{
"x": 2,
"y": 11,
"type": "lava"
},
{
"x": 13,
"y": 12,
"type": "lava"
},
{
"x": 11,
"y": 7,
"type": "lava"
},
{
"x": 14,
"y": 2,
"type": "hot_coals"
},
{
"x": 5,
"y": 9,
"type": "hot_coals"
},
{
"x": 2,
"y": 12,
"type": "hot_coals"
}
],
"warps": [],
"thinIceTiles": [],
"pushableRocks": [
{
"x": 11,
"y": 3
},
{
"x": 10,
"y": 10
}
],
"pressurePlate": {
"x": 4,
"y": 3
},
"barrier": {
"x": 12,
"y": 11
}
}
}
];
export function getCampaignExamplesByDifficulty(difficulty?: ExampleDifficulty): CampaignLevelExample[] {
if (!difficulty) return CAMPAIGN_LEVEL_EXAMPLES;
return CAMPAIGN_LEVEL_EXAMPLES.filter((example) => example.difficulty === difficulty);
}
export function getCampaignExample(levelNumber?: number, levelId?: string): CampaignLevelExample | undefined {
if (typeof levelNumber === 'number') {
return CAMPAIGN_LEVEL_EXAMPLES.find((example) => example.levelNumber === levelNumber);
}
if (levelId) {
return CAMPAIGN_LEVEL_EXAMPLES.find((example) => example.id === levelId);
}
return undefined;
}