summaryrefslogtreecommitdiff
path: root/apps/plugins/puzzles/src/icons
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins/puzzles/src/icons')
-rw-r--r--apps/plugins/puzzles/src/icons/Makefile153
-rw-r--r--apps/plugins/puzzles/src/icons/blackbox.sav27
-rw-r--r--apps/plugins/puzzles/src/icons/bridges.sav72
-rwxr-xr-xapps/plugins/puzzles/src/icons/cicon.pl27
-rwxr-xr-xapps/plugins/puzzles/src/icons/crop.sh37
-rw-r--r--apps/plugins/puzzles/src/icons/cube.sav22
-rw-r--r--apps/plugins/puzzles/src/icons/dominosa.sav53
-rw-r--r--apps/plugins/puzzles/src/icons/fifteen.sav74
-rw-r--r--apps/plugins/puzzles/src/icons/filling.sav38
-rw-r--r--apps/plugins/puzzles/src/icons/flip.sav20
-rw-r--r--apps/plugins/puzzles/src/icons/flood.sav14
-rw-r--r--apps/plugins/puzzles/src/icons/galaxies.sav51
-rw-r--r--apps/plugins/puzzles/src/icons/guess.sav15
-rwxr-xr-xapps/plugins/puzzles/src/icons/icon.pl270
-rw-r--r--apps/plugins/puzzles/src/icons/inertia.sav30
-rw-r--r--apps/plugins/puzzles/src/icons/keen.sav62
-rw-r--r--apps/plugins/puzzles/src/icons/lightup.sav24
-rw-r--r--apps/plugins/puzzles/src/icons/loopy.sav120
-rw-r--r--apps/plugins/puzzles/src/icons/magnets.sav33
-rw-r--r--apps/plugins/puzzles/src/icons/map.sav27
-rw-r--r--apps/plugins/puzzles/src/icons/mines.sav67
-rw-r--r--apps/plugins/puzzles/src/icons/net.sav53
-rw-r--r--apps/plugins/puzzles/src/icons/netslide.sav47
-rw-r--r--apps/plugins/puzzles/src/icons/palisade.sav50
-rw-r--r--apps/plugins/puzzles/src/icons/pattern.sav29
-rw-r--r--apps/plugins/puzzles/src/icons/pearl.sav23
-rw-r--r--apps/plugins/puzzles/src/icons/pegs.sav16
-rw-r--r--apps/plugins/puzzles/src/icons/range.sav36
-rw-r--r--apps/plugins/puzzles/src/icons/rect.sav17
-rw-r--r--apps/plugins/puzzles/src/icons/samegame.sav34
-rwxr-xr-xapps/plugins/puzzles/src/icons/screenshot.sh25
-rw-r--r--apps/plugins/puzzles/src/icons/signpost.sav23
-rw-r--r--apps/plugins/puzzles/src/icons/singles.sav45
-rw-r--r--apps/plugins/puzzles/src/icons/sixteen.sav39
-rw-r--r--apps/plugins/puzzles/src/icons/slant.sav51
-rw-r--r--apps/plugins/puzzles/src/icons/solo.sav36
-rwxr-xr-xapps/plugins/puzzles/src/icons/square.pl95
-rw-r--r--apps/plugins/puzzles/src/icons/tents.sav32
-rw-r--r--apps/plugins/puzzles/src/icons/towers.sav26
-rw-r--r--apps/plugins/puzzles/src/icons/tracks.sav31
-rw-r--r--apps/plugins/puzzles/src/icons/twiddle.sav35
-rw-r--r--apps/plugins/puzzles/src/icons/undead.sav14
-rw-r--r--apps/plugins/puzzles/src/icons/unequal.sav25
-rw-r--r--apps/plugins/puzzles/src/icons/unruly.sav22
-rw-r--r--apps/plugins/puzzles/src/icons/untangle.sav16
-rw-r--r--apps/plugins/puzzles/src/icons/win16pal.xpm23
46 files changed, 2079 insertions, 0 deletions
diff --git a/apps/plugins/puzzles/src/icons/Makefile b/apps/plugins/puzzles/src/icons/Makefile
new file mode 100644
index 0000000000..00dae1f841
--- /dev/null
+++ b/apps/plugins/puzzles/src/icons/Makefile
@@ -0,0 +1,153 @@
1# Makefile for Puzzles icons.
2
3PUZZLES = blackbox bridges cube dominosa fifteen filling flip flood \
4 galaxies guess inertia keen lightup loopy magnets map mines \
5 net netslide palisade pattern pearl pegs range rect \
6 samegame signpost singles sixteen slant solo tents towers \
7 twiddle tracks undead unequal unruly untangle
8
9BASE = $(patsubst %,%-base.png,$(PUZZLES))
10WEB = $(patsubst %,%-web.png,$(PUZZLES))
11
12IBASE = $(patsubst %,%-ibase.png,$(PUZZLES))
13IBASE4 = $(patsubst %,%-ibase4.png,$(PUZZLES))
14P48D24 = $(patsubst %,%-48d24.png,$(PUZZLES))
15P48D8 = $(patsubst %,%-48d8.png,$(PUZZLES))
16P48D4 = $(patsubst %,%-48d4.png,$(PUZZLES))
17P32D24 = $(patsubst %,%-32d24.png,$(PUZZLES))
18P32D8 = $(patsubst %,%-32d8.png,$(PUZZLES))
19P32D4 = $(patsubst %,%-32d4.png,$(PUZZLES))
20P16D24 = $(patsubst %,%-16d24.png,$(PUZZLES))
21P16D8 = $(patsubst %,%-16d8.png,$(PUZZLES))
22P16D4 = $(patsubst %,%-16d4.png,$(PUZZLES))
23ICONS = $(patsubst %,%.ico,$(PUZZLES))
24CICONS = $(patsubst %,%-icon.c,$(PUZZLES))
25RC = $(patsubst %,%.rc,$(PUZZLES))
26
27BIN = ../
28PIC = ./
29
30# Work around newer ImageMagick unilaterally distorting colours when
31# converting to PNG.
32CSP = -set colorspace RGB
33
34base: $(BASE)
35web: $(WEB)
36pngicons: $(P48D24) $(P32D24) $(P16D24)
37winicons: $(ICONS) $(RC)
38gtkicons: $(CICONS)
39all: base web pngicons winicons gtkicons
40
41# Build the base puzzle screenshots from which all the other images
42# are derived. Some of them involve showing a move animation
43# part-way through.
44fifteen-base.png : override REDO=0.3
45flip-base.png : override REDO=0.3
46netslide-base.png : override REDO=0.3
47sixteen-base.png : override REDO=0.3
48twiddle-base.png : override REDO=0.3
49$(BASE): %-base.png: $(BIN)% $(PIC)%.sav
50 $(PIC)screenshot.sh $(BIN)$* $(PIC)$*.sav $@ $(REDO)
51
52# Build the screenshots for the web, by scaling the original base
53# images to a uniform size.
54$(WEB): %-web.png: %-base.png
55 $(PIC)square.pl 150 5 $^ $@
56
57# Build the base _icon_ images, by careful cropping of the base
58# images: icons are very small so it's often necessary to zoom in
59# on a smaller portion of the screenshot.
60blackbox-ibase.png : override CROP=352x352 144x144+0+208
61bridges-ibase.png : override CROP=264x264 107x107+157+157
62dominosa-ibase.png : override CROP=304x272 152x152+152+0
63fifteen-ibase.png : override CROP=240x240 120x120+0+120
64filling-ibase.png : override CROP=256x256 133x133+14+78
65flip-ibase.png : override CROP=288x288 145x145+120+72
66galaxies-ibase.png : override CROP=288x288 165x165+0+0
67guess-ibase.png : override CROP=263x420 178x178+75+17
68inertia-ibase.png : override CROP=321x321 128x128+193+0
69keen-ibase.png : override CROP=288x288 96x96+24+120
70lightup-ibase.png : override CROP=256x256 112x112+144+0
71loopy-ibase.png : override CROP=257x257 113x113+0+0
72magnets-ibase.png : override CROP=264x232 96x96+36+100
73mines-ibase.png : override CROP=240x240 110x110+130+130
74net-ibase.png : override CROP=193x193 113x113+0+80
75netslide-ibase.png : override CROP=289x289 144x144+0+0
76palisade-ibase.png : override CROP=288x288 192x192+0+0
77pattern-ibase.png : override CROP=384x384 223x223+0+0
78pearl-ibase.png : override CROP=216x216 94x94+108+15
79pegs-ibase.png : override CROP=263x263 147x147+116+0
80range-ibase.png : override CROP=256x256 98x98+111+15
81rect-ibase.png : override CROP=205x205 115x115+90+0
82signpost-ibase.png : override CROP=240x240 98x98+23+23
83singles-ibase.png : override CROP=224x224 98x98+15+15
84sixteen-ibase.png : override CROP=288x288 144x144+144+144
85slant-ibase.png : override CROP=321x321 160x160+160+160
86solo-ibase.png : override CROP=481x481 145x145+24+24
87tents-ibase.png : override CROP=320x320 165x165+142+0
88towers-ibase.png : override CROP=300x300 102x102+151+6
89tracks-ibase.png : override CROP=246x246 118x118+6+6
90twiddle-ibase.png : override CROP=192x192 102x102+69+21
91undead-ibase.png : override CROP=416x480 192x192+16+80
92unequal-ibase.png : override CROP=208x208 104x104+104+104
93untangle-ibase.png : override CROP=320x320 164x164+3+116
94$(IBASE): %-ibase.png: %-base.png
95 $(PIC)crop.sh $^ $@ $(CROP)
96
97# Convert the full-size icon images to 4-bit colour, because that
98# seems to work better than reducing it in 24 bits and then
99# dithering.
100$(IBASE4): %-ibase4.png: %-ibase.png
101 convert -colors 16 +dither $(CSP) -map $(PIC)win16pal.xpm $^ $@
102
103# Build the 24-bit PNGs for the icons, at three sizes.
104$(P48D24): %-48d24.png: %-ibase.png
105 $(PIC)square.pl 48 4 $^ $@
106$(P32D24): %-32d24.png: %-ibase.png
107 $(PIC)square.pl 32 2 $^ $@
108$(P16D24): %-16d24.png: %-ibase.png
109 $(PIC)square.pl 16 1 $^ $@
110
111# The 8-bit icon PNGs are just custom-paletted quantisations of the
112# 24-bit ones.
113$(P48D8) $(P32D8) $(P16D8): %d8.png: %d24.png
114 convert -colors 256 $^ $@
115
116# But the depth-4 images work better if we re-shrink from the
117# ibase4 versions of the images, and then normalise the colours
118# again afterwards. (They're still not very good, but my hope is
119# that on most modern Windows machines this won't matter too
120# much...)
121$(P48D4): %-48d4.png: %-ibase4.png
122 $(PIC)square.pl 48 1 $^ $@-tmp2.png
123 convert -colors 16 $(CSP) -map $(PIC)win16pal.xpm $@-tmp2.png $@
124 rm -f $@-tmp2.png
125$(P32D4): %-32d4.png: %-ibase.png
126 $(PIC)square.pl 32 1 $^ $@-tmp2.png
127 convert -colors 16 $(CSP) -map $(PIC)win16pal.xpm $@-tmp2.png $@
128 rm -f $@-tmp2.png
129$(P16D4): %-16d4.png: %-ibase.png
130 $(PIC)square.pl 16 1 $^ $@-tmp2.png
131 convert -colors 16 $(CSP) -map $(PIC)win16pal.xpm $@-tmp2.png $@
132 rm -f $@-tmp2.png
133
134# Build the actual Windows icons themselves, by feeding all those
135# PNGs to my icon builder script.
136$(ICONS): %.ico: %-48d24.png %-48d8.png %-48d4.png \
137 %-32d24.png %-32d8.png %-32d4.png \
138 %-16d24.png %-16d8.png %-16d4.png
139 $(PIC)icon.pl -24 $*-48d24.png $*-32d24.png $*-16d24.png \
140 -8 $*-48d8.png $*-32d8.png $*-16d8.png \
141 -4 $*-48d4.png $*-32d4.png $*-16d4.png > $@
142
143# Build the .RC files which bind the icons into the applications.
144$(RC): %.rc:
145 echo '#include "puzzles.rc2"' > $@
146 echo '200 ICON "$*.ico"' >> $@
147
148# Build the GTK icon source files.
149$(CICONS): %-icon.c: %-16d24.png %-32d24.png %-48d24.png
150 $(PIC)cicon.pl $^ > $@
151
152clean:
153 rm -f *.png *.ico *.rc *-icon.c
diff --git a/apps/plugins/puzzles/src/icons/blackbox.sav b/apps/plugins/puzzles/src/icons/blackbox.sav
new file mode 100644
index 0000000000..4483f3c81a
--- /dev/null
+++ b/apps/plugins/puzzles/src/icons/blackbox.sav
@@ -0,0 +1,27 @@
1SAVEFILE:41:Simon Tatham's Portable Puzzle Collection
2VERSION :1:1
3GAME :9:Black Box
4PARAMS :8:w8h8m5M5
5CPARAMS :8:w8h8m5M5
6SEED :15:999785320716678
7DESC :24:c8b9f8528193756b9a2fd24d
8UI :2:E0
9NSTATES :2:18
10STATEPOS:2:13
11MOVE :2:F2
12MOVE :2:F4
13MOVE :2:F5
14MOVE :3:F25
15MOVE :3:F26
16MOVE :3:F11
17MOVE :3:F12
18MOVE :3:F15
19MOVE :4:T7,7
20MOVE :4:T7,4
21MOVE :4:T1,7
22MOVE :2:F3
23MOVE :2:F9
24MOVE :3:F27
25MOVE :4:T5,7
26MOVE :4:T1,8
27MOVE :1:R
diff --git a/apps/plugins/puzzles/src/icons/bridges.sav b/apps/plugins/puzzles/src/icons/bridges.sav
new file mode 100644
index 0000000000..ddae7085cd
--- /dev/null
+++ b/apps/plugins/puzzles/src/icons/bridges.sav
@@ -0,0 +1,72 @@
1SAVEFILE:41:Simon Tatham's Portable Puzzle Collection
2VERSION :1:1
3GAME :7:Bridges
4PARAMS :15:10x10i30e10m2d2
5CPARAMS :15:10x10i30e10m2d2
6SEED :15:944199396008454
7DESC :49:a1a4a4b4k4b6b2a4b2b2b1e2e1a4b4c3j25d2a1f2c3a4d4c3
8AUXINFO :838:bd75eb5f7b129109b5cdcff0925c77ca5c0a135365002b93b44c5013c7a307b9504affcfb8ad934263196fc3e6d0b023abe48d254d46d29520e50a5e423c0fb1bc01ccc51cad61045c439e7c2bb8e5788bc7f3622aaa3a8125ebde11c9cd69b6f2393246fd094ad91e81ae58cd557b73bd1c9839cfad5835c8519e44298204eaca58dfd79289546959bfbabdc5f3cb7a27b8d3fb2d0b062bd5c2e469493c19f8c89989df73d8a3ab02d9afcbfedf245306d15881a01d153122f8374c7526abecc90919f99ff62e9789cabc402249af095ceb14c8c59c0d9ffbcdd731d50114e7c30c31ef0638f4d352abbfd04b4315d368d65bbfe005b6586245bc5244e5050098cf4c1b6986120f40d5ce038c10a3f309286f950cdc287e495aa13c70ab0c1f113a135556d7ce895fd8244afcbad43fe51f275837f223a1cb95151de8a158cb0add7fa8c9f1fa0e09a1ce842136c1679144cead56b164c4ef1a09ed36fd9704ba191b5957bc3d5bb97d8a1f7451d357a6638ac320b0beb0cd35aa404c8f1621c6d400960aa97bf6ce3a944339d7e401c4d98c31773b2a8881352d5653fdb5e8f7c04b
9NSTATES :2:63
10STATEPOS:2:41
11MOVE :10:L8,0,5,0,1
12MOVE :10:L8,0,5,0,2
13MOVE :10:L8,0,8,2,1
14MOVE :10:L8,0,8,2,2
15MOVE :4:M8,0
16MOVE :10:L0,2,3,2,1
17MOVE :10:L0,2,3,2,2
18MOVE :10:L0,2,0,7,1
19MOVE :10:L0,2,0,7,2
20MOVE :4:M0,2
21MOVE :10:L1,0,3,0,1
22MOVE :4:M1,0
23MOVE :10:L3,0,5,0,1
24MOVE :10:L3,0,3,2,1
25MOVE :10:L1,3,1,5,1
26MOVE :10:L0,7,5,7,1
27MOVE :10:L0,7,0,9,1
28MOVE :10:L0,9,5,9,1
29MOVE :10:L0,9,5,9,2
30MOVE :10:L0,9,0,7,2
31MOVE :4:M0,9
32MOVE :4:M0,7
33MOVE :10:L4,8,8,8,1
34MOVE :10:L4,8,8,8,2
35MOVE :4:M4,8
36MOVE :10:L5,9,9,9,1
37MOVE :10:L5,9,9,9,2
38MOVE :4:M5,9
39MOVE :10:L9,9,9,6,1
40MOVE :4:M9,9
41MOVE :10:L8,8,8,5,1
42MOVE :4:M8,8
43MOVE :10:L9,6,9,4,1
44MOVE :4:M9,6
45MOVE :4:M9,4
46MOVE :10:L1,5,4,5,1
47MOVE :10:L1,5,4,5,2
48MOVE :10:L1,5,1,3,2
49MOVE :4:M1,3
50MOVE :4:M1,5
51MOVE :10:L3,4,3,2,1
52MOVE :10:L3,4,3,2,2
53MOVE :4:M3,4
54MOVE :10:L4,5,8,5,1
55MOVE :10:L7,7,5,7,1
56MOVE :4:M5,7
57MOVE :4:M7,7
58MOVE :10:L7,3,4,3,1
59MOVE :4:M7,3
60MOVE :10:L5,0,3,0,2
61MOVE :4:M5,0
62MOVE :4:M3,0
63MOVE :10:L3,2,6,2,1
64MOVE :4:M3,2
65MOVE :10:L6,2,8,2,1
66MOVE :4:M6,2
67MOVE :10:L8,2,8,5,1
68MOVE :4:M8,2
69MOVE :4:M8,5
70MOVE :10:L4,5,4,3,1
71MOVE :4:M4,3
72MOVE :4:M4,5
diff --git a/apps/plugins/puzzles/src/icons/cicon.pl b/apps/plugins/puzzles/src/icons/cicon.pl
new file mode 100755
index 0000000000..3578bd33fe
--- /dev/null
+++ b/apps/plugins/puzzles/src/icons/cicon.pl
@@ -0,0 +1,27 @@
1#!/usr/bin/perl
2
3# Given a list of input PNGs, create a C source file file
4# containing a const array of XPMs, under the name `xpm_icon'.
5
6$k = 0;
7@xpms = ();
8foreach $f (@ARGV) {
9 # XPM format is generated directly by ImageMagick, so that's easy
10 # enough. We just have to adjust the declaration line so that it
11 # has the right name, linkage and storage class.
12 @lines = ();
13 open XPM, "convert $f xpm:- |";
14 push @lines, $_ while <XPM>;
15 close XPM;
16 die "XPM from $f in unexpected format\n" unless $lines[1] =~ /^static.*\{$/;
17 $lines[1] = "static const char *const xpm_icon_$k"."[] = {\n";
18 $k++;
19 push @xpms, @lines, "\n";
20}
21
22# Now output.
23foreach $line (@xpms) { print $line; }
24print "const char *const *const xpm_icons[] = {\n";
25for ($i = 0; $i < $k; $i++) { print " xpm_icon_$i,\n"; }
26print "};\n";
27print "const int n_xpm_icons = $k;\n";
diff --git a/apps/plugins/puzzles/src/icons/crop.sh b/apps/plugins/puzzles/src/icons/crop.sh
new file mode 100755
index 0000000000..0d15d3c9b9
--- /dev/null
+++ b/apps/plugins/puzzles/src/icons/crop.sh
@@ -0,0 +1,37 @@
1#!/bin/sh
2
3# Crop one image into another, after first checking that the source
4# image has the expected size in pixels.
5#
6# This is used in the Puzzles icon build scripts to construct icons
7# which are zoomed in on a particular sub-area of the puzzle's
8# basic screenshot. This way I can define crop areas in pixels,
9# while not having to worry too much that if I adjust the source
10# puzzle so as to alter the layout the crop area might start
11# hitting the wrong bit of picture. Most layout changes I can
12# conveniently imagine will also alter the overall image size, so
13# this script will give a build error and alert me to the fact that
14# I need to fiddle with the icon makefile.
15
16infile="$1"
17outfile="$2"
18insize="$3"
19crop="$4"
20
21# Special case: if no input size or crop parameter was specified at
22# all, we just copy the input to the output file.
23
24if test $# -lt 3; then
25 cp "$infile" "$outfile"
26 exit 0
27fi
28
29# Check the input image size.
30realsize=`identify -format %wx%h "$infile"`
31if test "x$insize" != "x$realsize"; then
32 echo "crop.sh: '$infile' has wrong initial size: $realsize != $insize" >&2
33 exit 1
34fi
35
36# And crop.
37convert -crop "$crop" "$infile" "$outfile"
diff --git a/apps/plugins/puzzles/src/icons/cube.sav b/apps/plugins/puzzles/src/icons/cube.sav
new file mode 100644
index 0000000000..bb123f4e74
--- /dev/null
+++ b/apps/plugins/puzzles/src/icons/cube.sav
@@ -0,0 +1,22 @@
1SAVEFILE:41:Simon Tatham's Portable Puzzle Collection
2VERSION :1:1
3GAME :4:Cube
4PARAMS :4:c4x4
5CPARAMS :4:c4x4
6SEED :15:125146248070163
7DESC :6:C461,3
8NSTATES :2:14
9STATEPOS:1:5
10MOVE :1:D
11MOVE :1:D
12MOVE :1:D
13MOVE :1:U
14MOVE :1:L
15MOVE :1:L
16MOVE :1:D
17MOVE :1:U
18MOVE :1:D
19MOVE :1:U
20MOVE :1:U
21MOVE :1:U
22MOVE :1:L
diff --git a/apps/plugins/puzzles/src/icons/dominosa.sav b/apps/plugins/puzzles/src/icons/dominosa.sav
new file mode 100644
index 0000000000..5991f3e57e
--- /dev/null
+++ b/apps/plugins/puzzles/src/icons/dominosa.sav
@@ -0,0 +1,53 @@
1SAVEFILE:41:Simon Tatham's Portable Puzzle Collection
2VERSION :1:1
3GAME :8:Dominosa
4PARAMS :1:6
5CPARAMS :1:6
6DESC :56:55521461210004364611033535444421636022603153156422620503
7NSTATES :2:46
8STATEPOS:2:33
9MOVE :6:D18,19
10MOVE :6:E22,23
11MOVE :6:E22,30
12MOVE :5:E9,17
13MOVE :6:D38,46
14MOVE :6:E14,15
15MOVE :5:E6,14
16MOVE :6:E33,34
17MOVE :6:E34,42
18MOVE :6:E26,34
19MOVE :6:D34,35
20MOVE :6:E42,50
21MOVE :6:E16,24
22MOVE :4:D4,5
23MOVE :4:D6,7
24MOVE :6:D15,23
25MOVE :6:E17,25
26MOVE :6:D16,17
27MOVE :6:E11,12
28MOVE :6:D51,52
29MOVE :5:E3,11
30MOVE :6:D10,11
31MOVE :4:D2,3
32MOVE :6:E37,45
33MOVE :6:D49,50
34MOVE :6:D40,48
35MOVE :6:D25,26
36MOVE :6:D24,32
37MOVE :6:D33,41
38MOVE :6:D42,43
39MOVE :6:D27,28
40MOVE :6:E21,29
41MOVE :6:D31,39
42MOVE :6:D47,55
43MOVE :6:E13,21
44MOVE :6:E13,14
45MOVE :6:D12,13
46MOVE :6:D20,21
47MOVE :6:D14,22
48MOVE :6:D29,30
49MOVE :6:D36,37
50MOVE :6:D44,45
51MOVE :6:D53,54
52MOVE :4:D0,1
53MOVE :4:D8,9
diff --git a/apps/plugins/puzzles/src/icons/fifteen.sav b/apps/plugins/puzzles/src/icons/fifteen.sav
new file mode 100644
index 0000000000..d81345a7d8
--- /dev/null
+++ b/apps/plugins/puzzles/src/icons/fifteen.sav
@@ -0,0 +1,74 @@
1SAVEFILE:41:Simon Tatham's Portable Puzzle Collection
2VERSION :1:1
3GAME :7:Fifteen
4PARAMS :3:4x4
5CPARAMS :3:4x4
6SEED :15:307905346810973
7DESC :37:8,11,3,6,14,13,4,2,0,9,12,10,5,1,7,15
8NSTATES :2:66
9STATEPOS:2:47
10MOVE :4:M1,2
11MOVE :4:M1,3
12MOVE :4:M0,3
13MOVE :4:M0,1
14MOVE :4:M1,1
15MOVE :4:M1,2
16MOVE :4:M0,2
17MOVE :4:M0,0
18MOVE :4:M1,0
19MOVE :4:M1,1
20MOVE :4:M0,1
21MOVE :4:M0,0
22MOVE :4:M1,0
23MOVE :4:M3,0
24MOVE :4:M3,1
25MOVE :4:M1,1
26MOVE :4:M1,0
27MOVE :4:M3,0
28MOVE :4:M3,1
29MOVE :4:M1,1
30MOVE :4:M1,0
31MOVE :4:M2,0
32MOVE :4:M2,1
33MOVE :4:M1,1
34MOVE :4:M1,3
35MOVE :4:M0,3
36MOVE :4:M0,1
37MOVE :4:M1,1
38MOVE :4:M1,2
39MOVE :4:M0,2
40MOVE :4:M0,1
41MOVE :4:M2,1
42MOVE :4:M3,1
43MOVE :4:M3,2
44MOVE :4:M2,2
45MOVE :4:M2,3
46MOVE :4:M3,3
47MOVE :4:M3,1
48MOVE :4:M2,1
49MOVE :4:M2,2
50MOVE :4:M1,2
51MOVE :4:M1,3
52MOVE :4:M2,3
53MOVE :4:M2,2
54MOVE :4:M1,2
55MOVE :4:M0,2
56MOVE :4:M0,3
57MOVE :4:M1,3
58MOVE :4:M1,2
59MOVE :4:M2,2
60MOVE :4:M2,3
61MOVE :4:M0,3
62MOVE :4:M0,2
63MOVE :4:M1,2
64MOVE :4:M2,2
65MOVE :4:M2,3
66MOVE :4:M1,3
67MOVE :4:M1,2
68MOVE :4:M3,2
69MOVE :4:M3,3
70MOVE :4:M1,3
71MOVE :4:M1,2
72MOVE :4:M2,2
73MOVE :4:M2,3
74MOVE :4:M3,3
diff --git a/apps/plugins/puzzles/src/icons/filling.sav b/apps/plugins/puzzles/src/icons/filling.sav
new file mode 100644
index 0000000000..caf0bb2d4c
--- /dev/null
+++ b/apps/plugins/puzzles/src/icons/filling.sav
@@ -0,0 +1,38 @@
1SAVEFILE:41:Simon Tatham's Portable Puzzle Collection
2VERSION :1:1
3GAME :7:Filling
4PARAMS :3:7x7
5CPARAMS :3:7x7
6SEED :15:279172739852696
7DESC :49:0000000031051240010004000001106171000400001013105
8NSTATES :2:30
9STATEPOS:2:13
10MOVE :4:38_3
11MOVE :4:39_3
12MOVE :4:36_4
13MOVE :4:43_4
14MOVE :4:35_4
15MOVE :4:47_5
16MOVE :4:40_5
17MOVE :4:34_5
18MOVE :4:41_5
19MOVE :4:25_7
20MOVE :4:23_6
21MOVE :4:16_6
22MOVE :4:18_7
23MOVE :4:19_7
24MOVE :4:20_7
25MOVE :4:26_7
26MOVE :4:24_7
27MOVE :4:29_6
28MOVE :4:22_6
29MOVE :4:15_6
30MOVE :3:7_4
31MOVE :3:0_4
32MOVE :3:1_3
33MOVE :3:2_3
34MOVE :3:6_2
35MOVE :3:5_5
36MOVE :3:4_5
37MOVE :3:3_5
38MOVE :4:10_5
diff --git a/apps/plugins/puzzles/src/icons/flip.sav b/apps/plugins/puzzles/src/icons/flip.sav
new file mode 100644
index 0000000000..82b4c49357
--- /dev/null
+++ b/apps/plugins/puzzles/src/icons/flip.sav
@@ -0,0 +1,20 @@
1SAVEFILE:41:Simon Tatham's Portable Puzzle Collection
2VERSION :1:1
3GAME :4:Flip
4PARAMS :4:5x5c
5CPARAMS :4:5x5c
6SEED :15:158897339725978
7DESC :165:c400007100001c4000071000018400043100011c400047100011c400046100010c400047100011c4000471000118400043100011c400047100011c400046100010c000047000011c0000470000118,5c18b48
8NSTATES :2:12
9STATEPOS:1:4
10MOVE :4:M4,3
11MOVE :4:M3,0
12MOVE :4:M2,2
13MOVE :4:M3,2
14MOVE :4:M2,3
15MOVE :4:M0,2
16MOVE :4:M0,3
17MOVE :4:M1,4
18MOVE :4:M0,0
19MOVE :4:M1,0
20MOVE :4:M1,1
diff --git a/apps/plugins/puzzles/src/icons/flood.sav b/apps/plugins/puzzles/src/icons/flood.sav
new file mode 100644
index 0000000000..ac4adf7020
--- /dev/null
+++ b/apps/plugins/puzzles/src/icons/flood.sav
@@ -0,0 +1,14 @@
1SAVEFILE:41:Simon Tatham's Portable Puzzle Collection
2VERSION :1:1
3GAME :5:Flood
4PARAMS :7:6x6c6m5
5CPARAMS :7:6x6c6m5
6SEED :15:967543368167853
7DESC :39:032242034203340350204502505323231342,17
8NSTATES :1:6
9STATEPOS:1:6
10MOVE :2:M3
11MOVE :2:M2
12MOVE :2:M0
13MOVE :2:M5
14MOVE :2:M3
diff --git a/apps/plugins/puzzles/src/icons/galaxies.sav b/apps/plugins/puzzles/src/icons/galaxies.sav
new file mode 100644
index 0000000000..42d18bc335
--- /dev/null
+++ b/apps/plugins/puzzles/src/icons/galaxies.sav
@@ -0,0 +1,51 @@
1SAVEFILE:41:Simon Tatham's Portable Puzzle Collection
2VERSION :1:1
3GAME :8:Galaxies
4PARAMS :5:7x7dh
5CPARAMS :5:7x7dh
6SEED :15:483644862786314
7DESC :13:ikrqfedzljjsp
8NSTATES :2:43
9STATEPOS:2:37
10MOVE :5:E12,9
11MOVE :5:E8,11
12MOVE :5:E5,12
13MOVE :5:E7,12
14MOVE :5:E4,13
15MOVE :5:E2,11
16MOVE :5:E3,10
17MOVE :4:E2,5
18MOVE :4:E4,5
19MOVE :4:E6,7
20MOVE :4:E8,1
21MOVE :5:E10,1
22MOVE :4:E9,2
23MOVE :4:E6,3
24MOVE :4:E7,4
25MOVE :5:E10,3
26MOVE :5:E10,5
27MOVE :5:E11,6
28MOVE :5:E13,6
29MOVE :5:E8,13
30MOVE :5:E12,7
31MOVE :6:E12,11
32MOVE :6:E13,12
33MOVE :4:E8,9
34MOVE :4:E7,8
35MOVE :4:E7,6
36MOVE :4:E9,6
37MOVE :4:E8,5
38MOVE :4:E9,4
39MOVE :4:E5,2
40MOVE :4:E4,1
41MOVE :4:E3,6
42MOVE :4:E2,7
43MOVE :4:E3,8
44MOVE :4:E3,4
45MOVE :4:E4,9
46MOVE :4:E2,9
47MOVE :5:E5,10
48MOVE :5:E6,11
49MOVE :4:E2,3
50MOVE :4:E2,1
51MOVE :5:E1,12
diff --git a/apps/plugins/puzzles/src/icons/guess.sav b/apps/plugins/puzzles/src/icons/guess.sav
new file mode 100644
index 0000000000..69852bf769
--- /dev/null
+++ b/apps/plugins/puzzles/src/icons/guess.sav
@@ -0,0 +1,15 @@
1SAVEFILE:41:Simon Tatham's Portable Puzzle Collection
2VERSION :1:1
3GAME :5:Guess
4PARAMS :9:c6p4g10Bm
5CPARAMS :9:c6p4g10Bm
6SEED :15:313100730915729
7DESC :8:b5f3faed
8UI :7:0,0,0,0
9NSTATES :1:6
10STATEPOS:1:6
11MOVE :8:G1,1,2,2
12MOVE :8:G4,3,1,1
13MOVE :8:G5,5,1,1
14MOVE :8:G4,2,1,6
15MOVE :8:G2,3,1,6
diff --git a/apps/plugins/puzzles/src/icons/icon.pl b/apps/plugins/puzzles/src/icons/icon.pl
new file mode 100755
index 0000000000..fcb1aa3e2c
--- /dev/null
+++ b/apps/plugins/puzzles/src/icons/icon.pl
@@ -0,0 +1,270 @@
1#!/usr/bin/perl
2
3# Take a collection of input image files and convert them into a
4# multi-resolution Windows .ICO icon file.
5#
6# The input images can be treated as having four different colour
7# depths:
8#
9# - 24-bit true colour
10# - 8-bit with custom palette
11# - 4-bit using the Windows 16-colour palette (see comment below
12# for details)
13# - 1-bit using black and white only.
14#
15# The images can be supplied in any input format acceptable to
16# ImageMagick, but their actual colour usage must already be
17# appropriate for the specified mode; this script will not do any
18# substantive conversion. So if an image intended to be used in 4-
19# or 1-bit mode contains any colour not in the appropriate fixed
20# palette, that's a fatal error; if an image to be used in 8-bit
21# mode contains more than 256 distinct colours, that's also a fatal
22# error.
23#
24# Command-line syntax is:
25#
26# icon.pl -depth imagefile [imagefile...] [-depth imagefile [imagefile...]]
27#
28# where `-depth' is one of `-24', `-8', `-4' or `-1', and tells the
29# script how to treat all the image files given after that option
30# until the next depth option. For example, you might execute
31#
32# icon.pl -24 48x48x24.png 32x32x24.png -8 32x32x8.png -1 monochrome.png
33#
34# to build an icon file containing two differently sized 24-bit
35# images, one 8-bit image and one black and white image.
36#
37# Windows .ICO files support a 1-bit alpha channel on all these
38# image types. That is, any pixel can be either opaque or fully
39# transparent, but not partially transparent. The alpha channel is
40# separate from the main image data, meaning that `transparent' is
41# not required to take up a palette entry. (So an 8-bit image can
42# have 256 distinct _opaque_ colours, plus transparent pixels as
43# well.) If the input images have alpha channels, they will be used
44# to determine which pixels of the icon are transparent, by simple
45# quantisation half way up (e.g. in a PNG image with an 8-bit alpha
46# channel, alpha values of 00-7F will be mapped to transparent
47# pixels, and 80-FF will become opaque).
48
49# The Windows 16-colour palette consists of:
50# - the eight corners of the colour cube (000000, 0000FF, 00FF00,
51# 00FFFF, FF0000, FF00FF, FFFF00, FFFFFF)
52# - dim versions of the seven non-black corners, at 128/255 of the
53# brightness (000080, 008000, 008080, 800000, 800080, 808000,
54# 808080)
55# - light grey at 192/255 of full brightness (C0C0C0).
56%win16pal = (
57 "\x00\x00\x00\x00" => 0,
58 "\x00\x00\x80\x00" => 1,
59 "\x00\x80\x00\x00" => 2,
60 "\x00\x80\x80\x00" => 3,
61 "\x80\x00\x00\x00" => 4,
62 "\x80\x00\x80\x00" => 5,
63 "\x80\x80\x00\x00" => 6,
64 "\xC0\xC0\xC0\x00" => 7,
65 "\x80\x80\x80\x00" => 8,
66 "\x00\x00\xFF\x00" => 9,
67 "\x00\xFF\x00\x00" => 10,
68 "\x00\xFF\xFF\x00" => 11,
69 "\xFF\x00\x00\x00" => 12,
70 "\xFF\x00\xFF\x00" => 13,
71 "\xFF\xFF\x00\x00" => 14,
72 "\xFF\xFF\xFF\x00" => 15,
73);
74@win16pal = sort { $win16pal{$a} <=> $win16pal{$b} } keys %win16pal;
75
76# The black and white palette consists of black (000000) and white
77# (FFFFFF), obviously.
78%win2pal = (
79 "\x00\x00\x00\x00" => 0,
80 "\xFF\xFF\xFF\x00" => 1,
81);
82@win2pal = sort { $win16pal{$a} <=> $win2pal{$b} } keys %win2pal;
83
84@hdr = ();
85@dat = ();
86
87$depth = undef;
88foreach $_ (@ARGV) {
89 if (/^-(24|8|4|1)$/) {
90 $depth = $1;
91 } elsif (defined $depth) {
92 &readicon($_, $depth);
93 } else {
94 $usage = 1;
95 }
96}
97if ($usage || length @hdr == 0) {
98 print "usage: icon.pl ( -24 | -8 | -4 | -1 ) image [image...]\n";
99 print " [ ( -24 | -8 | -4 | -1 ) image [image...] ...]\n";
100 exit 0;
101}
102
103# Now write out the output icon file.
104print pack "vvv", 0, 1, scalar @hdr; # file-level header
105$filepos = 6 + 16 * scalar @hdr;
106for ($i = 0; $i < scalar @hdr; $i++) {
107 print $hdr[$i];
108 print pack "V", $filepos;
109 $filepos += length($dat[$i]);
110}
111for ($i = 0; $i < scalar @hdr; $i++) {
112 print $dat[$i];
113}
114
115sub readicon {
116 my $filename = shift @_;
117 my $depth = shift @_;
118 my $pix;
119 my $i;
120 my %pal;
121
122 # Determine the icon's width and height.
123 my $w = `identify -format %w $filename`;
124 my $h = `identify -format %h $filename`;
125
126 # Read the file in as RGBA data. We flip vertically at this
127 # point, to avoid having to do it ourselves (.BMP and hence
128 # .ICO are bottom-up).
129 my $data = [];
130 open IDATA, "convert -set colorspace sRGB -flip -depth 8 $filename rgba:- |";
131 push @$data, $rgb while (read IDATA,$rgb,4,0) == 4;
132 close IDATA;
133 # Check we have the right amount of data.
134 $xl = $w * $h;
135 $al = scalar @$data;
136 die "wrong amount of image data ($al, expected $xl) from $filename\n"
137 unless $al == $xl;
138
139 # Build the alpha channel now, so we can exclude transparent
140 # pixels from the palette analysis. We replace transparent
141 # pixels with undef in the data array.
142 #
143 # We quantise the alpha channel half way up, so that alpha of
144 # 0x80 or more is taken to be fully opaque and 0x7F or less is
145 # fully transparent. Nasty, but the best we can do without
146 # dithering (and don't even suggest we do that!).
147 my $x;
148 my $y;
149 my $alpha = "";
150
151 for ($y = 0; $y < $h; $y++) {
152 my $currbyte = 0, $currbits = 0;
153 for ($x = 0; $x < (($w+31)|31)-31; $x++) {
154 $pix = ($x < $w ? $data->[$y*$w+$x] : "\x00\x00\x00\xFF");
155 my @rgba = unpack "CCCC", $pix;
156 $currbyte <<= 1;
157 $currbits++;
158 if ($rgba[3] < 0x80) {
159 if ($x < $w) {
160 $data->[$y*$w+$x] = undef;
161 }
162 $currbyte |= 1; # MS has the alpha channel inverted :-)
163 } else {
164 # Might as well flip RGBA into BGR0 while we're here.
165 if ($x < $w) {
166 $data->[$y*$w+$x] = pack "CCCC",
167 $rgba[2], $rgba[1], $rgba[0], 0;
168 }
169 }
170 if ($currbits >= 8) {
171 $alpha .= pack "C", $currbyte;
172 $currbits -= 8;
173 }
174 }
175 }
176
177 # For an 8-bit image, check we have at most 256 distinct
178 # colours, and build the palette.
179 %pal = ();
180 if ($depth == 8) {
181 my $palindex = 0;
182 foreach $pix (@$data) {
183 next unless defined $pix;
184 $pal{$pix} = $palindex++ unless defined $pal{$pix};
185 }
186 die "too many colours in 8-bit image $filename\n" unless $palindex <= 256;
187 } elsif ($depth == 4) {
188 %pal = %win16pal;
189 } elsif ($depth == 1) {
190 %pal = %win2pal;
191 }
192
193 my $raster = "";
194 if ($depth < 24) {
195 # For a non-24-bit image, flatten the image into one palette
196 # index per pixel.
197 $pad = 32 / $depth; # number of pixels to pad scanline to 4-byte align
198 $pmask = $pad-1;
199 for ($y = 0; $y < $h; $y++) {
200 my $currbyte = 0, $currbits = 0;
201 for ($x = 0; $x < (($w+$pmask)|$pmask)-$pmask; $x++) {
202 $currbyte <<= $depth;
203 $currbits += $depth;
204 if ($x < $w && defined ($pix = $data->[$y*$w+$x])) {
205 if (!defined $pal{$pix}) {
206 my $pixprintable = unpack "H*", $pix;
207 die "illegal colour value $pixprintable at pixel ($x,$y) in $filename\n";
208 }
209 $currbyte |= $pal{$pix};
210 }
211 if ($currbits >= 8) {
212 $raster .= pack "C", $currbyte;
213 $currbits -= 8;
214 }
215 }
216 }
217 } else {
218 # For a 24-bit image, reverse the order of the R,G,B values
219 # and stick a padding zero on the end.
220 #
221 # (In this loop we don't need to bother padding the
222 # scanline out to a multiple of four bytes, because every
223 # pixel takes four whole bytes anyway.)
224 for ($i = 0; $i < scalar @$data; $i++) {
225 if (defined $data->[$i]) {
226 $raster .= $data->[$i];
227 } else {
228 $raster .= "\x00\x00\x00\x00";
229 }
230 }
231 $depth = 32; # and adjust this
232 }
233
234 # Prepare the icon data. First the header...
235 my $data = pack "VVVvvVVVVVV",
236 40, # size of bitmap info header
237 $w, # icon width
238 $h*2, # icon height (x2 to indicate the subsequent alpha channel)
239 1, # 1 plane (common to all MS image formats)
240 $depth, # bits per pixel
241 0, # no compression
242 length $raster, # image size
243 0, 0, 0, 0; # resolution, colours used, colours important (ignored)
244 # ... then the palette ...
245 if ($depth <= 8) {
246 my $ncols = (1 << $depth);
247 my $palette = "\x00\x00\x00\x00" x $ncols;
248 foreach $i (keys %pal) {
249 substr($palette, $pal{$i}*4, 4) = $i;
250 }
251 $data .= $palette;
252 }
253 # ... the raster data we already had ready ...
254 $data .= $raster;
255 # ... and the alpha channel we already had as well.
256 $data .= $alpha;
257
258 # Prepare the header which will represent this image in the
259 # icon file.
260 my $header = pack "CCCCvvV",
261 $w, $h, # width and height (this time the real height)
262 1 << $depth, # number of colours, if less than 256
263 0, # reserved
264 1, # planes
265 $depth, # bits per pixel
266 length $data; # size of real icon data
267
268 push @hdr, $header;
269 push @dat, $data;
270}
diff --git a/apps/plugins/puzzles/src/icons/inertia.sav b/apps/plugins/puzzles/src/icons/inertia.sav
new file mode 100644
index 0000000000..a6d6faed1b
--- /dev/null
+++ b/apps/plugins/puzzles/src/icons/inertia.sav
@@ -0,0 +1,30 @@
1SAVEFILE:41:Simon Tatham's Portable Puzzle Collection
2VERSION :1:1
3GAME :7:Inertia
4PARAMS :3:8x8
5CPARAMS :3:8x8
6SEED :15:739970145068932
7DESC :64:sbgwsmswwgggwggmmbwgwbssbwbsbwbbwsSmgbbsbbmsgbmssgmggbmmwmbmmwsw
8UI :2:D0
9NSTATES :2:21
10STATEPOS:1:5
11MOVE :1:6
12MOVE :1:5
13MOVE :1:3
14MOVE :1:1
15MOVE :1:6
16MOVE :1:0
17MOVE :1:5
18MOVE :1:7
19MOVE :1:5
20MOVE :1:6
21MOVE :1:1
22MOVE :1:3
23MOVE :1:4
24MOVE :1:2
25MOVE :1:6
26MOVE :1:5
27MOVE :1:3
28MOVE :1:1
29MOVE :1:5
30MOVE :1:3
diff --git a/apps/plugins/puzzles/src/icons/keen.sav b/apps/plugins/puzzles/src/icons/keen.sav
new file mode 100644
index 0000000000..4adbd42d17
--- /dev/null
+++ b/apps/plugins/puzzles/src/icons/keen.sav
@@ -0,0 +1,62 @@
1SAVEFILE:41:Simon Tatham's Portable Puzzle Collection
2VERSION :1:1
3GAME :4:Keen
4PARAMS :3:5de
5CPARAMS :3:5de
6SEED :15:846699649745236
7DESC :48:a__a_3a_5a_a_a_3b_bac_,a5m15a7a10s2s2d2s3m40m2s2
8AUXINFO :52:6105af67c6ebc8de056b59ebc9a463aa54e75f647055c0a6c1bd
9NSTATES :2:53
10STATEPOS:2:39
11MOVE :6:P0,4,2
12MOVE :6:P0,4,4
13MOVE :6:P0,4,5
14MOVE :6:P1,4,2
15MOVE :6:P1,4,4
16MOVE :6:P1,4,5
17MOVE :6:P1,3,2
18MOVE :6:P1,3,4
19MOVE :6:P1,3,5
20MOVE :6:R2,2,4
21MOVE :6:R1,2,2
22MOVE :6:P1,3,2
23MOVE :6:P1,4,2
24MOVE :6:R0,4,2
25MOVE :6:R2,3,2
26MOVE :6:R2,4,1
27MOVE :6:R1,4,4
28MOVE :6:R1,3,5
29MOVE :6:P3,4,3
30MOVE :6:P3,4,5
31MOVE :6:P4,4,3
32MOVE :6:P4,4,5
33MOVE :6:R4,4,5
34MOVE :6:R3,4,3
35MOVE :6:P3,1,2
36MOVE :6:P3,1,5
37MOVE :6:P3,0,2
38MOVE :6:P3,0,5
39MOVE :6:R3,2,1
40MOVE :6:R3,3,4
41MOVE :6:P2,0,3
42MOVE :6:P2,0,5
43MOVE :6:P2,1,3
44MOVE :6:P2,1,5
45MOVE :6:P0,1,1
46MOVE :6:P0,1,3
47MOVE :6:P1,1,1
48MOVE :6:P1,1,3
49MOVE :6:R2,0,3
50MOVE :6:R2,1,5
51MOVE :6:R3,0,5
52MOVE :6:R3,1,2
53MOVE :6:R4,1,4
54MOVE :6:R4,2,3
55MOVE :6:R4,0,2
56MOVE :6:R4,3,1
57MOVE :6:R0,2,5
58MOVE :6:R0,3,3
59MOVE :6:R1,1,3
60MOVE :6:R0,1,1
61MOVE :6:R1,0,1
62MOVE :6:R0,0,4
diff --git a/apps/plugins/puzzles/src/icons/lightup.sav b/apps/plugins/puzzles/src/icons/lightup.sav
new file mode 100644
index 0000000000..21b59bdec4
--- /dev/null
+++ b/apps/plugins/puzzles/src/icons/lightup.sav
@@ -0,0 +1,24 @@
1SAVEFILE:41:Simon Tatham's Portable Puzzle Collection
2VERSION :1:1
3GAME :8:Light Up
4PARAMS :10:7x7b20s4d1
5CPARAMS :10:7x7b25s4d1
6SEED :15:538922615851330
7DESC :25:b3gB0c0dBaBaBa1aBd1c01g0b
8NSTATES :2:16
9STATEPOS:2:16
10MOVE :4:L1,0
11MOVE :4:L2,1
12MOVE :4:L3,0
13MOVE :4:L0,3
14MOVE :4:L6,1
15MOVE :4:L3,4
16MOVE :4:I6,5
17MOVE :4:I1,5
18MOVE :4:I2,6
19MOVE :4:I3,6
20MOVE :4:I4,5
21MOVE :4:I5,6
22MOVE :4:L5,5
23MOVE :4:I6,4
24MOVE :4:I4,2
diff --git a/apps/plugins/puzzles/src/icons/loopy.sav b/apps/plugins/puzzles/src/icons/loopy.sav
new file mode 100644
index 0000000000..11611818af
--- /dev/null
+++ b/apps/plugins/puzzles/src/icons/loopy.sav
@@ -0,0 +1,120 @@
1SAVEFILE:41:Simon Tatham's Portable Puzzle Collection
2VERSION :1:1
3GAME :5:Loopy
4PARAMS :7:7x7t0de
5CPARAMS :7:7x7t0de
6DESC :31:02g222b3b2e2a2b322b2a2a3a2a1d1b
7NSTATES :3:113
8STATEPOS:2:75
9MOVE :2:3n
10MOVE :2:0n
11MOVE :2:1n
12MOVE :2:2n
13MOVE :2:4n
14MOVE :2:6y
15MOVE :2:5y
16MOVE :3:25n
17MOVE :2:9n
18MOVE :3:28y
19MOVE :3:27y
20MOVE :3:42n
21MOVE :3:30n
22MOVE :3:45y
23MOVE :3:44y
24MOVE :3:59n
25MOVE :3:47n
26MOVE :3:62y
27MOVE :3:61y
28MOVE :3:76n
29MOVE :3:64n
30MOVE :3:79y
31MOVE :3:78y
32MOVE :3:93n
33MOVE :3:81n
34MOVE :4:110y
35MOVE :4:111y
36MOVE :3:99y
37MOVE :3:98y
38MOVE :3:24n
39MOVE :3:39y
40MOVE :3:23y
41MOVE :3:22y
42MOVE :3:26n
43MOVE :3:37n
44MOVE :3:38y
45MOVE :3:54n
46MOVE :3:69y
47MOVE :3:53y
48MOVE :3:40y
49MOVE :2:7y
50MOVE :3:88y
51MOVE :3:87y
52MOVE :4:102n
53MOVE :3:90n
54MOVE :3:52n
55MOVE :3:41y
56MOVE :3:55n
57MOVE :3:43n
58MOVE :2:8n
59MOVE :3:10y
60MOVE :3:12y
61MOVE :3:11n
62MOVE :3:13y
63MOVE :3:29n
64MOVE :3:15y
65MOVE :3:14n
66MOVE :3:16y
67MOVE :3:32y
68MOVE :3:31n
69MOVE :3:18y
70MOVE :3:17n
71MOVE :3:19y
72MOVE :3:20y
73MOVE :3:21n
74MOVE :3:33y
75MOVE :3:35y
76MOVE :3:36n
77MOVE :3:50y
78MOVE :3:57y
79MOVE :3:58y
80MOVE :3:72n
81MOVE :3:60n
82MOVE :3:74y
83MOVE :4:104y
84MOVE :4:107n
85MOVE :4:106n
86MOVE :3:92n
87MOVE :4:109n
88MOVE :3:89y
89MOVE :3:77n
90MOVE :3:75n
91MOVE :3:73y
92MOVE :3:85n
93MOVE :3:70n
94MOVE :3:56y
95MOVE :3:67n
96MOVE :3:71y
97MOVE :3:68y
98MOVE :3:84n
99MOVE :3:82n
100MOVE :3:83y
101MOVE :3:97n
102MOVE :3:86y
103MOVE :4:101y
104MOVE :4:100n
105MOVE :4:103y
106MOVE :4:105y
107MOVE :4:108y
108MOVE :3:96n
109MOVE :3:95y
110MOVE :3:94y
111MOVE :3:91y
112MOVE :3:80y
113MOVE :3:66n
114MOVE :3:65y
115MOVE :3:63y
116MOVE :3:51n
117MOVE :3:46n
118MOVE :3:34y
119MOVE :3:48n
120MOVE :3:49y
diff --git a/apps/plugins/puzzles/src/icons/magnets.sav b/apps/plugins/puzzles/src/icons/magnets.sav
new file mode 100644
index 0000000000..3c317b70ce
--- /dev/null
+++ b/apps/plugins/puzzles/src/icons/magnets.sav
@@ -0,0 +1,33 @@
1SAVEFILE:41:Simon Tatham's Portable Puzzle Collection
2VERSION :1:1
3GAME :7:Magnets
4PARAMS :6:6x5dtS
5CPARAMS :6:6x5dtS
6SEED :15:705856238774945
7DESC :56:2.2..1,.3.2.,2.21..,2..0.,TLRTLRBLRBTTLRLRBBLRTTTTLRBBBB
8AUXINFO :60:ebae280db3eec279c628b6cfe4aca5a03ba24d7eba91169f1bdf275fce3f
9NSTATES :2:24
10STATEPOS:2:15
11MOVE :4:.1,3
12MOVE :4:.0,1
13MOVE :4:?0,1
14MOVE :4:.2,1
15MOVE :4:?2,1
16MOVE :4:.2,4
17MOVE :4:?2,4
18MOVE :4:+2,3
19MOVE :4:.3,3
20MOVE :4:.0,2
21MOVE :4:?0,2
22MOVE :4:+1,4
23MOVE :4:+0,2
24MOVE :4:+0,0
25MOVE :4:+1,1
26MOVE :4:.2,2
27MOVE :4:+2,0
28MOVE :4:+3,1
29MOVE :4:.4,0
30MOVE :4:+5,1
31MOVE :4:.5,3
32MOVE :4:+4,3
33MOVE :4:.4,2
diff --git a/apps/plugins/puzzles/src/icons/map.sav b/apps/plugins/puzzles/src/icons/map.sav
new file mode 100644
index 0000000000..33863e1eeb
--- /dev/null
+++ b/apps/plugins/puzzles/src/icons/map.sav
@@ -0,0 +1,27 @@
1SAVEFILE:41:Simon Tatham's Portable Puzzle Collection
2VERSION :1:1
3GAME :3:Map
4PARAMS :10:20x20n30dn
5CPARAMS :10:20x20n30dn
6SEED :15:794003990129265
7DESC :264:dcbakatgcaaedaccabfabadbaaaagaiaaaeaiadcaaaafabccbdcaaecabggedfaebqbadgbngcblabdaadaaaeagabaaaacaacacbcaebabaabaebaafaaakabdhcdanaaceagakacbbajaaadbacbaaccbcbicdafbadgbaccbkcdaafbacbcaaabcddacaaaaddbabcdbbacabbhagajabbobcdjaecaafabahaaaffead,23a01c3c1a3d2a20b01a3a
8AUXINFO :282:738e7a68c5d32445002968f3726646962b3604ef27a3657e0fdc0fd8180d5b747febd4619487bbc8bec5a48c709b154eb8da39c9b49be1e312a381fc2394e53126714079bd82e8444dad92419429635d1c816c53774b8c77b4ce03884c94d12bfb757cd93b5600471cb9726b3f2afe74d9932abeaa2efd6a496cad793ce5b221f943d620e883794f9d56741908
9NSTATES :2:18
10STATEPOS:2:12
11MOVE :4:3:20
12MOVE :4:0:24
13MOVE :4:3:10
14MOVE :4:1:18
15MOVE :4:2:11
16MOVE :4:3:17
17MOVE :4:1:23
18MOVE :4:3:27
19MOVE :4:1:29
20MOVE :4:0:16
21MOVE :4:2:13
22MOVE :3:1:6
23MOVE :3:2:2
24MOVE :3:0:7
25MOVE :3:2:9
26MOVE :4:0:15
27MOVE :3:3:5
diff --git a/apps/plugins/puzzles/src/icons/mines.sav b/apps/plugins/puzzles/src/icons/mines.sav
new file mode 100644
index 0000000000..a827541163
--- /dev/null
+++ b/apps/plugins/puzzles/src/icons/mines.sav
@@ -0,0 +1,67 @@
1SAVEFILE:41:Simon Tatham's Portable Puzzle Collection
2VERSION :1:1
3GAME :5:Mines
4PARAMS :6:9x9n35
5CPARAMS :6:9x9n35
6SEED :15:698938038698621
7DESC :26:0,0,me0691ca8a278f3c371688
8PRIVDESC:22:me0691ca8a278f3c371688
9UI :3:D0C
10TIME :7:75.2958
11NSTATES :2:56
12STATEPOS:2:41
13MOVE :4:O0,0
14MOVE :4:F1,2
15MOVE :4:F0,2
16MOVE :4:O2,2
17MOVE :4:F2,1
18MOVE :4:F3,1
19MOVE :4:F3,2
20MOVE :4:F3,3
21MOVE :4:F1,3
22MOVE :4:F2,3
23MOVE :4:C1,0
24MOVE :4:C2,0
25MOVE :4:C3,0
26MOVE :4:F5,0
27MOVE :4:F5,1
28MOVE :4:C4,1
29MOVE :4:O6,1
30MOVE :4:O6,2
31MOVE :4:O6,3
32MOVE :4:F7,1
33MOVE :4:O7,4
34MOVE :4:O5,4
35MOVE :4:F5,3
36MOVE :4:F5,5
37MOVE :4:F6,6
38MOVE :4:C6,5
39MOVE :4:F8,6
40MOVE :4:C6,3
41MOVE :4:F8,2
42MOVE :4:C7,2
43MOVE :4:F8,0
44MOVE :4:F7,0
45MOVE :4:F6,0
46MOVE :4:C4,2
47MOVE :4:F4,4
48MOVE :4:F4,5
49MOVE :4:F3,4
50MOVE :4:C5,6
51MOVE :4:F7,7
52MOVE :4:F8,7
53MOVE :4:F7,8
54MOVE :4:O4,8
55MOVE :4:F3,6
56MOVE :4:C4,6
57MOVE :4:F3,8
58MOVE :4:F5,8
59MOVE :4:C6,7
60MOVE :4:C3,7
61MOVE :4:F2,5
62MOVE :4:F2,4
63MOVE :4:F1,8
64MOVE :4:F1,7
65MOVE :4:C2,7
66MOVE :4:C2,6
67MOVE :4:C1,6
diff --git a/apps/plugins/puzzles/src/icons/net.sav b/apps/plugins/puzzles/src/icons/net.sav
new file mode 100644
index 0000000000..06a5426280
--- /dev/null
+++ b/apps/plugins/puzzles/src/icons/net.sav
@@ -0,0 +1,53 @@
1SAVEFILE:41:Simon Tatham's Portable Puzzle Collection
2VERSION :1:1
3GAME :3:Net
4PARAMS :3:5x5
5CPARAMS :3:5x5
6DESC :25:1115337157375775157135131
7UI :9:O0,0;C2,2
8NSTATES :2:45
9STATEPOS:2:45
10MOVE :4:C0,0
11MOVE :4:L0,0
12MOVE :4:L0,1
13MOVE :4:C0,2
14MOVE :4:L0,2
15MOVE :4:A0,3
16MOVE :4:L0,3
17MOVE :4:L0,4
18MOVE :4:L1,4
19MOVE :4:A2,4
20MOVE :4:A2,4
21MOVE :4:L2,4
22MOVE :4:C1,0
23MOVE :4:L1,0
24MOVE :4:L3,0
25MOVE :4:L2,0
26MOVE :4:A4,0
27MOVE :4:A4,0
28MOVE :4:L4,0
29MOVE :4:A4,1
30MOVE :4:L4,1
31MOVE :4:L3,1
32MOVE :4:A3,2
33MOVE :4:A3,2
34MOVE :4:L3,2
35MOVE :4:L2,2
36MOVE :4:A2,1
37MOVE :4:A2,1
38MOVE :4:A1,1
39MOVE :4:A1,1
40MOVE :4:A1,1
41MOVE :4:A1,1
42MOVE :4:A1,1
43MOVE :4:A1,1
44MOVE :4:A1,2
45MOVE :4:A1,2
46MOVE :4:A1,3
47MOVE :4:C2,3
48MOVE :4:A3,3
49MOVE :4:A4,4
50MOVE :4:A4,4
51MOVE :4:A4,3
52MOVE :4:A4,2
53MOVE :4:A4,2
diff --git a/apps/plugins/puzzles/src/icons/netslide.sav b/apps/plugins/puzzles/src/icons/netslide.sav
new file mode 100644
index 0000000000..f37178ee0c
--- /dev/null
+++ b/apps/plugins/puzzles/src/icons/netslide.sav
@@ -0,0 +1,47 @@
1SAVEFILE:41:Simon Tatham's Portable Puzzle Collection
2VERSION :1:1
3GAME :8:Netslide
4PARAMS :3:4x4
5CPARAMS :3:4x4
6SEED :15:344208514520242
7DESC :16:49b59aca247714b4
8AUXINFO :34:60d28a22f68cdb6078d67a4d6069b9ff54
9NSTATES :2:38
10STATEPOS:2:31
11MOVE :4:R0,1
12MOVE :4:C1,1
13MOVE :4:R1,1
14MOVE :4:R1,1
15MOVE :4:C3,1
16MOVE :4:C1,1
17MOVE :4:R1,1
18MOVE :4:R1,1
19MOVE :4:R3,1
20MOVE :4:R0,1
21MOVE :4:C1,1
22MOVE :5:R3,-1
23MOVE :5:R0,-1
24MOVE :4:R0,1
25MOVE :4:R0,1
26MOVE :4:C0,1
27MOVE :5:R0,-1
28MOVE :5:R0,-1
29MOVE :5:C1,-1
30MOVE :4:R1,1
31MOVE :4:C1,1
32MOVE :5:R1,-1
33MOVE :5:C0,-1
34MOVE :5:C0,-1
35MOVE :4:R3,1
36MOVE :4:C0,1
37MOVE :4:C0,1
38MOVE :5:R3,-1
39MOVE :4:C0,1
40MOVE :5:R3,-1
41MOVE :5:C1,-1
42MOVE :4:R0,1
43MOVE :4:C0,1
44MOVE :5:R0,-1
45MOVE :5:C0,-1
46MOVE :4:C1,1
47MOVE :4:R3,1
diff --git a/apps/plugins/puzzles/src/icons/palisade.sav b/apps/plugins/puzzles/src/icons/palisade.sav
new file mode 100644
index 0000000000..a935e890bb
--- /dev/null
+++ b/apps/plugins/puzzles/src/icons/palisade.sav
@@ -0,0 +1,50 @@
1SAVEFILE:41:Simon Tatham's Portable Puzzle Collection
2VERSION :1:1
3GAME :8:Palisade
4PARAMS :5:5x5n5
5CPARAMS :5:5x5n5
6SEED :15:930059588777257
7DESC :13:2d23c33e2c1b2
8AUXINFO :52:14a191be1282597737537139d11d87fb4f21ad4a8f31e67b4441
9NSTATES :2:41
10STATEPOS:2:27
11MOVE :14:F0,1,16F0,0,64
12MOVE :15:F0,0,32F1,0,128
13MOVE :12:F1,1,8F0,1,2
14MOVE :12:F1,0,4F1,1,1
15MOVE :14:F0,2,16F0,1,64
16MOVE :12:F1,2,8F0,2,2
17MOVE :12:F0,3,1F0,2,4
18MOVE :15:F2,0,128F1,0,32
19MOVE :12:F2,0,4F2,1,1
20MOVE :12:F3,0,8F2,0,2
21MOVE :15:F1,4,128F0,4,32
22MOVE :14:F1,4,16F1,3,64
23MOVE :15:F2,4,128F1,4,32
24MOVE :14:F0,3,64F0,4,16
25MOVE :15:F1,3,128F0,3,32
26MOVE :12:F1,3,1F1,2,4
27MOVE :15:F4,4,128F3,4,32
28MOVE :14:F4,4,16F4,3,64
29MOVE :12:F3,4,8F2,4,2
30MOVE :12:F2,4,1F2,3,4
31MOVE :12:F2,3,8F1,3,2
32MOVE :14:F2,2,64F2,3,16
33MOVE :15:F2,3,32F3,3,128
34MOVE :12:F3,3,4F3,4,1
35MOVE :12:F4,3,8F3,3,2
36MOVE :14:F4,3,16F4,2,64
37MOVE :12:F1,2,1F1,1,4
38MOVE :15:F2,1,128F1,1,32
39MOVE :15:F2,2,128F1,2,32
40MOVE :12:F2,2,1F2,1,4
41MOVE :15:F3,2,128F2,2,32
42MOVE :14:F3,2,64F3,3,16
43MOVE :12:F4,2,8F3,2,2
44MOVE :12:F3,2,1F3,1,4
45MOVE :15:F2,1,32F3,1,128
46MOVE :14:F4,2,16F4,1,64
47MOVE :12:F4,1,8F3,1,2
48MOVE :14:F3,0,64F3,1,16
49MOVE :15:F4,0,128F3,0,32
50MOVE :12:F4,1,1F4,0,4
diff --git a/apps/plugins/puzzles/src/icons/pattern.sav b/apps/plugins/puzzles/src/icons/pattern.sav
new file mode 100644
index 0000000000..97c2396052
--- /dev/null
+++ b/apps/plugins/puzzles/src/icons/pattern.sav
@@ -0,0 +1,29 @@
1SAVEFILE:41:Simon Tatham's Portable Puzzle Collection
2VERSION :1:1
3GAME :7:Pattern
4PARAMS :5:10x10
5CPARAMS :5:10x10
6DESC :67:3.4/2.2/4.1/2.3/2.3.2/4/6/6/3.1/1/5/5/1.1/4/5/6/2.3/3.3/1.1.3/1.1.4
7NSTATES :2:22
8STATEPOS:2:22
9MOVE :8:F6,4,1,2
10MOVE :8:F7,4,1,2
11MOVE :8:F4,5,2,1
12MOVE :8:F5,4,1,1
13MOVE :8:E0,5,2,1
14MOVE :8:E0,4,3,1
15MOVE :8:F0,6,1,4
16MOVE :8:F0,1,1,2
17MOVE :8:F0,1,5,1
18MOVE :8:E1,2,1,1
19MOVE :8:F2,0,1,4
20MOVE :8:E3,2,1,1
21MOVE :8:F3,0,1,1
22MOVE :8:F4,0,1,1
23MOVE :8:F3,3,1,1
24MOVE :8:E6,3,4,1
25MOVE :8:F6,6,1,4
26MOVE :8:F7,6,1,4
27MOVE :8:E6,0,1,4
28MOVE :8:E7,0,1,3
29MOVE :8:E5,1,1,1
diff --git a/apps/plugins/puzzles/src/icons/pearl.sav b/apps/plugins/puzzles/src/icons/pearl.sav
new file mode 100644
index 0000000000..730ca85149
--- /dev/null
+++ b/apps/plugins/puzzles/src/icons/pearl.sav
@@ -0,0 +1,23 @@
1SAVEFILE:41:Simon Tatham's Portable Puzzle Collection
2VERSION :1:1
3GAME :5:Pearl
4PARAMS :5:6x6dt
5CPARAMS :5:6x6dt
6SEED :15:901944054393278
7DESC :17:BbBfWcWbWBaBeWgWa
8AUXINFO :72:f8bbe71b9be753d5fa143df207d7797ba62a9b3996eb8b8889487e1a2bd659d91a5e73e1
9NSTATES :2:14
10STATEPOS:1:7
11MOVE :55:F4,2,0;F1,1,0;F4,1,0;F1,0,0;F8,0,0;F2,0,1;F8,0,1;F2,0,2
12MOVE :27:F1,0,3;F4,1,3;F1,1,3;F4,2,3
13MOVE :27:F8,3,0;F2,3,1;F8,3,1;F2,3,2
14MOVE :97:F2,4,2;F8,4,1;F2,4,1;F8,4,0;F1,4,0;F4,5,0;F8,5,0;F2,5,1;F8,5,1;F2,5,2;F8,5,2;F2,5,3;F4,5,3;F1,4,3
15MOVE :13:F4,4,2;F1,3,2
16MOVE :13:F4,3,0;F1,2,0
17MOVE :69:F2,2,3;F8,2,2;F2,2,2;F8,2,1;F4,2,1;F1,1,1;F8,1,1;F2,1,2;F4,1,2;F1,0,2
18MOVE :41:F8,0,3;F2,0,4;F8,0,4;F2,0,5;F1,0,5;F4,1,5
19MOVE :27:F1,1,4;F4,2,4;F1,2,4;F4,3,4
20MOVE :13:F8,1,4;F2,1,5
21MOVE :55:F1,3,5;F4,4,5;F1,4,5;F4,5,5;F2,5,5;F8,5,4;F4,5,4;F1,4,4
22MOVE :13:F2,3,5;F8,3,4
23MOVE :13:F2,4,4;F8,4,3
diff --git a/apps/plugins/puzzles/src/icons/pegs.sav b/apps/plugins/puzzles/src/icons/pegs.sav
new file mode 100644
index 0000000000..22b8a0d82f
--- /dev/null
+++ b/apps/plugins/puzzles/src/icons/pegs.sav
@@ -0,0 +1,16 @@
1SAVEFILE:41:Simon Tatham's Portable Puzzle Collection
2VERSION :1:1
3GAME :4:Pegs
4PARAMS :8:7x7cross
5CPARAMS :8:7x7cross
6SEED :15:103342250484448
7DESC :49:OOPPPOOOOPPPOOPPPPPPPPPPHPPPPPPPPPPOOPPPOOOOPPPOO
8NSTATES :1:8
9STATEPOS:1:8
10MOVE :7:3,1-3,3
11MOVE :7:5,2-3,2
12MOVE :7:5,4-5,2
13MOVE :7:3,4-5,4
14MOVE :7:6,4-4,4
15MOVE :7:4,0-4,2
16MOVE :7:2,0-4,0
diff --git a/apps/plugins/puzzles/src/icons/range.sav b/apps/plugins/puzzles/src/icons/range.sav
new file mode 100644
index 0000000000..708e7db248
--- /dev/null
+++ b/apps/plugins/puzzles/src/icons/range.sav
@@ -0,0 +1,36 @@
1SAVEFILE:41:Simon Tatham's Portable Puzzle Collection
2VERSION :1:1
3GAME :5:Range
4PARAMS :3:7x7
5CPARAMS :3:7x7
6SEED :15:989032078841515
7DESC :22:d7b3e8e5c7a7c13e4e8b4d
8UI :1:0
9NSTATES :2:27
10STATEPOS:2:27
11MOVE :5:W,4,2
12MOVE :5:W,4,3
13MOVE :5:W,4,4
14MOVE :5:W,4,5
15MOVE :5:W,4,6
16MOVE :5:W,4,0
17MOVE :5:W,3,1
18MOVE :5:W,2,1
19MOVE :5:W,1,1
20MOVE :5:W,0,1
21MOVE :5:W,6,1
22MOVE :5:W,5,1
23MOVE :5:W,5,5
24MOVE :5:W,1,5
25MOVE :5:B,5,2
26MOVE :5:W,5,3
27MOVE :5:W,6,3
28MOVE :5:W,3,6
29MOVE :5:W,2,6
30MOVE :5:B,3,5
31MOVE :5:W,2,4
32MOVE :5:W,2,2
33MOVE :5:B,2,3
34MOVE :5:W,1,3
35MOVE :5:W,3,3
36MOVE :5:W,0,5
diff --git a/apps/plugins/puzzles/src/icons/rect.sav b/apps/plugins/puzzles/src/icons/rect.sav
new file mode 100644
index 0000000000..17264daeeb
--- /dev/null
+++ b/apps/plugins/puzzles/src/icons/rect.sav
@@ -0,0 +1,17 @@
1SAVEFILE:41:Simon Tatham's Portable Puzzle Collection
2VERSION :1:1
3GAME :10:Rectangles
4PARAMS :3:7x7
5CPARAMS :3:7x7
6DESC :33:a3d2b2a3_2a4a8h2a3c4_2b2c3a3_3c3b
7NSTATES :2:10
8STATEPOS:2:10
9MOVE :8:R0,6,3,1
10MOVE :8:R6,4,1,3
11MOVE :8:R3,6,3,1
12MOVE :8:R4,4,2,1
13MOVE :8:R3,5,3,1
14MOVE :8:R6,1,1,3
15MOVE :8:R5,0,2,1
16MOVE :8:R5,1,1,2
17MOVE :8:R4,3,2,1
diff --git a/apps/plugins/puzzles/src/icons/samegame.sav b/apps/plugins/puzzles/src/icons/samegame.sav
new file mode 100644
index 0000000000..f92b52d1b6
--- /dev/null
+++ b/apps/plugins/puzzles/src/icons/samegame.sav
@@ -0,0 +1,34 @@
1SAVEFILE:41:Simon Tatham's Portable Puzzle Collection
2VERSION :1:1
3GAME :9:Same Game
4PARAMS :9:10x10c3s2
5CPARAMS :9:10x10c3s2
6SEED :15:785412408200083
7DESC :199:1,1,3,1,2,2,1,2,3,2,2,2,3,3,2,1,1,1,3,2,3,3,2,3,1,3,2,1,1,3,1,2,2,2,3,2,3,2,3,2,1,3,1,2,1,2,3,2,1,3,2,3,1,1,3,3,1,3,3,3,1,1,3,2,2,1,1,2,1,2,2,2,3,1,3,2,2,1,2,3,3,1,2,3,1,3,3,2,1,3,3,1,3,1,2,2,1,3,1,2
8NSTATES :2:26
9STATEPOS:2:13
10MOVE :6:M94,95
11MOVE :6:M83,84
12MOVE :9:M83,93,94
13MOVE :6:M93,94
14MOVE :6:M20,21
15MOVE :15:M20,21,22,31,32
16MOVE :6:M70,71
17MOVE :6:M80,90
18MOVE :9:M73,82,83
19MOVE :18:M72,73,74,82,83,92
20MOVE :12:M51,61,62,72
21MOVE :9:M35,36,46
22MOVE :12:M49,57,58,59
23MOVE :6:M59,69
24MOVE :9:M69,79,89
25MOVE :12:M78,79,89,99
26MOVE :24:M45,46,47,54,55,57,64,67
27MOVE :36:M36,46,55,56,57,66,67,68,77,78,88,98
28MOVE :9:M76,77,87
29MOVE :6:M97,98
30MOVE :6:M94,95
31MOVE :45:M50,60,61,70,71,81,82,83,84,85,90,91,92,93,94
32MOVE :12:M73,81,82,83
33MOVE :6:M92,93
34MOVE :9:M81,90,91
diff --git a/apps/plugins/puzzles/src/icons/screenshot.sh b/apps/plugins/puzzles/src/icons/screenshot.sh
new file mode 100755
index 0000000000..0e2a06eea7
--- /dev/null
+++ b/apps/plugins/puzzles/src/icons/screenshot.sh
@@ -0,0 +1,25 @@
1#!/bin/sh
2
3# Generate a screenshot from a puzzle save file. Takes the
4# following arguments, in order:
5#
6# - the name of the puzzle binary
7# - the name of the save file
8# - the name of the output image file
9# - (optionally) the proportion of the next move to redo before
10# taking the screenshot.
11#
12# This script requires access to an X server in order to run, but
13# seems to work fine under xvfb-run if you haven't got a real one
14# available (or if you don't want to use it for some reason).
15
16binary="$1"
17save="$2"
18image="$3"
19if test "x$4" != "x"; then
20 redo="--redo $4"
21else
22 redo=
23fi
24
25"$binary" $redo --screenshot "$image" --load "$save"
diff --git a/apps/plugins/puzzles/src/icons/signpost.sav b/apps/plugins/puzzles/src/icons/signpost.sav
new file mode 100644
index 0000000000..9ad1958ddf
--- /dev/null
+++ b/apps/plugins/puzzles/src/icons/signpost.sav
@@ -0,0 +1,23 @@
1SAVEFILE:41:Simon Tatham's Portable Puzzle Collection
2VERSION :1:1
3GAME :8:Signpost
4PARAMS :4:4x4c
5CPARAMS :4:4x4c
6SEED :15:230468784719861
7DESC :19:1eceebecfbfhgcaa16a
8NSTATES :2:15
9STATEPOS:2:11
10MOVE :8:L2,1-3,1
11MOVE :8:L0,1-1,0
12MOVE :8:L2,2-1,1
13MOVE :8:L1,2-0,3
14MOVE :8:L0,2-2,0
15MOVE :8:L1,3-1,2
16MOVE :8:L1,1-1,3
17MOVE :8:L1,0-3,0
18MOVE :8:L0,0-0,1
19MOVE :8:L3,0-3,2
20MOVE :8:L3,2-0,2
21MOVE :8:L3,1-2,2
22MOVE :8:L2,3-2,1
23MOVE :8:L2,0-2,3
diff --git a/apps/plugins/puzzles/src/icons/singles.sav b/apps/plugins/puzzles/src/icons/singles.sav
new file mode 100644
index 0000000000..260fd1f2b3
--- /dev/null
+++ b/apps/plugins/puzzles/src/icons/singles.sav
@@ -0,0 +1,45 @@
1SAVEFILE:41:Simon Tatham's Portable Puzzle Collection
2VERSION :1:1
3GAME :7:Singles
4PARAMS :5:6x6dk
5CPARAMS :5:6x6dk
6SEED :15:781273601054598
7DESC :36:361566412253452144234115163346553461
8NSTATES :2:37
9STATEPOS:2:22
10MOVE :4:B1,0
11MOVE :4:C0,0
12MOVE :4:C1,1
13MOVE :4:C2,0
14MOVE :4:C0,1
15MOVE :4:B0,2
16MOVE :4:C0,3
17MOVE :4:C1,2
18MOVE :4:C4,3
19MOVE :4:B3,3
20MOVE :4:C3,2
21MOVE :4:C2,3
22MOVE :4:C3,4
23MOVE :4:B2,4
24MOVE :4:C1,4
25MOVE :4:C2,5
26MOVE :4:B1,5
27MOVE :4:C0,5
28MOVE :4:C0,4
29MOVE :4:C1,3
30MOVE :4:C3,5
31MOVE :4:B5,4
32MOVE :4:C4,4
33MOVE :4:C5,5
34MOVE :4:C5,3
35MOVE :4:C4,5
36MOVE :4:B4,0
37MOVE :4:C3,0
38MOVE :4:C4,1
39MOVE :4:C5,0
40MOVE :4:C5,1
41MOVE :4:B4,2
42MOVE :4:C5,2
43MOVE :4:C3,1
44MOVE :4:B2,1
45MOVE :4:C2,2
diff --git a/apps/plugins/puzzles/src/icons/sixteen.sav b/apps/plugins/puzzles/src/icons/sixteen.sav
new file mode 100644
index 0000000000..076b1fbd4d
--- /dev/null
+++ b/apps/plugins/puzzles/src/icons/sixteen.sav
@@ -0,0 +1,39 @@
1SAVEFILE:41:Simon Tatham's Portable Puzzle Collection
2VERSION :1:1
3GAME :7:Sixteen
4PARAMS :3:4x4
5CPARAMS :3:4x4
6SEED :15:601798566229573
7DESC :38:2,16,3,10,13,8,7,4,9,14,12,11,15,1,5,6
8NSTATES :2:31
9STATEPOS:2:24
10MOVE :5:C3,-1
11MOVE :4:R0,1
12MOVE :4:C1,1
13MOVE :5:R0,-1
14MOVE :5:C1,-1
15MOVE :5:C3,-1
16MOVE :4:R2,1
17MOVE :4:R2,1
18MOVE :4:C3,1
19MOVE :5:C2,-1
20MOVE :5:C2,-1
21MOVE :4:R1,1
22MOVE :4:R1,1
23MOVE :4:C2,1
24MOVE :4:C2,1
25MOVE :4:R3,1
26MOVE :4:R3,1
27MOVE :4:C1,1
28MOVE :5:R2,-1
29MOVE :5:R2,-1
30MOVE :5:C1,-1
31MOVE :4:R2,1
32MOVE :4:C0,1
33MOVE :4:R3,1
34MOVE :5:R2,-1
35MOVE :5:C1,-1
36MOVE :4:R2,1
37MOVE :4:C1,1
38MOVE :5:R3,-1
39MOVE :5:C0,-1
diff --git a/apps/plugins/puzzles/src/icons/slant.sav b/apps/plugins/puzzles/src/icons/slant.sav
new file mode 100644
index 0000000000..02017e5d48
--- /dev/null
+++ b/apps/plugins/puzzles/src/icons/slant.sav
@@ -0,0 +1,51 @@
1SAVEFILE:41:Simon Tatham's Portable Puzzle Collection
2VERSION :1:1
3GAME :5:Slant
4PARAMS :5:8x8de
5CPARAMS :5:8x8de
6DESC :47:a10h23a32a02b22e3a2c1g3a20d32a0c221a210i0a101b0
7NSTATES :2:44
8STATEPOS:2:44
9MOVE :4:/7,0
10MOVE :4:\7,1
11MOVE :4:\1,0
12MOVE :4:/2,0
13MOVE :4:\0,4
14MOVE :4:/0,5
15MOVE :4:\0,6
16MOVE :4:/0,7
17MOVE :4:\1,7
18MOVE :4:/7,7
19MOVE :4:/3,7
20MOVE :4:\4,7
21MOVE :4:\5,7
22MOVE :4:/2,7
23MOVE :4:/7,4
24MOVE :4:\7,5
25MOVE :4:\7,3
26MOVE :4:\7,2
27MOVE :4:/6,2
28MOVE :4:\6,3
29MOVE :4:\7,6
30MOVE :4:/3,0
31MOVE :4:/2,1
32MOVE :4:\3,1
33MOVE :4:/2,2
34MOVE :4:\3,2
35MOVE :4:/2,3
36MOVE :4:\3,3
37MOVE :4:\1,1
38MOVE :4:/0,1
39MOVE :4:\0,2
40MOVE :4:\1,2
41MOVE :4:\1,3
42MOVE :4:/0,3
43MOVE :4:\1,4
44MOVE :4:\0,0
45MOVE :4:\5,3
46MOVE :4:\6,4
47MOVE :4:/5,4
48MOVE :4:/5,5
49MOVE :4:\6,5
50MOVE :4:/4,5
51MOVE :4:\4,6
diff --git a/apps/plugins/puzzles/src/icons/solo.sav b/apps/plugins/puzzles/src/icons/solo.sav
new file mode 100644
index 0000000000..385cc68fe5
--- /dev/null
+++ b/apps/plugins/puzzles/src/icons/solo.sav
@@ -0,0 +1,36 @@
1SAVEFILE:41:Simon Tatham's Portable Puzzle Collection
2VERSION :1:1
3GAME :4:Solo
4PARAMS :3:3x3
5CPARAMS :3:3x3
6DESC :73:a2e9a5b6a2b3_7a1_4a9_6a2b4_1a7_2b1_7e6_9b2_5a8_1b6a5_9a3_8a7_2b8a6b1a1e4a
7NSTATES :2:29
8STATEPOS:2:29
9MOVE :6:R7,1,1
10MOVE :6:R4,6,1
11MOVE :6:R5,0,1
12MOVE :6:R0,0,4
13MOVE :6:R2,0,6
14MOVE :6:R1,2,3
15MOVE :6:R0,3,9
16MOVE :6:R1,3,5
17MOVE :6:R2,4,8
18MOVE :6:R0,5,3
19MOVE :6:R1,5,6
20MOVE :6:R1,6,4
21MOVE :6:R4,7,4
22MOVE :6:R7,6,2
23MOVE :6:R7,7,5
24MOVE :6:R8,8,6
25MOVE :6:R7,3,3
26MOVE :6:R8,3,7
27MOVE :6:R8,3,8
28MOVE :6:R6,4,5
29MOVE :6:R7,5,7
30MOVE :6:R8,5,4
31MOVE :6:R7,2,8
32MOVE :6:R8,0,5
33MOVE :6:R4,2,5
34MOVE :6:R4,3,6
35MOVE :6:R5,4,4
36MOVE :6:R4,5,9
diff --git a/apps/plugins/puzzles/src/icons/square.pl b/apps/plugins/puzzles/src/icons/square.pl
new file mode 100755
index 0000000000..815b94b532
--- /dev/null
+++ b/apps/plugins/puzzles/src/icons/square.pl
@@ -0,0 +1,95 @@
1#!/usr/bin/perl
2
3# Read an input image, crop its border to a standard width, and
4# convert it into a square output image. Parameters are:
5#
6# - the required total image size
7# - the output border thickness
8# - the input image file name
9# - the output image file name.
10
11($osize, $oborder, $infile, $outfile) = @ARGV;
12
13# Determine the input image's size.
14$ident = `identify -format "%w %h" $infile`;
15$ident =~ /(\d+) (\d+)/ or die "unable to get size for $infile\n";
16($w, $h) = ($1, $2);
17
18# Read the input image data.
19$data = [];
20open IDATA, "convert -depth 8 $infile rgb:- |";
21push @$data, $rgb while (read IDATA,$rgb,3,0) == 3;
22close IDATA;
23# Check we have the right amount of data.
24$xl = $w * $h;
25$al = scalar @$data;
26die "wrong amount of image data ($al, expected $xl) from $infile\n"
27 unless $al == $xl;
28
29# Find the background colour, by looking around the entire border
30# and finding the most popular pixel colour.
31for ($i = 0; $i < $w; $i++) {
32 $pcount{$data->[$i]}++; # top row
33 $pcount{$data->[($h-1)*$w+$i]}++; # bottom row
34}
35for ($i = 1; $i < $h-1; $i++) {
36 $pcount{$data->[$i*$w]}++; # left column
37 $pcount{$data->[$i*$w+$w-1]}++; # right column
38}
39@plist = sort { $pcount{$b} <=> $pcount{$a} } keys %pcount;
40$back = $plist[0];
41
42# Crop rows and columns off the image to find the central rectangle
43# of non-background stuff.
44$ystart = 0;
45$ystart++ while $ystart < $h and scalar(grep { $_ ne $back } map { $data->[$ystart*$w+$_] } 0 .. ($w-1)) == 0;
46$yend = $h-1;
47$yend-- while $yend >= $ystart and scalar(grep { $_ ne $back } map { $data->[$yend*$w+$_] } 0 .. ($w-1)) == 0;
48$xstart = 0;
49$xstart++ while $xstart < $w and scalar(grep { $_ ne $back } map { $data->[$_*$w+$xstart] } 0 .. ($h-1)) == 0;
50$xend = $w-1;
51$xend-- while $xend >= $xstart and scalar(grep { $_ ne $back } map { $data->[$_*$w+$xend] } 0 .. ($h-1)) == 0;
52
53# Decide how much border we're going to put back on to make the
54# image perfectly square.
55$hexpand = ($yend-$ystart) - ($xend-$xstart);
56if ($hexpand > 0) {
57 $left = int($hexpand / 2);
58 $xstart -= $left;
59 $xend += $hexpand - $left;
60} elsif ($hexpand < 0) {
61 $vexpand = -$hexpand;
62 $top = int($vexpand / 2);
63 $ystart -= $top;
64 $yend += $vexpand - $top;
65}
66$ow = $xend - $xstart + 1;
67$oh = $yend - $ystart + 1;
68die "internal computation problem" if $ow != $oh; # should be square
69
70# And decide how much _more_ border goes on to add the bit around
71# the edge.
72$realow = int($ow * ($osize / ($osize - 2*$oborder)));
73$extra = $realow - $ow;
74$left = int($extra / 2);
75$xstart -= $left;
76$xend += $extra - $left;
77$top = int($extra / 2);
78$ystart -= $top;
79$yend += $extra - $top;
80$ow = $xend - $xstart + 1;
81$oh = $yend - $ystart + 1;
82die "internal computation problem" if $ow != $oh; # should be square
83
84# Now write out the resulting image, and resize it appropriately.
85open IDATA, "| convert -size ${ow}x${oh} -depth 8 -resize ${osize}x${osize}! rgb:- $outfile";
86for ($y = $ystart; $y <= $yend; $y++) {
87 for ($x = $xstart; $x <= $xend; $x++) {
88 if ($x >= 0 && $x < $w && $y >= 0 && $y < $h) {
89 print IDATA $data->[$y*$w+$x];
90 } else {
91 print IDATA $back;
92 }
93 }
94}
95close IDATA;
diff --git a/apps/plugins/puzzles/src/icons/tents.sav b/apps/plugins/puzzles/src/icons/tents.sav
new file mode 100644
index 0000000000..292c2d2d75
--- /dev/null
+++ b/apps/plugins/puzzles/src/icons/tents.sav
@@ -0,0 +1,32 @@
1SAVEFILE:41:Simon Tatham's Portable Puzzle Collection
2VERSION :1:1
3GAME :5:Tents
4PARAMS :5:8x8de
5CPARAMS :5:8x8de
6DESC :45:ea_ddidfaabkd,3,0,2,1,2,2,1,1,3,1,1,1,1,1,3,1
7NSTATES :2:25
8STATEPOS:2:25
9MOVE :9:N5,6;N6,6
10MOVE :14:N5,7;N6,7;N7,7
11MOVE :9:N0,7;N1,7
12MOVE :4:N1,6
13MOVE :14:N6,2;N6,3;N6,4
14MOVE :9:N7,2;N7,3
15MOVE :14:N1,0;N2,0;N3,0
16MOVE :4:N3,1
17MOVE :4:N0,3
18MOVE :4:N3,4
19MOVE :4:N5,4
20MOVE :4:T6,0
21MOVE :4:T4,0
22MOVE :4:T0,0
23MOVE :4:N1,1
24MOVE :4:N4,1
25MOVE :9:N6,1;N7,1
26MOVE :4:T2,1
27MOVE :9:N1,2;N3,2
28MOVE :4:T5,2
29MOVE :4:N4,2
30MOVE :4:N5,3
31MOVE :4:N0,2
32MOVE :9:N1,3;N1,5
diff --git a/apps/plugins/puzzles/src/icons/towers.sav b/apps/plugins/puzzles/src/icons/towers.sav
new file mode 100644
index 0000000000..351d473a63
--- /dev/null
+++ b/apps/plugins/puzzles/src/icons/towers.sav
@@ -0,0 +1,26 @@
1SAVEFILE:41:Simon Tatham's Portable Puzzle Collection
2VERSION :1:1
3GAME :6:Towers
4PARAMS :3:4de
5CPARAMS :3:4de
6SEED :15:888431554483015
7DESC :31:2/2/1/3/2/2/3/1/3/1/2/2/2/3/2/1
8AUXINFO :34:297d7a2fcf9e14403a74c976fe0fefd306
9NSTATES :2:17
10STATEPOS:2:10
11MOVE :6:R2,0,4
12MOVE :6:R0,1,4
13MOVE :6:R3,3,4
14MOVE :6:R1,2,4
15MOVE :6:R0,3,3
16MOVE :6:R1,0,3
17MOVE :6:R3,2,3
18MOVE :6:R2,1,3
19MOVE :6:R3,0,2
20MOVE :6:R3,1,1
21MOVE :6:R1,1,2
22MOVE :6:R1,3,1
23MOVE :6:R2,3,2
24MOVE :6:R2,2,1
25MOVE :6:R0,2,2
26MOVE :6:R0,0,1
diff --git a/apps/plugins/puzzles/src/icons/tracks.sav b/apps/plugins/puzzles/src/icons/tracks.sav
new file mode 100644
index 0000000000..ca30644506
--- /dev/null
+++ b/apps/plugins/puzzles/src/icons/tracks.sav
@@ -0,0 +1,31 @@
1SAVEFILE:41:Simon Tatham's Portable Puzzle Collection
2VERSION :1:1
3GAME :12:Train Tracks
4PARAMS :5:6x6dt
5CPARAMS :5:6x6dt
6SEED :15:145870397370785
7DESC :31:l6t9b,3,2,1,S4,5,4,2,6,S3,2,3,3
8NSTATES :2:23
9STATEPOS:2:20
10MOVE :5:TD0,0
11MOVE :5:TR0,0
12MOVE :5:TL5,5
13MOVE :5:TU5,5
14MOVE :29:TS1,1;TS2,1;TS3,1;TS4,1;TS5,1
15MOVE :29:NS2,0;NS2,2;NS2,3;NS2,4;NS2,5
16MOVE :5:TU1,1
17MOVE :17:NS0,3;NS0,4;NS0,5
18MOVE :23:NS1,2;NS1,3;NS1,4;NS1,5
19MOVE :5:TL2,1
20MOVE :5:TL3,1
21MOVE :5:TS4,4
22MOVE :5:TS3,4
23MOVE :17:NS3,0;NS4,0;NS5,0
24MOVE :5:TS4,2
25MOVE :5:TS4,3
26MOVE :5:TU3,4
27MOVE :5:TL4,4
28MOVE :5:TL5,1
29MOVE :5:TU5,2
30MOVE :5:NS5,3
31MOVE :5:NS3,2
diff --git a/apps/plugins/puzzles/src/icons/twiddle.sav b/apps/plugins/puzzles/src/icons/twiddle.sav
new file mode 100644
index 0000000000..2863033f99
--- /dev/null
+++ b/apps/plugins/puzzles/src/icons/twiddle.sav
@@ -0,0 +1,35 @@
1SAVEFILE:41:Simon Tatham's Portable Puzzle Collection
2VERSION :1:1
3GAME :7:Twiddle
4PARAMS :5:3x3n2
5CPARAMS :5:3x3n2
6SEED :15:635499951462226
7DESC :17:3,7,2,6,5,1,8,4,9
8NSTATES :2:27
9STATEPOS:2:22
10MOVE :7:M0,0,-1
11MOVE :7:M1,0,-1
12MOVE :6:M1,1,1
13MOVE :6:M0,1,1
14MOVE :6:M0,0,1
15MOVE :6:M0,0,1
16MOVE :7:M1,1,-1
17MOVE :7:M0,1,-1
18MOVE :7:M0,1,-1
19MOVE :7:M1,1,-1
20MOVE :6:M0,1,1
21MOVE :7:M0,1,-1
22MOVE :6:M1,1,1
23MOVE :6:M1,1,1
24MOVE :6:M0,1,1
25MOVE :6:M0,1,1
26MOVE :7:M0,1,-1
27MOVE :7:M1,1,-1
28MOVE :7:M0,1,-1
29MOVE :7:M1,1,-1
30MOVE :6:M0,1,1
31MOVE :7:M1,0,-1
32MOVE :7:M0,1,-1
33MOVE :6:M1,0,1
34MOVE :6:M1,1,1
35MOVE :6:M1,1,1
diff --git a/apps/plugins/puzzles/src/icons/undead.sav b/apps/plugins/puzzles/src/icons/undead.sav
new file mode 100644
index 0000000000..3c314dde8a
--- /dev/null
+++ b/apps/plugins/puzzles/src/icons/undead.sav
@@ -0,0 +1,14 @@
1SAVEFILE:41:Simon Tatham's Portable Puzzle Collection
2VERSION :1:1
3GAME :6:Undead
4PARAMS :6:4x4de2
5CPARAMS :6:4x4de2
6DESC :48:5,2,2,aRLgLLaLRL,2,0,1,2,1,1,2,5,0,0,0,2,1,3,1,1
7NSTATES :1:7
8STATEPOS:1:7
9MOVE :2:G0
10MOVE :2:V0
11MOVE :2:G2
12MOVE :2:G3
13MOVE :2:V3
14MOVE :2:Z3
diff --git a/apps/plugins/puzzles/src/icons/unequal.sav b/apps/plugins/puzzles/src/icons/unequal.sav
new file mode 100644
index 0000000000..c414513a22
--- /dev/null
+++ b/apps/plugins/puzzles/src/icons/unequal.sav
@@ -0,0 +1,25 @@
1SAVEFILE:41:Simon Tatham's Portable Puzzle Collection
2VERSION :1:1
3GAME :7:Unequal
4PARAMS :3:4de
5CPARAMS :3:4de
6SEED :15:143029490219212
7DESC :37:0D,0,0L,0,0,0,0,0,0D,0U,0R,0,0,0,0,4,
8AUXINFO :34:f51274dc41e0a39caa38942fc525ed0108
9NSTATES :2:16
10STATEPOS:1:6
11MOVE :6:R2,1,4
12MOVE :6:R1,2,4
13MOVE :6:R0,0,4
14MOVE :6:R2,3,1
15MOVE :6:R3,2,1
16MOVE :6:R0,2,3
17MOVE :6:R2,2,2
18MOVE :6:R0,3,2
19MOVE :6:R1,3,3
20MOVE :6:R0,1,1
21MOVE :6:R1,1,2
22MOVE :6:R3,1,3
23MOVE :6:R3,0,2
24MOVE :6:R2,0,3
25MOVE :6:R1,0,1
diff --git a/apps/plugins/puzzles/src/icons/unruly.sav b/apps/plugins/puzzles/src/icons/unruly.sav
new file mode 100644
index 0000000000..0f7ca1b9dd
--- /dev/null
+++ b/apps/plugins/puzzles/src/icons/unruly.sav
@@ -0,0 +1,22 @@
1SAVEFILE:41:Simon Tatham's Portable Puzzle Collection
2VERSION :1:1
3GAME :6:Unruly
4PARAMS :5:6x6de
5CPARAMS :5:6x6de
6DESC :10:faCADAJeBd
7NSTATES :2:15
8STATEPOS:2:15
9MOVE :6:P0,1,2
10MOVE :6:P0,4,2
11MOVE :6:P0,3,3
12MOVE :6:P0,3,0
13MOVE :6:P0,5,1
14MOVE :6:P0,2,1
15MOVE :6:P1,4,0
16MOVE :6:P1,1,1
17MOVE :6:P1,5,2
18MOVE :6:P0,0,2
19MOVE :6:P1,0,3
20MOVE :6:P1,0,0
21MOVE :6:P1,0,4
22MOVE :6:P0,2,4
diff --git a/apps/plugins/puzzles/src/icons/untangle.sav b/apps/plugins/puzzles/src/icons/untangle.sav
new file mode 100644
index 0000000000..016318a521
--- /dev/null
+++ b/apps/plugins/puzzles/src/icons/untangle.sav
@@ -0,0 +1,16 @@
1SAVEFILE:41:Simon Tatham's Portable Puzzle Collection
2VERSION :1:1
3GAME :8:Untangle
4PARAMS :2:10
5CPARAMS :2:10
6SEED :15:761628688787632
7DESC :63:0-1,0-5,0-8,0-9,1-4,1-8,2-6,2-7,3-5,3-6,3-9,4-5,4-7,5-7,6-7,8-9
8AUXINFO :182:01bee8258e3164fe966f294b2837b6584b965b8d8e97571ba48f26c9bc0a91ac4b49fb4652bfaa5c340c82c57afbaa4620f2f6d49d7a7b330a66594d2b88c499d57c4093379b7dc322f2afa1ebab81004585751c39c19f8f9930c4
9NSTATES :1:7
10STATEPOS:1:6
11MOVE :12:P8:168,16/64
12MOVE :12:P0:186,85/64
13MOVE :12:P2:47,254/64
14MOVE :13:P5:131,153/64
15MOVE :12:P3:75,126/64
16MOVE :12:P7:93,303/64
diff --git a/apps/plugins/puzzles/src/icons/win16pal.xpm b/apps/plugins/puzzles/src/icons/win16pal.xpm
new file mode 100644
index 0000000000..66fd60a480
--- /dev/null
+++ b/apps/plugins/puzzles/src/icons/win16pal.xpm
@@ -0,0 +1,23 @@
1/* XPM */
2static char *win16pal[] = {
3/* columns rows colors chars-per-pixel */
4"16 1 16 1",
5" c #000000",
6". c #800000",
7"X c #008000",
8"o c #808000",
9"O c #000080",
10"+ c #800080",
11"@ c #008080",
12"# c #C0C0C0",
13"$ c #808080",
14"% c #FF0000",
15"& c #00FF00",
16"* c #FFFF00",
17"= c #0000FF",
18"- c #FF00FF",
19"; c #00FFFF",
20": c #FFFFFF",
21/* pixels */
22" .XoO+@#$%&*=-;:"
23};