From 102c3742487dba76ec72d5f56a2c3041344b2d68 Mon Sep 17 00:00:00 2001 From: Sebastian Leonhardt Date: Fri, 8 Jan 2016 01:05:36 +0100 Subject: added xrick game original xrick code by 'BigOrno' at: http://www.bigorno.net/xrick/ Rockbox port, plus bugfixes at: https://github.com/pierluigi-vicinanza/xrick Further changes: * Additonal fixes from g#3026 * Port to modern plugin API * Add Pluginlib keymap fallback * Support all >1bpp screens * Fix build warnings in miniz * Better error message when resources are missing Change-Id: Id83928bc2539901b0221692f65cbca41389c58e7 --- apps/plugins/xrick/scr_getname.c | 290 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 290 insertions(+) create mode 100644 apps/plugins/xrick/scr_getname.c (limited to 'apps/plugins/xrick/scr_getname.c') diff --git a/apps/plugins/xrick/scr_getname.c b/apps/plugins/xrick/scr_getname.c new file mode 100644 index 0000000000..eb1afffde9 --- /dev/null +++ b/apps/plugins/xrick/scr_getname.c @@ -0,0 +1,290 @@ +/* + * xrick/scr_getname.c + * + * Copyright (C) 1998-2002 BigOrno (bigorno@bigorno.net). + * Copyright (C) 2008-2014 Pierluigi Vicinanza. + * All rights reserved. + * + * The use and distribution terms for this software are contained in the file + * named README, which can be found in the root of this distribution. By + * using this software in any fashion, you are agreeing to be bound by the + * terms of this license. + * + * You must not remove this notice, or any other, from this software. + */ + +#include "xrick/screens.h" + +#include "xrick/game.h" +#include "xrick/draw.h" +#include "xrick/control.h" +#include "xrick/data/pics.h" +#include "xrick/system/system.h" + +/* + * local vars + */ +static U8 seq = 0; +static U8 x, y, p; +static U8 player_name[HISCORE_NAME_SIZE]; + +#define TILE_POINTER '\072' +#define TILE_CURSOR '\073' +#define TOPLEFT_X 116 +#define TOPLEFT_Y 64 +#define NAMEPOS_X 120 +#define NAMEPOS_Y 160 +#define AUTOREPEAT_TMOUT 100 + + +/* + * prototypes + */ +static void pointer_show(bool); +static void name_update(void); +static void name_draw(void); + + +/* + * Get name + * + * return: 0 while running, 1 when finished. + */ +U8 +screen_getname(void) +{ + static U32 tm = 0; + U8 i, j; + + if (seq == 0) + { + /* figure out if this is a high score */ + if (game_score < screen_highScores[screen_nbr_hiscores - 1].score) + return SCREEN_DONE; + + /* prepare */ + draw_tilesBank = 0; +#ifdef GFXPC + draw_filter = 0xffff; +#endif + for (i = 0; i < HISCORE_NAME_SIZE; i++) + { + player_name[i] = '@'; + } + x = 5, y = 4, p = 0; + game_rects = &draw_SCREENRECT; + seq = 1; + } + + switch (seq) + { + case 1: /* prepare screen */ + { + sysvid_clear(); +#ifdef GFXPC + draw_setfb(32, 8); + draw_filter = 0xaaaa; /* red */ + draw_tilesListImm(screen_congrats); +#endif +#ifdef GFXST + draw_pic(pic_congrats); +#endif + draw_setfb(72, 40); +#ifdef GFXPC + draw_filter = 0xffff; /* yellow */ +#endif + draw_tilesListImm((U8 *)"PLEASE@ENTER@YOUR@NAME\376"); +#ifdef GFXPC + draw_filter = 0x5555; /* green */ +#endif + for (i = 0; i < 6; i++) + { + for (j = 0; j < 4; j++) + { + draw_setfb(TOPLEFT_X + i * 8 * 2, TOPLEFT_Y + j * 8 * 2); + draw_tile('A' + i + j * 6); + } + } + draw_setfb(TOPLEFT_X, TOPLEFT_Y + 64); +#ifdef GFXST + draw_tilesListImm((U8 *)"Y@Z@.@@@\074\373\374\375\376"); +#endif +#ifdef GFXPC + draw_tilesListImm((U8 *)"Y@Z@.@@@\074@\075@\376"); +#endif + name_draw(); + pointer_show(true); + seq = 2; + break; + } + case 2: /* wait for key pressed */ + { + if (control_test(Control_FIRE)) + seq = 3; + if (control_test(Control_UP)) { + if (y > 0) { + pointer_show(false); + y--; + pointer_show(true); + tm = sys_gettime(); + } + seq = 4; + } + if (control_test(Control_DOWN)) { + if (y < 4) { + pointer_show(false); + y++; + pointer_show(true); + tm = sys_gettime(); + } + seq = 5; + } + if (control_test(Control_LEFT)) { + if (x > 0) { + pointer_show(false); + x--; + pointer_show(true); + tm = sys_gettime(); + } + seq = 6; + } + if (control_test(Control_RIGHT)) { + if (x < 5) { + pointer_show(false); + x++; + pointer_show(true); + tm = sys_gettime(); + } + seq = 7; + } + break; + } + case 3: /* wait for FIRE released */ + { + if (!(control_test(Control_FIRE))) + { + if (x == 5 && y == 4) + { /* end */ + i = 0; + while (game_score < screen_highScores[i].score) i++; + j = 7; + while (j > i) + { + screen_highScores[j].score = screen_highScores[j - 1].score; + for (x = 0; x < HISCORE_NAME_SIZE; x++) + { + screen_highScores[j].name[x] = screen_highScores[j - 1].name[x]; + } + j--; + } + screen_highScores[i].score = game_score; + for (x = 0; x < HISCORE_NAME_SIZE; x++) + { + screen_highScores[i].name[x] = player_name[x]; + } + seq = 99; + } + else + { + name_update(); + name_draw(); + seq = 2; + } + } + break; + } + case 4: /* wait for UP released */ + { + if (!(control_test(Control_UP)) || + sys_gettime() - tm > AUTOREPEAT_TMOUT) + seq = 2; + break; + } + case 5: /* wait for DOWN released */ + { + if (!(control_test(Control_DOWN)) || + sys_gettime() - tm > AUTOREPEAT_TMOUT) + seq = 2; + break; + } + case 6: /* wait for LEFT released */ + { + if (!(control_test(Control_LEFT)) || + sys_gettime() - tm > AUTOREPEAT_TMOUT) + seq = 2; + break; + } + case 7: /* wait for RIGHT released */ + { + if (!(control_test(Control_RIGHT)) || + sys_gettime() - tm > AUTOREPEAT_TMOUT) + seq = 2; + break; + } + } + + if (control_test(Control_EXIT)) /* check for exit request */ + return SCREEN_EXIT; + + if (seq == 99) { /* seq 99, we're done */ + sysvid_clear(); + seq = 0; + return SCREEN_DONE; + } + else + return SCREEN_RUNNING; +} + + +static void +pointer_show(bool show) +{ + draw_setfb(TOPLEFT_X + x * 8 * 2, TOPLEFT_Y + y * 8 * 2 + 8); +#ifdef GFXPC + draw_filter = 0xaaaa; /* red */ +#endif + draw_tile(show? TILE_POINTER:'@'); +} + +static void +name_update(void) +{ + U8 i; + + i = x + y * 6; + if (i < 26 && p < 10) + player_name[p++] = 'A' + i; + if (i == 26 && p < 10) + player_name[p++] = '.'; + if (i == 27 && p < 10) + player_name[p++] = '@'; + if (i == 28 && p > 0) { + p--; + } +} + +static void +name_draw(void) +{ + U8 i; + + draw_setfb(NAMEPOS_X, NAMEPOS_Y); +#ifdef GFXPC + draw_filter = 0xaaaa; /* red */ +#endif + for (i = 0; i < p; i++) + draw_tile(player_name[i]); + for (i = p; i < 10; i++) + draw_tile(TILE_CURSOR); + +#ifdef GFXST + draw_setfb(NAMEPOS_X, NAMEPOS_Y + 8); + for (i = 0; i < 10; i++) + draw_tile('@'); + draw_setfb(NAMEPOS_X + 8 * (p < 9 ? p : 9), NAMEPOS_Y + 8); + draw_tile(TILE_POINTER); +#endif +} + + +/* eof */ -- cgit v1.2.3