summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
authorDave Chapman <dave@dchapman.com>2006-01-23 16:00:06 +0000
committerDave Chapman <dave@dchapman.com>2006-01-23 16:00:06 +0000
commit06e25c8c463a965059a1b3f85ee64616d6594f77 (patch)
tree6d00d0d5dbecf9d827aa0f06df21af0b0c014a49 /apps
parent440c7ea5fc05df79a379d46a8aeecad4db892ad1 (diff)
downloadrockbox-06e25c8c463a965059a1b3f85ee64616d6594f77.tar.gz
rockbox-06e25c8c463a965059a1b3f85ee64616d6594f77.zip
BrickMania game (currently only for H300 and iPod Color) from Ben Basha (Paprica) with modifications by me to use external bitmaps and make the code more (but not yet completely) compliant with Rockbox coding guidelines
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@8428 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps')
-rw-r--r--apps/plugins/SOURCES4
-rw-r--r--apps/plugins/bitmaps/native/SOURCES20
-rw-r--r--apps/plugins/bitmaps/native/brickmania_ball.220x176x16.bmpbin0 -> 134 bytes
-rw-r--r--apps/plugins/bitmaps/native/brickmania_bricks.220x176x16.bmpbin0 -> 3414 bytes
-rw-r--r--apps/plugins/bitmaps/native/brickmania_gameover.220x176x16.bmpbin0 -> 17318 bytes
-rw-r--r--apps/plugins/bitmaps/native/brickmania_help.220x176x16.bmpbin0 -> 2182 bytes
-rw-r--r--apps/plugins/bitmaps/native/brickmania_menu_bg.220x176x16.bmpbin0 -> 116216 bytes
-rw-r--r--apps/plugins/bitmaps/native/brickmania_no_resume.220x176x16.bmpbin0 -> 4950 bytes
-rw-r--r--apps/plugins/bitmaps/native/brickmania_pads.220x176x16.bmpbin0 -> 1854 bytes
-rw-r--r--apps/plugins/bitmaps/native/brickmania_powerups.220x176x16.bmpbin0 -> 1014 bytes
-rw-r--r--apps/plugins/bitmaps/native/brickmania_quit.220x176x16.bmpbin0 -> 1954 bytes
-rw-r--r--apps/plugins/bitmaps/native/brickmania_resume.220x176x16.bmpbin0 -> 4950 bytes
-rw-r--r--apps/plugins/bitmaps/native/brickmania_sel_help.220x176x16.bmpbin0 -> 2182 bytes
-rw-r--r--apps/plugins/bitmaps/native/brickmania_sel_quit.220x176x16.bmpbin0 -> 1954 bytes
-rw-r--r--apps/plugins/bitmaps/native/brickmania_sel_resume.220x176x16.bmpbin0 -> 4950 bytes
-rw-r--r--apps/plugins/bitmaps/native/brickmania_sel_start.220x176x16.bmpbin0 -> 6774 bytes
-rw-r--r--apps/plugins/bitmaps/native/brickmania_start.220x176x16.bmpbin0 -> 6774 bytes
-rw-r--r--apps/plugins/brickmania.c1113
18 files changed, 1137 insertions, 0 deletions
diff --git a/apps/plugins/SOURCES b/apps/plugins/SOURCES
index 98ffcc2be8..0b9f68bc0b 100644
--- a/apps/plugins/SOURCES
+++ b/apps/plugins/SOURCES
@@ -27,6 +27,10 @@ plasma.c
27#endif 27#endif
28bejeweled.c 28bejeweled.c
29bounce.c 29bounce.c
30/* H300 and iPod Color/Video only */
31#if (LCD_WIDTH >= 220) && (LCD_HEIGHT >= 176) && (LCD_DEPTH == 16)
32brickmania.c
33#endif
30calculator.c 34calculator.c
31chip8.c 35chip8.c
32demystify.c 36demystify.c
diff --git a/apps/plugins/bitmaps/native/SOURCES b/apps/plugins/bitmaps/native/SOURCES
index 140df739a9..ecd8334f3e 100644
--- a/apps/plugins/bitmaps/native/SOURCES
+++ b/apps/plugins/bitmaps/native/SOURCES
@@ -15,4 +15,24 @@ sudoku_normal.220x176x16.bmp
15sudoku_inverse.220x176x16.bmp 15sudoku_inverse.220x176x16.bmp
16#endif 16#endif
17 17
18/* Brickmania */
19
20#if (LCD_WIDTH >= 220) && (LCD_HEIGHT >= 176) && (LCD_DEPTH == 16)
21brickmania_ball.220x176x16.bmp
22brickmania_bricks.220x176x16.bmp
23brickmania_gameover.220x176x16.bmp
24brickmania_help.220x176x16.bmp
25brickmania_menu_bg.220x176x16.bmp
26brickmania_no_resume.220x176x16.bmp
27brickmania_pads.220x176x16.bmp
28brickmania_powerups.220x176x16.bmp
29brickmania_quit.220x176x16.bmp
30brickmania_resume.220x176x16.bmp
31brickmania_sel_help.220x176x16.bmp
32brickmania_sel_resume.220x176x16.bmp
33brickmania_sel_quit.220x176x16.bmp
34brickmania_sel_start.220x176x16.bmp
35brickmania_start.220x176x16.bmp
36#endif
37
18#endif /* HAVE_LCD_BITMAP */ 38#endif /* HAVE_LCD_BITMAP */
diff --git a/apps/plugins/bitmaps/native/brickmania_ball.220x176x16.bmp b/apps/plugins/bitmaps/native/brickmania_ball.220x176x16.bmp
new file mode 100644
index 0000000000..97da97f4a7
--- /dev/null
+++ b/apps/plugins/bitmaps/native/brickmania_ball.220x176x16.bmp
Binary files differ
diff --git a/apps/plugins/bitmaps/native/brickmania_bricks.220x176x16.bmp b/apps/plugins/bitmaps/native/brickmania_bricks.220x176x16.bmp
new file mode 100644
index 0000000000..1cf951b16f
--- /dev/null
+++ b/apps/plugins/bitmaps/native/brickmania_bricks.220x176x16.bmp
Binary files differ
diff --git a/apps/plugins/bitmaps/native/brickmania_gameover.220x176x16.bmp b/apps/plugins/bitmaps/native/brickmania_gameover.220x176x16.bmp
new file mode 100644
index 0000000000..d004433b5f
--- /dev/null
+++ b/apps/plugins/bitmaps/native/brickmania_gameover.220x176x16.bmp
Binary files differ
diff --git a/apps/plugins/bitmaps/native/brickmania_help.220x176x16.bmp b/apps/plugins/bitmaps/native/brickmania_help.220x176x16.bmp
new file mode 100644
index 0000000000..4798886090
--- /dev/null
+++ b/apps/plugins/bitmaps/native/brickmania_help.220x176x16.bmp
Binary files differ
diff --git a/apps/plugins/bitmaps/native/brickmania_menu_bg.220x176x16.bmp b/apps/plugins/bitmaps/native/brickmania_menu_bg.220x176x16.bmp
new file mode 100644
index 0000000000..f5765b84ca
--- /dev/null
+++ b/apps/plugins/bitmaps/native/brickmania_menu_bg.220x176x16.bmp
Binary files differ
diff --git a/apps/plugins/bitmaps/native/brickmania_no_resume.220x176x16.bmp b/apps/plugins/bitmaps/native/brickmania_no_resume.220x176x16.bmp
new file mode 100644
index 0000000000..81b3cf83b8
--- /dev/null
+++ b/apps/plugins/bitmaps/native/brickmania_no_resume.220x176x16.bmp
Binary files differ
diff --git a/apps/plugins/bitmaps/native/brickmania_pads.220x176x16.bmp b/apps/plugins/bitmaps/native/brickmania_pads.220x176x16.bmp
new file mode 100644
index 0000000000..5bd1e5dc57
--- /dev/null
+++ b/apps/plugins/bitmaps/native/brickmania_pads.220x176x16.bmp
Binary files differ
diff --git a/apps/plugins/bitmaps/native/brickmania_powerups.220x176x16.bmp b/apps/plugins/bitmaps/native/brickmania_powerups.220x176x16.bmp
new file mode 100644
index 0000000000..aadd37095c
--- /dev/null
+++ b/apps/plugins/bitmaps/native/brickmania_powerups.220x176x16.bmp
Binary files differ
diff --git a/apps/plugins/bitmaps/native/brickmania_quit.220x176x16.bmp b/apps/plugins/bitmaps/native/brickmania_quit.220x176x16.bmp
new file mode 100644
index 0000000000..262650544f
--- /dev/null
+++ b/apps/plugins/bitmaps/native/brickmania_quit.220x176x16.bmp
Binary files differ
diff --git a/apps/plugins/bitmaps/native/brickmania_resume.220x176x16.bmp b/apps/plugins/bitmaps/native/brickmania_resume.220x176x16.bmp
new file mode 100644
index 0000000000..fd8753f57d
--- /dev/null
+++ b/apps/plugins/bitmaps/native/brickmania_resume.220x176x16.bmp
Binary files differ
diff --git a/apps/plugins/bitmaps/native/brickmania_sel_help.220x176x16.bmp b/apps/plugins/bitmaps/native/brickmania_sel_help.220x176x16.bmp
new file mode 100644
index 0000000000..c738b1f68c
--- /dev/null
+++ b/apps/plugins/bitmaps/native/brickmania_sel_help.220x176x16.bmp
Binary files differ
diff --git a/apps/plugins/bitmaps/native/brickmania_sel_quit.220x176x16.bmp b/apps/plugins/bitmaps/native/brickmania_sel_quit.220x176x16.bmp
new file mode 100644
index 0000000000..58ee4a3f77
--- /dev/null
+++ b/apps/plugins/bitmaps/native/brickmania_sel_quit.220x176x16.bmp
Binary files differ
diff --git a/apps/plugins/bitmaps/native/brickmania_sel_resume.220x176x16.bmp b/apps/plugins/bitmaps/native/brickmania_sel_resume.220x176x16.bmp
new file mode 100644
index 0000000000..9b2c144714
--- /dev/null
+++ b/apps/plugins/bitmaps/native/brickmania_sel_resume.220x176x16.bmp
Binary files differ
diff --git a/apps/plugins/bitmaps/native/brickmania_sel_start.220x176x16.bmp b/apps/plugins/bitmaps/native/brickmania_sel_start.220x176x16.bmp
new file mode 100644
index 0000000000..d9265863b0
--- /dev/null
+++ b/apps/plugins/bitmaps/native/brickmania_sel_start.220x176x16.bmp
Binary files differ
diff --git a/apps/plugins/bitmaps/native/brickmania_start.220x176x16.bmp b/apps/plugins/bitmaps/native/brickmania_start.220x176x16.bmp
new file mode 100644
index 0000000000..8d5bfb2ec9
--- /dev/null
+++ b/apps/plugins/bitmaps/native/brickmania_start.220x176x16.bmp
Binary files differ
diff --git a/apps/plugins/brickmania.c b/apps/plugins/brickmania.c
new file mode 100644
index 0000000000..eec290f507
--- /dev/null
+++ b/apps/plugins/brickmania.c
@@ -0,0 +1,1113 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2005 Ben Basha (Paprica)
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
20#include "plugin.h"
21#include "configfile.h" /* Part of libplugin */
22
23PLUGIN_HEADER
24
25#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD)
26
27#define QUIT BUTTON_OFF
28#define LEFT BUTTON_LEFT
29#define RIGHT BUTTON_RIGHT
30#define SELECT BUTTON_SELECT
31#define UP BUTTON_UP
32#define DOWN BUTTON_DOWN
33
34#elif (CONFIG_KEYPAD == IPOD_4G_PAD)
35
36#define QUIT BUTTON_MENU
37#define LEFT BUTTON_LEFT
38#define RIGHT BUTTON_RIGHT
39#define SELECT BUTTON_SELECT
40#define UP BUTTON_SCROLL_BACK
41#define DOWN BUTTON_SCROLL_FWD
42
43#else
44#error Unsupported keypad
45#endif
46
47static struct plugin_api* rb;
48
49/* External bitmaps */
50extern const fb_data brickmania_ball[];
51extern const fb_data brickmania_gameover[];
52extern const fb_data brickmania_help[];
53extern const fb_data brickmania_menu_bg[];
54extern const fb_data brickmania_no_resume[];
55extern const fb_data brickmania_quit[];
56extern const fb_data brickmania_resume[];
57extern const fb_data brickmania_sel_help[];
58extern const fb_data brickmania_sel_quit[];
59extern const fb_data brickmania_sel_resume[];
60extern const fb_data brickmania_sel_start[];
61extern const fb_data brickmania_start[];
62
63/* normal, glue, fire */
64extern const fb_data brickmania_pads[];
65
66/* +life, -life, glue, fire, normal */
67extern const fb_data brickmania_powerups[];
68
69/* purple, red, blue, pink, green, yellow orange */
70extern const fb_data brickmania_bricks[];
71
72/* TO DO: This needs adjusting correctly for larger than 220x176 LCDS */
73#if (LCD_WIDTH >= 220) && (LCD_HEIGHT >= 176)
74#define PAD_WIDTH 40
75#define PAD_HEIGHT 5
76#define PAD_POS_Y LCD_HEIGHT - 7
77#define BRICK_HEIGHT 8
78#define BRICK_WIDTH 20
79#define BALL 5
80
81#define BMPHEIGHT_help 19
82#define BMPWIDTH_help 37
83
84#define BMPHEIGHT_sel_help 19
85#define BMPWIDTH_sel_help 37
86
87#define BMPHEIGHT_resume 17
88#define BMPWIDTH_resume 96
89
90#define BMPHEIGHT_no_resume 17
91#define BMPWIDTH_no_resume 96
92
93#define BMPHEIGHT_quit 19
94#define BMPWIDTH_quit 33
95
96#define BMPHEIGHT_sel_quit 19
97#define BMPWIDTH_sel_quit 33
98
99#define BMPHEIGHT_sel_resume 17
100#define BMPWIDTH_sel_resume 96
101
102#define BMPHEIGHT_sel_start 20
103#define BMPWIDTH_sel_start 112
104
105#define BMPHEIGHT_start 20
106#define BMPWIDTH_start 112
107
108#define BMPHEIGHT_powerup 6
109#define BMPWIDTH_powerup 10
110
111#else
112#error Unsupported LCD Size
113#endif
114
115int levels_num = 29;
116
117static unsigned char levels[29][8][10] = {
118 { /* level1 */
119 {0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1},
120 {0x2,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2},
121 {0x0,0x2,0x1,0x0,0x0,0x0,0x0,0x1,0x2,0x0},
122 {0x0,0x0,0x2,0x1,0x0,0x0,0x1,0x2,0x0,0x0},
123 {0x0,0x0,0x0,0x2,0x1,0x1,0x2,0x0,0x0,0x0},
124 {0x7,0x0,0x0,0x7,0x2,0x2,0x7,0x0,0x0,0x7},
125 {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0},
126 {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}
127 },
128 { /* level2 */
129 {0x0,0x0,0x7,0x7,0x1,0x1,0x7,0x7,0x0,0x0},
130 {0x0,0x1,0x0,0x0,0x1,0x1,0x0,0x0,0x1,0x0},
131 {0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1},
132 {0x1,0x1,0x1,0x1,0x0,0x0,0x1,0x1,0x1,0x1},
133 {0x1,0x1,0x2,0x1,0x0,0x0,0x1,0x2,0x1,0x1},
134 {0x1,0x2,0x0,0x2,0x2,0x2,0x2,0x0,0x2,0x1},
135 {0x0,0x1,0x2,0x0,0x0,0x0,0x0,0x2,0x1,0x0},
136 {0x0,0x0,0x1,0x2,0x2,0x2,0x2,0x1,0x0,0x0}
137 },
138 { /* level3 */
139 {0x3,0x3,0x3,0x3,0x0,0x0,0x2,0x2,0x2,0x2},
140 {0x3,0x3,0x3,0x3,0x0,0x0,0x2,0x2,0x2,0x2},
141 {0x3,0x3,0x3,0x3,0x0,0x0,0x2,0x2,0x2,0x2},
142 {0x0,0x0,0x0,0x0,0x7,0x7,0x0,0x0,0x0,0x0},
143 {0x0,0x0,0x0,0x0,0x7,0x7,0x0,0x0,0x0,0x0},
144 {0x5,0x5,0x5,0x5,0x0,0x0,0x6,0x6,0x6,0x6},
145 {0x5,0x5,0x5,0x5,0x0,0x0,0x6,0x6,0x6,0x6},
146 {0x5,0x5,0x5,0x5,0x0,0x0,0x6,0x6,0x6,0x6}
147 },
148 { /* level4 */
149 {0x0,0x0,0x0,0x7,0x7,0x7,0x7,0x0,0x0,0x0},
150 {0x0,0x0,0x0,0x7,0x7,0x7,0x7,0x0,0x0,0x0},
151 {0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2},
152 {0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2},
153 {0x6,0x6,0x0,0x2,0x2,0x2,0x2,0x0,0x6,0x6},
154 {0x0,0x0,0x1,0x1,0x1,0x1,0x1,0x1,0x0,0x0},
155 {0x0,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x0},
156 {0x1,0x1,0x1,0x1,0x0,0x0,0x1,0x1,0x1,0x1}
157 },
158 { /* level5 */
159 {0x1,0x0,0x2,0x2,0x0,0x3,0x3,0x0,0x4,0x4},
160 {0x0,0x2,0x2,0x0,0x3,0x3,0x0,0x4,0x4,0x0},
161 {0x2,0x2,0x0,0x3,0x3,0x0,0x4,0x4,0x0,0x5},
162 {0x2,0x0,0x3,0x3,0x0,0x4,0x4,0x0,0x5,0x5},
163 {0x0,0x3,0x3,0x0,0x4,0x4,0x0,0x5,0x5,0x0},
164 {0x3,0x3,0x0,0x4,0x4,0x0,0x5,0x5,0x0,0x6},
165 {0x3,0x0,0x4,0x4,0x0,0x5,0x5,0x0,0x6,0x6},
166 {0x0,0x4,0x4,0x0,0x5,0x5,0x0,0x6,0x6,0x0}
167 },
168 { /* level6 */
169 {0x0,0x1,0x3,0x7,0x7,0x7,0x7,0x3,0x1,0x0},
170 {0x3,0x1,0x3,0x7,0x0,0x0,0x7,0x3,0x1,0x3},
171 {0x3,0x1,0x3,0x7,0x7,0x7,0x7,0x3,0x1,0x3},
172 {0x0,0x0,0x0,0x2,0x2,0x2,0x2,0x0,0x0,0x0},
173 {0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5},
174 {0x5,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x5},
175 {0x0,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x0},
176 {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}
177 },
178 { /* level7 */
179 {0x0,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x0},
180 {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0},
181 {0x6,0x0,0x0,0x2,0x2,0x2,0x2,0x0,0x0,0x6},
182 {0x6,0x0,0x0,0x2,0x2,0x2,0x2,0x0,0x0,0x6},
183 {0x6,0x6,0x6,0x0,0x0,0x0,0x0,0x6,0x6,0x6},
184 {0x0,0x0,0x0,0x1,0x1,0x1,0x1,0x0,0x0,0x0},
185 {0x0,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x0},
186 {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}
187 },
188 { /* level8 */
189 {0x0,0x7,0x7,0x7,0x7,0x7,0x7,0x7,0x7,0x0},
190 {0x0,0x0,0x0,0x4,0x0,0x0,0x4,0x0,0x0,0x0},
191 {0x6,0x6,0x0,0x2,0x2,0x2,0x2,0x0,0x6,0x6},
192 {0x0,0x0,0x2,0x2,0x2,0x2,0x2,0x2,0x0,0x0},
193 {0x0,0x6,0x6,0x0,0x0,0x0,0x0,0x6,0x6,0x0},
194 {0x0,0x0,0x0,0x5,0x5,0x5,0x5,0x0,0x0,0x0},
195 {0x0,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x0},
196 {0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5}
197 },
198 { /* level9 */
199 {0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2},
200 {0x2,0x3,0x0,0x0,0x0,0x0,0x0,0x0,0x3,0x2},
201 {0x2,0x0,0x3,0x0,0x1,0x1,0x0,0x3,0x0,0x2},
202 {0x2,0x0,0x0,0x1,0x0,0x0,0x1,0x0,0x0,0x2},
203 {0x2,0x0,0x1,0x0,0x3,0x3,0x0,0x1,0x0,0x2},
204 {0x2,0x0,0x0,0x1,0x0,0x0,0x1,0x0,0x0,0x2},
205 {0x2,0x2,0x0,0x0,0x1,0x1,0x0,0x0,0x2,0x2},
206 {0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2}
207 },
208 { /* level10 */
209 {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0},
210 {0x0,0x5,0x0,0x5,0x0,0x5,0x0,0x5,0x0,0x5},
211 {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0},
212 {0x0,0x0,0x0,0x0,0x1,0x1,0x0,0x0,0x0,0x0},
213 {0x0,0x0,0x0,0x4,0x1,0x1,0x4,0x0,0x0,0x0},
214 {0x0,0x0,0x3,0x4,0x1,0x1,0x4,0x3,0x0,0x0},
215 {0x0,0x2,0x3,0x4,0x1,0x1,0x4,0x3,0x2,0x0},
216 {0x1,0x2,0x3,0x4,0x1,0x1,0x4,0x3,0x2,0x1}
217 },
218 { /* level11 */
219 {0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3},
220 {0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x2},
221 {0x2,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x2},
222 {0x2,0x0,0x0,0x0,0x7,0x7,0x0,0x0,0x0,0x2},
223 {0x2,0x0,0x0,0x7,0x7,0x7,0x7,0x0,0x0,0x2},
224 {0x0,0x0,0x0,0x1,0x0,0x0,0x1,0x0,0x0,0x0},
225 {0x0,0x2,0x0,0x1,0x0,0x0,0x1,0x0,0x2,0x0},
226 {0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5}
227 },
228 { /* level 12 */
229 {0x2,0x1,0x3,0x1,0x0,0x0,0x1,0x3,0x1,0x2},
230 {0x1,0x1,0x1,0x1,0x0,0x0,0x1,0x1,0x1,0x1},
231 {0x1,0x1,0x1,0x0,0x1,0x1,0x0,0x1,0x1,0x1},
232 {0x0,0x1,0x0,0x1,0x6,0x6,0x1,0x0,0x1,0x0},
233 {0x0,0x0,0x1,0x1,0x6,0x6,0x1,0x1,0x0,0x0},
234 {0x1,0x1,0x1,0x7,0x0,0x0,0x7,0x1,0x1,0x1},
235 {0x1,0x1,0x7,0x1,0x0,0x0,0x1,0x7,0x1,0x1},
236 {0x2,0x2,0x0,0x2,0x2,0x2,0x2,0x0,0x2,0x2}
237 },
238 {/* levell13 */
239 {0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2},
240 {0x2,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x2},
241 {0x2,0x0,0x2,0x2,0x2,0x2,0x2,0x2,0x0,0x2},
242 {0x2,0x0,0x2,0x3,0x3,0x3,0x3,0x3,0x0,0x2},
243 {0x2,0x0,0x2,0x4,0x4,0x4,0x4,0x4,0x0,0x2},
244 {0x2,0x0,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2},
245 {0x2,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0},
246 {0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2}
247 },
248 {/* level14 */
249 {0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1},
250 {0x4,0x4,0x4,0x4,0x2,0x2,0x4,0x4,0x4,0x4},
251 {0x4,0x0,0x0,0x0,0x2,0x2,0x0,0x0,0x0,0x4},
252 {0x4,0x0,0x0,0x2,0x3,0x3,0x2,0x0,0x0,0x4},
253 {0x4,0x0,0x2,0x3,0x3,0x3,0x3,0x2,0x0,0x4},
254 {0x4,0x0,0x2,0x2,0x2,0x2,0x2,0x2,0x0,0x4},
255 {0x4,0x0,0x6,0x1,0x5,0x5,0x1,0x6,0x0,0x4},
256 {0x4,0x6,0x1,0x1,0x5,0x5,0x1,0x1,0x6,0x4}
257 },
258 {/* level 15 */
259 {0x4,0x4,0x4,0x4,0x4,0x3,0x3,0x3,0x3,0x3},
260 {0x2,0x2,0x1,0x1,0x1,0x1,0x1,0x5,0x0,0x0},
261 {0x2,0x2,0x1,0x1,0x1,0x0,0x1,0x6,0x0,0x0},
262 {0x2,0x1,0x1,0x2,0x1,0x1,0x1,0x5,0x0,0x0},
263 {0x2,0x1,0x2,0x2,0x2,0x1,0x1,0x6,0x0,0x0},
264 {0x2,0x1,0x2,0x2,0x2,0x1,0x3,0x5,0x3,0x0},
265 {0x2,0x1,0x1,0x2,0x1,0x1,0x1,0x6,0x0,0x0},
266 {0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2}
267 },
268 {/* level 16 (Rockbox) by ts-x */
269 {0x2,0x2,0x3,0x3,0x3,0x4,0x4,0x5,0x0,0x5},
270 {0x2,0x0,0x3,0x0,0x3,0x4,0x0,0x5,0x5,0x0},
271 {0x2,0x0,0x3,0x3,0x3,0x4,0x4,0x5,0x0,0x5},
272 {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0},
273 {0x6,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0},
274 {0x7,0x7,0x7,0x1,0x1,0x1,0x2,0x0,0x2,0x0},
275 {0x7,0x0,0x7,0x1,0x0,0x1,0x0,0x2,0x0,0x0},
276 {0x7,0x7,0x7,0x1,0x1,0x1,0x2,0x0,0x2,0x0}
277 },
278 {/* level 17 (Alien) by ts-x */
279 {0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1},
280 {0x2,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x2},
281 {0x1,0x0,0x0,0x0,0x1,0x1,0x0,0x0,0x0,0x1},
282 {0x2,0x0,0x1,0x1,0x1,0x1,0x1,0x1,0x0,0x2},
283 {0x1,0x0,0x1,0x2,0x2,0x2,0x2,0x1,0x0,0x1},
284 {0x2,0x0,0x0,0x1,0x2,0x2,0x1,0x0,0x0,0x2},
285 {0x2,0x1,0x0,0x0,0x1,0x1,0x0,0x0,0x1,0x2},
286 {0x2,0x2,0x1,0x0,0x1,0x1,0x0,0x1,0x2,0x2}
287 },
288 {/* level 18 (Tetris) by ts-x */
289 {0x0,0x2,0x0,0x0,0x3,0x4,0x0,0x2,0x2,0x0},
290 {0x0,0x2,0x7,0x0,0x3,0x4,0x0,0x2,0x2,0x0},
291 {0x2,0x2,0x7,0x0,0x3,0x4,0x0,0x6,0x2,0x2},
292 {0x2,0x2,0x7,0x7,0x3,0x4,0x0,0x6,0x2,0x2},
293 {0x2,0x1,0x7,0x7,0x3,0x4,0x4,0x6,0x5,0x5},
294 {0x2,0x1,0x0,0x7,0x3,0x4,0x4,0x6,0x5,0x5},
295 {0x1,0x1,0x1,0x7,0x3,0x0,0x6,0x6,0x5,0x5},
296 {0x1,0x1,0x1,0x0,0x3,0x0,0x6,0x6,0x5,0x5}
297 },
298 { /* level 19 (Stalactites) by ts-x */
299 {0x5,0x2,0x6,0x3,0x4,0x7,0x5,0x3,0x1,0x2},
300 {0x5,0x2,0x6,0x3,0x4,0x7,0x5,0x3,0x1,0x2},
301 {0x5,0x0,0x6,0x3,0x4,0x7,0x5,0x0,0x1,0x2},
302 {0x5,0x2,0x6,0x3,0x4,0x0,0x5,0x3,0x1,0x2},
303 {0x5,0x0,0x6,0x0,0x4,0x7,0x5,0x0,0x1,0x0},
304 {0x5,0x0,0x0,0x3,0x4,0x0,0x0,0x0,0x1,0x2},
305 {0x0,0x0,0x6,0x0,0x0,0x0,0x5,0x0,0x0,0x0},
306 {0x5,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x1,0x0}
307 },
308 { /* level 20 (Maze) by ts-x */
309 {0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1},
310 {0x1,0x0,0x0,0x3,0x0,0x0,0x3,0x1,0x1,0x1},
311 {0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1},
312 {0x1,0x0,0x1,0x3,0x0,0x3,0x0,0x3,0x0,0x2},
313 {0x1,0x0,0x1,0x1,0x0,0x1,0x0,0x0,0x0,0x0},
314 {0x1,0x0,0x1,0x0,0x0,0x1,0x0,0x0,0x3,0x0},
315 {0x1,0x0,0x1,0x0,0x1,0x1,0x1,0x1,0x1,0x2},
316 {0x2,0x0,0x2,0x1,0x1,0x1,0x1,0x1,0x1,0x1}
317 },
318 { /* level 21 (Dentist) by ts-x */
319 {0x0,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x0},
320 {0x2,0x2,0x0,0x6,0x0,0x6,0x0,0x6,0x2,0x2},
321 {0x2,0x6,0x0,0x6,0x0,0x6,0x0,0x6,0x0,0x2},
322 {0x2,0x0,0x0,0x0,0x0,0x0,0x0,0x6,0x0,0x2},
323 {0x2,0x0,0x6,0x0,0x6,0x0,0x0,0x0,0x0,0x2},
324 {0x2,0x0,0x6,0x0,0x6,0x0,0x6,0x0,0x6,0x2},
325 {0x2,0x2,0x6,0x0,0x6,0x0,0x6,0x0,0x2,0x2},
326 {0x0,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x0}
327 },
328 { /* level 22 (Spider) by ts-x */
329 {0x1,0x3,0x1,0x1,0x0,0x0,0x1,0x1,0x3,0x1},
330 {0x0,0x0,0x1,0x1,0x1,0x1,0x1,0x1,0x0,0x0},
331 {0x3,0x1,0x1,0x6,0x1,0x1,0x6,0x1,0x1,0x3},
332 {0x0,0x0,0x1,0x1,0x1,0x1,0x1,0x1,0x0,0x0},
333 {0x0,0x0,0x1,0x1,0x0,0x0,0x1,0x1,0x0,0x0},
334 {0x1,0x3,0x1,0x1,0x2,0x2,0x1,0x1,0x3,0x1},
335 {0x0,0x0,0x0,0x1,0x1,0x1,0x1,0x0,0x0,0x0},
336 {0x3,0x1,0x3,0x1,0x0,0x0,0x1,0x3,0x1,0x3}
337 },
338 { /* level 23 (Pool) by ts-x */
339 {0x0,0x7,0x7,0x7,0x0,0x7,0x7,0x7,0x7,0x0},
340 {0x0,0x0,0x5,0x0,0x2,0x0,0x0,0x0,0x2,0x0},
341 {0x7,0x3,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x7},
342 {0x7,0x0,0x0,0x0,0x0,0x0,0x0,0x5,0x0,0x7},
343 {0x7,0x0,0x4,0x0,0x0,0x3,0x0,0x0,0x0,0x7},
344 {0x7,0x0,0x0,0x6,0x0,0x0,0x0,0x0,0x4,0x7},
345 {0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0},
346 {0x0,0x7,0x7,0x7,0x7,0x0,0x7,0x7,0x7,0x0}
347 },
348 { /* level 24 (Vorbis Fish) by ts-x */
349 {0x0,0x0,0x4,0x4,0x5,0x5,0x5,0x0,0x0,0x5},
350 {0x0,0x4,0x6,0x4,0x4,0x5,0x5,0x5,0x0,0x5},
351 {0x5,0x6,0x0,0x6,0x4,0x4,0x4,0x5,0x5,0x5},
352 {0x5,0x6,0x0,0x6,0x4,0x4,0x4,0x4,0x5,0x5},
353 {0x0,0x5,0x6,0x4,0x4,0x5,0x5,0x4,0x5,0x0},
354 {0x5,0x5,0x4,0x4,0x5,0x5,0x5,0x4,0x5,0x5},
355 {0x5,0x4,0x4,0x4,0x5,0x5,0x4,0x4,0x5,0x5},
356 {0x0,0x0,0x4,0x4,0x4,0x4,0x4,0x5,0x0,0x5}
357 },
358 {/* level 25 (Rainbow) by ts-x */
359 {0x0,0x4,0x1,0x0,0x0,0x0,0x0,0x1,0x4,0x0},
360 {0x4,0x1,0x3,0x1,0x0,0x0,0x1,0x3,0x1,0x4},
361 {0x1,0x3,0x5,0x3,0x1,0x1,0x3,0x5,0x3,0x1},
362 {0x3,0x5,0x6,0x5,0x3,0x3,0x5,0x6,0x5,0x3},
363 {0x5,0x6,0x7,0x6,0x5,0x5,0x6,0x7,0x6,0x5},
364 {0x6,0x7,0x2,0x7,0x6,0x6,0x7,0x2,0x7,0x6},
365 {0x7,0x2,0x0,0x2,0x7,0x7,0x2,0x0,0x2,0x7},
366 {0x2,0x0,0x0,0x0,0x2,0x2,0x0,0x0,0x0,0x2}
367 },
368 { /* level 26 (Bowtie) by ts-x */
369 {0x5,0x1,0x5,0x1,0x0,0x0,0x1,0x5,0x1,0x5},
370 {0x1,0x0,0x0,0x1,0x5,0x5,0x1,0x0,0x0,0x1},
371 {0x5,0x0,0x6,0x0,0x1,0x1,0x0,0x6,0x0,0x5},
372 {0x1,0x0,0x6,0x6,0x0,0x0,0x6,0x6,0x0,0x1},
373 {0x1,0x0,0x6,0x6,0x0,0x0,0x6,0x6,0x0,0x1},
374 {0x5,0x0,0x6,0x0,0x1,0x1,0x0,0x6,0x0,0x5},
375 {0x1,0x0,0x0,0x1,0x5,0x5,0x1,0x0,0x0,0x1},
376 {0x5,0x1,0x5,0x1,0x0,0x0,0x1,0x5,0x1,0x5}
377 },
378 { /* level 27 (Frog) by ts-x */
379 {0x0,0x5,0x5,0x0,0x0,0x0,0x0,0x5,0x5,0x0},
380 {0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5},
381 {0x5,0x0,0x0,0x5,0x6,0x6,0x5,0x0,0x0,0x5},
382 {0x5,0x0,0x3,0x0,0x6,0x6,0x0,0x3,0x0,0x5},
383 {0x5,0x0,0x1,0x0,0x6,0x6,0x0,0x1,0x0,0x5},
384 {0x5,0x0,0x0,0x5,0x6,0x6,0x5,0x0,0x0,0x5},
385 {0x5,0x5,0x5,0x5,0x0,0x0,0x5,0x5,0x5,0x5},
386 {0x0,0x5,0x5,0x0,0x4,0x4,0x0,0x5,0x5,0x0}
387 },
388 { /* level 28 (DigDug) by ts-x */
389 {0x5,0x5,0x5,0x5,0x0,0x5,0x5,0x5,0x5,0x5},
390 {0x6,0x0,0x0,0x6,0x0,0x6,0x6,0x0,0x0,0x6},
391 {0x7,0x0,0x7,0x7,0x0,0x7,0x7,0x7,0x0,0x7},
392 {0x7,0x0,0x7,0x0,0x0,0x0,0x7,0x7,0x7,0x7},
393 {0x4,0x4,0x4,0x4,0x0,0x4,0x4,0x0,0x0,0x4},
394 {0x4,0x4,0x0,0x0,0x0,0x4,0x4,0x0,0x4,0x4},
395 {0x4,0x4,0x4,0x4,0x4,0x4,0x0,0x0,0x4,0x4},
396 {0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1}
397 },
398 { /* TheEnd */
399 {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0},
400 {0x2,0x2,0x6,0x0,0x0,0x6,0x4,0x4,0x0,0x0},
401 {0x2,0x0,0x6,0x6,0x0,0x6,0x4,0x0,0x4,0x0},
402 {0x2,0x2,0x6,0x6,0x0,0x6,0x4,0x0,0x4,0x0},
403 {0x2,0x2,0x6,0x0,0x6,0x6,0x4,0x0,0x4,0x0},
404 {0x2,0x0,0x6,0x0,0x6,0x6,0x4,0x0,0x4,0x0},
405 {0x2,0x2,0x6,0x0,0x0,0x6,0x4,0x4,0x0,0x0},
406 {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}
407 }
408};
409
410int pad_pos_x,x,y;
411int ball_pos_x;
412int ball_pos_y;
413int bally,balltempy;
414int ballx,balltempx;
415int life;
416int start_game,con_game;
417int pad_type;
418int on_the_pad=0; /* for glue pad */
419int score=0,vscore=0;
420
421int cur_level=0;
422int brick_on_board=0;
423
424typedef struct cube {
425 int powertop;
426 int power;
427 char poweruse;
428 char used;
429 int color;
430} cube;
431cube brick[80];
432
433
434
435typedef struct sfire {
436 int top;
437 int left;
438} sfire;
439sfire fire[30];
440
441
442int highscore;
443#define MAX_POINTS 200000 /* i dont think it needs to be more */
444static struct configdata config[] =
445{
446 {TYPE_INT, 0, MAX_POINTS, &highscore, "highscore", NULL, NULL}
447};
448
449
450void int_game(int new_game)
451{
452 int i,j;
453 ballx=0;
454 bally=0;
455 pad_pos_x=LCD_WIDTH/2-PAD_WIDTH/2;
456 ball_pos_y=PAD_POS_Y-BALL;
457 ball_pos_x=pad_pos_x+(PAD_WIDTH/2)-2;
458 start_game =1;
459 con_game =0;
460 pad_type=0;
461 on_the_pad=0;
462 balltempy=0;
463 balltempx=0;
464 if (new_game==1)
465 brick_on_board=0;
466
467 for(i=0;i<=7;i++){
468 for(j=0;j<=9;j++){
469 brick[i*10+j].poweruse=(levels[cur_level][i][j]==0?0:1);
470 if (i*10+j<=30) fire[i*10+j].top=-8;
471 if (new_game==1) {
472
473 brick[i*10+j].power=rb->rand()%17;
474
475 brick[i*10+j].powertop=30+i*10+BRICK_HEIGHT;
476 brick[i*10+j].used=(levels[cur_level][i][j]==0?0:1);
477 brick[i*10+j].color=levels[cur_level][i][j]-1;
478 if (levels[cur_level][i][j]!=0) brick_on_board++;
479 }
480 }
481 }
482
483
484}
485
486
487#define HIGH_SCORE "highscore.cfg"
488
489#define MENU_LENGTH 4
490int sw,i,w;
491
492int game_menu(int when)
493{
494 int button,cur=0;
495 char str[10];
496
497 rb->lcd_clear_display();
498 rb->lcd_bitmap(brickmania_menu_bg,0,0,220,176);
499 while (true) {
500 for(i=0;i<MENU_LENGTH;i++) {
501 if (cur==0)
502 rb->lcd_bitmap(brickmania_sel_start,55,78,
503 BMPWIDTH_sel_start,BMPHEIGHT_sel_start);
504 else
505 rb->lcd_bitmap(brickmania_start,55,78,
506 BMPWIDTH_start,BMPHEIGHT_start);
507
508 if (when==1) {
509 if (cur==1)
510 rb->lcd_bitmap(brickmania_sel_resume,62,100,
511 BMPWIDTH_sel_resume,BMPHEIGHT_sel_resume);
512 else
513 rb->lcd_bitmap(brickmania_resume,62,100,
514 BMPWIDTH_resume,BMPHEIGHT_resume);
515
516 } else {
517 rb->lcd_bitmap(brickmania_no_resume,62,100,
518 BMPWIDTH_no_resume,BMPHEIGHT_no_resume);
519 }
520
521
522 if (cur==2)
523 rb->lcd_bitmap(brickmania_sel_help,92,118,
524 BMPWIDTH_sel_help,BMPHEIGHT_sel_help);
525 else
526 rb->lcd_bitmap(brickmania_help,92,118,
527 BMPWIDTH_help,BMPHEIGHT_help);
528
529
530 if (cur==3)
531 rb->lcd_bitmap(brickmania_sel_quit,93,138,
532 BMPWIDTH_sel_quit,BMPHEIGHT_sel_quit);
533 else
534 rb->lcd_bitmap(brickmania_quit,93,138,
535 BMPWIDTH_quit,BMPHEIGHT_quit);
536 }
537
538 /* high score */
539 rb->lcd_setfont(FONT_SYSFIXED);
540 rb->lcd_set_background(LCD_RGBPACK(0,0,140));
541 rb->lcd_set_foreground(LCD_WHITE);
542 rb->lcd_putsxy(7, 56, "High Score");
543 rb->snprintf(str, sizeof(str), "%d", highscore);
544 rb->lcd_getstringsize("High Score", &sw, NULL);
545 rb->lcd_getstringsize(str, &w, NULL);
546 rb->lcd_putsxy(7+sw/2-w/2, 65, str);
547 rb->lcd_setfont(FONT_UI);
548
549 rb->lcd_update();
550
551 button = rb->button_get(true);
552 switch(button){
553 case UP:
554 if (cur==0)
555 cur = MENU_LENGTH-1;
556 else
557 cur--;
558 if (when==0 && cur==1) {
559 cur = 0;
560 };
561 break;
562
563 case DOWN:
564 if (cur==MENU_LENGTH-1)
565 cur = 0;
566 else
567 cur++;
568 if (when==0 && cur==1) {
569 cur=2;
570 };
571 break;
572
573 case SELECT:
574 if (cur==0) {
575 score=0;
576 vscore=0;
577 return 0;
578 } else if (cur==1 && when==1) {
579 return 1;
580 } else if (cur==2) {
581 return 2;
582 } else if (cur==3) {
583 return 3;
584 }
585 break;
586 case QUIT:
587 return 3;
588 break;
589 }
590 }
591}
592
593int help(int when)
594{
595 int w,h;
596 int button;
597
598 while(true){
599 rb->lcd_setfont(FONT_SYSFIXED);
600 rb->lcd_set_background(LCD_BLACK);
601 rb->lcd_clear_display();
602 rb->lcd_set_background(LCD_BLACK);
603 rb->lcd_set_foreground(LCD_WHITE);
604
605 rb->lcd_getstringsize("BrickMania", &w, &h);
606 rb->lcd_putsxy(LCD_WIDTH/2-w/2, 1, "BrickMania");
607
608 rb->lcd_set_foreground(LCD_RGBPACK(245,0,0));
609 rb->lcd_putsxy(1, 1*(h+2),"Aim");
610 rb->lcd_set_foreground(LCD_WHITE);
611 rb->lcd_putsxy(1, 2*(h+2),"destroy all the bricks by bouncing");
612 rb->lcd_putsxy(1, 3*(h+2),"the ball of them using the paddle.");
613
614 rb->lcd_set_foreground(LCD_RGBPACK(245,0,0));
615 rb->lcd_putsxy(1, 5*(h+2),"Controls");
616 rb->lcd_set_foreground(LCD_WHITE);
617 rb->lcd_putsxy(1, 6*(h+2),"< & > Move the paddle");
618 rb->lcd_putsxy(1, 7*(h+2),"NAVI Releases the ball/Fire!");
619 rb->lcd_putsxy(1, 8*(h+2),"STOP Opens menu/Quit");
620
621 rb->lcd_set_foreground(LCD_RGBPACK(245,0,0));
622 rb->lcd_putsxy(1, 10*(h+2),"Specials");
623 rb->lcd_set_foreground(LCD_WHITE);
624 rb->lcd_putsxy(1, 11*(h+2),"N Normal:returns paddle to normal");
625 rb->lcd_putsxy(1, 12*(h+2),"D DIE!:loses a life");
626 rb->lcd_putsxy(1, 13*(h+2),"L Life:gains a life/power up");
627 rb->lcd_putsxy(1, 14*(h+2),"F Fire:allows you to shoot bricks");
628 rb->lcd_putsxy(1, 15*(h+2),"G Glue:ball sticks to paddle");
629 rb->lcd_update();
630
631 button=rb->button_get(true);
632 switch (button) {
633 case QUIT:
634 rb->lcd_setfont(FONT_UI);
635 switch (game_menu(when)) {
636 case 0:
637 cur_level=0;
638 life=2;
639 int_game(1);
640 break;
641 case 1:
642 con_game=1;
643 break;
644 case 2:
645 if (help(when)==1) return 1;
646 break;
647 case 3:
648 return 1;
649 break;
650 }
651 return NULL;
652 break;
653 }
654 }
655 return NULL;
656}
657
658int pad_check(int ballxc,int mode,int pon)
659{
660 /* pon: positive(1) or negative(0) */
661
662 if (mode==0) {
663 if (pon == 0)
664 return -ballxc;
665 else
666 return ballxc;
667 } else {
668 if (ballx > 0)
669 return ballxc;
670 else
671 return ballxc*-1;
672 }
673}
674
675int fire_space(void)
676{
677 int t;
678 for(t=0;t<=30;t++)
679 if (fire[t].top+7 < 0)
680 return t;
681
682 return NULL;
683}
684
685int dxball_game(void){
686 int j,i,k,bricky,brickx;
687 char s[20];
688
689 rb->srand( *rb->current_tick );
690
691 configfile_init(rb);
692 configfile_load(HIGH_SCORE,config,1,0);
693
694 switch(game_menu(0)){
695 case 0:
696 cur_level = 0;
697 life = 2;
698 int_game(1);
699 break;
700 case 1:
701 con_game = 1;
702 break;
703 case 2:
704 if (help(0) == 1) return 1;
705 break;
706 case 3:
707 return 1;
708 break;
709 }
710
711 while(true) {
712 if (life >= 0) {
713 rb->lcd_set_background(LCD_BLACK);
714 rb->lcd_set_drawmode(DRMODE_SOLID);
715 rb->lcd_clear_display();
716 rb->lcd_set_background(LCD_BLACK);
717
718 /* write life num */
719 rb->lcd_set_foreground(LCD_WHITE);
720 rb->snprintf(s, sizeof(s), "Life: %d", life);
721 rb->lcd_putsxy(2, 2, s);
722
723 rb->snprintf(s, sizeof(s), "Level %d", cur_level+1);
724 rb->lcd_getstringsize(s, &sw, NULL);
725 rb->lcd_putsxy(LCD_WIDTH-sw-2, 2, s);
726
727
728 if (vscore<score) vscore++;
729 rb->snprintf(s, sizeof(s), "%d", vscore);
730 rb->lcd_getstringsize(s, &sw, NULL);
731 rb->lcd_putsxy(LCD_WIDTH/2-sw/2, 2, s);
732
733 /* continue game */
734 if (con_game== 1 && start_game!=1) {
735 rb->lcd_getstringsize("Press NAVI To Continue", &sw, NULL);
736 rb->lcd_putsxy(LCD_WIDTH/2-sw/2, 150, "Press NAVI to continue");
737 }
738
739 /* draw the ball */
740 rb->lcd_bitmap(brickmania_ball,ball_pos_x, ball_pos_y, BALL, BALL);
741
742 if (brick_on_board==0) brick_on_board--;
743
744 /* if the pad is fire */
745 for(i=0;i<=30;i++) {
746 if (fire[i].top+7>0) {
747 if (con_game!=1)
748 fire[i].top-=4;
749 rb->lcd_vline(fire[i].left, fire[i].top, fire[i].top+7);
750 }
751 }
752
753 /* the bricks */
754 for (i=0;i<=7;i++) {
755 for (j=0;j<=9;j++) {
756 if (brick[i*10+j].power<5) {
757 if (brick[i*10+j].poweruse==2) {
758 if (con_game!=1)
759 brick[i*10+j].powertop+=2;
760 rb->lcd_bitmap_part(brickmania_powerups,0,
761 BMPHEIGHT_powerup*brick[i*10+j].power,
762 BMPWIDTH_powerup,10+j*BRICK_WIDTH+5,
763 brick[i*10+j].powertop, 10, 6);
764 }
765 }
766
767 if ((pad_pos_x<10+j*BRICK_WIDTH+5 && pad_pos_x+PAD_WIDTH>10+j*BRICK_WIDTH+5) && brick[i*10+j].powertop+6>=PAD_POS_Y && brick[i*10+j].poweruse==2) {
768 switch(brick[i*10+j].power) {
769 case 0:
770 life++;
771 score+=50;
772 break;
773 case 1:
774 life--;
775 if (life>=0) {
776 int_game(0);
777 rb->sleep(HZ*2);
778 }
779 break;
780 case 2:
781 score+=34;
782 pad_type=1;
783 break;
784 case 3:
785 score+=47;
786 pad_type=2;
787 on_the_pad=0;
788 break;
789 case 4:
790 score+=23;
791 pad_type=0;
792 on_the_pad=0;
793 break;
794 }
795 brick[i*10+j].poweruse=1;
796 }
797
798 if (brick[i*10+j].powertop>PAD_POS_Y)
799 brick[i*10+j].poweruse=1;
800
801 brickx=10+j*BRICK_WIDTH;
802 bricky=30+i*8;
803 if (pad_type==2) {
804 for (k=0;k<=30;k++) {
805 if (fire[k].top+7>0) {
806 if (brick[i*10+j].used==1 && (fire[k].left+1 >= brickx && fire[k].left+1 <= brickx+BRICK_WIDTH) && (bricky+BRICK_HEIGHT>fire[k].top)){
807 score+=13;
808 fire[k].top=-16;
809 brick[i*10+j].used=0;
810 if (brick[i*10+j].power!=10) brick[i*10+j].poweruse=2;
811 brick_on_board--;
812 }
813 }
814 }
815 }
816
817 if (brick[i*10+j].used==1)
818 rb->lcd_bitmap_part(brickmania_bricks,0,BRICK_HEIGHT*brick[i*10+j].color,BRICK_WIDTH,10+j*BRICK_WIDTH, 30+i*8, BRICK_WIDTH, BRICK_HEIGHT);
819 if (ball_pos_y <100) {
820 if (brick[i*10+j].used==1) {
821 if ((ball_pos_x+ballx+3 >= brickx && ball_pos_x+ballx+3 <= brickx+BRICK_WIDTH) && ((bricky-4<ball_pos_y+BALL && bricky>ball_pos_y+BALL) || (bricky+4>ball_pos_y+BALL+BALL && bricky<ball_pos_y+BALL+BALL)) && (bally >0)){
822 balltempy=bricky-ball_pos_y-BALL;
823 } else if ((ball_pos_x+ballx+3 >= brickx && ball_pos_x+ballx+3 <= brickx+BRICK_WIDTH) && ((bricky+BRICK_HEIGHT+4>ball_pos_y && bricky+BRICK_HEIGHT<ball_pos_y) || (bricky+BRICK_HEIGHT-4<ball_pos_y-BALL && bricky+BRICK_HEIGHT>ball_pos_y-BALL)) && (bally <0)){
824 balltempy=-(ball_pos_y-(bricky+BRICK_HEIGHT));
825 }
826
827 if ((ball_pos_y+3 >= bricky && ball_pos_y+3 <= bricky+BRICK_HEIGHT) && ((brickx-4<ball_pos_x+BALL && brickx>ball_pos_x+BALL) || (brickx+4>ball_pos_x+BALL+BALL && brickx<ball_pos_x+BALL+BALL)) && (ballx >0)) {
828 balltempx=brickx-ball_pos_x-BALL;
829 } else if ((ball_pos_y+bally+3 >= bricky && ball_pos_y+bally+3 <= bricky+BRICK_HEIGHT) && ((brickx+BRICK_WIDTH+4>ball_pos_x && brickx+BRICK_WIDTH<ball_pos_x) || (brickx+BRICK_WIDTH-4<ball_pos_x-BALL && brickx+BRICK_WIDTH>ball_pos_x-BALL)) && (ballx <0)) {
830 balltempx=-(ball_pos_x-(brickx+BRICK_WIDTH));
831 }
832
833 if ((ball_pos_x+3 >= brickx && ball_pos_x+3 <= brickx+BRICK_WIDTH) && ((bricky+BRICK_HEIGHT==ball_pos_y) || (bricky+BRICK_HEIGHT-6<=ball_pos_y && bricky+BRICK_HEIGHT>ball_pos_y)) && (bally <0)) { /* bottom line */
834 brick[i*10+j].used=0;
835 bally = bally*-1;
836 if (brick[i*10+j].power!=10) {
837 brick[i*10+j].poweruse=2;
838 }
839 } else if ((ball_pos_x+3 >= brickx && ball_pos_x+3 <= brickx+BRICK_WIDTH) && ((bricky==ball_pos_y+BALL) || (bricky+6>=ball_pos_y+BALL && bricky<ball_pos_y+BALL)) && (bally >0)) { /* top line */
840 brick[i*10+j].used=0;
841 bally = bally*-1;
842 if (brick[i*10+j].power!=10)
843 brick[i*10+j].poweruse=2;
844 }
845
846 if ((ball_pos_y+3 >= bricky && ball_pos_y+3 <= bricky+BRICK_HEIGHT) && ((brickx==ball_pos_x+BALL) || (brickx+6>=ball_pos_x+BALL && brickx<ball_pos_x+BALL)) && (ballx > 0)) { /* left line */
847 brick[i*10+j].used=0;
848 ballx = ballx*-1;
849 if (brick[i*10+j].power!=10)
850 brick[i*10+j].poweruse=2;
851 } else if ((ball_pos_y+3 >= bricky && ball_pos_y+3 <= bricky+BRICK_HEIGHT) && ((brickx+BRICK_WIDTH==ball_pos_x) || (brickx+BRICK_WIDTH-6<=ball_pos_x && brickx+BRICK_WIDTH>ball_pos_x)) && (ballx < 0)) { /* Right line */
852 brick[i*10+j].used=0;
853 ballx = ballx*-1;
854 if (brick[i*10+j].power!=10)
855 brick[i*10+j].poweruse=2;
856 }
857
858 if (brick[i*10+j].used==0){
859 brick_on_board--;
860 score+=8;
861 }
862 }
863 }
864 }
865 }
866
867 /* draw the pad */
868 rb->lcd_bitmap_part(brickmania_pads,0,pad_type*PAD_HEIGHT,PAD_WIDTH,pad_pos_x, PAD_POS_Y, PAD_WIDTH, PAD_HEIGHT);
869
870 if ((ball_pos_x >= pad_pos_x && ball_pos_x <= pad_pos_x+PAD_WIDTH) && (PAD_POS_Y-4<ball_pos_y+BALL && PAD_POS_Y>ball_pos_y+BALL) && (bally >0))
871 balltempy=PAD_POS_Y-ball_pos_y-BALL;
872 else if ((4>ball_pos_y && 0<ball_pos_y) && (bally <0))
873 balltempy=-ball_pos_y;
874 if ((LCD_WIDTH-4<ball_pos_x+BALL && LCD_WIDTH>ball_pos_x+BALL) && (ballx >0))
875 balltempx=LCD_WIDTH-ball_pos_x-BALL;
876 else if ((4>ball_pos_x && 0<ball_pos_x) && (ballx <0))
877 balltempx=-ball_pos_x;
878
879 /* top line */
880 if (ball_pos_y<= 0)
881 bally = bally*-1;
882 /* bottom line */
883 else if (ball_pos_y+BALL >= LCD_HEIGHT) {
884 life--;
885 if (life>=0){
886 int_game(0);
887 rb->sleep(HZ*2);
888 }
889 }
890
891 /* left line ,right line */
892 if ((ball_pos_x <= 0) || (ball_pos_x+BALL >= LCD_WIDTH))
893 ballx = ballx*-1;
894
895 if ((ball_pos_y+5 >= PAD_POS_Y && (ball_pos_x >= pad_pos_x && ball_pos_x <= pad_pos_x+PAD_WIDTH)) &&
896 start_game != 1 && on_the_pad==0) {
897 if ((ball_pos_x+3 >= pad_pos_x && ball_pos_x+3 <= pad_pos_x+5) || (ball_pos_x +2>= pad_pos_x+35 && ball_pos_x+2 <= pad_pos_x+40)) {
898 bally = 2*-1;
899 if (ball_pos_x != 0 && ball_pos_x+BALL!=LCD_WIDTH)
900 ballx = pad_check(6,0,ball_pos_x+2<=pad_pos_x+(PAD_WIDTH/2)?0:1);
901 } else if ((ball_pos_x+3 >= pad_pos_x+5 && ball_pos_x+3 <= pad_pos_x+10) || (ball_pos_x+2 >= pad_pos_x+30 && ball_pos_x+2 <= pad_pos_x+35)) {
902 bally = 3*-1;
903
904 if (ball_pos_x != 0 && ball_pos_x+BALL!=LCD_WIDTH)
905 ballx = pad_check(4,0,ball_pos_x+2<=pad_pos_x+(PAD_WIDTH/2)?0:1);
906 } else if ((ball_pos_x+3 >= pad_pos_x+10 && ball_pos_x+3 <= pad_pos_x+15) || (ball_pos_x+2 >= pad_pos_x+25 && ball_pos_x+2 <= pad_pos_x+30)) {
907 bally = 4*-1;
908
909 if (ball_pos_x != 0 && ball_pos_x+BALL!=LCD_WIDTH)
910 ballx = pad_check(3,0,ball_pos_x+2<=pad_pos_x+(PAD_WIDTH/2)?0:1);
911 } else if ((ball_pos_x+3 >= pad_pos_x+13 && ball_pos_x+3 <= pad_pos_x+18) || (ball_pos_x+2 >= pad_pos_x+22 && ball_pos_x+2 <= pad_pos_x+25)) {
912 bally = 4*-1;
913 if (ball_pos_x != 0 && ball_pos_x+BALL!=LCD_WIDTH)
914 ballx = pad_check(2,1,NULL);
915 } else {
916 bally = 4*-1;
917 }
918 }
919
920 if (on_the_pad!=1) {
921 ball_pos_x+=balltempx!=0?balltempx:ballx;
922 ball_pos_y+=balltempy!=0?balltempy:bally;
923
924 balltempy=0;
925 balltempx=0;
926 }
927
928 if (ball_pos_y+5 >= PAD_POS_Y && (pad_type==1 && on_the_pad==0) &&
929 (ball_pos_x >= pad_pos_x && ball_pos_x <= pad_pos_x+PAD_WIDTH)){
930 bally=0;
931 on_the_pad=1;
932 }
933
934 rb->lcd_update();
935
936 if (brick_on_board < 0) {
937 if (cur_level+1<levels_num) {
938 rb->sleep(HZ * 2);
939 cur_level++;
940 score+=100;
941 int_game(1);
942 } else {
943 rb->lcd_getstringsize("Congratulations!", &sw, NULL);
944 rb->lcd_putsxy(LCD_WIDTH/2-sw/2, 140, "Congratulations!");
945 rb->lcd_getstringsize("You have finished the game!", &sw, NULL);
946 rb->lcd_putsxy(LCD_WIDTH/2-sw/2, 157, "You have finished the game!");
947 vscore=score;
948 rb->lcd_update();
949 if (score>highscore) {
950 rb->sleep(HZ*2);
951 highscore=score;
952 rb->splash(HZ*2,true,"New High Score");
953 } else {
954 rb->sleep(HZ * 4);
955 }
956
957 switch(game_menu(0)){
958 case 0:
959 life=2;
960 cur_level=0;
961 int_game(1);
962 break;
963 case 1:
964 con_game=1;
965 break;
966 case 2:
967 if (help(0)==1) return 1;
968 break;
969 case 3:
970 return 1;
971 break;
972 };
973 }
974 }
975
976 int move_button,button;
977 int time = 3; /* number of ticks this function will loop reading keys */
978 int start = *rb->current_tick;
979 int end = start + time;
980 button=rb->button_get_w_tmo(end - *rb->current_tick);
981 move_button=rb->button_status();
982
983 if (move_button & RIGHT) {
984 if (pad_pos_x+8+PAD_WIDTH > LCD_WIDTH) {
985 if (start_game==1 || on_the_pad==1) ball_pos_x+=LCD_WIDTH-pad_pos_x-PAD_WIDTH;
986 pad_pos_x+=LCD_WIDTH-pad_pos_x-PAD_WIDTH;
987 } else {
988 if ((start_game==1 || on_the_pad==1))
989 ball_pos_x+=8;
990 pad_pos_x+=8;
991 }
992 } else if (move_button & LEFT) {
993 if (pad_pos_x-8 < 0) {
994 if (start_game==1 || on_the_pad==1) ball_pos_x-=pad_pos_x;
995 pad_pos_x-=pad_pos_x;
996 } else {
997 if (start_game==1 || on_the_pad==1) ball_pos_x-=8;
998 pad_pos_x-=8;
999 }
1000 }
1001
1002
1003 switch(button){
1004 case SELECT:
1005 if (start_game==1 && con_game!=1 && pad_type!=1) {
1006 bally=-4;
1007 ballx=pad_pos_x+(PAD_WIDTH/2)-2>=LCD_WIDTH/2?2:-2;
1008 start_game =0;
1009 } else if (pad_type==1 && on_the_pad==1) {
1010 on_the_pad=0;
1011 if (start_game!=1 && con_game==1) {
1012 start_game =0;
1013 con_game=0;
1014 }
1015 } else if (pad_type==2 && con_game!=1) {
1016 int tfire;
1017 tfire=fire_space();
1018 fire[tfire].top=PAD_POS_Y-7;
1019 fire[tfire].left=pad_pos_x+1;
1020 tfire=fire_space();
1021 fire[tfire].top=PAD_POS_Y-7;
1022 fire[tfire].left=pad_pos_x+PAD_WIDTH-1;
1023 } else if (con_game==1 && start_game!=1) {
1024 ballx=x;
1025 bally=y;
1026 con_game=0;
1027 }
1028 break;
1029 case QUIT:
1030 switch(game_menu(1)){
1031 case 0:
1032 life=2;
1033 cur_level=0;
1034 int_game(1);
1035 break;
1036 case 1:
1037 if (ballx!=0 && bally !=0)
1038 con_game=1;
1039 break;
1040 case 2:
1041 if (help(1)==1) return 1;
1042 break;
1043 case 3:
1044 return 1;
1045 break;
1046 };
1047 if (ballx!=0) x=ballx;
1048 ballx=0;
1049 if (bally!=0) y=bally;
1050 bally=0;
1051 break;
1052 }
1053 } else {
1054 rb->lcd_bitmap(brickmania_gameover,LCD_WIDTH/2-55,LCD_HEIGHT-87,110,52);
1055 rb->lcd_update();
1056 if (score>highscore) {
1057 rb->sleep(HZ*2);
1058 highscore=score;
1059 rb->splash(HZ*2,true,"New High Score");
1060 } else {
1061 rb->sleep(HZ * 3);
1062 }
1063
1064 ballx=0;
1065 bally=0;
1066
1067 switch(game_menu(0)){
1068 case 0:
1069 cur_level=0;
1070 life=2;
1071 int_game(1);
1072 break;
1073 case 1:
1074 con_game=1;
1075 break;
1076 case 2:
1077 if (help(0)==1) return 1;
1078 break;
1079 case 3:
1080 return 1;
1081 break;
1082 }
1083 }
1084 }
1085}
1086
1087/* this is the plugin entry point */
1088enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
1089{
1090 (void)parameter;
1091 rb = api;
1092#if !defined(SIMULATOR) && defined(HAVE_ADJUSTABLE_CPU_FREQ)
1093 rb->cpu_boost(true);
1094#endif
1095
1096 bally=0;
1097 ballx=0;
1098
1099 rb->backlight_set_timeout(1);
1100
1101 /* now go ahead and have fun! */
1102 while (dxball_game()!=1);
1103
1104 configfile_save(HIGH_SCORE,config,1,0);
1105
1106 rb->backlight_set_timeout(15);
1107
1108#if !defined(SIMULATOR) && defined(HAVE_ADJUSTABLE_CPU_FREQ)
1109 rb->cpu_boost(false);
1110#endif
1111
1112 return PLUGIN_OK;
1113}