diff options
Diffstat (limited to 'apps')
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 | |||
48 | nim,games | 48 | nim,games |
49 | oscilloscope,demos | 49 | oscilloscope,demos |
50 | pacbox,games | 50 | pacbox,games |
51 | pegbox,games | ||
51 | pictureflow,demos | 52 | pictureflow,demos |
52 | plasma,demos | 53 | plasma,demos |
53 | pong,games | 54 | pong,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 | |||
67 | jewels.c | 67 | jewels.c |
68 | minesweeper.c | 68 | minesweeper.c |
69 | oscilloscope.c | 69 | oscilloscope.c |
70 | pegbox.c | ||
70 | pong.c | 71 | pong.c |
71 | sliding_puzzle.c | 72 | sliding_puzzle.c |
72 | snake.c | 73 | snake.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 | |||
321 | minesweeper_tiles.8x8x1.bmp | 321 | minesweeper_tiles.8x8x1.bmp |
322 | #endif | 322 | #endif |
323 | 323 | ||
324 | /* PegBox */ | ||
325 | #if (LCD_WIDTH >= 320) && (LCD_HEIGHT >= 240) && (LCD_DEPTH >= 16) | ||
326 | pegbox_menu_top.320x68x16.bmp | ||
327 | pegbox_menu_items.120x32x16.bmp | ||
328 | pegbox_pieces.24x24x16.bmp | ||
329 | pegbox_header.320x40x16.bmp | ||
330 | #elif (LCD_WIDTH >= 240) && (LCD_HEIGHT >= 192) && (LCD_DEPTH >= 16) | ||
331 | pegbox_menu_top.240x80x16.bmp | ||
332 | pegbox_menu_items.120x32x16.bmp | ||
333 | pegbox_pieces.16x16x16.bmp | ||
334 | pegbox_header.240x40x16.bmp | ||
335 | #elif (LCD_WIDTH >= 220) && (LCD_HEIGHT >= 176) && (LCD_DEPTH >= 16) | ||
336 | pegbox_menu_top.220x60x16.bmp | ||
337 | pegbox_menu_items.70x20x16.bmp | ||
338 | pegbox_pieces.16x16x16.bmp | ||
339 | pegbox_header.220x40x16.bmp | ||
340 | #elif (LCD_WIDTH >= 176) && (LCD_HEIGHT >= 132) && (LCD_DEPTH >= 16) | ||
341 | pegbox_menu_top.176x46x16.bmp | ||
342 | pegbox_menu_items.60x17x16.bmp | ||
343 | pegbox_pieces.12x12x16.bmp | ||
344 | pegbox_header.176x28x16.bmp | ||
345 | #elif (LCD_WIDTH >= 160) && (LCD_HEIGHT >= 128) && (LCD_DEPTH >= 16) | ||
346 | pegbox_menu_top.160x42x16.bmp | ||
347 | pegbox_menu_items.60x17x16.bmp | ||
348 | pegbox_pieces.12x12x16.bmp | ||
349 | pegbox_header.160x24x16.bmp | ||
350 | #elif (LCD_WIDTH >= 160) && (LCD_HEIGHT >= 128) && (LCD_DEPTH > 1) | ||
351 | pegbox_menu_top.160x42x4.bmp | ||
352 | pegbox_menu_items.60x17x4.bmp | ||
353 | pegbox_pieces.12x12x4.bmp | ||
354 | pegbox_header.160x24x4.bmp | ||
355 | #elif (LCD_WIDTH >= 138) && (LCD_HEIGHT >= 110) && (LCD_DEPTH > 1) | ||
356 | pegbox_menu_top.138x34x4.bmp | ||
357 | pegbox_menu_items.60x17x4.bmp | ||
358 | pegbox_pieces.8x8x1.bmp | ||
359 | pegbox_header.138x28x4.bmp | ||
360 | #elif (LCD_WIDTH >= 160) && (LCD_HEIGHT >= 128) && (LCD_DEPTH == 1) | ||
361 | pegbox_menu_top.160x42x1.bmp | ||
362 | pegbox_menu_items.60x17x1.bmp | ||
363 | pegbox_pieces.12x12x1.bmp | ||
364 | pegbox_header.160x24x1.bmp | ||
365 | #else | ||
366 | pegbox_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) |
326 | rockblox_background.320x240x16.bmp | 371 | rockblox_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 | |||
28 | static struct plugin_api* rb; | ||
29 | |||
30 | PLUGIN_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 | |||
298 | struct 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 | |||
308 | char 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 | ******************************************************************************/ | ||
464 | static 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 | ******************************************************************************/ | ||
566 | static 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 | ******************************************************************************/ | ||
637 | static 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 | ******************************************************************************/ | ||
649 | static 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 | ******************************************************************************/ | ||
688 | static 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 | ******************************************************************************/ | ||
750 | static 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 | ******************************************************************************/ | ||
776 | static 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 | ******************************************************************************/ | ||
789 | static 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 | ******************************************************************************/ | ||
814 | static 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 | ******************************************************************************/ | ||
828 | static 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 | ******************************************************************************/ | ||
837 | static 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 | ******************************************************************************/ | ||
1075 | static 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 | ******************************************************************************/ | ||
1164 | enum 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 | } | ||