diff options
author | Antoine Cellerier <dionoea@videolan.org> | 2007-06-28 20:45:00 +0000 |
---|---|---|
committer | Antoine Cellerier <dionoea@videolan.org> | 2007-06-28 20:45:00 +0000 |
commit | f91d06de7bf724e8e0aa580c18efa3eb345f88f9 (patch) | |
tree | 29c6446a4556cd074dbee3c3d97cdaae207ff228 /apps | |
parent | 7a1108227b67fb62f3d3447d795447b5b631ed32 (diff) | |
download | rockbox-f91d06de7bf724e8e0aa580c18efa3eb345f88f9.tar.gz rockbox-f91d06de7bf724e8e0aa580c18efa3eb345f88f9.zip |
Apply FS #6702: More Sokoban Improvements.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@13731 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps')
-rw-r--r-- | apps/FILES | 2 | ||||
-rw-r--r-- | apps/plugins/bitmaps/native/SOURCES | 8 | ||||
-rw-r--r-- | apps/plugins/sokoban.c | 1355 | ||||
-rw-r--r-- | apps/plugins/sokoban.levels | 1816 | ||||
-rw-r--r-- | apps/plugins/sokobanlevels.sok | 1277 | ||||
-rw-r--r-- | apps/plugins/viewers.config | 1 |
6 files changed, 2164 insertions, 2295 deletions
diff --git a/apps/FILES b/apps/FILES index 85d70cbe74..06b7b38b9a 100644 --- a/apps/FILES +++ b/apps/FILES | |||
@@ -42,7 +42,7 @@ plugins/*.pl | |||
42 | plugins/Makefile | 42 | plugins/Makefile |
43 | plugins/plugin.lds | 43 | plugins/plugin.lds |
44 | plugins/snake2.levels | 44 | plugins/snake2.levels |
45 | plugins/sokoban.levels | 45 | plugins/sokobanlevels.sok |
46 | plugins/viewers.config | 46 | plugins/viewers.config |
47 | plugins/SOURCES | 47 | plugins/SOURCES |
48 | plugins/SUBDIRS | 48 | plugins/SUBDIRS |
diff --git a/apps/plugins/bitmaps/native/SOURCES b/apps/plugins/bitmaps/native/SOURCES index 90a635ef01..00a6e3ab30 100644 --- a/apps/plugins/bitmaps/native/SOURCES +++ b/apps/plugins/bitmaps/native/SOURCES | |||
@@ -331,11 +331,13 @@ sokoban_tiles.14x14.bmp | |||
331 | #elif (LCD_HEIGHT >= 144) && (LCD_WIDTH >= 212) || \ | 331 | #elif (LCD_HEIGHT >= 144) && (LCD_WIDTH >= 212) || \ |
332 | (LCD_HEIGHT >= 169) && (LCD_WIDTH >= 180-4) | 332 | (LCD_HEIGHT >= 169) && (LCD_WIDTH >= 180-4) |
333 | sokoban_tiles.9x9.bmp | 333 | sokoban_tiles.9x9.bmp |
334 | #else | 334 | #elif (LCD_HEIGHT >= 96 && LCD_WIDTH >= 152) || \ |
335 | /* LCD_HEIGHT >= 96~121 && LCD_WIDTH >= 152~120 */ | 335 | (LCD_HEIGHT >= 121 && LCD_WIDTH >= 120) |
336 | sokoban_tiles.6x6.bmp | 336 | sokoban_tiles.6x6.bmp |
337 | #endif | 337 | #endif |
338 | #elif LCD_DEPTH >= 2 | 338 | #elif LCD_DEPTH >= 2 && \ |
339 | ((LCD_HEIGHT >= 96 && LCD_WIDTH >= 152) || \ | ||
340 | (LCD_HEIGHT >= 121 && LCD_WIDTH >= 120)) | ||
339 | sokoban_tiles.6x6x2.bmp | 341 | sokoban_tiles.6x6x2.bmp |
340 | #endif | 342 | #endif |
341 | 343 | ||
diff --git a/apps/plugins/sokoban.c b/apps/plugins/sokoban.c index 40a2f549ad..976f552dbd 100644 --- a/apps/plugins/sokoban.c +++ b/apps/plugins/sokoban.c | |||
@@ -10,6 +10,7 @@ | |||
10 | * Copyright (C) 2002 Eric Linenberg | 10 | * Copyright (C) 2002 Eric Linenberg |
11 | * February 2003: Robert Hak performs a cleanup/rewrite/feature addition. | 11 | * February 2003: Robert Hak performs a cleanup/rewrite/feature addition. |
12 | * Eric smiles. Bjorn cries. Linus say 'huh?'. | 12 | * Eric smiles. Bjorn cries. Linus say 'huh?'. |
13 | * March 2007: Sean Morrisey performs a major rewrite/feature addition. | ||
13 | * | 14 | * |
14 | * All files in this archive are subject to the GNU General Public License. | 15 | * All files in this archive are subject to the GNU General Public License. |
15 | * See the file COPYING in the source tree root for full license agreement. | 16 | * See the file COPYING in the source tree root for full license agreement. |
@@ -19,95 +20,126 @@ | |||
19 | * | 20 | * |
20 | ****************************************************************************/ | 21 | ****************************************************************************/ |
21 | #include "plugin.h" | 22 | #include "plugin.h" |
23 | #include "lib/playback_control.h" | ||
22 | 24 | ||
23 | #ifdef HAVE_LCD_BITMAP | 25 | #ifdef HAVE_LCD_BITMAP |
24 | 26 | ||
25 | PLUGIN_HEADER | 27 | PLUGIN_HEADER |
26 | 28 | ||
27 | #if LCD_DEPTH >= 2 | 29 | #if LCD_DEPTH >= 2 && ((LCD_HEIGHT >= 96 && LCD_WIDTH >= 152) || \ |
30 | (LCD_HEIGHT >= 121 && LCD_WIDTH >= 120)) | ||
28 | extern const fb_data sokoban_tiles[]; | 31 | extern const fb_data sokoban_tiles[]; |
29 | #endif | 32 | #endif |
30 | 33 | ||
31 | #define SOKOBAN_TITLE "Sokoban" | 34 | #define SOKOBAN_TITLE "Sokoban" |
32 | 35 | ||
33 | #define LEVELS_FILE PLUGIN_DIR "/sokoban.levels" | 36 | #define SOKOBAN_LEVELS_FILE PLUGIN_DIR "/sokobanlevels.sok" |
37 | #define SOKOBAN_SAVE_FILE PLUGIN_DIR "/sokobansave.sok" | ||
34 | 38 | ||
35 | #define ROWS 16 | 39 | /* Magnify is the number of pixels for each block. |
36 | #define COLS 20 | 40 | * Set dynamically so all targets can support levels |
37 | #define SOKOBAN_LEVEL_SIZE (ROWS*COLS) | 41 | * that fill their entire screen, less the stat box. |
38 | #define MAX_BUFFERED_BOARDS 500 | 42 | * 16 rows & 20 cols minimum */ |
39 | /* Use either all but 12k of the plugin buffer for board data | 43 | #if (LCD_HEIGHT >= 224) && (LCD_WIDTH >= 320) |
40 | or just enough for MAX_BUFFERED_BOARDS, which ever is less */ | 44 | #define MAGNIFY 14 |
41 | #if (PLUGIN_BUFFER_SIZE - 0x3000)/SOKOBAN_LEVEL_SIZE < MAX_BUFFERED_BOARDS | 45 | #define ROWS (LCD_HEIGHT/MAGNIFY) |
42 | #define NUM_BUFFERED_BOARDS (PLUGIN_BUFFER_SIZE - 0x3000)/SOKOBAN_LEVEL_SIZE | 46 | #define COLS ((LCD_WIDTH-40)/MAGNIFY) |
47 | #elif (LCD_HEIGHT >= 249) && (LCD_WIDTH >= 280) | ||
48 | #define MAGNIFY 14 | ||
49 | #define ROWS ((LCD_HEIGHT-25)/MAGNIFY) | ||
50 | #define COLS (LCD_WIDTH/MAGNIFY) | ||
51 | #elif (LCD_HEIGHT >= 144) && (LCD_WIDTH >= 220) | ||
52 | #define MAGNIFY 9 | ||
53 | #define ROWS (LCD_HEIGHT/MAGNIFY) | ||
54 | #define COLS ((LCD_WIDTH-40)/MAGNIFY) | ||
55 | #elif (LCD_HEIGHT >= 169) && (LCD_WIDTH+4 >= 180) /* plus 4 for sansa */ | ||
56 | #define MAGNIFY 9 | ||
57 | #define ROWS ((LCD_HEIGHT-25)/MAGNIFY) | ||
58 | #define COLS ((LCD_WIDTH+4)/MAGNIFY) | ||
59 | #elif (LCD_HEIGHT >= 96) && (LCD_WIDTH >= 160) | ||
60 | #define MAGNIFY 6 | ||
61 | #define ROWS (LCD_HEIGHT/MAGNIFY) | ||
62 | #define COLS ((LCD_WIDTH-40)/MAGNIFY) | ||
63 | #elif (LCD_HEIGHT >= 121) && (LCD_WIDTH >= 120) | ||
64 | #define MAGNIFY 6 | ||
65 | #define ROWS ((LCD_HEIGHT-25)/MAGNIFY) | ||
66 | #define COLS (LCD_WIDTH/MAGNIFY) | ||
43 | #else | 67 | #else |
44 | #define NUM_BUFFERED_BOARDS MAX_BUFFERED_BOARDS | 68 | #define MAGNIFY 4 |
69 | #define ROWS 16 | ||
70 | #define COLS 20 | ||
45 | #endif | 71 | #endif |
46 | /* Use 4k plus remaining plugin buffer (-8k for prog) for undo, up to 32k */ | 72 | |
47 | #if PLUGIN_BUFFER_SIZE - NUM_BUFFERED_BOARDS*SOKOBAN_LEVEL_SIZE - 0x2000 > \ | 73 | /* Use either all but 16k of the plugin buffer for level data |
48 | 0x7FFF | 74 | * or 128k, which ever is less */ |
49 | #define MAX_UNDOS 0x7FFF | 75 | #if PLUGIN_BUFFER_SIZE - 0x4000 < 0x20000 |
76 | #define MAX_LEVEL_DATA (PLUGIN_BUFFER_SIZE - 0x4000) | ||
77 | #else | ||
78 | #define MAX_LEVEL_DATA 0x20000 | ||
79 | #endif | ||
80 | |||
81 | /* Number of levels for which to allocate buffer indexes */ | ||
82 | #define MAX_LEVELS MAX_LEVEL_DATA/70 | ||
83 | |||
84 | /* Use 4k plus remaining plugin buffer (-12k for prog) for undo, up to 64k */ | ||
85 | #if PLUGIN_BUFFER_SIZE - MAX_LEVEL_DATA - 0x3000 > 0x10000 | ||
86 | #define MAX_UNDOS 0x10000 | ||
50 | #else | 87 | #else |
51 | #define MAX_UNDOS PLUGIN_BUFFER_SIZE - \ | 88 | #define MAX_UNDOS (PLUGIN_BUFFER_SIZE - MAX_LEVEL_DATA - 0x3000) |
52 | NUM_BUFFERED_BOARDS*SOKOBAN_LEVEL_SIZE - 0x2000 | ||
53 | #endif | 89 | #endif |
54 | 90 | ||
55 | /* Move/push definitions for undo */ | 91 | /* Move/push definitions for undo */ |
56 | enum { | 92 | #define SOKOBAN_PUSH_LEFT 'L' |
57 | SOKOBAN_PUSH_LEFT, | 93 | #define SOKOBAN_PUSH_RIGHT 'R' |
58 | SOKOBAN_PUSH_RIGHT, | 94 | #define SOKOBAN_PUSH_UP 'U' |
59 | SOKOBAN_PUSH_UP, | 95 | #define SOKOBAN_PUSH_DOWN 'D' |
60 | SOKOBAN_PUSH_DOWN, | 96 | #define SOKOBAN_MOVE_LEFT 'l' |
61 | SOKOBAN_MOVE_LEFT, | 97 | #define SOKOBAN_MOVE_RIGHT 'r' |
62 | SOKOBAN_MOVE_RIGHT, | 98 | #define SOKOBAN_MOVE_UP 'u' |
63 | SOKOBAN_MOVE_UP, | 99 | #define SOKOBAN_MOVE_DOWN 'd' |
64 | SOKOBAN_MOVE_DOWN | 100 | |
65 | }; | 101 | #define SOKOBAN_MOVE_DIFF (SOKOBAN_MOVE_LEFT-SOKOBAN_PUSH_LEFT) |
66 | #define SOKOBAN_MOVE_DIFF (SOKOBAN_MOVE_LEFT-SOKOBAN_PUSH_LEFT) | 102 | #define SOKOBAN_MOVE_MIN SOKOBAN_MOVE_DOWN |
67 | #define SOKOBAN_MOVE_MIN SOKOBAN_MOVE_LEFT | ||
68 | 103 | ||
69 | /* variable button definitions */ | 104 | /* variable button definitions */ |
70 | #if CONFIG_KEYPAD == RECORDER_PAD | 105 | #if (CONFIG_KEYPAD == RECORDER_PAD) || \ |
106 | (CONFIG_KEYPAD == ARCHOS_AV300_PAD) | ||
71 | #define SOKOBAN_UP BUTTON_UP | 107 | #define SOKOBAN_UP BUTTON_UP |
72 | #define SOKOBAN_DOWN BUTTON_DOWN | 108 | #define SOKOBAN_DOWN BUTTON_DOWN |
73 | #define SOKOBAN_QUIT BUTTON_OFF | 109 | #define SOKOBAN_MENU BUTTON_OFF |
74 | #define SOKOBAN_UNDO BUTTON_ON | 110 | #define SOKOBAN_UNDO BUTTON_ON |
75 | #define SOKOBAN_REDO BUTTON_PLAY | 111 | #define SOKOBAN_REDO BUTTON_PLAY |
76 | #define SOKOBAN_LEVEL_UP BUTTON_F3 | ||
77 | #define SOKOBAN_LEVEL_DOWN BUTTON_F1 | 112 | #define SOKOBAN_LEVEL_DOWN BUTTON_F1 |
78 | #define SOKOBAN_LEVEL_REPEAT BUTTON_F2 | 113 | #define SOKOBAN_LEVEL_REPEAT BUTTON_F2 |
79 | |||
80 | #elif CONFIG_KEYPAD == ARCHOS_AV300_PAD | ||
81 | #define SOKOBAN_UP BUTTON_UP | ||
82 | #define SOKOBAN_DOWN BUTTON_DOWN | ||
83 | #define SOKOBAN_QUIT BUTTON_OFF | ||
84 | #define SOKOBAN_UNDO BUTTON_ON | ||
85 | #define SOKOBAN_REDO BUTTON_PLAY | ||
86 | #define SOKOBAN_LEVEL_UP BUTTON_F3 | 114 | #define SOKOBAN_LEVEL_UP BUTTON_F3 |
87 | #define SOKOBAN_LEVEL_DOWN BUTTON_F1 | 115 | #define BUTTON_SAVE BUTTON_ON |
88 | #define SOKOBAN_LEVEL_REPEAT BUTTON_F2 | 116 | #define BUTTON_SAVE_NAME "ON" |
89 | 117 | ||
90 | #elif CONFIG_KEYPAD == ONDIO_PAD | 118 | #elif CONFIG_KEYPAD == ONDIO_PAD |
91 | #define SOKOBAN_UP BUTTON_UP | 119 | #define SOKOBAN_UP BUTTON_UP |
92 | #define SOKOBAN_DOWN BUTTON_DOWN | 120 | #define SOKOBAN_DOWN BUTTON_DOWN |
93 | #define SOKOBAN_QUIT BUTTON_OFF | 121 | #define SOKOBAN_MENU BUTTON_OFF |
94 | #define SOKOBAN_UNDO_PRE BUTTON_MENU | 122 | #define SOKOBAN_UNDO_PRE BUTTON_MENU |
95 | #define SOKOBAN_UNDO (BUTTON_MENU | BUTTON_REL) | 123 | #define SOKOBAN_UNDO (BUTTON_MENU | BUTTON_REL) |
96 | #define SOKOBAN_REDO (BUTTON_MENU | BUTTON_DOWN) | 124 | #define SOKOBAN_REDO (BUTTON_MENU | BUTTON_DOWN) |
97 | #define SOKOBAN_LEVEL_UP (BUTTON_MENU | BUTTON_RIGHT) | ||
98 | #define SOKOBAN_LEVEL_DOWN (BUTTON_MENU | BUTTON_LEFT) | 125 | #define SOKOBAN_LEVEL_DOWN (BUTTON_MENU | BUTTON_LEFT) |
99 | #define SOKOBAN_LEVEL_REPEAT (BUTTON_MENU | BUTTON_UP) | 126 | #define SOKOBAN_LEVEL_REPEAT (BUTTON_MENU | BUTTON_UP) |
127 | #define SOKOBAN_LEVEL_UP (BUTTON_MENU | BUTTON_RIGHT) | ||
128 | #define BUTTON_SAVE BUTTON_MENU | ||
129 | #define BUTTON_SAVE_NAME "MENU" | ||
100 | 130 | ||
101 | #elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \ | 131 | #elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \ |
102 | (CONFIG_KEYPAD == IRIVER_H300_PAD) | 132 | (CONFIG_KEYPAD == IRIVER_H300_PAD) |
103 | #define SOKOBAN_UP BUTTON_UP | 133 | #define SOKOBAN_UP BUTTON_UP |
104 | #define SOKOBAN_DOWN BUTTON_DOWN | 134 | #define SOKOBAN_DOWN BUTTON_DOWN |
105 | #define SOKOBAN_QUIT BUTTON_OFF | 135 | #define SOKOBAN_MENU BUTTON_OFF |
106 | #define SOKOBAN_UNDO BUTTON_REC | 136 | #define SOKOBAN_UNDO BUTTON_REC |
107 | #define SOKOBAN_REDO BUTTON_MODE | 137 | #define SOKOBAN_REDO BUTTON_MODE |
108 | #define SOKOBAN_LEVEL_UP (BUTTON_ON | BUTTON_UP) | ||
109 | #define SOKOBAN_LEVEL_DOWN (BUTTON_ON | BUTTON_DOWN) | 138 | #define SOKOBAN_LEVEL_DOWN (BUTTON_ON | BUTTON_DOWN) |
110 | #define SOKOBAN_LEVEL_REPEAT BUTTON_ON | 139 | #define SOKOBAN_LEVEL_REPEAT BUTTON_ON |
140 | #define SOKOBAN_LEVEL_UP (BUTTON_ON | BUTTON_UP) | ||
141 | #define BUTTON_SAVE BUTTON_MODE | ||
142 | #define BUTTON_SAVE_NAME "MODE" | ||
111 | 143 | ||
112 | #define SOKOBAN_RC_QUIT BUTTON_RC_STOP | 144 | #define SOKOBAN_RC_QUIT BUTTON_RC_STOP |
113 | 145 | ||
@@ -115,65 +147,70 @@ enum { | |||
115 | (CONFIG_KEYPAD == IPOD_3G_PAD) | 147 | (CONFIG_KEYPAD == IPOD_3G_PAD) |
116 | #define SOKOBAN_UP BUTTON_MENU | 148 | #define SOKOBAN_UP BUTTON_MENU |
117 | #define SOKOBAN_DOWN BUTTON_PLAY | 149 | #define SOKOBAN_DOWN BUTTON_PLAY |
118 | #define SOKOBAN_QUIT (BUTTON_SELECT | BUTTON_MENU) | 150 | #define SOKOBAN_MENU (BUTTON_SELECT | BUTTON_MENU) |
119 | #define SOKOBAN_UNDO_PRE BUTTON_SELECT | 151 | #define SOKOBAN_UNDO_PRE BUTTON_SELECT |
120 | #define SOKOBAN_UNDO (BUTTON_SELECT | BUTTON_REL) | 152 | #define SOKOBAN_UNDO (BUTTON_SELECT | BUTTON_REL) |
121 | #define SOKOBAN_REDO (BUTTON_SELECT | BUTTON_PLAY) | 153 | #define SOKOBAN_REDO (BUTTON_SELECT | BUTTON_PLAY) |
122 | #define SOKOBAN_LEVEL_UP (BUTTON_SELECT | BUTTON_RIGHT) | ||
123 | #define SOKOBAN_LEVEL_DOWN (BUTTON_SELECT | BUTTON_LEFT) | 154 | #define SOKOBAN_LEVEL_DOWN (BUTTON_SELECT | BUTTON_LEFT) |
155 | #define SOKOBAN_LEVEL_UP (BUTTON_SELECT | BUTTON_RIGHT) | ||
156 | #define BUTTON_SAVE BUTTON_SELECT | ||
157 | #define BUTTON_SAVE_NAME "SELECT" | ||
124 | 158 | ||
125 | /* fixme: if/when simultaneous button presses work for X5, | 159 | /* FIXME: if/when simultaneous button presses work for X5, |
126 | add redo & level repeat */ | 160 | * add redo & level repeat */ |
127 | #elif (CONFIG_KEYPAD == IAUDIO_X5M5_PAD) | 161 | #elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD |
128 | #define SOKOBAN_UP BUTTON_UP | 162 | #define SOKOBAN_UP BUTTON_UP |
129 | #define SOKOBAN_DOWN BUTTON_DOWN | 163 | #define SOKOBAN_DOWN BUTTON_DOWN |
130 | #define SOKOBAN_QUIT BUTTON_POWER | 164 | #define SOKOBAN_MENU BUTTON_POWER |
131 | #define SOKOBAN_UNDO_PRE BUTTON_SELECT | 165 | #define SOKOBAN_UNDO_PRE BUTTON_SELECT |
132 | #define SOKOBAN_UNDO (BUTTON_SELECT | BUTTON_REL) | 166 | #define SOKOBAN_UNDO (BUTTON_SELECT | BUTTON_REL) |
133 | #define SOKOBAN_LEVEL_UP BUTTON_PLAY | ||
134 | #define SOKOBAN_LEVEL_DOWN BUTTON_REC | 167 | #define SOKOBAN_LEVEL_DOWN BUTTON_REC |
168 | #define SOKOBAN_LEVEL_UP BUTTON_PLAY | ||
169 | #define BUTTON_SAVE BUTTON_SELECT | ||
170 | #define BUTTON_SAVE_NAME "SELECT" | ||
135 | 171 | ||
136 | #elif (CONFIG_KEYPAD == GIGABEAT_PAD) | 172 | #elif CONFIG_KEYPAD == IRIVER_H10_PAD |
173 | #define SOKOBAN_UP BUTTON_SCROLL_UP | ||
174 | #define SOKOBAN_DOWN BUTTON_SCROLL_DOWN | ||
175 | #define SOKOBAN_MENU BUTTON_POWER | ||
176 | #define SOKOBAN_UNDO_PRE BUTTON_REW | ||
177 | #define SOKOBAN_UNDO (BUTTON_REW | BUTTON_REL) | ||
178 | #define SOKOBAN_REDO BUTTON_FF | ||
179 | #define SOKOBAN_LEVEL_DOWN (BUTTON_PLAY | BUTTON_SCROLL_DOWN) | ||
180 | #define SOKOBAN_LEVEL_REPEAT (BUTTON_PLAY | BUTTON_RIGHT) | ||
181 | #define SOKOBAN_LEVEL_UP (BUTTON_PLAY | BUTTON_SCROLL_UP) | ||
182 | #define BUTTON_SAVE BUTTON_PLAY | ||
183 | #define BUTTON_SAVE_NAME "PLAY" | ||
184 | |||
185 | #elif CONFIG_KEYPAD == GIGABEAT_PAD | ||
137 | #define SOKOBAN_UP BUTTON_UP | 186 | #define SOKOBAN_UP BUTTON_UP |
138 | #define SOKOBAN_DOWN BUTTON_DOWN | 187 | #define SOKOBAN_DOWN BUTTON_DOWN |
139 | #define SOKOBAN_QUIT BUTTON_POWER | 188 | #define SOKOBAN_MENU BUTTON_POWER |
140 | #define SOKOBAN_UNDO BUTTON_SELECT | 189 | #define SOKOBAN_UNDO BUTTON_SELECT |
141 | #define SOKOBAN_REDO BUTTON_A | 190 | #define SOKOBAN_REDO BUTTON_A |
142 | #define SOKOBAN_LEVEL_UP BUTTON_VOL_UP | ||
143 | #define SOKOBAN_LEVEL_DOWN BUTTON_VOL_DOWN | 191 | #define SOKOBAN_LEVEL_DOWN BUTTON_VOL_DOWN |
144 | #define SOKOBAN_LEVEL_REPEAT BUTTON_MENU | 192 | #define SOKOBAN_LEVEL_REPEAT BUTTON_MENU |
193 | #define SOKOBAN_LEVEL_UP BUTTON_VOL_UP | ||
194 | #define BUTTON_SAVE BUTTON_SELECT | ||
195 | #define BUTTON_SAVE_NAME "SELECT" | ||
145 | 196 | ||
146 | #elif (CONFIG_KEYPAD == SANSA_E200_PAD) | 197 | #elif CONFIG_KEYPAD == SANSA_E200_PAD |
147 | #define SOKOBAN_UP BUTTON_UP | 198 | #define SOKOBAN_UP BUTTON_UP |
148 | #define SOKOBAN_DOWN BUTTON_DOWN | 199 | #define SOKOBAN_DOWN BUTTON_DOWN |
149 | #define SOKOBAN_QUIT BUTTON_POWER | 200 | #define SOKOBAN_MENU BUTTON_POWER |
150 | #define SOKOBAN_UNDO_PRE BUTTON_SELECT | 201 | #define SOKOBAN_UNDO_PRE BUTTON_SELECT |
151 | #define SOKOBAN_UNDO (BUTTON_SELECT | BUTTON_REL) | 202 | #define SOKOBAN_UNDO (BUTTON_SELECT | BUTTON_REL) |
152 | #define SOKOBAN_REDO BUTTON_REC | 203 | #define SOKOBAN_REDO BUTTON_REC |
153 | #define SOKOBAN_LEVEL_UP (BUTTON_SELECT | BUTTON_UP) | ||
154 | #define SOKOBAN_LEVEL_DOWN (BUTTON_SELECT | BUTTON_DOWN) | 204 | #define SOKOBAN_LEVEL_DOWN (BUTTON_SELECT | BUTTON_DOWN) |
155 | #define SOKOBAN_LEVEL_REPEAT (BUTTON_SELECT | BUTTON_RIGHT) | 205 | #define SOKOBAN_LEVEL_REPEAT (BUTTON_SELECT | BUTTON_RIGHT) |
156 | 206 | #define SOKOBAN_LEVEL_UP (BUTTON_SELECT | BUTTON_UP) | |
157 | #elif (CONFIG_KEYPAD == IRIVER_H10_PAD) | 207 | #define BUTTON_SAVE BUTTON_SELECT |
158 | #define SOKOBAN_UP BUTTON_SCROLL_UP | 208 | #define BUTTON_SAVE_NAME "SELECT" |
159 | #define SOKOBAN_DOWN BUTTON_SCROLL_DOWN | ||
160 | #define SOKOBAN_QUIT BUTTON_POWER | ||
161 | #define SOKOBAN_UNDO_PRE BUTTON_REW | ||
162 | #define SOKOBAN_UNDO (BUTTON_REW | BUTTON_REL) | ||
163 | #define SOKOBAN_REDO BUTTON_FF | ||
164 | #define SOKOBAN_LEVEL_UP (BUTTON_PLAY | BUTTON_SCROLL_UP) | ||
165 | #define SOKOBAN_LEVEL_DOWN (BUTTON_PLAY | BUTTON_SCROLL_DOWN) | ||
166 | #define SOKOBAN_LEVEL_REPEAT (BUTTON_PLAY | BUTTON_RIGHT) | ||
167 | 209 | ||
168 | #endif | 210 | #endif |
169 | 211 | ||
170 | #ifdef HAVE_LCD_COLOR | 212 | #define SOKOBAN_FONT FONT_SYSFIXED |
171 | /* Background color. Default Rockbox light blue. */ | ||
172 | #define BG_COLOR LCD_RGBPACK(181, 199, 231) | ||
173 | 213 | ||
174 | #elif LCD_DEPTH >= 2 | ||
175 | #define MEDIUM_GRAY LCD_BRIGHTNESS(127) | ||
176 | #endif | ||
177 | 214 | ||
178 | /* The Location, Undo and LevelInfo structs are OO-flavored. | 215 | /* The Location, Undo and LevelInfo structs are OO-flavored. |
179 | * (oooh!-flavored as Schnueff puts it.) It makes more you have to know, | 216 | * (oooh!-flavored as Schnueff puts it.) It makes more you have to know, |
@@ -181,10 +218,12 @@ enum { | |||
181 | 218 | ||
182 | /* Level data & stats */ | 219 | /* Level data & stats */ |
183 | struct LevelInfo { | 220 | struct LevelInfo { |
184 | short level; | 221 | short index; /* Level index (level number - 1) */ |
185 | short moves; | 222 | int moves; /* Moves & pushes for the stats */ |
186 | short pushes; | 223 | int pushes; |
187 | short boxes_to_go; | 224 | short boxes_to_go; /* Number of unplaced boxes remaining in level */ |
225 | short height; /* Height & width for centering level display */ | ||
226 | short width; | ||
188 | }; | 227 | }; |
189 | 228 | ||
190 | struct Location { | 229 | struct Location { |
@@ -192,39 +231,42 @@ struct Location { | |||
192 | short col; | 231 | short col; |
193 | }; | 232 | }; |
194 | 233 | ||
195 | struct Board { | ||
196 | char spaces[ROWS][COLS]; | ||
197 | }; | ||
198 | |||
199 | /* Our full undo history */ | 234 | /* Our full undo history */ |
200 | static struct UndoInfo { | 235 | static struct UndoInfo { |
201 | short count; /* How many undos are left */ | 236 | int count; /* How many undos have been done */ |
202 | short current; /* Which history is the current undo */ | 237 | int current; /* Which history is the current undo */ |
203 | short max; /* Which history is the max redoable */ | 238 | int max; /* Which history is the max redoable */ |
204 | char history[MAX_UNDOS]; | 239 | char history[MAX_UNDOS]; |
205 | } undo_info; | 240 | } undo_info; |
206 | 241 | ||
207 | /* Our playing board */ | 242 | /* Our playing board */ |
208 | static struct BoardInfo { | 243 | static struct BoardInfo { |
209 | char board[ROWS][COLS]; | 244 | char board[ROWS][COLS]; /* The current board data */ |
210 | struct LevelInfo level; | 245 | struct LevelInfo level; /* Level data & stats */ |
211 | struct Location player; | 246 | struct Location player; /* Where the player is */ |
212 | int max_level; /* How many levels do we have? */ | 247 | int max_level; /* The number of levels we have */ |
213 | int loaded_level; /* Which level is in memory */ | ||
214 | } current_info; | 248 | } current_info; |
215 | 249 | ||
216 | static struct BufferedBoards { | 250 | static struct BufferedBoards { |
217 | struct Board levels[NUM_BUFFERED_BOARDS]; | 251 | char filename[MAX_PATH]; /* Filename of the levelset we're using */ |
218 | int low; | 252 | char data[MAX_LEVEL_DATA]; /* Buffered level data */ |
253 | int index[MAX_LEVELS + 1]; /* Where each buffered board begins & ends */ | ||
254 | int start; /* Index of first buffered board */ | ||
255 | int end; /* Index of last buffered board */ | ||
256 | short prebuffered_boards; /* Number of boards before current to store */ | ||
219 | } buffered_boards; | 257 | } buffered_boards; |
220 | 258 | ||
259 | |||
221 | static struct plugin_api* rb; | 260 | static struct plugin_api* rb; |
222 | 261 | ||
262 | static char buf[ROWS*(COLS + 1)]; /* Enough for a whole board or a filename */ | ||
263 | |||
264 | |||
223 | static void init_undo(void) | 265 | static void init_undo(void) |
224 | { | 266 | { |
225 | undo_info.count = 0; | 267 | undo_info.count = 0; |
226 | undo_info.current = -1; | 268 | undo_info.current = 0; |
227 | undo_info.max = -1; | 269 | undo_info.max = 0; |
228 | } | 270 | } |
229 | 271 | ||
230 | static void get_delta(char direction, short *d_r, short *d_c) | 272 | static void get_delta(char direction, short *d_r, short *d_c) |
@@ -261,9 +303,17 @@ static void undo(void) | |||
261 | bool undo_push = false; | 303 | bool undo_push = false; |
262 | 304 | ||
263 | /* If no more undos or we've wrapped all the way around, quit */ | 305 | /* If no more undos or we've wrapped all the way around, quit */ |
264 | if (undo_info.count == 0 || undo_info.current-1 == undo_info.max) | 306 | if (undo_info.count == 0 || undo_info.current - 1 == undo_info.max) |
265 | return; | 307 | return; |
266 | 308 | ||
309 | /* Move to previous undo in the list */ | ||
310 | if (undo_info.current == 0 && undo_info.count > 1) | ||
311 | undo_info.current = MAX_UNDOS - 1; | ||
312 | else | ||
313 | undo_info.current--; | ||
314 | |||
315 | undo_info.count--; | ||
316 | |||
267 | undo = undo_info.history[undo_info.current]; | 317 | undo = undo_info.history[undo_info.current]; |
268 | 318 | ||
269 | if (undo < SOKOBAN_MOVE_MIN) | 319 | if (undo < SOKOBAN_MOVE_MIN) |
@@ -281,17 +331,17 @@ static void undo(void) | |||
281 | 331 | ||
282 | /* Update board info */ | 332 | /* Update board info */ |
283 | if (undo_push) { | 333 | if (undo_push) { |
284 | /* Moving box from goal to blank */ | 334 | /* Moving box from goal to floor */ |
285 | if (*space_next == '%' && *space_cur == '@') | 335 | if (*space_next == '*' && *space_cur == '@') |
286 | current_info.level.boxes_to_go++; | 336 | current_info.level.boxes_to_go++; |
287 | /* Moving box from blank to goal */ | 337 | /* Moving box from floor to goal */ |
288 | else if (*space_next == '$' && *space_cur == '+') | 338 | else if (*space_next == '$' && *space_cur == '+') |
289 | current_info.level.boxes_to_go--; | 339 | current_info.level.boxes_to_go--; |
290 | 340 | ||
291 | /* Move box off of next space... */ | 341 | /* Move box off of next space... */ |
292 | *space_next = (*space_next == '%' ? '.' : ' '); | 342 | *space_next = (*space_next == '*' ? '.' : ' '); |
293 | /* ...and on to current space */ | 343 | /* ...and on to current space */ |
294 | *space_cur = (*space_cur == '+' ? '%' : '$'); | 344 | *space_cur = (*space_cur == '+' ? '*' : '$'); |
295 | 345 | ||
296 | current_info.level.pushes--; | 346 | current_info.level.pushes--; |
297 | } else | 347 | } else |
@@ -306,27 +356,19 @@ static void undo(void) | |||
306 | 356 | ||
307 | current_info.level.moves--; | 357 | current_info.level.moves--; |
308 | 358 | ||
309 | /* Move to previous undo in the list */ | ||
310 | if (undo_info.current == 0 && undo_info.count > 1) | ||
311 | undo_info.current = MAX_UNDOS - 1; | ||
312 | else | ||
313 | undo_info.current--; | ||
314 | |||
315 | undo_info.count--; | ||
316 | |||
317 | return; | 359 | return; |
318 | } | 360 | } |
319 | 361 | ||
320 | static void add_undo(char undo) | 362 | static void add_undo(char undo) |
321 | { | 363 | { |
364 | undo_info.history[undo_info.current] = undo; | ||
365 | |||
322 | /* Wrap around if MAX_UNDOS exceeded */ | 366 | /* Wrap around if MAX_UNDOS exceeded */ |
323 | if (undo_info.current < (MAX_UNDOS - 1)) | 367 | if (undo_info.current < (MAX_UNDOS - 1)) |
324 | undo_info.current++; | 368 | undo_info.current++; |
325 | else | 369 | else |
326 | undo_info.current = 0; | 370 | undo_info.current = 0; |
327 | 371 | ||
328 | undo_info.history[undo_info.current] = undo; | ||
329 | |||
330 | if (undo_info.count < MAX_UNDOS) | 372 | if (undo_info.count < MAX_UNDOS) |
331 | undo_info.count++; | 373 | undo_info.count++; |
332 | } | 374 | } |
@@ -353,34 +395,37 @@ static bool move(char direction, bool redo) | |||
353 | space_next = ¤t_info.board[r + d_r][c + d_c]; | 395 | space_next = ¤t_info.board[r + d_r][c + d_c]; |
354 | space_beyond = ¤t_info.board[r + 2*d_r][c + 2*d_c]; | 396 | space_beyond = ¤t_info.board[r + 2*d_r][c + 2*d_c]; |
355 | 397 | ||
356 | if (*space_next == '$' || *space_next == '%') { | 398 | if (*space_next == '$' || *space_next == '*') { |
357 | /* Change direction from move to push for undo */ | 399 | /* Change direction from move to push for undo */ |
358 | if (direction >= SOKOBAN_MOVE_MIN) | 400 | if (direction >= SOKOBAN_MOVE_MIN) |
359 | direction -= SOKOBAN_MOVE_DIFF; | 401 | direction -= SOKOBAN_MOVE_DIFF; |
360 | push = true; | 402 | push = true; |
361 | } | 403 | } |
404 | else if (direction < SOKOBAN_MOVE_MIN) | ||
405 | /* Change back to move if redo/solution playback push is invalid */ | ||
406 | direction += SOKOBAN_MOVE_DIFF; | ||
362 | 407 | ||
363 | /* Update board info */ | 408 | /* Update board info */ |
364 | if (push) { | 409 | if (push) { |
365 | /* Moving box from goal to blank */ | 410 | /* Moving box from goal to floor */ |
366 | if (*space_next == '%' && *space_beyond == ' ') | 411 | if (*space_next == '*' && *space_beyond == ' ') |
367 | current_info.level.boxes_to_go++; | 412 | current_info.level.boxes_to_go++; |
368 | /* Moving box from blank to goal */ | 413 | /* Moving box from floor to goal */ |
369 | else if (*space_next == '$' && *space_beyond == '.') | 414 | else if (*space_next == '$' && *space_beyond == '.') |
370 | current_info.level.boxes_to_go--; | 415 | current_info.level.boxes_to_go--; |
371 | /* Check for illegal move */ | 416 | /* Check for invalid move */ |
372 | else if (*space_beyond != '.' && *space_beyond != ' ') | 417 | else if (*space_beyond != '.' && *space_beyond != ' ') |
373 | return false; | 418 | return false; |
374 | 419 | ||
375 | /* Move player onto next space */ | 420 | /* Move player onto next space */ |
376 | *space_next = (*space_next == '%' ? '+' : '@'); | 421 | *space_next = (*space_next == '*' ? '+' : '@'); |
377 | /* Move box onto space beyond next */ | 422 | /* Move box onto space beyond next */ |
378 | *space_beyond = (*space_beyond == '.' ? '%' : '$'); | 423 | *space_beyond = (*space_beyond == '.' ? '*' : '$'); |
379 | 424 | ||
380 | current_info.level.pushes++; | 425 | current_info.level.pushes++; |
381 | } else { | 426 | } else { |
382 | /* Check for illegal move */ | 427 | /* Check for invalid move */ |
383 | if (*space_next == '#' || *space_next == 'X') | 428 | if (*space_next != '.' && *space_next != ' ') |
384 | return false; | 429 | return false; |
385 | 430 | ||
386 | /* Move player onto next space */ | 431 | /* Move player onto next space */ |
@@ -396,19 +441,19 @@ static bool move(char direction, bool redo) | |||
396 | current_info.level.moves++; | 441 | current_info.level.moves++; |
397 | 442 | ||
398 | /* Update undo_info.max to current on every normal move, | 443 | /* Update undo_info.max to current on every normal move, |
399 | except if it's the same as a redo. */ | 444 | * except if it's the same as a redo. */ |
400 | /* normal move */ | 445 | /* normal move and either */ |
401 | if (!redo && | 446 | if (!redo && |
402 | /* moves have been undone */ | 447 | /* moves have been undone... */ |
403 | ((undo_info.max != undo_info.current && | 448 | ((undo_info.max != undo_info.current && |
404 | /* and the current move is NOT the same as the one in history */ | 449 | /* ...and the current move is NOT the same as the one in history */ |
405 | undo_info.history[undo_info.current+1] != direction) || | 450 | undo_info.history[undo_info.current] != direction) || |
406 | /* or moves have not been undone */ | 451 | /* or moves have not been undone */ |
407 | undo_info.max == undo_info.current)) { | 452 | undo_info.max == undo_info.current)) { |
408 | add_undo(direction); | 453 | add_undo(direction); |
409 | undo_info.max = undo_info.current; | 454 | undo_info.max = undo_info.current; |
410 | } else /* redo move or move was same as redo */ | 455 | } else /* redo move or move was same as redo */ |
411 | add_undo(direction); /* (just to update current) */ | 456 | add_undo(direction); /* add_undo to update current */ |
412 | 457 | ||
413 | return true; | 458 | return true; |
414 | } | 459 | } |
@@ -420,290 +465,370 @@ static bool redo(void) | |||
420 | if (undo_info.current == undo_info.max) | 465 | if (undo_info.current == undo_info.max) |
421 | return false; | 466 | return false; |
422 | 467 | ||
423 | return move(undo_info.history[(undo_info.current+1 < MAX_UNDOS ? | 468 | return move(undo_info.history[(undo_info.current < MAX_UNDOS ? |
424 | undo_info.current+1 : 0)], true); | 469 | undo_info.current : 0)], true); |
425 | } | 470 | } |
426 | #endif | 471 | #endif |
427 | 472 | ||
428 | static void init_boards(void) | 473 | static void init_boards(void) |
429 | { | 474 | { |
430 | current_info.level.level = 0; | 475 | rb->strncpy(buffered_boards.filename, SOKOBAN_LEVELS_FILE, MAX_PATH); |
431 | current_info.level.moves = 0; | 476 | |
432 | current_info.level.pushes = 0; | 477 | current_info.level.index = 0; |
433 | current_info.level.boxes_to_go = 0; | ||
434 | current_info.player.row = 0; | 478 | current_info.player.row = 0; |
435 | current_info.player.col = 0; | 479 | current_info.player.col = 0; |
436 | current_info.max_level = 0; | 480 | current_info.max_level = 0; |
437 | current_info.loaded_level = 0; | ||
438 | 481 | ||
439 | buffered_boards.low = 0; | 482 | buffered_boards.start = 0; |
483 | buffered_boards.end = 0; | ||
484 | buffered_boards.prebuffered_boards = 0; | ||
440 | 485 | ||
441 | init_undo(); | 486 | init_undo(); |
442 | } | 487 | } |
443 | 488 | ||
444 | static int read_levels(int initialize_count) | 489 | static bool read_levels(bool initialize) |
445 | { | 490 | { |
446 | int fd = 0; | 491 | int fd = 0; |
447 | int len; | 492 | short len; |
448 | int lastlen = 0; | 493 | short lastlen = 0; |
449 | int row = 0; | 494 | short row = 0; |
450 | int level_count = 0; | 495 | int level_count = 0; |
451 | char buffer[COLS + 3]; /* COLS plus CR/LF and \0 */ | ||
452 | int endpoint = current_info.level.level-1; | ||
453 | |||
454 | if (endpoint < buffered_boards.low) | ||
455 | endpoint = current_info.level.level - NUM_BUFFERED_BOARDS; | ||
456 | 496 | ||
457 | if (endpoint < 0) endpoint = 0; | 497 | int i = 0; |
498 | int level_len = 0; | ||
499 | bool index_set = false; | ||
458 | 500 | ||
459 | buffered_boards.low = endpoint; | 501 | /* Get the index of the first level to buffer */ |
460 | endpoint += NUM_BUFFERED_BOARDS; | 502 | if (current_info.level.index > buffered_boards.prebuffered_boards && |
503 | !initialize) | ||
504 | buffered_boards.start = current_info.level.index - | ||
505 | buffered_boards.prebuffered_boards; | ||
506 | else | ||
507 | buffered_boards.start = 0; | ||
461 | 508 | ||
462 | if ((fd = rb->open(LEVELS_FILE, O_RDONLY)) < 0) { | 509 | if ((fd = rb->open(buffered_boards.filename, O_RDONLY)) < 0) { |
463 | rb->splash(HZ*2, "Unable to open %s", LEVELS_FILE); | 510 | rb->splash(HZ*2, "Unable to open %s", buffered_boards.filename); |
464 | return -1; | 511 | return false; |
465 | } | 512 | } |
466 | 513 | ||
467 | do { | 514 | do { |
468 | len = rb->read_line(fd, buffer, sizeof(buffer)); | 515 | len = rb->read_line(fd, buf, sizeof(buf)); |
469 | if (len >= 3) { | 516 | |
470 | /* This finds lines that are more than 1 or 2 characters | 517 | /* Correct len when trailing \r's or \n's are counted */ |
471 | * shorter than they should be. Due to the possibility of | 518 | if (len > 2 && buf[len - 2] == '\0') |
472 | * a mixed unix and dos CR/LF file format, I'm not going to | 519 | len -= 2; |
473 | * do a precise check */ | 520 | else if (len > 1 && buf[len - 1] == '\0') |
474 | if (len < COLS) { | 521 | len--; |
475 | rb->splash(HZ*2, "Error in levels file: short line"); | 522 | |
476 | return -1; | 523 | /* Skip short lines & lines with non-level data */ |
477 | } | 524 | if (len >= 3 && ((buf[0] >= '1' && buf[0] <= '9') || buf[0] == '#' || |
478 | if (level_count >= buffered_boards.low && level_count < endpoint) { | 525 | buf[0] == ' ' || buf[0] == '-' || buf[0] == '_')) { |
479 | int index = level_count - buffered_boards.low; | 526 | if (level_count >= buffered_boards.start) { |
480 | rb->memcpy( | 527 | /* Set the index of this level */ |
481 | buffered_boards.levels[index].spaces[row], buffer, COLS); | 528 | if (!index_set && |
529 | level_count - buffered_boards.start < MAX_LEVELS) { | ||
530 | buffered_boards.index[level_count - buffered_boards.start] | ||
531 | = i; | ||
532 | index_set = true; | ||
533 | } | ||
534 | /* Copy buffer to board data */ | ||
535 | if (i + level_len + len < MAX_LEVEL_DATA) { | ||
536 | rb->memcpy(&buffered_boards.data[i + level_len], buf, len); | ||
537 | buffered_boards.data[i + level_len + len] = '\n'; | ||
538 | } | ||
482 | } | 539 | } |
540 | level_len += len + 1; | ||
483 | row++; | 541 | row++; |
484 | } else if (len) { | 542 | |
485 | if (lastlen < 3) { | 543 | /* If newline & level is tall enough or is RLE */ |
486 | /* Two short lines in a row means new level */ | 544 | } else if (buf[0] == '\0' && (row > 2 || lastlen > 22)) { |
487 | level_count++; | 545 | level_count++; |
488 | if (level_count >= endpoint && !initialize_count) break; | 546 | if (level_count >= buffered_boards.start) { |
489 | if (level_count && row != ROWS) { | 547 | i += level_len; |
490 | rb->splash(HZ*2, "Error in levels file: short board"); | 548 | if (i < MAX_LEVEL_DATA) |
491 | return -1; | 549 | buffered_boards.end = level_count; |
492 | } | 550 | else if (!initialize) |
493 | row = 0; | 551 | break; |
494 | } | 552 | } |
495 | } | 553 | row = 0; |
496 | } while ((lastlen=len)); | 554 | level_len = 0; |
555 | index_set = false; | ||
497 | 556 | ||
498 | rb->close(fd); | 557 | } else if (len > 22) |
499 | if (initialize_count) { | 558 | len = 1; |
500 | /* Plus one because there aren't trailing short lines in the file */ | 559 | |
501 | current_info.max_level = level_count + 1; | 560 | } while ((lastlen = len)); |
561 | |||
562 | /* Set the index of the end of the last level */ | ||
563 | if (level_count - buffered_boards.start < MAX_LEVELS) | ||
564 | buffered_boards.index[level_count - buffered_boards.start] = i; | ||
565 | |||
566 | if (initialize) { | ||
567 | current_info.max_level = level_count; | ||
568 | buffered_boards.prebuffered_boards = buffered_boards.end/2; | ||
502 | } | 569 | } |
503 | return 0; | 570 | |
571 | rb->close(fd); | ||
572 | |||
573 | return true; | ||
504 | } | 574 | } |
505 | 575 | ||
506 | /* return non-zero on error */ | ||
507 | static void load_level(void) | 576 | static void load_level(void) |
508 | { | 577 | { |
509 | int c = 0; | 578 | int c, r; |
510 | int r = 0; | 579 | int i, n; |
511 | int index = current_info.level.level - buffered_boards.low - 1; | 580 | int level_size; |
512 | struct Board *level; | 581 | int index = current_info.level.index - buffered_boards.start; |
513 | 582 | char *level; | |
514 | if (index < 0 || index >= NUM_BUFFERED_BOARDS) { | 583 | |
584 | /* Get the buffered board index of the current level */ | ||
585 | if (current_info.level.index < buffered_boards.start || | ||
586 | current_info.level.index >= buffered_boards.end) { | ||
515 | read_levels(false); | 587 | read_levels(false); |
516 | index = index < 0 ? NUM_BUFFERED_BOARDS-1 : 0; | 588 | if (current_info.level.index > buffered_boards.prebuffered_boards) |
589 | index = buffered_boards.prebuffered_boards; | ||
590 | else | ||
591 | index = current_info.level.index; | ||
517 | } | 592 | } |
518 | level = &buffered_boards.levels[index]; | 593 | level = &buffered_boards.data[buffered_boards.index[index]]; |
519 | 594 | ||
520 | current_info.level.boxes_to_go = 0; | 595 | /* Reset level info */ |
521 | current_info.level.moves = 0; | 596 | current_info.level.moves = 0; |
522 | current_info.level.pushes = 0; | 597 | current_info.level.pushes = 0; |
523 | current_info.loaded_level = current_info.level.level; | 598 | current_info.level.boxes_to_go = 0; |
599 | current_info.level.width = 0; | ||
600 | |||
601 | /* Clear board */ | ||
602 | for (r = 0; r < ROWS; r++) | ||
603 | for (c = 0; c < COLS; c++) | ||
604 | current_info.board[r][c] = 'X'; | ||
605 | |||
606 | level_size = buffered_boards.index[index + 1] - | ||
607 | buffered_boards.index[index]; | ||
608 | |||
609 | for (r = 0, c = 0, n = 1, i = 0; i < level_size; i++) { | ||
610 | if (level[i] == '\n' || level[i] == '|') { | ||
611 | if (c > 3) { | ||
612 | /* Update max width of level & go to next row */ | ||
613 | if (c > current_info.level.width) | ||
614 | current_info.level.width = c; | ||
615 | c = 0; | ||
616 | r++; | ||
617 | if (r >= ROWS) | ||
618 | break; | ||
619 | } | ||
620 | } else if (c < COLS) { | ||
621 | /* Read RLE character's length into n */ | ||
622 | if (level[i] >= '0' && level[i] <= '9') { | ||
623 | n = level[i++] - '0'; | ||
624 | if (level[i] >= '0' && level[i] <= '9') | ||
625 | n = n*10 + level[i++] - '0'; | ||
626 | } | ||
627 | |||
628 | /* Cleanup & replace */ | ||
629 | if (level[i] == '%') | ||
630 | level[i] = '*'; | ||
631 | else if (level[i] == '-' || level[i] == '_') | ||
632 | level[i] = ' '; | ||
633 | |||
634 | if (n > 1) { | ||
635 | if (c + n >= COLS) | ||
636 | n = COLS - c; | ||
524 | 637 | ||
525 | for (r = 0; r < ROWS; r++) { | 638 | if (level[i] == '.') |
526 | for (c = 0; c < COLS; c++) { | 639 | current_info.level.boxes_to_go += n; |
527 | current_info.board[r][c] = level->spaces[r][c]; | ||
528 | 640 | ||
529 | if (current_info.board[r][c] == '.' || | 641 | /* Put RLE character n times */ |
530 | current_info.board[r][c] == '+') | 642 | while (n--) |
531 | current_info.level.boxes_to_go++; | 643 | current_info.board[r][c++] = level[i]; |
644 | n = 1; | ||
532 | 645 | ||
533 | if (current_info.board[r][c] == '@' || | 646 | } else { |
534 | current_info.board[r][c] == '+') { | 647 | if (level[i] == '.' || level[i] == '+') |
535 | current_info.player.row = r; | 648 | current_info.level.boxes_to_go++; |
536 | current_info.player.col = c; | 649 | |
650 | if (level[i] == '@' ||level[i] == '+') { | ||
651 | current_info.player.row = r; | ||
652 | current_info.player.col = c; | ||
653 | } | ||
654 | |||
655 | current_info.board[r][c++] = level[i]; | ||
537 | } | 656 | } |
538 | } | 657 | } |
539 | } | 658 | } |
659 | |||
660 | current_info.level.height = r; | ||
661 | |||
662 | #if LCD_DEPTH > 2 | ||
663 | /* Fill in blank space outside level on color targets */ | ||
664 | for (r = 0; r < ROWS; r++) | ||
665 | for (c = 0; current_info.board[r][c] == ' ' && c < COLS; c++) | ||
666 | current_info.board[r][c] = 'X'; | ||
667 | |||
668 | for (c = 0; c < COLS; c++) { | ||
669 | for (r = 0; (current_info.board[r][c] == ' ' || | ||
670 | current_info.board[r][c] == 'X') && r < ROWS; r++) | ||
671 | current_info.board[r][c] = 'X'; | ||
672 | for (r = ROWS - 1; (current_info.board[r][c] == ' ' || | ||
673 | current_info.board[r][c] == 'X') && r >= 0; r--) | ||
674 | current_info.board[r][c] = 'X'; | ||
675 | } | ||
676 | #endif | ||
540 | } | 677 | } |
541 | 678 | ||
542 | static void update_screen(void) | 679 | static void update_screen(void) |
543 | { | 680 | { |
544 | int b = 0, c = 0; | 681 | int c, r; |
545 | int rows = 0, cols = 0; | 682 | int rows, cols; |
546 | char s[25]; | ||
547 | |||
548 | /* magnify is the number of pixels for each block */ | ||
549 | #if (LCD_HEIGHT >= 224) && (LCD_WIDTH >= 312) || \ | ||
550 | (LCD_HEIGHT >= 249) && (LCD_WIDTH >= 280) /* ipod 5g */ | ||
551 | #define MAGNIFY 14 | ||
552 | #elif (LCD_HEIGHT >= 144) && (LCD_WIDTH >= 212) || \ | ||
553 | (LCD_HEIGHT >= 169) && (LCD_WIDTH >= 180-4) /* h3x0, ipod color/photo */ | ||
554 | #define MAGNIFY 9 | ||
555 | #elif (LCD_HEIGHT >= 96) && (LCD_WIDTH >= 152) || \ | ||
556 | (LCD_HEIGHT >= 121) && (LCD_WIDTH >= 120) /* h1x0, ipod nano/mini */ | ||
557 | #define MAGNIFY 6 | ||
558 | #else /* other */ | ||
559 | #define MAGNIFY 4 | ||
560 | #endif | ||
561 | 683 | ||
562 | #if LCD_DEPTH < 2 | 684 | #if LCD_DEPTH < 2 || ((LCD_HEIGHT < 96 || LCD_WIDTH < 152) && \ |
685 | (LCD_HEIGHT < 121 || LCD_WIDTH < 120)) | ||
563 | int i, j; | 686 | int i, j; |
564 | int max = MAGNIFY - 1; | 687 | int max = MAGNIFY - 1; |
565 | int middle = max / 2; | 688 | int middle = max/2; |
566 | int ldelta = (middle + 1) / 2; | 689 | int ldelta = (middle + 1)/2; |
567 | #endif | 690 | #endif |
568 | 691 | ||
569 | /* load the board to the screen */ | 692 | #if LCD_WIDTH - (COLS*MAGNIFY) < 32 |
570 | for (rows=0; rows < ROWS; rows++) { | 693 | #define STAT_HEIGHT 25 |
571 | for (cols = 0; cols < COLS; cols++) { | 694 | #define STAT_X (LCD_WIDTH - 120)/2 |
572 | c = cols * MAGNIFY; | 695 | #define STAT_Y (LCD_HEIGHT - STAT_HEIGHT) |
573 | b = rows * MAGNIFY; | 696 | #define BOARD_WIDTH LCD_WIDTH |
574 | 697 | #define BOARD_HEIGHT (LCD_HEIGHT - STAT_HEIGHT) | |
575 | switch(current_info.board[rows][cols]) { | 698 | rb->lcd_putsxy(STAT_X + 4, STAT_Y + 4, "Level"); |
576 | case 'X': /* black space */ | 699 | rb->snprintf(buf, sizeof(buf), "%d", current_info.level.index + 1); |
577 | break; | 700 | rb->lcd_putsxy(STAT_X + 7, STAT_Y + 14, buf); |
578 | 701 | rb->lcd_putsxy(STAT_X + 41, STAT_Y + 4, "Moves"); | |
579 | case '#': /* this is a wall */ | 702 | rb->snprintf(buf, sizeof(buf), "%d", current_info.level.moves); |
580 | #if LCD_DEPTH >= 2 | 703 | rb->lcd_putsxy(STAT_X + 44, STAT_Y + 14, buf); |
581 | rb->lcd_bitmap_part(sokoban_tiles, 0, 1*MAGNIFY, MAGNIFY, | 704 | rb->lcd_putsxy(STAT_X + 79, STAT_Y + 4, "Pushes"); |
582 | c, b, MAGNIFY, MAGNIFY); | 705 | rb->snprintf(buf, sizeof(buf), "%d", current_info.level.pushes); |
706 | rb->lcd_putsxy(STAT_X + 82, STAT_Y + 14, buf); | ||
707 | |||
708 | rb->lcd_drawrect(STAT_X, STAT_Y, 38, STAT_HEIGHT); | ||
709 | rb->lcd_drawrect(STAT_X + 37, STAT_Y, 39, STAT_HEIGHT); | ||
710 | rb->lcd_drawrect(STAT_X + 75, STAT_Y, 45, STAT_HEIGHT); | ||
583 | #else | 711 | #else |
584 | for (i = c; i < c + MAGNIFY; i++) | 712 | #if LCD_WIDTH - (COLS*MAGNIFY) > 40 |
585 | for (j = b; j < b + MAGNIFY; j++) | 713 | #define STAT_X (LCD_WIDTH - 40) |
586 | if ((i ^ j) & 1) | 714 | #else |
587 | rb->lcd_drawpixel(i, j); | 715 | #define STAT_X COLS*MAGNIFY |
588 | #endif | 716 | #endif |
589 | break; | 717 | #if LCD_HEIGHT >= 70 |
590 | 718 | #define STAT_Y (LCD_HEIGHT - 70)/2 | |
591 | case '$': /* this is a box */ | ||
592 | #if LCD_DEPTH >= 2 | ||
593 | rb->lcd_bitmap_part(sokoban_tiles, 0, 2*MAGNIFY, MAGNIFY, | ||
594 | c, b, MAGNIFY, MAGNIFY); | ||
595 | #else | 719 | #else |
596 | /* Free boxes are not filled in */ | 720 | #define STAT_Y (LCD_HEIGHT - 47)/2 |
597 | rb->lcd_drawrect(c, b, MAGNIFY, MAGNIFY); | ||
598 | #endif | 721 | #endif |
599 | break; | 722 | #define STAT_WIDTH (LCD_WIDTH - STAT_X) |
723 | #define BOARD_WIDTH (LCD_WIDTH - STAT_WIDTH) | ||
724 | #define BOARD_HEIGHT LCD_HEIGHT | ||
725 | rb->lcd_putsxy(STAT_X + 1, STAT_Y + 3, "Level"); | ||
726 | rb->snprintf(buf, sizeof(buf), "%d", current_info.level.index + 1); | ||
727 | rb->lcd_putsxy(STAT_X + 4, STAT_Y + 13, buf); | ||
728 | rb->lcd_putsxy(STAT_X + 1, STAT_Y + 26, "Moves"); | ||
729 | rb->snprintf(buf, sizeof(buf), "%d", current_info.level.moves); | ||
730 | rb->lcd_putsxy(STAT_X + 4, STAT_Y + 36, buf); | ||
731 | |||
732 | rb->lcd_drawrect(STAT_X, STAT_Y + 0, STAT_WIDTH, 24); | ||
733 | rb->lcd_drawrect(STAT_X, STAT_Y + 23, STAT_WIDTH, 24); | ||
600 | 734 | ||
601 | case '*': | 735 | #if LCD_HEIGHT >= 70 |
602 | case '%': /* this is a box on a goal */ | 736 | rb->lcd_putsxy(STAT_X + 1, STAT_Y + 49, "Pushes"); |
737 | rb->snprintf(buf, sizeof(buf), "%d", current_info.level.pushes); | ||
738 | rb->lcd_putsxy(STAT_X + 4, STAT_Y + 59, buf); | ||
603 | 739 | ||
604 | #if LCD_DEPTH >= 2 | 740 | rb->lcd_drawrect(STAT_X, STAT_Y + 46, STAT_WIDTH, 24); |
605 | rb->lcd_bitmap_part(sokoban_tiles, 0, 3*MAGNIFY, MAGNIFY, | ||
606 | c, b, MAGNIFY, MAGNIFY ); | ||
607 | #else | ||
608 | rb->lcd_drawrect(c, b, MAGNIFY, MAGNIFY); | ||
609 | rb->lcd_drawrect(c+(MAGNIFY/2)-1, b+(MAGNIFY/2)-1, MAGNIFY/2, | ||
610 | MAGNIFY/2); | ||
611 | #endif | 741 | #endif |
612 | break; | ||
613 | 742 | ||
614 | case '.': /* this is a goal */ | ||
615 | #if LCD_DEPTH >= 2 | ||
616 | rb->lcd_bitmap_part(sokoban_tiles, 0, 4*MAGNIFY, MAGNIFY, | ||
617 | c, b, MAGNIFY, MAGNIFY); | ||
618 | #else | ||
619 | rb->lcd_drawrect(c+(MAGNIFY/2)-1, b+(MAGNIFY/2)-1, MAGNIFY/2, | ||
620 | MAGNIFY/2); | ||
621 | #endif | 743 | #endif |
622 | break; | ||
623 | 744 | ||
624 | case '@': /* this is you */ | 745 | /* load the board to the screen */ |
625 | #if LCD_DEPTH >= 2 | 746 | for (rows = 0; rows < ROWS; rows++) { |
626 | rb->lcd_bitmap_part(sokoban_tiles, 0, 5*MAGNIFY, MAGNIFY, | 747 | for (cols = 0; cols < COLS; cols++) { |
627 | c, b, MAGNIFY, MAGNIFY); | 748 | c = cols*MAGNIFY + |
628 | #else | 749 | (BOARD_WIDTH - current_info.level.width*MAGNIFY)/2; |
629 | rb->lcd_drawline(c, b+middle, c+max, b+middle); | 750 | r = rows*MAGNIFY + |
630 | rb->lcd_drawline(c+middle, b, c+middle, b+max-ldelta); | 751 | (BOARD_HEIGHT - current_info.level.height*MAGNIFY)/2; |
631 | rb->lcd_drawline(c+max-middle, b, | ||
632 | c+max-middle, b+max-ldelta); | ||
633 | rb->lcd_drawline(c+middle, b+max-ldelta, | ||
634 | c+middle-ldelta, b+max); | ||
635 | rb->lcd_drawline(c+max-middle, b+max-ldelta, | ||
636 | c+max-middle+ldelta, b+max); | ||
637 | #endif | ||
638 | break; | ||
639 | 752 | ||
640 | case '+': /* this is you on drugs, erm, on a goal */ | 753 | switch(current_info.board[rows][cols]) { |
641 | #if LCD_DEPTH >= 2 | 754 | case 'X': /* blank space outside of level */ |
642 | rb->lcd_bitmap_part(sokoban_tiles, 0, 6*MAGNIFY, MAGNIFY, | 755 | break; |
643 | c, b, MAGNIFY, MAGNIFY ); | ||
644 | #else | ||
645 | rb->lcd_drawline(c, b+middle, c+max, b+middle); | ||
646 | rb->lcd_drawline(c+middle, b, c+middle, b+max-ldelta); | ||
647 | rb->lcd_drawline(c+max-middle, b, c+max-middle, b+max-ldelta); | ||
648 | rb->lcd_drawline(c+middle, b+max-ldelta, c+middle-ldelta, | ||
649 | b+max); | ||
650 | rb->lcd_drawline(c+max-middle, b+max-ldelta, | ||
651 | c+max-middle+ldelta, b+max); | ||
652 | rb->lcd_drawline(c+middle-1, b+middle+1, c+max-middle+1, | ||
653 | b+middle+1); | ||
654 | #endif | ||
655 | break; | ||
656 | 756 | ||
657 | #if LCD_DEPTH >= 2 | 757 | #if LCD_DEPTH >= 2 && ((LCD_HEIGHT >= 96 && LCD_WIDTH >= 152) || \ |
658 | default: | 758 | (LCD_HEIGHT >= 121 && LCD_WIDTH >= 120)) |
659 | rb->lcd_bitmap_part(sokoban_tiles, 0, 0*MAGNIFY, MAGNIFY, | 759 | case ' ': /* floor */ |
660 | c, b, MAGNIFY, MAGNIFY ); | 760 | rb->lcd_bitmap_part(sokoban_tiles, 0, 0*MAGNIFY, MAGNIFY, |
661 | #endif | 761 | c, r, MAGNIFY, MAGNIFY); |
662 | } | 762 | break; |
663 | } | ||
664 | } | ||
665 | 763 | ||
666 | #if LCD_WIDTH-(COLS*MAGNIFY) < 32 | 764 | case '#': /* wall */ |
667 | #define STAT_SIZE 25 | 765 | rb->lcd_bitmap_part(sokoban_tiles, 0, 1*MAGNIFY, MAGNIFY, |
668 | #define STAT_POS LCD_HEIGHT-STAT_SIZE | 766 | c, r, MAGNIFY, MAGNIFY); |
669 | #define STAT_CENTER (LCD_WIDTH-120)/2 | 767 | break; |
670 | 768 | ||
671 | rb->lcd_putsxy(4+STAT_CENTER, STAT_POS+4, "Level"); | 769 | case '$': /* box */ |
672 | rb->snprintf(s, sizeof(s), "%d", current_info.level.level); | 770 | rb->lcd_bitmap_part(sokoban_tiles, 0, 2*MAGNIFY, MAGNIFY, |
673 | rb->lcd_putsxy(7+STAT_CENTER, STAT_POS+14, s); | 771 | c, r, MAGNIFY, MAGNIFY); |
674 | rb->lcd_putsxy(41+STAT_CENTER, STAT_POS+4, "Moves"); | 772 | break; |
675 | rb->snprintf(s, sizeof(s), "%d", current_info.level.moves); | ||
676 | rb->lcd_putsxy(44+STAT_CENTER, STAT_POS+14, s); | ||
677 | rb->lcd_putsxy(79+STAT_CENTER, STAT_POS+4, "Pushes"); | ||
678 | rb->snprintf(s, sizeof(s), "%d", current_info.level.pushes); | ||
679 | rb->lcd_putsxy(82+STAT_CENTER, STAT_POS+14, s); | ||
680 | |||
681 | rb->lcd_drawrect(STAT_CENTER, STAT_POS, 38, STAT_SIZE); | ||
682 | rb->lcd_drawrect(37+STAT_CENTER, STAT_POS, 39, STAT_SIZE); | ||
683 | rb->lcd_drawrect(75+STAT_CENTER, STAT_POS, 45, STAT_SIZE); | ||
684 | 773 | ||
774 | case '*': /* box on goal */ | ||
775 | rb->lcd_bitmap_part(sokoban_tiles, 0, 3*MAGNIFY, MAGNIFY, | ||
776 | c, r, MAGNIFY, MAGNIFY); | ||
777 | break; | ||
778 | |||
779 | case '.': /* goal */ | ||
780 | rb->lcd_bitmap_part(sokoban_tiles, 0, 4*MAGNIFY, MAGNIFY, | ||
781 | c, r, MAGNIFY, MAGNIFY); | ||
782 | break; | ||
783 | |||
784 | case '@': /* player */ | ||
785 | rb->lcd_bitmap_part(sokoban_tiles, 0, 5*MAGNIFY, MAGNIFY, | ||
786 | c, r, MAGNIFY, MAGNIFY); | ||
787 | break; | ||
788 | |||
789 | case '+': /* player on goal */ | ||
790 | rb->lcd_bitmap_part(sokoban_tiles, 0, 6*MAGNIFY, MAGNIFY, | ||
791 | c, r, MAGNIFY, MAGNIFY); | ||
792 | break; | ||
685 | #else | 793 | #else |
686 | #define STAT_POS COLS*MAGNIFY | 794 | case '#': /* wall */ |
687 | #define STAT_SIZE LCD_WIDTH-STAT_POS | 795 | for (i = c; i < c + MAGNIFY; i++) |
796 | for (j = r; j < r + MAGNIFY; j++) | ||
797 | if ((i ^ j) & 1) | ||
798 | rb->lcd_drawpixel(i, j); | ||
799 | break; | ||
688 | 800 | ||
689 | rb->lcd_putsxy(STAT_POS+1, 3, "Level"); | 801 | case '$': /* box */ |
690 | rb->snprintf(s, sizeof(s), "%d", current_info.level.level); | 802 | rb->lcd_drawrect(c, r, MAGNIFY, MAGNIFY); |
691 | rb->lcd_putsxy(STAT_POS+4, 13, s); | 803 | break; |
692 | rb->lcd_putsxy(STAT_POS+1, 26, "Moves"); | ||
693 | rb->snprintf(s, sizeof(s), "%d", current_info.level.moves); | ||
694 | rb->lcd_putsxy(STAT_POS+4, 36, s); | ||
695 | 804 | ||
696 | rb->lcd_drawrect(STAT_POS, 0, STAT_SIZE, 24); | 805 | case '*': /* box on goal */ |
697 | rb->lcd_drawrect(STAT_POS, 23, STAT_SIZE, 24); | 806 | rb->lcd_drawrect(c, r, MAGNIFY, MAGNIFY); |
807 | rb->lcd_drawrect(c + MAGNIFY/2 - 1, r + MAGNIFY/2 - 1, | ||
808 | MAGNIFY/2, MAGNIFY/2); | ||
809 | break; | ||
698 | 810 | ||
699 | #if LCD_HEIGHT >= 70 | 811 | case '.': /* goal */ |
700 | rb->lcd_putsxy(STAT_POS+1, 49, "Pushes"); | 812 | rb->lcd_drawrect(c + MAGNIFY/2 - 1, r + MAGNIFY/2 - 1, |
701 | rb->snprintf(s, sizeof(s), "%d", current_info.level.pushes); | 813 | MAGNIFY/2, MAGNIFY/2); |
702 | rb->lcd_putsxy(STAT_POS+4, 59, s); | 814 | break; |
703 | 815 | ||
704 | rb->lcd_drawrect(STAT_POS, 46, STAT_SIZE, 24); | 816 | case '@': /* player */ |
705 | #endif | 817 | case '+': /* player on goal */ |
818 | rb->lcd_drawline(c, r + middle, c + max, r + middle); | ||
819 | rb->lcd_drawline(c + middle, r, c + middle, | ||
820 | r + max - ldelta); | ||
821 | rb->lcd_drawline(c + max - middle, r, c + max - middle, | ||
822 | r + max - ldelta); | ||
823 | rb->lcd_drawline(c + middle, r + max - ldelta, | ||
824 | c + middle - ldelta, r + max); | ||
825 | rb->lcd_drawline(c + max - middle, r + max - ldelta, | ||
826 | c + max - middle + ldelta, r + max); | ||
827 | break; | ||
706 | #endif | 828 | #endif |
829 | } | ||
830 | } | ||
831 | } | ||
707 | 832 | ||
708 | /* print out the screen */ | 833 | /* print out the screen */ |
709 | rb->lcd_update(); | 834 | rb->lcd_update(); |
@@ -716,21 +841,320 @@ static void draw_level(void) | |||
716 | update_screen(); | 841 | update_screen(); |
717 | } | 842 | } |
718 | 843 | ||
844 | static bool save(char *filename, bool solution) | ||
845 | { | ||
846 | int fd; | ||
847 | |||
848 | rb->splash(0, "Saving..."); | ||
849 | |||
850 | if (filename[0] == '\0' || | ||
851 | (fd = rb->open(filename, O_WRONLY|O_CREAT|O_TRUNC)) < 0) { | ||
852 | rb->splash(HZ*2, "Unable to open %s", filename); | ||
853 | return false; | ||
854 | } | ||
855 | |||
856 | /* Sokoban: S/P for solution/progress : level number : current undo */ | ||
857 | rb->snprintf(buf, sizeof(buf), "Sokoban:%c:%d:%d\n", (solution ? 'S' : 'P'), | ||
858 | current_info.level.index + 1, undo_info.current); | ||
859 | rb->write(fd, buf, rb->strlen(buf)); | ||
860 | |||
861 | /* Filename of levelset */ | ||
862 | rb->write(fd, buffered_boards.filename, | ||
863 | rb->strlen(buffered_boards.filename)); | ||
864 | rb->write(fd, "\n", 1); | ||
865 | |||
866 | /* Full undo history */ | ||
867 | rb->write(fd, undo_info.history, undo_info.max); | ||
868 | |||
869 | rb->close(fd); | ||
870 | |||
871 | return true; | ||
872 | } | ||
873 | |||
874 | static bool load(char *filename, bool silent) | ||
875 | { | ||
876 | int fd; | ||
877 | int i = 0, n; | ||
878 | int len; | ||
879 | bool play_solution; | ||
880 | int button; | ||
881 | int step_delay = HZ/4; | ||
882 | |||
883 | if (filename[0] == '\0' || (fd = rb->open(filename, O_RDONLY)) < 0) { | ||
884 | if (!silent) | ||
885 | rb->splash(HZ*2, "Unable to open %s", filename); | ||
886 | return false; | ||
887 | } | ||
888 | |||
889 | /* Read header, level number, & current undo */ | ||
890 | rb->read_line(fd, buf, sizeof(buf)); | ||
891 | |||
892 | /* If we're opening a level file, not a solution/progress file */ | ||
893 | if (rb->strncmp(buf, "Sokoban", 7) != 0) { | ||
894 | rb->close(fd); | ||
895 | |||
896 | rb->strncpy(buffered_boards.filename, filename, MAX_PATH); | ||
897 | if (!read_levels(true)) | ||
898 | return false; | ||
899 | |||
900 | current_info.level.index = 0; | ||
901 | load_level(); | ||
902 | |||
903 | /* If there aren't any boxes to go or the player position wasn't set, | ||
904 | * the file probably wasn't a Sokoban level file */ | ||
905 | if (current_info.level.boxes_to_go == 0 || | ||
906 | current_info.player.row == 0 || current_info.player.col == 0) { | ||
907 | if (!silent) | ||
908 | rb->splash(HZ*2, "File is not a Sokoban level file"); | ||
909 | return false; | ||
910 | } | ||
911 | |||
912 | } else { | ||
913 | |||
914 | /* Read filename of levelset */ | ||
915 | rb->read_line(fd, buffered_boards.filename, | ||
916 | sizeof(buffered_boards.filename)); | ||
917 | |||
918 | /* Read full undo history */ | ||
919 | len = rb->read_line(fd, undo_info.history, MAX_UNDOS); | ||
920 | |||
921 | /* Correct len when trailing \r's or \n's are counted */ | ||
922 | if (len > 2 && undo_info.history[len - 2] == '\0') | ||
923 | len -= 2; | ||
924 | else if (len > 1 && undo_info.history[len - 1] == '\0') | ||
925 | len--; | ||
926 | |||
927 | rb->close(fd); | ||
928 | |||
929 | /* Check to see if we're going to play a solution or resume progress */ | ||
930 | play_solution = (buf[8] == 'S'); | ||
931 | |||
932 | /* Get level number */ | ||
933 | for (n = 0, i = 10; buf[i] >= '0' && buf[i] <= '9' && i < 15; i++) | ||
934 | n = n*10 + buf[i] - '0'; | ||
935 | current_info.level.index = n - 1; | ||
936 | |||
937 | /* Get current undo index */ | ||
938 | for (n = 0, i++; buf[i] >= '0' && buf[i] <= '9' && i < 21; i++) | ||
939 | n = n*10 + buf[i] - '0'; | ||
940 | if (n > len) | ||
941 | n = len; | ||
942 | |||
943 | if (current_info.level.index < 0) { | ||
944 | if (!silent) | ||
945 | rb->splash(HZ*2, "Error loading level"); | ||
946 | return false; | ||
947 | } | ||
948 | if (!read_levels(true)) | ||
949 | return false; | ||
950 | if (current_info.level.index >= current_info.max_level) { | ||
951 | if (!silent) | ||
952 | rb->splash(HZ*2, "Error loading level"); | ||
953 | return false; | ||
954 | } | ||
955 | |||
956 | load_level(); | ||
957 | |||
958 | if (play_solution) { | ||
959 | rb->lcd_clear_display(); | ||
960 | update_screen(); | ||
961 | rb->sleep(2*step_delay); | ||
962 | |||
963 | /* Replay solution until the end or quit button is pressed */ | ||
964 | for (i = 0; i < len; i++) { | ||
965 | if (!move(undo_info.history[i], true)) { | ||
966 | n = i; | ||
967 | break; | ||
968 | } | ||
969 | |||
970 | rb->lcd_clear_display(); | ||
971 | update_screen(); | ||
972 | rb->sleep(step_delay); | ||
973 | |||
974 | /* Ignore keypresses except for quit & changing speed */ | ||
975 | while ((button = rb->button_get(false)) != BUTTON_NONE) { | ||
976 | switch (button) { | ||
977 | case SOKOBAN_MENU: | ||
978 | /* Pretend the level is complete so we'll quit */ | ||
979 | current_info.level.boxes_to_go = 0; | ||
980 | return true; | ||
981 | |||
982 | case SOKOBAN_UP: | ||
983 | if (step_delay > HZ/12) | ||
984 | step_delay = 5*step_delay/6; | ||
985 | break; | ||
986 | |||
987 | case SOKOBAN_DOWN: | ||
988 | if (step_delay < 3*HZ/4) | ||
989 | step_delay = 6*step_delay/5; | ||
990 | } | ||
991 | } | ||
992 | } | ||
993 | |||
994 | /* If level complete, wait for keypress before quitting */ | ||
995 | if (current_info.level.boxes_to_go == 0) | ||
996 | rb->button_get(true); | ||
997 | |||
998 | } else { | ||
999 | /* Advance to current undo */ | ||
1000 | for (i = 0; i < n; i++) { | ||
1001 | if (!move(undo_info.history[i], true)) { | ||
1002 | n = i; | ||
1003 | break; | ||
1004 | } | ||
1005 | } | ||
1006 | |||
1007 | rb->button_clear_queue(); | ||
1008 | rb->lcd_clear_display(); | ||
1009 | } | ||
1010 | |||
1011 | undo_info.max = len; | ||
1012 | undo_info.current = n; | ||
1013 | } | ||
1014 | |||
1015 | return true; | ||
1016 | } | ||
1017 | |||
1018 | static int sokoban_menu(void) | ||
1019 | { | ||
1020 | int button; | ||
1021 | int selection = 0; | ||
1022 | int i; | ||
1023 | bool menu_quit; | ||
1024 | int start_selected = 0; | ||
1025 | |||
1026 | MENUITEM_STRINGLIST(menu, "Sokoban Menu", NULL, | ||
1027 | "Resume", "Audio Playback", "Keys", | ||
1028 | "Load Default Level Set", "Quit Without Saving", | ||
1029 | "Save Progress & Quit"); | ||
1030 | |||
1031 | do { | ||
1032 | menu_quit = true; | ||
1033 | selection = rb->do_menu(&menu, &start_selected); | ||
1034 | |||
1035 | switch (selection) { | ||
1036 | case 0: /* Resume */ | ||
1037 | break; | ||
1038 | |||
1039 | case 1: /* Audio playback control */ | ||
1040 | playback_control(rb); | ||
1041 | menu_quit = false; | ||
1042 | break; | ||
1043 | |||
1044 | case 2: /* Keys */ | ||
1045 | FOR_NB_SCREENS(i) | ||
1046 | rb->screens[i]->clear_display(); | ||
1047 | rb->lcd_setfont(SOKOBAN_FONT); | ||
1048 | |||
1049 | #if (CONFIG_KEYPAD == RECORDER_PAD) || \ | ||
1050 | (CONFIG_KEYPAD == ARCHOS_AV300_PAD) | ||
1051 | rb->lcd_putsxy(3, 6, "[OFF] Menu"); | ||
1052 | rb->lcd_putsxy(3, 16, "[ON] Undo"); | ||
1053 | rb->lcd_putsxy(3, 26, "[PLAY] Redo"); | ||
1054 | rb->lcd_putsxy(3, 36, "[F1] Down a Level"); | ||
1055 | rb->lcd_putsxy(3, 46, "[F2] Restart Level"); | ||
1056 | rb->lcd_putsxy(3, 56, "[F3] Up a Level"); | ||
1057 | #elif CONFIG_KEYPAD == ONDIO_PAD | ||
1058 | rb->lcd_putsxy(3, 6, "[OFF] Menu"); | ||
1059 | rb->lcd_putsxy(3, 16, "[MODE] Undo"); | ||
1060 | rb->lcd_putsxy(3, 26, "[MODE+DOWN] Redo"); | ||
1061 | rb->lcd_putsxy(3, 36, "[MODE+LEFT] Previous Level"); | ||
1062 | rb->lcd_putsxy(3, 46, "[MODE+UP] Restart Level"); | ||
1063 | rb->lcd_putsxy(3, 56, "[MODE+RIGHT] Up Level"); | ||
1064 | #elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \ | ||
1065 | (CONFIG_KEYPAD == IRIVER_H300_PAD) | ||
1066 | rb->lcd_putsxy(3, 6, "[STOP] Menu"); | ||
1067 | rb->lcd_putsxy(3, 16, "[REC] Undo"); | ||
1068 | rb->lcd_putsxy(3, 26, "[MODE] Redo"); | ||
1069 | rb->lcd_putsxy(3, 36, "[PLAY+DOWN] Previous Level"); | ||
1070 | rb->lcd_putsxy(3, 46, "[PLAY] Restart Level"); | ||
1071 | rb->lcd_putsxy(3, 56, "[PLAY+UP] Next Level"); | ||
1072 | #elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \ | ||
1073 | (CONFIG_KEYPAD == IPOD_3G_PAD) | ||
1074 | rb->lcd_putsxy(3, 6, "[SELECT+MENU] Menu"); | ||
1075 | rb->lcd_putsxy(3, 16, "[SELECT] Undo"); | ||
1076 | rb->lcd_putsxy(3, 26, "[SELECT+PLAY] Redo"); | ||
1077 | rb->lcd_putsxy(3, 36, "[SELECT+LEFT] Previous Level"); | ||
1078 | rb->lcd_putsxy(3, 46, "[SELECT+RIGHT] Next Level"); | ||
1079 | #elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD | ||
1080 | rb->lcd_putsxy(3, 6, "[POWER] Menu"); | ||
1081 | rb->lcd_putsxy(3, 16, "[SELECT] Undo"); | ||
1082 | rb->lcd_putsxy(3, 26, "[REC] Previous Level"); | ||
1083 | rb->lcd_putsxy(3, 36, "[PLAY] Next Level"); | ||
1084 | #elif CONFIG_KEYPAD == IRIVER_H10_PAD | ||
1085 | rb->lcd_putsxy(3, 6, "[POWER] Menu"); | ||
1086 | rb->lcd_putsxy(3, 16, "[REW] Undo"); | ||
1087 | rb->lcd_putsxy(3, 26, "[FF] Redo"); | ||
1088 | rb->lcd_putsxy(3, 36, "[PLAY+DOWN] Previous Level"); | ||
1089 | rb->lcd_putsxy(3, 46, "[PLAY+RIGHT] Restart Level"); | ||
1090 | rb->lcd_putsxy(3, 56, "[PLAY+UP] Next Level"); | ||
1091 | #elif CONFIG_KEYPAD == GIGABEAT_PAD | ||
1092 | rb->lcd_putsxy(3, 6, "[POWER] Menu"); | ||
1093 | rb->lcd_putsxy(3, 16, "[SELECT] Undo"); | ||
1094 | rb->lcd_putsxy(3, 26, "[A] Redo"); | ||
1095 | rb->lcd_putsxy(3, 36, "[VOL-] Previous Level"); | ||
1096 | rb->lcd_putsxy(3, 46, "[MENU] Restart Level"); | ||
1097 | rb->lcd_putsxy(3, 56, "[VOL+] Next Level"); | ||
1098 | #elif CONFIG_KEYPAD == SANSA_E200_PAD | ||
1099 | rb->lcd_putsxy(3, 6, "[POWER] Menu"); | ||
1100 | rb->lcd_putsxy(3, 16, "[SELECT] Undo"); | ||
1101 | rb->lcd_putsxy(3, 26, "[REC] Redo"); | ||
1102 | rb->lcd_putsxy(3, 36, "[SELECT+DOWN] Previous Level"); | ||
1103 | rb->lcd_putsxy(3, 46, "[SELECT+RIGHT] Restart Level"); | ||
1104 | rb->lcd_putsxy(3, 56, "[SELECT+UP] Next Level"); | ||
1105 | #endif | ||
1106 | |||
1107 | FOR_NB_SCREENS(i) | ||
1108 | rb->screens[i]->update(); | ||
1109 | |||
1110 | /* Display until keypress */ | ||
1111 | do { | ||
1112 | rb->sleep(HZ/20); | ||
1113 | button = rb->button_get(false); | ||
1114 | } while (!button || button & BUTTON_REL || | ||
1115 | button & BUTTON_REPEAT); | ||
1116 | |||
1117 | menu_quit = false; | ||
1118 | break; | ||
1119 | |||
1120 | case 3: /* Load default levelset */ | ||
1121 | init_boards(); | ||
1122 | if (!read_levels(true)) | ||
1123 | return 4; | ||
1124 | load_level(); | ||
1125 | break; | ||
1126 | |||
1127 | case 4: /* Quit */ | ||
1128 | break; | ||
1129 | |||
1130 | case 5: /* Save & quit */ | ||
1131 | save(SOKOBAN_SAVE_FILE, false); | ||
1132 | rb->reload_directory(); | ||
1133 | } | ||
1134 | |||
1135 | } while (!menu_quit); | ||
1136 | |||
1137 | /* Restore font */ | ||
1138 | rb->lcd_setfont(SOKOBAN_FONT); | ||
1139 | |||
1140 | FOR_NB_SCREENS(i) { | ||
1141 | rb->screens[i]->clear_display(); | ||
1142 | rb->screens[i]->update(); | ||
1143 | } | ||
1144 | |||
1145 | return selection; | ||
1146 | } | ||
1147 | |||
719 | static bool sokoban_loop(void) | 1148 | static bool sokoban_loop(void) |
720 | { | 1149 | { |
721 | bool moved = true; | 1150 | bool moved; |
722 | int i = 0, button = 0, lastbutton = 0; | 1151 | int i = 0, button = 0, lastbutton = 0; |
723 | short r = 0, c = 0; | 1152 | short r = 0, c = 0; |
724 | int w, h; | 1153 | int w, h; |
725 | char s[25]; | 1154 | char *loc; |
726 | 1155 | ||
727 | current_info.level.level = 1; | 1156 | while (true) { |
728 | 1157 | moved = false; | |
729 | load_level(); | ||
730 | update_screen(); | ||
731 | |||
732 | while (1) { | ||
733 | moved = true; | ||
734 | 1158 | ||
735 | r = current_info.player.row; | 1159 | r = current_info.player.row; |
736 | c = current_info.player.col; | 1160 | c = current_info.player.col; |
@@ -742,24 +1166,25 @@ static bool sokoban_loop(void) | |||
742 | #ifdef SOKOBAN_RC_QUIT | 1166 | #ifdef SOKOBAN_RC_QUIT |
743 | case SOKOBAN_RC_QUIT: | 1167 | case SOKOBAN_RC_QUIT: |
744 | #endif | 1168 | #endif |
745 | case SOKOBAN_QUIT: | 1169 | case SOKOBAN_MENU: |
746 | /* get out of here */ | 1170 | switch (sokoban_menu()) { |
747 | #ifdef HAVE_LCD_COLOR /* reset background color */ | 1171 | case 4: /* Quit */ |
748 | rb->lcd_set_background(rb->global_settings->bg_color); | 1172 | case 5: /* Save & quit */ |
749 | #endif | 1173 | return PLUGIN_OK; |
750 | return PLUGIN_OK; | 1174 | } |
1175 | update_screen(); | ||
1176 | break; | ||
751 | 1177 | ||
752 | case SOKOBAN_UNDO: | 1178 | case SOKOBAN_UNDO: |
753 | #ifdef SOKOBAN_UNDO_PRE | 1179 | #ifdef SOKOBAN_UNDO_PRE |
754 | if (lastbutton != SOKOBAN_UNDO_PRE) | 1180 | if (lastbutton != SOKOBAN_UNDO_PRE) |
755 | break; | 1181 | break; |
756 | #else /* repeat can't work here for Ondio et al */ | 1182 | #else /* repeat can't work here for Ondio, iPod, et al */ |
757 | case SOKOBAN_UNDO | BUTTON_REPEAT: | 1183 | case SOKOBAN_UNDO | BUTTON_REPEAT: |
758 | #endif | 1184 | #endif |
759 | undo(); | 1185 | undo(); |
760 | rb->lcd_clear_display(); | 1186 | rb->lcd_clear_display(); |
761 | update_screen(); | 1187 | update_screen(); |
762 | moved = false; | ||
763 | break; | 1188 | break; |
764 | 1189 | ||
765 | #ifdef SOKOBAN_REDO | 1190 | #ifdef SOKOBAN_REDO |
@@ -775,22 +1200,20 @@ static bool sokoban_loop(void) | |||
775 | case SOKOBAN_LEVEL_UP | BUTTON_REPEAT: | 1200 | case SOKOBAN_LEVEL_UP | BUTTON_REPEAT: |
776 | /* next level */ | 1201 | /* next level */ |
777 | init_undo(); | 1202 | init_undo(); |
778 | if (current_info.level.level < current_info.max_level) | 1203 | if (current_info.level.index + 1 < current_info.max_level) |
779 | current_info.level.level++; | 1204 | current_info.level.index++; |
780 | 1205 | ||
781 | draw_level(); | 1206 | draw_level(); |
782 | moved = false; | ||
783 | break; | 1207 | break; |
784 | 1208 | ||
785 | case SOKOBAN_LEVEL_DOWN: | 1209 | case SOKOBAN_LEVEL_DOWN: |
786 | case SOKOBAN_LEVEL_DOWN | BUTTON_REPEAT: | 1210 | case SOKOBAN_LEVEL_DOWN | BUTTON_REPEAT: |
787 | /* previous level */ | 1211 | /* previous level */ |
788 | init_undo(); | 1212 | init_undo(); |
789 | if (current_info.level.level > 1) | 1213 | if (current_info.level.index > 0) |
790 | current_info.level.level--; | 1214 | current_info.level.index--; |
791 | 1215 | ||
792 | draw_level(); | 1216 | draw_level(); |
793 | moved = false; | ||
794 | break; | 1217 | break; |
795 | 1218 | ||
796 | #ifdef SOKOBAN_LEVEL_REPEAT | 1219 | #ifdef SOKOBAN_LEVEL_REPEAT |
@@ -799,7 +1222,6 @@ static bool sokoban_loop(void) | |||
799 | /* same level */ | 1222 | /* same level */ |
800 | init_undo(); | 1223 | init_undo(); |
801 | draw_level(); | 1224 | draw_level(); |
802 | moved = false; | ||
803 | break; | 1225 | break; |
804 | #endif | 1226 | #endif |
805 | 1227 | ||
@@ -826,13 +1248,10 @@ static bool sokoban_loop(void) | |||
826 | default: | 1248 | default: |
827 | if (rb->default_event_handler(button) == SYS_USB_CONNECTED) | 1249 | if (rb->default_event_handler(button) == SYS_USB_CONNECTED) |
828 | return PLUGIN_USB_CONNECTED; | 1250 | return PLUGIN_USB_CONNECTED; |
829 | |||
830 | moved = false; | ||
831 | break; | 1251 | break; |
832 | } | 1252 | } |
833 | 1253 | ||
834 | if (button != BUTTON_NONE) | 1254 | lastbutton = button; |
835 | lastbutton = button; | ||
836 | 1255 | ||
837 | if (moved) { | 1256 | if (moved) { |
838 | rb->lcd_clear_display(); | 1257 | rb->lcd_clear_display(); |
@@ -844,58 +1263,102 @@ static bool sokoban_loop(void) | |||
844 | 1263 | ||
845 | if (moved) { | 1264 | if (moved) { |
846 | rb->lcd_clear_display(); | 1265 | rb->lcd_clear_display(); |
847 | /* Center level completed message */ | 1266 | |
848 | rb->snprintf(s, sizeof(s), "Level %d Complete!", | 1267 | /* Show level complete message & stats */ |
849 | current_info.level.level); | 1268 | rb->snprintf(buf, sizeof(buf), "Level %d Complete!", |
850 | rb->lcd_getstringsize(s, &w, &h); | 1269 | current_info.level.index + 1); |
851 | rb->lcd_putsxy(LCD_WIDTH/2 - w/2, LCD_HEIGHT/2 - 16 , s); | 1270 | rb->lcd_getstringsize(buf, &w, &h); |
852 | rb->snprintf(s, sizeof(s), "%4d Moves ", | 1271 | rb->lcd_putsxy(LCD_WIDTH/2 - w/2, LCD_HEIGHT/2 - h*3, buf); |
1272 | |||
1273 | rb->snprintf(buf, sizeof(buf), "%4d Moves ", | ||
853 | current_info.level.moves); | 1274 | current_info.level.moves); |
854 | rb->lcd_getstringsize(s, &w, &h); | 1275 | rb->lcd_getstringsize(buf, &w, &h); |
855 | rb->lcd_putsxy(LCD_WIDTH/2 - w/2, LCD_HEIGHT/2 + 0 , s); | 1276 | rb->lcd_putsxy(LCD_WIDTH/2 - w/2, LCD_HEIGHT/2 - h, buf); |
856 | rb->snprintf(s, sizeof(s), "%4d Pushes", | 1277 | |
1278 | rb->snprintf(buf, sizeof(buf), "%4d Pushes", | ||
857 | current_info.level.pushes); | 1279 | current_info.level.pushes); |
858 | rb->lcd_getstringsize(s, &w, &h); | 1280 | rb->lcd_getstringsize(buf, &w, &h); |
859 | rb->lcd_putsxy(LCD_WIDTH/2 - w/2, LCD_HEIGHT/2 + 8 , s); | 1281 | rb->lcd_putsxy(LCD_WIDTH/2 - w/2, LCD_HEIGHT/2, buf); |
1282 | |||
1283 | if (undo_info.count < MAX_UNDOS) { | ||
1284 | rb->snprintf(buf, sizeof(buf), "%s: Save solution", | ||
1285 | BUTTON_SAVE_NAME); | ||
1286 | rb->lcd_getstringsize(buf, &w, &h); | ||
1287 | rb->lcd_putsxy(LCD_WIDTH/2 - w/2, LCD_HEIGHT/2 + h*2, buf); | ||
1288 | } | ||
1289 | |||
860 | rb->lcd_update(); | 1290 | rb->lcd_update(); |
861 | rb->button_get(false); | 1291 | rb->sleep(HZ/4); |
1292 | rb->button_clear_queue(); | ||
862 | 1293 | ||
863 | rb->sleep(HZ/2); | 1294 | /* Display for 4 seconds or until new keypress */ |
864 | for (i = 0; i < 30; i++) { | 1295 | for (i = 0; i < 75; i++) { |
865 | rb->sleep(HZ/20); | 1296 | rb->sleep(HZ/20); |
866 | button = rb->button_get(false); | 1297 | button = rb->button_get(false); |
867 | if (button && ((button & BUTTON_REL) != BUTTON_REL)) | 1298 | if (button && !(button & BUTTON_REL) && |
1299 | !(button & BUTTON_REPEAT)) | ||
868 | break; | 1300 | break; |
869 | } | 1301 | } |
1302 | |||
1303 | if (button == BUTTON_SAVE) { | ||
1304 | if (undo_info.count < MAX_UNDOS) { | ||
1305 | /* Default filename to current levelset plus | ||
1306 | * level number and .sok extension */ | ||
1307 | loc = rb->strrchr(buffered_boards.filename, '.'); | ||
1308 | if (loc != NULL) | ||
1309 | *loc = '\0'; | ||
1310 | rb->snprintf(buf, sizeof(buf), "%s.%d.sok", | ||
1311 | buffered_boards.filename, | ||
1312 | current_info.level.index + 1); | ||
1313 | if (loc != NULL) | ||
1314 | *loc = '.'; | ||
1315 | |||
1316 | if (!rb->kbd_input(buf, MAX_PATH)) | ||
1317 | save(buf, true); | ||
1318 | } else | ||
1319 | rb->splash(HZ*2, "Solution too long to save"); | ||
1320 | |||
1321 | rb->lcd_setfont(SOKOBAN_FONT); /* Restore font */ | ||
1322 | } | ||
870 | } | 1323 | } |
871 | 1324 | ||
872 | current_info.level.level++; | 1325 | FOR_NB_SCREENS(i) { |
1326 | rb->screens[i]->clear_display(); | ||
1327 | rb->screens[i]->update(); | ||
1328 | } | ||
1329 | |||
1330 | current_info.level.index++; | ||
873 | 1331 | ||
874 | /* clear undo stats */ | 1332 | /* clear undo stats */ |
875 | init_undo(); | 1333 | init_undo(); |
876 | 1334 | ||
877 | rb->lcd_clear_display(); | 1335 | if (current_info.level.index >= current_info.max_level) { |
878 | 1336 | /* Show levelset complete message */ | |
879 | if (current_info.level.level > current_info.max_level) { | 1337 | rb->snprintf(buf, sizeof(buf), "You WIN!!"); |
880 | /* Center "You WIN!!" on all screen sizes */ | 1338 | rb->lcd_getstringsize(buf, &w, &h); |
881 | rb->snprintf(s, sizeof(s), "You WIN!!"); | 1339 | rb->lcd_putsxy(LCD_WIDTH/2 - w/2, LCD_HEIGHT/2 - h/2, buf); |
882 | rb->lcd_getstringsize(s, &w, &h); | ||
883 | rb->lcd_putsxy(LCD_WIDTH/2 - w/2, LCD_HEIGHT/2 - h/2, s); | ||
884 | 1340 | ||
885 | rb->lcd_set_drawmode(DRMODE_COMPLEMENT); | 1341 | rb->lcd_set_drawmode(DRMODE_COMPLEMENT); |
886 | /* Display for 10 seconds or until keypress */ | 1342 | /* Display for 4 seconds or until keypress */ |
887 | for (i = 0; i < 200; i++) { | 1343 | for (i = 0; i < 80; i++) { |
888 | rb->lcd_fillrect(0, 0, LCD_WIDTH, LCD_HEIGHT); | 1344 | rb->lcd_fillrect(0, 0, LCD_WIDTH, LCD_HEIGHT); |
889 | rb->lcd_update(); | 1345 | rb->lcd_update(); |
890 | rb->sleep(HZ/20); | 1346 | rb->sleep(HZ/10); |
891 | 1347 | ||
892 | button = rb->button_get(false); | 1348 | button = rb->button_get(false); |
893 | if (button && ((button & BUTTON_REL) != BUTTON_REL)) | 1349 | if (button && !(button & BUTTON_REL)) |
894 | break; | 1350 | break; |
895 | } | 1351 | } |
896 | rb->lcd_set_drawmode(DRMODE_SOLID); | 1352 | rb->lcd_set_drawmode(DRMODE_SOLID); |
897 | 1353 | ||
898 | return PLUGIN_OK; | 1354 | /* Reset to first level & show quit menu */ |
1355 | current_info.level.index = 0; | ||
1356 | |||
1357 | switch (sokoban_menu()) { | ||
1358 | case 4: /* Quit */ | ||
1359 | case 5: /* Save & quit */ | ||
1360 | return PLUGIN_OK; | ||
1361 | } | ||
899 | } | 1362 | } |
900 | 1363 | ||
901 | load_level(); | 1364 | load_level(); |
@@ -911,99 +1374,41 @@ static bool sokoban_loop(void) | |||
911 | enum plugin_status plugin_start(struct plugin_api* api, void* parameter) | 1374 | enum plugin_status plugin_start(struct plugin_api* api, void* parameter) |
912 | { | 1375 | { |
913 | int w, h; | 1376 | int w, h; |
914 | int i; | ||
915 | int button = 0; | ||
916 | 1377 | ||
917 | (void)(parameter); | 1378 | (void)(parameter); |
918 | rb = api; | 1379 | rb = api; |
919 | 1380 | ||
920 | rb->lcd_setfont(FONT_SYSFIXED); | 1381 | rb->lcd_setfont(SOKOBAN_FONT); |
921 | |||
922 | #ifdef HAVE_LCD_COLOR | ||
923 | rb->lcd_set_background(BG_COLOR); | ||
924 | #endif | ||
925 | 1382 | ||
926 | rb->lcd_clear_display(); | 1383 | rb->lcd_clear_display(); |
927 | rb->lcd_getstringsize(SOKOBAN_TITLE, &w, &h); | 1384 | rb->lcd_getstringsize(SOKOBAN_TITLE, &w, &h); |
928 | rb->lcd_putsxy(LCD_WIDTH/2 - w/2, LCD_HEIGHT/2 - h/2, SOKOBAN_TITLE); | 1385 | rb->lcd_putsxy(LCD_WIDTH/2 - w/2, LCD_HEIGHT/2 - h/2, SOKOBAN_TITLE); |
929 | rb->lcd_update(); | 1386 | rb->lcd_update(); |
930 | rb->sleep(HZ); | 1387 | rb->sleep(HZ); /* Show title for 1 second */ |
931 | 1388 | ||
932 | rb->lcd_clear_display(); | 1389 | init_boards(); |
933 | 1390 | ||
934 | #if (CONFIG_KEYPAD == RECORDER_PAD) || \ | 1391 | if (parameter == NULL) { |
935 | (CONFIG_KEYPAD == ARCHOS_AV300_PAD) | 1392 | /* Attempt to resume saved progress, otherwise start at beginning */ |
936 | rb->lcd_putsxy(3, 6, "[OFF] Quit"); | 1393 | if (!load(SOKOBAN_SAVE_FILE, true)) { |
937 | rb->lcd_putsxy(3, 16, "[ON] Undo"); | 1394 | init_boards(); |
938 | rb->lcd_putsxy(3, 26, "[PLAY] Redo"); | 1395 | if (!read_levels(true)) |
939 | rb->lcd_putsxy(3, 36, "[F1] Down a Level"); | 1396 | return PLUGIN_OK; |
940 | rb->lcd_putsxy(3, 46, "[F2] Restart Level"); | 1397 | load_level(); |
941 | rb->lcd_putsxy(3, 56, "[F3] Up a Level"); | 1398 | } |
942 | #elif CONFIG_KEYPAD == ONDIO_PAD | ||
943 | rb->lcd_putsxy(3, 6, "[OFF] Quit"); | ||
944 | rb->lcd_putsxy(3, 16, "[MODE] Undo"); | ||
945 | rb->lcd_putsxy(3, 26, "[MODE+DOWN] Redo"); | ||
946 | rb->lcd_putsxy(3, 36, "[MODE+LEFT] Down a Level"); | ||
947 | rb->lcd_putsxy(3, 46, "[MODE+UP] Restart Level"); | ||
948 | rb->lcd_putsxy(3, 56, "[MODE+RIGHT] Up Level"); | ||
949 | #elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \ | ||
950 | (CONFIG_KEYPAD == IRIVER_H300_PAD) | ||
951 | rb->lcd_putsxy(3, 6, "[STOP] Quit"); | ||
952 | rb->lcd_putsxy(3, 16, "[REC] Undo"); | ||
953 | rb->lcd_putsxy(3, 26, "[MODE] Redo"); | ||
954 | rb->lcd_putsxy(3, 36, "[PLAY+DOWN] Down a Level"); | ||
955 | rb->lcd_putsxy(3, 46, "[PLAY] Restart Level"); | ||
956 | rb->lcd_putsxy(3, 56, "[PLAY+UP] Up a Level"); | ||
957 | #elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \ | ||
958 | (CONFIG_KEYPAD == IPOD_3G_PAD) | ||
959 | rb->lcd_putsxy(3, 6, "[SELECT+MENU] Quit"); | ||
960 | rb->lcd_putsxy(3, 16, "[SELECT] Undo"); | ||
961 | rb->lcd_putsxy(3, 26, "[SELECT+PLAY] Redo"); | ||
962 | rb->lcd_putsxy(3, 36, "[SELECT+LEFT] Down a Level"); | ||
963 | rb->lcd_putsxy(3, 46, "[SELECT+RIGHT] Up a Level"); | ||
964 | #elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD | ||
965 | rb->lcd_putsxy(3, 6, "[POWER] Quit"); | ||
966 | rb->lcd_putsxy(3, 16, "[SELECT] Undo"); | ||
967 | rb->lcd_putsxy(3, 26, "[REC] Down a Level"); | ||
968 | rb->lcd_putsxy(3, 36, "[PLAY] Up Level"); | ||
969 | #elif CONFIG_KEYPAD == GIGABEAT_PAD | ||
970 | rb->lcd_putsxy(3, 6, "[POWER] Quit"); | ||
971 | rb->lcd_putsxy(3, 16, "[SELECT] Undo"); | ||
972 | rb->lcd_putsxy(3, 26, "[A] Redo"); | ||
973 | rb->lcd_putsxy(3, 36, "[VOL-] Down a Level"); | ||
974 | rb->lcd_putsxy(3, 46, "[MENU] Restart Level"); | ||
975 | rb->lcd_putsxy(3, 56, "[VOL+] Up Level"); | ||
976 | #elif CONFIG_KEYPAD == SANSA_E200_PAD | ||
977 | rb->lcd_putsxy(3, 6, "[POWER] Quit"); | ||
978 | rb->lcd_putsxy(3, 16, "[SELECT] Undo"); | ||
979 | rb->lcd_putsxy(3, 26, "[REC] Redo"); | ||
980 | rb->lcd_putsxy(3, 36, "[SELECT+DOWN] Down a Level"); | ||
981 | rb->lcd_putsxy(3, 46, "[SELECT+RIGHT] Restart Level"); | ||
982 | rb->lcd_putsxy(3, 56, "[SELECT+UP] Up Level"); | ||
983 | #elif CONFIG_KEYPAD == IRIVER_H10_PAD | ||
984 | rb->lcd_putsxy(3, 6, "[POWER] Quit"); | ||
985 | rb->lcd_putsxy(3, 16, "[REW] Undo"); | ||
986 | rb->lcd_putsxy(3, 26, "[FF] Redo"); | ||
987 | rb->lcd_putsxy(3, 36, "[PLAY+DOWN] Down a Level"); | ||
988 | rb->lcd_putsxy(3, 46, "[PLAY+RIGHT] Restart Level"); | ||
989 | rb->lcd_putsxy(3, 56, "[PLAY+UP] Up Level"); | ||
990 | #endif | ||
991 | 1399 | ||
992 | rb->lcd_update(); | 1400 | } else { |
993 | rb->button_get(false); | 1401 | /* The plugin is being used to open a file */ |
994 | /* Display for 3 seconds or until keypress */ | 1402 | if (load((char*) parameter, false)) { |
995 | for (i = 0; i < 60; i++) { | 1403 | /* If we loaded & played a solution, quit */ |
996 | rb->sleep(HZ/20); | 1404 | if (current_info.level.boxes_to_go == 0) |
997 | button = rb->button_get(false); | 1405 | return PLUGIN_OK; |
998 | if (button && ((button & BUTTON_REL) != BUTTON_REL)) | 1406 | } else |
999 | break; | 1407 | return PLUGIN_OK; |
1000 | } | 1408 | } |
1001 | rb->lcd_clear_display(); | ||
1002 | |||
1003 | init_boards(); | ||
1004 | 1409 | ||
1005 | if (read_levels(1) != 0) | 1410 | rb->lcd_clear_display(); |
1006 | return PLUGIN_OK; | 1411 | update_screen(); |
1007 | 1412 | ||
1008 | return sokoban_loop(); | 1413 | return sokoban_loop(); |
1009 | } | 1414 | } |
diff --git a/apps/plugins/sokoban.levels b/apps/plugins/sokoban.levels deleted file mode 100644 index 4d73a5ed9d..0000000000 --- a/apps/plugins/sokoban.levels +++ /dev/null | |||
@@ -1,1816 +0,0 @@ | |||
1 | XXXXXXXXXXXXXXXXXXXX | ||
2 | XXXXXXXXXXXXXXXXXXXX | ||
3 | XXXXXXXXXXXXXXXXXXXX | ||
4 | XXXXXXXXXXXXXXXXXXXX | ||
5 | XXXXXXXX###XXXXXXXXX | ||
6 | XXXXXXXX#.#XXXXXXXXX | ||
7 | XXXXXXXX# ####XXXXXX | ||
8 | XXXXXX###$ $.#XXXXXX | ||
9 | XXXXXX#. $@###XXXXXX | ||
10 | XXXXXX####$#XXXXXXXX | ||
11 | XXXXXXXXX#.#XXXXXXXX | ||
12 | XXXXXXXXX###XXXXXXXX | ||
13 | XXXXXXXXXXXXXXXXXXXX | ||
14 | XXXXXXXXXXXXXXXXXXXX | ||
15 | XXXXXXXXXXXXXXXXXXXX | ||
16 | XXXXXXXXXXXXXXXXXXXX | ||
17 | |||
18 | |||
19 | XXXXXXXXXXXXXXXXXXXX | ||
20 | XXXXXXXXXXXXXXXXXXXX | ||
21 | XXXXXXXXXXXXXXXXXXXX | ||
22 | XXXXXXXXXXXXXXXXXXXX | ||
23 | XXXXX#####XXXXXXXXXX | ||
24 | XXXXX# #XXXXXXXXXX | ||
25 | XXXXX#@$$#X###XXXXXX | ||
26 | XXXXX# $ #X#.#XXXXXX | ||
27 | XXXXX### ###.#XXXXXX | ||
28 | XXXXXX## .#XXXXXX | ||
29 | XXXXXX# # #XXXXXX | ||
30 | XXXXXX# ####XXXXXX | ||
31 | XXXXXX#####XXXXXXXXX | ||
32 | XXXXXXXXXXXXXXXXXXXX | ||
33 | XXXXXXXXXXXXXXXXXXXX | ||
34 | XXXXXXXXXXXXXXXXXXXX | ||
35 | |||
36 | |||
37 | XXXXXXXXXXXXXXXXXXXX | ||
38 | XXXXXXXXXXXXXXXXXXXX | ||
39 | XXXXXXXXXXXXXXXXXXXX | ||
40 | XXXXXXXXXXXXXXXXXXXX | ||
41 | XXXXXXXXXXXXXXXXXXXX | ||
42 | XXXXXX#######XXXXXXX | ||
43 | XXXXXX# ###XXXXX | ||
44 | XXXXX##$### #XXXXX | ||
45 | XXXXX# @ $ $ #XXXXX | ||
46 | XXXXX# ..# $ ##XXXXX | ||
47 | XXXXX##..# #XXXXXX | ||
48 | XXXXXX########XXXXXX | ||
49 | XXXXXXXXXXXXXXXXXXXX | ||
50 | XXXXXXXXXXXXXXXXXXXX | ||
51 | XXXXXXXXXXXXXXXXXXXX | ||
52 | XXXXXXXXXXXXXXXXXXXX | ||
53 | |||
54 | |||
55 | XXXXXXXXXXXXXXXXXXXX | ||
56 | XXXXXXXXXXXXXXXXXXXX | ||
57 | XXXXXXXXXXXXXXXXXXXX | ||
58 | XXXXXXXXXXXXXXXXXXXX | ||
59 | XXXXXXXXXXXXXXXXXXXX | ||
60 | XXXXXXXXX#####XXXXXX | ||
61 | XXXXXX#### .#XXXXXX | ||
62 | XXXXXX# $ %#XXXXXX | ||
63 | XXXXXX# $$ $.#XXXXXX | ||
64 | XXXXXX##@##..#XXXXXX | ||
65 | XXXXXXX#######XXXXXX | ||
66 | XXXXXXXXXXXXXXXXXXXX | ||
67 | XXXXXXXXXXXXXXXXXXXX | ||
68 | XXXXXXXXXXXXXXXXXXXX | ||
69 | XXXXXXXXXXXXXXXXXXXX | ||
70 | XXXXXXXXXXXXXXXXXXXX | ||
71 | |||
72 | |||
73 | XXXXXXXXXXXXXXXXXXXX | ||
74 | XXXXXXXXXXXXXXXXXXXX | ||
75 | XXXXXXXXXXXXXXXXXXXX | ||
76 | XXXXXXXXXXXXXXXXXXXX | ||
77 | XXXXXXX####XXXXXXXXX | ||
78 | XXXXXXX#@ ###XXXXXXX | ||
79 | XXXXXXX# $ #XXXXXXX | ||
80 | XXXXXX### # ##XXXXXX | ||
81 | XXXXXX#.# # #XXXXXX | ||
82 | XXXXXX#.$ # #XXXXXX | ||
83 | XXXXXX#. $ #XXXXXX | ||
84 | XXXXXX########XXXXXX | ||
85 | XXXXXXXXXXXXXXXXXXXX | ||
86 | XXXXXXXXXXXXXXXXXXXX | ||
87 | XXXXXXXXXXXXXXXXXXXX | ||
88 | XXXXXXXXXXXXXXXXXXXX | ||
89 | |||
90 | |||
91 | XXXXXXXXXXXXXXXXXXXX | ||
92 | XXXXXXXXXXXXXXXXXXXX | ||
93 | XXXXXXXXXXXXXXXXXXXX | ||
94 | XXXXXXXXXXXXXXXXXXXX | ||
95 | XXXXXXXX#######XXXXX | ||
96 | XXXXXXX## # @#XXXXX | ||
97 | XXXXXXX# # #XXXXX | ||
98 | XXXXXXX#$ $ $ #XXXXX | ||
99 | XXXXXXX# $## #XXXXX | ||
100 | XXXXX### $ # ##XXXXX | ||
101 | XXXXX#..... #XXXXXX | ||
102 | XXXXX#########XXXXXX | ||
103 | XXXXXXXXXXXXXXXXXXXX | ||
104 | XXXXXXXXXXXXXXXXXXXX | ||
105 | XXXXXXXXXXXXXXXXXXXX | ||
106 | XXXXXXXXXXXXXXXXXXXX | ||
107 | |||
108 | |||
109 | XXXXXXXXXXXXXXXXXXXX | ||
110 | XXXXXXXXXXXXXXXXXXXX | ||
111 | XXXXXXXXXXXXXXXXXXXX | ||
112 | XXXXXXXXXXXXXXXXXXXX | ||
113 | XXXXXXXXXXXXXXXXXXXX | ||
114 | XXXXXXXX######XXXXXX | ||
115 | XXXXXX### #XXXXXX | ||
116 | XXXXX##. $## ##XXXXX | ||
117 | XXXXX#..$ $ @#XXXXX | ||
118 | XXXXX#.. $ $ ##XXXXX | ||
119 | XXXXX###### #XXXXXX | ||
120 | XXXXXXXXXX####XXXXXX | ||
121 | XXXXXXXXXXXXXXXXXXXX | ||
122 | XXXXXXXXXXXXXXXXXXXX | ||
123 | XXXXXXXXXXXXXXXXXXXX | ||
124 | XXXXXXXXXXXXXXXXXXXX | ||
125 | |||
126 | |||
127 | XXXXXXXXXXXXXXXXXXXX | ||
128 | XXXXXXXXXXXXXXXXXXXX | ||
129 | XXXXXXXXXXXXXXXXXXXX | ||
130 | XXXXXXXXXXXXXXXXXXXX | ||
131 | XXXXXXXX######XXXXXX | ||
132 | XXXXXXXX# #XXXXXX | ||
133 | XXXXXX###$$$ #XXXXXX | ||
134 | XXXXXX#@ $.. #XXXXXX | ||
135 | XXXXXX# $...##XXXXXX | ||
136 | XXXXXX#### #XXXXXXX | ||
137 | XXXXXXXXX####XXXXXXX | ||
138 | XXXXXXXXXXXXXXXXXXXX | ||
139 | XXXXXXXXXXXXXXXXXXXX | ||
140 | XXXXXXXXXXXXXXXXXXXX | ||
141 | XXXXXXXXXXXXXXXXXXXX | ||
142 | XXXXXXXXXXXXXXXXXXXX | ||
143 | |||
144 | |||
145 | XXXXXXXXXXXXXXXXXXXX | ||
146 | XXXXXXXXXXXXXXXXXXXX | ||
147 | XXXXXXXXXXXXXXXXXXXX | ||
148 | XXXXXXXXXXXXXXXXXXXX | ||
149 | XXXXXXXX####XXXXXXXX | ||
150 | XXXXXXXX#..#XXXXXXXX | ||
151 | XXXXXXX## .##XXXXXXX | ||
152 | XXXXXXX# $.#XXXXXXX | ||
153 | XXXXXX## $ ##XXXXXX | ||
154 | XXXXXX# #$$ #XXXXXX | ||
155 | XXXXXX# @ #XXXXXX | ||
156 | XXXXXX########XXXXXX | ||
157 | XXXXXXXXXXXXXXXXXXXX | ||
158 | XXXXXXXXXXXXXXXXXXXX | ||
159 | XXXXXXXXXXXXXXXXXXXX | ||
160 | XXXXXXXXXXXXXXXXXXXX | ||
161 | |||
162 | |||
163 | XXXXXXXXXXXXXXXXXXXX | ||
164 | XXXXXXXXXXXXXXXXXXXX | ||
165 | XXXXXXXXXXXXXXXXXXXX | ||
166 | XXXXXXXXXXXXXXXXXXXX | ||
167 | XXXXXXXXXXXXXXXXXXXX | ||
168 | XXXXXXXX#####XXXXXXX | ||
169 | XXXXXX### @#XXXXXXX | ||
170 | XXXXXX# $. ##XXXXXX | ||
171 | XXXXXX# .$. #XXXXXX | ||
172 | XXXXXX### %$ #XXXXXX | ||
173 | XXXXXXXX# ##XXXXXX | ||
174 | XXXXXXXX#####XXXXXXX | ||
175 | XXXXXXXXXXXXXXXXXXXX | ||
176 | XXXXXXXXXXXXXXXXXXXX | ||
177 | XXXXXXXXXXXXXXXXXXXX | ||
178 | XXXXXXXXXXXXXXXXXXXX | ||
179 | |||
180 | |||
181 | XXXXXXXXXXXXXXXXXXXX | ||
182 | XXXXXXXXXXXXXXXXXXXX | ||
183 | XXXXXXXXXXXXXXXXXXXX | ||
184 | XXXXXXXXXXXXXXXXXXXX | ||
185 | XXXXXX########XXXXXX | ||
186 | XXXXXX# # #XXXXXX | ||
187 | XXXXXX# $..$ #XXXXXX | ||
188 | XXXXXX#@$.% ##XXXXXX | ||
189 | XXXXXX# $..$ #XXXXXX | ||
190 | XXXXXX# # #XXXXXX | ||
191 | XXXXXX########XXXXXX | ||
192 | XXXXXXXXXXXXXXXXXXXX | ||
193 | XXXXXXXXXXXXXXXXXXXX | ||
194 | XXXXXXXXXXXXXXXXXXXX | ||
195 | XXXXXXXXXXXXXXXXXXXX | ||
196 | XXXXXXXXXXXXXXXXXXXX | ||
197 | |||
198 | |||
199 | XXXXXXXXXXXXXXXXXXXX | ||
200 | XXXXXXXXXXXXXXXXXXXX | ||
201 | XXXXXXXXXXXXXXXXXXXX | ||
202 | XXXXXXXXXXXXXXXXXXXX | ||
203 | XXXXXXX######XXXXXXX | ||
204 | XXXXXXX# ###XXXXX | ||
205 | XXXXXXX# $ #XXXXX | ||
206 | XXXXX### $ ## #XXXXX | ||
207 | XXXXX#... $ #XXXXX | ||
208 | XXXXX#...$#$ ##XXXXX | ||
209 | XXXXX#### # $ #XXXXX | ||
210 | XXXXXXXX# @ #XXXXX | ||
211 | XXXXXXXX#######XXXXX | ||
212 | XXXXXXXXXXXXXXXXXXXX | ||
213 | XXXXXXXXXXXXXXXXXXXX | ||
214 | XXXXXXXXXXXXXXXXXXXX | ||
215 | |||
216 | |||
217 | XXXXXXXXXXXXXXXXXXXX | ||
218 | XXXXXXXXXXXXXXXXXXXX | ||
219 | XXXXXXXXXXXXXXXXXXXX | ||
220 | XXXXXXXXXXXXXXXXXXXX | ||
221 | XXXXXX######XXXXXXXX | ||
222 | XXXXXX# #XXXXXXXX | ||
223 | XXXXXX# $$$##XXXXXXX | ||
224 | XXXXXX# #..###XXXXX | ||
225 | XXXXXX## ..$ #XXXXX | ||
226 | XXXXXXX# @ #XXXXX | ||
227 | XXXXXXX########XXXXX | ||
228 | XXXXXXXXXXXXXXXXXXXX | ||
229 | XXXXXXXXXXXXXXXXXXXX | ||
230 | XXXXXXXXXXXXXXXXXXXX | ||
231 | XXXXXXXXXXXXXXXXXXXX | ||
232 | XXXXXXXXXXXXXXXXXXXX | ||
233 | |||
234 | |||
235 | XXXXXXXXXXXXXXXXXXXX | ||
236 | XXXXXXXXXXXXXXXXXXXX | ||
237 | XXXXXXXXXXXXXXXXXXXX | ||
238 | XXXXXXXXXXXXXXXXXXXX | ||
239 | XXXXXXX########XXXXX | ||
240 | XXXXXXX# #. #XXXXX | ||
241 | XXXXXX## $...#XXXXX | ||
242 | XXXXXX# $ #%.#XXXXX | ||
243 | XXXXX## ##$# ##XXXXX | ||
244 | XXXXX# $ $ #XXXXX | ||
245 | XXXXX# # #XXXXX | ||
246 | XXXXX#######@ #XXXXX | ||
247 | XXXXXXXXXXX####XXXXX | ||
248 | XXXXXXXXXXXXXXXXXXXX | ||
249 | XXXXXXXXXXXXXXXXXXXX | ||
250 | XXXXXXXXXXXXXXXXXXXX | ||
251 | |||
252 | |||
253 | XXXXXXXXXXXXXXXXXXXX | ||
254 | XXXXXXXXXXXXXXXXXXXX | ||
255 | XXXXXXXXXXXXXXXXXXXX | ||
256 | XXXXXXXXXXXXXXXXXXXX | ||
257 | XXXXXX#######XXXXXXX | ||
258 | XXXXXX#.... #XXXXXXX | ||
259 | XXXXX###...$###XXXXX | ||
260 | XXXXX# $#$ $ #XXXXX | ||
261 | XXXXX# $$ #$ #XXXXX | ||
262 | XXXXX# # #XXXXX | ||
263 | XXXXX#### @ ###XXXXX | ||
264 | XXXXXXXX#####XXXXXXX | ||
265 | XXXXXXXXXXXXXXXXXXXX | ||
266 | XXXXXXXXXXXXXXXXXXXX | ||
267 | XXXXXXXXXXXXXXXXXXXX | ||
268 | XXXXXXXXXXXXXXXXXXXX | ||
269 | |||
270 | |||
271 | XXXXXXXXXXXXXXXXXXXX | ||
272 | XXXXXXXXXXXXXXXXXXXX | ||
273 | XXXXXXXXXXXXXXXXXXXX | ||
274 | XXXXXXXXXXXXXXXXXXXX | ||
275 | XXXXXX########XXXXXX | ||
276 | XXXXXX#.. #XXXXXX | ||
277 | XXXXXX#..$ $@#XXXXXX | ||
278 | XXXXXX#$#$$$##XXXXXX | ||
279 | XXXXXX#..$ $ #XXXXXX | ||
280 | XXXXXX#.. #XXXXXX | ||
281 | XXXXXX########XXXXXX | ||
282 | XXXXXXXXXXXXXXXXXXXX | ||
283 | XXXXXXXXXXXXXXXXXXXX | ||
284 | XXXXXXXXXXXXXXXXXXXX | ||
285 | XXXXXXXXXXXXXXXXXXXX | ||
286 | XXXXXXXXXXXXXXXXXXXX | ||
287 | |||
288 | |||
289 | XXXXXXXXXXXXXXXXXXXX | ||
290 | XXXXXXXXXXXXXXXXXXXX | ||
291 | XXXXXXXXXXXXXXXXXXXX | ||
292 | XXXXXXXXXXXXXXXXXXXX | ||
293 | XXXXX########XXXXXXX | ||
294 | XXXXX# #XXXXXXX | ||
295 | XXXXX# #$$ #XXXXXXX | ||
296 | XXXXX# ...# #XXXXXXX | ||
297 | XXXXX##...$ ##XXXXXX | ||
298 | XXXXXX# ## $ #XXXXXX | ||
299 | XXXXXX#$ $ #XXXXXX | ||
300 | XXXXXX# # @#XXXXXX | ||
301 | XXXXXX########XXXXXX | ||
302 | XXXXXXXXXXXXXXXXXXXX | ||
303 | XXXXXXXXXXXXXXXXXXXX | ||
304 | XXXXXXXXXXXXXXXXXXXX | ||
305 | |||
306 | |||
307 | XXXXXXXXXXXXXXXXXXXX | ||
308 | XXXXXXXXXXXXXXXXXXXX | ||
309 | XXXXXXXXXXXXXXXXXXXX | ||
310 | XXXXXXXXXXXXXXXXXXXX | ||
311 | XXXXXXX#####XXXXXXXX | ||
312 | XXXXX### ####XXXXX | ||
313 | XXXXX# $ $ #XXXXX | ||
314 | XXXXX# $ $ @#XXXXX | ||
315 | XXXXX###$$#####XXXXX | ||
316 | XXXXXXX# ..#XXXXXXX | ||
317 | XXXXXXX#....#XXXXXXX | ||
318 | XXXXXXX######XXXXXXX | ||
319 | XXXXXXXXXXXXXXXXXXXX | ||
320 | XXXXXXXXXXXXXXXXXXXX | ||
321 | XXXXXXXXXXXXXXXXXXXX | ||
322 | XXXXXXXXXXXXXXXXXXXX | ||
323 | |||
324 | |||
325 | XXXXXXXXXXXXXXXXXXXX | ||
326 | XXXXXXXXXXXXXXXXXXXX | ||
327 | XXXXXXXXXXXXXXXXXXXX | ||
328 | XXXXXXXXXXXXXXXXXXXX | ||
329 | XXXXX#########XXXXXX | ||
330 | XXXXX# % #XXXXXX | ||
331 | XXXXX# $.$. @#XXXXXX | ||
332 | XXXXX# .$.$. #XXXXXX | ||
333 | XXXXX# $.$.$ #XXXXXX | ||
334 | XXXXX# % #XXXXXX | ||
335 | XXXXX#########XXXXXX | ||
336 | XXXXXXXXXXXXXXXXXXXX | ||
337 | XXXXXXXXXXXXXXXXXXXX | ||
338 | XXXXXXXXXXXXXXXXXXXX | ||
339 | XXXXXXXXXXXXXXXXXXXX | ||
340 | XXXXXXXXXXXXXXXXXXXX | ||
341 | |||
342 | |||
343 | XXXXXXXXXXXXXXXXXXXX | ||
344 | XXXXXXXXXXXXXXXXXXXX | ||
345 | XXXXXXXXXXXXXXXXXXXX | ||
346 | XXXXXXXXXXXXXXXXXXXX | ||
347 | XXXXXXXXXXXXXXXXXXXX | ||
348 | XXXXXX#########XXXXX | ||
349 | XXXXX## #XXXXX | ||
350 | XXXXX# #$#$ #XXXXX | ||
351 | XXXXX# $$ .$.#XXXXX | ||
352 | XXXXX# @###...#XXXXX | ||
353 | XXXXX####X#####XXXXX | ||
354 | XXXXXXXXXXXXXXXXXXXX | ||
355 | XXXXXXXXXXXXXXXXXXXX | ||
356 | XXXXXXXXXXXXXXXXXXXX | ||
357 | XXXXXXXXXXXXXXXXXXXX | ||
358 | XXXXXXXXXXXXXXXXXXXX | ||
359 | |||
360 | |||
361 | XXXXXXXXXXXXXXXXXXXX | ||
362 | XXXXXXXXXXXXXXXXXXXX | ||
363 | XXXXXXXXXXXXXXXXXXXX | ||
364 | XXXXXXXXXXXXXXXXXXXX | ||
365 | XXXXXXX######XXXXXXX | ||
366 | XXXXXXX#. ..#XXXXXXX | ||
367 | XXXXXXX#. $.#XXXXXXX | ||
368 | XXXXXX### $##XXXXXX | ||
369 | XXXXXX# $ $ #XXXXXX | ||
370 | XXXXXX# #$## #XXXXXX | ||
371 | XXXXXX# @ #XXXXXX | ||
372 | XXXXXX########XXXXXX | ||
373 | XXXXXXXXXXXXXXXXXXXX | ||
374 | XXXXXXXXXXXXXXXXXXXX | ||
375 | XXXXXXXXXXXXXXXXXXXX | ||
376 | XXXXXXXXXXXXXXXXXXXX | ||
377 | |||
378 | |||
379 | XXXXXXXXXXXXXXXXXXXX | ||
380 | XXXXXXXXXXXXXXXXXXXX | ||
381 | XXXXXXXXXXXXXXXXXXXX | ||
382 | XXXXXXXXXXXXXXXXXXXX | ||
383 | XXXXXXXXXXXXXXXXXXXX | ||
384 | XXXXXX#####XXXXXXXXX | ||
385 | XXXXXX# ####XXXXXX | ||
386 | XXXXX## #$ #XXXXXX | ||
387 | XXXXX# $ $$ #XXXXXX | ||
388 | XXXXX# #$#.%.#XXXXXX | ||
389 | XXXXX# @...#XXXXXX | ||
390 | XXXXX#########XXXXXX | ||
391 | XXXXXXXXXXXXXXXXXXXX | ||
392 | XXXXXXXXXXXXXXXXXXXX | ||
393 | XXXXXXXXXXXXXXXXXXXX | ||
394 | XXXXXXXXXXXXXXXXXXXX | ||
395 | |||
396 | |||
397 | XXXXXXXXXXXXXXXXXXXX | ||
398 | XXXXXXXXXXXXXXXXXXXX | ||
399 | XXXXXXXXXXXXXXXXXXXX | ||
400 | XXXXXXXXXXXXXXXXXXXX | ||
401 | XXXXXXXXX#####XXXXXX | ||
402 | XXXXXX#### ##XXXXX | ||
403 | XXXXXX# $ $ #XXXXX | ||
404 | XXXXXX#@#.%.# #XXXXX | ||
405 | XXXXXX# #.%.# #XXXXX | ||
406 | XXXXXX# $ $ #XXXXX | ||
407 | XXXXXX## ####XXXXX | ||
408 | XXXXXXX#####XXXXXXXX | ||
409 | XXXXXXXXXXXXXXXXXXXX | ||
410 | XXXXXXXXXXXXXXXXXXXX | ||
411 | XXXXXXXXXXXXXXXXXXXX | ||
412 | XXXXXXXXXXXXXXXXXXXX | ||
413 | |||
414 | |||
415 | XXXXXXXXXXXXXXXXXXXX | ||
416 | XXXXXXXXXXXXXXXXXXXX | ||
417 | XXXXXXXXXXXXXXXXXXXX | ||
418 | XXXXXXXXXXXXXXXXXXXX | ||
419 | XXXXXXXX#####XXXXXXX | ||
420 | XXXXX####. ##XXXXXX | ||
421 | XXXXX# $.$. #XXXXXX | ||
422 | XXXXX#@$# #$ #XXXXXX | ||
423 | XXXXX# $. . #XXXXXX | ||
424 | XXXXX####$#$ #XXXXXX | ||
425 | XXXXXXX#. . #XXXXXX | ||
426 | XXXXXXX#######XXXXXX | ||
427 | XXXXXXXXXXXXXXXXXXXX | ||
428 | XXXXXXXXXXXXXXXXXXXX | ||
429 | XXXXXXXXXXXXXXXXXXXX | ||
430 | XXXXXXXXXXXXXXXXXXXX | ||
431 | |||
432 | |||
433 | XXXXXXXXXXXXXXXXXXXX | ||
434 | XXXXXXXXXXXXXXXXXXXX | ||
435 | XXXXXXXXXXXXXXXXXXXX | ||
436 | XXXXXXXXXXXXXXXXXXXX | ||
437 | XXXXXXXX########XXXX | ||
438 | XXXXX#### . #XXXX | ||
439 | XXXXX# $ $ $. #XXXX | ||
440 | XXXXX# .####.##XXXX | ||
441 | XXXXX# $.$ $ @#XXXXX | ||
442 | XXXXX# . ##XXXXX | ||
443 | XXXXX#########XXXXXX | ||
444 | XXXXXXXXXXXXXXXXXXXX | ||
445 | XXXXXXXXXXXXXXXXXXXX | ||
446 | XXXXXXXXXXXXXXXXXXXX | ||
447 | XXXXXXXXXXXXXXXXXXXX | ||
448 | XXXXXXXXXXXXXXXXXXXX | ||
449 | |||
450 | |||
451 | XXXXXXXXXXXXXXXXXXXX | ||
452 | XXXXXXXXXXXXXXXXXXXX | ||
453 | XXXXXXXXXXXXXXXXXXXX | ||
454 | XXXXXXXXXXXXXXXXXXXX | ||
455 | XXXXXXXXXXXXXXXXXXXX | ||
456 | XXXXX#######XXXXXXXX | ||
457 | XXXXX# #####XXXX | ||
458 | XXXXX# $ .%. $ #XXXX | ||
459 | XXXXX#@$.% %.$ #XXXX | ||
460 | XXXXX# $ .%. $ #XXXX | ||
461 | XXXXX###### #XXXX | ||
462 | XXXXXXXXXX######XXXX | ||
463 | XXXXXXXXXXXXXXXXXXXX | ||
464 | XXXXXXXXXXXXXXXXXXXX | ||
465 | XXXXXXXXXXXXXXXXXXXX | ||
466 | XXXXXXXXXXXXXXXXXXXX | ||
467 | |||
468 | |||
469 | XXXXXXXXXXXXXXXXXXXX | ||
470 | XXXXXXXXXXXXXXXXXXXX | ||
471 | XXXXXXXXXXXXXXXXXXXX | ||
472 | XXXXXXXXXXXXXXXXXXXX | ||
473 | XXXXX######XXXXXXXXX | ||
474 | XXXXX# #XXXXXXXXX | ||
475 | XXXXX# $ ####XXXXXX | ||
476 | XXXXX# $%..% #XXXXXX | ||
477 | XXXXX# %..%$ #XXXXXX | ||
478 | XXXXX#### $ #XXXXXX | ||
479 | XXXXXXXX# @ #XXXXXX | ||
480 | XXXXXXXX######XXXXXX | ||
481 | XXXXXXXXXXXXXXXXXXXX | ||
482 | XXXXXXXXXXXXXXXXXXXX | ||
483 | XXXXXXXXXXXXXXXXXXXX | ||
484 | XXXXXXXXXXXXXXXXXXXX | ||
485 | |||
486 | |||
487 | XXXXXXXXXXXXXXXXXXXX | ||
488 | XXXXXXXXXXXXXXXXXXXX | ||
489 | XXXXXXXXXXXXXXXXXXXX | ||
490 | XXXXXXXXXXXXXXXXXXXX | ||
491 | XXXXXXXXX######XXXXX | ||
492 | XXXXXX####. @#XXXXX | ||
493 | XXXXXX# $$$ #XXXXX | ||
494 | XXXXXX#.##.##.#XXXXX | ||
495 | XXXXXX# $ #XXXXX | ||
496 | XXXXXX# $.# ##XXXXX | ||
497 | XXXXXX#### #XXXXXX | ||
498 | XXXXXXXXX#####XXXXXX | ||
499 | XXXXXXXXXXXXXXXXXXXX | ||
500 | XXXXXXXXXXXXXXXXXXXX | ||
501 | XXXXXXXXXXXXXXXXXXXX | ||
502 | XXXXXXXXXXXXXXXXXXXX | ||
503 | |||
504 | |||
505 | XXXXXXXXXXXXXXXXXXXX | ||
506 | XXXXXXXXXXXXXXXXXXXX | ||
507 | XXXXXXXXXXXXXXXXXXXX | ||
508 | XXXXXXXXXXXXXXXXXXXX | ||
509 | XXXXXX#########XXXXX | ||
510 | XXXXXX#. $. @#XXXXX | ||
511 | XXXXXX# .$.$ #XXXXX | ||
512 | XXXXXX##$.$ $##XXXXX | ||
513 | XXXXXX# .$.$ #XXXXX | ||
514 | XXXXXX#. $. #XXXXX | ||
515 | XXXXXX#########XXXXX | ||
516 | XXXXXXXXXXXXXXXXXXXX | ||
517 | XXXXXXXXXXXXXXXXXXXX | ||
518 | XXXXXXXXXXXXXXXXXXXX | ||
519 | XXXXXXXXXXXXXXXXXXXX | ||
520 | XXXXXXXXXXXXXXXXXXXX | ||
521 | |||
522 | |||
523 | XXXXXXXXXXXXXXXXXXXX | ||
524 | XXXXXXXXXXXXXXXXXXXX | ||
525 | XXXXXXXXXXXXXXXXXXXX | ||
526 | XXXXXXXXXXXXXXXXXXXX | ||
527 | XXXXXXXXXXXXXXXXXXXX | ||
528 | XXXXXXX#######XXXXXX | ||
529 | XXXXXXX# @ #XXXXXX | ||
530 | XXXXXXX##$ $ #XXXXXX | ||
531 | XXXXXXX# $$##XXXXXX | ||
532 | XXXXXXX#....#XXXXXXX | ||
533 | XXXXXXX######XXXXXXX | ||
534 | XXXXXXXXXXXXXXXXXXXX | ||
535 | XXXXXXXXXXXXXXXXXXXX | ||
536 | XXXXXXXXXXXXXXXXXXXX | ||
537 | XXXXXXXXXXXXXXXXXXXX | ||
538 | XXXXXXXXXXXXXXXXXXXX | ||
539 | |||
540 | |||
541 | XXXXXXXXXXXXXXXXXXXX | ||
542 | XXXXXXXXXXXXXXXXXXXX | ||
543 | XXXXXXXXXXXXXXXXXXXX | ||
544 | XXXXXXXXXXXXXXXXXXXX | ||
545 | XXXXXX####XXXXXXXXXX | ||
546 | XXXXXX# #####XXXXXX | ||
547 | XXXXX##$ ## #XXXXXX | ||
548 | XXXXX# $@$ #XXXXXX | ||
549 | XXXXX# ##$ #XXXXXX | ||
550 | XXXXX###.## ###XXXXX | ||
551 | XXXXXX#...$ $ #XXXXX | ||
552 | XXXXXX##.. #XXXXX | ||
553 | XXXXXXX########XXXXX | ||
554 | XXXXXXXXXXXXXXXXXXXX | ||
555 | XXXXXXXXXXXXXXXXXXXX | ||
556 | XXXXXXXXXXXXXXXXXXXX | ||
557 | |||
558 | |||
559 | XXXXXXXXXXXXXXXXXXXX | ||
560 | XXXXXXXXXXXXXXXXXXXX | ||
561 | XXXXXXXXXXXXXXXXXXXX | ||
562 | XXXXXXXXXXXXXXXXXXXX | ||
563 | XXXXXXXXXXXXXXXXXXXX | ||
564 | XXXXXX########XXXXXX | ||
565 | XXXXXX# #.. ##XXXXX | ||
566 | XXXXXX# $. $% #XXXXX | ||
567 | XXXXXX# $@$ #XXXXX | ||
568 | XXXXXX# %$ .$ #XXXXX | ||
569 | XXXXXX## ..# #XXXXX | ||
570 | XXXXXXX########XXXXX | ||
571 | XXXXXXXXXXXXXXXXXXXX | ||
572 | XXXXXXXXXXXXXXXXXXXX | ||
573 | XXXXXXXXXXXXXXXXXXXX | ||
574 | XXXXXXXXXXXXXXXXXXXX | ||
575 | |||
576 | |||
577 | XXXXXXXXXXXXXXXXXXXX | ||
578 | XXXXXXXXXXXXXXXXXXXX | ||
579 | XXXXXXXXXXXXXXXXXXXX | ||
580 | XXXXXXXXXXXXXXXXXXXX | ||
581 | XXXXXX#######XXXXXXX | ||
582 | XXXXX## % ##XXXXXX | ||
583 | XXXXX# . . . #XXXXXX | ||
584 | XXXXX# $ % #XXXXXX | ||
585 | XXXXX#%$$%$$%#XXXXXX | ||
586 | XXXXX# % $ #XXXXXX | ||
587 | XXXXX# . .@. #XXXXXX | ||
588 | XXXXX## % ##XXXXXX | ||
589 | XXXXXX#######XXXXXXX | ||
590 | XXXXXXXXXXXXXXXXXXXX | ||
591 | XXXXXXXXXXXXXXXXXXXX | ||
592 | XXXXXXXXXXXXXXXXXXXX | ||
593 | |||
594 | |||
595 | XXXXXXXXXXXXXXXXXXXX | ||
596 | XXXXXXXXXXXXXXXXXXXX | ||
597 | XXXXXXXXXXXXXXXXXXXX | ||
598 | XXXXXXXXXXXXXXXXXXXX | ||
599 | XXXXX#########XXXXXX | ||
600 | XXXXX# .$ @#XXXXXX | ||
601 | XXXXX# $ % $ #XXXXXX | ||
602 | XXXXX#%...%.%#XXXXXX | ||
603 | XXXXX# $$% #XXXXXX | ||
604 | XXXXX# . $ #XXXXXX | ||
605 | XXXXX#########XXXXXX | ||
606 | XXXXXXXXXXXXXXXXXXXX | ||
607 | XXXXXXXXXXXXXXXXXXXX | ||
608 | XXXXXXXXXXXXXXXXXXXX | ||
609 | XXXXXXXXXXXXXXXXXXXX | ||
610 | XXXXXXXXXXXXXXXXXXXX | ||
611 | |||
612 | |||
613 | XXXXXXXXXXXXXXXXXXXX | ||
614 | XXXXXXXXXXXXXXXXXXXX | ||
615 | XXXXXXXXXXXXXXXXXXXX | ||
616 | XXXXXXXXX######XXXXX | ||
617 | XXXXX#####. #XXXXX | ||
618 | XXXXX# #..## #XXXXX | ||
619 | XXXXX# $.. #XXXXX | ||
620 | XXXXX# # .# ##XXXXX | ||
621 | XXXX### ##$# #XXXXX | ||
622 | XXXX# $ $$ #XXXXX | ||
623 | XXXX# #$# # #XXXXX | ||
624 | XXXX#@ #######XXXXX | ||
625 | XXXX#####XXXXXXXXXXX | ||
626 | XXXXXXXXXXXXXXXXXXXX | ||
627 | XXXXXXXXXXXXXXXXXXXX | ||
628 | XXXXXXXXXXXXXXXXXXXX | ||
629 | |||
630 | |||
631 | XXXXXXXXXXXXXXXXXXXX | ||
632 | XXXXXXXXXXXXXXXXXXXX | ||
633 | XXXXXXXXXXXXXXXXXXXX | ||
634 | XXXXXXXXXXXXXXXXXXXX | ||
635 | XXXXXXX######XXXXXXX | ||
636 | XXXXXXX# ...#XXXXXXX | ||
637 | XXXX####....#XXXXXXX | ||
638 | XXXX# ###$ ###XXXXX | ||
639 | XXXX# $ $ $$ #XXXXX | ||
640 | XXXX#@ $ $ #XXXXX | ||
641 | XXXX# #### #XXXXX | ||
642 | XXXX####XX#####XXXXX | ||
643 | XXXXXXXXXXXXXXXXXXXX | ||
644 | XXXXXXXXXXXXXXXXXXXX | ||
645 | XXXXXXXXXXXXXXXXXXXX | ||
646 | XXXXXXXXXXXXXXXXXXXX | ||
647 | |||
648 | |||
649 | XXXXXXXXXXXXXXXXXXXX | ||
650 | XXXXXXXXXXXXXXXXXXXX | ||
651 | XXXXXXXXXXXXXXXXXXXX | ||
652 | XXXXXXXXXXXXXXXXXXXX | ||
653 | XXXXXX#########XXXXX | ||
654 | XXXXXX# ## #XXXXX | ||
655 | XXXXXX# $ #XXXXX | ||
656 | XXXXXX#$ ### $#XXXXX | ||
657 | XXXXXX# #...# #XXXXX | ||
658 | XXXXX## #...# ##XXXX | ||
659 | XXXXX# $ $ $ #XXXX | ||
660 | XXXXX# # @ #XXXX | ||
661 | XXXXX###########XXXX | ||
662 | XXXXXXXXXXXXXXXXXXXX | ||
663 | XXXXXXXXXXXXXXXXXXXX | ||
664 | XXXXXXXXXXXXXXXXXXXX | ||
665 | |||
666 | |||
667 | XXXXXXXXXXXXXXXXXXXX | ||
668 | XXXXXXXXXXXXXXXXXXXX | ||
669 | XXXXXXXX#######XXXXX | ||
670 | XXXXXX### #XXXXX | ||
671 | XXXXX## # # #XXXXX | ||
672 | XXXXX# #.$$$ #XXXXX | ||
673 | XXXXX# #.%# ###XXXXX | ||
674 | XXXXX# ..# #XXXXXXX | ||
675 | XXXXX###..$ ##XXXXXX | ||
676 | XXXXXXX#.# $ #XXXXXX | ||
677 | XXXXXX## # #@#XXXXXX | ||
678 | XXXXXX# $ $ #XXXXXX | ||
679 | XXXXXX# ###XXXXXX | ||
680 | XXXXXX######XXXXXXXX | ||
681 | XXXXXXXXXXXXXXXXXXXX | ||
682 | XXXXXXXXXXXXXXXXXXXX | ||
683 | |||
684 | |||
685 | XXXXXXXXXXXXXXXXXXXX | ||
686 | XXXXXXXXXXXXXXXXXXXX | ||
687 | XXXXXX##########XXXX | ||
688 | XXXXX## #XXXX | ||
689 | XXXXX#@ $$$ $ #XXXX | ||
690 | XXXXX## $ $ $ #XXXX | ||
691 | XXXXXX## #### ##XXXX | ||
692 | XXXXXXX# $ ##XXXX | ||
693 | XXXXX### ##$ $ #XXXX | ||
694 | XXXXX# # #XXXX | ||
695 | XXXXX# ######XXXX | ||
696 | XXXXX# ##XXXXXXXX | ||
697 | XXXXX#.....#XXXXXXXX | ||
698 | XXXXX#.....#XXXXXXXX | ||
699 | XXXXX#######XXXXXXXX | ||
700 | XXXXXXXXXXXXXXXXXXXX | ||
701 | |||
702 | |||
703 | XXXXXXXXXXXXXXXXXXXX | ||
704 | XXXXXXXXXXXXXXXXXXXX | ||
705 | XXXXX########XXXXXXX | ||
706 | XXXXX# #XXXXXXX | ||
707 | XXXXX# @ $# #XXXXXXX | ||
708 | XXXXX## # #XXXXXXX | ||
709 | XXXXX# $#.# #XXXXXXX | ||
710 | XXXXX# .%.$#XXXXXXX | ||
711 | XXXXX## #.# #XXXXXXX | ||
712 | XXXXXX# #. ##XXXXXX | ||
713 | XXXXX## $.# #XXXXXX | ||
714 | XXXXX# # $ #XXXXXX | ||
715 | XXXXX# $ ###XXXXXX | ||
716 | XXXXX# ####XXXXXXXX | ||
717 | XXXXX####XXXXXXXXXXX | ||
718 | XXXXXXXXXXXXXXXXXXXX | ||
719 | |||
720 | |||
721 | XXXXXXXXXXXXXXXXXXXX | ||
722 | XXXXXXXXXXX####XXXXX | ||
723 | XXXXXXXXXXX#@ #XXXXX | ||
724 | XXXXXXX##### #XXXXX | ||
725 | XXXX#### #XXXXX | ||
726 | XXXX# .### ##XXXXX | ||
727 | XXXX# # # ##XXXXX | ||
728 | XXXX# # $ $#. #XXXXX | ||
729 | XXXX# # % # #XXXXX | ||
730 | XXXX# .#$ $ # #XXXXX | ||
731 | XXXX## # # #XXXXX | ||
732 | XXXXX# ###. #XXXXX | ||
733 | XXXXX# ####XXXXX | ||
734 | XXXXX#######XXXXXXXX | ||
735 | XXXXXXXXXXXXXXXXXXXX | ||
736 | XXXXXXXXXXXXXXXXXXXX | ||
737 | |||
738 | |||
739 | XXXXXXXXXXXXXXXXXXXX | ||
740 | XXXXXXXXXXXXXXXXXXXX | ||
741 | XXXXXXX#####XXXXXXXX | ||
742 | XXXXXXX# ##XXXXXXX | ||
743 | XXXXXXX# $ #XXXXXXX | ||
744 | XXXXXXX# $ @#XXXXXXX | ||
745 | XXXXXXX###. #XXXXXXX | ||
746 | XXXXXXXXX#.##XXXXXXX | ||
747 | XXXXXXXXX#. #XXXXXXX | ||
748 | XXXXXXX###. #XXXXXXX | ||
749 | XXXXXXX# $ #XXXXXXX | ||
750 | XXXXXXX# $ #XXXXXXX | ||
751 | XXXXXXX## ##XXXXXXX | ||
752 | XXXXXXXX####XXXXXXXX | ||
753 | XXXXXXXXXXXXXXXXXXXX | ||
754 | XXXXXXXXXXXXXXXXXXXX | ||
755 | |||
756 | |||
757 | XXXXXXXXXXXXXXXXXXXX | ||
758 | XXXXXXXXXXXXXXXXXXXX | ||
759 | XXXXXX####XXXXXXXXXX | ||
760 | XXXXXX# #####XXXXXX | ||
761 | XXXXXX# # #XXXXXX | ||
762 | XXXXXX# . # #XXXXXX | ||
763 | XXXXXX##$# .#XXXXXX | ||
764 | XXXXXXX# #$# #XXXXXX | ||
765 | XXXXXX##. . #XXXXXX | ||
766 | XXXXXX# ## #XXXXXX | ||
767 | XXXXXX# # %#XXXXXX | ||
768 | XXXXXX# $ $ #XXXXXX | ||
769 | XXXXXX# $#% @#XXXXXX | ||
770 | XXXXXX# #.###XXXXXX | ||
771 | XXXXXX######XXXXXXXX | ||
772 | XXXXXXXXXXXXXXXXXXXX | ||
773 | |||
774 | |||
775 | XXXXXXXXXXXXXXXXXXXX | ||
776 | XXXXXXXXXXXXXXXXXXXX | ||
777 | XXXXXXXX###XXXXXXXXX | ||
778 | XXXXXXXX#.######XXXX | ||
779 | XXXXXX###.$ # #XXXX | ||
780 | XXXXXX#... #$ #XXXX | ||
781 | XXXXXX#.## $ #XXXX | ||
782 | XXXXX##.$ $## ##XXXX | ||
783 | XXXXX#.$ # ## #XXXXX | ||
784 | XXXXX#.#$ #XXXXX | ||
785 | XXXXX#.$ #$ $#XXXXX | ||
786 | XXXXX#. $## @ #XXXXX | ||
787 | XXXXX#.$ $ #XXXXX | ||
788 | XXXXX#. #######XXXXX | ||
789 | XXXXX####XXXXXXXXXXX | ||
790 | XXXXXXXXXXXXXXXXXXXX | ||
791 | |||
792 | |||
793 | XXXXXXXXXXXXXXXXXXXX | ||
794 | XXXXXXXXXXXXXXXXXXXX | ||
795 | XXXXXXXXX####XXXXXXX | ||
796 | XXXXXXX### ##XXXXXX | ||
797 | XXXXXX## ##XXXXX | ||
798 | XXXXXX# # ..#XXXXX | ||
799 | XXXXX## $#%#$.#XXXXX | ||
800 | XXXXX# $ # $.#XXXXX | ||
801 | XXXXX# $ @ $.#XXXXX | ||
802 | XXXXX# $ # $.#XXXXX | ||
803 | XXXXX##$$#%#$.#XXXXX | ||
804 | XXXXXX#. # ..#XXXXX | ||
805 | XXXXXX##. ##XXXXX | ||
806 | XXXXXXX### ##XXXXXX | ||
807 | XXXXXXXXX####XXXXXXX | ||
808 | XXXXXXXXXXXXXXXXXXXX | ||
809 | |||
810 | |||
811 | XXXXXXXXXXXXXXXXXXXX | ||
812 | XXXXXXXXXXXXXXXXXXXX | ||
813 | XXXXXX#########XXXXX | ||
814 | XXXXXX# #XXXXX | ||
815 | XXXXXX# # ### #XXXXX | ||
816 | XXXXXX# $$ # #XXXXX | ||
817 | XXXXXX#@$ # #XXXXX | ||
818 | XXXXXX## ## # #XXXXX | ||
819 | XXXXXX# $ $ #XXXXX | ||
820 | XXXXXX# $## # #XXXXX | ||
821 | XXXXXX# #$# #XXXXX | ||
822 | XXXXXX#...# #XXXXX | ||
823 | XXXXXX#.#.#$###XXXXX | ||
824 | XXXXXX#... #XXXXXXX | ||
825 | XXXXXX#######XXXXXXX | ||
826 | XXXXXXXXXXXXXXXXXXXX | ||
827 | |||
828 | |||
829 | XXXXXXXXXXXXXXXXXXXX | ||
830 | XXXXXXXXXXXXXXXXXXXX | ||
831 | XXXXX########XXXXXXX | ||
832 | XXXXX# .#XXXXXXX | ||
833 | XXXXX# #$#..##XXXXXX | ||
834 | XXXXX# $...#XXXXXX | ||
835 | XXXXX## ##.$.#XXXXXX | ||
836 | XXXXXX# ## ##XXXXXX | ||
837 | XXXXXX#$## #XXXXXXX | ||
838 | XXXXX## #$#XXXXXXX | ||
839 | XXXXX# # #XXXXXXX | ||
840 | XXXXX# $ ####XXXXX | ||
841 | XXXXX# $ $ @#XXXXX | ||
842 | XXXXX# ### #XXXXX | ||
843 | XXXXX####X#####XXXXX | ||
844 | XXXXXXXXXXXXXXXXXXXX | ||
845 | |||
846 | |||
847 | XXXXXXXXXXXXXXXXXXXX | ||
848 | XXXXXXXXXXXXXXXXXXXX | ||
849 | XXXXXX####XXXXXXXXXX | ||
850 | XXXXXX# ####XXXXXXX | ||
851 | XXXXXX# $ #XXXXXXX | ||
852 | XXXXXX# #.# #XXXXXXX | ||
853 | XXXXXX# # # #XXXXXXX | ||
854 | XXXXXX#.$.$.#XXXXXXX | ||
855 | XXXXXX# # # #XXXXXXX | ||
856 | XXXXXX# #.# #XXXXXXX | ||
857 | XXXXXX# $$ #XXXXXXX | ||
858 | XXXXXX## @ #XXXXXXX | ||
859 | XXXXXXX# ###XXXXXXX | ||
860 | XXXXXXX####XXXXXXXXX | ||
861 | XXXXXXXXXXXXXXXXXXXX | ||
862 | XXXXXXXXXXXXXXXXXXXX | ||
863 | |||
864 | |||
865 | XXXXXXXXXXXXXXXXXXXX | ||
866 | XXXXXXXXXXXXXXXXXXXX | ||
867 | XXXX######X####XXXXX | ||
868 | XXXX# ### #XXXXX | ||
869 | XXXX# $$ ## #XXXXX | ||
870 | XXXX# # $ #XXXXX | ||
871 | XXXX## ## $# #XXXXX | ||
872 | XXXXX# #... ##XXXXX | ||
873 | XXXXX# ...#$##XXXXX | ||
874 | XXXXX# #...# #XXXXX | ||
875 | XXXX## # ###@ #XXXXX | ||
876 | XXXX# $ $ $ #XXXXX | ||
877 | XXXX# #$#### #XXXXX | ||
878 | XXXX# #XX####XXXXX | ||
879 | XXXX#####XXXXXXXXXXX | ||
880 | XXXXXXXXXXXXXXXXXXXX | ||
881 | |||
882 | |||
883 | XXXXXXXXXXXXXXXXXXXX | ||
884 | XXXXXXXXXXXXXXXXXXXX | ||
885 | XXXXX##########XXXXX | ||
886 | XXXXX#..$ $ %.#XXXXX | ||
887 | XXXXX#.% $ $..#XXXXX | ||
888 | XXXXX##.$ $ %##XXXXX | ||
889 | XXXXXX#% $ $.#XXXXXX | ||
890 | XXXXXX#.$ $ .#XXXXXX | ||
891 | XXXXXX#. $ $.#XXXXXX | ||
892 | XXXXXX#.$@$ %#XXXXXX | ||
893 | XXXXX##% $ $.##XXXXX | ||
894 | XXXXX#..$ $ %.#XXXXX | ||
895 | XXXXX#.% $ $..#XXXXX | ||
896 | XXXXX##########XXXXX | ||
897 | XXXXXXXXXXXXXXXXXXXX | ||
898 | XXXXXXXXXXXXXXXXXXXX | ||
899 | |||
900 | |||
901 | XXXXXXXXXXXXXXXXXXXX | ||
902 | XXXXXXXXXXXXXXXXXXXX | ||
903 | XXXX#####XXXXXXXXXXX | ||
904 | XXXX# #XXXXXXXXXXX | ||
905 | XXXX#$ #XXXXXXXXXXX | ||
906 | XX### $##XXXXXXXXXX | ||
907 | XX# $ $ #XXXXXXXXXX | ||
908 | ### # ## #XXX######X | ||
909 | # # ## ##### ..#X | ||
910 | # $ $ ..#X | ||
911 | ##### ### #@## ..#X | ||
912 | XXXX# #########X | ||
913 | XXXX#######XXXXXXXXX | ||
914 | XXXXXXXXXXXXXXXXXXXX | ||
915 | XXXXXXXXXXXXXXXXXXXX | ||
916 | XXXXXXXXXXXXXXXXXXXX | ||
917 | |||
918 | |||
919 | XXXXXXXXXXXXXXXXXXXX | ||
920 | XXXXXXXXXXXXXXXXXXXX | ||
921 | XXXXXXXXXXXXXXXXXXXX | ||
922 | XXX############XXXXX | ||
923 | XXX#.. # ###XXX | ||
924 | XXX#.. # $ $ #XXX | ||
925 | XXX#.. #$#### #XXX | ||
926 | XXX#.. @ ## #XXX | ||
927 | XXX#.. # $ ##XXX | ||
928 | XXX###### ##$ $ #XXX | ||
929 | XXXXX# $ $ $ $ #XXX | ||
930 | XXXXX# # #XXX | ||
931 | XXXXX############XXX | ||
932 | XXXXXXXXXXXXXXXXXXXX | ||
933 | XXXXXXXXXXXXXXXXXXXX | ||
934 | XXXXXXXXXXXXXXXXXXXX | ||
935 | |||
936 | |||
937 | XXXXXXXXXXXXXXXXXXXX | ||
938 | XXXXXXXXXXXXXXXXXXXX | ||
939 | XXXXXXXXXXXXXXXXXXXX | ||
940 | XXXXXXXXX########XXX | ||
941 | XXXXXXXXX# @#XXX | ||
942 | XXXXXXXXX# $#$ ##XXX | ||
943 | XXXXXXXXX# $ $#XXXX | ||
944 | XXXXXXXXX##$ $ #XXXX | ||
945 | X######### $ # ###XX | ||
946 | X#.... ## $ $ #XX | ||
947 | X##... $ $ #XX | ||
948 | X#.... ##########XX | ||
949 | X########XXXXXXXXXXX | ||
950 | XXXXXXXXXXXXXXXXXXXX | ||
951 | XXXXXXXXXXXXXXXXXXXX | ||
952 | XXXXXXXXXXXXXXXXXXXX | ||
953 | |||
954 | |||
955 | XXXXXXXXXXXXXXXXXXXX | ||
956 | XXXXXXXXXXXX######## | ||
957 | XXXXXXXXXXXX# ....# | ||
958 | X############ ....# | ||
959 | X# # $ $ ....# | ||
960 | X# $$$#$ $ # ....# | ||
961 | X# $ $ # ....# | ||
962 | X# $$ #$ $ $######## | ||
963 | X# $ # #XXXXXXX | ||
964 | X## #########XXXXXXX | ||
965 | X# # ##XXXXXXX | ||
966 | X# $ ##XXXXXXX | ||
967 | X# $$#$$ @#XXXXXXX | ||
968 | X# # ##XXXXXXX | ||
969 | X###########XXXXXXXX | ||
970 | XXXXXXXXXXXXXXXXXXXX | ||
971 | |||
972 | |||
973 | XXXXXXXXXXXXXXXXXXXX | ||
974 | XXXXXXXXXXXXXXXXXXXX | ||
975 | XXXXXXXXX#####XXXXXX | ||
976 | XXXXXXXXX# #####XX | ||
977 | XXXXXXXXX# #$## #XX | ||
978 | XXXXXXXXX# $ #XX | ||
979 | X######### ### #XX | ||
980 | X#.... ## $ $###XX | ||
981 | X#.... $ $$ ##XXX | ||
982 | X#.... ##$ $ @#XXX | ||
983 | X######### $ ##XXX | ||
984 | XXXXXXXXX# $ $ #XXX | ||
985 | XXXXXXXXX### ## #XXX | ||
986 | XXXXXXXXXXX# #XXX | ||
987 | XXXXXXXXXXX######XXX | ||
988 | XXXXXXXXXXXXXXXXXXXX | ||
989 | |||
990 | |||
991 | XXXXXXXXXXXXXXXXXXXX | ||
992 | XXXXXXXXXXXXXXXXXXXX | ||
993 | XXXXXXXXXXXXXXXXXXXX | ||
994 | XXXX######XX###XXXXX | ||
995 | XXXX#.. #X##@##XXXX | ||
996 | XXXX#.. ### #XXXX | ||
997 | XXXX#.. $$ #XXXX | ||
998 | XXXX#.. # # $ #XXXX | ||
999 | XXXX#..### # $ #XXXX | ||
1000 | XXXX#### $ #$ #XXXX | ||
1001 | XXXXXXX# $# $ #XXXX | ||
1002 | XXXXXXX# $ $ #XXXX | ||
1003 | XXXXXXX# ## #XXXX | ||
1004 | XXXXXXX#########XXXX | ||
1005 | XXXXXXXXXXXXXXXXXXXX | ||
1006 | XXXXXXXXXXXXXXXXXXXX | ||
1007 | |||
1008 | |||
1009 | XXXXXXXXXXXXXXXXXXXX | ||
1010 | XXXXXXXXXXXXXXXXXXXX | ||
1011 | XXXXXXXXXXX#####XXXX | ||
1012 | XXXXX####### ##XXX | ||
1013 | XXXX## # @## $$ #XXX | ||
1014 | XXXX# $ #XXX | ||
1015 | XXXX# $ ### #XXX | ||
1016 | XXXX### #####$###XXX | ||
1017 | XXXX# $ ### ..#XXXX | ||
1018 | XXXX# $ $ $ ...#XXXX | ||
1019 | XXXX# ###...#XXXX | ||
1020 | XXXX# $$ #X#...#XXXX | ||
1021 | XXXX# ###X#####XXXX | ||
1022 | XXXX####XXXXXXXXXXXX | ||
1023 | XXXXXXXXXXXXXXXXXXXX | ||
1024 | XXXXXXXXXXXXXXXXXXXX | ||
1025 | |||
1026 | |||
1027 | XXXX####XXXXXXXXXXXX | ||
1028 | XXXX# ###########XX | ||
1029 | XXXX# $ $ $ #XX | ||
1030 | XXXX# $# $ # $ #XX | ||
1031 | XXXX# $ $ # #XX | ||
1032 | XX### $# # #### #XX | ||
1033 | XX#@#$ $ $ ## #XX | ||
1034 | XX# $ #$# # #XX | ||
1035 | XX# $ $ $ $ #XX | ||
1036 | XX##### #########XX | ||
1037 | XXXX# #XXXXXXXX | ||
1038 | XXXX#......#XXXXXXXX | ||
1039 | XXXX#......#XXXXXXXX | ||
1040 | XXXX#......#XXXXXXXX | ||
1041 | XXXX########XXXXXXXX | ||
1042 | XXXXXXXXXXXXXXXXXXXX | ||
1043 | |||
1044 | |||
1045 | XXXXXXXXXXXXXXXXXXXX | ||
1046 | XXXXXXXXXXX#######XX | ||
1047 | XXXXXXXXXXX# ...#XX | ||
1048 | XXXXXXX##### ...#XX | ||
1049 | XXXXXXX# . .#XX | ||
1050 | XXXXXXX# ## ...#XX | ||
1051 | XXXXXXX## ## ...#XX | ||
1052 | XXXXXX### ########XX | ||
1053 | XXXXXX# $$$ ##XXXXXX | ||
1054 | XX##### $ $ #####XX | ||
1055 | X## #$ $ # #XX | ||
1056 | X#@ $ $ $ $ #XX | ||
1057 | X###### $$ $ #####XX | ||
1058 | XXXXXX# #XXXXXX | ||
1059 | XXXXXX########XXXXXX | ||
1060 | XXXXXXXXXXXXXXXXXXXX | ||
1061 | |||
1062 | |||
1063 | X###XX#############X | ||
1064 | ##@#### # #X | ||
1065 | # $$ $$ $ $ ...#X | ||
1066 | # $$$# $ #...#X | ||
1067 | # $ # $$ $$ #...#X | ||
1068 | ### # $ #...#X | ||
1069 | # # $ $ $ #...#X | ||
1070 | # ###### ###...#X | ||
1071 | ## # # $ $ #...#X | ||
1072 | # ## # $$ $ $##..#X | ||
1073 | # ..# # $ #.#X | ||
1074 | # ..# # $$$ $$$ #.#X | ||
1075 | ##### # # #.#X | ||
1076 | XXXX# ######### #.#X | ||
1077 | XXXX# #.#X | ||
1078 | XXXX###############X | ||
1079 | |||
1080 | |||
1081 | XXXXXXXXXXXXXXXXXXXX | ||
1082 | XXXXXXXXXXX####XXXXX | ||
1083 | XXXXXX####X# #XXXXX | ||
1084 | XXXX### ###$ #XXXXX | ||
1085 | XXX## @ $ #XXXXX | ||
1086 | XX## $ $$## ##XXXXX | ||
1087 | XX# #$## #XXXXX | ||
1088 | XX# # $ $$ # ###XXXX | ||
1089 | XX# $ # # $ ##### | ||
1090 | X#### # $$ # # | ||
1091 | X#### ## $ # | ||
1092 | X#. ### ######## | ||
1093 | X#.. ..#X####XXXXXXX | ||
1094 | X#...#.#XXXXXXXXXXXX | ||
1095 | X#.....#XXXXXXXXXXXX | ||
1096 | X#######XXXXXXXXXXXX | ||
1097 | |||
1098 | |||
1099 | XXXXXXXXXXXXXXXXXXXX | ||
1100 | XXXXXXXXXXXXXXXXXXXX | ||
1101 | XX################XX | ||
1102 | XX# #XX | ||
1103 | XX# # ###### #XX | ||
1104 | XX# # $ $ $ $# #XX | ||
1105 | XX# # $@$ ## ##X | ||
1106 | XX# # #$ $ $###...#X | ||
1107 | XX# # $ $ ##...#X | ||
1108 | XX# ###$$$ $ ##...#X | ||
1109 | XX# # ## ##...#X | ||
1110 | XX##### ## ##...#X | ||
1111 | XXXXXX##### ###X | ||
1112 | XXXXXXXXXX# #XXX | ||
1113 | XXXXXXXXXX#######XXX | ||
1114 | XXXXXXXXXXXXXXXXXXXX | ||
1115 | |||
1116 | |||
1117 | XXXXXXXXXXXXXXXXXXXX | ||
1118 | XXXXXXXXXXXXXXXXXXXX | ||
1119 | XXX#########XXXXXXXX | ||
1120 | XX## ## ######XXX | ||
1121 | ### # # ###X | ||
1122 | # $ #$ # # ... #X | ||
1123 | # # $#@$## # #.#. #X | ||
1124 | # # #$ # . . #X | ||
1125 | # $ $ # # #.#. #X | ||
1126 | # ## ##$ $ . . #X | ||
1127 | # $ # # #$#.#. #X | ||
1128 | ## $ $ $ $... #X | ||
1129 | X#$ ###### ## #X | ||
1130 | X# #XXXX##########X | ||
1131 | X####XXXXXXXXXXXXXXX | ||
1132 | XXXXXXXXXXXXXXXXXXXX | ||
1133 | |||
1134 | |||
1135 | XXXXXXXX#######XXXXX | ||
1136 | XX####### #XXXXX | ||
1137 | XX# # $@$ #XXXXX | ||
1138 | XX#$$ # #########X | ||
1139 | XX# ###......## #X | ||
1140 | XX# $......## # #X | ||
1141 | XX# ###...... #X | ||
1142 | X## #### ### #$##X | ||
1143 | X# #$ # $ # #XX | ||
1144 | X# $ $$$ # $## #XX | ||
1145 | X# $ $ ###$$ # #XX | ||
1146 | X##### $ # #XX | ||
1147 | XXXXX### ### # #XX | ||
1148 | XXXXXXX# # #XX | ||
1149 | XXXXXXX######## #XX | ||
1150 | XXXXXXXXXXXXXX####XX | ||
1151 | |||
1152 | |||
1153 | XXXXX########XXXXXXX | ||
1154 | XXXXX# # #XXXXXXX | ||
1155 | XXXXX# $ #XXXXXXX | ||
1156 | XXX### #$ ####XXXX | ||
1157 | XXX# $ ##$ #XXXX | ||
1158 | XXX# # @ $ # $#XXXX | ||
1159 | XXX# # $ ####X | ||
1160 | XXX## ####$## #X | ||
1161 | XXX# $#.....# # #X | ||
1162 | XXX# $..%%. $# ###X | ||
1163 | XX## #.....# #XXX | ||
1164 | XX# ### #######XXX | ||
1165 | XX# $$ # #XXXXXXXX | ||
1166 | XX# # #XXXXXXXX | ||
1167 | XX###### #XXXXXXXX | ||
1168 | XXXXXXX#####XXXXXXXX | ||
1169 | |||
1170 | |||
1171 | XXX#####XXXXXXXXXXXX | ||
1172 | XXX# ##XXXXXXXXXXX | ||
1173 | XXX# #XX####XXXXX | ||
1174 | XXX# $ #### #XXXXX | ||
1175 | XXX# $$ $ $#XXXXX | ||
1176 | XXX###@ #$ ##XXXX | ||
1177 | XXXX# ## $ $ ##XXX | ||
1178 | XXXX# $ ## ## .#XXX | ||
1179 | XXXX# #$##$ #.#XXX | ||
1180 | XXXX### $..##.#XXX | ||
1181 | XXXXX# #.%...#XXX | ||
1182 | XXXXX# $$ #.....#XXX | ||
1183 | XXXXX# #########XXX | ||
1184 | XXXXX# #XXXXXXXXXXX | ||
1185 | XXXXX####XXXXXXXXXXX | ||
1186 | XXXXXXXXXXXXXXXXXXXX | ||
1187 | |||
1188 | |||
1189 | XXXXXXXXXXXXXXXXXXXX | ||
1190 | XXXXX##########XXXXX | ||
1191 | XXXXX#.. # #XXXXX | ||
1192 | XXXXX#.. #XXXXX | ||
1193 | XXXXX#.. # ####XXX | ||
1194 | XXXX####### # ##XX | ||
1195 | XXXX# #XX | ||
1196 | XXXX# # ## # #XX | ||
1197 | XX#### ## #### ##XX | ||
1198 | XX# $ ##### # #XX | ||
1199 | XX# # $ $ # $ #XX | ||
1200 | XX# @$ $ # ##XX | ||
1201 | XX#### ## #######XXX | ||
1202 | XXXXX# #XXXXXXXXX | ||
1203 | XXXXX######XXXXXXXXX | ||
1204 | XXXXXXXXXXXXXXXXXXXX | ||
1205 | |||
1206 | |||
1207 | XXXXXXXXXXXXXXXXXXXX | ||
1208 | XXXXX###########XXXX | ||
1209 | XXXXX# . # #XXXX | ||
1210 | XXXXX# #. @ #XXXX | ||
1211 | X##### ##..# ####XXX | ||
1212 | ## # ..### ###X | ||
1213 | # $ #... $ # $ #X | ||
1214 | # .. ## ## ## #X | ||
1215 | ####$##$# $ # # #X | ||
1216 | XX## # #$ $$ # #X | ||
1217 | XX# $ # # # $## #X | ||
1218 | XX# #X | ||
1219 | XX# ########### #X | ||
1220 | XX####XXXXXXXXX####X | ||
1221 | XXXXXXXXXXXXXXXXXXXX | ||
1222 | XXXXXXXXXXXXXXXXXXXX | ||
1223 | |||
1224 | |||
1225 | XXX######XXXXXXXXXXX | ||
1226 | XXX# @####XXXXXXXX | ||
1227 | X##### $ #XXXXXXXX | ||
1228 | X# ## ####XXXXX | ||
1229 | X# $ # ## #XXXXX | ||
1230 | X# $ # ##### #XXXXX | ||
1231 | X## $ $ # #XXXXX | ||
1232 | X## $ $ ### # #XXXXX | ||
1233 | X## # $ # # #XXXXX | ||
1234 | X## # #$# # #XXXXX | ||
1235 | X## ### # # ###### | ||
1236 | X# $ #### # #....# | ||
1237 | X# $ $ ..#.# | ||
1238 | X####$ $# $ ....# | ||
1239 | X# # ## ....# | ||
1240 | X################### | ||
1241 | |||
1242 | |||
1243 | XXXXX##########XXXXX | ||
1244 | X##### ####XX | ||
1245 | X# # $ #@ #XX | ||
1246 | X# #######$#### ### | ||
1247 | X# # ## # #$ ..# | ||
1248 | X# # $ $ # # #.# | ||
1249 | X# # $ # #$ ..# | ||
1250 | X# # ### ## #.# | ||
1251 | X# ### # # #$ ..# | ||
1252 | X# # # $#### #.# | ||
1253 | X# #$ $ $ #% ..# | ||
1254 | X# $ # $ $ # #.# | ||
1255 | X#### $### #% ..# | ||
1256 | XXXX# $$ ###....# | ||
1257 | XXXX# ##X###### | ||
1258 | XXXX########XXXXXXXX | ||
1259 | |||
1260 | |||
1261 | XXXXXXXXXXXXXXXXXXXX | ||
1262 | XXX#########XXXXXXXX | ||
1263 | XXX# #XXXXXXXX | ||
1264 | XXX# ####XXXXX | ||
1265 | XXX## #### # #XXXXX | ||
1266 | XXX## #@## #XXXXX | ||
1267 | XXX# $$$ $ $$#XXXXX | ||
1268 | XXX# # ## $ #XXXXX | ||
1269 | XXX# # ## $ ####XX | ||
1270 | XXX#### $$$ $# #XX | ||
1271 | XXXX# ## ....#XX | ||
1272 | XXXX# # # #.. .#XX | ||
1273 | XXXX# # # ##...#XX | ||
1274 | XXXX##### $ #...#XX | ||
1275 | XXXXXXXX## #####XX | ||
1276 | XXXXXXXXX#####XXXXXX | ||
1277 | |||
1278 | |||
1279 | X######XXXXX####XXXX | ||
1280 | X# ####### ##### | ||
1281 | X# $# # $ # # | ||
1282 | X# $ $ $ # $ $ # | ||
1283 | X##$ $ # @# $ # | ||
1284 | X# $ ########### ## | ||
1285 | X# # #.......# $#X | ||
1286 | X# ## # ......# #X | ||
1287 | X# # $........$ #X | ||
1288 | X# # $ #.... ..# #X | ||
1289 | X# $ $####$#### $#X | ||
1290 | X# $ ### $ $ ## | ||
1291 | X# $ $ $ $ # | ||
1292 | X## ###### $ ##### # | ||
1293 | X# # # | ||
1294 | X################### | ||
1295 | |||
1296 | |||
1297 | XXXXXXXXXXXXXXXXXXXX | ||
1298 | XXXXX#######XXXXXXXX | ||
1299 | XXXXX# # ####XXXXX | ||
1300 | X##### $#$ # ##XXXX | ||
1301 | X#.. # # # ####X | ||
1302 | X#.. # $#$ # $# #X | ||
1303 | X#. # #$ # #X | ||
1304 | X#.. $# # $ #X | ||
1305 | X#..@# #$ #$ # #X | ||
1306 | X#.. # $# $# #X | ||
1307 | X#.. # #$$#$ # ## | ||
1308 | X#.. # $# # $#$ # | ||
1309 | X#.. # # # # # | ||
1310 | X##. #### ##### # | ||
1311 | XX####XX####XXX##### | ||
1312 | XXXXXXXXXXXXXXXXXXXX | ||
1313 | |||
1314 | |||
1315 | X###############XXXX | ||
1316 | X#.......... .####X | ||
1317 | X#..........$$.# #X | ||
1318 | X###########$ # ## | ||
1319 | X# $ $ $ # | ||
1320 | X## #### # $ # # | ||
1321 | X# # ## # ## | ||
1322 | X# $# # ## ### ## | ||
1323 | X# $ #$### ### ## | ||
1324 | X### $ # # ### ## | ||
1325 | XX## $ ## # # ## | ||
1326 | XX# $ # $ $ $ # | ||
1327 | XX# $ $#$$$ # # | ||
1328 | XX# # $ ##### | ||
1329 | XX# @## # #XXXX | ||
1330 | XX##############XXXX | ||
1331 | |||
1332 | |||
1333 | X####XXXXXXXXXXXXXXX | ||
1334 | X# ##############XX | ||
1335 | X# # ..#......#XX | ||
1336 | X# # # ##### ...#XX | ||
1337 | X##$# ........#XX | ||
1338 | X# ##$###### #### | ||
1339 | X# $ # ######@ # | ||
1340 | X##$ # $ ###### # | ||
1341 | X# $ #$$$## # | ||
1342 | X# # #$#$### | ||
1343 | X# #### #$$$$$ #X | ||
1344 | X# # $ # #X | ||
1345 | X# # ## ## ### | ||
1346 | X# ######$###### $ # | ||
1347 | X# #XXXX# # | ||
1348 | X##########XXXX##### | ||
1349 | |||
1350 | |||
1351 | XXXXXXXXXXXXXXXXXXXX | ||
1352 | XXXXXXXXXXXXXXXXXXXX | ||
1353 | XXX#######XXXXXXXXXX | ||
1354 | XXX# # #####XXXXXX | ||
1355 | XX## # #...###XXXX | ||
1356 | XX# $# #... #XXXX | ||
1357 | XX# $ #$$ ... #XXXX | ||
1358 | XX# $# #... .#XXXX | ||
1359 | XX# # $########XXX | ||
1360 | XX##$ $ $ #XXX | ||
1361 | XX## # $$ # #XXX | ||
1362 | XXX###### ##$$@#XXX | ||
1363 | XXXXXXXX# ##XXX | ||
1364 | XXXXXXXX########XXXX | ||
1365 | XXXXXXXXXXXXXXXXXXXX | ||
1366 | XXXXXXXXXXXXXXXXXXXX | ||
1367 | |||
1368 | |||
1369 | XXXXXXXXXXXXXXXXXXXX | ||
1370 | XXXXXXXXXXXXXXXXXXXX | ||
1371 | X#################XX | ||
1372 | X#... # # ##X | ||
1373 | ##..... $## # #$ #X | ||
1374 | #......# $ # #X | ||
1375 | #......# # # # #X | ||
1376 | ######### $ $ $ #X | ||
1377 | XX# #$##$ ##$##X | ||
1378 | X## $ # $ #X | ||
1379 | X# ## ### # ##$ #X | ||
1380 | X# $ $$ $ $ #X | ||
1381 | X# $ $##$ ######X | ||
1382 | X####### @ ##XXXXXX | ||
1383 | XXXXXXX######XXXXXXX | ||
1384 | XXXXXXXXXXXXXXXXXXXX | ||
1385 | |||
1386 | |||
1387 | XXXXXXXXXXX#####XXXX | ||
1388 | XXXXXXX##### #XXXX | ||
1389 | XXXXXX## $ $ ####X | ||
1390 | XX##### $ $ $ ##.#X | ||
1391 | XX# $$ ##..#X | ||
1392 | XX# ###### ###.. #X | ||
1393 | XX## # # #... #X | ||
1394 | XX# $ # #... #X | ||
1395 | XX#@ #$ ## ####...#X | ||
1396 | XX#### $ $$ ##..#X | ||
1397 | XXXXX## $ $ $...#X | ||
1398 | XXXXXX# $$ $ # .#X | ||
1399 | XXXXXX# $ $ ####X | ||
1400 | XXXXXX###### #XXXX | ||
1401 | XXXXXXXXXXX#####XXXX | ||
1402 | XXXXXXXXXXXXXXXXXXXX | ||
1403 | |||
1404 | |||
1405 | XXXXXXXXXXXXXXXXXXXX | ||
1406 | X#####XXXXXXXXXXXXXX | ||
1407 | X# ##XXXXXXXXXXXXX | ||
1408 | X# $ #########XXXXX | ||
1409 | X## # # ###### | ||
1410 | X## # $#$#@ # # | ||
1411 | X# # $ # $ # | ||
1412 | X# ### ######### ## | ||
1413 | X# ## ..%..... # ## | ||
1414 | X## ## %.%..%.% # ## | ||
1415 | X# $########## ##$ # | ||
1416 | X# $ $ $ $ # | ||
1417 | X# # # # # # | ||
1418 | X################### | ||
1419 | XXXXXXXXXXXXXXXXXXXX | ||
1420 | XXXXXXXXXXXXXXXXXXXX | ||
1421 | |||
1422 | |||
1423 | XXXXXXXXXXXXXXXXXXXX | ||
1424 | XXXXXXXX###########X | ||
1425 | XXXXXXXX# # #X | ||
1426 | X#####XX# $ $ #X | ||
1427 | X# ##### $## # ##X | ||
1428 | X# $ ## # ## $ #X | ||
1429 | X# $ @$$ # ##$$$ #X | ||
1430 | X## ### # ## #X | ||
1431 | X## # ### #####$#X | ||
1432 | X## # $ #....#X | ||
1433 | X# ### ## $ #....## | ||
1434 | X# $ $ # #..$. # | ||
1435 | X# ## $ # ##.... # | ||
1436 | X##### ######...## | ||
1437 | XXXXX#####XXXX#####X | ||
1438 | XXXXXXXXXXXXXXXXXXXX | ||
1439 | |||
1440 | |||
1441 | XXX####XXXXXXXXXXXXX | ||
1442 | XXX# #########XXXXX | ||
1443 | XX## ## # #XXXXX | ||
1444 | XX# $# $@$ ####XX | ||
1445 | XX#$ $ # $ $# ##X | ||
1446 | X## $## #$ $ #X | ||
1447 | X# # # # $$$ #X | ||
1448 | X# $ $ $## ####X | ||
1449 | X# $ $ #$# # #XXXX | ||
1450 | X## ### ###$ #XXXX | ||
1451 | XX# #.... #XXXX | ||
1452 | XX####......####XXXX | ||
1453 | XXXX#....####XXXXXXX | ||
1454 | XXXX#...##XXXXXXXXXX | ||
1455 | XXXX#...#XXXXXXXXXXX | ||
1456 | XXXX#####XXXXXXXXXXX | ||
1457 | |||
1458 | |||
1459 | XXXXXXXXXXXXXXXXXXXX | ||
1460 | XXXXXXXXXX####XXXXXX | ||
1461 | XXXXXX##### #XXXXXX | ||
1462 | XXXXX## $#XXXXXX | ||
1463 | XXXX## $ ## ###XXXX | ||
1464 | XXXX#@$ $ # $ #XXXX | ||
1465 | XXXX#### ## $#XXXX | ||
1466 | XXXXX#....#$ $ #XXXX | ||
1467 | XXXXX#....# $#XXXX | ||
1468 | XXXXX#.... $$ ##XXX | ||
1469 | XXXXX#... # $ #XXX | ||
1470 | XXXXX######$ $ #XXX | ||
1471 | XXXXXXXXXX# ###XXX | ||
1472 | XXXXXXXXXX#$ ###XXXX | ||
1473 | XXXXXXXXXX# #XXXXXX | ||
1474 | XXXXXXXXXX####XXXXXX | ||
1475 | |||
1476 | |||
1477 | XXXXXXXXXXXXXXXXXXXX | ||
1478 | XXXX############XXXX | ||
1479 | XXXX## ## #XXXX | ||
1480 | XXXX## $ $ #XXXX | ||
1481 | XXXX#### ## $$ #XXXX | ||
1482 | XXXX# $ # #XXXX | ||
1483 | XXXX# $$$ # ####XXXX | ||
1484 | XXXX# # # $ ##XXXX | ||
1485 | XXXX# # # $ #XXXX | ||
1486 | XXXX# $# $# #XXXX | ||
1487 | XXXX# ..# ####XXXX | ||
1488 | XXXX####.. $ #@#XXXX | ||
1489 | XXXX#.....# $# #XXXX | ||
1490 | XXXX##....# $ #XXXX | ||
1491 | XXXX###..## #XXXX | ||
1492 | XXXX############XXXX | ||
1493 | |||
1494 | |||
1495 | XXXXXXXXXXXXXXXXXXXX | ||
1496 | XXXX#########XXXXXXX | ||
1497 | XXXX#.... ##XXXXXX | ||
1498 | XXXX#.#.# $ ##XXXXX | ||
1499 | XXX##....# # @##XXXX | ||
1500 | XXX# ....# # ##XXX | ||
1501 | XXX# #$ ##$ #XXX | ||
1502 | XXX## ### $ #XXX | ||
1503 | XXXX#$ $ $ $# #XXX | ||
1504 | XXXX# # $ $ ## #XXX | ||
1505 | XXXX# ### ## #XXX | ||
1506 | XXXX# ## ## ##XXX | ||
1507 | XXXX# $ # $ #XXXX | ||
1508 | XXXX###$ $ ###XXXX | ||
1509 | XXXXXX# #####XXXXXX | ||
1510 | XXXXXX####XXXXXXXXXX | ||
1511 | |||
1512 | |||
1513 | ############X######X | ||
1514 | # # # ###....#X | ||
1515 | # $$# @ .....#X | ||
1516 | # # ### # ....#X | ||
1517 | ## ## ### # ....#X | ||
1518 | X# $ $ # # ####X | ||
1519 | X# $ $## # #X | ||
1520 | #### # #### # ## #X | ||
1521 | # # #$ ## # #X | ||
1522 | # $ $ # ## # ##X | ||
1523 | # # $ $ # # #XX | ||
1524 | # $ ## ## # #####XX | ||
1525 | # $$ $$ #XXXXXX | ||
1526 | ## ## ### $ #XXXXXX | ||
1527 | X# #X# #XXXXXX | ||
1528 | X######X######XXXXXX | ||
1529 | |||
1530 | |||
1531 | XXXXXXXXXXXXX#####XX | ||
1532 | X#####XX###### #XX | ||
1533 | X# #### $ $ $ #XX | ||
1534 | X# $ ## ## ## ##X | ||
1535 | X# $ $ $ $ #X | ||
1536 | X### $ ## ## ## | ||
1537 | XXX# ##### #####$$ # | ||
1538 | XX##$##### @## # | ||
1539 | XX# $ ###$### $ ## | ||
1540 | XX# $ # ### ###X | ||
1541 | XX# $$ $ # $$ #XXX | ||
1542 | XX# # ## #XXX | ||
1543 | XX#######.. .####XXX | ||
1544 | XXXXX#.........#XXXX | ||
1545 | XXXXX#.........#XXXX | ||
1546 | XXXXX###########XXXX | ||
1547 | |||
1548 | |||
1549 | XXXXXXXXXXXXXXXXXXXX | ||
1550 | ###########XXXXXXXXX | ||
1551 | #...... #########X | ||
1552 | #...... # ## #X | ||
1553 | #..### $ $ #X | ||
1554 | #... $ $ # ### #X | ||
1555 | #...#$##### # #X | ||
1556 | ### # #$ #$ #X | ||
1557 | XX# $$ $ $ $## #X | ||
1558 | XX# $ #$#$ ##$ #X | ||
1559 | XX### ## # ## #X | ||
1560 | XXX# $ $ ## ######X | ||
1561 | XXX# $ $ #XXXXX | ||
1562 | XXX## # # #XXXXX | ||
1563 | XXXX#####@#####XXXXX | ||
1564 | XXXXXXXX###XXXXXXXXX | ||
1565 | |||
1566 | |||
1567 | XXXXXXXXXXXXXXXXXXXX | ||
1568 | XXXXXXXXXXXXXXXXXXXX | ||
1569 | XXXXXXXXXXXXXXXXXXXX | ||
1570 | XXXXXXXXXX####XXXXXX | ||
1571 | XXXX####### @#XXXXXX | ||
1572 | XXXX# $ #XXXXXX | ||
1573 | XXXX# $## $#XXXXXX | ||
1574 | XXXX##$#...# #XXXXXX | ||
1575 | XXXXX# $... #XXXXXX | ||
1576 | XXXXX# #. .# ##XXXXX | ||
1577 | XXXXX# # #$ #XXXXX | ||
1578 | XXXXX#$ $ #XXXXX | ||
1579 | XXXXX# #######XXXXX | ||
1580 | XXXXX####XXXXXXXXXXX | ||
1581 | XXXXXXXXXXXXXXXXXXXX | ||
1582 | XXXXXXXXXXXXXXXXXXXX | ||
1583 | |||
1584 | |||
1585 | XXXXXXXXXXXXXX###### | ||
1586 | XX#############....# | ||
1587 | X## ## ##....# | ||
1588 | X# $$## $ @##....# | ||
1589 | X# $$ $# ....# | ||
1590 | X# $ ## $$ # # ...# | ||
1591 | X# $ ## $ # ....# | ||
1592 | X## ##### ### ##.### | ||
1593 | X## $ $ ## . # | ||
1594 | X# $### # ##### ### | ||
1595 | X# $ # #XX | ||
1596 | X# $ #$ $ $### #XX | ||
1597 | X# $$$# $ #X####XX | ||
1598 | X# # $$ #XXXXXXX | ||
1599 | X###### ###XXXXXXX | ||
1600 | XXXXXX#####XXXXXXXXX | ||
1601 | |||
1602 | |||
1603 | XXXXXX############XX | ||
1604 | XXXXXX# ##X | ||
1605 | XXXXXX# # #$$ $ #X | ||
1606 | XXXXXX#$ #$# ## @#X | ||
1607 | XXXXX## ## # $ # ##X | ||
1608 | XXXXX# $ #$ # #XX | ||
1609 | XXXXX# # $ # #XX | ||
1610 | XXXXX## $ $ ## #XX | ||
1611 | XXXXX# # ## $ #XX | ||
1612 | XXXXX# ## $$# #XX | ||
1613 | XX######$$ # #XX | ||
1614 | XX#....# ########XX | ||
1615 | XX#.#... ##XXXXXXXXX | ||
1616 | XX#.... #XXXXXXXXX | ||
1617 | XX#.... #XXXXXXXXX | ||
1618 | XX#########XXXXXXXXX | ||
1619 | |||
1620 | |||
1621 | XXXXXXXXXXX#####XXXX | ||
1622 | XXXXXXXXXX## ##XXX | ||
1623 | XXXXXXXXX## #XXX | ||
1624 | XXXXXXXX## $$ #XXX | ||
1625 | XXXXXXX## $$ $ #XXX | ||
1626 | XXXXXXX# $ $ #XXX | ||
1627 | ####XXX# $$ #####X | ||
1628 | # ######## ## #X | ||
1629 | #. $$$@#X | ||
1630 | #.# ####### ## ##X | ||
1631 | #.# #######. #$ $##X | ||
1632 | #........... # #X | ||
1633 | ############## $ #X | ||
1634 | XXXXXXXXXXXXX## ##X | ||
1635 | XXXXXXXXXXXXXX####XX | ||
1636 | XXXXXXXXXXXXXXXXXXXX | ||
1637 | |||
1638 | |||
1639 | XXXXXXXXXXXXXXXXXXXX | ||
1640 | XXXXXXXXXXXXXXXXXXXX | ||
1641 | XXXXXX########XXXXXX | ||
1642 | XXX#### ######X | ||
1643 | XXX# ## $ $ @#X | ||
1644 | XXX# ## ##$#$ $ $##X | ||
1645 | X### ......# $$ ##X | ||
1646 | X# ......# # #X | ||
1647 | X# # ......#$ $ #X | ||
1648 | X# # ...... $$# $ #X | ||
1649 | X# $### ###$ $ ##X | ||
1650 | X### $ $ $ $ #XX | ||
1651 | XXX# $ $ $ $ #XX | ||
1652 | XXX###### ######XX | ||
1653 | XXXXXXXX#####XXXXXXX | ||
1654 | XXXXXXXXXXXXXXXXXXXX | ||
1655 | |||
1656 | |||
1657 | XXXXXXXXXXXXXXXXXXXX | ||
1658 | XXXXXXXXXXXXXXXXXXXX | ||
1659 | XXXXXXXX#######XXXXX | ||
1660 | XXXX##### # ####XX | ||
1661 | XXXX# # $ #XX | ||
1662 | X#### #$$ ## ## #XX | ||
1663 | ## # # ## ###X | ||
1664 | # ### $#$ $ $ #X | ||
1665 | #... # ## # #X | ||
1666 | #...# @ # ### ##X | ||
1667 | #...# ### $ $ #X | ||
1668 | ########X## # #X | ||
1669 | XXXXXXXXXX#########X | ||
1670 | XXXXXXXXXXXXXXXXXXXX | ||
1671 | XXXXXXXXXXXXXXXXXXXX | ||
1672 | XXXXXXXXXXXXXXXXXXXX | ||
1673 | |||
1674 | |||
1675 | X#####XXXXXXXXXXXXXX | ||
1676 | X# #XXXXXXXXXXXXXX | ||
1677 | X# # #######XXXXXXXX | ||
1678 | X# $@######XXXX | ||
1679 | X# $ ##$ ### #XXXX | ||
1680 | X# #### $ $ #XXXX | ||
1681 | X# ##### # #$ ####X | ||
1682 | ## #### ##$ #X | ||
1683 | # $# $ # ## ## #X | ||
1684 | # # #...# #X | ||
1685 | ###### ### ... #X | ||
1686 | XXXXX####X# #...# #X | ||
1687 | XXXXXXXXXX# ### # #X | ||
1688 | XXXXXXXXXX# #X | ||
1689 | XXXXXXXXXX#########X | ||
1690 | XXXXXXXXXXXXXXXXXXXX | ||
1691 | |||
1692 | |||
1693 | XXXXXXXXXXXXXXXXXXXX | ||
1694 | XXX#####X####XXXXXXX | ||
1695 | XXX#...#X# ####XXXX | ||
1696 | XXX#...### $ #XXXX | ||
1697 | XXX#....## $ $###XX | ||
1698 | XXX##....## $ #XX | ||
1699 | XXX###... ## $ $ #XX | ||
1700 | XXX# ## # $ #XX | ||
1701 | XXX# ## # ### ####X | ||
1702 | XXX# $ # #$ $ #X | ||
1703 | XXX# $ @ $ $ #X | ||
1704 | XXX# # $ $$ $ ###X | ||
1705 | XXX# ###### ###XXX | ||
1706 | XXX# ##XXXX####XXXXX | ||
1707 | XXX###XXXXXXXXXXXXXX | ||
1708 | XXXXXXXXXXXXXXXXXXXX | ||
1709 | |||
1710 | |||
1711 | XXX##########XXXXXXX | ||
1712 | XXX# ####XXXX | ||
1713 | XXX# ###### # ##XXX | ||
1714 | XXX# # $ $ $ $ #XXX | ||
1715 | XXX# #$ #XXX | ||
1716 | XXX###$ $$# ###XXX | ||
1717 | XXXXX# ## # $##XXXX | ||
1718 | XXXXX##$# $ @#XXXX | ||
1719 | XXXXXX# $ $ ###XXXX | ||
1720 | XXXXXX# # $ #XXXX | ||
1721 | XXXXXX# ## # #XXXX | ||
1722 | XXXXX## ##### #XXXX | ||
1723 | XXXXX# #XXXX | ||
1724 | XXXXX#.......###XXXX | ||
1725 | XXXXX#.......#XXXXXX | ||
1726 | XXXXX#########XXXXXX | ||
1727 | |||
1728 | |||
1729 | XXXXXXXXXXXXXXXXXXXX | ||
1730 | XXXXXXXXXXXXXXXXXXXX | ||
1731 | XXXXXXXXXXXXXXXXXXXX | ||
1732 | XXXXXXXXXX####XXXXXX | ||
1733 | XX######### ##XXXXX | ||
1734 | X## $ $ #####X | ||
1735 | X# ## ## ##...#X | ||
1736 | X# #$$ $ $$#$##...#X | ||
1737 | X# # @ # ...#X | ||
1738 | X# $# ###$$ ...#X | ||
1739 | X# $ $$ $ ##....#X | ||
1740 | X###$ #######X | ||
1741 | XXX# #######XXXXXXX | ||
1742 | XXX####XXXXXXXXXXXXX | ||
1743 | XXXXXXXXXXXXXXXXXXXX | ||
1744 | XXXXXXXXXXXXXXXXXXXX | ||
1745 | |||
1746 | |||
1747 | XXXXX#########XXXXXX | ||
1748 | XXXXX#%.%#%.%#XXXXXX | ||
1749 | XXXXX#.%.%.%.#XXXXXX | ||
1750 | XXXXX#%.%.%.%#XXXXXX | ||
1751 | XXXXX#.%.%.%.#XXXXXX | ||
1752 | XXXXX#%.%.%.%#XXXXXX | ||
1753 | XXXXX### ###XXXXXX | ||
1754 | XXXXXXX# #XXXXXXXX | ||
1755 | XXX###### ######XXXX | ||
1756 | XXX# #XXXX | ||
1757 | XXX# $ $ $ $ $ #XXXX | ||
1758 | XXX## $ $ $ $ ##XXXX | ||
1759 | XXXX#$ $ $ $ $#XXXXX | ||
1760 | XXXX# $@$ #XXXXX | ||
1761 | XXXX# ##### #XXXXX | ||
1762 | XXXX####XXX####XXXXX | ||
1763 | |||
1764 | |||
1765 | XXXXXXXX####XXXXXXXX | ||
1766 | XXXXXXXX# ##XXXXXXX | ||
1767 | XXXXXXXX# ##XXXXXX | ||
1768 | XXXXXXXX# $$ ##XXXXX | ||
1769 | XXXXXX###$ $ ##XXXX | ||
1770 | XXX#### $ #XXXX | ||
1771 | X### # ##### #XXXX | ||
1772 | X# # #....$ #XXXX | ||
1773 | X# # $ ....# #XXXX | ||
1774 | X# $ # #.%..# #XXXX | ||
1775 | X### #### ### #XXXX | ||
1776 | XXX#### @$ ##$##XXX | ||
1777 | XXXXXX### $ #XXX | ||
1778 | XXXXXXXX# ## #XXX | ||
1779 | XXXXXXXX#########XXX | ||
1780 | XXXXXXXXXXXXXXXXXXXX | ||
1781 | |||
1782 | |||
1783 | XXXXXX############XX | ||
1784 | XXXXX##.. #XX | ||
1785 | XXXX##..% $ $ #XX | ||
1786 | XXX##..%.# # #$ ##XX | ||
1787 | XXX#..%.# # # $ #XX | ||
1788 | ####...# # # #XX | ||
1789 | # ## # #XX | ||
1790 | # @$ $ ### # # ##XX | ||
1791 | # $ $ # # #XXX | ||
1792 | ###$$ # # # # #XXX | ||
1793 | XX# $ # # #####X | ||
1794 | XX# $# ##### #X | ||
1795 | XX#$ #XXX# # #X | ||
1796 | XX# ###XXX## #X | ||
1797 | XX# #XXXXXX# ##X | ||
1798 | XX####XXXXXX######XX | ||
1799 | |||
1800 | |||
1801 | ###################X | ||
1802 | # ### # #X | ||
1803 | # ##$ $ # $$ # $ #X | ||
1804 | #.# . .$ # #..# #.#X | ||
1805 | #.####.# # # ## # #X | ||
1806 | # # # # # # #X | ||
1807 | # $ # # ### # ## #X | ||
1808 | # # # # #.$ # # #X | ||
1809 | # $$.# # ## # ## #X | ||
1810 | #$ # # # # ## # #X | ||
1811 | # .# # ## # # ## #X | ||
1812 | # # # # # ## #X | ||
1813 | ## ## # # # # $.#X | ||
1814 | ### ### $.# $.# $.#X | ||
1815 | ####### # # @#X | ||
1816 | XXXXXX#############X | ||
diff --git a/apps/plugins/sokobanlevels.sok b/apps/plugins/sokobanlevels.sok new file mode 100644 index 0000000000..869dcfe76e --- /dev/null +++ b/apps/plugins/sokobanlevels.sok | |||
@@ -0,0 +1,1277 @@ | |||
1 | ### | ||
2 | #.# | ||
3 | # #### | ||
4 | ###$ $.# | ||
5 | #. $@### | ||
6 | ####$# | ||
7 | #.# | ||
8 | ### | ||
9 | |||
10 | ##### | ||
11 | # # | ||
12 | #@$$# ### | ||
13 | # $ # #.# | ||
14 | ### ###.# | ||
15 | ## .# | ||
16 | # # # | ||
17 | # #### | ||
18 | ##### | ||
19 | |||
20 | ####### | ||
21 | # ### | ||
22 | ##$### # | ||
23 | # @ $ $ # | ||
24 | # ..# $ ## | ||
25 | ##..# # | ||
26 | ######## | ||
27 | |||
28 | ##### | ||
29 | #### .# | ||
30 | # $ *# | ||
31 | # $$ $.# | ||
32 | ##@##..# | ||
33 | ####### | ||
34 | |||
35 | #### | ||
36 | #@ ### | ||
37 | # $ # | ||
38 | ### # ## | ||
39 | #.# # # | ||
40 | #.$ # # | ||
41 | #. $ # | ||
42 | ######## | ||
43 | |||
44 | ####### | ||
45 | ## # @# | ||
46 | # # # | ||
47 | #$ $ $ # | ||
48 | # $## # | ||
49 | ### $ # ## | ||
50 | #..... # | ||
51 | ######### | ||
52 | |||
53 | ###### | ||
54 | ### # | ||
55 | ##. $## ## | ||
56 | #..$ $ @# | ||
57 | #.. $ $ ## | ||
58 | ###### # | ||
59 | #### | ||
60 | |||
61 | ###### | ||
62 | # # | ||
63 | ###$$$ # | ||
64 | #@ $.. # | ||
65 | # $...## | ||
66 | #### # | ||
67 | #### | ||
68 | |||
69 | #### | ||
70 | #..# | ||
71 | ## .## | ||
72 | # $.# | ||
73 | ## $ ## | ||
74 | # #$$ # | ||
75 | # @ # | ||
76 | ######## | ||
77 | |||
78 | ##### | ||
79 | ### @# | ||
80 | # $. ## | ||
81 | # .$. # | ||
82 | ### *$ # | ||
83 | # ## | ||
84 | ##### | ||
85 | |||
86 | ######## | ||
87 | # # # | ||
88 | # $..$ # | ||
89 | #@$.* ## | ||
90 | # $..$ # | ||
91 | # # # | ||
92 | ######## | ||
93 | |||
94 | ###### | ||
95 | # ### | ||
96 | # $ # | ||
97 | ### $ ## # | ||
98 | #... $ # | ||
99 | #...$#$ ## | ||
100 | #### # $ # | ||
101 | # @ # | ||
102 | ####### | ||
103 | |||
104 | ###### | ||
105 | # # | ||
106 | # $$$## | ||
107 | # #..### | ||
108 | ## ..$ # | ||
109 | # @ # | ||
110 | ######## | ||
111 | |||
112 | ######## | ||
113 | # #. # | ||
114 | ## $...# | ||
115 | # $ #*.# | ||
116 | ## ##$# ## | ||
117 | # $ $ # | ||
118 | # # # | ||
119 | #######@ # | ||
120 | #### | ||
121 | |||
122 | ####### | ||
123 | #.... # | ||
124 | ###...$### | ||
125 | # $#$ $ # | ||
126 | # $$ #$ # | ||
127 | # # # | ||
128 | #### @ ### | ||
129 | ##### | ||
130 | |||
131 | ######## | ||
132 | #.. # | ||
133 | #..$ $@# | ||
134 | #$#$$$## | ||
135 | #..$ $ # | ||
136 | #.. # | ||
137 | ######## | ||
138 | |||
139 | ######## | ||
140 | # # | ||
141 | # #$$ # | ||
142 | # ...# # | ||
143 | ##...$ ## | ||
144 | # ## $ # | ||
145 | #$ $ # | ||
146 | # # @# | ||
147 | ######## | ||
148 | |||
149 | ##### | ||
150 | ### #### | ||
151 | # $ $ # | ||
152 | # $ $ @# | ||
153 | ###$$##### | ||
154 | # ..# | ||
155 | #....# | ||
156 | ###### | ||
157 | |||
158 | ######### | ||
159 | # * # | ||
160 | # $.$. @# | ||
161 | # .$.$. # | ||
162 | # $.$.$ # | ||
163 | # * # | ||
164 | ######### | ||
165 | |||
166 | ######### | ||
167 | ## # | ||
168 | # #$#$ # | ||
169 | # $$ .$.# | ||
170 | # @###...# | ||
171 | #### ##### | ||
172 | |||
173 | ###### | ||
174 | #. ..# | ||
175 | #. $.# | ||
176 | ### $## | ||
177 | # $ $ # | ||
178 | # #$## # | ||
179 | # @ # | ||
180 | ######## | ||
181 | |||
182 | ##### | ||
183 | # #### | ||
184 | ## #$ # | ||
185 | # $ $$ # | ||
186 | # #$#.*.# | ||
187 | # @...# | ||
188 | ######### | ||
189 | |||
190 | ##### | ||
191 | #### ## | ||
192 | # $ $ # | ||
193 | #@#.*.# # | ||
194 | # #.*.# # | ||
195 | # $ $ # | ||
196 | ## #### | ||
197 | ##### | ||
198 | |||
199 | ##### | ||
200 | ####. ## | ||
201 | # $.$. # | ||
202 | #@$# #$ # | ||
203 | # $. . # | ||
204 | ####$#$ # | ||
205 | #. . # | ||
206 | ####### | ||
207 | |||
208 | ######## | ||
209 | #### . # | ||
210 | # $ $ $. # | ||
211 | # .####.## | ||
212 | # $.$ $ @# | ||
213 | # . ## | ||
214 | ######### | ||
215 | |||
216 | ####### | ||
217 | # ##### | ||
218 | # $ .*. $ # | ||
219 | #@$.* *.$ # | ||
220 | # $ .*. $ # | ||
221 | ###### # | ||
222 | ###### | ||
223 | |||
224 | ###### | ||
225 | # # | ||
226 | # $ #### | ||
227 | # $*..* # | ||
228 | # *..*$ # | ||
229 | #### $ # | ||
230 | # @ # | ||
231 | ###### | ||
232 | |||
233 | ###### | ||
234 | ####. @# | ||
235 | # $$$ # | ||
236 | #.##.##.# | ||
237 | # $ # | ||
238 | # $.# ## | ||
239 | #### # | ||
240 | ##### | ||
241 | |||
242 | ######### | ||
243 | #. $. @# | ||
244 | # .$.$ # | ||
245 | ##$.$ $## | ||
246 | # .$.$ # | ||
247 | #. $. # | ||
248 | ######### | ||
249 | |||
250 | ####### | ||
251 | # @ # | ||
252 | ##$ $ # | ||
253 | # $$## | ||
254 | #....# | ||
255 | ###### | ||
256 | |||
257 | #### | ||
258 | # ##### | ||
259 | ##$ ## # | ||
260 | # $@$ # | ||
261 | # ##$ # | ||
262 | ###.## ### | ||
263 | #...$ $ # | ||
264 | ##.. # | ||
265 | ######## | ||
266 | |||
267 | ######## | ||
268 | # #.. ## | ||
269 | # $. $* # | ||
270 | # $@$ # | ||
271 | # *$ .$ # | ||
272 | ## ..# # | ||
273 | ######## | ||
274 | |||
275 | ####### | ||
276 | ## * ## | ||
277 | # . . . # | ||
278 | # $ * # | ||
279 | #*$$*$$*# | ||
280 | # * $ # | ||
281 | # . .@. # | ||
282 | ## * ## | ||
283 | ####### | ||
284 | |||
285 | ######### | ||
286 | # .$ @# | ||
287 | # $ * $ # | ||
288 | #*...*.*# | ||
289 | # $$* # | ||
290 | # . $ # | ||
291 | ######### | ||
292 | |||
293 | ###### | ||
294 | #####. # | ||
295 | # #..## # | ||
296 | # $.. # | ||
297 | # # .# ## | ||
298 | ### ##$# # | ||
299 | # $ $$ # | ||
300 | # #$# # # | ||
301 | #@ ####### | ||
302 | ##### | ||
303 | |||
304 | ###### | ||
305 | # ...# | ||
306 | ####....# | ||
307 | # ###$ ### | ||
308 | # $ $ $$ # | ||
309 | #@ $ $ # | ||
310 | # #### # | ||
311 | #### ##### | ||
312 | |||
313 | ######### | ||
314 | # ## # | ||
315 | # $ # | ||
316 | #$ ### $# | ||
317 | # #...# # | ||
318 | ## #...# ## | ||
319 | # $ $ $ # | ||
320 | # # @ # | ||
321 | ########### | ||
322 | |||
323 | ####### | ||
324 | ### # | ||
325 | ## # # # | ||
326 | # #.$$$ # | ||
327 | # #.*# ### | ||
328 | # ..# # | ||
329 | ###..$ ## | ||
330 | #.# $ # | ||
331 | ## # #@# | ||
332 | # $ $ # | ||
333 | # ### | ||
334 | ###### | ||
335 | |||
336 | ########## | ||
337 | ## # | ||
338 | #@ $$$ $ # | ||
339 | ## $ $ $ # | ||
340 | ## #### ## | ||
341 | # $ ## | ||
342 | ### ##$ $ # | ||
343 | # # # | ||
344 | # ###### | ||
345 | # ## | ||
346 | #.....# | ||
347 | #.....# | ||
348 | ####### | ||
349 | |||
350 | ######## | ||
351 | # # | ||
352 | # @ $# # | ||
353 | ## # # | ||
354 | # $#.# # | ||
355 | # .*.$# | ||
356 | ## #.# # | ||
357 | # #. ## | ||
358 | ## $.# # | ||
359 | # # $ # | ||
360 | # $ ### | ||
361 | # #### | ||
362 | #### | ||
363 | |||
364 | #### | ||
365 | #@ # | ||
366 | ##### # | ||
367 | #### # | ||
368 | # .### ## | ||
369 | # # # ## | ||
370 | # # $ $#. # | ||
371 | # # * # # | ||
372 | # .#$ $ # # | ||
373 | ## # # # | ||
374 | # ###. # | ||
375 | # #### | ||
376 | ####### | ||
377 | |||
378 | ##### | ||
379 | # ## | ||
380 | # $ # | ||
381 | # $ @# | ||
382 | ###. # | ||
383 | #.## | ||
384 | #. # | ||
385 | ###. # | ||
386 | # $ # | ||
387 | # $ # | ||
388 | ## ## | ||
389 | #### | ||
390 | |||
391 | #### | ||
392 | # ##### | ||
393 | # # # | ||
394 | # . # # | ||
395 | ##$# .# | ||
396 | # #$# # | ||
397 | ##. . # | ||
398 | # ## # | ||
399 | # # *# | ||
400 | # $ $ # | ||
401 | # $#* @# | ||
402 | # #.### | ||
403 | ###### | ||
404 | |||
405 | ### | ||
406 | #.###### | ||
407 | ###.$ # # | ||
408 | #... #$ # | ||
409 | #.## $ # | ||
410 | ##.$ $## ## | ||
411 | #.$ # ## # | ||
412 | #.#$ # | ||
413 | #.$ #$ $# | ||
414 | #. $## @ # | ||
415 | #.$ $ # | ||
416 | #. ####### | ||
417 | #### | ||
418 | |||
419 | #### | ||
420 | ### ## | ||
421 | ## ## | ||
422 | # # ..# | ||
423 | ## $#*#$.# | ||
424 | # $ # $.# | ||
425 | # $ @ $.# | ||
426 | # $ # $.# | ||
427 | ##$$#*#$.# | ||
428 | #. # ..# | ||
429 | ##. ## | ||
430 | ### ## | ||
431 | #### | ||
432 | |||
433 | ######### | ||
434 | # # | ||
435 | # # ### # | ||
436 | # $$ # # | ||
437 | #@$ # # | ||
438 | ## ## # # | ||
439 | # $ $ # | ||
440 | # $## # # | ||
441 | # #$# # | ||
442 | #...# # | ||
443 | #.#.#$### | ||
444 | #... # | ||
445 | ####### | ||
446 | |||
447 | ######## | ||
448 | # .# | ||
449 | # #$#..## | ||
450 | # $...# | ||
451 | ## ##.$.# | ||
452 | # ## ## | ||
453 | #$## # | ||
454 | ## #$# | ||
455 | # # # | ||
456 | # $ #### | ||
457 | # $ $ @# | ||
458 | # ### # | ||
459 | #### ##### | ||
460 | |||
461 | #### | ||
462 | # #### | ||
463 | # $ # | ||
464 | # #.# # | ||
465 | # # # # | ||
466 | #.$.$.# | ||
467 | # # # # | ||
468 | # #.# # | ||
469 | # $$ # | ||
470 | ## @ # | ||
471 | # ### | ||
472 | #### | ||
473 | |||
474 | ###### #### | ||
475 | # ### # | ||
476 | # $$ ## # | ||
477 | # # $ # | ||
478 | ## ## $# # | ||
479 | # #... ## | ||
480 | # ...#$## | ||
481 | # #...# # | ||
482 | ## # ###@ # | ||
483 | # $ $ $ # | ||
484 | # #$#### # | ||
485 | # # #### | ||
486 | ##### | ||
487 | |||
488 | ########## | ||
489 | #..$ $ *.# | ||
490 | #.* $ $..# | ||
491 | ##.$ $ *## | ||
492 | #* $ $.# | ||
493 | #.$ $ .# | ||
494 | #. $ $.# | ||
495 | #.$@$ *# | ||
496 | ##* $ $.## | ||
497 | #..$ $ *.# | ||
498 | #.* $ $..# | ||
499 | ########## | ||
500 | |||
501 | ##### | ||
502 | # # | ||
503 | #$ # | ||
504 | ### $## | ||
505 | # $ $ # | ||
506 | ### # ## # ###### | ||
507 | # # ## ##### ..# | ||
508 | # $ $ ..# | ||
509 | ##### ### #@## ..# | ||
510 | # ######### | ||
511 | ####### | ||
512 | |||
513 | ############ | ||
514 | #.. # ### | ||
515 | #.. # $ $ # | ||
516 | #.. #$#### # | ||
517 | #.. @ ## # | ||
518 | #.. # # $ ## | ||
519 | ###### ##$ $ # | ||
520 | # $ $ $ $ # | ||
521 | # # # | ||
522 | ############ | ||
523 | |||
524 | ######## | ||
525 | # @# | ||
526 | # $#$ ## | ||
527 | # $ $# | ||
528 | ##$ $ # | ||
529 | ######### $ # ### | ||
530 | #.... ## $ $ # | ||
531 | ##... $ $ # | ||
532 | #.... ########## | ||
533 | ######## | ||
534 | |||
535 | ######## | ||
536 | # ....# | ||
537 | ############ ....# | ||
538 | # # $ $ ....# | ||
539 | # $$$#$ $ # ....# | ||
540 | # $ $ # ....# | ||
541 | # $$ #$ $ $######## | ||
542 | # $ # # | ||
543 | ## ######### | ||
544 | # # ## | ||
545 | # $ ## | ||
546 | # $$#$$ @# | ||
547 | # # ## | ||
548 | ########### | ||
549 | |||
550 | ##### | ||
551 | # ##### | ||
552 | # #$## # | ||
553 | # $ # | ||
554 | ######### ### # | ||
555 | #.... ## $ $### | ||
556 | #.... $ $$ ## | ||
557 | #.... ##$ $ @# | ||
558 | ######### $ ## | ||
559 | # $ $ # | ||
560 | ### ## # | ||
561 | # # | ||
562 | ###### | ||
563 | |||
564 | ###### ### | ||
565 | #.. # ##@## | ||
566 | #.. ### # | ||
567 | #.. $$ # | ||
568 | #.. # # $ # | ||
569 | #..### # $ # | ||
570 | #### $ #$ # | ||
571 | # $# $ # | ||
572 | # $ $ # | ||
573 | # ## # | ||
574 | ######### | ||
575 | |||
576 | ##### | ||
577 | ####### ## | ||
578 | ## # @## $$ # | ||
579 | # $ # | ||
580 | # $ ### # | ||
581 | ### #####$### | ||
582 | # $ ### ..# | ||
583 | # $ $ $ ...# | ||
584 | # ###...# | ||
585 | # $$ # #...# | ||
586 | # ### ##### | ||
587 | #### | ||
588 | |||
589 | #### | ||
590 | # ########### | ||
591 | # $ $ $ # | ||
592 | # $# $ # $ # | ||
593 | # $ $ # # | ||
594 | ### $# # #### # | ||
595 | #@#$ $ $ ## # | ||
596 | # $ #$# # # | ||
597 | # $ $ $ $ # | ||
598 | ##### ######### | ||
599 | # # | ||
600 | # # | ||
601 | #......# | ||
602 | #......# | ||
603 | #......# | ||
604 | ######## | ||
605 | |||
606 | ####### | ||
607 | # ...# | ||
608 | ##### ...# | ||
609 | # . .# | ||
610 | # ## ...# | ||
611 | ## ## ...# | ||
612 | ### ######## | ||
613 | # $$$ ## | ||
614 | ##### $ $ ##### | ||
615 | ## #$ $ # # | ||
616 | #@ $ $ $ $ # | ||
617 | ###### $$ $ ##### | ||
618 | # # | ||
619 | ######## | ||
620 | |||
621 | ### ############# | ||
622 | ##@#### # # | ||
623 | # $$ $$ $ $ ...# | ||
624 | # $$$# $ #...# | ||
625 | # $ # $$ $$ #...# | ||
626 | ### # $ #...# | ||
627 | # # $ $ $ #...# | ||
628 | # ###### ###...# | ||
629 | ## # # $ $ #...# | ||
630 | # ## # $$ $ $##..# | ||
631 | # ..# # $ #.# | ||
632 | # ..# # $$$ $$$ #.# | ||
633 | ##### # # #.# | ||
634 | # ######### #.# | ||
635 | # #.# | ||
636 | ############### | ||
637 | |||
638 | #### | ||
639 | #### # # | ||
640 | ### @###$ # | ||
641 | ## $ # | ||
642 | ## $ $$## ## | ||
643 | # #$## # | ||
644 | # # $ $$ # ### | ||
645 | # $ # # $ ##### | ||
646 | #### # $$ # # | ||
647 | #### ## $ # | ||
648 | #. ### ######## | ||
649 | #.. ..# #### | ||
650 | #...#.# | ||
651 | #.....# | ||
652 | ####### | ||
653 | |||
654 | ################ | ||
655 | # # | ||
656 | # # ###### # | ||
657 | # # $ $ $ $# # | ||
658 | # # $@$ ## ## | ||
659 | # # $ $ $###...# | ||
660 | # # $ $ ##...# | ||
661 | # ###$$$ $ ##...# | ||
662 | # # ## ##...# | ||
663 | ##### ## ##...# | ||
664 | ##### ### | ||
665 | # # | ||
666 | ####### | ||
667 | |||
668 | ######### | ||
669 | ## ## ###### | ||
670 | ### # # ### | ||
671 | # $ #$ # # ... # | ||
672 | # # $#@$## # #.#. # | ||
673 | # # #$ # . . # | ||
674 | # $ $ # # #.#. # | ||
675 | # ## ##$ $ . . # | ||
676 | # $ # # #$#.#. # | ||
677 | ## $ $ $ $... # | ||
678 | #$ ###### ## # | ||
679 | # # ########## | ||
680 | #### | ||
681 | |||
682 | ####### | ||
683 | ####### # | ||
684 | # # $@$ # | ||
685 | #$$ # ######### | ||
686 | # ###......## # | ||
687 | # $......## # # | ||
688 | # ###...... # | ||
689 | ## #### ### #$## | ||
690 | # #$ # $ # # | ||
691 | # $ $$$ # $## # | ||
692 | # $ $ ###$$ # # | ||
693 | ##### $ # # | ||
694 | ### ### # # | ||
695 | # # # | ||
696 | ######## # | ||
697 | #### | ||
698 | |||
699 | ######## | ||
700 | # # # | ||
701 | # $ # | ||
702 | ### #$ #### | ||
703 | # $ ##$ # | ||
704 | # # @ $ # $# | ||
705 | # # $ #### | ||
706 | ## ####$## # | ||
707 | # $#.....# # # | ||
708 | # $..**. $# ### | ||
709 | ## #.....# # | ||
710 | # ### ####### | ||
711 | # $$ # # | ||
712 | # # # | ||
713 | ###### # | ||
714 | ##### | ||
715 | |||
716 | ##### | ||
717 | # ## | ||
718 | # # #### | ||
719 | # $ #### # | ||
720 | # $$ $ $# | ||
721 | ###@ #$ ## | ||
722 | # ## $ $ ## | ||
723 | # $ ## ## .# | ||
724 | # #$##$ #.# | ||
725 | ### $..##.# | ||
726 | # #.*...# | ||
727 | # $$ #.....# | ||
728 | # ######### | ||
729 | # # | ||
730 | #### | ||
731 | |||
732 | ########## | ||
733 | #.. # # | ||
734 | #.. # | ||
735 | #.. # #### | ||
736 | ####### # ## | ||
737 | # # | ||
738 | # # ## # # | ||
739 | #### ## #### ## | ||
740 | # $ ##### # # | ||
741 | # # $ $ # $ # | ||
742 | # @$ $ # ## | ||
743 | #### ## ####### | ||
744 | # # | ||
745 | ###### | ||
746 | |||
747 | ########### | ||
748 | # . # # | ||
749 | # #. @ # | ||
750 | ##### ##..# #### | ||
751 | ## # ..### ### | ||
752 | # $ #... $ # $ # | ||
753 | # .. ## ## ## # | ||
754 | ####$##$# $ # # # | ||
755 | ## # #$ $$ # # | ||
756 | # $ # # # $## # | ||
757 | # # | ||
758 | # ########### # | ||
759 | #### #### | ||
760 | |||
761 | ###### | ||
762 | # @#### | ||
763 | ##### $ # | ||
764 | # ## #### | ||
765 | # $ # ## # | ||
766 | # $ # ##### # | ||
767 | ## $ $ # # | ||
768 | ## $ $ ### # # | ||
769 | ## # $ # # # | ||
770 | ## # #$# # # | ||
771 | ## ### # # ###### | ||
772 | # $ #### # #....# | ||
773 | # $ $ ..#.# | ||
774 | ####$ $# $ ....# | ||
775 | # # ## ....# | ||
776 | ################### | ||
777 | |||
778 | ########## | ||
779 | ##### #### | ||
780 | # # $ #@ # | ||
781 | # #######$#### ### | ||
782 | # # ## # #$ ..# | ||
783 | # # $ # # #.# | ||
784 | # # $ # #$ ..# | ||
785 | # # ### ## #.# | ||
786 | # ### # # #$ ..# | ||
787 | # # # #### #.# | ||
788 | # #$ $ $ #$ ..# | ||
789 | # $ # $ $ # #.# | ||
790 | #### $### #$ ..# | ||
791 | # $$ ###....# | ||
792 | # ## ###### | ||
793 | ######## | ||
794 | |||
795 | ######### | ||
796 | # # | ||
797 | # #### | ||
798 | ## #### # # | ||
799 | ## #@## # | ||
800 | # $$$ $ $$# | ||
801 | # # ## $ # | ||
802 | # # ## $ #### | ||
803 | #### $$$ $# # | ||
804 | # ## ....# | ||
805 | # # # #.. .# | ||
806 | # # # ##...# | ||
807 | ##### $ #...# | ||
808 | ## ##### | ||
809 | ##### | ||
810 | |||
811 | ###### #### | ||
812 | # ####### ##### | ||
813 | # $# # $ # # | ||
814 | # $ $ $ # $ $ # | ||
815 | ##$ $ # @# $ # | ||
816 | # $ ########### ## | ||
817 | # # #.......# $# | ||
818 | # ## # ......# # | ||
819 | # # $........$ # | ||
820 | # # $ #.... ..# # | ||
821 | # $ $####$#### $# | ||
822 | # $ ### $ $ ## | ||
823 | # $ $ $ $ # | ||
824 | ## ###### $ ##### # | ||
825 | # # # | ||
826 | ################### | ||
827 | |||
828 | ####### | ||
829 | # # #### | ||
830 | ##### $#$ # ## | ||
831 | #.. # # # # | ||
832 | #.. # $#$ # $#### | ||
833 | #. # #$ # # | ||
834 | #.. $# # $ # | ||
835 | #..@# #$ #$ # # | ||
836 | #.. # $# $# # | ||
837 | #.. # #$$#$ # ## | ||
838 | #.. # $# # $#$ # | ||
839 | #.. # # # # # | ||
840 | ##. #### ##### # | ||
841 | #### #### ##### | ||
842 | |||
843 | ############### | ||
844 | #.......... .#### | ||
845 | #..........$$.# # | ||
846 | ###########$ # ## | ||
847 | # $ $ $ # | ||
848 | ## #### # $ # # | ||
849 | # # ## # ## | ||
850 | # $# # ## ### ## | ||
851 | # $ #$### ### ## | ||
852 | ### $ # # ### ## | ||
853 | ### $ ## # # ## | ||
854 | # $ # $ $ $ # | ||
855 | # $ $#$$$ # # | ||
856 | # # $ ##### | ||
857 | # @## # # # | ||
858 | ############## | ||
859 | |||
860 | #### | ||
861 | # ############## | ||
862 | # # ..#......# | ||
863 | # # # ##### ...# | ||
864 | ##$# ........# | ||
865 | # ##$###### #### | ||
866 | # $ # ######@ # | ||
867 | ##$ # $ ###### # | ||
868 | # $ #$$$## # | ||
869 | # # #$#$### | ||
870 | # #### #$$$$$ # | ||
871 | # # $ # # | ||
872 | # # ## ### | ||
873 | # ######$###### $ # | ||
874 | # # # # | ||
875 | ########## ##### | ||
876 | |||
877 | ####### | ||
878 | # # ##### | ||
879 | ## # #...### | ||
880 | # $# #... # | ||
881 | # $ #$$ ... # | ||
882 | # $# #... .# | ||
883 | # # $######## | ||
884 | ##$ $ $ # | ||
885 | ## # $$ # # | ||
886 | ###### ##$$@# | ||
887 | # ## | ||
888 | ######## | ||
889 | |||
890 | ################# | ||
891 | #... # # ## | ||
892 | ##..... $## # #$ # | ||
893 | #......# $ # # | ||
894 | #......# # # # # | ||
895 | ######### $ $ $ # | ||
896 | # #$##$ ##$## | ||
897 | ## $ # $ # | ||
898 | # ## ### # ##$ # | ||
899 | # $ $$ $ $ # | ||
900 | # $ $##$ ###### | ||
901 | ####### @ ## | ||
902 | ###### | ||
903 | |||
904 | ##### | ||
905 | ##### # | ||
906 | ## $ $ #### | ||
907 | ##### $ $ $ ##.# | ||
908 | # $$ ##..# | ||
909 | # ###### ###.. # | ||
910 | ## # # #... # | ||
911 | # $ # #... # | ||
912 | #@ #$ ## ####...# | ||
913 | #### $ $$ ##..# | ||
914 | ## $ $ $...# | ||
915 | # $$ $ # .# | ||
916 | # $ $ #### | ||
917 | ###### # | ||
918 | ##### | ||
919 | |||
920 | ##### | ||
921 | # ## | ||
922 | # $ ######### | ||
923 | ## # # ###### | ||
924 | ## # $#$#@ # # | ||
925 | # # $ # $ # | ||
926 | # ### ######### ## | ||
927 | # ## ..*..... # ## | ||
928 | ## ## *.*..*.* # ## | ||
929 | # $########## ##$ # | ||
930 | # $ $ $ $ # | ||
931 | # # # # # # | ||
932 | ################### | ||
933 | |||
934 | ########### | ||
935 | # # # | ||
936 | ##### # $ $ # | ||
937 | # ##### $## # ## | ||
938 | # $ ## # ## $ # | ||
939 | # $ @$$ # ##$$$ # | ||
940 | ## ### # ## # | ||
941 | ## # ### #####$# | ||
942 | ## # $ #....# | ||
943 | # ### ## $ #....## | ||
944 | # $ $ # #..$. # | ||
945 | # ## $ # ##.... # | ||
946 | ##### ######...## | ||
947 | ##### ##### | ||
948 | |||
949 | #### | ||
950 | # ######### | ||
951 | ## ## # # | ||
952 | # $# $@$ #### | ||
953 | #$ $ # $ $# ## | ||
954 | ## $## #$ $ # | ||
955 | # # # # $$$ # | ||
956 | # $ $ $## #### | ||
957 | # $ $ #$# # # | ||
958 | ## ### ###$ # | ||
959 | # #.... # | ||
960 | ####......#### | ||
961 | #....#### | ||
962 | #...## | ||
963 | #...# | ||
964 | ##### | ||
965 | |||
966 | #### | ||
967 | ##### # | ||
968 | ## $# | ||
969 | ## $ ## ### | ||
970 | #@$ $ # $ # | ||
971 | #### ## $# | ||
972 | #....#$ $ # | ||
973 | #....# $# | ||
974 | #.... $$ ## | ||
975 | #... # $ # | ||
976 | ######$ $ # | ||
977 | # ### | ||
978 | #$ ### | ||
979 | # # | ||
980 | #### | ||
981 | |||
982 | ############ | ||
983 | ## ## # | ||
984 | ## $ $ # | ||
985 | #### ## $$ # | ||
986 | # $ # # | ||
987 | # $$$ # #### | ||
988 | # # # $ ## | ||
989 | # # # $ # | ||
990 | # $# $# # | ||
991 | # ..# #### | ||
992 | ####.. $ #@# | ||
993 | #.....# $# # | ||
994 | ##....# $ # | ||
995 | ###..## # | ||
996 | ############ | ||
997 | |||
998 | ######### | ||
999 | #.... ## | ||
1000 | #.#.# $ ## | ||
1001 | ##....# # @## | ||
1002 | # ....# # ## | ||
1003 | # #$ ##$ # | ||
1004 | ## ### $ # | ||
1005 | #$ $ $ $# # | ||
1006 | # # $ $ ## # | ||
1007 | # ### ## # | ||
1008 | # ## ## ## | ||
1009 | # $ # $ # | ||
1010 | ###$ $ ### | ||
1011 | # ##### | ||
1012 | #### | ||
1013 | |||
1014 | ############ ###### | ||
1015 | # # # ###....# | ||
1016 | # $$# @ .....# | ||
1017 | # # ### # ....# | ||
1018 | ## ## ### # ....# | ||
1019 | # $ $ # # #### | ||
1020 | # $ $## # # | ||
1021 | #### # #### # ## # | ||
1022 | # # #$ ## # # | ||
1023 | # $ $ # ## # ## | ||
1024 | # # $ $ # # # | ||
1025 | # $ ## ## # ##### | ||
1026 | # $$ $$ # | ||
1027 | ## ## ### $ # | ||
1028 | # # # # | ||
1029 | ###### ###### | ||
1030 | |||
1031 | ##### | ||
1032 | ##### ###### # | ||
1033 | # #### $ $ $ # | ||
1034 | # $ ## ## ## ## | ||
1035 | # $ $ $ $ # | ||
1036 | ### $ ## ## ## | ||
1037 | # ##### #####$$ # | ||
1038 | ##$##### @## # | ||
1039 | # $ ###$### $ ## | ||
1040 | # $ # ### ### | ||
1041 | # $$ $ # $$ # | ||
1042 | # # ## # | ||
1043 | #######.. .#### | ||
1044 | #.........# | ||
1045 | #.........# | ||
1046 | ########### | ||
1047 | |||
1048 | ########### | ||
1049 | #...... ######### | ||
1050 | #...... # ## # | ||
1051 | #..### $ $ # | ||
1052 | #... $ $ # ## # | ||
1053 | #...#$##### # # | ||
1054 | ### # #$ #$ # | ||
1055 | # $$ $ $ $## # | ||
1056 | # $ #$#$ ##$ # | ||
1057 | ### ## # ## # | ||
1058 | # $ $ ## ###### | ||
1059 | # $ $ # | ||
1060 | ## # # # | ||
1061 | #####@##### | ||
1062 | ### | ||
1063 | |||
1064 | #### | ||
1065 | ####### @# | ||
1066 | # $ # | ||
1067 | # $## $# | ||
1068 | ##$#...# # | ||
1069 | # $... # | ||
1070 | # #. .# ## | ||
1071 | # # #$ # | ||
1072 | #$ $ # | ||
1073 | # ####### | ||
1074 | #### | ||
1075 | |||
1076 | ###### | ||
1077 | #############....# | ||
1078 | ## ## ##....# | ||
1079 | # $$## $ @##....# | ||
1080 | # $$ $# ....# | ||
1081 | # $ ## $$ # # ...# | ||
1082 | # $ ## $ # ....# | ||
1083 | ## ##### ### ##.### | ||
1084 | ## $ $ ## . # | ||
1085 | # $### # ##### ### | ||
1086 | # $ # # | ||
1087 | # $ #$ $ $### # | ||
1088 | # $$$# $ # #### | ||
1089 | # # $$ # | ||
1090 | ###### ### | ||
1091 | ##### | ||
1092 | |||
1093 | ############ | ||
1094 | # ## | ||
1095 | # # #$$ $ # | ||
1096 | #$ #$# ## @# | ||
1097 | ## ## # $ # ## | ||
1098 | # $ #$ # # | ||
1099 | # # $ # # | ||
1100 | ## $ $ ## # | ||
1101 | # # ## $ # | ||
1102 | # ## $$# # | ||
1103 | ######$$ # # | ||
1104 | #....# ######## | ||
1105 | #.#... ## | ||
1106 | #.... # | ||
1107 | #.... # | ||
1108 | ######### | ||
1109 | |||
1110 | ##### | ||
1111 | ## ## | ||
1112 | ## # | ||
1113 | ## $$ # | ||
1114 | ## $$ $ # | ||
1115 | # $ $ # | ||
1116 | #### # $$ ##### | ||
1117 | # ######## ## # | ||
1118 | #. $$$@# | ||
1119 | #.# ####### ## ## | ||
1120 | #.# #######. #$ $## | ||
1121 | #........... # # | ||
1122 | ############## $ # | ||
1123 | ## ## | ||
1124 | #### | ||
1125 | |||
1126 | ######## | ||
1127 | #### ###### | ||
1128 | # ## $ $ @# | ||
1129 | # ## ##$#$ $ $## | ||
1130 | ### ......# $$ ## | ||
1131 | # ......# # # | ||
1132 | # # ......#$ $ # | ||
1133 | # #$...... $$# $ # | ||
1134 | # ### ###$ $ ## | ||
1135 | ### $ $ $ $ # | ||
1136 | # $ $ $ $ # | ||
1137 | ###### ###### | ||
1138 | ##### | ||
1139 | |||
1140 | ####### | ||
1141 | ##### # #### | ||
1142 | # # $ # | ||
1143 | #### #$$ ## ## # | ||
1144 | ## # # ## ### | ||
1145 | # ### $#$ $ $ # | ||
1146 | #... # ## # # | ||
1147 | #...# @ # ### ## | ||
1148 | #...# ### $ $ # | ||
1149 | ######## ## # # | ||
1150 | ######### | ||
1151 | |||
1152 | ##### | ||
1153 | # # | ||
1154 | # # ####### | ||
1155 | # $@###### | ||
1156 | # $ ##$ ### # | ||
1157 | # #### $ $ # | ||
1158 | # ##### # #$ #### | ||
1159 | ## #### ##$ # | ||
1160 | # $# $ # ## ## # | ||
1161 | # # #...# # | ||
1162 | ###### ### ... # | ||
1163 | #### # #...# # | ||
1164 | # ### # # | ||
1165 | # # | ||
1166 | ######### | ||
1167 | |||
1168 | ##### #### | ||
1169 | #...# # #### | ||
1170 | #...### $ # | ||
1171 | #....## $ $### | ||
1172 | ##....## $ # | ||
1173 | ###... ## $ $ # | ||
1174 | # ## # $ # | ||
1175 | # ## # ### #### | ||
1176 | # $ # #$ $ # | ||
1177 | # $ @ $ $ # | ||
1178 | # # $ $$ $ ### | ||
1179 | # ###### ### | ||
1180 | # ## #### | ||
1181 | ### | ||
1182 | |||
1183 | ########## | ||
1184 | # #### | ||
1185 | # ###### # ## | ||
1186 | # # $ $ $ $ # | ||
1187 | # #$ # | ||
1188 | ###$ $$# ### | ||
1189 | # ## # $## | ||
1190 | ##$# $ @# | ||
1191 | # $ $ ### | ||
1192 | # # $ # | ||
1193 | # ## # # | ||
1194 | ## ##### # | ||
1195 | # # | ||
1196 | #.......### | ||
1197 | #.......# | ||
1198 | ######### | ||
1199 | |||
1200 | #### | ||
1201 | ######### ## | ||
1202 | ## $ $ ##### | ||
1203 | # ## ## ##...# | ||
1204 | # #$$ $ $$#$##...# | ||
1205 | # # @ # ...# | ||
1206 | # $# ###$$ ...# | ||
1207 | # $ $$ $ ##....# | ||
1208 | ###$ ####### | ||
1209 | # ####### | ||
1210 | #### | ||
1211 | |||
1212 | ######### | ||
1213 | #*.*#*.*# | ||
1214 | #.*.*.*.# | ||
1215 | #*.*.*.*# | ||
1216 | #.*.*.*.# | ||
1217 | #*.*.*.*# | ||
1218 | ### ### | ||
1219 | # # | ||
1220 | ###### ###### | ||
1221 | # # | ||
1222 | # $ $ $ $ $ # | ||
1223 | ## $ $ $ $ ## | ||
1224 | #$ $ $ $ $# | ||
1225 | # $@$ # | ||
1226 | # ##### # | ||
1227 | #### #### | ||
1228 | |||
1229 | #### | ||
1230 | # ## | ||
1231 | # ## | ||
1232 | # $$ ## | ||
1233 | ###$ $ ## | ||
1234 | #### $ # | ||
1235 | ### # ##### # | ||
1236 | # # #....$ # | ||
1237 | # # $ ....# # | ||
1238 | # $ # #.*..# # | ||
1239 | ### #### ### # | ||
1240 | #### @$ ##$## | ||
1241 | ### $ # | ||
1242 | # ## # | ||
1243 | ######### | ||
1244 | |||
1245 | ############ | ||
1246 | ##.. # # | ||
1247 | ##..* $ $ # | ||
1248 | ##..*.# # # $## | ||
1249 | #..*.# # # $ # | ||
1250 | ####...# # # # | ||
1251 | # ## # # | ||
1252 | # @$ $ ### # ## | ||
1253 | # $ $ # # # | ||
1254 | ###$$ # # # # # | ||
1255 | # $ # # ##### | ||
1256 | # $# ##### # | ||
1257 | #$ # # # # | ||
1258 | # ### ## # | ||
1259 | # # # ## | ||
1260 | #### ###### | ||
1261 | |||
1262 | ################### | ||
1263 | # ### # # | ||
1264 | # ##$ $ # $$ # $ # | ||
1265 | #.# . .$ # #..# #.# | ||
1266 | #.####.# # # ## # # | ||
1267 | # # # # # # # | ||
1268 | # $ # # ### # ## # | ||
1269 | # # # # #.$ # # # | ||
1270 | # $$.# # ## # ## # | ||
1271 | #$ # # # # ## # # | ||
1272 | # .# # ## # # ## # | ||
1273 | # # # # # ## # | ||
1274 | ## ## # # # # $.# | ||
1275 | ### ### $.# $.# $.# | ||
1276 | ####### # # @# | ||
1277 | ############# | ||
diff --git a/apps/plugins/viewers.config b/apps/plugins/viewers.config index 95a7757e53..cf5ceccac5 100644 --- a/apps/plugins/viewers.config +++ b/apps/plugins/viewers.config | |||
@@ -16,6 +16,7 @@ m3u,viewers/iriverify,- | |||
16 | mid,viewers/midiplay,7 | 16 | mid,viewers/midiplay,7 |
17 | rmi,viewers/midiplay,7 | 17 | rmi,viewers/midiplay,7 |
18 | rsp,viewers/searchengine,8 | 18 | rsp,viewers/searchengine,8 |
19 | sok,rocks/sokoban,1 | ||
19 | pgn,rocks/chessbox,1 | 20 | pgn,rocks/chessbox,1 |
20 | ss,rocks/sudoku,1 | 21 | ss,rocks/sudoku,1 |
21 | wav,viewers/wav2wv,- | 22 | wav,viewers/wav2wv,- |