summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
authorRobert Kukla <roolku@rockbox.org>2008-04-03 22:43:39 +0000
committerRobert Kukla <roolku@rockbox.org>2008-04-03 22:43:39 +0000
commitb411ce677dfcafbda09d1520c6dcbab544479ec1 (patch)
tree91da60078c79751f09f4ef296c157ccd56ebc3ad /apps
parentfbfe6d66745426099fea9aaa7dac0ba3eba13e26 (diff)
downloadrockbox-b411ce677dfcafbda09d1520c6dcbab544479ec1.tar.gz
rockbox-b411ce677dfcafbda09d1520c6dcbab544479ec1.zip
FS#5725 - New Puzzle Game "PegBox"; with changes by myself:
- button definitions for m:robe 100 and sansa c200 - adapted graphics for m:robe 100 - use image size directly from auto-generated headers - save data files in correct directory - manual chapter (still missing most screenshots) git-svn-id: svn://svn.rockbox.org/rockbox/trunk@16957 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps')
-rw-r--r--apps/plugins/CATEGORIES1
-rw-r--r--apps/plugins/SOURCES1
-rw-r--r--apps/plugins/bitmaps/native/SOURCES45
-rw-r--r--apps/plugins/bitmaps/native/pegbox_header.138x28x4.bmpbin0 -> 2136 bytes
-rw-r--r--apps/plugins/bitmaps/native/pegbox_header.160x24x1.bmpbin0 -> 542 bytes
-rw-r--r--apps/plugins/bitmaps/native/pegbox_header.160x24x16.bmpbin0 -> 7736 bytes
-rw-r--r--apps/plugins/bitmaps/native/pegbox_header.160x24x4.bmpbin0 -> 2040 bytes
-rw-r--r--apps/plugins/bitmaps/native/pegbox_header.176x28x16.bmpbin0 -> 9912 bytes
-rw-r--r--apps/plugins/bitmaps/native/pegbox_header.220x40x16.bmpbin0 -> 17656 bytes
-rw-r--r--apps/plugins/bitmaps/native/pegbox_header.240x40x16.bmpbin0 -> 19256 bytes
-rw-r--r--apps/plugins/bitmaps/native/pegbox_header.320x40x16.bmpbin0 -> 25656 bytes
-rw-r--r--apps/plugins/bitmaps/native/pegbox_menu_items.120x32x16.bmpbin0 -> 103736 bytes
-rw-r--r--apps/plugins/bitmaps/native/pegbox_menu_items.60x17x1.bmpbin0 -> 1286 bytes
-rw-r--r--apps/plugins/bitmaps/native/pegbox_menu_items.60x17x16.bmpbin0 -> 27596 bytes
-rw-r--r--apps/plugins/bitmaps/native/pegbox_menu_items.60x17x4.bmpbin0 -> 5016 bytes
-rw-r--r--apps/plugins/bitmaps/native/pegbox_menu_items.70x20x16.bmpbin0 -> 38216 bytes
-rw-r--r--apps/plugins/bitmaps/native/pegbox_menu_top.138x34x4.bmpbin0 -> 2568 bytes
-rw-r--r--apps/plugins/bitmaps/native/pegbox_menu_top.160x42x1.bmpbin0 -> 902 bytes
-rw-r--r--apps/plugins/bitmaps/native/pegbox_menu_top.160x42x16.bmpbin0 -> 20216 bytes
-rw-r--r--apps/plugins/bitmaps/native/pegbox_menu_top.160x42x4.bmpbin0 -> 3480 bytes
-rw-r--r--apps/plugins/bitmaps/native/pegbox_menu_top.176x46x16.bmpbin0 -> 24344 bytes
-rw-r--r--apps/plugins/bitmaps/native/pegbox_menu_top.220x60x16.bmpbin0 -> 52856 bytes
-rw-r--r--apps/plugins/bitmaps/native/pegbox_menu_top.240x80x16.bmpbin0 -> 57656 bytes
-rw-r--r--apps/plugins/bitmaps/native/pegbox_menu_top.320x68x16.bmpbin0 -> 65336 bytes
-rw-r--r--apps/plugins/bitmaps/native/pegbox_pieces.12x12x1.bmpbin0 -> 398 bytes
-rw-r--r--apps/plugins/bitmaps/native/pegbox_pieces.12x12x16.bmpbin0 -> 2072 bytes
-rw-r--r--apps/plugins/bitmaps/native/pegbox_pieces.12x12x4.bmpbin0 -> 2088 bytes
-rw-r--r--apps/plugins/bitmaps/native/pegbox_pieces.16x16x16.bmpbin0 -> 3640 bytes
-rw-r--r--apps/plugins/bitmaps/native/pegbox_pieces.24x24x16.bmpbin0 -> 8120 bytes
-rw-r--r--apps/plugins/bitmaps/native/pegbox_pieces.8x8x1.bmpbin0 -> 286 bytes
-rw-r--r--apps/plugins/pegbox.c1207
31 files changed, 1254 insertions, 0 deletions
diff --git a/apps/plugins/CATEGORIES b/apps/plugins/CATEGORIES
index 4b267c162b..2fd08ca01e 100644
--- a/apps/plugins/CATEGORIES
+++ b/apps/plugins/CATEGORIES
@@ -48,6 +48,7 @@ mpegplayer,viewers
48nim,games 48nim,games
49oscilloscope,demos 49oscilloscope,demos
50pacbox,games 50pacbox,games
51pegbox,games
51pictureflow,demos 52pictureflow,demos
52plasma,demos 53plasma,demos
53pong,games 54pong,games
diff --git a/apps/plugins/SOURCES b/apps/plugins/SOURCES
index b6603a44c0..8e138d72cb 100644
--- a/apps/plugins/SOURCES
+++ b/apps/plugins/SOURCES
@@ -67,6 +67,7 @@ demystify.c
67jewels.c 67jewels.c
68minesweeper.c 68minesweeper.c
69oscilloscope.c 69oscilloscope.c
70pegbox.c
70pong.c 71pong.c
71sliding_puzzle.c 72sliding_puzzle.c
72snake.c 73snake.c
diff --git a/apps/plugins/bitmaps/native/SOURCES b/apps/plugins/bitmaps/native/SOURCES
index 6f069dd9f1..fe546cab25 100644
--- a/apps/plugins/bitmaps/native/SOURCES
+++ b/apps/plugins/bitmaps/native/SOURCES
@@ -321,6 +321,51 @@ minesweeper_tiles.12x12x2.bmp
321minesweeper_tiles.8x8x1.bmp 321minesweeper_tiles.8x8x1.bmp
322#endif 322#endif
323 323
324/* PegBox */
325#if (LCD_WIDTH >= 320) && (LCD_HEIGHT >= 240) && (LCD_DEPTH >= 16)
326pegbox_menu_top.320x68x16.bmp
327pegbox_menu_items.120x32x16.bmp
328pegbox_pieces.24x24x16.bmp
329pegbox_header.320x40x16.bmp
330#elif (LCD_WIDTH >= 240) && (LCD_HEIGHT >= 192) && (LCD_DEPTH >= 16)
331pegbox_menu_top.240x80x16.bmp
332pegbox_menu_items.120x32x16.bmp
333pegbox_pieces.16x16x16.bmp
334pegbox_header.240x40x16.bmp
335#elif (LCD_WIDTH >= 220) && (LCD_HEIGHT >= 176) && (LCD_DEPTH >= 16)
336pegbox_menu_top.220x60x16.bmp
337pegbox_menu_items.70x20x16.bmp
338pegbox_pieces.16x16x16.bmp
339pegbox_header.220x40x16.bmp
340#elif (LCD_WIDTH >= 176) && (LCD_HEIGHT >= 132) && (LCD_DEPTH >= 16)
341pegbox_menu_top.176x46x16.bmp
342pegbox_menu_items.60x17x16.bmp
343pegbox_pieces.12x12x16.bmp
344pegbox_header.176x28x16.bmp
345#elif (LCD_WIDTH >= 160) && (LCD_HEIGHT >= 128) && (LCD_DEPTH >= 16)
346pegbox_menu_top.160x42x16.bmp
347pegbox_menu_items.60x17x16.bmp
348pegbox_pieces.12x12x16.bmp
349pegbox_header.160x24x16.bmp
350#elif (LCD_WIDTH >= 160) && (LCD_HEIGHT >= 128) && (LCD_DEPTH > 1)
351pegbox_menu_top.160x42x4.bmp
352pegbox_menu_items.60x17x4.bmp
353pegbox_pieces.12x12x4.bmp
354pegbox_header.160x24x4.bmp
355#elif (LCD_WIDTH >= 138) && (LCD_HEIGHT >= 110) && (LCD_DEPTH > 1)
356pegbox_menu_top.138x34x4.bmp
357pegbox_menu_items.60x17x4.bmp
358pegbox_pieces.8x8x1.bmp
359pegbox_header.138x28x4.bmp
360#elif (LCD_WIDTH >= 160) && (LCD_HEIGHT >= 128) && (LCD_DEPTH == 1)
361pegbox_menu_top.160x42x1.bmp
362pegbox_menu_items.60x17x1.bmp
363pegbox_pieces.12x12x1.bmp
364pegbox_header.160x24x1.bmp
365#else
366pegbox_pieces.8x8x1.bmp
367#endif
368
324/* Rockblox */ 369/* Rockblox */
325#if (LCD_WIDTH == 320) && (LCD_HEIGHT == 240) && (LCD_DEPTH == 16) 370#if (LCD_WIDTH == 320) && (LCD_HEIGHT == 240) && (LCD_DEPTH == 16)
326rockblox_background.320x240x16.bmp 371rockblox_background.320x240x16.bmp
diff --git a/apps/plugins/bitmaps/native/pegbox_header.138x28x4.bmp b/apps/plugins/bitmaps/native/pegbox_header.138x28x4.bmp
new file mode 100644
index 0000000000..0754793c2b
--- /dev/null
+++ b/apps/plugins/bitmaps/native/pegbox_header.138x28x4.bmp
Binary files differ
diff --git a/apps/plugins/bitmaps/native/pegbox_header.160x24x1.bmp b/apps/plugins/bitmaps/native/pegbox_header.160x24x1.bmp
new file mode 100644
index 0000000000..8f627f69f9
--- /dev/null
+++ b/apps/plugins/bitmaps/native/pegbox_header.160x24x1.bmp
Binary files differ
diff --git a/apps/plugins/bitmaps/native/pegbox_header.160x24x16.bmp b/apps/plugins/bitmaps/native/pegbox_header.160x24x16.bmp
new file mode 100644
index 0000000000..9f4ef988e8
--- /dev/null
+++ b/apps/plugins/bitmaps/native/pegbox_header.160x24x16.bmp
Binary files differ
diff --git a/apps/plugins/bitmaps/native/pegbox_header.160x24x4.bmp b/apps/plugins/bitmaps/native/pegbox_header.160x24x4.bmp
new file mode 100644
index 0000000000..444e780882
--- /dev/null
+++ b/apps/plugins/bitmaps/native/pegbox_header.160x24x4.bmp
Binary files differ
diff --git a/apps/plugins/bitmaps/native/pegbox_header.176x28x16.bmp b/apps/plugins/bitmaps/native/pegbox_header.176x28x16.bmp
new file mode 100644
index 0000000000..508d982b95
--- /dev/null
+++ b/apps/plugins/bitmaps/native/pegbox_header.176x28x16.bmp
Binary files differ
diff --git a/apps/plugins/bitmaps/native/pegbox_header.220x40x16.bmp b/apps/plugins/bitmaps/native/pegbox_header.220x40x16.bmp
new file mode 100644
index 0000000000..b81e685770
--- /dev/null
+++ b/apps/plugins/bitmaps/native/pegbox_header.220x40x16.bmp
Binary files differ
diff --git a/apps/plugins/bitmaps/native/pegbox_header.240x40x16.bmp b/apps/plugins/bitmaps/native/pegbox_header.240x40x16.bmp
new file mode 100644
index 0000000000..bd8310af99
--- /dev/null
+++ b/apps/plugins/bitmaps/native/pegbox_header.240x40x16.bmp
Binary files differ
diff --git a/apps/plugins/bitmaps/native/pegbox_header.320x40x16.bmp b/apps/plugins/bitmaps/native/pegbox_header.320x40x16.bmp
new file mode 100644
index 0000000000..569f8a1dcf
--- /dev/null
+++ b/apps/plugins/bitmaps/native/pegbox_header.320x40x16.bmp
Binary files differ
diff --git a/apps/plugins/bitmaps/native/pegbox_menu_items.120x32x16.bmp b/apps/plugins/bitmaps/native/pegbox_menu_items.120x32x16.bmp
new file mode 100644
index 0000000000..2edd55dd1f
--- /dev/null
+++ b/apps/plugins/bitmaps/native/pegbox_menu_items.120x32x16.bmp
Binary files differ
diff --git a/apps/plugins/bitmaps/native/pegbox_menu_items.60x17x1.bmp b/apps/plugins/bitmaps/native/pegbox_menu_items.60x17x1.bmp
new file mode 100644
index 0000000000..dad5592ac4
--- /dev/null
+++ b/apps/plugins/bitmaps/native/pegbox_menu_items.60x17x1.bmp
Binary files differ
diff --git a/apps/plugins/bitmaps/native/pegbox_menu_items.60x17x16.bmp b/apps/plugins/bitmaps/native/pegbox_menu_items.60x17x16.bmp
new file mode 100644
index 0000000000..6406641501
--- /dev/null
+++ b/apps/plugins/bitmaps/native/pegbox_menu_items.60x17x16.bmp
Binary files differ
diff --git a/apps/plugins/bitmaps/native/pegbox_menu_items.60x17x4.bmp b/apps/plugins/bitmaps/native/pegbox_menu_items.60x17x4.bmp
new file mode 100644
index 0000000000..dea62f78a4
--- /dev/null
+++ b/apps/plugins/bitmaps/native/pegbox_menu_items.60x17x4.bmp
Binary files differ
diff --git a/apps/plugins/bitmaps/native/pegbox_menu_items.70x20x16.bmp b/apps/plugins/bitmaps/native/pegbox_menu_items.70x20x16.bmp
new file mode 100644
index 0000000000..1e66b622d5
--- /dev/null
+++ b/apps/plugins/bitmaps/native/pegbox_menu_items.70x20x16.bmp
Binary files differ
diff --git a/apps/plugins/bitmaps/native/pegbox_menu_top.138x34x4.bmp b/apps/plugins/bitmaps/native/pegbox_menu_top.138x34x4.bmp
new file mode 100644
index 0000000000..3184d7453c
--- /dev/null
+++ b/apps/plugins/bitmaps/native/pegbox_menu_top.138x34x4.bmp
Binary files differ
diff --git a/apps/plugins/bitmaps/native/pegbox_menu_top.160x42x1.bmp b/apps/plugins/bitmaps/native/pegbox_menu_top.160x42x1.bmp
new file mode 100644
index 0000000000..2527299271
--- /dev/null
+++ b/apps/plugins/bitmaps/native/pegbox_menu_top.160x42x1.bmp
Binary files differ
diff --git a/apps/plugins/bitmaps/native/pegbox_menu_top.160x42x16.bmp b/apps/plugins/bitmaps/native/pegbox_menu_top.160x42x16.bmp
new file mode 100644
index 0000000000..f24e64263e
--- /dev/null
+++ b/apps/plugins/bitmaps/native/pegbox_menu_top.160x42x16.bmp
Binary files differ
diff --git a/apps/plugins/bitmaps/native/pegbox_menu_top.160x42x4.bmp b/apps/plugins/bitmaps/native/pegbox_menu_top.160x42x4.bmp
new file mode 100644
index 0000000000..6aec9170a4
--- /dev/null
+++ b/apps/plugins/bitmaps/native/pegbox_menu_top.160x42x4.bmp
Binary files differ
diff --git a/apps/plugins/bitmaps/native/pegbox_menu_top.176x46x16.bmp b/apps/plugins/bitmaps/native/pegbox_menu_top.176x46x16.bmp
new file mode 100644
index 0000000000..bfbd9432c7
--- /dev/null
+++ b/apps/plugins/bitmaps/native/pegbox_menu_top.176x46x16.bmp
Binary files differ
diff --git a/apps/plugins/bitmaps/native/pegbox_menu_top.220x60x16.bmp b/apps/plugins/bitmaps/native/pegbox_menu_top.220x60x16.bmp
new file mode 100644
index 0000000000..a27ca63cde
--- /dev/null
+++ b/apps/plugins/bitmaps/native/pegbox_menu_top.220x60x16.bmp
Binary files differ
diff --git a/apps/plugins/bitmaps/native/pegbox_menu_top.240x80x16.bmp b/apps/plugins/bitmaps/native/pegbox_menu_top.240x80x16.bmp
new file mode 100644
index 0000000000..5b20711586
--- /dev/null
+++ b/apps/plugins/bitmaps/native/pegbox_menu_top.240x80x16.bmp
Binary files differ
diff --git a/apps/plugins/bitmaps/native/pegbox_menu_top.320x68x16.bmp b/apps/plugins/bitmaps/native/pegbox_menu_top.320x68x16.bmp
new file mode 100644
index 0000000000..ff987a2994
--- /dev/null
+++ b/apps/plugins/bitmaps/native/pegbox_menu_top.320x68x16.bmp
Binary files differ
diff --git a/apps/plugins/bitmaps/native/pegbox_pieces.12x12x1.bmp b/apps/plugins/bitmaps/native/pegbox_pieces.12x12x1.bmp
new file mode 100644
index 0000000000..c3eab837fe
--- /dev/null
+++ b/apps/plugins/bitmaps/native/pegbox_pieces.12x12x1.bmp
Binary files differ
diff --git a/apps/plugins/bitmaps/native/pegbox_pieces.12x12x16.bmp b/apps/plugins/bitmaps/native/pegbox_pieces.12x12x16.bmp
new file mode 100644
index 0000000000..29d9fccd62
--- /dev/null
+++ b/apps/plugins/bitmaps/native/pegbox_pieces.12x12x16.bmp
Binary files differ
diff --git a/apps/plugins/bitmaps/native/pegbox_pieces.12x12x4.bmp b/apps/plugins/bitmaps/native/pegbox_pieces.12x12x4.bmp
new file mode 100644
index 0000000000..5b75c3f323
--- /dev/null
+++ b/apps/plugins/bitmaps/native/pegbox_pieces.12x12x4.bmp
Binary files differ
diff --git a/apps/plugins/bitmaps/native/pegbox_pieces.16x16x16.bmp b/apps/plugins/bitmaps/native/pegbox_pieces.16x16x16.bmp
new file mode 100644
index 0000000000..a1245a1bea
--- /dev/null
+++ b/apps/plugins/bitmaps/native/pegbox_pieces.16x16x16.bmp
Binary files differ
diff --git a/apps/plugins/bitmaps/native/pegbox_pieces.24x24x16.bmp b/apps/plugins/bitmaps/native/pegbox_pieces.24x24x16.bmp
new file mode 100644
index 0000000000..929895fa20
--- /dev/null
+++ b/apps/plugins/bitmaps/native/pegbox_pieces.24x24x16.bmp
Binary files differ
diff --git a/apps/plugins/bitmaps/native/pegbox_pieces.8x8x1.bmp b/apps/plugins/bitmaps/native/pegbox_pieces.8x8x1.bmp
new file mode 100644
index 0000000000..0b341b91c2
--- /dev/null
+++ b/apps/plugins/bitmaps/native/pegbox_pieces.8x8x1.bmp
Binary files differ
diff --git a/apps/plugins/pegbox.c b/apps/plugins/pegbox.c
new file mode 100644
index 0000000000..390c72f202
--- /dev/null
+++ b/apps/plugins/pegbox.c
@@ -0,0 +1,1207 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2007 Tom Ross
11 *
12 * All files in this archive are subject to the GNU General Public License.
13 * See the file COPYING in the source tree root for full license agreement.
14 *
15 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
16 * KIND, either express or implied.
17 *
18 ****************************************************************************/
19#include "plugin.h"
20
21#if (LCD_WIDTH >= 128) && (LCD_HEIGHT >= 110)
22#include "pegbox_menu_top.h"
23#include "pegbox_menu_items.h"
24#include "pegbox_header.h"
25#endif
26#include "pegbox_pieces.h"
27
28static struct plugin_api* rb;
29
30PLUGIN_HEADER
31
32/* final game return status */
33#define PB_END 3
34#define PB_USB 2
35#define PB_QUIT 1
36
37#define DATA_FILE PLUGIN_DIR "/games/pegbox.data"
38#define SAVE_FILE PLUGIN_DIR "/games/pegbox.save"
39
40#define ROWS 8 /* Number of rows on each board */
41#define COLS 12 /* Number of columns on each board */
42#define NUM_LEVELS 15 /* Number of levels */
43
44#define SPACE 0
45#define WALL 1
46#define TRIANGLE 2
47#define CROSS 3
48#define SQUARE 4
49#define CIRCLE 5
50#define HOLE 6
51#define PLAYER 7
52
53#if CONFIG_KEYPAD == RECORDER_PAD
54#define PEGBOX_SELECT BUTTON_ON
55#define PEGBOX_QUIT BUTTON_OFF
56#define PEGBOX_SAVE BUTTON_F2
57#define PEGBOX_RESTART BUTTON_ON
58#define PEGBOX_LVL_UP BUTTON_F1
59#define PEGBOX_LVL_DOWN BUTTON_F3
60#define PEGBOX_UP BUTTON_UP
61#define PEGBOX_DOWN BUTTON_DOWN
62#define PEGBOX_RIGHT BUTTON_RIGHT
63#define PEGBOX_LEFT BUTTON_LEFT
64
65#define RESTART_TEXT "ON"
66#define LVL_UP_TEXT "F1"
67#define LVL_DOWN_TEXT "F3"
68#define SAVE_TEXT "F2"
69#define QUIT_TEXT "OFF"
70
71#elif CONFIG_KEYPAD == ONDIO_PAD
72#define PEGBOX_SELECT BUTTON_MENU
73#define PEGBOX_QUIT BUTTON_OFF
74#define PEGBOX_SAVE (BUTTON_MENU | BUTTON_UP)
75#define PEGBOX_RESTART (BUTTON_MENU | BUTTON_DOWN)
76#define PEGBOX_LVL_UP (BUTTON_MENU | BUTTON_LEFT)
77#define PEGBOX_LVL_DOWN (BUTTON_MENU | BUTTON_RIGHT)
78#define PEGBOX_UP BUTTON_UP
79#define PEGBOX_DOWN BUTTON_DOWN
80#define PEGBOX_RIGHT BUTTON_RIGHT
81#define PEGBOX_LEFT BUTTON_LEFT
82
83#define RESTART_TEXT "M+DOWN"
84#define LVL_UP_TEXT "M+RIGHT"
85#define LVL_DOWN_TEXT "M+LEFT"
86#define SAVE_TEXT "M+UP"
87#define QUIT_TEXT "OFF"
88
89#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
90 (CONFIG_KEYPAD == IRIVER_H300_PAD)
91#define PEGBOX_SELECT BUTTON_SELECT
92#define PEGBOX_QUIT BUTTON_OFF
93#define PEGBOX_SAVE BUTTON_MODE
94#define PEGBOX_RESTART BUTTON_SELECT
95#define PEGBOX_LVL_UP BUTTON_ON
96#define PEGBOX_LVL_DOWN BUTTON_REC
97#define PEGBOX_UP BUTTON_UP
98#define PEGBOX_DOWN BUTTON_DOWN
99#define PEGBOX_RIGHT BUTTON_RIGHT
100#define PEGBOX_LEFT BUTTON_LEFT
101
102#define RESTART_TEXT "NAVI"
103#define LVL_UP_TEXT "PLAY"
104#define LVL_DOWN_TEXT "REC"
105#define SAVE_TEXT "AB"
106#define QUIT_TEXT "OFF"
107
108#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \
109 (CONFIG_KEYPAD == IPOD_3G_PAD) || \
110 (CONFIG_KEYPAD == IPOD_1G2G_PAD)
111#define PEGBOX_SELECT (BUTTON_SELECT|BUTTON_REL)
112#define PEGBOX_QUIT (BUTTON_SELECT|BUTTON_MENU)
113#define PEGBOX_SAVE (BUTTON_SELECT|BUTTON_RIGHT)
114#define PEGBOX_RESTART (BUTTON_SELECT|BUTTON_LEFT)
115#define PEGBOX_LVL_UP BUTTON_SCROLL_BACK
116#define PEGBOX_LVL_DOWN BUTTON_SCROLL_FWD
117#define PEGBOX_UP BUTTON_MENU
118#define PEGBOX_DOWN BUTTON_PLAY
119#define PEGBOX_RIGHT BUTTON_RIGHT
120#define PEGBOX_LEFT BUTTON_LEFT
121
122#define RESTART_TEXT "SELECT+LEFT"
123#define LVL_UP_TEXT "SCROLL BACK"
124#define LVL_DOWN_TEXT "SCROLL FWD"
125#define SAVE_TEXT "SELECT+RIGHT"
126#define QUIT_TEXT "SELECT+MENU"
127
128#elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD
129#define PEGBOX_SELECT BUTTON_SELECT
130#define PEGBOX_QUIT BUTTON_POWER
131#define PEGBOX_SAVE (BUTTON_PLAY | BUTTON_RIGHT)
132#define PEGBOX_RESTART (BUTTON_PLAY | BUTTON_LEFT)
133#define PEGBOX_LVL_UP (BUTTON_PLAY | BUTTON_UP)
134#define PEGBOX_LVL_DOWN (BUTTON_PLAY | BUTTON_DOWN)
135#define PEGBOX_UP BUTTON_UP
136#define PEGBOX_DOWN BUTTON_DOWN
137#define PEGBOX_RIGHT BUTTON_RIGHT
138#define PEGBOX_LEFT BUTTON_LEFT
139
140#define RESTART_TEXT "PLAY+LEFT"
141#define LVL_UP_TEXT "PLAY+UP"
142#define LVL_DOWN_TEXT "PLAY+DOWN"
143#define SAVE_TEXT "PLAY+RIGHT"
144#define QUIT_TEXT "OFF"
145
146#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
147#define PEGBOX_SELECT BUTTON_MODE
148#define PEGBOX_QUIT BUTTON_PLAY
149#define PEGBOX_SAVE (BUTTON_EQ|BUTTON_MODE)
150#define PEGBOX_RESTART BUTTON_MODE
151#define PEGBOX_LVL_UP (BUTTON_EQ|BUTTON_UP)
152#define PEGBOX_LVL_DOWN (BUTTON_EQ|BUTTON_DOWN)
153#define PEGBOX_UP BUTTON_UP
154#define PEGBOX_DOWN BUTTON_DOWN
155#define PEGBOX_RIGHT BUTTON_RIGHT
156#define PEGBOX_LEFT BUTTON_LEFT
157
158#define RESTART_TEXT "MODE"
159#define LVL_UP_TEXT "EQ+UP"
160#define LVL_DOWN_TEXT "EQ+DOWN"
161#define SAVE_TEXT "EQ+MODE"
162#define QUIT_TEXT "PLAY"
163
164#elif CONFIG_KEYPAD == IRIVER_H10_PAD
165#define PEGBOX_SELECT BUTTON_PLAY
166#define PEGBOX_QUIT BUTTON_POWER
167#define PEGBOX_SAVE BUTTON_FF
168#define PEGBOX_RESTART (BUTTON_FF|BUTTON_REPEAT)
169#define PEGBOX_LVL_UP (BUTTON_FF|BUTTON_SCROLL_UP)
170#define PEGBOX_LVL_DOWN (BUTTON_FF|BUTTON_SCROLL_DOWN)
171#define PEGBOX_UP BUTTON_SCROLL_UP
172#define PEGBOX_DOWN BUTTON_SCROLL_DOWN
173#define PEGBOX_RIGHT BUTTON_RIGHT
174#define PEGBOX_LEFT BUTTON_LEFT
175
176#define RESTART_TEXT "LONG FF"
177#define LVL_UP_TEXT "FF+SCROLL_UP"
178#define LVL_DOWN_TEXT "FF+SCROLL_DOWN"
179#define SAVE_TEXT "FF"
180#define QUIT_TEXT "OFF"
181
182#elif CONFIG_KEYPAD == SANSA_E200_PAD
183#define PEGBOX_SELECT BUTTON_SELECT
184#define PEGBOX_QUIT BUTTON_POWER
185#define PEGBOX_SAVE BUTTON_REC
186#define PEGBOX_RESTART BUTTON_SELECT
187#define PEGBOX_LVL_UP BUTTON_SCROLL_UP
188#define PEGBOX_LVL_DOWN BUTTON_SCROLL_DOWN
189#define PEGBOX_UP BUTTON_UP
190#define PEGBOX_DOWN BUTTON_DOWN
191#define PEGBOX_RIGHT BUTTON_RIGHT
192#define PEGBOX_LEFT BUTTON_LEFT
193
194#define RESTART_TEXT "SELECT"
195#define LVL_UP_TEXT "SCROLL_UP"
196#define LVL_DOWN_TEXT "SCROLL_DOWN"
197#define SAVE_TEXT "REC"
198#define QUIT_TEXT "POWER"
199
200#elif CONFIG_KEYPAD == GIGABEAT_PAD
201#define PEGBOX_SELECT BUTTON_SELECT
202#define PEGBOX_QUIT BUTTON_POWER
203#define PEGBOX_SAVE BUTTON_MENU
204#define PEGBOX_RESTART BUTTON_A
205#define PEGBOX_LVL_UP BUTTON_VOL_UP
206#define PEGBOX_LVL_DOWN BUTTON_VOL_DOWN
207#define PEGBOX_UP BUTTON_UP
208#define PEGBOX_DOWN BUTTON_DOWN
209#define PEGBOX_RIGHT BUTTON_RIGHT
210#define PEGBOX_LEFT BUTTON_LEFT
211
212#define RESTART_TEXT "POWER"
213#define LVL_UP_TEXT "VOL+"
214#define LVL_DOWN_TEXT "VOL-"
215#define SAVE_TEXT "MENU"
216#define QUIT_TEXT "A"
217
218#elif CONFIG_KEYPAD == MROBE100_PAD
219#define PEGBOX_SELECT BUTTON_SELECT
220#define PEGBOX_QUIT BUTTON_POWER
221#define PEGBOX_SAVE BUTTON_MENU
222#define PEGBOX_RESTART BUTTON_PLAY
223#define PEGBOX_LVL_UP (BUTTON_DISPLAY | BUTTON_REL)
224#define PEGBOX_LVL_DOWN (BUTTON_DISPLAY | BUTTON_REPEAT)
225#define PEGBOX_UP BUTTON_UP
226#define PEGBOX_DOWN BUTTON_DOWN
227#define PEGBOX_RIGHT BUTTON_RIGHT
228#define PEGBOX_LEFT BUTTON_LEFT
229
230#define RESTART_TEXT "PLAY"
231#define LVL_UP_TEXT "DISPLAY+UP"
232#define LVL_DOWN_TEXT "DISPLAY+DOWN"
233#define SAVE_TEXT "MENU"
234#define QUIT_TEXT "POWER"
235
236#elif CONFIG_KEYPAD == SANSA_C200_PAD
237#define PEGBOX_SELECT BUTTON_SELECT
238#define PEGBOX_QUIT BUTTON_POWER
239#define PEGBOX_SAVE (BUTTON_REC | BUTTON_SELECT)
240#define PEGBOX_RESTART (BUTTON_REC | BUTTON_REL)
241#define PEGBOX_LVL_UP BUTTON_VOL_UP
242#define PEGBOX_LVL_DOWN BUTTON_VOL_DOWN
243#define PEGBOX_UP BUTTON_UP
244#define PEGBOX_DOWN BUTTON_DOWN
245#define PEGBOX_RIGHT BUTTON_RIGHT
246#define PEGBOX_LEFT BUTTON_LEFT
247
248#define RESTART_TEXT "REC"
249#define LVL_UP_TEXT "VOL+"
250#define LVL_DOWN_TEXT "VOL-"
251#define SAVE_TEXT "REC+SELECT"
252#define QUIT_TEXT "POWER"
253#endif
254
255#if (LCD_WIDTH >= 320) && (LCD_HEIGHT >= 240)
256#define LEVEL_TEXT_X 59
257#define PEGS_TEXT_X 276
258#define TEXT_Y 28
259#elif (LCD_WIDTH >= 240) && (LCD_HEIGHT >= 192)
260#define LEVEL_TEXT_X 59
261#define PEGS_TEXT_X 196
262#define TEXT_Y 28
263#elif (LCD_WIDTH >= 220) && (LCD_HEIGHT >= 176)
264#define LEVEL_TEXT_X 49
265#define PEGS_TEXT_X 186
266#define TEXT_Y 28
267#elif (LCD_WIDTH >= 176) && (LCD_HEIGHT >= 132)
268#define LEVEL_TEXT_X 38
269#define PEGS_TEXT_X 155
270#define TEXT_Y 17
271#elif (LCD_WIDTH >= 160) && (LCD_HEIGHT >= 128)
272#define LEVEL_TEXT_X 37
273#define PEGS_TEXT_X 140
274#define TEXT_Y 13
275#elif (LCD_WIDTH >= 138) && (LCD_HEIGHT >= 110)
276#define LEVEL_TEXT_X 28
277#define PEGS_TEXT_X 119
278#define TEXT_Y 15
279#elif (LCD_WIDTH >= 128) && (LCD_HEIGHT >= 128)
280#define LEVEL_TEXT_X 28
281#define PEGS_TEXT_X 119
282#define TEXT_Y 15
283#endif
284
285#ifdef HAVE_LCD_COLOR
286#define BG_COLOR LCD_BLACK
287#define TEXT_BG LCD_RGBPACK(189,189,189)
288#endif
289
290#define BOARD_X (LCD_WIDTH-12*BMPWIDTH_pegbox_pieces)/2
291
292#if (LCD_WIDTH >= 138) && (LCD_HEIGHT >= 110)
293#define BOARD_Y BMPHEIGHT_pegbox_header+2
294#else
295#define BOARD_Y 0
296#endif
297
298struct game_context {
299 unsigned int level;
300 unsigned int highlevel;
301 signed int player_row;
302 signed int player_col;
303 unsigned int num_left;
304 bool save_exist;
305 unsigned int playboard[ROWS][COLS];
306};
307
308char levels[NUM_LEVELS][ROWS][COLS] = {
309 /* Level 1 */
310 {{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,},
311 {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,},
312 {1, 0, 0, 0, 7, 0, 0, 5, 0, 0, 0, 1,},
313 {1, 0, 0, 0, 0, 3, 3, 2, 0, 0, 0, 1,},
314 {1, 0, 0, 0, 4, 6, 0, 5, 0, 0, 0, 1,},
315 {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,},
316 {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,},
317 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,}},
318
319 /* Level 2 */
320 {{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,},
321 {1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 1,},
322 {1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1,},
323 {1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1,},
324 {7, 0, 0, 0, 2, 2, 5, 5, 0, 0, 0, 1,},
325 {1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1,},
326 {1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1,},
327 {1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 1,}},
328
329 /* Level 3 */
330 {{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,},
331 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,},
332 {1, 0, 0, 0, 0, 0, 2, 0, 7, 0, 0, 0,},
333 {1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 2, 1,},
334 {1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1,},
335 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1,},
336 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,},
337 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,}},
338
339 /* Level 4 */
340 {{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,},
341 {6, 0, 4, 0, 2, 0, 2, 0, 0, 0, 0, 1,},
342 {6, 0, 3, 0, 5, 0, 2, 0, 0, 0, 0, 1,},
343 {6, 0, 5, 0, 4, 7, 2, 0, 0, 0, 0, 1,},
344 {6, 0, 2, 0, 4, 0, 2, 0, 3, 0, 0, 1,},
345 {6, 0, 4, 0, 5, 0, 2, 0, 0, 0, 0, 1,},
346 {6, 0, 5, 0, 4, 0, 2, 0, 0, 0, 0, 1,},
347 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,}},
348
349 /* Level 5 */
350 {{0, 6, 6, 0, 4, 6, 0, 0, 6, 0, 0, 0,},
351 {0, 6, 6, 0, 4, 4, 0, 0, 6, 0, 0, 2,},
352 {2, 6, 6, 0, 6, 6, 6, 0, 1, 2, 2, 2,},
353 {0, 6, 6, 0, 6, 4, 6, 0, 1, 2, 0, 2,},
354 {0, 6, 6, 0, 6, 7, 6, 5, 6, 0, 0, 0,},
355 {2, 6, 6, 0, 6, 6, 6, 0, 6, 0, 0, 0,},
356 {0, 6, 6, 0, 4, 0, 0, 0, 6, 0, 0, 0,},
357 {0, 6, 6, 0, 0, 5, 0, 0, 6, 5, 5, 0,}},
358
359 /* Level 6 */
360 {{7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
361 {2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0,},
362 {2, 0, 0, 2, 0, 0, 0, 2, 2, 0, 0, 0,},
363 {0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 0,},
364 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
365 {0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1,},
366 {0, 3, 0, 0, 0, 0, 0, 0, 5, 4, 6, 0,},
367 {0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1,}},
368
369 /* Level 7 */
370 {{1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1,},
371 {1, 1, 1, 6, 0, 0, 4, 6, 0, 1, 1, 1,},
372 {1, 1, 1, 1, 0, 1, 5, 1, 0, 1, 1, 1,},
373 {1, 1, 1, 2, 3, 3, 7, 4, 2, 6, 1, 1,},
374 {1, 1, 1, 1, 0, 1, 2, 1, 0, 0, 0, 1,},
375 {1, 1, 1, 1, 0, 0, 5, 0, 0, 1, 0, 1,},
376 {1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1,},
377 {1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1,}},
378
379 /* Level 8 */
380 {{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,},
381 {0, 0, 3, 3, 3, 3, 3, 4, 3, 3, 0, 0,},
382 {0, 0, 3, 3, 3, 2, 3, 3, 5, 3, 0, 0,},
383 {7, 0, 3, 3, 3, 2, 3, 3, 4, 3, 0, 0,},
384 {0, 0, 3, 3, 4, 5, 3, 3, 3, 3, 0, 0,},
385 {0, 0, 3, 3, 5, 2, 3, 3, 3, 3, 0, 0,},
386 {0, 0, 3, 3, 2, 4, 3, 3, 3, 3, 0, 0,},
387 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,}},
388
389 /* Level 9 */
390 {{0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0,},
391 {0, 3, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0,},
392 {0, 0, 0, 0, 2, 4, 4, 3, 0, 1, 1, 0,},
393 {0, 1, 0, 0, 2, 1, 0, 0, 0, 1, 1, 1,},
394 {0, 0, 0, 2, 2, 7, 1, 0, 0, 0, 0, 2,},
395 {0, 0, 0, 0, 2, 1, 0, 0, 1, 1, 1, 1,},
396 {0, 3, 1, 0, 2, 5, 5, 0, 0, 0, 3, 0,},
397 {0, 0, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0,}},
398
399 /* Level 10 */
400 {{1, 1, 1, 1, 2, 1, 1, 1, 0, 0, 0, 0,},
401 {1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 7,},
402 {0, 0, 4, 0, 6, 6, 6, 0, 0, 0, 3, 0,},
403 {0, 3, 3, 0, 6, 6, 6, 0, 4, 3, 4, 0,},
404 {0, 3, 3, 0, 6, 6, 6, 0, 4, 3, 4, 0,},
405 {0, 0, 0, 0, 6, 6, 6, 0, 3, 0, 0, 0,},
406 {1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0,},
407 {1, 1, 1, 1, 1, 2, 1, 1, 0, 0, 0, 0,}},
408
409 /* Level 11 */
410 {{1, 7, 1, 0, 1, 1, 6, 0, 0, 1, 1, 0,},
411 {1, 0, 0, 0, 5, 4, 6, 6, 0, 2, 2, 0,},
412 {1, 2, 1, 2, 0, 1, 6, 0, 0, 2, 2, 0,},
413 {1, 0, 0, 2, 0, 1, 0, 0, 0, 3, 3, 0,},
414 {1, 2, 1, 0, 0, 1, 0, 1, 0, 3, 3, 0,},
415 {0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0,},
416 {0, 3, 4, 3, 0, 1, 0, 1, 0, 0, 0, 0,},
417 {0, 0, 0, 0, 2, 2, 2, 1, 1, 1, 1, 1,}},
418
419 /* Level 12 */
420 {{7, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1,},
421 {1, 2, 1, 2, 1, 2, 1, 1, 0, 0, 0, 1,},
422 {0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1,},
423 {1, 2, 1, 2, 1, 2, 1, 0, 0, 0, 0, 1,},
424 {0, 0, 0, 0, 0, 0, 1, 1, 5, 5, 6, 1,},
425 {1, 2, 1, 2, 1, 2, 1, 1, 0, 2, 2, 1,},
426 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1,},
427 {1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1,}},
428
429 /* Level 13 */
430 {{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,},
431 {0, 0, 4, 0, 2, 0, 5, 0, 4, 0, 0, 6,},
432 {0, 0, 2, 0, 5, 0, 2, 0, 4, 0, 0, 6,},
433 {7, 0, 3, 0, 4, 0, 5, 0, 4, 0, 0, 6,},
434 {0, 0, 5, 0, 4, 0, 2, 0, 4, 0, 0, 6,},
435 {0, 0, 4, 0, 2, 0, 5, 0, 4, 0, 0, 6,},
436 {0, 0, 3, 0, 3, 0, 2, 0, 4, 0, 0, 6,},
437 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,}},
438
439 /* Level 14 */
440 {{1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1,},
441 {1, 1, 0, 2, 0, 0, 4, 0, 0, 2, 0, 1,},
442 {1, 6, 0, 0, 5, 1, 0, 1, 1, 0, 0, 1,},
443 {1, 1, 1, 0, 0, 3, 5, 3, 0, 0, 1, 1,},
444 {1, 1, 0, 0, 1, 1, 0, 1, 5, 0, 0, 6,},
445 {1, 1, 0, 2, 0, 0, 4, 0, 0, 0, 7, 1,},
446 {1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1,},
447 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,}},
448
449 /* Level 15 */
450 {{0, 0, 0, 6, 0, 6, 0, 6, 0, 6, 0, 1,},
451 {0, 0, 0, 6, 0, 6, 0, 6, 0, 6, 0, 1,},
452 {0, 3, 4, 6, 0, 6, 0, 6, 0, 6, 0, 2,},
453 {0, 4, 0, 6, 0, 6, 4, 6, 0, 6, 0, 1,},
454 {0, 3, 0, 6, 0, 6, 0, 6, 0, 6, 0, 1,},
455 {7, 0, 0, 6, 4, 6, 0, 6, 0, 6, 0, 1,},
456 {0, 0, 4, 6, 0, 6, 0, 6, 4, 6, 0, 1,},
457 {0, 0, 4, 6, 0, 6, 0, 6, 0, 6, 0, 1,}}
458};
459
460
461/*****************************************************************************
462* display_text() formats and outputs text.
463******************************************************************************/
464static void display_text(char *str, bool waitkey)
465{
466 int chars_by_line;
467 int lines_by_screen;
468 int chars_for_line;
469 int current_line = 0;
470 int char_width, char_height;
471 int first_char_index = 0;
472 char *ptr_char;
473 char *ptr_line;
474 int i;
475 char line[255];
476 int key;
477 bool go_on;
478
479 rb->lcd_clear_display();
480
481 rb->lcd_getstringsize("a", &char_width, &char_height);
482
483 chars_by_line = LCD_WIDTH / char_width;
484 lines_by_screen = LCD_HEIGHT / char_height;
485
486 do
487 {
488 ptr_char = str + first_char_index;
489 chars_for_line = 0;
490 i = 0;
491 ptr_line = line;
492 while (i < chars_by_line)
493 {
494 switch (*ptr_char)
495 {
496 case '\t':
497 case ' ':
498 *(ptr_line++) = ' ';
499 case '\n':
500 case '\0':
501 chars_for_line = i;
502 break;
503
504 default:
505 *(ptr_line++) = *ptr_char;
506 }
507 if (*ptr_char == '\n' || *ptr_char == '\0')
508 break;
509 ptr_char++;
510 i++;
511 }
512
513 if (chars_for_line == 0)
514 chars_for_line = i;
515
516 line[chars_for_line] = '\0';
517
518 /* test if we have cut a word. If it is the case we don't have to */
519 /* skip the space */
520 if (i == chars_by_line && chars_for_line == chars_by_line)
521 first_char_index += chars_for_line;
522 else
523 first_char_index += chars_for_line + 1;
524
525 /* print the line on the screen */
526 rb->lcd_putsxy(0, current_line * char_height, line);
527
528 /* if the number of line showed on the screen is equals to the */
529 /* maximum number of line we can show, we wait for a key pressed to */
530 /* clear and show the remaining text. */
531 current_line++;
532 if (current_line == lines_by_screen || *ptr_char == '\0')
533 {
534 current_line = 0;
535 rb->lcd_update();
536 go_on = false;
537 while (waitkey && !go_on)
538 {
539 key = rb->button_get(true);
540 switch (key)
541 {
542 case PEGBOX_QUIT:
543 case PEGBOX_LEFT:
544 case PEGBOX_DOWN:
545 go_on = true;
546 break;
547
548 default:
549 /*if (rb->default_event_handler(key) == SYS_USB_CONNECTED)
550 {
551 usb_detected = true;
552 go_on = true;
553 break;
554 }*/
555 break;
556 }
557 }
558 rb->lcd_clear_display();
559 }
560 } while (*ptr_char != '\0');
561}
562
563/*****************************************************************************
564* draw_board() draws the game's current level.
565******************************************************************************/
566static void draw_board(struct game_context* pb) {
567 unsigned int r, c, type;
568 pb->num_left = 0;
569#if (LCD_WIDTH >= 138) && (LCD_HEIGHT >= 110)
570 char str[5];
571
572 rb->lcd_clear_display();
573 rb->lcd_bitmap(pegbox_header,0,0,LCD_WIDTH, BMPHEIGHT_pegbox_header);
574 rb->lcd_drawrect((LCD_WIDTH-12*BMPWIDTH_pegbox_pieces)/2-2,
575 BMPHEIGHT_pegbox_header,
576 12*BMPWIDTH_pegbox_pieces+4,8*BMPWIDTH_pegbox_pieces+4);
577
578#ifdef HAVE_LCD_COLOR
579 rb->lcd_set_foreground(LCD_WHITE);
580 rb->lcd_fillrect((LCD_WIDTH-12*BMPWIDTH_pegbox_pieces)/2-1,BMPHEIGHT_pegbox_header+1,
581 12*BMPWIDTH_pegbox_pieces+2,8*BMPWIDTH_pegbox_pieces+2);
582 rb->lcd_set_foreground(LCD_BLACK);
583 rb->lcd_set_background(TEXT_BG);
584#endif
585
586#else
587 rb->lcd_clear_display();
588#endif
589
590 for (r=0 ; r < ROWS ; r++) {
591 for (c = 0 ; c < COLS ; c++) {
592
593 type = pb->playboard[r][c];
594
595 switch(type) {
596 case SPACE:
597 break;
598
599 default:
600 rb->lcd_bitmap_part(pegbox_pieces, 0,
601 (type-1)*BMPWIDTH_pegbox_pieces,
602 BMPWIDTH_pegbox_pieces,
603 c * BMPWIDTH_pegbox_pieces + BOARD_X,
604 r * BMPWIDTH_pegbox_pieces + BOARD_Y,
605 BMPWIDTH_pegbox_pieces,
606 BMPWIDTH_pegbox_pieces);
607 break;
608 }
609
610 if(pb->playboard[r][c] == PLAYER) {
611 pb->player_row=r;
612 pb->player_col=c;
613 }
614 else if (type != WALL && type != SPACE && type != HOLE)
615 pb->num_left++;
616 }
617 }
618#if (LCD_WIDTH >= 138) && (LCD_HEIGHT >= 110)
619 rb->snprintf(str, 3, "%d", pb->level);
620 rb->lcd_putsxy(LEVEL_TEXT_X, TEXT_Y, str);
621 rb->snprintf(str, 3, "%d", pb->num_left);
622 rb->lcd_putsxy(PEGS_TEXT_X, TEXT_Y, str);
623#endif
624
625#ifdef HAVE_LCD_COLOR
626 rb->lcd_set_background(BG_COLOR);
627 rb->lcd_set_foreground(LCD_WHITE);
628#endif
629 /* print out the screen */
630 rb->lcd_update();
631}
632
633/*****************************************************************************
634* load_level() loads the player's current level from the array and sets the
635* player's position.
636******************************************************************************/
637static void load_level(struct game_context* pb) {
638 int r, c;
639
640 for(r = 0; r < ROWS; r++)
641 for(c = 0; c < COLS; c++)
642 pb->playboard[r][c] = levels[pb->level-1][r][c];
643}
644
645/*****************************************************************************
646* new_piece() creates a new piece at a specified location. The player
647* navigates through the pieces and selects one.
648******************************************************************************/
649static void new_piece(struct game_context* pb, unsigned int x_loc,
650 unsigned int y_loc) {
651 int button;
652 bool exit = false;
653
654 pb->playboard[x_loc][y_loc] = TRIANGLE;
655
656 while (!exit) {
657 draw_board(pb);
658 button = rb->button_get(true);
659 switch(button){
660 case PEGBOX_LEFT:
661 case (PEGBOX_LEFT|BUTTON_REPEAT):
662 case PEGBOX_DOWN:
663 case (PEGBOX_DOWN|BUTTON_REPEAT):
664 if (pb->playboard[x_loc][y_loc] < 5)
665 pb->playboard[x_loc][y_loc]++;
666 else
667 pb->playboard[x_loc][y_loc] = TRIANGLE;
668 break;
669 case PEGBOX_RIGHT:
670 case (PEGBOX_RIGHT|BUTTON_REPEAT):
671 case PEGBOX_UP:
672 case (PEGBOX_UP|BUTTON_REPEAT):
673 if (pb->playboard[x_loc][y_loc] > 2)
674 pb->playboard[x_loc][y_loc]--;
675 else
676 pb->playboard[x_loc][y_loc] = CIRCLE;
677 break;
678 case PEGBOX_SELECT:
679 exit = true;
680 break;
681 }
682 }
683}
684
685/*****************************************************************************
686* move_player() moves the player and pieces and updates the board accordingly.
687******************************************************************************/
688static void move_player(struct game_context* pb, signed int x_dir,
689 signed int y_dir) {
690 unsigned int type1, type2;
691 signed int r,c;
692
693 r = pb->player_row+y_dir;
694 c = pb->player_col+x_dir;
695
696 type1 = pb->playboard[r][c];
697 type2 = pb->playboard[r+y_dir][c+x_dir];
698
699 if (r == ROWS || c == COLS || r < 0 || c < 0 || type1 == WALL)
700 return;
701 else if(type1 != SPACE) {
702 if (type2 == WALL || r+y_dir == ROWS || c+x_dir == COLS ||
703 r+y_dir < 0 || c+x_dir < 0)
704 return;
705 }
706
707
708 pb->playboard[pb->player_row][pb->player_col] = SPACE;
709 pb->player_row += y_dir;
710 pb->player_col += x_dir;
711
712 if (type1 == HOLE) {
713 draw_board(pb);
714 rb->splash(HZ*2, "You fell down a hole!");
715 load_level(pb);
716 }
717 else if (type1 == SPACE)
718 pb->playboard[r][c] = PLAYER;
719 else {
720 pb->playboard[r][c] = PLAYER;
721 if(type1 == type2) {
722 if (type1 == TRIANGLE)
723 pb->playboard[r+y_dir][c+x_dir] = WALL;
724 else if (type1 == CROSS) {
725 pb->playboard[r][c] = SPACE;
726 new_piece(pb, r+y_dir, c+x_dir);
727 pb->playboard[r][c] = PLAYER;
728 }
729 else
730 pb->playboard[r+y_dir][c+x_dir] = SPACE;
731 }
732 else if (type2 == SPACE)
733 pb->playboard[r+y_dir][c+x_dir] = type1;
734 else if (type2 == HOLE) {
735 if (type1 == SQUARE)
736 pb->playboard[r+y_dir][c+x_dir] = SPACE;
737 }
738 else {
739 rb->splash(HZ*2, "Illegal Move!");
740 load_level(pb);
741 }
742 }
743
744 draw_board(pb);
745}
746
747/*****************************************************************************
748* pegbox_loadgame() loads the saved game and returns load success.
749******************************************************************************/
750static bool pegbox_loadgame(struct game_context* pb) {
751 signed int fd;
752 bool loaded = false;
753
754 /* open game file */
755 fd = rb->open(SAVE_FILE, O_RDONLY);
756 if(fd < 0) return loaded;
757
758 /* read in saved game */
759 while(true) {
760 if(rb->read(fd, &pb->level, sizeof(pb->level)) <= 0) break;
761 if(rb->read(fd, &pb->playboard, sizeof(pb->playboard)) <= 0)
762 {
763 loaded = true;
764 break;
765 }
766 break;
767 }
768
769 rb->close(fd);
770 return loaded;
771}
772
773/*****************************************************************************
774* pegbox_savegame() saves the current game state.
775******************************************************************************/
776static void pegbox_savegame(struct game_context* pb) {
777 unsigned int fd;
778
779 /* write out the game state to the save file */
780 fd = rb->open(SAVE_FILE, O_WRONLY|O_CREAT);
781 rb->write(fd, &pb->level, sizeof(pb->level));
782 rb->write(fd, &pb->playboard, sizeof(pb->playboard));
783 rb->close(fd);
784}
785
786/*****************************************************************************
787* pegbox_loaddata() loads the level and highlevel and returns load success.
788******************************************************************************/
789static void pegbox_loaddata(struct game_context* pb) {
790 signed int fd;
791
792 /* open game file */
793 fd = rb->open(DATA_FILE, O_RDONLY);
794 if(fd < 0) {
795 pb->level = 1;
796 pb->highlevel = 1;
797 return;
798 }
799
800 /* read in saved game */
801 while(true) {
802 if(rb->read(fd, &pb->level, sizeof(pb->level)) <= 0) break;
803 if(rb->read(fd, &pb->highlevel, sizeof(pb->highlevel)) <= 0) break;
804 break;
805 }
806
807 rb->close(fd);
808 return;
809}
810
811/*****************************************************************************
812* pegbox_savedata() saves the level and highlevel.
813******************************************************************************/
814static void pegbox_savedata(struct game_context* pb) {
815 unsigned int fd;
816
817 /* write out the game state to the save file */
818 fd = rb->open(DATA_FILE, O_WRONLY|O_CREAT);
819 rb->write(fd, &pb->level, sizeof(pb->level));
820 rb->write(fd, &pb->highlevel, sizeof(pb->highlevel));
821 rb->close(fd);
822}
823
824/*****************************************************************************
825* pegbox_callback() is the default event handler callback which is called
826* on usb connect and shutdown.
827******************************************************************************/
828static void pegbox_callback(void* param) {
829 struct game_context* pb = (struct game_context*) param;
830 rb->splash(HZ, "Saving data...");
831 pegbox_savedata(pb);
832}
833
834/*****************************************************************************
835* pegbox_menu() is the initial menu at the start of the game.
836******************************************************************************/
837static unsigned int pegbox_menu(struct game_context* pb) {
838 int button;
839 char str[30];
840 unsigned int startlevel = 1, loc = 0;
841 bool breakout = false, can_resume = false;
842
843 if (pb->num_left > 0 || pb->save_exist)
844 can_resume = true;
845
846 while(!breakout){
847#if (LCD_WIDTH >= 128) && (LCD_HEIGHT >= 110)
848 rb->lcd_clear_display();
849 rb->lcd_bitmap(pegbox_menu_top,0,0,LCD_WIDTH, BMPHEIGHT_pegbox_menu_top);
850
851 /* menu bitmaps */
852 if (loc == 0) {
853 rb->lcd_bitmap_part(pegbox_menu_items, 0,
854 (BMPHEIGHT_pegbox_menu_items/9),
855 BMPWIDTH_pegbox_menu_items,
856 (LCD_WIDTH-BMPWIDTH_pegbox_menu_items)/2,
857 BMPHEIGHT_pegbox_menu_top,
858 BMPWIDTH_pegbox_menu_items,
859 (BMPHEIGHT_pegbox_menu_items/9));
860 }
861 else {
862 rb->lcd_bitmap_part(pegbox_menu_items, 0, 0,
863 BMPWIDTH_pegbox_menu_items,
864 (LCD_WIDTH-BMPWIDTH_pegbox_menu_items)/2,
865 BMPHEIGHT_pegbox_menu_top,
866 BMPWIDTH_pegbox_menu_items,
867 (BMPHEIGHT_pegbox_menu_items/9));
868 }
869 if (can_resume) {
870 if (loc == 1) {
871 rb->lcd_bitmap_part(pegbox_menu_items, 0,
872 (BMPHEIGHT_pegbox_menu_items/9)*3,
873 BMPWIDTH_pegbox_menu_items,
874 (LCD_WIDTH-BMPWIDTH_pegbox_menu_items)/2,
875 BMPHEIGHT_pegbox_menu_top+
876 (BMPHEIGHT_pegbox_menu_items/9),
877 BMPWIDTH_pegbox_menu_items,
878 (BMPHEIGHT_pegbox_menu_items/9));
879 }
880 else {
881 rb->lcd_bitmap_part(pegbox_menu_items, 0,
882 (BMPHEIGHT_pegbox_menu_items/9)*2,
883 BMPWIDTH_pegbox_menu_items,
884 (LCD_WIDTH-BMPWIDTH_pegbox_menu_items)/2,
885 BMPHEIGHT_pegbox_menu_top+
886 (BMPHEIGHT_pegbox_menu_items/9),
887 BMPWIDTH_pegbox_menu_items,
888 (BMPHEIGHT_pegbox_menu_items/9));
889 }
890 }
891 else {
892 rb->lcd_bitmap_part(pegbox_menu_items, 0,
893 (BMPHEIGHT_pegbox_menu_items/9)*4,
894 BMPWIDTH_pegbox_menu_items,
895 (LCD_WIDTH-BMPWIDTH_pegbox_menu_items)/2,
896 BMPHEIGHT_pegbox_menu_top+
897 (BMPHEIGHT_pegbox_menu_items/9),
898 BMPWIDTH_pegbox_menu_items,
899 (BMPHEIGHT_pegbox_menu_items/9));
900 }
901
902 if (loc==2) {
903 rb->lcd_bitmap_part(pegbox_menu_items, 0,
904 (BMPHEIGHT_pegbox_menu_items/9)*6,
905 BMPWIDTH_pegbox_menu_items,
906 (LCD_WIDTH-BMPWIDTH_pegbox_menu_items)/2,
907 BMPHEIGHT_pegbox_menu_top+
908 (BMPHEIGHT_pegbox_menu_items/9)*2,
909 BMPWIDTH_pegbox_menu_items,
910 (BMPHEIGHT_pegbox_menu_items/9));
911 }
912 else {
913 rb->lcd_bitmap_part(pegbox_menu_items, 0,
914 (BMPHEIGHT_pegbox_menu_items/9)*5,
915 BMPWIDTH_pegbox_menu_items,
916 (LCD_WIDTH-BMPWIDTH_pegbox_menu_items)/2,
917 BMPHEIGHT_pegbox_menu_top+
918 (BMPHEIGHT_pegbox_menu_items/9)*2,
919 BMPWIDTH_pegbox_menu_items,
920 (BMPHEIGHT_pegbox_menu_items/9));
921 }
922
923 if (loc==3) {
924 rb->lcd_bitmap_part(pegbox_menu_items, 0,
925 (BMPHEIGHT_pegbox_menu_items/9)*8,
926 BMPWIDTH_pegbox_menu_items,
927 (LCD_WIDTH-BMPWIDTH_pegbox_menu_items)/2,
928 BMPHEIGHT_pegbox_menu_top+
929 (BMPHEIGHT_pegbox_menu_items/9)*3,
930 BMPWIDTH_pegbox_menu_items,
931 (BMPHEIGHT_pegbox_menu_items/9));
932 }
933 else {
934 rb->lcd_bitmap_part(pegbox_menu_items, 0,
935 (BMPHEIGHT_pegbox_menu_items/9)*7,
936 BMPWIDTH_pegbox_menu_items,
937 (LCD_WIDTH-BMPWIDTH_pegbox_menu_items)/2,
938 BMPHEIGHT_pegbox_menu_top+
939 (BMPHEIGHT_pegbox_menu_items/9)*3,
940 BMPWIDTH_pegbox_menu_items,
941 (BMPHEIGHT_pegbox_menu_items/9));
942 }
943#else
944 unsigned int w,h;
945 rb->lcd_clear_display();
946 rb->lcd_getstringsize("PegBox", &w, &h);
947 rb->lcd_putsxy((LCD_WIDTH-w)/2, 0, "PegBox");
948 rb->lcd_putsxy((LCD_WIDTH)/4, 16, "New Game");
949 rb->lcd_putsxy((LCD_WIDTH)/4, 24, "Resume");
950 rb->lcd_putsxy((LCD_WIDTH)/4, 32, "Help");
951 rb->lcd_putsxy((LCD_WIDTH)/4, 40, "Quit");
952
953 if(!can_resume)
954 rb->lcd_drawline((LCD_WIDTH)/4, 28, (LCD_WIDTH)/4+30, 28);
955
956 rb->lcd_putsxy((LCD_WIDTH)/4-8, loc*8+16, "*");
957
958
959#endif
960 rb->snprintf(str, 28, "Start on level %d of %d", startlevel,
961 pb->highlevel);
962#if LCD_HEIGHT > 110
963 rb->lcd_putsxy(0, BMPHEIGHT_pegbox_menu_top+4*
964 (BMPHEIGHT_pegbox_menu_items/9)+8, str);
965#elif LCD_WIDTH > 112
966 rb->lcd_putsxy(0, LCD_HEIGHT - 8, str);
967#else
968 rb->lcd_puts_scroll(0, 7, str);
969#endif
970 rb->lcd_update();
971
972 /* handle menu button presses */
973 button = rb->button_get(true);
974
975 switch(button) {
976 case PEGBOX_SELECT: /* start playing */
977 if (loc == 0) {
978 breakout = true;
979 pb->level = startlevel;
980 load_level(pb);
981 }
982 else if (loc == 1 && can_resume) {
983 if(pb->save_exist)
984 {
985 rb->remove(SAVE_FILE);
986 pb->save_exist = false;
987 }
988 breakout = true;
989 }
990 else if (loc == 2)
991 display_text("How to Play\nTo beat each level, you must "
992 "destroy all of the pegs. If two like pegs are "
993 "pushed into each other they disappear except "
994 "for triangles which form a solid block and "
995 "crosses which allow you to choose a "
996 "replacement block.\n\n"
997 "Controls\n"
998#if LCD_HEIGHT > 64
999 RESTART_TEXT " to restart level\n"
1000 LVL_UP_TEXT " to go up a level\n"
1001 LVL_DOWN_TEXT " to go down a level\n"
1002 SAVE_TEXT " to save\n"
1003 QUIT_TEXT " to quit\n",true);
1004#else
1005 RESTART_TEXT ": restart\n"
1006 LVL_UP_TEXT ": level up\n"
1007 LVL_DOWN_TEXT " level down\n"
1008 SAVE_TEXT " save game\n"
1009 QUIT_TEXT " quit\n",true);
1010#endif
1011 else if (loc == 3)
1012 return PB_QUIT;
1013 break;
1014
1015 case PEGBOX_QUIT: /* quit program */
1016 return PB_QUIT;
1017
1018 case (PEGBOX_UP|BUTTON_REPEAT):
1019 case PEGBOX_UP:
1020 if (loc <= 0)
1021 loc = 3;
1022 else
1023 loc--;
1024 if (!can_resume && loc == 1) {
1025 loc = 0;
1026 }
1027 break;
1028
1029
1030 case (PEGBOX_DOWN|BUTTON_REPEAT):
1031 case PEGBOX_DOWN:
1032 if (loc >= 3)
1033 loc = 0;
1034 else
1035 loc++;
1036 if (!can_resume && loc == 1) {
1037 loc = 2;
1038 }
1039 break;
1040
1041 case (PEGBOX_RIGHT|BUTTON_REPEAT):
1042 case PEGBOX_RIGHT: /* increase starting level */
1043 if(startlevel >= pb->highlevel) {
1044 startlevel = 1;
1045 } else {
1046 startlevel++;
1047 }
1048 break;
1049
1050 case (PEGBOX_LEFT|BUTTON_REPEAT):
1051 case PEGBOX_LEFT: /* decrease starting level */
1052 if(startlevel <= 1) {
1053 startlevel = pb->highlevel;
1054 } else {
1055 startlevel--;
1056 }
1057 break;
1058
1059 default:
1060 if(rb->default_event_handler_ex(button, pegbox_callback,
1061 (void*) pb) == SYS_USB_CONNECTED)
1062 return PB_USB;
1063 break;
1064 }
1065
1066 }
1067 draw_board(pb);
1068
1069 return 0;
1070}
1071
1072/*****************************************************************************
1073* pegbox() is the main game subroutine, it returns the final game status.
1074******************************************************************************/
1075static int pegbox(struct game_context* pb) {
1076 int temp_var;
1077
1078 /********************
1079 * menu *
1080 ********************/
1081 temp_var = pegbox_menu(pb);
1082 if (temp_var == PB_QUIT || temp_var == PB_USB)
1083 return temp_var;
1084
1085 while (true) {
1086 temp_var = rb->button_get(true);
1087 switch(temp_var){
1088 case PEGBOX_LEFT: /* move cursor left */
1089 case (PEGBOX_LEFT|BUTTON_REPEAT):
1090 move_player(pb, -1, 0);
1091 break;
1092
1093 case PEGBOX_RIGHT: /* move cursor right */
1094 case (PEGBOX_RIGHT|BUTTON_REPEAT):
1095 move_player(pb, 1, 0);
1096 break;
1097
1098 case PEGBOX_DOWN: /* move cursor down */
1099 case (PEGBOX_DOWN|BUTTON_REPEAT):
1100 move_player(pb, 0, 1);
1101 break;
1102
1103 case PEGBOX_UP: /* move cursor up */
1104 case (PEGBOX_UP|BUTTON_REPEAT):
1105 move_player(pb, 0, -1);
1106 break;
1107
1108 case PEGBOX_SAVE: /* save and end game */
1109 rb->splash(HZ, "Saving game...");
1110 pegbox_savegame(pb);
1111 /* fall through to PEGBOX_QUIT */
1112
1113 case PEGBOX_QUIT:
1114 return PB_END;
1115
1116 case PEGBOX_RESTART:
1117 load_level(pb);
1118 draw_board(pb);
1119 break;
1120
1121 case PEGBOX_LVL_UP:
1122 if(pb->level < pb->highlevel) {
1123 pb->level++;
1124 load_level(pb);
1125 draw_board(pb);
1126 }
1127 break;
1128
1129 case PEGBOX_LVL_DOWN:
1130 if(pb->level > 1) {
1131 pb->level--;
1132 load_level(pb);
1133 draw_board(pb);
1134 }
1135 break;
1136 }
1137
1138 if(pb->num_left == 0) {
1139 rb->splash(HZ*2, "Nice Pegging!");
1140 if(pb->level == NUM_LEVELS) {
1141 draw_board(pb);
1142 rb->splash(HZ*2, "You Won!");
1143 break;
1144 }
1145 else {
1146 pb->level++;
1147 load_level(pb);
1148 draw_board(pb);
1149 }
1150
1151 if(pb->level > pb->highlevel)
1152 pb->highlevel = pb->level;
1153
1154 }
1155 }
1156
1157 return PLUGIN_OK;
1158}
1159
1160
1161/*****************************************************************************
1162* plugin entry point.
1163******************************************************************************/
1164enum plugin_status plugin_start(struct plugin_api* api, void* parameter) {
1165 bool exit = false;
1166 struct game_context pb;
1167
1168 (void)parameter;
1169 rb = api;
1170
1171 rb->lcd_setfont(FONT_SYSFIXED);
1172#ifdef HAVE_LCD_COLOR
1173 rb->lcd_set_foreground(LCD_WHITE);
1174 rb->lcd_set_background(BG_COLOR);
1175#endif
1176
1177 rb->splash(0, "Loading...");
1178 pegbox_loaddata(&pb);
1179 pb.save_exist = pegbox_loadgame(&pb);
1180 pb.num_left = 0;
1181
1182 rb->lcd_clear_display();
1183
1184
1185 while(!exit) {
1186 switch(pegbox(&pb)){
1187 case PB_END:
1188 break;
1189
1190 case PB_USB:
1191 rb->lcd_setfont(FONT_UI);
1192 return PLUGIN_USB_CONNECTED;
1193
1194 case PB_QUIT:
1195 rb->splash(HZ, "Saving data...");
1196 pegbox_savedata(&pb);
1197 exit = true;
1198 break;
1199
1200 default:
1201 break;
1202 }
1203 }
1204
1205 rb->lcd_setfont(FONT_UI);
1206 return PLUGIN_OK;
1207}