summaryrefslogtreecommitdiffstats
path: root/apps/plugins/rockblox1d.c
diff options
context:
space:
mode:
authorFrank Gevaerts <frank@gevaerts.be>2008-06-28 15:16:43 +0000
committerFrank Gevaerts <frank@gevaerts.be>2008-06-28 15:16:43 +0000
commite56506012170789f095f28c855e2e9b2ad8ea34e (patch)
tree071147a71093d11f323f6d97d21b427383a111a2 /apps/plugins/rockblox1d.c
parent3a765f68e86bac469c4add61927c3b476d58f05c (diff)
downloadrockbox-e56506012170789f095f28c855e2e9b2ad8ea34e.tar.gz
rockbox-e56506012170789f095f28c855e2e9b2ad8ea34e.tar.bz2
rockbox-e56506012170789f095f28c855e2e9b2ad8ea34e.zip
Add rockblox1d, by Alexander Papst (originally 1drockblox, but renamed to not end up as the first game listed)
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@17831 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/plugins/rockblox1d.c')
-rw-r--r--apps/plugins/rockblox1d.c283
1 files changed, 283 insertions, 0 deletions
diff --git a/apps/plugins/rockblox1d.c b/apps/plugins/rockblox1d.c
new file mode 100644
index 0000000000..58a1e863f7
--- /dev/null
+++ b/apps/plugins/rockblox1d.c
@@ -0,0 +1,283 @@
+/*****************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// __ \_/ ___\| |/ /| __ \ / __ \ \/ /
+ * Jukebox | | ( (__) ) \___| ( | \_\ ( (__) ) (
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2006 - 2008 Alexander Papst
+ * Idea from http://www.tetris1d.org
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+#include "plugin.h"
+
+PLUGIN_HEADER
+
+#ifdef HAVE_LCD_BITMAP
+
+#if CONFIG_KEYPAD == RECORDER_PAD
+#define ONEDROCKBLOX_DOWN BUTTON_PLAY
+#define ONEDROCKBLOX_QUIT BUTTON_OFF
+
+#elif CONFIG_KEYPAD == ARCHOS_AV300_PAD
+#define ONEDROCKBLOX_DOWN BUTTON_SELECT
+#define ONEDROCKBLOX_QUIT BUTTON_OFF
+
+#elif CONFIG_KEYPAD == ONDIO_PAD
+#define ONEDROCKBLOX_DOWN BUTTON_RIGHT
+#define ONEDROCKBLOX_QUIT BUTTON_OFF
+
+#elif (CONFIG_KEYPAD == IAUDIO_X5M5_PAD)
+#define ONEDROCKBLOX_DOWN BUTTON_SELECT
+#define ONEDROCKBLOX_QUIT BUTTON_POWER
+
+#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \
+ (CONFIG_KEYPAD == IPOD_3G_PAD) || \
+ (CONFIG_KEYPAD == IPOD_1G2G_PAD)
+#define ONEDROCKBLOX_DOWN BUTTON_SELECT
+#define ONEDROCKBLOX_QUIT (BUTTON_SELECT | BUTTON_MENU)
+
+#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
+ (CONFIG_KEYPAD == IRIVER_H300_PAD)
+#define ONEDROCKBLOX_DOWN BUTTON_SELECT
+#define ONEDROCKBLOX_QUIT BUTTON_OFF
+
+#elif (CONFIG_KEYPAD == GIGABEAT_PAD)
+#define ONEDROCKBLOX_DOWN BUTTON_SELECT
+#define ONEDROCKBLOX_QUIT BUTTON_POWER
+
+#elif (CONFIG_KEYPAD == SANSA_E200_PAD) || \
+(CONFIG_KEYPAD == SANSA_C200_PAD)
+#define ONEDROCKBLOX_DOWN BUTTON_SELECT
+#define ONEDROCKBLOX_QUIT BUTTON_POWER
+
+#elif (CONFIG_KEYPAD == IRIVER_H10_PAD)
+#define ONEDROCKBLOX_DOWN BUTTON_PLAY
+#define ONEDROCKBLOX_QUIT BUTTON_POWER
+
+#elif (CONFIG_KEYPAD == GIGABEAT_S_PAD)
+#define ONEDROCKBLOX_DOWN BUTTON_SELECT
+#define ONEDROCKBLOX_QUIT BUTTON_BACK
+
+#elif (CONFIG_KEYPAD == MROBE100_PAD)
+#define ONEDROCKBLOX_DOWN BUTTON_SELECT
+#define ONEDROCKBLOX_QUIT BUTTON_POWER
+
+#elif CONFIG_KEYPAD == IAUDIO_M3_PAD
+#define ONEDROCKBLOX_DOWN BUTTON_RC_PLAY
+#define ONEDROCKBLOX_QUIT BUTTON_RC_REC
+
+#elif (CONFIG_KEYPAD == COWOND2_PAD)
+#define ONEDROCKBLOX_DOWN BUTTON_SELECT
+#define ONEDROCKBLOX_QUIT BUTTON_POWER
+
+#else
+#error No keymap defined!
+#endif
+
+#define mrand(max) (short)(rb->rand()%max)
+
+#define TILES 11
+
+/**********
+** Lots of defines for the drawing stuff :-)
+** The most ugly way i could think of...
+*/
+
+#if (LCD_WIDTH > LCD_HEIGHT)
+ /* Any screens larger than the minis LCD */
+#if (LCD_WIDTH > 132)
+ /* Max size of one block */
+# define WIDTH (int)((LCD_HEIGHT * 0.85) / TILES)
+ /* Align the playing filed centered */
+# define CENTER_X (int)(LCD_WIDTH/2-(WIDTH/2))
+# define CENTER_Y (int)(LCD_HEIGHT/2-((WIDTH*TILES+TILES)/2))
+ /* Score box */
+# define SCORE_X (int)(((CENTER_X+WIDTH+4) + (LCD_WIDTH-(CENTER_X+WIDTH+4))/2)-(f_width/2))
+# define SCORE_Y (int)((LCD_HEIGHT/2)-(f_height/2))
+ /* Max. size of bricks is 4 blocks */
+# define NEXT_H (WIDTH*4+3)
+# define NEXT_X (int)(CENTER_X/2-WIDTH/2)
+# define NEXT_Y (int)(LCD_HEIGHT/2-NEXT_H/2)
+#else
+ /* Max size of one block */
+# define WIDTH (int)((LCD_HEIGHT * 0.85) / TILES)
+ /* Align the playing left centered */
+# define CENTER_X (int)(LCD_WIDTH*0.2)
+# define CENTER_Y (int)(LCD_HEIGHT/2-((WIDTH*TILES+TILES)/2))
+ /* Score box */
+# define SCORE_X (int)(((CENTER_X+WIDTH+4) + (LCD_WIDTH-(CENTER_X+WIDTH+4))/2)-(f_width/2))
+# define SCORE_Y 16
+ /* Max. size of bricks is 4 blocks */
+# define NEXT_H (WIDTH*4+3)
+# define NEXT_X (score_x+f_width+7)
+# define NEXT_Y (int)(LCD_HEIGHT-((4*WIDTH)+13))
+#endif
+#else
+ /* Max size of one block */
+# define WIDTH (int)((LCD_HEIGHT * 0.8) / TILES)
+ /* Align the playing filed centered */
+# define CENTER_X (int)(LCD_WIDTH/2-(WIDTH/2))
+# define CENTER_Y 2
+ /* Score box */
+# define SCORE_X (int)((LCD_WIDTH/2)-(f_width/2))
+# define SCORE_Y (LCD_HEIGHT-(f_height+2))
+ /* Max. size of bricks is 4 blocks */
+# define NEXT_H (WIDTH*4+3)
+# define NEXT_X (int)(CENTER_X/2-WIDTH/2)
+# define NEXT_Y (int)((LCD_HEIGHT * 0.8)/2-NEXT_H/2)
+#endif
+
+static const struct plugin_api* rb; /* global api struct pointer */
+
+void draw_brick(int pos, int length) {
+ int i = pos;
+ rb->lcd_set_drawmode(DRMODE_BG|DRMODE_INVERSEVID);
+ rb->lcd_fillrect(CENTER_X, CENTER_Y, WIDTH, WIDTH * TILES + TILES);
+ rb->lcd_set_drawmode(DRMODE_SOLID);
+
+ for (i = pos; i < length + pos; ++i) {
+ if (i >= 0) rb->lcd_fillrect(CENTER_X, CENTER_Y+i+(WIDTH*i), WIDTH, WIDTH);
+ }
+}
+
+enum plugin_status plugin_start(const struct plugin_api* api, const void* parameter)
+{
+ int i;
+ int f_width, f_height;
+ int score_x;
+
+ bool quit = false;
+ int button;
+
+ int cycletime = 300;
+ int end;
+
+ int pos_cur_brick = 0;
+ int type_cur_brick = 0;
+ int type_next_brick = 0;
+
+ unsigned long int score = 34126;
+ char score_buf[10];
+
+ rb = api;
+ (void)parameter;
+
+#if LCD_DEPTH > 1
+ rb->lcd_set_backdrop(NULL);
+ rb->lcd_set_background(LCD_BLACK);
+ rb->lcd_set_foreground(LCD_WHITE);
+#endif
+
+ rb->lcd_setfont(FONT_SYSFIXED);
+
+ rb->lcd_getstringsize("100000000", &f_width, &f_height);
+
+ rb->lcd_clear_display();
+
+ /***********
+ ** Draw EVERYTHING
+ */
+
+ /* Playing filed box */
+ rb->lcd_vline(CENTER_X-2, CENTER_Y, CENTER_Y + (WIDTH*TILES+TILES));
+ rb->lcd_vline(CENTER_X + WIDTH + 1, CENTER_Y,
+ CENTER_Y + (WIDTH*TILES+TILES));
+ rb->lcd_hline(CENTER_X-2, CENTER_X + WIDTH + 1,
+ CENTER_Y + (WIDTH*TILES+TILES));
+
+ /* Score box */
+#if (LCD_WIDTH > LCD_HEIGHT)
+ rb->lcd_drawrect(SCORE_X-4, SCORE_Y-5, f_width+8, f_height+9);
+ rb->lcd_putsxy(SCORE_X-4, SCORE_Y-6-f_height, "score");
+#else
+ rb->lcd_hline(0, LCD_WIDTH, SCORE_Y-5);
+ rb->lcd_putsxy(2, SCORE_Y-6-f_height, "score");
+#endif
+ score_x = SCORE_X;
+
+ /* Next box */
+ rb->lcd_getstringsize("next", &f_width, NULL);
+#if (LCD_WIDTH > LCD_HEIGHT) && !(LCD_WIDTH > 132)
+ rb->lcd_drawrect(NEXT_X-5, NEXT_Y-5, WIDTH+10, NEXT_H+10);
+ rb->lcd_putsxy(score_x-4, NEXT_Y-5, "next");
+#else
+ rb->lcd_drawrect(NEXT_X-5, NEXT_Y-5, WIDTH+10, NEXT_H+10);
+ rb->lcd_putsxy(NEXT_X-5, NEXT_Y-5-f_height-1, "next");
+#endif
+
+ /***********
+ ** GAMELOOP
+ */
+ rb->srand( *rb->current_tick );
+
+ type_cur_brick = 2 + mrand(3);
+ type_next_brick = 2 + mrand(3);
+
+ do {
+ end = *rb->current_tick + (cycletime * HZ) / 1000;
+
+ draw_brick(pos_cur_brick, type_cur_brick);
+
+ /* Draw next brick */
+ rb->lcd_set_drawmode(DRMODE_BG|DRMODE_INVERSEVID);
+ rb->lcd_fillrect(NEXT_X, NEXT_Y, WIDTH, WIDTH * 4 + 4);
+ rb->lcd_set_drawmode(DRMODE_SOLID);
+
+ for (i = 0; i < type_next_brick; ++i) {
+ rb->lcd_fillrect(NEXT_X,
+ NEXT_Y + ((type_next_brick % 2) ? (int)(WIDTH/2) : ((type_next_brick == 2) ? (WIDTH+1) : 0)) + (WIDTH*i) + i,
+ WIDTH, WIDTH);
+ }
+
+ /* Score box */
+ rb->snprintf(score_buf, sizeof(score_buf), "%8ld0", score);
+ rb->lcd_putsxy(score_x, SCORE_Y, score_buf);
+
+ rb->lcd_update();
+
+ button = rb->button_status();
+
+ switch(button) {
+ case ONEDROCKBLOX_DOWN:
+ case (ONEDROCKBLOX_DOWN|BUTTON_REPEAT):
+ cycletime = 100;
+ break;
+ case ONEDROCKBLOX_QUIT:
+ quit = true;
+ break;
+ default:
+ cycletime = 300;
+ if(rb->default_event_handler(button) == SYS_USB_CONNECTED) {
+ quit = true;
+ }
+ }
+
+ if ((pos_cur_brick + type_cur_brick) > 10) {
+ type_cur_brick = type_next_brick;
+ type_next_brick = 2 + mrand(3);
+ score += (type_cur_brick - 1) * 2;
+ pos_cur_brick = 1 - type_cur_brick;
+ } else {
+ ++pos_cur_brick;
+ }
+
+ if (end > *rb->current_tick)
+ rb->sleep(end-*rb->current_tick);
+ else
+ rb->yield();
+
+ } while (!quit);
+
+ return PLUGIN_OK;
+}
+#endif