Added a bunch of puzzles

This commit is contained in:
Brian Fertig 2026-04-05 13:33:33 -06:00
parent cba680c44d
commit 61d49eab57
74 changed files with 462 additions and 24 deletions

13
assets/images/prep/rename.sh Executable file
View File

@ -0,0 +1,13 @@
#!/bin/bash
# Rename all .png files in this directory to lowercase with underscores replacing spaces.
cd "$(dirname "$0")" || exit 1
for f in *.png; do
[ -f "$f" ] || continue
newname=$(echo "$f" | tr '[:upper:]' '[:lower:]' | tr ' ' '_')
if [ "$f" != "$newname" ]; then
mv "$f" "$newname"
echo "Renamed: $f -> $newname"
fi
done

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 MiB

View File

@ -0,0 +1,75 @@
#!/bin/bash
# Regenerates assets/puzzles.json and assets/thumbnails.json from the
# images in assets/images/puzzles/.
#
# Conventions:
# Full image: assets/images/puzzles/<name>.png
# Thumbnail: assets/images/puzzles/thumb_<name>.png
# Puzzle key: puzzle_<name> (hyphens replaced with underscores)
# Thumb key: thumb_<name> (hyphens replaced with underscores)
# Label: title-cased from <name>, underscores/hyphens → spaces
#
# Usage: cd <repo-root> && bash assets/images/puzzles/sync_json.sh
set -euo pipefail
cd "$(git rev-parse --show-toplevel)"
PUZZLE_DIR="assets/images/puzzles"
PUZZLES_JSON="assets/puzzles.json"
THUMBS_JSON="assets/thumbnails.json"
puzzles="["
thumbs="["
first=true
for img in "$PUZZLE_DIR"/*.png; do
base=$(basename "$img" .png)
# Skip thumbnails, scripts
[[ "$base" == thumb_* ]] && continue
[[ "$base" == *.sh ]] && continue
# Derive keys (replace hyphens with underscores for keys)
safe="${base//-/_}"
puzzle_key="puzzle_${safe}"
thumb_key="thumb_${safe}"
thumb_file="$PUZZLE_DIR/thumb_${base}.png"
# Skip if no matching thumbnail
if [ ! -f "$thumb_file" ]; then
echo "WARNING: No thumbnail for $base — skipping"
continue
fi
# Build label: replace underscores/hyphens with spaces, then title-case
label=$(echo "$base" | sed 's/[_-]/ /g' | sed 's/\b\(.\)/\u\1/g')
sep=""
$first || sep=","
first=false
puzzles+="${sep}
{
\"key\": \"${puzzle_key}\",
\"path\": \"${PUZZLE_DIR}/${base}.png\",
\"label\": \"${label}\"
}"
thumbs+="${sep}
{
\"key\": \"${thumb_key}\",
\"path\": \"${PUZZLE_DIR}/thumb_${base}.png\",
\"puzzleKey\": \"${puzzle_key}\"
}"
done
puzzles+="
]"
thumbs+="
]"
echo "$puzzles" > "$PUZZLES_JSON"
echo "$thumbs" > "$THUMBS_JSON"
echo "Updated $PUZZLES_JSON ($(grep -c '"key"' "$PUZZLES_JSON") entries)"
echo "Updated $THUMBS_JSON ($(grep -c '"key"' "$THUMBS_JSON") entries)"

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 306 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 467 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 320 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 200 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 302 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 407 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 268 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 402 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 349 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 276 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 325 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 326 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 318 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 347 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 262 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 267 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 236 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 216 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 260 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 285 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 304 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 406 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 321 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 311 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 286 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 248 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 298 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 405 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 284 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 327 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 229 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 302 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 335 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 359 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 378 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 MiB

View File

@ -1,46 +1,146 @@
[
{
"key": "puzzle_above_the_city",
"path": "assets/images/puzzles/above_the_city.png",
"label": "Above The City"
},
{
"key": "puzzle_abstract_highway",
"path": "assets/images/puzzles/abstract_highway.png",
"label": "Abstract Highway"
},
{
"key": "puzzle_alpine_mountains",
"path": "assets/images/puzzles/alpine_mountains.png",
"label": "Alpine Mountains"
},
{
"key": "puzzle_america",
"path": "assets/images/puzzles/america.png",
"label": "America"
},
{
"key": "puzzle_arctic_fox",
"path": "assets/images/puzzles/arctic_fox.png",
"label": "Arctic Fox"
},
{
"key": "puzzle_cartoon_land",
"path": "assets/images/puzzles/cartoon_land.png",
"label": "Cartoon Land"
},
{
"key": "puzzle_christmas_in_the_park",
"path": "assets/images/puzzles/christmas_in_the_park.png",
"label": "Christmas In The Park"
},
{
"key": "puzzle_combat_mech",
"path": "assets/images/puzzles/combat_mech.png",
"label": "Combat Mech"
},
{
"key": "puzzle_cottages_on_the_street",
"path": "assets/images/puzzles/cottages_on_the_street.png",
"label": "Cottages On The Street"
},
{
"key": "puzzle_dwarven_blacksmith",
"path": "assets/images/puzzles/dwarven_blacksmith.png",
"label": "Dwarven Blacksmith"
},
{
"key": "puzzle_dwarven_mining_village",
"path": "assets/images/puzzles/dwarven_mining_village.png",
"label": "Dwarven Mining Village"
},
{
"key": "puzzle_ferarri_in_the_driveway",
"path": "assets/images/puzzles/ferarri_in_the_driveway.png",
"label": "Ferarri In The Driveway"
},
{
"key": "puzzle_floating_castles",
"path": "assets/images/puzzles/floating_castles.png",
"label": "Floating Castles"
},
{
"key": "puzzle_floating_wizards_village",
"path": "assets/images/puzzles/floating_wizards_village.png",
"label": "Floating Wizards Village"
},
{
"key": "puzzle_four_seasons_2",
"path": "assets/images/puzzles/four_seasons_2.png",
"label": "Four Seasons 2"
},
{
"key": "puzzle_fruit_bowl",
"path": "assets/images/puzzles/fruit_bowl.png",
"label": "Fruit Bowl"
},
{
"key": "puzzle_fuzzy_halloween",
"path": "assets/images/puzzles/fuzzy_halloween.png",
"label": "Fuzzy Halloween"
},
{
"key": "puzzle_golden_in_the_mountains",
"path": "assets/images/puzzles/golden_in_the_mountains.png",
"label": "Golden in the Mountains"
"label": "Golden In The Mountains"
},
{
"key": "puzzle_good_vs_evil",
"path": "assets/images/puzzles/good_vs_evil.png",
"label": "Good vs Evil"
"label": "Good Vs Evil"
},
{
"key": "puzzle_growing_ea",
"path": "assets/images/puzzles/growing_ea.png",
"label": "Growing Computer Parts"
"label": "Growing Ea"
},
{
"key": "puzzle_guilin_landscape",
"path": "assets/images/puzzles/guilin_landscape.png",
"label": "Guilin Landscape"
},
{
"key": "puzzle_heavy_storm_in_the_city",
"path": "assets/images/puzzles/heavy_storm_in_the_city.png",
"label": "Heavy Storm In The City"
},
{
"key": "puzzle_home_sweet_home",
"path": "assets/images/puzzles/home_sweet_home.png",
"label": "Home Sweet Home"
},
{
"key": "puzzle_lone_ship",
"path": "assets/images/puzzles/lone_ship_in_the_seas.png",
"label": "Lone Ship on the Ocean"
"key": "puzzle_jeweled_frogs",
"path": "assets/images/puzzles/jeweled_frogs.png",
"label": "Jeweled Frogs"
},
{
"key": "puzzle_misty",
"key": "puzzle_jungle_macaw",
"path": "assets/images/puzzles/jungle_macaw.png",
"label": "Jungle Macaw"
},
{
"key": "puzzle_lake_treehouse",
"path": "assets/images/puzzles/lake_treehouse.png",
"label": "Lake Treehouse"
},
{
"key": "puzzle_lone_ship_in_the_seas",
"path": "assets/images/puzzles/lone_ship_in_the_seas.png",
"label": "Lone Ship In The Seas"
},
{
"key": "puzzle_mini_dennys",
"path": "assets/images/puzzles/mini-dennys.png",
"label": "Mini Dennys"
},
{
"key": "puzzle_misty_exploration",
"path": "assets/images/puzzles/misty_exploration.png",
"label": "Misty Exploration"
},
@ -49,29 +149,104 @@
"path": "assets/images/puzzles/model_village.png",
"label": "Model Village"
},
{
"key": "puzzle_moroccan_lounge",
"path": "assets/images/puzzles/moroccan_lounge.png",
"label": "Moroccan Lounge"
},
{
"key": "puzzle_mountain_blanket",
"path": "assets/images/puzzles/mountain_blanket.png",
"label": "Mountain Blanket"
},
{
"key": "puzzle_opulant_flowers",
"path": "assets/images/puzzles/opulant_flowers.png",
"label": "Opulant Flowers"
},
{
"key": "puzzle_robot_in_a_flavela",
"path": "assets/images/puzzles/robot_in_a_flavela.png",
"label": "Robot in a Favela"
"key": "puzzle_orc_and_the_undead",
"path": "assets/images/puzzles/orc_and_the_undead.png",
"label": "Orc And The Undead"
},
{
"key": "puzzle_disassembled_android",
"key": "puzzle_red_panda_in_the_bamboo_forest",
"path": "assets/images/puzzles/red_panda_in_the_bamboo_forest.png",
"label": "Red Panda In The Bamboo Forest"
},
{
"key": "puzzle_robot_in_a_flavela",
"path": "assets/images/puzzles/robot_in_a_flavela.png",
"label": "Robot In A Flavela"
},
{
"key": "puzzle_shanty_stack",
"path": "assets/images/puzzles/shanty_stack.png",
"label": "Shanty Stack"
},
{
"key": "puzzle_sleepy_golden",
"path": "assets/images/puzzles/sleepy_golden.png",
"label": "Sleepy Golden"
},
{
"key": "puzzle_technorhino",
"path": "assets/images/puzzles/technorhino.png",
"label": "Technorhino"
},
{
"key": "puzzle_the_beige_tree",
"path": "assets/images/puzzles/the_beige_tree.png",
"label": "The Beige Tree"
},
{
"key": "puzzle_the_disassembled_android",
"path": "assets/images/puzzles/the_disassembled_android.png",
"label": "The Disassembled Android"
},
{
"key": "puzzle_mandrill",
"key": "puzzle_the_old_w0rm",
"path": "assets/images/puzzles/the_old_w0rm.png",
"label": "The Old W0rm"
},
{
"key": "puzzle_the_swirl",
"path": "assets/images/puzzles/the_swirl.png",
"label": "The Swirl"
},
{
"key": "puzzle_thoughtful_mandrill",
"path": "assets/images/puzzles/thoughtful_mandrill.png",
"label": "Thoughtful Mandrill"
},
{
"key": "puzzle_tiger_in_bamboo_forest",
"path": "assets/images/puzzles/tiger_in_bamboo_forest.png",
"label": "Tiger In Bamboo Forest"
},
{
"key": "puzzle_tokyo_mech_2",
"path": "assets/images/puzzles/tokyo_mech_2.png",
"label": "Tokyo Mech 2"
},
{
"key": "puzzle_tune_the_news",
"path": "assets/images/puzzles/tune_the_news.png",
"label": "Tune The News"
},
{
"key": "puzzle_turtle_metropolis",
"path": "assets/images/puzzles/turtle_metropolis.png",
"label": "Turtle Metropolis"
},
{
"key": "puzzle_ultimate_tree_fort",
"path": "assets/images/puzzles/ultimate_tree_fort.png",
"label": "Ultimate Tree Fort"
},
{
"key": "puzzle_victorian_steampunk_rooftops",
"path": "assets/images/puzzles/victorian_steampunk_rooftops.png",
"label": "Victorian Steampunk Rooftops"
}
]
]

View File

@ -1,14 +1,89 @@
[
{
"key": "thumb_above_the_city",
"path": "assets/images/puzzles/thumb_above_the_city.png",
"puzzleKey": "puzzle_above_the_city"
},
{
"key": "thumb_abstract_highway",
"path": "assets/images/puzzles/thumb_abstract_highway.png",
"puzzleKey": "puzzle_abstract_highway"
},
{
"key": "thumb_alpine_mountains",
"path": "assets/images/puzzles/thumb_alpine_mountains.png",
"puzzleKey": "puzzle_alpine_mountains"
},
{
"key": "thumb_america",
"path": "assets/images/puzzles/thumb_america.png",
"puzzleKey": "puzzle_america"
},
{
"key": "thumb_arctic_fox",
"path": "assets/images/puzzles/thumb_arctic_fox.png",
"puzzleKey": "puzzle_arctic_fox"
},
{
"key": "thumb_cartoon_land",
"path": "assets/images/puzzles/thumb_cartoon_land.png",
"puzzleKey": "puzzle_cartoon_land"
},
{
"key": "thumb_christmas_in_the_park",
"path": "assets/images/puzzles/thumb_christmas_in_the_park.png",
"puzzleKey": "puzzle_christmas_in_the_park"
},
{
"key": "thumb_combat_mech",
"path": "assets/images/puzzles/thumb_combat_mech.png",
"puzzleKey": "puzzle_combat_mech"
},
{
"key": "thumb_cottages_on_the_street",
"path": "assets/images/puzzles/thumb_cottages_on_the_street.png",
"puzzleKey": "puzzle_cottages_on_the_street"
},
{
"key": "thumb_dwarven_blacksmith",
"path": "assets/images/puzzles/thumb_dwarven_blacksmith.png",
"puzzleKey": "puzzle_dwarven_blacksmith"
},
{
"key": "thumb_dwarven_mining_village",
"path": "assets/images/puzzles/thumb_dwarven_mining_village.png",
"puzzleKey": "puzzle_dwarven_mining_village"
},
{
"key": "thumb_ferarri_in_the_driveway",
"path": "assets/images/puzzles/thumb_ferarri_in_the_driveway.png",
"puzzleKey": "puzzle_ferarri_in_the_driveway"
},
{
"key": "thumb_floating_castles",
"path": "assets/images/puzzles/thumb_floating_castles.png",
"puzzleKey": "puzzle_floating_castles"
},
{
"key": "thumb_floating_wizards_village",
"path": "assets/images/puzzles/thumb_floating_wizards_village.png",
"puzzleKey": "puzzle_floating_wizards_village"
},
{
"key": "thumb_four_seasons_2",
"path": "assets/images/puzzles/thumb_four_seasons_2.png",
"puzzleKey": "puzzle_four_seasons_2"
},
{
"key": "thumb_fruit_bowl",
"path": "assets/images/puzzles/thumb_fruit_bowl.png",
"puzzleKey": "puzzle_fruit_bowl"
},
{
"key": "thumb_fuzzy_halloween",
"path": "assets/images/puzzles/thumb_fuzzy_halloween.png",
"puzzleKey": "puzzle_fuzzy_halloween"
},
{
"key": "thumb_golden_in_the_mountains",
"path": "assets/images/puzzles/thumb_golden_in_the_mountains.png",
@ -29,49 +104,149 @@
"path": "assets/images/puzzles/thumb_guilin_landscape.png",
"puzzleKey": "puzzle_guilin_landscape"
},
{
"key": "thumb_heavy_storm_in_the_city",
"path": "assets/images/puzzles/thumb_heavy_storm_in_the_city.png",
"puzzleKey": "puzzle_heavy_storm_in_the_city"
},
{
"key": "thumb_home_sweet_home",
"path": "assets/images/puzzles/thumb_home_sweet_home.png",
"puzzleKey": "puzzle_home_sweet_home"
},
{
"key": "thumb_lone_ship",
"path": "assets/images/puzzles/thumb_lone_ship_in_the_seas.png",
"puzzleKey": "puzzle_lone_ship"
"key": "thumb_jeweled_frogs",
"path": "assets/images/puzzles/thumb_jeweled_frogs.png",
"puzzleKey": "puzzle_jeweled_frogs"
},
{
"key": "thumb_misty",
"key": "thumb_jungle_macaw",
"path": "assets/images/puzzles/thumb_jungle_macaw.png",
"puzzleKey": "puzzle_jungle_macaw"
},
{
"key": "thumb_lake_treehouse",
"path": "assets/images/puzzles/thumb_lake_treehouse.png",
"puzzleKey": "puzzle_lake_treehouse"
},
{
"key": "thumb_lone_ship_in_the_seas",
"path": "assets/images/puzzles/thumb_lone_ship_in_the_seas.png",
"puzzleKey": "puzzle_lone_ship_in_the_seas"
},
{
"key": "thumb_mini_dennys",
"path": "assets/images/puzzles/thumb_mini-dennys.png",
"puzzleKey": "puzzle_mini_dennys"
},
{
"key": "thumb_misty_exploration",
"path": "assets/images/puzzles/thumb_misty_exploration.png",
"puzzleKey": "puzzle_misty"
"puzzleKey": "puzzle_misty_exploration"
},
{
"key": "thumb_model_village",
"path": "assets/images/puzzles/thumb_model_village.png",
"puzzleKey": "puzzle_model_village"
},
{
"key": "thumb_moroccan_lounge",
"path": "assets/images/puzzles/thumb_moroccan_lounge.png",
"puzzleKey": "puzzle_moroccan_lounge"
},
{
"key": "thumb_mountain_blanket",
"path": "assets/images/puzzles/thumb_mountain_blanket.png",
"puzzleKey": "puzzle_mountain_blanket"
},
{
"key": "thumb_opulant_flowers",
"path": "assets/images/puzzles/thumb_opulant_flowers.png",
"puzzleKey": "puzzle_opulant_flowers"
},
{
"key": "thumb_orc_and_the_undead",
"path": "assets/images/puzzles/thumb_orc_and_the_undead.png",
"puzzleKey": "puzzle_orc_and_the_undead"
},
{
"key": "thumb_red_panda_in_the_bamboo_forest",
"path": "assets/images/puzzles/thumb_red_panda_in_the_bamboo_forest.png",
"puzzleKey": "puzzle_red_panda_in_the_bamboo_forest"
},
{
"key": "thumb_robot_in_a_flavela",
"path": "assets/images/puzzles/thumb_robot_in_a_flavela.png",
"puzzleKey": "puzzle_robot_in_a_flavela"
},
{
"key": "thumb_disassembled_android",
"path": "assets/images/puzzles/thumb_the_disassembled_android.png",
"puzzleKey": "puzzle_disassembled_android"
"key": "thumb_shanty_stack",
"path": "assets/images/puzzles/thumb_shanty_stack.png",
"puzzleKey": "puzzle_shanty_stack"
},
{
"key": "thumb_mandrill",
"key": "thumb_sleepy_golden",
"path": "assets/images/puzzles/thumb_sleepy_golden.png",
"puzzleKey": "puzzle_sleepy_golden"
},
{
"key": "thumb_technorhino",
"path": "assets/images/puzzles/thumb_technorhino.png",
"puzzleKey": "puzzle_technorhino"
},
{
"key": "thumb_the_beige_tree",
"path": "assets/images/puzzles/thumb_the_beige_tree.png",
"puzzleKey": "puzzle_the_beige_tree"
},
{
"key": "thumb_the_disassembled_android",
"path": "assets/images/puzzles/thumb_the_disassembled_android.png",
"puzzleKey": "puzzle_the_disassembled_android"
},
{
"key": "thumb_the_old_w0rm",
"path": "assets/images/puzzles/thumb_the_old_w0rm.png",
"puzzleKey": "puzzle_the_old_w0rm"
},
{
"key": "thumb_the_swirl",
"path": "assets/images/puzzles/thumb_the_swirl.png",
"puzzleKey": "puzzle_the_swirl"
},
{
"key": "thumb_thoughtful_mandrill",
"path": "assets/images/puzzles/thumb_thoughtful_mandrill.png",
"puzzleKey": "puzzle_mandrill"
"puzzleKey": "puzzle_thoughtful_mandrill"
},
{
"key": "thumb_tiger_in_bamboo_forest",
"path": "assets/images/puzzles/thumb_tiger_in_bamboo_forest.png",
"puzzleKey": "puzzle_tiger_in_bamboo_forest"
},
{
"key": "thumb_tokyo_mech_2",
"path": "assets/images/puzzles/thumb_tokyo_mech_2.png",
"puzzleKey": "puzzle_tokyo_mech_2"
},
{
"key": "thumb_tune_the_news",
"path": "assets/images/puzzles/thumb_tune_the_news.png",
"puzzleKey": "puzzle_tune_the_news"
},
{
"key": "thumb_turtle_metropolis",
"path": "assets/images/puzzles/thumb_turtle_metropolis.png",
"puzzleKey": "puzzle_turtle_metropolis"
},
{
"key": "thumb_ultimate_tree_fort",
"path": "assets/images/puzzles/thumb_ultimate_tree_fort.png",
"puzzleKey": "puzzle_ultimate_tree_fort"
},
{
"key": "thumb_victorian_steampunk_rooftops",
"path": "assets/images/puzzles/thumb_victorian_steampunk_rooftops.png",
"puzzleKey": "puzzle_victorian_steampunk_rooftops"
}
]
]