A modern Music Player Daemon based on Rockbox open source high quality audio player
libadwaita audio rust zig deno mpris rockbox mpd
at master 1463 lines 46 kB view raw
1/*************************************************************************** 2 * __________ __ ___. 3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___ 4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / 5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < 6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ 7 * \/ \/ \/ \/ \/ 8 * $Id$ 9 * 10 * Copyright (C) 2002 Frederic Dang Ngoc 11 * 12 * This program is free software; you can redistribute it and/or 13 * modify it under the terms of the GNU General Public License 14 * as published by the Free Software Foundation; either version 2 15 * of the License, or (at your option) any later version. 16 * 17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 18 * KIND, either express or implied. 19 * 20 ****************************************************************************/ 21#include "plugin.h" 22 23#include "lib/display_text.h" 24#include "lib/playback_control.h" 25 26 27 28/* size of a level in file */ 29#define STAR_LEVEL_SIZE ((STAR_WIDTH + 1) * STAR_HEIGHT + 1) 30 31/* size of the game board */ 32#define STAR_WIDTH 16 33#define STAR_HEIGHT 9 34 35/* number of level */ 36#define STAR_LEVEL_COUNT 20 37 38/* values of object in the board */ 39#define STAR_VOID '.' 40#define STAR_WALL '*' 41#define STAR_STAR 'o' 42#define STAR_BALL 'X' 43#define STAR_BLOCK 'x' 44 45/* sleep time between two frames */ 46#if (LCD_HEIGHT * LCD_WIDTH >= 70000) && defined(IPOD_ARCH) 47/* iPod 5G LCD is *slow* */ 48#define STAR_SLEEP rb->yield(); 49#elif (LCD_HEIGHT * LCD_WIDTH >= 30000) 50#define STAR_SLEEP rb->sleep(0); 51#else 52#define STAR_SLEEP rb->sleep(1); 53#endif 54 55/* value of ball and block control */ 56#define STAR_CONTROL_BALL 0 57#define STAR_CONTROL_BLOCK 1 58 59/* variable button definitions */ 60#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \ 61 (CONFIG_KEYPAD == IRIVER_H300_PAD) 62#define STAR_QUIT BUTTON_OFF 63#define STAR_LEFT BUTTON_LEFT 64#define STAR_RIGHT BUTTON_RIGHT 65#define STAR_UP BUTTON_UP 66#define STAR_DOWN BUTTON_DOWN 67#define STAR_TOGGLE_CONTROL BUTTON_MODE 68#define STAR_TOGGLE_CONTROL2 BUTTON_SELECT 69#define STAR_LEVEL_UP (BUTTON_ON | BUTTON_RIGHT) 70#define STAR_LEVEL_DOWN (BUTTON_ON | BUTTON_LEFT) 71#define STAR_LEVEL_REPEAT (BUTTON_ON | BUTTON_SELECT) 72#define STAR_TOGGLE_CONTROL_NAME "MODE/SELECT" 73#define STAR_QUIT_NAME "OFF" 74#define STAR_LEVEL_UP_NAME "ON + RIGHT" 75#define STAR_LEVEL_DOWN_NAME "ON + LEFT" 76#define STAR_LEVEL_REPEAT_NAME "ON + NAVI" 77 78#define STAR_RC_QUIT BUTTON_RC_STOP 79#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \ 80 (CONFIG_KEYPAD == IPOD_3G_PAD) || \ 81 (CONFIG_KEYPAD == IPOD_1G2G_PAD) 82 83#define STAR_QUIT (BUTTON_SELECT | BUTTON_REPEAT) 84#define STAR_LEFT BUTTON_LEFT 85#define STAR_RIGHT BUTTON_RIGHT 86#define STAR_UP BUTTON_MENU 87#define STAR_DOWN BUTTON_PLAY 88#define STAR_TOGGLE_CONTROL_PRE BUTTON_SELECT 89#define STAR_TOGGLE_CONTROL (BUTTON_SELECT | BUTTON_REL) 90#define STAR_LEVEL_UP (BUTTON_SELECT | BUTTON_RIGHT) 91#define STAR_LEVEL_DOWN (BUTTON_SELECT | BUTTON_LEFT) 92#define STAR_LEVEL_REPEAT (BUTTON_SELECT | BUTTON_PLAY) 93#define STAR_TOGGLE_CONTROL_NAME "SELECT" 94#define STAR_QUIT_NAME "Long SELECT" 95#define STAR_LEVEL_UP_NAME "S >" 96#define STAR_LEVEL_DOWN_NAME "S <" 97#define STAR_LEVEL_REPEAT_NAME "S + PLAY" 98 99#elif (CONFIG_KEYPAD == IAUDIO_X5M5_PAD) 100 101#define STAR_QUIT BUTTON_POWER 102#define STAR_LEFT BUTTON_LEFT 103#define STAR_RIGHT BUTTON_RIGHT 104#define STAR_UP BUTTON_UP 105#define STAR_DOWN BUTTON_DOWN 106#define STAR_TOGGLE_CONTROL BUTTON_SELECT 107#define STAR_LEVEL_UP_PRE BUTTON_REC 108#define STAR_LEVEL_UP (BUTTON_REC|BUTTON_REL) 109#define STAR_LEVEL_DOWN_PRE BUTTON_REC 110#define STAR_LEVEL_DOWN (BUTTON_REC|BUTTON_REPEAT) 111#define STAR_LEVEL_REPEAT BUTTON_PLAY 112#define STAR_TOGGLE_CONTROL_NAME "SELECT" 113#define STAR_QUIT_NAME "POWER" 114#define STAR_LEVEL_UP_NAME "REC" 115#define STAR_LEVEL_DOWN_NAME "REC.." 116#define STAR_LEVEL_REPEAT_NAME "PLAY" 117 118#elif (CONFIG_KEYPAD == GIGABEAT_PAD) 119 120#define STAR_QUIT BUTTON_POWER 121#define STAR_LEFT BUTTON_LEFT 122#define STAR_RIGHT BUTTON_RIGHT 123#define STAR_UP BUTTON_UP 124#define STAR_DOWN BUTTON_DOWN 125#define STAR_TOGGLE_CONTROL BUTTON_SELECT 126#define STAR_LEVEL_UP BUTTON_VOL_UP 127#define STAR_LEVEL_DOWN BUTTON_VOL_DOWN 128#define STAR_LEVEL_REPEAT BUTTON_A 129#define STAR_TOGGLE_CONTROL_NAME "SELECT" 130#define STAR_QUIT_NAME "POWER" 131#define STAR_LEVEL_UP_NAME "VOL UP" 132#define STAR_LEVEL_DOWN_NAME "VOL DOWN" 133#define STAR_LEVEL_REPEAT_NAME "A" 134 135#elif (CONFIG_KEYPAD == SANSA_E200_PAD) || \ 136(CONFIG_KEYPAD == SANSA_C200_PAD) || \ 137(CONFIG_KEYPAD == SANSA_CLIP_PAD) || \ 138(CONFIG_KEYPAD == SANSA_M200_PAD) 139 140#define STAR_QUIT BUTTON_POWER 141#define STAR_LEFT BUTTON_LEFT 142#define STAR_RIGHT BUTTON_RIGHT 143#define STAR_UP BUTTON_UP 144#define STAR_DOWN BUTTON_DOWN 145#define STAR_TOGGLE_CONTROL BUTTON_SELECT 146#define STAR_LEVEL_UP (BUTTON_SELECT | BUTTON_RIGHT) 147#define STAR_LEVEL_DOWN (BUTTON_SELECT | BUTTON_LEFT) 148#define STAR_LEVEL_REPEAT (BUTTON_SELECT | BUTTON_DOWN) 149#define STAR_TOGGLE_CONTROL_NAME "SELECT" 150#define STAR_QUIT_NAME "POWER" 151#define STAR_LEVEL_UP_NAME "SELECT + RIGHT" 152#define STAR_LEVEL_DOWN_NAME "SELECT + LEFT" 153#define STAR_LEVEL_REPEAT_NAME "SELECT + DOWN" 154 155#elif (CONFIG_KEYPAD == SANSA_FUZE_PAD) 156 157#define STAR_QUIT (BUTTON_HOME|BUTTON_REPEAT) 158#define STAR_LEFT BUTTON_LEFT 159#define STAR_RIGHT BUTTON_RIGHT 160#define STAR_UP BUTTON_UP 161#define STAR_DOWN BUTTON_DOWN 162#define STAR_TOGGLE_CONTROL BUTTON_SELECT 163#define STAR_LEVEL_UP (BUTTON_SELECT | BUTTON_RIGHT) 164#define STAR_LEVEL_DOWN (BUTTON_SELECT | BUTTON_LEFT) 165#define STAR_LEVEL_REPEAT (BUTTON_SELECT | BUTTON_DOWN) 166#define STAR_TOGGLE_CONTROL_NAME "SELECT" 167#define STAR_QUIT_NAME "HOME" 168#define STAR_LEVEL_UP_NAME "SELECT + RIGHT" 169#define STAR_LEVEL_DOWN_NAME "SELECT + LEFT" 170#define STAR_LEVEL_REPEAT_NAME "SELECT + DOWN" 171 172#elif (CONFIG_KEYPAD == IRIVER_H10_PAD) 173 174#define STAR_QUIT BUTTON_POWER 175#define STAR_LEFT BUTTON_LEFT 176#define STAR_RIGHT BUTTON_RIGHT 177#define STAR_UP BUTTON_SCROLL_UP 178#define STAR_DOWN BUTTON_SCROLL_DOWN 179#define STAR_TOGGLE_CONTROL BUTTON_REW 180#define STAR_LEVEL_UP (BUTTON_PLAY | BUTTON_SCROLL_UP) 181#define STAR_LEVEL_DOWN (BUTTON_PLAY | BUTTON_SCROLL_DOWN) 182#define STAR_LEVEL_REPEAT (BUTTON_PLAY | BUTTON_RIGHT) 183#define STAR_TOGGLE_CONTROL_NAME "REW" 184#define STAR_QUIT_NAME "POWER" 185#define STAR_LEVEL_UP_NAME "PLAY+UP" 186#define STAR_LEVEL_DOWN_NAME "PLAY+DOWN" 187#define STAR_LEVEL_REPEAT_NAME "PLAY+RIGHT" 188 189#elif (CONFIG_KEYPAD == GIGABEAT_S_PAD) 190 191#define STAR_QUIT BUTTON_BACK 192#define STAR_LEFT BUTTON_LEFT 193#define STAR_RIGHT BUTTON_RIGHT 194#define STAR_UP BUTTON_UP 195#define STAR_DOWN BUTTON_DOWN 196#define STAR_TOGGLE_CONTROL BUTTON_SELECT 197#define STAR_LEVEL_UP BUTTON_VOL_UP 198#define STAR_LEVEL_DOWN BUTTON_VOL_DOWN 199#define STAR_LEVEL_REPEAT BUTTON_MENU 200#define STAR_TOGGLE_CONTROL_NAME "SELECT" 201#define STAR_QUIT_NAME "BACK" 202#define STAR_LEVEL_UP_NAME "VOL UP" 203#define STAR_LEVEL_DOWN_NAME "VOL DOWN" 204#define STAR_LEVEL_REPEAT_NAME "MENU" 205 206#elif (CONFIG_KEYPAD == MROBE100_PAD) 207 208#define STAR_QUIT BUTTON_POWER 209#define STAR_LEFT BUTTON_LEFT 210#define STAR_RIGHT BUTTON_RIGHT 211#define STAR_UP BUTTON_UP 212#define STAR_DOWN BUTTON_DOWN 213#define STAR_TOGGLE_CONTROL BUTTON_SELECT 214#define STAR_LEVEL_UP BUTTON_PLAY 215#define STAR_LEVEL_DOWN BUTTON_MENU 216#define STAR_LEVEL_REPEAT BUTTON_DISPLAY 217#define STAR_TOGGLE_CONTROL_NAME "SELECT" 218#define STAR_QUIT_NAME "POWER" 219#define STAR_LEVEL_UP_NAME "PLAY" 220#define STAR_LEVEL_DOWN_NAME "MENU" 221#define STAR_LEVEL_REPEAT_NAME "DISPLAY" 222 223#elif CONFIG_KEYPAD == IAUDIO_M3_PAD 224 225#define STAR_QUIT BUTTON_RC_REC 226#define STAR_LEFT BUTTON_RC_REW 227#define STAR_RIGHT BUTTON_RC_FF 228#define STAR_UP BUTTON_RC_VOL_UP 229#define STAR_DOWN BUTTON_RC_VOL_DOWN 230#define STAR_TOGGLE_CONTROL BUTTON_RC_MODE 231#define STAR_LEVEL_UP (BUTTON_RC_PLAY|BUTTON_RC_VOL_UP) 232#define STAR_LEVEL_DOWN (BUTTON_RC_PLAY|BUTTON_RC_VOL_DOWN) 233#define STAR_LEVEL_REPEAT (BUTTON_RC_PLAY|BUTTON_RC_MENU) 234#define STAR_TOGGLE_CONTROL_NAME "MODE" 235#define STAR_QUIT_NAME "REC" 236#define STAR_LEVEL_UP_NAME "PLAY+VOL+" 237#define STAR_LEVEL_DOWN_NAME "PLAY+VOL-" 238#define STAR_LEVEL_REPEAT_NAME "PLAY+MENU" 239 240#elif (CONFIG_KEYPAD == COWON_D2_PAD) 241 242#define STAR_QUIT BUTTON_POWER 243#define STAR_QUIT_NAME "POWER" 244 245#elif CONFIG_KEYPAD == CREATIVEZVM_PAD 246 247#define STAR_QUIT BUTTON_BACK 248#define STAR_LEFT BUTTON_LEFT 249#define STAR_RIGHT BUTTON_RIGHT 250#define STAR_UP BUTTON_UP 251#define STAR_DOWN BUTTON_DOWN 252#define STAR_TOGGLE_CONTROL BUTTON_PLAY 253#define STAR_LEVEL_UP (BUTTON_CUSTOM | BUTTON_UP) 254#define STAR_LEVEL_DOWN (BUTTON_CUSTOM | BUTTON_DOWN) 255#define STAR_LEVEL_REPEAT (BUTTON_CUSTOM | BUTTON_RIGHT) 256#define STAR_TOGGLE_CONTROL_NAME "PLAY" 257#define STAR_QUIT_NAME "BACK" 258#define STAR_LEVEL_UP_NAME "CUSTOM+UP" 259#define STAR_LEVEL_DOWN_NAME "CUSTOM+DOWN" 260#define STAR_LEVEL_REPEAT_NAME "CUSTOM+RIGHT" 261 262#elif CONFIG_KEYPAD == CREATIVE_ZENXFI3_PAD 263 264#define STAR_QUIT BUTTON_POWER 265#define STAR_LEFT BUTTON_BACK 266#define STAR_RIGHT BUTTON_MENU 267#define STAR_UP BUTTON_UP 268#define STAR_DOWN BUTTON_DOWN 269#define STAR_TOGGLE_CONTROL BUTTON_PLAY 270#define STAR_LEVEL_UP BUTTON_VOL_UP 271#define STAR_LEVEL_DOWN BUTTON_VOL_DOWN 272#define STAR_LEVEL_REPEAT (BUTTON_PLAY | BUTTON_REPEAT) 273#define STAR_TOGGLE_CONTROL_NAME "PLAY" 274#define STAR_QUIT_NAME "POWER" 275#define STAR_LEVEL_UP_NAME "VOL+" 276#define STAR_LEVEL_DOWN_NAME "VOL-" 277#define STAR_LEVEL_REPEAT_NAME "Hold PLAY button" 278 279#elif CONFIG_KEYPAD == PHILIPS_HDD1630_PAD 280 281#define STAR_QUIT BUTTON_POWER 282#define STAR_LEFT BUTTON_LEFT 283#define STAR_RIGHT BUTTON_RIGHT 284#define STAR_UP BUTTON_UP 285#define STAR_DOWN BUTTON_DOWN 286#define STAR_TOGGLE_CONTROL BUTTON_SELECT 287#define STAR_LEVEL_UP BUTTON_VOL_UP 288#define STAR_LEVEL_DOWN BUTTON_VOL_DOWN 289#define STAR_LEVEL_REPEAT BUTTON_VIEW 290#define STAR_TOGGLE_CONTROL_NAME "SELECT" 291#define STAR_QUIT_NAME "POWER" 292#define STAR_LEVEL_UP_NAME "VOL UP" 293#define STAR_LEVEL_DOWN_NAME "VOL DOWN" 294#define STAR_LEVEL_REPEAT_NAME "VIEW" 295 296#elif CONFIG_KEYPAD == PHILIPS_HDD6330_PAD 297 298#define STAR_QUIT BUTTON_POWER 299#define STAR_LEFT BUTTON_LEFT 300#define STAR_RIGHT BUTTON_RIGHT 301#define STAR_UP BUTTON_UP 302#define STAR_DOWN BUTTON_DOWN 303#define STAR_TOGGLE_CONTROL BUTTON_PLAY 304#define STAR_LEVEL_UP BUTTON_VOL_UP 305#define STAR_LEVEL_DOWN BUTTON_VOL_DOWN 306#define STAR_LEVEL_REPEAT BUTTON_NEXT 307#define STAR_TOGGLE_CONTROL_NAME "PLAY" 308#define STAR_QUIT_NAME "POWER" 309#define STAR_LEVEL_UP_NAME "VOL +" 310#define STAR_LEVEL_DOWN_NAME "VOL -" 311#define STAR_LEVEL_REPEAT_NAME "NEXT" 312 313#elif CONFIG_KEYPAD == PHILIPS_SA9200_PAD 314 315#define STAR_QUIT BUTTON_POWER 316#define STAR_LEFT BUTTON_PREV 317#define STAR_RIGHT BUTTON_NEXT 318#define STAR_UP BUTTON_UP 319#define STAR_DOWN BUTTON_DOWN 320#define STAR_TOGGLE_CONTROL BUTTON_PLAY 321#define STAR_LEVEL_UP BUTTON_VOL_UP 322#define STAR_LEVEL_DOWN BUTTON_VOL_DOWN 323#define STAR_LEVEL_REPEAT BUTTON_RIGHT 324#define STAR_TOGGLE_CONTROL_NAME "PLAY" 325#define STAR_QUIT_NAME "POWER" 326#define STAR_LEVEL_UP_NAME "VOL UP" 327#define STAR_LEVEL_DOWN_NAME "VOL DOWN" 328#define STAR_LEVEL_REPEAT_NAME "RIGHT" 329 330#elif (CONFIG_KEYPAD == ONDAVX747_PAD) 331 332#define STAR_QUIT BUTTON_POWER 333#define STAR_QUIT_NAME "POWER" 334 335#elif (CONFIG_KEYPAD == ONDAVX777_PAD) 336#define STAR_QUIT BUTTON_POWER 337#define STAR_QUIT_NAME "POWER" 338 339#elif CONFIG_KEYPAD == MROBE500_PAD 340#define STAR_QUIT BUTTON_POWER 341#define STAR_QUIT_NAME "POWER" 342 343#elif CONFIG_KEYPAD == SAMSUNG_YH820_PAD 344 345#define STAR_QUIT (BUTTON_REW|BUTTON_REPEAT) 346#define STAR_LEFT BUTTON_LEFT 347#define STAR_RIGHT BUTTON_RIGHT 348#define STAR_UP BUTTON_UP 349#define STAR_DOWN BUTTON_DOWN 350#define STAR_LEVEL_UP (BUTTON_REC|BUTTON_UP) 351#define STAR_LEVEL_DOWN (BUTTON_REC|BUTTON_DOWN) 352#define STAR_TOGGLE_CONTROL BUTTON_PLAY 353#define STAR_LEVEL_REPEAT_PRE BUTTON_FFWD 354#define STAR_LEVEL_REPEAT (BUTTON_FFWD|BUTTON_REPEAT) 355#define STAR_TOGGLE_CONTROL_NAME "PLAY" 356#define STAR_QUIT_NAME "LONG REW" 357#define STAR_LEVEL_UP_NAME "REC+UP" 358#define STAR_LEVEL_DOWN_NAME "REC+DOWN" 359#define STAR_LEVEL_REPEAT_NAME "LONG FFWD" 360 361#elif CONFIG_KEYPAD == SAMSUNG_YH92X_PAD 362 363#define STAR_QUIT (BUTTON_REW|BUTTON_REPEAT) 364#define STAR_LEFT BUTTON_LEFT 365#define STAR_RIGHT BUTTON_RIGHT 366#define STAR_UP BUTTON_UP 367#define STAR_DOWN BUTTON_DOWN 368#define STAR_LEVEL_UP (BUTTON_FFWD|BUTTON_UP) 369#define STAR_LEVEL_DOWN (BUTTON_FFWD|BUTTON_DOWN) 370#define STAR_TOGGLE_CONTROL (BUTTON_PLAY|BUTTON_REL) 371#define STAR_LEVEL_REPEAT_PRE (BUTTON_FFWD|BUTTON_REPEAT) 372#define STAR_LEVEL_REPEAT (BUTTON_FFWD|BUTTON_REL) 373#define STAR_TOGGLE_CONTROL_NAME "PLAY" 374#define STAR_QUIT_NAME "LONG REW" 375#define STAR_LEVEL_UP_NAME "FFWD+UP" 376#define STAR_LEVEL_DOWN_NAME "FFWD+DOWN" 377#define STAR_LEVEL_REPEAT_NAME "LONG FFWD" 378 379#elif CONFIG_KEYPAD == PBELL_VIBE500_PAD 380 381#define STAR_QUIT BUTTON_REC 382#define STAR_LEFT BUTTON_PREV 383#define STAR_RIGHT BUTTON_NEXT 384#define STAR_UP BUTTON_UP 385#define STAR_DOWN BUTTON_DOWN 386#define STAR_TOGGLE_CONTROL BUTTON_PLAY 387#define STAR_LEVEL_UP BUTTON_OK 388#define STAR_LEVEL_DOWN BUTTON_CANCEL 389#define STAR_LEVEL_REPEAT BUTTON_MENU 390#define STAR_TOGGLE_CONTROL_NAME "PLAY" 391#define STAR_QUIT_NAME "REC" 392#define STAR_LEVEL_UP_NAME "OK" 393#define STAR_LEVEL_DOWN_NAME "CANCEL" 394#define STAR_LEVEL_REPEAT_NAME "MENU" 395 396#elif CONFIG_KEYPAD == MPIO_HD200_PAD 397 398#define STAR_QUIT (BUTTON_REC | BUTTON_PLAY) 399#define STAR_LEFT BUTTON_VOL_DOWN 400#define STAR_RIGHT BUTTON_VOL_UP 401#define STAR_UP BUTTON_REW 402#define STAR_DOWN BUTTON_FF 403#define STAR_TOGGLE_CONTROL_PRE BUTTON_FUNC 404#define STAR_TOGGLE_CONTROL (BUTTON_FUNC | BUTTON_REL) 405#define STAR_LEVEL_UP BUTTON_PLAY 406#define STAR_LEVEL_DOWN BUTTON_REC 407#define STAR_LEVEL_REPEAT (BUTTON_FUNC | BUTTON_REPEAT) 408#define STAR_TOGGLE_CONTROL_NAME "FUNC" 409#define STAR_QUIT_NAME "REC + PLAY" 410#define STAR_LEVEL_UP_NAME "PLAY" 411#define STAR_LEVEL_DOWN_NAME "REC" 412#define STAR_LEVEL_REPEAT_NAME "FUNC LONG" 413 414#elif CONFIG_KEYPAD == MPIO_HD300_PAD 415 416#define STAR_QUIT (BUTTON_MENU | BUTTON_REPEAT) 417#define STAR_LEFT BUTTON_REW 418#define STAR_RIGHT BUTTON_FF 419#define STAR_UP BUTTON_UP 420#define STAR_DOWN BUTTON_DOWN 421#define STAR_TOGGLE_CONTROL_PRE BUTTON_ENTER 422#define STAR_TOGGLE_CONTROL (BUTTON_ENTER | BUTTON_REL) 423#define STAR_LEVEL_UP (BUTTON_PLAY | BUTTON_FF) 424#define STAR_LEVEL_DOWN (BUTTON_PLAY | BUTTON_REW) 425#define STAR_LEVEL_REPEAT (BUTTON_PLAY | BUTTON_REPEAT) 426#define STAR_TOGGLE_CONTROL_NAME "ENTER" 427#define STAR_QUIT_NAME "LONG MENU" 428#define STAR_LEVEL_UP_NAME "PLAY + FF" 429#define STAR_LEVEL_DOWN_NAME "PLAY + REW" 430#define STAR_LEVEL_REPEAT_NAME "LONG PLAY" 431 432#elif CONFIG_KEYPAD == SANSA_FUZEPLUS_PAD 433 434#define STAR_QUIT BUTTON_POWER 435#define STAR_LEFT BUTTON_LEFT 436#define STAR_RIGHT BUTTON_RIGHT 437#define STAR_UP BUTTON_UP 438#define STAR_DOWN BUTTON_DOWN 439#define STAR_TOGGLE_CONTROL BUTTON_PLAYPAUSE 440#define STAR_LEVEL_UP BUTTON_VOL_UP 441#define STAR_LEVEL_DOWN BUTTON_VOL_DOWN 442#define STAR_LEVEL_REPEAT (BUTTON_BACK | BUTTON_REPEAT) 443#define STAR_TOGGLE_CONTROL_NAME "SELECT" 444#define STAR_QUIT_NAME "POWER" 445#define STAR_LEVEL_UP_NAME "Vol+" 446#define STAR_LEVEL_DOWN_NAME "Vol-" 447#define STAR_LEVEL_REPEAT_NAME "BACK LONG" 448 449#elif CONFIG_KEYPAD == SANSA_CONNECT_PAD 450 451#define STAR_QUIT BUTTON_POWER 452#define STAR_LEFT BUTTON_LEFT 453#define STAR_RIGHT BUTTON_RIGHT 454#define STAR_UP BUTTON_UP 455#define STAR_DOWN BUTTON_DOWN 456#define STAR_TOGGLE_CONTROL BUTTON_SELECT 457#define STAR_LEVEL_UP BUTTON_VOL_UP 458#define STAR_LEVEL_DOWN BUTTON_VOL_DOWN 459#define STAR_LEVEL_REPEAT (BUTTON_PREV | BUTTON_REPEAT) 460#define STAR_TOGGLE_CONTROL_NAME "SELECT" 461#define STAR_QUIT_NAME "POWER" 462#define STAR_LEVEL_UP_NAME "Vol+" 463#define STAR_LEVEL_DOWN_NAME "Vol-" 464#define STAR_LEVEL_REPEAT_NAME "PREV LONG" 465 466#elif (CONFIG_KEYPAD == SAMSUNG_YPR0_PAD) 467 468#define STAR_QUIT BUTTON_BACK 469#define STAR_LEFT BUTTON_LEFT 470#define STAR_RIGHT BUTTON_RIGHT 471#define STAR_UP BUTTON_UP 472#define STAR_DOWN BUTTON_DOWN 473#define STAR_TOGGLE_CONTROL BUTTON_SELECT 474#define STAR_LEVEL_UP BUTTON_MENU 475#define STAR_LEVEL_DOWN BUTTON_POWER 476#define STAR_LEVEL_REPEAT BUTTON_USER 477#define STAR_TOGGLE_CONTROL_NAME "Select" 478#define STAR_QUIT_NAME "Back" 479#define STAR_LEVEL_UP_NAME "Menu" 480#define STAR_LEVEL_DOWN_NAME "Power" 481#define STAR_LEVEL_REPEAT_NAME "User" 482 483#elif (CONFIG_KEYPAD == HM60X_PAD) 484 485#define STAR_QUIT BUTTON_POWER 486#define STAR_LEFT BUTTON_LEFT 487#define STAR_RIGHT BUTTON_RIGHT 488#define STAR_UP BUTTON_UP 489#define STAR_DOWN BUTTON_DOWN 490#define STAR_TOGGLE_CONTROL BUTTON_SELECT 491#define STAR_LEVEL_UP (BUTTON_POWER | BUTTON_UP) 492#define STAR_LEVEL_DOWN (BUTTON_POWER | BUTTON_DOWN) 493#define STAR_LEVEL_REPEAT (BUTTON_POWER | BUTTON_SELECT) 494#define STAR_TOGGLE_CONTROL_NAME "SELECT" 495#define STAR_QUIT_NAME "POWER" 496#define STAR_LEVEL_UP_NAME "POWER + UP" 497#define STAR_LEVEL_DOWN_NAME "POWER + DOWN" 498#define STAR_LEVEL_REPEAT_NAME "POWER + SELECT" 499 500#elif (CONFIG_KEYPAD == HM801_PAD) 501 502#define STAR_QUIT BUTTON_POWER 503#define STAR_LEFT BUTTON_LEFT 504#define STAR_RIGHT BUTTON_RIGHT 505#define STAR_UP BUTTON_UP 506#define STAR_DOWN BUTTON_DOWN 507#define STAR_TOGGLE_CONTROL BUTTON_SELECT 508#define STAR_LEVEL_UP BUTTON_NEXT 509#define STAR_LEVEL_DOWN BUTTON_PREV 510#define STAR_LEVEL_REPEAT BUTTON_PLAY 511#define STAR_TOGGLE_CONTROL_NAME "SELECT" 512#define STAR_QUIT_NAME "POWER" 513#define STAR_LEVEL_UP_NAME "NEXT" 514#define STAR_LEVEL_DOWN_NAME "PREV" 515#define STAR_LEVEL_REPEAT_NAME "PLAY" 516 517#elif CONFIG_KEYPAD == SONY_NWZ_PAD 518#define STAR_QUIT BUTTON_BACK 519#define STAR_LEFT BUTTON_LEFT 520#define STAR_RIGHT BUTTON_RIGHT 521#define STAR_UP BUTTON_UP 522#define STAR_DOWN BUTTON_DOWN 523#define STAR_TOGGLE_CONTROL BUTTON_PLAY 524#define STAR_LEVEL_UP (BUTTON_POWER|BUTTON_UP) 525#define STAR_LEVEL_DOWN (BUTTON_POWER|BUTTON_DOWN) 526#define STAR_LEVEL_REPEAT (BUTTON_POWER|BUTTON_PLAY) 527#define STAR_LEVEL_UP_NAME "Option+Up" 528#define STAR_LEVEL_DOWN_NAME "Option+Down" 529#define STAR_LEVEL_REPEAT_NAME "Option+Play" 530#define STAR_TOGGLE_CONTROL_NAME "Play" 531#define STAR_QUIT_NAME "Back" 532 533#elif CONFIG_KEYPAD == CREATIVE_ZEN_PAD 534#define STAR_QUIT BUTTON_BACK 535#define STAR_LEFT BUTTON_LEFT 536#define STAR_RIGHT BUTTON_RIGHT 537#define STAR_UP BUTTON_UP 538#define STAR_DOWN BUTTON_DOWN 539#define STAR_TOGGLE_CONTROL BUTTON_SELECT 540#define STAR_LEVEL_UP BUTTON_MENU 541#define STAR_LEVEL_DOWN BUTTON_PLAYPAUSE 542#define STAR_LEVEL_REPEAT BUTTON_SHORTCUT 543#define STAR_LEVEL_UP_NAME "Menu" 544#define STAR_LEVEL_DOWN_NAME "Play/pause" 545#define STAR_LEVEL_REPEAT_NAME "Shortcut" 546#define STAR_TOGGLE_CONTROL_NAME "Select" 547#define STAR_QUIT_NAME "Back" 548 549#elif (CONFIG_KEYPAD == DX50_PAD) 550#define STAR_QUIT BUTTON_POWER 551#define STAR_QUIT_NAME "Power" 552 553#elif CONFIG_KEYPAD == CREATIVE_ZENXFI2_PAD 554#define STAR_QUIT BUTTON_POWER 555#define STAR_QUIT_NAME "POWER" 556#define STAR_TOGGLE_CONTROL BUTTON_MENU 557#define STAR_TOGGLE_CONTROL_NAME "MENU" 558 559#elif CONFIG_KEYPAD == AGPTEK_ROCKER_PAD 560#define STAR_QUIT BUTTON_POWER 561#define STAR_LEFT BUTTON_LEFT 562#define STAR_RIGHT BUTTON_RIGHT 563#define STAR_UP BUTTON_UP 564#define STAR_DOWN BUTTON_DOWN 565#define STAR_TOGGLE_CONTROL BUTTON_SELECT 566#define STAR_LEVEL_UP (BUTTON_VOLUP|BUTTON_UP) 567#define STAR_LEVEL_DOWN (BUTTON_VOLUP|BUTTON_DOWN) 568#define STAR_LEVEL_REPEAT (BUTTON_VOLUP|BUTTON_SELECT) 569#define STAR_LEVEL_UP_NAME "Option+Up" 570#define STAR_LEVEL_DOWN_NAME "Option+Down" 571#define STAR_LEVEL_REPEAT_NAME "Option+Play" 572#define STAR_TOGGLE_CONTROL_NAME "Play" 573#define STAR_QUIT_NAME "Back" 574 575#elif CONFIG_KEYPAD == XDUOO_X3_PAD 576#define STAR_QUIT BUTTON_POWER 577#define STAR_LEFT BUTTON_PREV 578#define STAR_RIGHT BUTTON_NEXT 579#define STAR_UP BUTTON_HOME 580#define STAR_DOWN BUTTON_OPTION 581#define STAR_TOGGLE_CONTROL BUTTON_PLAY 582#define STAR_LEVEL_UP (BUTTON_PLAY | BUTTON_NEXT) 583#define STAR_LEVEL_DOWN (BUTTON_PLAY | BUTTON_PREV) 584#define STAR_LEVEL_REPEAT (BUTTON_PLAY | BUTTON_OPTION) 585#define STAR_TOGGLE_CONTROL_NAME "PLAY" 586#define STAR_QUIT_NAME "POWER" 587#define STAR_LEVEL_UP_NAME "PLAY + NEXT" 588#define STAR_LEVEL_DOWN_NAME "PLAY + PREV" 589#define STAR_LEVEL_REPEAT_NAME "PLAY + OPTION" 590 591#elif CONFIG_KEYPAD == XDUOO_X3II_PAD || CONFIG_KEYPAD == XDUOO_X20_PAD 592#define STAR_QUIT BUTTON_POWER 593#define STAR_LEFT BUTTON_PREV 594#define STAR_RIGHT BUTTON_NEXT 595#define STAR_UP BUTTON_HOME 596#define STAR_DOWN BUTTON_OPTION 597#define STAR_TOGGLE_CONTROL BUTTON_PLAY 598#define STAR_LEVEL_UP (BUTTON_PLAY | BUTTON_NEXT) 599#define STAR_LEVEL_DOWN (BUTTON_PLAY | BUTTON_PREV) 600#define STAR_LEVEL_REPEAT (BUTTON_PLAY | BUTTON_OPTION) 601#define STAR_TOGGLE_CONTROL_NAME "PLAY" 602#define STAR_QUIT_NAME "POWER" 603#define STAR_LEVEL_UP_NAME "PLAY + NEXT" 604#define STAR_LEVEL_DOWN_NAME "PLAY + PREV" 605#define STAR_LEVEL_REPEAT_NAME "PLAY + OPTION" 606 607#elif CONFIG_KEYPAD == FIIO_M3K_LINUX_PAD 608#define STAR_QUIT BUTTON_POWER 609#define STAR_LEFT BUTTON_PREV 610#define STAR_RIGHT BUTTON_NEXT 611#define STAR_UP BUTTON_HOME 612#define STAR_DOWN BUTTON_OPTION 613#define STAR_TOGGLE_CONTROL BUTTON_PLAY 614#define STAR_LEVEL_UP (BUTTON_PLAY | BUTTON_NEXT) 615#define STAR_LEVEL_DOWN (BUTTON_PLAY | BUTTON_PREV) 616#define STAR_LEVEL_REPEAT (BUTTON_PLAY | BUTTON_OPTION) 617#define STAR_TOGGLE_CONTROL_NAME "PLAY" 618#define STAR_QUIT_NAME "POWER" 619#define STAR_LEVEL_UP_NAME "PLAY + NEXT" 620#define STAR_LEVEL_DOWN_NAME "PLAY + PREV" 621#define STAR_LEVEL_REPEAT_NAME "PLAY + OPTION" 622 623#elif CONFIG_KEYPAD == IHIFI_770_PAD || CONFIG_KEYPAD == IHIFI_800_PAD 624#define STAR_QUIT BUTTON_POWER 625#define STAR_LEFT BUTTON_HOME 626#define STAR_RIGHT BUTTON_VOL_DOWN 627#define STAR_UP BUTTON_PREV 628#define STAR_DOWN BUTTON_NEXT 629#define STAR_TOGGLE_CONTROL BUTTON_PLAY 630#define STAR_LEVEL_UP (BUTTON_POWER | BUTTON_VOL_UP) 631#define STAR_LEVEL_DOWN (BUTTON_POWER | BUTTON_VOL_DOWN) 632#define STAR_LEVEL_REPEAT (BUTTON_POWER | BUTTON_HOME) 633#define STAR_TOGGLE_CONTROL_NAME "PLAY" 634#define STAR_QUIT_NAME "POWER" 635#define STAR_LEVEL_UP_NAME "POWER + VOL+" 636#define STAR_LEVEL_DOWN_NAME "POWER + VOL-" 637#define STAR_LEVEL_REPEAT_NAME "POWER + HOME" 638 639#elif CONFIG_KEYPAD == EROSQ_PAD 640#define STAR_QUIT BUTTON_POWER 641#define STAR_LEFT BUTTON_SCROLL_BACK 642#define STAR_RIGHT BUTTON_SCROLL_FWD 643#define STAR_UP BUTTON_PREV 644#define STAR_DOWN BUTTON_NEXT 645#define STAR_TOGGLE_CONTROL BUTTON_PLAY 646#define STAR_LEVEL_UP BUTTON_VOL_UP 647#define STAR_LEVEL_DOWN BUTTON_VOL_DOWN 648#define STAR_LEVEL_REPEAT BUTTON_BACK 649#define STAR_TOGGLE_CONTROL_NAME "PLAY" 650#define STAR_QUIT_NAME "POWER" 651#define STAR_LEVEL_UP_NAME "VOL UP" 652#define STAR_LEVEL_DOWN_NAME "VOL DN" 653#define STAR_LEVEL_REPEAT_NAME "BACK" 654 655#elif CONFIG_KEYPAD == FIIO_M3K_PAD 656#define STAR_QUIT BUTTON_POWER 657#define STAR_LEFT BUTTON_LEFT 658#define STAR_RIGHT BUTTON_RIGHT 659#define STAR_UP BUTTON_UP 660#define STAR_DOWN BUTTON_DOWN 661#define STAR_TOGGLE_CONTROL BUTTON_PLAY 662#define STAR_LEVEL_UP BUTTON_VOL_UP 663#define STAR_LEVEL_DOWN BUTTON_VOL_DOWN 664#define STAR_LEVEL_REPEAT BUTTON_BACK 665#define STAR_TOGGLE_CONTROL_NAME "PLAY" 666#define STAR_QUIT_NAME "POWER" 667#define STAR_LEVEL_UP_NAME "VOL+" 668#define STAR_LEVEL_DOWN_NAME "VOL-" 669#define STAR_LEVEL_REPEAT_NAME "BACK" 670 671#elif CONFIG_KEYPAD == SHANLING_Q1_PAD 672#define STAR_QUIT BUTTON_POWER 673#define STAR_QUIT_NAME "POWER" 674 675 676#elif CONFIG_KEYPAD == SDL_PAD 677/* use touch screen */ 678#elif CONFIG_KEYPAD == MA_PAD 679#define STAR_QUIT BUTTON_BACK 680#define STAR_LEFT BUTTON_LEFT 681#define STAR_RIGHT BUTTON_RIGHT 682#define STAR_UP BUTTON_UP 683#define STAR_DOWN BUTTON_DOWN 684#define STAR_TOGGLE_CONTROL BUTTON_PLAY 685#define STAR_LEVEL_UP (BUTTON_MENU|BUTTON_UP) 686#define STAR_LEVEL_DOWN (BUTTON_MENU|BUTTON_DOWN) 687#define STAR_LEVEL_REPEAT BUTTON_MENU 688#define STAR_TOGGLE_CONTROL_NAME "PLAY" 689#define STAR_QUIT_NAME "BACK" 690#define STAR_LEVEL_UP_NAME "MENU+UP" 691#define STAR_LEVEL_DOWN_NAME "MENU+DOWN" 692#define STAR_LEVEL_REPEAT_NAME "MENU" 693 694#elif CONFIG_KEYPAD == RG_NANO_PAD 695 696#define STAR_QUIT BUTTON_START 697#define STAR_LEFT BUTTON_LEFT 698#define STAR_RIGHT BUTTON_RIGHT 699#define STAR_UP BUTTON_UP 700#define STAR_DOWN BUTTON_DOWN 701#define STAR_TOGGLE_CONTROL BUTTON_A 702#define STAR_LEVEL_UP BUTTON_R 703#define STAR_LEVEL_DOWN BUTTON_L 704#define STAR_LEVEL_REPEAT BUTTON_B 705#define STAR_TOGGLE_CONTROL_NAME "A" 706#define STAR_QUIT_NAME "START" 707#define STAR_LEVEL_UP_NAME "R" 708#define STAR_LEVEL_DOWN_NAME "L" 709#define STAR_LEVEL_REPEAT_NAME "B" 710 711#else 712#error No keymap defined! 713#endif 714 715#ifdef HAVE_TOUCHSCREEN 716#ifndef STAR_QUIT 717#define STAR_QUIT BUTTON_TOPLEFT | BUTTON_CENTER 718#define STAR_QUIT_NAME "TOPLEFT" 719#endif 720#ifndef STAR_LEFT 721#define STAR_LEFT BUTTON_MIDLEFT 722#endif 723#ifndef STAR_RIGHT 724#define STAR_RIGHT BUTTON_MIDRIGHT 725#endif 726#ifndef STAR_UP 727#define STAR_UP BUTTON_TOPMIDDLE 728#endif 729#ifndef STAR_DOWN 730#define STAR_DOWN BUTTON_BOTTOMMIDDLE 731#endif 732#ifndef STAR_TOGGLE_CONTROL 733#define STAR_TOGGLE_CONTROL BUTTON_CENTER 734#define STAR_TOGGLE_CONTROL_NAME "CENTER" 735#endif 736#ifndef STAR_LEVEL_UP 737#define STAR_LEVEL_UP BUTTON_TOPLEFT 738#define STAR_LEVEL_UP_NAME "TOPLEFT" 739#endif 740#ifndef STAR_LEVEL_DOWN 741#define STAR_LEVEL_DOWN BUTTON_BOTTOMLEFT 742#define STAR_LEVEL_DOWN_NAME "BOTTOMLEFT" 743#endif 744#ifndef STAR_LEVEL_REPEAT 745#define STAR_LEVEL_REPEAT BUTTON_BOTTOMRIGHT 746#define STAR_LEVEL_REPEAT_NAME "BOTTOMRIGHT" 747#endif 748#endif 749 750/* function returns because of USB? */ 751static bool usb_detected = false; 752 753/* position of the ball */ 754static int ball_x, ball_y; 755 756/* position of the block */ 757static int block_x, block_y; 758 759/* number of stars to get to finish the level */ 760static int star_count; 761 762/* the object we control : ball or block */ 763static int control; 764 765/* the current board */ 766static char board[STAR_HEIGHT][STAR_WIDTH]; 767 768#include "pluginbitmaps/star_tiles.h" 769 770#define TILE_WIDTH BMPWIDTH_star_tiles 771#define TILE_HEIGHT (BMPHEIGHT_star_tiles/5) 772#define STAR_OFFSET_X ((LCD_WIDTH - STAR_WIDTH * TILE_WIDTH) / 2) 773#define STAR_OFFSET_Y ((LCD_HEIGHT - STAR_HEIGHT * TILE_HEIGHT - MAX(TILE_HEIGHT, 8)) / 2) 774 775#define WALL 0 776#define SPACE 1 777#define BLOCK 2 778#define STAR 3 779#define BALL 4 780 781/* char font size */ 782static int char_width = -1; 783static int char_height = -1; 784 785/* this arrays contains a group of levels loaded into memory */ 786static unsigned char* levels = 787"****************\n" 788"*X**........o*x*\n" 789"*..........o.***\n" 790"*.......**o....*\n" 791"*...**.o......**\n" 792"**.o..o.....o..*\n" 793"*.o......o**.o.*\n" 794"*.....**o.....o*\n" 795"****************\n" 796"\n" 797".*..*.*.*...*.**\n" 798"*...o.........X*\n" 799"...*o..*o...o...\n" 800"*.*.o.....o..*.*\n" 801"......*...o...*.\n" 802"*....*x*..o....*\n" 803"...*..*.*...*oo*\n" 804"*.............*.\n" 805".*..*........*..\n" 806"\n" 807"****************\n" 808"*...........o*x*\n" 809"*...**......**X*\n" 810"*...*o.........*\n" 811"*.o.....o**...o*\n" 812"*.*o..o..o*..o**\n" 813"*.**o.*o..o.o***\n" 814"*o....**o......*\n" 815"****************\n" 816"\n" 817"****************\n" 818"*............*x*\n" 819"*.....*........*\n" 820"**o*o.o*o*o*o*o*\n" 821"*.*.*o.o*.*.*.**\n" 822"**o*o*o.o*o*o*o*\n" 823"*.....*........*\n" 824"*...*.......*X.*\n" 825"****************\n" 826"\n" 827".**************.\n" 828"*X..*...*..*...*\n" 829"*..*o.*.o..o.*.*\n" 830"**......*..*...*\n" 831"*o.*o*........**\n" 832"**.....*.o.*...*\n" 833"*o*..*.*.*...*x*\n" 834"*...*....o*..*o*\n" 835".**************.\n" 836"\n" 837"....************\n" 838"...*...o...*o.o*\n" 839"..*....o....*.**\n" 840".*.....o.......*\n" 841"*X.....o.......*\n" 842"**.....o..*...**\n" 843"*......o....*..*\n" 844"*x.*...o..**o..*\n" 845"****************\n" 846"\n" 847"****************\n" 848"*..............*\n" 849".**.***..*o.**o*\n" 850".*o..*o.*.*.*.*.\n" 851"..*..*..***.**..\n" 852".**..*..*o*.*o**\n" 853"*..............*\n" 854"*..X*o....x..*o*\n" 855"****************\n" 856"\n" 857"***************.\n" 858"*..o**.........*\n" 859"*..*o..**.o....*\n" 860"*..o**.*.*o....*\n" 861"**.....**..*o*.*\n" 862"**.*.......o*o.*\n" 863"*oxo*...o..*X*.*\n" 864"**.............*\n" 865".***************\n" 866"\n" 867"..*.***********.\n" 868".*o*o......*..X*\n" 869"*o.o*....o....*.\n" 870".*.*..o**..o*..*\n" 871"*..*o.*oxo....o*\n" 872"*.....o**.....*.\n" 873"*o*o.........*..\n" 874"*...........*...\n" 875".***********....\n" 876"\n" 877"....***********.\n" 878"*****.o........*\n" 879"*...x.***o.o*.o*\n" 880"*.o...*o.*o...*.\n" 881"*.....*..o..*.o*\n" 882"*o*o..*.o*..*X*.\n" 883".*o...***..***..\n" 884"*.........*.*.*.\n" 885".*********..*..*\n" 886"\n" 887"****************\n" 888"*......*......X*\n" 889"*..*oo.....oo.**\n" 890"**...o...**...o*\n" 891"*o....*o*oo..***\n" 892"**.**....**....*\n" 893"*o..o*.o....x.o*\n" 894"**o***....*...**\n" 895"***************.\n" 896"\n" 897"**.....**..****.\n" 898"*X*****o.***.o**\n" 899"*....oo.....o..*\n" 900"*.**..**o..*o*.*\n" 901"*.*.o.*.*o.**..*\n" 902"*.**..**...*x*.*\n" 903"*.....o........*\n" 904"*........o.....*\n" 905"****************\n" 906"\n" 907".**************.\n" 908"*.X*........o.**\n" 909"*.*...*o...o**.*\n" 910"*.......o....*.*\n" 911"*.o..........*o*\n" 912"*.*......o.....*\n" 913"**......o.o..*o*\n" 914"*x..*....o.*.*.*\n" 915".**************.\n" 916"\n" 917"****************\n" 918"*o*o........o*o*\n" 919"*.o*X......**..*\n" 920"*.x........o...*\n" 921"*........o*....*\n" 922"*......o.......*\n" 923"*.o*........*..*\n" 924"*o*o........o*o*\n" 925"****************\n" 926"\n" 927".******.********\n" 928"*.....o*.....o.*\n" 929"*.*.o.*..*...o.*\n" 930"*..X*...*oo.*o.*\n" 931".*.*...*.o..x*.*\n" 932"*o.......*..*o.*\n" 933".*......o.....*.\n" 934"*o............o*\n" 935"****************\n" 936"\n" 937"****************\n" 938"**.x*o.o......o*\n" 939"*o.Xo*o.......**\n" 940"**.***........**\n" 941"**.....o*o*....*\n" 942"*oo.......o*o..*\n" 943"**.o....****o..*\n" 944"**o*..*........*\n" 945"****************\n" 946"\n" 947"****************\n" 948"*.o*........*X.*\n" 949"*.*..o*oo*o..*.*\n" 950"*....*o**o*.o..*\n" 951"*.o*.......o*..*\n" 952"*..o*o....o*...*\n" 953"*.*..*.**o*..*.*\n" 954"*....o.*o...x..*\n" 955"****************\n" 956"\n" 957"****************\n" 958"*.o....o..x*...*\n" 959"*..*o*o...*o...*\n" 960"*...*o*....*o..*\n" 961"*...o..*...o*o.*\n" 962"*.*o*...*.o*...*\n" 963"*.o*o.*.o.*....*\n" 964"*o*X..*.....*..*\n" 965"****************\n" 966"\n" 967"****************\n" 968"*o...**.....**o*\n" 969"*.*..*......*o.*\n" 970"*.o*...o**..o..*\n" 971"*.*....*o......*\n" 972"*....*...o*....*\n" 973"*.**.o*.**o..*x*\n" 974"*.o*.*o.....**X*\n" 975"****************\n" 976"\n" 977"****************\n" 978"*...o*o........*\n" 979"**o..o*.**o...**\n" 980"*.*.*.o...*..*.*\n" 981"*.x.*..**..*.Xo*\n" 982"*.*..*...o.*.*.*\n" 983"**...o**.*o..o**\n" 984"*........o*o...*\n" 985"****************"; 986 987/** 988 * Do a pretty transition from one level to another. 989 */ 990static void star_transition_update(void) 991{ 992 const int center_x = LCD_WIDTH / 2; 993 const int center_y = LCD_HEIGHT / 2; 994 int x = 0; 995 int y = 0; 996#if LCD_WIDTH >= LCD_HEIGHT 997#if defined(IPOD_VIDEO) 998 const int step = 4; 999#else 1000 const int step = 1; 1001#endif 1002 const int lcd_demi_width = LCD_WIDTH / 2; 1003 int var_y = 0; 1004 1005 for (; x < lcd_demi_width ; x+=step) 1006 { 1007 var_y += LCD_HEIGHT; 1008 if (var_y > LCD_WIDTH) 1009 { 1010 var_y -= LCD_WIDTH; 1011 y+=step; 1012 } 1013 if( x ) 1014 { 1015 rb->lcd_update_rect(center_x - x, center_y - y, x*2, step); 1016 rb->lcd_update_rect(center_x - x, center_y + y - step, x*2, step); 1017 } 1018 if( y ) 1019 { 1020 rb->lcd_update_rect(center_x - x, center_y - y, step, y*2); 1021 rb->lcd_update_rect(center_x + x - step, center_y - y, step, y*2); 1022 } 1023 STAR_SLEEP 1024 } 1025#else 1026 int lcd_demi_height = LCD_HEIGHT / 2; 1027 int var_x = 0; 1028 1029 for (; y < lcd_demi_height ; y++) 1030 { 1031 var_x += LCD_WIDTH; 1032 if (var_x > LCD_HEIGHT) 1033 { 1034 var_x -= LCD_HEIGHT; 1035 x++; 1036 } 1037 if( x ) 1038 { 1039 rb->lcd_update_rect(center_x - x, center_y - y, x * 2, 1); 1040 rb->lcd_update_rect(center_x - x, center_y + y - 1, x * 2, 1); 1041 } 1042 if( y ) 1043 { 1044 rb->lcd_update_rect(center_x - x, center_y - y, 1, y * 2); 1045 rb->lcd_update_rect(center_x + x - 1, center_y - y, 1, y * 2); 1046 } 1047 STAR_SLEEP 1048 } 1049#endif 1050 rb->lcd_update(); 1051} 1052 1053/** 1054 * Display information board of the current level. 1055 */ 1056static void star_display_board_info(int current_level) 1057{ 1058 int label_pos_y, tile_pos_y; 1059 1060 if (TILE_HEIGHT > char_height) 1061 { 1062 tile_pos_y = LCD_HEIGHT - TILE_HEIGHT; 1063 label_pos_y = tile_pos_y + (TILE_HEIGHT - char_height) / 2; 1064 } 1065 else 1066 { 1067 label_pos_y = LCD_HEIGHT - char_height; 1068 tile_pos_y = label_pos_y + (char_height - TILE_HEIGHT) / 2; 1069 } 1070 1071 rb->lcd_putsxyf(STAR_OFFSET_X, label_pos_y, "L:%02d", current_level + 1); 1072 rb->lcd_putsxyf(LCD_WIDTH/2 - 2 * char_width, label_pos_y, "S:%02d", 1073 star_count); 1074 rb->lcd_putsxy(STAR_OFFSET_X + (STAR_WIDTH-1) * TILE_WIDTH - 2 * char_width, 1075 label_pos_y, "C:"); 1076 1077 rb->lcd_bitmap_part(star_tiles, 0, control == STAR_CONTROL_BALL ? 1078 BALL*TILE_HEIGHT : BLOCK*TILE_HEIGHT, 1079 STRIDE( SCREEN_MAIN, 1080 BMPWIDTH_star_tiles, BMPHEIGHT_star_tiles), 1081 STAR_OFFSET_X + (STAR_WIDTH-1) * TILE_WIDTH, 1082 tile_pos_y, TILE_WIDTH, TILE_HEIGHT); 1083 1084 rb->lcd_update_rect(0, MIN(label_pos_y, tile_pos_y), LCD_WIDTH, 1085 MAX(TILE_HEIGHT, char_height)); 1086} 1087 1088 1089/** 1090 * Load a level into board array. 1091 */ 1092static int star_load_level(int current_level) 1093{ 1094 int x, y; 1095 char *ptr_tab; 1096 1097 if (current_level < 0) 1098 current_level = 0; 1099 else if (current_level > STAR_LEVEL_COUNT-1) 1100 current_level = STAR_LEVEL_COUNT-1; 1101 1102 1103 ptr_tab = levels + current_level * STAR_LEVEL_SIZE; 1104 control = STAR_CONTROL_BALL; 1105 star_count = 0; 1106 1107 rb->lcd_clear_display(); 1108 1109 for (y = 0 ; y < STAR_HEIGHT ; y++) 1110 { 1111 for (x = 0 ; x < STAR_WIDTH ; x++) 1112 { 1113 board[y][x] = *ptr_tab; 1114 switch (*ptr_tab) 1115 { 1116# define DRAW_TILE( a ) \ 1117 rb->lcd_bitmap_part( star_tiles, 0, \ 1118 a*TILE_HEIGHT, \ 1119 STRIDE( SCREEN_MAIN, \ 1120 BMPWIDTH_star_tiles, \ 1121 BMPHEIGHT_star_tiles), \ 1122 STAR_OFFSET_X + x * TILE_WIDTH, \ 1123 STAR_OFFSET_Y + y * TILE_HEIGHT, \ 1124 TILE_WIDTH, TILE_HEIGHT); 1125 1126 case STAR_VOID: 1127 DRAW_TILE( SPACE ); 1128 break; 1129 1130 case STAR_WALL: 1131 DRAW_TILE( WALL ); 1132 break; 1133 1134 case STAR_STAR: 1135 DRAW_TILE( STAR ); 1136 star_count++; 1137 break; 1138 1139 case STAR_BALL: 1140 ball_x = x; 1141 ball_y = y; 1142 DRAW_TILE( BALL ); 1143 break; 1144 1145 1146 case STAR_BLOCK: 1147 block_x = x; 1148 block_y = y; 1149 DRAW_TILE( BLOCK ); 1150 break; 1151 } 1152 ptr_tab++; 1153 } 1154 ptr_tab++; 1155 } 1156 star_display_board_info(current_level); 1157 star_transition_update(); 1158 return 1; 1159} 1160 1161static void star_animate_tile(int tile_no, int start_x, int start_y, 1162 int delta_x, int delta_y) 1163{ 1164 int i; 1165 1166 if (delta_x != 0) /* horizontal */ 1167 { 1168 for (i = 1 ; i <= TILE_WIDTH ; i++) 1169 { 1170 STAR_SLEEP 1171 rb->lcd_bitmap_part(star_tiles, 0, SPACE * TILE_HEIGHT, 1172 STRIDE( SCREEN_MAIN, 1173 BMPWIDTH_star_tiles, BMPHEIGHT_star_tiles), 1174 start_x, start_y, TILE_WIDTH, TILE_HEIGHT); 1175 rb->lcd_bitmap_part(star_tiles, 0, tile_no * TILE_HEIGHT, 1176 STRIDE( SCREEN_MAIN, 1177 BMPWIDTH_star_tiles, BMPHEIGHT_star_tiles), 1178 start_x + delta_x * i, start_y, TILE_WIDTH, TILE_HEIGHT); 1179 rb->lcd_update_rect(start_x + delta_x * i - (delta_x>0?1:0), 1180 start_y, TILE_WIDTH + 1, TILE_HEIGHT); 1181 } 1182 } 1183 else /* vertical */ 1184 { 1185 for (i = 1 ; i <= TILE_HEIGHT ; i++) 1186 { 1187 STAR_SLEEP 1188 rb->lcd_bitmap_part(star_tiles, 0, SPACE * TILE_HEIGHT, 1189 STRIDE( SCREEN_MAIN, 1190 BMPWIDTH_star_tiles, BMPHEIGHT_star_tiles), 1191 start_x, start_y, TILE_WIDTH, TILE_HEIGHT); 1192 rb->lcd_bitmap_part(star_tiles, 0, tile_no * TILE_HEIGHT, 1193 STRIDE( SCREEN_MAIN, 1194 BMPWIDTH_star_tiles, BMPHEIGHT_star_tiles), 1195 start_x, start_y + delta_y * i, TILE_WIDTH, TILE_HEIGHT); 1196 rb->lcd_update_rect(start_x, start_y + delta_y * i - (delta_y>0?1:0), 1197 TILE_WIDTH, TILE_HEIGHT + 1); 1198 } 1199 } 1200} 1201 1202/** 1203 * Run the game. 1204 */ 1205static int star_run_game(int current_level) 1206{ 1207 int move_x = 0; 1208 int move_y = 0; 1209 int key; 1210#if defined(STAR_LEVEL_DOWN_PRE) || \ 1211 defined(STAR_LEVEL_UP_PRE) || \ 1212 defined(STAR_TOGGLE_CONTROL_PRE) 1213 int lastkey = BUTTON_NONE; 1214#endif 1215 1216 if (!star_load_level(current_level)) 1217 return 0; 1218 1219 while (true) 1220 { 1221 move_x = 0; 1222 move_y = 0; 1223 1224 while ((move_x == 0) && (move_y == 0)) 1225 { 1226 key = rb->button_get(true); 1227 switch (key) 1228 { 1229#ifdef STAR_RC_QUIT 1230 case STAR_RC_QUIT: 1231#endif 1232 case STAR_QUIT: 1233 return -1; 1234 1235 case STAR_LEFT: 1236 move_x = -1; 1237 break; 1238 1239 case STAR_RIGHT: 1240 move_x = 1; 1241 break; 1242 1243 case STAR_UP: 1244 move_y = -1; 1245 break; 1246 1247 case STAR_DOWN: 1248 move_y = 1; 1249 break; 1250 1251 case STAR_LEVEL_DOWN: 1252#ifdef STAR_LEVEL_DOWN_PRE 1253 if (lastkey != STAR_LEVEL_DOWN_PRE) 1254 break; 1255#endif 1256 if (current_level > 0) 1257 { 1258 current_level--; 1259 star_load_level(current_level); 1260 } 1261 break; 1262 1263 case STAR_LEVEL_REPEAT: 1264 star_load_level(current_level); 1265 break; 1266 1267 case STAR_LEVEL_UP: 1268#ifdef STAR_LEVEL_UP_PRE 1269 if (lastkey != STAR_LEVEL_UP_PRE) 1270 break; 1271#endif 1272 if (current_level < STAR_LEVEL_COUNT - 1) 1273 { 1274 current_level++; 1275 star_load_level(current_level); 1276 } 1277 break; 1278 1279 case STAR_TOGGLE_CONTROL: 1280#ifdef STAR_TOGGLE_CONTROL_PRE 1281 if (lastkey != STAR_TOGGLE_CONTROL_PRE) 1282 break; 1283#endif 1284#ifdef STAR_TOGGLE_CONTROL2 1285 case STAR_TOGGLE_CONTROL2: 1286#endif 1287 if (control == STAR_CONTROL_BALL) 1288 control = STAR_CONTROL_BLOCK; 1289 else 1290 control = STAR_CONTROL_BALL; 1291 star_display_board_info(current_level); 1292 break; 1293 1294 default: 1295 if (rb->default_event_handler(key) == SYS_USB_CONNECTED) 1296 { 1297 usb_detected = true; 1298 return 0; 1299 } 1300 break; 1301 } 1302#if defined(STAR_LEVEL_DOWN_PRE) || \ 1303 defined(STAR_LEVEL_UP_PRE) || \ 1304 defined(STAR_TOGGLE_CONTROL_PRE) 1305 if (key != BUTTON_NONE) 1306 lastkey = key; 1307#endif 1308 } 1309 1310 if (control == STAR_CONTROL_BALL) 1311 { 1312 board[ball_y][ball_x] = STAR_VOID; 1313 while ((board[ball_y + move_y][ball_x + move_x] == STAR_VOID 1314 || board[ball_y + move_y][ball_x + move_x] == STAR_STAR)) 1315 1316 { 1317 star_animate_tile(BALL, STAR_OFFSET_X + ball_x * TILE_WIDTH, 1318 STAR_OFFSET_Y + ball_y * TILE_HEIGHT, 1319 move_x, move_y); 1320 ball_x += move_x; 1321 ball_y += move_y; 1322 1323 if (board[ball_y][ball_x] == STAR_STAR) 1324 { 1325 board[ball_y][ball_x] = STAR_VOID; 1326 star_count--; 1327 1328 star_display_board_info(current_level); 1329 } 1330 } 1331 board[ball_y][ball_x] = STAR_BALL; 1332 } 1333 else 1334 { 1335 board[block_y][block_x] = STAR_VOID; 1336 while (board[block_y + move_y][block_x + move_x] == STAR_VOID) 1337 { 1338 star_animate_tile(BLOCK, STAR_OFFSET_X + block_x * TILE_WIDTH, 1339 STAR_OFFSET_Y + block_y * TILE_HEIGHT, 1340 move_x, move_y); 1341 block_x += move_x; 1342 block_y += move_y; 1343 } 1344 board[block_y][block_x] = STAR_BLOCK; 1345 } 1346 1347 if (star_count == 0) 1348 { 1349 current_level++; 1350 if (current_level == STAR_LEVEL_COUNT) 1351 { 1352 rb->lcd_clear_display(); 1353 rb->splash(HZ*2, "Congratulations!"); 1354 rb->lcd_update(); 1355 1356 /* There is no such level as STAR_LEVEL_COUNT so it can't be the 1357 * current_level */ 1358 current_level--; 1359 return 1; 1360 } 1361 star_load_level(current_level); 1362 } 1363 } 1364} 1365 1366/** 1367 * Display help text. 1368 */ 1369static bool star_help(void) 1370{ 1371 static char* help_text[] = { 1372 "Star", "", "Aim", "", 1373 "Take", "all", "the", "stars", "to", "go", "to", "the", "next", "level.", 1374 "You", "can", "toggle", "control", "with", "the", "block", "to", "use", 1375 "it", "as", "a", "mobile", "wall.", "The", "block", "cannot", "take", 1376 "stars.", "", "", 1377 "Controls", "", 1378 STAR_TOGGLE_CONTROL_NAME":", "Toggle", "control", "", 1379 STAR_QUIT_NAME":", "Exit", "", 1380 STAR_LEVEL_DOWN_NAME":", "Prev.", "level", "", 1381 STAR_LEVEL_REPEAT_NAME":", "Reset", "level", "", 1382 STAR_LEVEL_UP_NAME":", "Next", "level" 1383 }; 1384 static struct style_text formation[]={ 1385 { 0, TEXT_CENTER|TEXT_UNDERLINE }, 1386 { 2, C_RED }, 1387 { 35, C_RED }, 1388 LAST_STYLE_ITEM 1389 }; 1390#if LCD_DEPTH > 1 && !defined(HAVE_LCD_COLOR) 1391 rb->lcd_set_background(LCD_WHITE); 1392 rb->lcd_set_foreground(LCD_BLACK); 1393#endif 1394 if (display_text(ARRAYLEN(help_text), help_text, formation, NULL, true)) 1395 return true; 1396#if LCD_DEPTH > 1 && !defined(HAVE_LCD_COLOR) 1397 rb->lcd_set_background(LCD_BLACK); 1398 rb->lcd_set_foreground(LCD_WHITE); 1399#endif 1400 return false; 1401} 1402 1403/** 1404 * Display the choice menu. 1405 */ 1406static int star_menu(void) 1407{ 1408 int selection, level=1; 1409 bool menu_quit = false; 1410 1411 MENUITEM_STRINGLIST(menu, "Star Menu", NULL, 1412 "Start Game","Choose Level", 1413 "Help", "Playback Control", "Quit"); 1414 1415 while(!menu_quit) 1416 { 1417 switch(rb->do_menu(&menu, &selection, NULL, false)) 1418 { 1419 case 0: 1420 /* use system font and get the size of char */ 1421 rb->lcd_setfont(FONT_SYSFIXED); 1422 rb->lcd_getstringsize("a", &char_width, &char_height); 1423 star_run_game(level-1); 1424 rb->lcd_setfont(FONT_UI); 1425 break; 1426 case 1: 1427 rb->set_int("Level", "", UNIT_INT, &level, 1428 NULL, 1, 1, STAR_LEVEL_COUNT, NULL ); 1429 break; 1430 case 2: 1431 if(star_help()) 1432 usb_detected = true; 1433 break; 1434 case 3: 1435 playback_control(NULL); 1436 break; 1437 case 4: 1438 menu_quit = true; 1439 break; 1440 } 1441 if(usb_detected) 1442 return PLUGIN_USB_CONNECTED; 1443 } 1444 1445 return PLUGIN_OK; 1446} 1447 1448/** 1449 * Main entry point 1450 */ 1451enum plugin_status plugin_start(const void* parameter) 1452{ 1453 (void)parameter; 1454 1455#if LCD_DEPTH > 1 1456 rb->lcd_set_backdrop(NULL); 1457 rb->lcd_set_background( LCD_BLACK ); 1458 rb->lcd_set_foreground( LCD_WHITE ); 1459#endif 1460 1461 /* display choice menu */ 1462 return star_menu(); 1463}