rockbox/apps/plugins/star.c

1408 lines
44 KiB
C
Raw Normal View History

/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id$
*
* Copyright (C) 2002 Frederic Dang Ngoc
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
****************************************************************************/
#include "plugin.h"
#include "lib/display_text.h"
#include "lib/playback_control.h"
/* size of a level in file */
#define STAR_LEVEL_SIZE ((STAR_WIDTH + 1) * STAR_HEIGHT + 1)
/* size of the game board */
#define STAR_WIDTH 16
#define STAR_HEIGHT 9
/* number of level */
#define STAR_LEVEL_COUNT 20
/* values of object in the board */
#define STAR_VOID '.'
#define STAR_WALL '*'
#define STAR_STAR 'o'
#define STAR_BALL 'X'
#define STAR_BLOCK 'x'
/* sleep time between two frames */
#if (LCD_HEIGHT * LCD_WIDTH >= 70000) && defined(IPOD_ARCH)
/* iPod 5G LCD is *slow* */
#define STAR_SLEEP rb->yield();
#elif (LCD_HEIGHT * LCD_WIDTH >= 30000)
#define STAR_SLEEP rb->sleep(0);
#else
#define STAR_SLEEP rb->sleep(1);
#endif
/* value of ball and block control */
#define STAR_CONTROL_BALL 0
#define STAR_CONTROL_BLOCK 1
/* variable button definitions */
#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
(CONFIG_KEYPAD == IRIVER_H300_PAD)
#define STAR_QUIT BUTTON_OFF
#define STAR_LEFT BUTTON_LEFT
#define STAR_RIGHT BUTTON_RIGHT
#define STAR_UP BUTTON_UP
#define STAR_DOWN BUTTON_DOWN
#define STAR_TOGGLE_CONTROL BUTTON_MODE
#define STAR_TOGGLE_CONTROL2 BUTTON_SELECT
#define STAR_LEVEL_UP (BUTTON_ON | BUTTON_RIGHT)
#define STAR_LEVEL_DOWN (BUTTON_ON | BUTTON_LEFT)
#define STAR_LEVEL_REPEAT (BUTTON_ON | BUTTON_SELECT)
#define STAR_TOGGLE_CONTROL_NAME "MODE/SELECT"
#define STAR_QUIT_NAME "OFF"
#define STAR_LEVEL_UP_NAME "ON + RIGHT"
#define STAR_LEVEL_DOWN_NAME "ON + LEFT"
#define STAR_LEVEL_REPEAT_NAME "ON + NAVI"
#define STAR_RC_QUIT BUTTON_RC_STOP
#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \
(CONFIG_KEYPAD == IPOD_3G_PAD) || \
(CONFIG_KEYPAD == IPOD_1G2G_PAD)
#define STAR_QUIT (BUTTON_SELECT | BUTTON_MENU)
#define STAR_LEFT BUTTON_LEFT
#define STAR_RIGHT BUTTON_RIGHT
#define STAR_UP BUTTON_MENU
#define STAR_DOWN BUTTON_PLAY
#define STAR_TOGGLE_CONTROL_PRE BUTTON_SELECT
#define STAR_TOGGLE_CONTROL (BUTTON_SELECT | BUTTON_REL)
#define STAR_LEVEL_UP (BUTTON_SELECT | BUTTON_RIGHT)
#define STAR_LEVEL_DOWN (BUTTON_SELECT | BUTTON_LEFT)
#define STAR_LEVEL_REPEAT (BUTTON_SELECT | BUTTON_PLAY)
#define STAR_TOGGLE_CONTROL_NAME "SELECT"
#define STAR_QUIT_NAME "S + MENU"
#define STAR_LEVEL_UP_NAME "S >"
#define STAR_LEVEL_DOWN_NAME "S <"
#define STAR_LEVEL_REPEAT_NAME "S + PLAY"
#elif (CONFIG_KEYPAD == IAUDIO_X5M5_PAD)
#define STAR_QUIT BUTTON_POWER
#define STAR_LEFT BUTTON_LEFT
#define STAR_RIGHT BUTTON_RIGHT
#define STAR_UP BUTTON_UP
#define STAR_DOWN BUTTON_DOWN
#define STAR_TOGGLE_CONTROL BUTTON_SELECT
#define STAR_LEVEL_UP_PRE BUTTON_REC
#define STAR_LEVEL_UP (BUTTON_REC|BUTTON_REL)
#define STAR_LEVEL_DOWN_PRE BUTTON_REC
#define STAR_LEVEL_DOWN (BUTTON_REC|BUTTON_REPEAT)
#define STAR_LEVEL_REPEAT BUTTON_PLAY
#define STAR_TOGGLE_CONTROL_NAME "SELECT"
#define STAR_QUIT_NAME "POWER"
#define STAR_LEVEL_UP_NAME "REC"
#define STAR_LEVEL_DOWN_NAME "REC.."
#define STAR_LEVEL_REPEAT_NAME "PLAY"
#elif (CONFIG_KEYPAD == GIGABEAT_PAD)
#define STAR_QUIT BUTTON_POWER
#define STAR_LEFT BUTTON_LEFT
#define STAR_RIGHT BUTTON_RIGHT
#define STAR_UP BUTTON_UP
#define STAR_DOWN BUTTON_DOWN
#define STAR_TOGGLE_CONTROL BUTTON_SELECT
#define STAR_LEVEL_UP BUTTON_VOL_UP
#define STAR_LEVEL_DOWN BUTTON_VOL_DOWN
#define STAR_LEVEL_REPEAT BUTTON_A
#define STAR_TOGGLE_CONTROL_NAME "SELECT"
#define STAR_QUIT_NAME "POWER"
#define STAR_LEVEL_UP_NAME "VOL UP"
#define STAR_LEVEL_DOWN_NAME "VOL DOWN"
#define STAR_LEVEL_REPEAT_NAME "A"
#elif (CONFIG_KEYPAD == SANSA_E200_PAD) || \
(CONFIG_KEYPAD == SANSA_C200_PAD) || \
(CONFIG_KEYPAD == SANSA_CLIP_PAD) || \
(CONFIG_KEYPAD == SANSA_M200_PAD)
#define STAR_QUIT BUTTON_POWER
#define STAR_LEFT BUTTON_LEFT
#define STAR_RIGHT BUTTON_RIGHT
#define STAR_UP BUTTON_UP
#define STAR_DOWN BUTTON_DOWN
#define STAR_TOGGLE_CONTROL BUTTON_SELECT
#define STAR_LEVEL_UP (BUTTON_SELECT | BUTTON_RIGHT)
#define STAR_LEVEL_DOWN (BUTTON_SELECT | BUTTON_LEFT)
#define STAR_LEVEL_REPEAT (BUTTON_SELECT | BUTTON_DOWN)
#define STAR_TOGGLE_CONTROL_NAME "SELECT"
#define STAR_QUIT_NAME "POWER"
#define STAR_LEVEL_UP_NAME "SELECT + RIGHT"
#define STAR_LEVEL_DOWN_NAME "SELECT + LEFT"
#define STAR_LEVEL_REPEAT_NAME "SELECT + DOWN"
#elif (CONFIG_KEYPAD == SANSA_FUZE_PAD)
#define STAR_QUIT (BUTTON_HOME|BUTTON_REPEAT)
#define STAR_LEFT BUTTON_LEFT
#define STAR_RIGHT BUTTON_RIGHT
#define STAR_UP BUTTON_UP
#define STAR_DOWN BUTTON_DOWN
#define STAR_TOGGLE_CONTROL BUTTON_SELECT
#define STAR_LEVEL_UP (BUTTON_SELECT | BUTTON_RIGHT)
#define STAR_LEVEL_DOWN (BUTTON_SELECT | BUTTON_LEFT)
#define STAR_LEVEL_REPEAT (BUTTON_SELECT | BUTTON_DOWN)
#define STAR_TOGGLE_CONTROL_NAME "SELECT"
#define STAR_QUIT_NAME "HOME"
#define STAR_LEVEL_UP_NAME "SELECT + RIGHT"
#define STAR_LEVEL_DOWN_NAME "SELECT + LEFT"
#define STAR_LEVEL_REPEAT_NAME "SELECT + DOWN"
#elif (CONFIG_KEYPAD == IRIVER_H10_PAD)
#define STAR_QUIT BUTTON_POWER
#define STAR_LEFT BUTTON_LEFT
#define STAR_RIGHT BUTTON_RIGHT
#define STAR_UP BUTTON_SCROLL_UP
#define STAR_DOWN BUTTON_SCROLL_DOWN
#define STAR_TOGGLE_CONTROL BUTTON_REW
#define STAR_LEVEL_UP (BUTTON_PLAY | BUTTON_SCROLL_UP)
#define STAR_LEVEL_DOWN (BUTTON_PLAY | BUTTON_SCROLL_DOWN)
#define STAR_LEVEL_REPEAT (BUTTON_PLAY | BUTTON_RIGHT)
#define STAR_TOGGLE_CONTROL_NAME "REW"
#define STAR_QUIT_NAME "POWER"
#define STAR_LEVEL_UP_NAME "PLAY+UP"
#define STAR_LEVEL_DOWN_NAME "PLAY+DOWN"
#define STAR_LEVEL_REPEAT_NAME "PLAY+RIGHT"
#elif (CONFIG_KEYPAD == GIGABEAT_S_PAD)
#define STAR_QUIT BUTTON_BACK
#define STAR_LEFT BUTTON_LEFT
#define STAR_RIGHT BUTTON_RIGHT
#define STAR_UP BUTTON_UP
#define STAR_DOWN BUTTON_DOWN
#define STAR_TOGGLE_CONTROL BUTTON_SELECT
#define STAR_LEVEL_UP BUTTON_VOL_UP
#define STAR_LEVEL_DOWN BUTTON_VOL_DOWN
#define STAR_LEVEL_REPEAT BUTTON_MENU
#define STAR_TOGGLE_CONTROL_NAME "SELECT"
#define STAR_QUIT_NAME "BACK"
#define STAR_LEVEL_UP_NAME "VOL UP"
#define STAR_LEVEL_DOWN_NAME "VOL DOWN"
#define STAR_LEVEL_REPEAT_NAME "MENU"
#elif (CONFIG_KEYPAD == MROBE100_PAD)
#define STAR_QUIT BUTTON_POWER
#define STAR_LEFT BUTTON_LEFT
#define STAR_RIGHT BUTTON_RIGHT
#define STAR_UP BUTTON_UP
#define STAR_DOWN BUTTON_DOWN
#define STAR_TOGGLE_CONTROL BUTTON_SELECT
#define STAR_LEVEL_UP BUTTON_PLAY
#define STAR_LEVEL_DOWN BUTTON_MENU
#define STAR_LEVEL_REPEAT BUTTON_DISPLAY
#define STAR_TOGGLE_CONTROL_NAME "SELECT"
#define STAR_QUIT_NAME "POWER"
#define STAR_LEVEL_UP_NAME "PLAY"
#define STAR_LEVEL_DOWN_NAME "MENU"
#define STAR_LEVEL_REPEAT_NAME "DISPLAY"
#elif CONFIG_KEYPAD == IAUDIO_M3_PAD
#define STAR_QUIT BUTTON_RC_REC
#define STAR_LEFT BUTTON_RC_REW
#define STAR_RIGHT BUTTON_RC_FF
#define STAR_UP BUTTON_RC_VOL_UP
#define STAR_DOWN BUTTON_RC_VOL_DOWN
#define STAR_TOGGLE_CONTROL BUTTON_RC_MODE
#define STAR_LEVEL_UP (BUTTON_RC_PLAY|BUTTON_RC_VOL_UP)
#define STAR_LEVEL_DOWN (BUTTON_RC_PLAY|BUTTON_RC_VOL_DOWN)
#define STAR_LEVEL_REPEAT (BUTTON_RC_PLAY|BUTTON_RC_MENU)
#define STAR_TOGGLE_CONTROL_NAME "MODE"
#define STAR_QUIT_NAME "REC"
#define STAR_LEVEL_UP_NAME "PLAY+VOL+"
#define STAR_LEVEL_DOWN_NAME "PLAY+VOL-"
#define STAR_LEVEL_REPEAT_NAME "PLAY+MENU"
#elif (CONFIG_KEYPAD == COWON_D2_PAD)
#define STAR_QUIT BUTTON_POWER
#define STAR_QUIT_NAME "POWER"
#elif CONFIG_KEYPAD == CREATIVEZVM_PAD
#define STAR_QUIT BUTTON_BACK
#define STAR_LEFT BUTTON_LEFT
#define STAR_RIGHT BUTTON_RIGHT
#define STAR_UP BUTTON_UP
#define STAR_DOWN BUTTON_DOWN
#define STAR_TOGGLE_CONTROL BUTTON_PLAY
#define STAR_LEVEL_UP (BUTTON_CUSTOM | BUTTON_UP)
#define STAR_LEVEL_DOWN (BUTTON_CUSTOM | BUTTON_DOWN)
#define STAR_LEVEL_REPEAT (BUTTON_CUSTOM | BUTTON_RIGHT)
#define STAR_TOGGLE_CONTROL_NAME "PLAY"
#define STAR_QUIT_NAME "BACK"
#define STAR_LEVEL_UP_NAME "CUSTOM+UP"
#define STAR_LEVEL_DOWN_NAME "CUSTOM+DOWN"
#define STAR_LEVEL_REPEAT_NAME "CUSTOM+RIGHT"
#elif CONFIG_KEYPAD == CREATIVE_ZENXFI3_PAD
#define STAR_QUIT BUTTON_POWER
#define STAR_LEFT BUTTON_BACK
#define STAR_RIGHT BUTTON_MENU
#define STAR_UP BUTTON_UP
#define STAR_DOWN BUTTON_DOWN
#define STAR_TOGGLE_CONTROL BUTTON_PLAY
#define STAR_LEVEL_UP BUTTON_VOL_UP
#define STAR_LEVEL_DOWN BUTTON_VOL_DOWN
#define STAR_LEVEL_REPEAT (BUTTON_PLAY | BUTTON_REPEAT)
#define STAR_TOGGLE_CONTROL_NAME "PLAY"
#define STAR_QUIT_NAME "POWER"
#define STAR_LEVEL_UP_NAME "VOL+"
#define STAR_LEVEL_DOWN_NAME "VOL-"
#define STAR_LEVEL_REPEAT_NAME "Hold PLAY button"
#elif CONFIG_KEYPAD == PHILIPS_HDD1630_PAD
#define STAR_QUIT BUTTON_POWER
#define STAR_LEFT BUTTON_LEFT
#define STAR_RIGHT BUTTON_RIGHT
#define STAR_UP BUTTON_UP
#define STAR_DOWN BUTTON_DOWN
#define STAR_TOGGLE_CONTROL BUTTON_SELECT
#define STAR_LEVEL_UP BUTTON_VOL_UP
#define STAR_LEVEL_DOWN BUTTON_VOL_DOWN
#define STAR_LEVEL_REPEAT BUTTON_VIEW
#define STAR_TOGGLE_CONTROL_NAME "SELECT"
#define STAR_QUIT_NAME "POWER"
#define STAR_LEVEL_UP_NAME "VOL UP"
#define STAR_LEVEL_DOWN_NAME "VOL DOWN"
#define STAR_LEVEL_REPEAT_NAME "VIEW"
#elif CONFIG_KEYPAD == PHILIPS_HDD6330_PAD
#define STAR_QUIT BUTTON_POWER
#define STAR_LEFT BUTTON_LEFT
#define STAR_RIGHT BUTTON_RIGHT
#define STAR_UP BUTTON_UP
#define STAR_DOWN BUTTON_DOWN
#define STAR_TOGGLE_CONTROL BUTTON_PLAY
#define STAR_LEVEL_UP BUTTON_VOL_UP
#define STAR_LEVEL_DOWN BUTTON_VOL_DOWN
#define STAR_LEVEL_REPEAT BUTTON_NEXT
#define STAR_TOGGLE_CONTROL_NAME "PLAY"
#define STAR_QUIT_NAME "POWER"
#define STAR_LEVEL_UP_NAME "VOL +"
#define STAR_LEVEL_DOWN_NAME "VOL -"
#define STAR_LEVEL_REPEAT_NAME "NEXT"
#elif CONFIG_KEYPAD == PHILIPS_SA9200_PAD
#define STAR_QUIT BUTTON_POWER
#define STAR_LEFT BUTTON_PREV
#define STAR_RIGHT BUTTON_NEXT
#define STAR_UP BUTTON_UP
#define STAR_DOWN BUTTON_DOWN
#define STAR_TOGGLE_CONTROL BUTTON_PLAY
#define STAR_LEVEL_UP BUTTON_VOL_UP
#define STAR_LEVEL_DOWN BUTTON_VOL_DOWN
#define STAR_LEVEL_REPEAT BUTTON_RIGHT
#define STAR_TOGGLE_CONTROL_NAME "PLAY"
#define STAR_QUIT_NAME "POWER"
#define STAR_LEVEL_UP_NAME "VOL UP"
#define STAR_LEVEL_DOWN_NAME "VOL DOWN"
#define STAR_LEVEL_REPEAT_NAME "RIGHT"
#elif (CONFIG_KEYPAD == ONDAVX747_PAD)
#define STAR_QUIT BUTTON_POWER
#define STAR_QUIT_NAME "POWER"
#elif (CONFIG_KEYPAD == ONDAVX777_PAD)
#define STAR_QUIT BUTTON_POWER
#define STAR_QUIT_NAME "POWER"
#elif CONFIG_KEYPAD == MROBE500_PAD
#define STAR_QUIT BUTTON_POWER
#define STAR_QUIT_NAME "POWER"
#elif CONFIG_KEYPAD == SAMSUNG_YH820_PAD
#define STAR_QUIT (BUTTON_REW|BUTTON_REPEAT)
#define STAR_LEFT BUTTON_LEFT
#define STAR_RIGHT BUTTON_RIGHT
#define STAR_UP BUTTON_UP
#define STAR_DOWN BUTTON_DOWN
#define STAR_LEVEL_UP (BUTTON_REC|BUTTON_UP)
#define STAR_LEVEL_DOWN (BUTTON_REC|BUTTON_DOWN)
#define STAR_TOGGLE_CONTROL BUTTON_PLAY
#define STAR_LEVEL_REPEAT_PRE BUTTON_FFWD
#define STAR_LEVEL_REPEAT (BUTTON_FFWD|BUTTON_REPEAT)
#define STAR_TOGGLE_CONTROL_NAME "PLAY"
#define STAR_QUIT_NAME "LONG REW"
#define STAR_LEVEL_UP_NAME "REC+UP"
#define STAR_LEVEL_DOWN_NAME "REC+DOWN"
#define STAR_LEVEL_REPEAT_NAME "LONG FFWD"
#elif CONFIG_KEYPAD == SAMSUNG_YH92X_PAD
#define STAR_QUIT (BUTTON_REW|BUTTON_REPEAT)
#define STAR_LEFT BUTTON_LEFT
#define STAR_RIGHT BUTTON_RIGHT
#define STAR_UP BUTTON_UP
#define STAR_DOWN BUTTON_DOWN
#define STAR_LEVEL_UP (BUTTON_FFWD|BUTTON_UP)
#define STAR_LEVEL_DOWN (BUTTON_FFWD|BUTTON_DOWN)
#define STAR_TOGGLE_CONTROL (BUTTON_PLAY|BUTTON_REL)
#define STAR_LEVEL_REPEAT_PRE (BUTTON_FFWD|BUTTON_REPEAT)
#define STAR_LEVEL_REPEAT (BUTTON_FFWD|BUTTON_REL)
#define STAR_TOGGLE_CONTROL_NAME "PLAY"
#define STAR_QUIT_NAME "LONG REW"
#define STAR_LEVEL_UP_NAME "FFWD+UP"
#define STAR_LEVEL_DOWN_NAME "FFWD+DOWN"
#define STAR_LEVEL_REPEAT_NAME "LONG FFWD"
#elif CONFIG_KEYPAD == PBELL_VIBE500_PAD
#define STAR_QUIT BUTTON_REC
#define STAR_LEFT BUTTON_PREV
#define STAR_RIGHT BUTTON_NEXT
#define STAR_UP BUTTON_UP
#define STAR_DOWN BUTTON_DOWN
#define STAR_TOGGLE_CONTROL BUTTON_PLAY
#define STAR_LEVEL_UP BUTTON_OK
#define STAR_LEVEL_DOWN BUTTON_CANCEL
#define STAR_LEVEL_REPEAT BUTTON_MENU
#define STAR_TOGGLE_CONTROL_NAME "PLAY"
#define STAR_QUIT_NAME "REC"
#define STAR_LEVEL_UP_NAME "OK"
#define STAR_LEVEL_DOWN_NAME "CANCEL"
#define STAR_LEVEL_REPEAT_NAME "MENU"
#elif CONFIG_KEYPAD == MPIO_HD200_PAD
#define STAR_QUIT (BUTTON_REC | BUTTON_PLAY)
#define STAR_LEFT BUTTON_VOL_DOWN
#define STAR_RIGHT BUTTON_VOL_UP
#define STAR_UP BUTTON_REW
#define STAR_DOWN BUTTON_FF
#define STAR_TOGGLE_CONTROL_PRE BUTTON_FUNC
#define STAR_TOGGLE_CONTROL (BUTTON_FUNC | BUTTON_REL)
#define STAR_LEVEL_UP BUTTON_PLAY
#define STAR_LEVEL_DOWN BUTTON_REC
#define STAR_LEVEL_REPEAT (BUTTON_FUNC | BUTTON_REPEAT)
#define STAR_TOGGLE_CONTROL_NAME "FUNC"
#define STAR_QUIT_NAME "REC + PLAY"
#define STAR_LEVEL_UP_NAME "PLAY"
#define STAR_LEVEL_DOWN_NAME "REC"
#define STAR_LEVEL_REPEAT_NAME "FUNC LONG"
#elif CONFIG_KEYPAD == MPIO_HD300_PAD
#define STAR_QUIT (BUTTON_MENU | BUTTON_REPEAT)
#define STAR_LEFT BUTTON_REW
#define STAR_RIGHT BUTTON_FF
#define STAR_UP BUTTON_UP
#define STAR_DOWN BUTTON_DOWN
#define STAR_TOGGLE_CONTROL_PRE BUTTON_ENTER
#define STAR_TOGGLE_CONTROL (BUTTON_ENTER | BUTTON_REL)
#define STAR_LEVEL_UP (BUTTON_PLAY | BUTTON_FF)
#define STAR_LEVEL_DOWN (BUTTON_PLAY | BUTTON_REW)
#define STAR_LEVEL_REPEAT (BUTTON_PLAY | BUTTON_REPEAT)
#define STAR_TOGGLE_CONTROL_NAME "ENTER"
#define STAR_QUIT_NAME "LONG MENU"
#define STAR_LEVEL_UP_NAME "PLAY + FF"
#define STAR_LEVEL_DOWN_NAME "PLAY + REW"
#define STAR_LEVEL_REPEAT_NAME "LONG PLAY"
#elif CONFIG_KEYPAD == SANSA_FUZEPLUS_PAD
#define STAR_QUIT BUTTON_POWER
#define STAR_LEFT BUTTON_LEFT
#define STAR_RIGHT BUTTON_RIGHT
#define STAR_UP BUTTON_UP
#define STAR_DOWN BUTTON_DOWN
#define STAR_TOGGLE_CONTROL BUTTON_PLAYPAUSE
#define STAR_LEVEL_UP BUTTON_VOL_UP
#define STAR_LEVEL_DOWN BUTTON_VOL_DOWN
#define STAR_LEVEL_REPEAT (BUTTON_BACK | BUTTON_REPEAT)
#define STAR_TOGGLE_CONTROL_NAME "SELECT"
#define STAR_QUIT_NAME "POWER"
#define STAR_LEVEL_UP_NAME "Vol+"
#define STAR_LEVEL_DOWN_NAME "Vol-"
#define STAR_LEVEL_REPEAT_NAME "BACK LONG"
#elif CONFIG_KEYPAD == SANSA_CONNECT_PAD
#define STAR_QUIT BUTTON_POWER
#define STAR_LEFT BUTTON_LEFT
#define STAR_RIGHT BUTTON_RIGHT
#define STAR_UP BUTTON_UP
#define STAR_DOWN BUTTON_DOWN
#define STAR_TOGGLE_CONTROL BUTTON_SELECT
#define STAR_LEVEL_UP BUTTON_VOL_UP
#define STAR_LEVEL_DOWN BUTTON_VOL_DOWN
#define STAR_LEVEL_REPEAT (BUTTON_PREV | BUTTON_REPEAT)
#define STAR_TOGGLE_CONTROL_NAME "SELECT"
#define STAR_QUIT_NAME "POWER"
#define STAR_LEVEL_UP_NAME "Vol+"
#define STAR_LEVEL_DOWN_NAME "Vol-"
#define STAR_LEVEL_REPEAT_NAME "PREV LONG"
#elif (CONFIG_KEYPAD == SAMSUNG_YPR0_PAD)
#define STAR_QUIT BUTTON_BACK
#define STAR_LEFT BUTTON_LEFT
#define STAR_RIGHT BUTTON_RIGHT
#define STAR_UP BUTTON_UP
#define STAR_DOWN BUTTON_DOWN
#define STAR_TOGGLE_CONTROL BUTTON_SELECT
#define STAR_LEVEL_UP BUTTON_MENU
#define STAR_LEVEL_DOWN BUTTON_POWER
#define STAR_LEVEL_REPEAT BUTTON_USER
#define STAR_TOGGLE_CONTROL_NAME "Select"
#define STAR_QUIT_NAME "Back"
#define STAR_LEVEL_UP_NAME "Menu"
#define STAR_LEVEL_DOWN_NAME "Power"
#define STAR_LEVEL_REPEAT_NAME "User"
#elif (CONFIG_KEYPAD == HM60X_PAD)
#define STAR_QUIT BUTTON_POWER
#define STAR_LEFT BUTTON_LEFT
#define STAR_RIGHT BUTTON_RIGHT
#define STAR_UP BUTTON_UP
#define STAR_DOWN BUTTON_DOWN
#define STAR_TOGGLE_CONTROL BUTTON_SELECT
#define STAR_LEVEL_UP (BUTTON_POWER | BUTTON_UP)
#define STAR_LEVEL_DOWN (BUTTON_POWER | BUTTON_DOWN)
#define STAR_LEVEL_REPEAT (BUTTON_POWER | BUTTON_SELECT)
#define STAR_TOGGLE_CONTROL_NAME "SELECT"
#define STAR_QUIT_NAME "POWER"
#define STAR_LEVEL_UP_NAME "POWER + UP"
#define STAR_LEVEL_DOWN_NAME "POWER + DOWN"
#define STAR_LEVEL_REPEAT_NAME "POWER + SELECT"
#elif (CONFIG_KEYPAD == HM801_PAD)
#define STAR_QUIT BUTTON_POWER
#define STAR_LEFT BUTTON_LEFT
#define STAR_RIGHT BUTTON_RIGHT
#define STAR_UP BUTTON_UP
#define STAR_DOWN BUTTON_DOWN
#define STAR_TOGGLE_CONTROL BUTTON_SELECT
#define STAR_LEVEL_UP BUTTON_NEXT
#define STAR_LEVEL_DOWN BUTTON_PREV
#define STAR_LEVEL_REPEAT BUTTON_PLAY
#define STAR_TOGGLE_CONTROL_NAME "SELECT"
#define STAR_QUIT_NAME "POWER"
#define STAR_LEVEL_UP_NAME "NEXT"
#define STAR_LEVEL_DOWN_NAME "PREV"
#define STAR_LEVEL_REPEAT_NAME "PLAY"
#elif CONFIG_KEYPAD == SONY_NWZ_PAD
#define STAR_QUIT BUTTON_BACK
#define STAR_LEFT BUTTON_LEFT
#define STAR_RIGHT BUTTON_RIGHT
#define STAR_UP BUTTON_UP
#define STAR_DOWN BUTTON_DOWN
#define STAR_TOGGLE_CONTROL BUTTON_PLAY
#define STAR_LEVEL_UP (BUTTON_POWER|BUTTON_UP)
#define STAR_LEVEL_DOWN (BUTTON_POWER|BUTTON_DOWN)
#define STAR_LEVEL_REPEAT (BUTTON_POWER|BUTTON_PLAY)
#define STAR_LEVEL_UP_NAME "Option+Up"
#define STAR_LEVEL_DOWN_NAME "Option+Down"
#define STAR_LEVEL_REPEAT_NAME "Option+Play"
#define STAR_TOGGLE_CONTROL_NAME "Play"
#define STAR_QUIT_NAME "Back"
#elif CONFIG_KEYPAD == CREATIVE_ZEN_PAD
#define STAR_QUIT BUTTON_BACK
#define STAR_LEFT BUTTON_LEFT
#define STAR_RIGHT BUTTON_RIGHT
#define STAR_UP BUTTON_UP
#define STAR_DOWN BUTTON_DOWN
#define STAR_TOGGLE_CONTROL BUTTON_SELECT
#define STAR_LEVEL_UP BUTTON_MENU
#define STAR_LEVEL_DOWN BUTTON_PLAYPAUSE
#define STAR_LEVEL_REPEAT BUTTON_SHORTCUT
#define STAR_LEVEL_UP_NAME "Menu"
#define STAR_LEVEL_DOWN_NAME "Play/pause"
#define STAR_LEVEL_REPEAT_NAME "Shortcut"
#define STAR_TOGGLE_CONTROL_NAME "Select"
#define STAR_QUIT_NAME "Back"
Introducing Targets iBasso DX50 & iBasso DX90 The port to for this two targets has been entirely developped by Ilia Sergachev (alias Il or xzcc). His source can be found at https://bitbucket.org/isergachev/rockbox . The few necesary modifications for the DX90 port was done by headwhacker form head-fi.org. Unfortunately i could not try out the final state of the DX90 port. The port is hosted on android (without java) as standalone app. The official Firmware is required to run this port. Ilia did modify the source files for the "android" target in the rockbox source to make the DX port work. The work I did was to separate the code for DX50 (&DX90) from the android target. On this Target Ilia used source from tinyalsa from AOSP. I did not touch that part of the code because I do not understand it. What else I changed from Ilias sources besides the separation from the target "android": * removed a dirty hack to keep backlight off * changed value battery meter to voltage battery meter * made all plugins compile (named target as "standalone") and added keymaps * i added the graphics for the manual but did not do anything else for the manual yet * minor optimizations known bugs: * timers are slowed donw when playback is active (tinyalsa related?) * some minor bugs Things to do: * The main prolem will be how to install the app correctly. A guy called DOC2008 added a CWM (by androtab.info) to the official firmware and Ilia made a CWM installation script and a dualboot selector (rbutils/ibassoboot, build with ndk-build). We will have to find a way to install rockbox in a proper way without breaking any copyrights. Maybe ADB is an option but it is not enable with OF by default. Patching the OF is probably the way to go. * All the wiki and manual to build: needed: android ndk installed, android sdk installed with additional build-tools 19.1.0 installed ./tools/configure select iBasso DX50 or iBasso DX90 make -j apk the content of rockbox.zip/.rockbox needs to be copied to /system/rockbox/app_rockbox/rockbox/ (rockbox app not needed) the content of libs/armeabi to /system/rockbox/lib/ (rockbox app needed) The boot selector is needed as /system/bin/MangoPlayer and the iBasso app as /system/bin/MangoPlayer_original. There is also the "vold" file. The one from OF does not work with DX50 rockbox (DX90 works!?), the one from Ilia is necessary. Until we have found a proper way to install it, it can only be installed following the instructions of Ilia on his bitbucket page, using the CWM-OF and his installation script package. Change-Id: Ic4faaf84824c162aabcc08e492cee6e0068719d0 Reviewed-on: http://gerrit.rockbox.org/941 Tested: Chiwen Chang <rock1104.tw@yahoo.com.tw> Reviewed-by: Michael Giacomelli <giac2000@hotmail.com>
2014-08-30 11:15:53 +00:00
#elif (CONFIG_KEYPAD == DX50_PAD)
#define STAR_QUIT BUTTON_POWER
#define STAR_QUIT_NAME "Power"
#elif CONFIG_KEYPAD == CREATIVE_ZENXFI2_PAD
#define STAR_QUIT BUTTON_POWER
#define STAR_QUIT_NAME "POWER"
#define STAR_TOGGLE_CONTROL BUTTON_MENU
#define STAR_TOGGLE_CONTROL_NAME "MENU"
#elif CONFIG_KEYPAD == AGPTEK_ROCKER_PAD
#define STAR_QUIT BUTTON_POWER
#define STAR_LEFT BUTTON_LEFT
#define STAR_RIGHT BUTTON_RIGHT
#define STAR_UP BUTTON_UP
#define STAR_DOWN BUTTON_DOWN
#define STAR_TOGGLE_CONTROL BUTTON_SELECT
#define STAR_LEVEL_UP (BUTTON_VOLUP|BUTTON_UP)
#define STAR_LEVEL_DOWN (BUTTON_VOLUP|BUTTON_DOWN)
#define STAR_LEVEL_REPEAT (BUTTON_VOLUP|BUTTON_SELECT)
#define STAR_LEVEL_UP_NAME "Option+Up"
#define STAR_LEVEL_DOWN_NAME "Option+Down"
#define STAR_LEVEL_REPEAT_NAME "Option+Play"
#define STAR_TOGGLE_CONTROL_NAME "Play"
#define STAR_QUIT_NAME "Back"
#elif CONFIG_KEYPAD == XDUOO_X3_PAD
#define STAR_QUIT BUTTON_POWER
#define STAR_LEFT BUTTON_PREV
#define STAR_RIGHT BUTTON_NEXT
#define STAR_UP BUTTON_HOME
#define STAR_DOWN BUTTON_OPTION
#define STAR_TOGGLE_CONTROL BUTTON_PLAY
#define STAR_LEVEL_UP (BUTTON_PLAY | BUTTON_NEXT)
#define STAR_LEVEL_DOWN (BUTTON_PLAY | BUTTON_PREV)
#define STAR_LEVEL_REPEAT (BUTTON_PLAY | BUTTON_OPTION)
#define STAR_TOGGLE_CONTROL_NAME "PLAY"
#define STAR_QUIT_NAME "POWER"
#define STAR_LEVEL_UP_NAME "PLAY + NEXT"
#define STAR_LEVEL_DOWN_NAME "PLAY + PREV"
#define STAR_LEVEL_REPEAT_NAME "PLAY + OPTION"
#elif CONFIG_KEYPAD == XDUOO_X3II_PAD || CONFIG_KEYPAD == XDUOO_X20_PAD
#define STAR_QUIT BUTTON_POWER
#define STAR_LEFT BUTTON_PREV
#define STAR_RIGHT BUTTON_NEXT
#define STAR_UP BUTTON_HOME
#define STAR_DOWN BUTTON_OPTION
#define STAR_TOGGLE_CONTROL BUTTON_PLAY
#define STAR_LEVEL_UP (BUTTON_PLAY | BUTTON_NEXT)
#define STAR_LEVEL_DOWN (BUTTON_PLAY | BUTTON_PREV)
#define STAR_LEVEL_REPEAT (BUTTON_PLAY | BUTTON_OPTION)
#define STAR_TOGGLE_CONTROL_NAME "PLAY"
#define STAR_QUIT_NAME "POWER"
#define STAR_LEVEL_UP_NAME "PLAY + NEXT"
#define STAR_LEVEL_DOWN_NAME "PLAY + PREV"
#define STAR_LEVEL_REPEAT_NAME "PLAY + OPTION"
#elif CONFIG_KEYPAD == FIIO_M3K_PAD
#define STAR_QUIT BUTTON_POWER
#define STAR_LEFT BUTTON_PREV
#define STAR_RIGHT BUTTON_NEXT
#define STAR_UP BUTTON_HOME
#define STAR_DOWN BUTTON_OPTION
#define STAR_TOGGLE_CONTROL BUTTON_PLAY
#define STAR_LEVEL_UP (BUTTON_PLAY | BUTTON_NEXT)
#define STAR_LEVEL_DOWN (BUTTON_PLAY | BUTTON_PREV)
#define STAR_LEVEL_REPEAT (BUTTON_PLAY | BUTTON_OPTION)
#define STAR_TOGGLE_CONTROL_NAME "PLAY"
#define STAR_QUIT_NAME "POWER"
#define STAR_LEVEL_UP_NAME "PLAY + NEXT"
#define STAR_LEVEL_DOWN_NAME "PLAY + PREV"
#define STAR_LEVEL_REPEAT_NAME "PLAY + OPTION"
#elif CONFIG_KEYPAD == IHIFI_770_PAD || CONFIG_KEYPAD == IHIFI_800_PAD
#define STAR_QUIT BUTTON_POWER
#define STAR_LEFT BUTTON_HOME
#define STAR_RIGHT BUTTON_VOL_DOWN
#define STAR_UP BUTTON_PREV
#define STAR_DOWN BUTTON_NEXT
#define STAR_TOGGLE_CONTROL BUTTON_PLAY
#define STAR_LEVEL_UP (BUTTON_POWER | BUTTON_VOL_UP)
#define STAR_LEVEL_DOWN (BUTTON_POWER | BUTTON_VOL_DOWN)
#define STAR_LEVEL_REPEAT (BUTTON_POWER | BUTTON_HOME)
#define STAR_TOGGLE_CONTROL_NAME "PLAY"
#define STAR_QUIT_NAME "POWER"
#define STAR_LEVEL_UP_NAME "POWER + VOL+"
#define STAR_LEVEL_DOWN_NAME "POWER + VOL-"
#define STAR_LEVEL_REPEAT_NAME "POWER + HOME"
#elif CONFIG_KEYPAD == EROSQ_PAD
#define STAR_QUIT BUTTON_POWER
#define STAR_LEFT BUTTON_SCROLL_BACK
#define STAR_RIGHT BUTTON_SCROLL_FWD
#define STAR_UP BUTTON_PREV
#define STAR_DOWN BUTTON_NEXT
#define STAR_TOGGLE_CONTROL BUTTON_PLAY
#define STAR_LEVEL_UP BUTTON_VOL_UP
#define STAR_LEVEL_DOWN BUTTON_VOL_DOWN
#define STAR_LEVEL_REPEAT BUTTON_BACK
#define STAR_TOGGLE_CONTROL_NAME "PLAY"
#define STAR_QUIT_NAME "POWER"
#define STAR_LEVEL_UP_NAME "VOL UP"
#define STAR_LEVEL_DOWN_NAME "VOL DN"
#define STAR_LEVEL_REPEAT_NAME "BACK"
#else
#error No keymap defined!
#endif
#ifdef HAVE_TOUCHSCREEN
//#ifndef STAR_QUIT
//#define STAR_QUIT BUTTON_TOPLEFT
//#define STAR_QUIT_NAME "TOPLEFT"
//#endif
#ifndef STAR_LEFT
#define STAR_LEFT BUTTON_MIDLEFT
#endif
#ifndef STAR_RIGHT
#define STAR_RIGHT BUTTON_MIDRIGHT
#endif
#ifndef STAR_UP
#define STAR_UP BUTTON_TOPMIDDLE
#endif
#ifndef STAR_DOWN
#define STAR_DOWN BUTTON_BOTTOMMIDDLE
#endif
#ifndef STAR_TOGGLE_CONTROL
#define STAR_TOGGLE_CONTROL BUTTON_CENTER
#define STAR_TOGGLE_CONTROL_NAME "CENTER"
#endif
#ifndef STAR_LEVEL_UP
#define STAR_LEVEL_UP BUTTON_TOPLEFT
#define STAR_LEVEL_UP_NAME "TOPLEFT"
#endif
#ifndef STAR_LEVEL_DOWN
#define STAR_LEVEL_DOWN BUTTON_BOTTOMLEFT
#define STAR_LEVEL_DOWN_NAME "BOTTOMLEFT"
#endif
#ifndef STAR_LEVEL_REPEAT
#define STAR_LEVEL_REPEAT BUTTON_BOTTOMRIGHT
#define STAR_LEVEL_REPEAT_NAME "BOTTOMRIGHT"
#endif
#endif
/* function returns because of USB? */
static bool usb_detected = false;
/* position of the ball */
static int ball_x, ball_y;
/* position of the block */
static int block_x, block_y;
/* number of stars to get to finish the level */
static int star_count;
/* the object we control : ball or block */
static int control;
/* the current board */
static char board[STAR_HEIGHT][STAR_WIDTH];
#include "pluginbitmaps/star_tiles.h"
#define TILE_WIDTH BMPWIDTH_star_tiles
#define TILE_HEIGHT (BMPHEIGHT_star_tiles/5)
#define STAR_OFFSET_X ((LCD_WIDTH - STAR_WIDTH * TILE_WIDTH) / 2)
#define STAR_OFFSET_Y ((LCD_HEIGHT - STAR_HEIGHT * TILE_HEIGHT - MAX(TILE_HEIGHT, 8)) / 2)
#define WALL 0
#define SPACE 1
#define BLOCK 2
#define STAR 3
#define BALL 4
/* char font size */
static int char_width = -1;
static int char_height = -1;
/* this arrays contains a group of levels loaded into memory */
static unsigned char* levels =
"****************\n"
"*X**........o*x*\n"
"*..........o.***\n"
"*.......**o....*\n"
"*...**.o......**\n"
"**.o..o.....o..*\n"
"*.o......o**.o.*\n"
"*.....**o.....o*\n"
"****************\n"
"\n"
".*..*.*.*...*.**\n"
"*...o.........X*\n"
"...*o..*o...o...\n"
"*.*.o.....o..*.*\n"
"......*...o...*.\n"
"*....*x*..o....*\n"
"...*..*.*...*oo*\n"
"*.............*.\n"
".*..*........*..\n"
"\n"
"****************\n"
"*...........o*x*\n"
"*...**......**X*\n"
"*...*o.........*\n"
"*.o.....o**...o*\n"
"*.*o..o..o*..o**\n"
"*.**o.*o..o.o***\n"
"*o....**o......*\n"
"****************\n"
"\n"
"****************\n"
"*............*x*\n"
"*.....*........*\n"
"**o*o.o*o*o*o*o*\n"
"*.*.*o.o*.*.*.**\n"
"**o*o*o.o*o*o*o*\n"
"*.....*........*\n"
"*...*.......*X.*\n"
"****************\n"
"\n"
".**************.\n"
"*X..*...*..*...*\n"
"*..*o.*.o..o.*.*\n"
"**......*..*...*\n"
"*o.*o*........**\n"
"**.....*.o.*...*\n"
"*o*..*.*.*...*x*\n"
"*...*....o*..*o*\n"
".**************.\n"
"\n"
"....************\n"
"...*...o...*o.o*\n"
"..*....o....*.**\n"
".*.....o.......*\n"
"*X.....o.......*\n"
"**.....o..*...**\n"
"*......o....*..*\n"
"*x.*...o..**o..*\n"
"****************\n"
"\n"
"****************\n"
"*..............*\n"
".**.***..*o.**o*\n"
".*o..*o.*.*.*.*.\n"
"..*..*..***.**..\n"
".**..*..*o*.*o**\n"
"*..............*\n"
"*..X*o....x..*o*\n"
"****************\n"
"\n"
"***************.\n"
"*..o**.........*\n"
"*..*o..**.o....*\n"
"*..o**.*.*o....*\n"
"**.....**..*o*.*\n"
"**.*.......o*o.*\n"
"*oxo*...o..*X*.*\n"
"**.............*\n"
".***************\n"
"\n"
"..*.***********.\n"
".*o*o......*..X*\n"
"*o.o*....o....*.\n"
".*.*..o**..o*..*\n"
"*..*o.*oxo....o*\n"
"*.....o**.....*.\n"
"*o*o.........*..\n"
"*...........*...\n"
".***********....\n"
"\n"
"....***********.\n"
"*****.o........*\n"
"*...x.***o.o*.o*\n"
"*.o...*o.*o...*.\n"
"*.....*..o..*.o*\n"
"*o*o..*.o*..*X*.\n"
".*o...***..***..\n"
"*.........*.*.*.\n"
".*********..*..*\n"
"\n"
"****************\n"
"*......*......X*\n"
"*..*oo.....oo.**\n"
"**...o...**...o*\n"
"*o....*o*oo..***\n"
"**.**....**....*\n"
"*o..o*.o....x.o*\n"
"**o***....*...**\n"
"***************.\n"
"\n"
"**.....**..****.\n"
"*X*****o.***.o**\n"
"*....oo.....o..*\n"
"*.**..**o..*o*.*\n"
"*.*.o.*.*o.**..*\n"
"*.**..**...*x*.*\n"
"*.....o........*\n"
"*........o.....*\n"
"****************\n"
"\n"
".**************.\n"
"*.X*........o.**\n"
"*.*...*o...o**.*\n"
"*.......o....*.*\n"
"*.o..........*o*\n"
"*.*......o.....*\n"
"**......o.o..*o*\n"
"*x..*....o.*.*.*\n"
".**************.\n"
"\n"
"****************\n"
"*o*o........o*o*\n"
"*.o*X......**..*\n"
"*.x........o...*\n"
"*........o*....*\n"
"*......o.......*\n"
"*.o*........*..*\n"
"*o*o........o*o*\n"
"****************\n"
"\n"
".******.********\n"
"*.....o*.....o.*\n"
"*.*.o.*..*...o.*\n"
"*..X*...*oo.*o.*\n"
".*.*...*.o..x*.*\n"
"*o.......*..*o.*\n"
".*......o.....*.\n"
"*o............o*\n"
"****************\n"
"\n"
"****************\n"
"**.x*o.o......o*\n"
"*o.Xo*o.......**\n"
"**.***........**\n"
"**.....o*o*....*\n"
"*oo.......o*o..*\n"
"**.o....****o..*\n"
"**o*..*........*\n"
"****************\n"
"\n"
"****************\n"
"*.o*........*X.*\n"
"*.*..o*oo*o..*.*\n"
"*....*o**o*.o..*\n"
"*.o*.......o*..*\n"
"*..o*o....o*...*\n"
"*.*..*.**o*..*.*\n"
"*....o.*o...x..*\n"
"****************\n"
"\n"
"****************\n"
"*.o....o..x*...*\n"
"*..*o*o...*o...*\n"
"*...*o*....*o..*\n"
"*...o..*...o*o.*\n"
"*.*o*...*.o*...*\n"
"*.o*o.*.o.*....*\n"
"*o*X..*.....*..*\n"
"****************\n"
"\n"
"****************\n"
"*o...**.....**o*\n"
"*.*..*......*o.*\n"
"*.o*...o**..o..*\n"
"*.*....*o......*\n"
"*....*...o*....*\n"
"*.**.o*.**o..*x*\n"
"*.o*.*o.....**X*\n"
"****************\n"
"\n"
"****************\n"
"*...o*o........*\n"
"**o..o*.**o...**\n"
"*.*.*.o...*..*.*\n"
"*.x.*..**..*.Xo*\n"
"*.*..*...o.*.*.*\n"
"**...o**.*o..o**\n"
"*........o*o...*\n"
"****************";
/**
* Do a pretty transition from one level to another.
*/
static void star_transition_update(void)
{
const int center_x = LCD_WIDTH / 2;
const int center_y = LCD_HEIGHT / 2;
int x = 0;
int y = 0;
#if LCD_WIDTH >= LCD_HEIGHT
#if defined(IPOD_VIDEO)
const int step = 4;
#else
const int step = 1;
#endif
const int lcd_demi_width = LCD_WIDTH / 2;
int var_y = 0;
for (; x < lcd_demi_width ; x+=step)
{
var_y += LCD_HEIGHT;
if (var_y > LCD_WIDTH)
{
var_y -= LCD_WIDTH;
y+=step;
}
if( x )
{
rb->lcd_update_rect(center_x - x, center_y - y, x*2, step);
rb->lcd_update_rect(center_x - x, center_y + y - step, x*2, step);
}
if( y )
{
rb->lcd_update_rect(center_x - x, center_y - y, step, y*2);
rb->lcd_update_rect(center_x + x - step, center_y - y, step, y*2);
}
STAR_SLEEP
}
#else
int lcd_demi_height = LCD_HEIGHT / 2;
int var_x = 0;
for (; y < lcd_demi_height ; y++)
{
var_x += LCD_WIDTH;
if (var_x > LCD_HEIGHT)
{
var_x -= LCD_HEIGHT;
x++;
}
if( x )
{
rb->lcd_update_rect(center_x - x, center_y - y, x * 2, 1);
rb->lcd_update_rect(center_x - x, center_y + y - 1, x * 2, 1);
}
if( y )
{
rb->lcd_update_rect(center_x - x, center_y - y, 1, y * 2);
rb->lcd_update_rect(center_x + x - 1, center_y - y, 1, y * 2);
}
STAR_SLEEP
}
#endif
rb->lcd_update();
}
/**
* Display information board of the current level.
*/
static void star_display_board_info(int current_level)
{
int label_pos_y, tile_pos_y;
if (TILE_HEIGHT > char_height)
{
tile_pos_y = LCD_HEIGHT - TILE_HEIGHT;
label_pos_y = tile_pos_y + (TILE_HEIGHT - char_height) / 2;
}
else
{
label_pos_y = LCD_HEIGHT - char_height;
tile_pos_y = label_pos_y + (char_height - TILE_HEIGHT) / 2;
}
rb->lcd_putsxyf(STAR_OFFSET_X, label_pos_y, "L:%02d", current_level + 1);
rb->lcd_putsxyf(LCD_WIDTH/2 - 2 * char_width, label_pos_y, "S:%02d",
star_count);
rb->lcd_putsxy(STAR_OFFSET_X + (STAR_WIDTH-1) * TILE_WIDTH - 2 * char_width,
label_pos_y, "C:");
rb->lcd_bitmap_part(star_tiles, 0, control == STAR_CONTROL_BALL ?
BALL*TILE_HEIGHT : BLOCK*TILE_HEIGHT,
STRIDE( SCREEN_MAIN,
BMPWIDTH_star_tiles, BMPHEIGHT_star_tiles),
STAR_OFFSET_X + (STAR_WIDTH-1) * TILE_WIDTH,
tile_pos_y, TILE_WIDTH, TILE_HEIGHT);
rb->lcd_update_rect(0, MIN(label_pos_y, tile_pos_y), LCD_WIDTH,
MAX(TILE_HEIGHT, char_height));
}
/**
* Load a level into board array.
*/
static int star_load_level(int current_level)
{
int x, y;
char *ptr_tab;
if (current_level < 0)
current_level = 0;
else if (current_level > STAR_LEVEL_COUNT-1)
current_level = STAR_LEVEL_COUNT-1;
ptr_tab = levels + current_level * STAR_LEVEL_SIZE;
control = STAR_CONTROL_BALL;
star_count = 0;
rb->lcd_clear_display();
for (y = 0 ; y < STAR_HEIGHT ; y++)
{
for (x = 0 ; x < STAR_WIDTH ; x++)
{
board[y][x] = *ptr_tab;
switch (*ptr_tab)
{
# define DRAW_TILE( a ) \
rb->lcd_bitmap_part( star_tiles, 0, \
a*TILE_HEIGHT, \
STRIDE( SCREEN_MAIN, \
BMPWIDTH_star_tiles, \
BMPHEIGHT_star_tiles), \
STAR_OFFSET_X + x * TILE_WIDTH, \
STAR_OFFSET_Y + y * TILE_HEIGHT, \
TILE_WIDTH, TILE_HEIGHT);
case STAR_VOID:
DRAW_TILE( SPACE );
break;
case STAR_WALL:
DRAW_TILE( WALL );
break;
case STAR_STAR:
DRAW_TILE( STAR );
star_count++;
break;
case STAR_BALL:
ball_x = x;
ball_y = y;
DRAW_TILE( BALL );
break;
case STAR_BLOCK:
block_x = x;
block_y = y;
DRAW_TILE( BLOCK );
break;
}
ptr_tab++;
}
ptr_tab++;
}
star_display_board_info(current_level);
star_transition_update();
return 1;
}
static void star_animate_tile(int tile_no, int start_x, int start_y,
int delta_x, int delta_y)
{
int i;
if (delta_x != 0) /* horizontal */
{
for (i = 1 ; i <= TILE_WIDTH ; i++)
{
STAR_SLEEP
rb->lcd_bitmap_part(star_tiles, 0, SPACE * TILE_HEIGHT,
STRIDE( SCREEN_MAIN,
BMPWIDTH_star_tiles, BMPHEIGHT_star_tiles),
start_x, start_y, TILE_WIDTH, TILE_HEIGHT);
rb->lcd_bitmap_part(star_tiles, 0, tile_no * TILE_HEIGHT,
STRIDE( SCREEN_MAIN,
BMPWIDTH_star_tiles, BMPHEIGHT_star_tiles),
start_x + delta_x * i, start_y, TILE_WIDTH, TILE_HEIGHT);
rb->lcd_update_rect(start_x + delta_x * i - (delta_x>0?1:0),
start_y, TILE_WIDTH + 1, TILE_HEIGHT);
}
}
else /* vertical */
{
for (i = 1 ; i <= TILE_HEIGHT ; i++)
{
STAR_SLEEP
rb->lcd_bitmap_part(star_tiles, 0, SPACE * TILE_HEIGHT,
STRIDE( SCREEN_MAIN,
BMPWIDTH_star_tiles, BMPHEIGHT_star_tiles),
start_x, start_y, TILE_WIDTH, TILE_HEIGHT);
rb->lcd_bitmap_part(star_tiles, 0, tile_no * TILE_HEIGHT,
STRIDE( SCREEN_MAIN,
BMPWIDTH_star_tiles, BMPHEIGHT_star_tiles),
start_x, start_y + delta_y * i, TILE_WIDTH, TILE_HEIGHT);
rb->lcd_update_rect(start_x, start_y + delta_y * i - (delta_y>0?1:0),
TILE_WIDTH, TILE_HEIGHT + 1);
}
}
}
/**
* Run the game.
*/
static int star_run_game(int current_level)
{
int move_x = 0;
int move_y = 0;
int key;
#if defined(STAR_LEVEL_DOWN_PRE) || \
defined(STAR_LEVEL_UP_PRE) || \
defined(STAR_TOGGLE_CONTROL_PRE)
int lastkey = BUTTON_NONE;
#endif
if (!star_load_level(current_level))
return 0;
while (true)
{
move_x = 0;
move_y = 0;
while ((move_x == 0) && (move_y == 0))
{
key = rb->button_get(true);
switch (key)
{
#ifdef STAR_RC_QUIT
case STAR_RC_QUIT:
#endif
case STAR_QUIT:
return -1;
case STAR_LEFT:
move_x = -1;
break;
case STAR_RIGHT:
move_x = 1;
break;
case STAR_UP:
move_y = -1;
break;
case STAR_DOWN:
move_y = 1;
break;
case STAR_LEVEL_DOWN:
#ifdef STAR_LEVEL_DOWN_PRE
if (lastkey != STAR_LEVEL_DOWN_PRE)
break;
#endif
if (current_level > 0)
{
current_level--;
star_load_level(current_level);
}
break;
case STAR_LEVEL_REPEAT:
star_load_level(current_level);
break;
case STAR_LEVEL_UP:
#ifdef STAR_LEVEL_UP_PRE
if (lastkey != STAR_LEVEL_UP_PRE)
break;
#endif
if (current_level < STAR_LEVEL_COUNT - 1)
{
current_level++;
star_load_level(current_level);
}
break;
case STAR_TOGGLE_CONTROL:
#ifdef STAR_TOGGLE_CONTROL_PRE
if (lastkey != STAR_TOGGLE_CONTROL_PRE)
break;
#endif
#ifdef STAR_TOGGLE_CONTROL2
case STAR_TOGGLE_CONTROL2:
#endif
if (control == STAR_CONTROL_BALL)
control = STAR_CONTROL_BLOCK;
else
control = STAR_CONTROL_BALL;
star_display_board_info(current_level);
break;
default:
if (rb->default_event_handler(key) == SYS_USB_CONNECTED)
{
usb_detected = true;
return 0;
}
break;
}
#if defined(STAR_LEVEL_DOWN_PRE) || \
defined(STAR_LEVEL_UP_PRE) || \
defined(STAR_TOGGLE_CONTROL_PRE)
if (key != BUTTON_NONE)
lastkey = key;
#endif
}
if (control == STAR_CONTROL_BALL)
{
board[ball_y][ball_x] = STAR_VOID;
while ((board[ball_y + move_y][ball_x + move_x] == STAR_VOID
|| board[ball_y + move_y][ball_x + move_x] == STAR_STAR))
{
star_animate_tile(BALL, STAR_OFFSET_X + ball_x * TILE_WIDTH,
STAR_OFFSET_Y + ball_y * TILE_HEIGHT,
move_x, move_y);
ball_x += move_x;
ball_y += move_y;
if (board[ball_y][ball_x] == STAR_STAR)
{
board[ball_y][ball_x] = STAR_VOID;
star_count--;
star_display_board_info(current_level);
}
}
board[ball_y][ball_x] = STAR_BALL;
}
else
{
board[block_y][block_x] = STAR_VOID;
while (board[block_y + move_y][block_x + move_x] == STAR_VOID)
{
star_animate_tile(BLOCK, STAR_OFFSET_X + block_x * TILE_WIDTH,
STAR_OFFSET_Y + block_y * TILE_HEIGHT,
move_x, move_y);
block_x += move_x;
block_y += move_y;
}
board[block_y][block_x] = STAR_BLOCK;
}
if (star_count == 0)
{
current_level++;
if (current_level == STAR_LEVEL_COUNT)
{
rb->lcd_clear_display();
rb->splash(HZ*2, "Congratulations!");
rb->lcd_update();
/* There is no such level as STAR_LEVEL_COUNT so it can't be the
* current_level */
current_level--;
return 1;
}
star_load_level(current_level);
}
}
}
/**
* Display help text.
*/
static bool star_help(void)
{
static char* help_text[] = {
"Star", "", "Aim", "",
"Take", "all", "the", "stars", "to", "go", "to", "the", "next", "level.",
"You", "can", "toggle", "control", "with", "the", "block", "to", "use",
"it", "as", "a", "mobile", "wall.", "The", "block", "cannot", "take",
"stars.", "", "",
"Controls", "",
STAR_TOGGLE_CONTROL_NAME":", "Toggle", "control", "",
STAR_QUIT_NAME":", "Exit", "",
STAR_LEVEL_DOWN_NAME":", "Prev.", "level", "",
STAR_LEVEL_REPEAT_NAME":", "Reset", "level", "",
STAR_LEVEL_UP_NAME":", "Next", "level"
};
static struct style_text formation[]={
{ 0, TEXT_CENTER|TEXT_UNDERLINE },
{ 2, C_RED },
{ 35, C_RED },
LAST_STYLE_ITEM
};
#if LCD_DEPTH > 1 && !defined(HAVE_LCD_COLOR)
rb->lcd_set_background(LCD_WHITE);
rb->lcd_set_foreground(LCD_BLACK);
#endif
if (display_text(ARRAYLEN(help_text), help_text, formation, NULL, true))
return true;
#if LCD_DEPTH > 1 && !defined(HAVE_LCD_COLOR)
rb->lcd_set_background(LCD_BLACK);
rb->lcd_set_foreground(LCD_WHITE);
#endif
return false;
}
/**
* Display the choice menu.
*/
static int star_menu(void)
{
int selection, level=1;
bool menu_quit = false;
MENUITEM_STRINGLIST(menu, "Star Menu", NULL,
"Start Game","Choose Level",
"Help", "Playback Control", "Quit");
while(!menu_quit)
{
switch(rb->do_menu(&menu, &selection, NULL, false))
{
case 0:
/* use system font and get the size of char */
rb->lcd_setfont(FONT_SYSFIXED);
rb->lcd_getstringsize("a", &char_width, &char_height);
star_run_game(level-1);
rb->lcd_setfont(FONT_UI);
break;
case 1:
rb->set_int("Level", "", UNIT_INT, &level,
NULL, 1, 1, STAR_LEVEL_COUNT, NULL );
break;
case 2:
if(star_help())
usb_detected = true;
break;
case 3:
playback_control(NULL);
break;
case 4:
menu_quit = true;
break;
}
if(usb_detected)
return PLUGIN_USB_CONNECTED;
}
return PLUGIN_OK;
}
/**
* Main entry point
*/
enum plugin_status plugin_start(const void* parameter)
{
(void)parameter;
#if LCD_DEPTH > 1
rb->lcd_set_backdrop(NULL);
rb->lcd_set_background( LCD_BLACK );
rb->lcd_set_foreground( LCD_WHITE );
#endif
/* display choice menu */
return star_menu();
}