Something went wrong. Try again.
A modern, network-enabled music player platform built on Rockbox technology. rockboxd.tsiry-sandratraina.com
rust deno navidrome airplay libadwaita zig mpris snapcast mpd rockbox audio subsonic
Something went wrong. Try again.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481/*************************************************************************** * __________ __ ___. * Open \______ \ ____ ____ | | _\_ |__ _______ ___ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ * \/ \/ \/ \/ \/ * * 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_REPEAT)#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 "Long SELECT"#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 == 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"
#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 == 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"
#elif CONFIG_KEYPAD == FIIO_M3K_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_BACK#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 "BACK"
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD || CONFIG_KEYPAD == HIDIZS_AP80MAX_PAD#define STAR_QUIT BUTTON_POWER#define STAR_QUIT_NAME "POWER"
#elif CONFIG_KEYPAD == SDL_PAD/* use touch screen */#elif CONFIG_KEYPAD == MA_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_MENU|BUTTON_UP)#define STAR_LEVEL_DOWN (BUTTON_MENU|BUTTON_DOWN)#define STAR_LEVEL_REPEAT BUTTON_MENU#define STAR_TOGGLE_CONTROL_NAME "PLAY"#define STAR_QUIT_NAME "BACK"#define STAR_LEVEL_UP_NAME "MENU+UP"#define STAR_LEVEL_DOWN_NAME "MENU+DOWN"#define STAR_LEVEL_REPEAT_NAME "MENU"
#elif CONFIG_KEYPAD == RG_NANO_PAD
#define STAR_QUIT BUTTON_START#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_A#define STAR_LEVEL_UP BUTTON_R#define STAR_LEVEL_DOWN BUTTON_L#define STAR_LEVEL_REPEAT BUTTON_B#define STAR_TOGGLE_CONTROL_NAME "A"#define STAR_QUIT_NAME "START"#define STAR_LEVEL_UP_NAME "R"#define STAR_LEVEL_DOWN_NAME "L"#define STAR_LEVEL_REPEAT_NAME "B"
#elif CONFIG_KEYPAD == N3DS_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 "B"#define STAR_LEVEL_UP_NAME "X"#define STAR_LEVEL_DOWN_NAME "Start"#define STAR_LEVEL_REPEAT_NAME "Y"
#elif CONFIG_KEYPAD == ECHO_R1_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_A#define STAR_LEVEL_UP BUTTON_START#define STAR_LEVEL_DOWN BUTTON_SELECT#define STAR_LEVEL_REPEAT BUTTON_X#define STAR_TOGGLE_CONTROL_NAME "A"#define STAR_QUIT_NAME "Power"#define STAR_LEVEL_UP_NAME "Start"#define STAR_LEVEL_DOWN_NAME "Select"#define STAR_LEVEL_REPEAT_NAME "X"
#elif CONFIG_KEYPAD == PSP_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 "Cross"#define STAR_LEVEL_UP_NAME "Triangle"#define STAR_LEVEL_DOWN_NAME "Start"#define STAR_LEVEL_REPEAT_NAME "Square"
#else#error No keymap defined!#endif
#ifdef HAVE_TOUCHSCREEN#ifndef STAR_QUIT#define STAR_QUIT BUTTON_TOPLEFT | BUTTON_CENTER#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", 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();}