A modern Music Player Daemon based on Rockbox open source high quality audio player
libadwaita audio rust zig deno mpris rockbox mpd
at master 1543 lines 48 kB view raw
1/*************************************************************************** 2 * __________ __ ___. 3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___ 4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / 5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < 6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ 7 * \/ \/ \/ \/ \/ 8 * $Id$ 9 * 10 * Copyright (C) 2007 Tom Ross 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#include "lib/configfile.h" 23#include "lib/display_text.h" 24#include "lib/playback_control.h" 25 26#include "pluginbitmaps/pegbox_header.h" 27#include "pluginbitmaps/pegbox_pieces.h" 28 29 30 31#define CONFIG_FILE_NAME "pegbox.cfg" 32 33#define ROWS 8 /* Number of rows on each board */ 34#define COLS 12 /* Number of columns on each board */ 35#define NUM_LEVELS 15 /* Number of levels */ 36 37#define SPACE 0 38#define WALL 1 39#define TRIANGLE 2 40#define CROSS 3 41#define SQUARE 4 42#define CIRCLE 5 43#define HOLE 6 44#define PLAYER 7 45 46#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \ 47 (CONFIG_KEYPAD == IRIVER_H300_PAD) 48#define PEGBOX_SELECT BUTTON_SELECT 49#define PEGBOX_QUIT BUTTON_OFF 50#define PEGBOX_RESTART BUTTON_ON 51#define PEGBOX_LVL_UP BUTTON_MODE 52#define PEGBOX_LVL_DOWN BUTTON_REC 53#define PEGBOX_UP BUTTON_UP 54#define PEGBOX_DOWN BUTTON_DOWN 55#define PEGBOX_RIGHT BUTTON_RIGHT 56#define PEGBOX_LEFT BUTTON_LEFT 57 58#define SELECT_TEXT "NAVI" 59#define QUIT_TEXT "OFF" 60#define RESTART_TEXT "ON" 61#define LVL_UP_TEXT "AB" 62#define LVL_DOWN_TEXT "REC" 63 64#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \ 65 (CONFIG_KEYPAD == IPOD_3G_PAD) || \ 66 (CONFIG_KEYPAD == IPOD_1G2G_PAD) 67#define PEGBOX_SELECT (BUTTON_SELECT|BUTTON_RIGHT) 68#define PEGBOX_QUIT (BUTTON_SELECT|BUTTON_REPEAT) 69#define PEGBOX_RESTART (BUTTON_SELECT|BUTTON_LEFT) 70#define PEGBOX_LVL_UP (BUTTON_SELECT|BUTTON_MENU) 71#define PEGBOX_UP BUTTON_MENU 72#define PEGBOX_DOWN BUTTON_PLAY 73#define PEGBOX_RIGHT BUTTON_RIGHT 74#define PEGBOX_LEFT BUTTON_LEFT 75 76#define SELECT_TEXT "SELECT+RIGHT" 77#define QUIT_TEXT "Long SELECT" 78#define RESTART_TEXT "SELECT+LEFT" 79#define LVL_UP_TEXT "SELECT+MENU" 80#define LVL_DOWN_TEXT "-" 81 82#elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD 83#define PEGBOX_SELECT BUTTON_SELECT 84#define PEGBOX_QUIT BUTTON_POWER 85#define PEGBOX_RESTART BUTTON_REC 86#define PEGBOX_LVL_UP BUTTON_PLAY 87#define PEGBOX_UP BUTTON_UP 88#define PEGBOX_DOWN BUTTON_DOWN 89#define PEGBOX_RIGHT BUTTON_RIGHT 90#define PEGBOX_LEFT BUTTON_LEFT 91 92#define SELECT_TEXT "SELECT" 93#define QUIT_TEXT "OFF" 94#define RESTART_TEXT "REC" 95#define LVL_UP_TEXT "PLAY" 96#define LVL_DOWN_TEXT "-" 97 98#elif CONFIG_KEYPAD == IRIVER_H10_PAD 99#define PEGBOX_SELECT BUTTON_PLAY 100#define PEGBOX_QUIT BUTTON_POWER 101#define PEGBOX_RESTART (BUTTON_FF|BUTTON_REPEAT) 102#define PEGBOX_LVL_UP (BUTTON_FF|BUTTON_SCROLL_UP) 103#define PEGBOX_LVL_DOWN (BUTTON_FF|BUTTON_SCROLL_DOWN) 104#define PEGBOX_UP BUTTON_SCROLL_UP 105#define PEGBOX_DOWN BUTTON_SCROLL_DOWN 106#define PEGBOX_RIGHT BUTTON_RIGHT 107#define PEGBOX_LEFT BUTTON_LEFT 108 109#define SELECT_TEXT "PLAY" 110#define QUIT_TEXT "OFF" 111#define RESTART_TEXT "LONG FF" 112#define LVL_UP_TEXT "FF+SCROLL_UP" 113#define LVL_DOWN_TEXT "FF+SCROLL_DOWN" 114 115#elif CONFIG_KEYPAD == SANSA_E200_PAD 116#define PEGBOX_SELECT BUTTON_SELECT 117#define PEGBOX_QUIT BUTTON_POWER 118#define PEGBOX_RESTART BUTTON_REC 119#define PEGBOX_LVL_UP BUTTON_SCROLL_BACK 120#define PEGBOX_LVL_DOWN BUTTON_SCROLL_FWD 121#define PEGBOX_UP BUTTON_UP 122#define PEGBOX_DOWN BUTTON_DOWN 123#define PEGBOX_RIGHT BUTTON_RIGHT 124#define PEGBOX_LEFT BUTTON_LEFT 125 126#define SELECT_TEXT "SELECT" 127#define QUIT_TEXT "POWER" 128#define RESTART_TEXT "REC" 129#define LVL_UP_TEXT "SCROLL BACK" 130#define LVL_DOWN_TEXT "SCROLL FWD" 131 132#elif CONFIG_KEYPAD == SANSA_FUZE_PAD 133#define PEGBOX_SELECT BUTTON_SELECT|BUTTON_REL 134#define PEGBOX_QUIT (BUTTON_HOME|BUTTON_REPEAT) 135#define PEGBOX_RESTART (BUTTON_SELECT|BUTTON_LEFT) 136#define PEGBOX_LVL_UP (BUTTON_SELECT|BUTTON_UP) 137#define PEGBOX_LVL_DOWN (BUTTON_SELECT|BUTTON_DOWN) 138#define PEGBOX_UP BUTTON_UP 139#define PEGBOX_DOWN BUTTON_DOWN 140#define PEGBOX_RIGHT BUTTON_RIGHT 141#define PEGBOX_LEFT BUTTON_LEFT 142 143#define SELECT_TEXT "SELECT" 144#define QUIT_TEXT "HOME" 145#define RESTART_TEXT "SELECT & LEFT" 146#define LVL_UP_TEXT "SELECT & UP" 147#define LVL_DOWN_TEXT "SELECT & DOWN" 148 149#elif CONFIG_KEYPAD == GIGABEAT_PAD 150#define PEGBOX_SELECT BUTTON_SELECT 151#define PEGBOX_QUIT BUTTON_POWER 152#define PEGBOX_RESTART BUTTON_A 153#define PEGBOX_LVL_UP BUTTON_VOL_UP 154#define PEGBOX_LVL_DOWN BUTTON_VOL_DOWN 155#define PEGBOX_UP BUTTON_UP 156#define PEGBOX_DOWN BUTTON_DOWN 157#define PEGBOX_RIGHT BUTTON_RIGHT 158#define PEGBOX_LEFT BUTTON_LEFT 159 160#define SELECT_TEXT "SELECT" 161#define QUIT_TEXT "POWER" 162#define RESTART_TEXT "A" 163#define LVL_UP_TEXT "VOL+" 164#define LVL_DOWN_TEXT "VOL-" 165 166#elif CONFIG_KEYPAD == GIGABEAT_S_PAD 167#define PEGBOX_SELECT BUTTON_SELECT 168#define PEGBOX_QUIT BUTTON_BACK 169#define PEGBOX_RESTART BUTTON_MENU 170#define PEGBOX_LVL_UP BUTTON_VOL_UP 171#define PEGBOX_LVL_DOWN BUTTON_VOL_DOWN 172#define PEGBOX_UP BUTTON_UP 173#define PEGBOX_DOWN BUTTON_DOWN 174#define PEGBOX_RIGHT BUTTON_RIGHT 175#define PEGBOX_LEFT BUTTON_LEFT 176 177#define SELECT_TEXT "SELECT" 178#define QUIT_TEXT "BACK" 179#define RESTART_TEXT "MENU" 180#define LVL_UP_TEXT "VOL+" 181#define LVL_DOWN_TEXT "VOL-" 182 183#elif CONFIG_KEYPAD == MROBE100_PAD 184#define PEGBOX_SELECT BUTTON_SELECT 185#define PEGBOX_QUIT BUTTON_POWER 186#define PEGBOX_RESTART BUTTON_PLAY 187#define PEGBOX_LVL_UP BUTTON_MENU 188#define PEGBOX_LVL_DOWN BUTTON_DISPLAY 189#define PEGBOX_UP BUTTON_UP 190#define PEGBOX_DOWN BUTTON_DOWN 191#define PEGBOX_RIGHT BUTTON_RIGHT 192#define PEGBOX_LEFT BUTTON_LEFT 193 194#define SELECT_TEXT "SELECT" 195#define QUIT_TEXT "POWER" 196#define RESTART_TEXT "PLAY" 197#define LVL_UP_TEXT "MENU" 198#define LVL_DOWN_TEXT "DISPLAY" 199 200#elif CONFIG_KEYPAD == SANSA_C200_PAD 201#define PEGBOX_SELECT BUTTON_SELECT 202#define PEGBOX_QUIT BUTTON_POWER 203#define PEGBOX_RESTART BUTTON_REC 204#define PEGBOX_LVL_UP BUTTON_VOL_UP 205#define PEGBOX_LVL_DOWN BUTTON_VOL_DOWN 206#define PEGBOX_UP BUTTON_UP 207#define PEGBOX_DOWN BUTTON_DOWN 208#define PEGBOX_RIGHT BUTTON_RIGHT 209#define PEGBOX_LEFT BUTTON_LEFT 210 211#define SELECT_TEXT "SELECT" 212#define QUIT_TEXT "POWER" 213#define RESTART_TEXT "REC" 214#define LVL_UP_TEXT "VOL+" 215#define LVL_DOWN_TEXT "VOL-" 216 217#elif CONFIG_KEYPAD == SANSA_CLIP_PAD 218#define PEGBOX_SELECT BUTTON_SELECT 219#define PEGBOX_QUIT BUTTON_POWER 220#define PEGBOX_RESTART BUTTON_HOME 221#define PEGBOX_LVL_UP BUTTON_VOL_UP 222#define PEGBOX_LVL_DOWN BUTTON_VOL_DOWN 223#define PEGBOX_UP BUTTON_UP 224#define PEGBOX_DOWN BUTTON_DOWN 225#define PEGBOX_RIGHT BUTTON_RIGHT 226#define PEGBOX_LEFT BUTTON_LEFT 227 228#define SELECT_TEXT "SELECT" 229#define QUIT_TEXT "POWER" 230#define RESTART_TEXT "HOME" 231#define LVL_UP_TEXT "VOL+" 232#define LVL_DOWN_TEXT "VOL-" 233 234#elif CONFIG_KEYPAD == SANSA_M200_PAD 235#define PEGBOX_SELECT (BUTTON_SELECT | BUTTON_REL) 236#define PEGBOX_QUIT BUTTON_POWER 237#define PEGBOX_RESTART (BUTTON_SELECT | BUTTON_UP) 238#define PEGBOX_LVL_UP BUTTON_VOL_UP 239#define PEGBOX_LVL_DOWN BUTTON_VOL_DOWN 240#define PEGBOX_UP BUTTON_UP 241#define PEGBOX_DOWN BUTTON_DOWN 242#define PEGBOX_RIGHT BUTTON_RIGHT 243#define PEGBOX_LEFT BUTTON_LEFT 244 245#define SELECT_TEXT "SELECT" 246#define QUIT_TEXT "POWER" 247#define RESTART_TEXT "SELECT+UP" 248#define LVL_UP_TEXT "VOL+" 249#define LVL_DOWN_TEXT "VOL-" 250 251 252#elif CONFIG_KEYPAD == IAUDIO_M3_PAD 253#define PEGBOX_SELECT BUTTON_RC_PLAY 254#define PEGBOX_QUIT BUTTON_RC_REC 255#define PEGBOX_RESTART BUTTON_RC_MODE 256#define PEGBOX_LVL_UP BUTTON_VOL_UP 257#define PEGBOX_LVL_DOWN BUTTON_VOL_DOWN 258#define PEGBOX_UP BUTTON_RC_VOL_UP 259#define PEGBOX_DOWN BUTTON_RC_VOL_DOWN 260#define PEGBOX_RIGHT BUTTON_RC_FF 261#define PEGBOX_LEFT BUTTON_RC_REW 262 263#define SELECT_TEXT "REM. PLAY" 264#define QUIT_TEXT "REM. REC" 265#define RESTART_TEXT "REM. MODE" 266#define LVL_UP_TEXT "VOL+" 267#define LVL_DOWN_TEXT "VOL-" 268 269#elif CONFIG_KEYPAD == COWON_D2_PAD 270#define PEGBOX_QUIT BUTTON_POWER 271 272#define QUIT_TEXT "POWER" 273 274#elif CONFIG_KEYPAD == CREATIVEZVM_PAD 275#define PEGBOX_SELECT BUTTON_CUSTOM 276#define PEGBOX_QUIT BUTTON_BACK 277#define PEGBOX_RESTART BUTTON_SELECT 278#define PEGBOX_LVL_UP BUTTON_PLAY 279#define PEGBOX_LVL_DOWN BUTTON_MENU 280#define PEGBOX_UP BUTTON_UP 281#define PEGBOX_DOWN BUTTON_DOWN 282#define PEGBOX_RIGHT BUTTON_RIGHT 283#define PEGBOX_LEFT BUTTON_LEFT 284 285#define SELECT_TEXT "CUSTOM" 286#define QUIT_TEXT "BACK" 287#define RESTART_TEXT "MIDDLE" 288#define LVL_UP_TEXT "SELECT" 289#define LVL_DOWN_TEXT "MENU" 290 291#elif CONFIG_KEYPAD == CREATIVE_ZENXFI3_PAD 292#define PEGBOX_SELECT (BUTTON_PLAY|BUTTON_REL) 293#define PEGBOX_QUIT BUTTON_POWER 294#define PEGBOX_RESTART (BUTTON_PLAY|BUTTON_BACK) 295#define PEGBOX_LVL_UP (BUTTON_PLAY|BUTTON_UP) 296#define PEGBOX_LVL_DOWN (BUTTON_PLAY|BUTTON_DOWN) 297#define PEGBOX_UP BUTTON_UP 298#define PEGBOX_DOWN BUTTON_DOWN 299#define PEGBOX_RIGHT BUTTON_MENU 300#define PEGBOX_LEFT BUTTON_BACK 301 302#define SELECT_TEXT "PLAY" 303#define QUIT_TEXT "POWER" 304#define RESTART_TEXT "PLAY+BACK" 305#define LVL_UP_TEXT "PLAY+UP" 306#define LVL_DOWN_TEXT "PLAY+DOWN" 307 308#elif CONFIG_KEYPAD == PHILIPS_HDD1630_PAD 309#define PEGBOX_SELECT BUTTON_VIEW 310#define PEGBOX_QUIT BUTTON_POWER 311#define PEGBOX_RESTART BUTTON_MENU 312#define PEGBOX_LVL_UP BUTTON_VOL_UP 313#define PEGBOX_LVL_DOWN BUTTON_VOL_DOWN 314#define PEGBOX_UP BUTTON_UP 315#define PEGBOX_DOWN BUTTON_DOWN 316#define PEGBOX_RIGHT BUTTON_RIGHT 317#define PEGBOX_LEFT BUTTON_LEFT 318 319#define SELECT_TEXT "VIEW" 320#define QUIT_TEXT "POWER" 321#define RESTART_TEXT "MENU" 322#define LVL_UP_TEXT "VOL+" 323#define LVL_DOWN_TEXT "VOL-" 324 325#elif CONFIG_KEYPAD == PHILIPS_HDD6330_PAD 326#define PEGBOX_SELECT BUTTON_NEXT 327#define PEGBOX_QUIT BUTTON_POWER 328#define PEGBOX_RESTART BUTTON_MENU 329#define PEGBOX_LVL_UP BUTTON_VOL_UP 330#define PEGBOX_LVL_DOWN BUTTON_VOL_DOWN 331#define PEGBOX_UP BUTTON_UP 332#define PEGBOX_DOWN BUTTON_DOWN 333#define PEGBOX_RIGHT BUTTON_RIGHT 334#define PEGBOX_LEFT BUTTON_LEFT 335 336#define SELECT_TEXT "NEXT" 337#define QUIT_TEXT "POWER" 338#define RESTART_TEXT "MENU" 339#define LVL_UP_TEXT "VOL+" 340#define LVL_DOWN_TEXT "VOL-" 341 342#elif CONFIG_KEYPAD == PHILIPS_SA9200_PAD 343#define PEGBOX_SELECT BUTTON_RIGHT 344#define PEGBOX_QUIT BUTTON_POWER 345#define PEGBOX_RESTART BUTTON_MENU 346#define PEGBOX_LVL_UP BUTTON_VOL_UP 347#define PEGBOX_LVL_DOWN BUTTON_VOL_DOWN 348#define PEGBOX_UP BUTTON_UP 349#define PEGBOX_DOWN BUTTON_DOWN 350#define PEGBOX_RIGHT BUTTON_NEXT 351#define PEGBOX_LEFT BUTTON_PREV 352 353#define SELECT_TEXT "RIGHT" 354#define QUIT_TEXT "POWER" 355#define RESTART_TEXT "MENU" 356#define LVL_UP_TEXT "VOL+" 357#define LVL_DOWN_TEXT "VOL-" 358 359#elif CONFIG_KEYPAD == ONDAVX747_PAD || \ 360CONFIG_KEYPAD == ONDAVX777_PAD || \ 361CONFIG_KEYPAD == MROBE500_PAD 362#define PEGBOX_QUIT BUTTON_POWER 363 364#define QUIT_TEXT "POWER" 365 366#elif CONFIG_KEYPAD == SAMSUNG_YH92X_PAD 367#define PEGBOX_QUIT BUTTON_REW 368#define PEGBOX_RESTART BUTTON_FFWD 369#define PEGBOX_LVL_UP (BUTTON_PLAY|BUTTON_UP) 370#define PEGBOX_LVL_DOWN (BUTTON_PLAY|BUTTON_DOWN) 371#define PEGBOX_UP BUTTON_UP 372#define PEGBOX_DOWN BUTTON_DOWN 373#define PEGBOX_RIGHT BUTTON_RIGHT 374#define PEGBOX_LEFT BUTTON_LEFT 375#define PEGBOX_SELECT BUTTON_PLAY 376 377#define QUIT_TEXT "REW" 378#define RESTART_TEXT "FFWD" 379#define LVL_UP_TEXT "PLAY+UP" 380#define LVL_DOWN_TEXT "PLAY+DOWN" 381#define SELECT_TEXT "PLAY" 382 383#elif CONFIG_KEYPAD == SAMSUNG_YH820_PAD 384#define PEGBOX_QUIT BUTTON_REW 385#define PEGBOX_RESTART BUTTON_FFWD 386#define PEGBOX_LVL_UP (BUTTON_REC|BUTTON_UP) 387#define PEGBOX_LVL_DOWN (BUTTON_REC|BUTTON_DOWN) 388#define PEGBOX_UP BUTTON_UP 389#define PEGBOX_DOWN BUTTON_DOWN 390#define PEGBOX_RIGHT BUTTON_RIGHT 391#define PEGBOX_LEFT BUTTON_LEFT 392#define PEGBOX_SELECT BUTTON_PLAY 393 394#define QUIT_TEXT "REW" 395#define RESTART_TEXT "FFWD" 396#define LVL_UP_TEXT "REC+UP" 397#define LVL_DOWN_TEXT "REC+DOWN" 398#define SELECT_TEXT "PLAY" 399 400#elif CONFIG_KEYPAD == PBELL_VIBE500_PAD 401#define PEGBOX_QUIT BUTTON_REC 402#define PEGBOX_RESTART BUTTON_MENU 403#define PEGBOX_LVL_UP BUTTON_OK 404#define PEGBOX_LVL_DOWN BUTTON_CANCEL 405#define PEGBOX_UP BUTTON_UP 406#define PEGBOX_DOWN BUTTON_DOWN 407#define PEGBOX_RIGHT BUTTON_NEXT 408#define PEGBOX_LEFT BUTTON_PREV 409#define PEGBOX_SELECT BUTTON_PLAY 410 411#define QUIT_TEXT "REC" 412#define RESTART_TEXT "MENU" 413#define LVL_UP_TEXT "OK" 414#define LVL_DOWN_TEXT "CANCEL" 415#define SELECT_TEXT "PLAY" 416 417#elif CONFIG_KEYPAD == MPIO_HD200_PAD 418#define PEGBOX_QUIT (BUTTON_REC|BUTTON_PLAY) 419#define PEGBOX_RESTART BUTTON_REC 420#define PEGBOX_LVL_UP (BUTTON_PLAY|BUTTON_REW) 421#define PEGBOX_LVL_DOWN (BUTTON_PLAY|BUTTON_FF) 422#define PEGBOX_UP BUTTON_REW 423#define PEGBOX_DOWN BUTTON_FF 424#define PEGBOX_RIGHT BUTTON_VOL_UP 425#define PEGBOX_LEFT BUTTON_VOL_DOWN 426#define PEGBOX_SELECT BUTTON_FUNC 427 428#define QUIT_TEXT "REC + PLAY" 429#define RESTART_TEXT "REC" 430#define LVL_UP_TEXT "REW" 431#define LVL_DOWN_TEXT "FF" 432#define SELECT_TEXT "FUNC" 433 434#elif CONFIG_KEYPAD == MPIO_HD300_PAD 435#define PEGBOX_QUIT (BUTTON_MENU | BUTTON_REPEAT) 436#define PEGBOX_RESTART (BUTTON_MENU | BUTTON_REL) 437#define PEGBOX_LVL_UP BUTTON_PLAY 438#define PEGBOX_LVL_DOWN BUTTON_REC 439#define PEGBOX_UP BUTTON_UP 440#define PEGBOX_DOWN BUTTON_DOWN 441#define PEGBOX_RIGHT BUTTON_FF 442#define PEGBOX_LEFT BUTTON_REW 443#define PEGBOX_SELECT (BUTTON_ENTER | BUTTON_REL) 444 445#define QUIT_TEXT "Long MENU" 446#define RESTART_TEXT "MENU" 447#define LVL_UP_TEXT "PLAY" 448#define LVL_DOWN_TEXT "REC" 449#define SELECT_TEXT "ENTER" 450 451#elif CONFIG_KEYPAD == SANSA_FUZEPLUS_PAD 452#define PEGBOX_QUIT BUTTON_POWER 453#define PEGBOX_RESTART BUTTON_BACK 454#define PEGBOX_LVL_UP BUTTON_VOL_UP 455#define PEGBOX_LVL_DOWN BUTTON_VOL_DOWN 456#define PEGBOX_UP BUTTON_UP 457#define PEGBOX_DOWN BUTTON_DOWN 458#define PEGBOX_RIGHT BUTTON_RIGHT 459#define PEGBOX_LEFT BUTTON_LEFT 460#define PEGBOX_SELECT BUTTON_SELECT 461 462#define QUIT_TEXT "POWER" 463#define RESTART_TEXT "BACK" 464#define LVL_UP_TEXT "Vol+" 465#define LVL_DOWN_TEXT "Vol-" 466#define SELECT_TEXT "SELECT" 467 468#elif CONFIG_KEYPAD == SANSA_CONNECT_PAD 469#define PEGBOX_SELECT BUTTON_SELECT 470#define PEGBOX_QUIT BUTTON_POWER 471#define PEGBOX_RESTART BUTTON_VOL_DOWN 472#define PEGBOX_LVL_UP BUTTON_NEXT 473#define PEGBOX_LVL_DOWN BUTTON_PREV 474#define PEGBOX_UP BUTTON_UP 475#define PEGBOX_DOWN BUTTON_DOWN 476#define PEGBOX_RIGHT BUTTON_RIGHT 477#define PEGBOX_LEFT BUTTON_LEFT 478 479#define QUIT_TEXT "POWER" 480#define RESTART_TEXT "Vol-" 481#define LVL_UP_TEXT "NEXT" 482#define LVL_DOWN_TEXT "PREV" 483#define SELECT_TEXT "SELECT" 484 485#elif CONFIG_KEYPAD == SAMSUNG_YPR0_PAD 486#define PEGBOX_SELECT BUTTON_SELECT 487#define PEGBOX_QUIT BUTTON_BACK 488#define PEGBOX_RESTART BUTTON_MENU 489#define PEGBOX_LVL_UP BUTTON_USER 490#define PEGBOX_LVL_DOWN BUTTON_POWER 491#define PEGBOX_UP BUTTON_UP 492#define PEGBOX_DOWN BUTTON_DOWN 493#define PEGBOX_RIGHT BUTTON_RIGHT 494#define PEGBOX_LEFT BUTTON_LEFT 495 496#define QUIT_TEXT "POWER" 497#define RESTART_TEXT "BACK" 498#define LVL_UP_TEXT "Vol+" 499#define LVL_DOWN_TEXT "Vol-" 500#define SELECT_TEXT "SELECT" 501 502#elif CONFIG_KEYPAD == HM60X_PAD 503#define PEGBOX_SELECT BUTTON_SELECT 504#define PEGBOX_QUIT BUTTON_POWER 505#define PEGBOX_RESTART (BUTTON_POWER|BUTTON_LEFT) 506#define PEGBOX_LVL_UP (BUTTON_POWER|BUTTON_UP) 507#define PEGBOX_LVL_DOWN (BUTTON_POWER|BUTTON_DOWN) 508#define PEGBOX_UP BUTTON_UP 509#define PEGBOX_DOWN BUTTON_DOWN 510#define PEGBOX_RIGHT BUTTON_RIGHT 511#define PEGBOX_LEFT BUTTON_LEFT 512 513#define QUIT_TEXT "POWER" 514#define RESTART_TEXT "POWER + LEFT" 515#define LVL_UP_TEXT "POWER + UP" 516#define LVL_DOWN_TEXT "POWER + DOWN" 517#define SELECT_TEXT "SELECT" 518 519#elif CONFIG_KEYPAD == HM801_PAD 520#define PEGBOX_SELECT BUTTON_SELECT 521#define PEGBOX_QUIT BUTTON_POWER 522#define PEGBOX_RESTART (BUTTON_POWER|BUTTON_PREV) 523#define PEGBOX_LVL_UP BUTTON_NEXT 524#define PEGBOX_LVL_DOWN BUTTON_PREV 525#define PEGBOX_UP BUTTON_UP 526#define PEGBOX_DOWN BUTTON_DOWN 527#define PEGBOX_RIGHT BUTTON_RIGHT 528#define PEGBOX_LEFT BUTTON_LEFT 529 530#define QUIT_TEXT "POWER" 531#define RESTART_TEXT "POWER + PREV" 532#define LVL_UP_TEXT "NEXT" 533#define LVL_DOWN_TEXT "PREV" 534#define SELECT_TEXT "SELECT" 535 536#elif CONFIG_KEYPAD == SONY_NWZ_PAD 537#define PEGBOX_RIGHT BUTTON_RIGHT 538#define PEGBOX_LEFT BUTTON_LEFT 539#define PEGBOX_UP BUTTON_UP 540#define PEGBOX_DOWN BUTTON_DOWN 541#define PEGBOX_QUIT BUTTON_POWER 542#define PEGBOX_SELECT BUTTON_PLAY 543#define PEGBOX_RESTART BUTTON_BACK 544 545#define QUIT_TEXT "POWER" 546#define RESTART_TEXT "BACK+POWER" 547#define LVL_UP_TEXT "" 548#define LVL_DOWN_TEXT "" 549#define SELECT_TEXT "PLAY" 550 551#elif CONFIG_KEYPAD == AGPTEK_ROCKER_PAD 552#define PEGBOX_RIGHT BUTTON_RIGHT 553#define PEGBOX_LEFT BUTTON_LEFT 554#define PEGBOX_UP BUTTON_UP 555#define PEGBOX_DOWN BUTTON_DOWN 556#define PEGBOX_QUIT BUTTON_POWER 557#define PEGBOX_SELECT BUTTON_SELECT 558#define PEGBOX_RESTART BUTTON_VOLUP 559 560#define QUIT_TEXT "POWER" 561#define RESTART_TEXT "VOLUP" 562#define LVL_UP_TEXT "" 563#define LVL_DOWN_TEXT "" 564#define SELECT_TEXT "SELECT" 565 566#elif CONFIG_KEYPAD == CREATIVE_ZEN_PAD 567#define PEGBOX_RIGHT BUTTON_RIGHT 568#define PEGBOX_LEFT BUTTON_LEFT 569#define PEGBOX_UP BUTTON_UP 570#define PEGBOX_DOWN BUTTON_DOWN 571#define PEGBOX_QUIT BUTTON_BACK 572#define PEGBOX_SELECT BUTTON_SELECT 573#define PEGBOX_RESTART BUTTON_SHORTCUT 574#define PEGBOX_LVL_UP BUTTON_MENU 575#define PEGBOX_LVL_DOWN BUTTON_PLAYPAUSE 576 577#define QUIT_TEXT "POWER" 578#define RESTART_TEXT "SHORTCUT" 579#define LVL_UP_TEXT "MENU" 580#define LVL_DOWN_TEXT "PLAY/PAUSE" 581#define SELECT_TEXT "SELECT" 582 583#elif CONFIG_KEYPAD == DX50_PAD 584#define PEGBOX_QUIT BUTTON_POWER 585 586#define QUIT_TEXT "Power" 587 588#elif CONFIG_KEYPAD == CREATIVE_ZENXFI2_PAD 589#define PEGBOX_QUIT BUTTON_POWER 590#define PEGBOX_SELECT BUTTON_MENU 591 592#define QUIT_TEXT "POWER" 593#define SELECT_TEXT "MENU" 594 595#elif CONFIG_KEYPAD == XDUOO_X3_PAD 596#define PEGBOX_SELECT BUTTON_PLAY 597#define PEGBOX_QUIT BUTTON_POWER 598#define PEGBOX_RESTART (BUTTON_PWRALT | BUTTON_HOME) 599#define PEGBOX_LVL_UP BUTTON_VOL_UP 600#define PEGBOX_LVL_DOWN BUTTON_VOL_DOWN 601#define PEGBOX_UP BUTTON_HOME 602#define PEGBOX_DOWN BUTTON_OPTION 603#define PEGBOX_RIGHT BUTTON_NEXT 604#define PEGBOX_LEFT BUTTON_PREV 605 606#define SELECT_TEXT "PLAY" 607#define QUIT_TEXT "POWER" 608#define RESTART_TEXT "HOME" 609#define LVL_UP_TEXT "VOL+" 610#define LVL_DOWN_TEXT "VOL-" 611 612#elif CONFIG_KEYPAD == XDUOO_X3II_PAD || CONFIG_KEYPAD == XDUOO_X20_PAD 613#define PEGBOX_SELECT BUTTON_PLAY 614#define PEGBOX_QUIT BUTTON_POWER 615#define PEGBOX_RESTART (BUTTON_POWER | BUTTON_HOME) 616#define PEGBOX_LVL_UP BUTTON_VOL_UP 617#define PEGBOX_LVL_DOWN BUTTON_VOL_DOWN 618#define PEGBOX_UP BUTTON_HOME 619#define PEGBOX_DOWN BUTTON_OPTION 620#define PEGBOX_RIGHT BUTTON_NEXT 621#define PEGBOX_LEFT BUTTON_PREV 622 623#define SELECT_TEXT "PLAY" 624#define QUIT_TEXT "POWER" 625#define RESTART_TEXT "HOME" 626#define LVL_UP_TEXT "VOL+" 627#define LVL_DOWN_TEXT "VOL-" 628 629#elif CONFIG_KEYPAD == FIIO_M3K_LINUX_PAD 630#define PEGBOX_SELECT BUTTON_PLAY 631#define PEGBOX_QUIT BUTTON_POWER 632#define PEGBOX_RESTART (BUTTON_POWER | BUTTON_HOME) 633#define PEGBOX_LVL_UP BUTTON_VOL_UP 634#define PEGBOX_LVL_DOWN BUTTON_VOL_DOWN 635#define PEGBOX_UP BUTTON_HOME 636#define PEGBOX_DOWN BUTTON_OPTION 637#define PEGBOX_RIGHT BUTTON_NEXT 638#define PEGBOX_LEFT BUTTON_PREV 639 640#define SELECT_TEXT "PLAY" 641#define QUIT_TEXT "POWER" 642#define RESTART_TEXT "HOME" 643#define LVL_UP_TEXT "VOL+" 644#define LVL_DOWN_TEXT "VOL-" 645 646#elif CONFIG_KEYPAD == IHIFI_770_PAD || CONFIG_KEYPAD == IHIFI_800_PAD 647#define PEGBOX_SELECT BUTTON_PLAY 648#define PEGBOX_QUIT BUTTON_POWER 649#define PEGBOX_RESTART (BUTTON_POWER | BUTTON_HOME) 650#define PEGBOX_LVL_UP (BUTTON_POWER | BUTTON_VOL_UP) 651#define PEGBOX_LVL_DOWN (BUTTON_POWER | BUTTON_VOL_DOWN) 652#define PEGBOX_UP BUTTON_PREV 653#define PEGBOX_DOWN BUTTON_NEXT 654#define PEGBOX_RIGHT BUTTON_HOME 655#define PEGBOX_LEFT BUTTON_VOL_DOWN 656 657#define SELECT_TEXT "PLAY" 658#define QUIT_TEXT "POWER" 659#define RESTART_TEXT "HOME" 660#define LVL_UP_TEXT "VOL+" 661#define LVL_DOWN_TEXT "VOL-" 662 663#elif CONFIG_KEYPAD == FIIO_M3K_LINUX_PAD 664#define PEGBOX_SELECT BUTTON_PLAY 665#define PEGBOX_QUIT BUTTON_POWER 666#define PEGBOX_RESTART (BUTTON_POWER | BUTTON_HOME) 667#define PEGBOX_LVL_UP BUTTON_VOL_UP 668#define PEGBOX_LVL_DOWN BUTTON_VOL_DOWN 669#define PEGBOX_UP BUTTON_HOME 670#define PEGBOX_DOWN BUTTON_OPTION 671#define PEGBOX_RIGHT BUTTON_NEXT 672#define PEGBOX_LEFT BUTTON_PREV 673 674#define SELECT_TEXT "PLAY" 675#define QUIT_TEXT "POWER" 676#define RESTART_TEXT "HOME" 677#define LVL_UP_TEXT "VOL+" 678#define LVL_DOWN_TEXT "VOL-" 679 680#elif CONFIG_KEYPAD == EROSQ_PAD 681#define PEGBOX_SELECT BUTTON_PLAY 682#define PEGBOX_QUIT BUTTON_POWER 683#define PEGBOX_RESTART BUTTON_BACK 684#define PEGBOX_LVL_UP BUTTON_VOL_UP 685#define PEGBOX_LVL_DOWN BUTTON_VOL_DOWN 686#define PEGBOX_UP BUTTON_PREV 687#define PEGBOX_DOWN BUTTON_NEXT 688#define PEGBOX_RIGHT BUTTON_SCROLL_FWD 689#define PEGBOX_LEFT BUTTON_SCROLL_BACK 690 691#define SELECT_TEXT "PLAY" 692#define QUIT_TEXT "POWER" 693#define RESTART_TEXT "BACK" 694#define LVL_UP_TEXT "VOL+" 695#define LVL_DOWN_TEXT "VOL-" 696 697#elif CONFIG_KEYPAD == FIIO_M3K_PAD 698#define PEGBOX_SELECT BUTTON_SELECT 699#define PEGBOX_QUIT BUTTON_POWER 700#define PEGBOX_RESTART BUTTON_BACK 701#define PEGBOX_LVL_UP BUTTON_VOL_UP 702#define PEGBOX_LVL_DOWN BUTTON_VOL_DOWN 703#define PEGBOX_UP BUTTON_UP 704#define PEGBOX_DOWN BUTTON_DOWN 705#define PEGBOX_RIGHT BUTTON_RIGHT 706#define PEGBOX_LEFT BUTTON_LEFT 707 708#define SELECT_TEXT "SELECT" 709#define QUIT_TEXT "POWER" 710#define RESTART_TEXT "BACK" 711#define LVL_UP_TEXT "VOL+" 712#define LVL_DOWN_TEXT "VOL-" 713 714#elif CONFIG_KEYPAD == MA_PAD 715#define PEGBOX_SELECT BUTTON_PLAY 716#define PEGBOX_QUIT BUTTON_BACK 717#define PEGBOX_RESTART BUTTON_MENU 718#define PEGBOX_LVL_UP (BUTTON_UP|BUTTON_MENU) 719#define PEGBOX_LVL_DOWN (BUTTON_DOWN|BUTTON_MENU) 720#define PEGBOX_UP BUTTON_UP 721#define PEGBOX_DOWN BUTTON_DOWN 722#define PEGBOX_RIGHT BUTTON_RIGHT 723#define PEGBOX_LEFT BUTTON_LEFT 724 725#define SELECT_TEXT "PLAY" 726#define QUIT_TEXT "POWER HOLD" 727#define RESTART_TEXT "BACK" 728#define LVL_UP_TEXT "UP+MENU" 729#define LVL_DOWN_TEXT "DOWN+MENU" 730 731#elif CONFIG_KEYPAD == SHANLING_Q1_PAD 732/* use touchscreen */ 733 734#elif CONFIG_KEYPAD == SDL_PAD 735/* use touchscreen */ 736#elif CONFIG_KEYPAD == RG_NANO_PAD 737#define PEGBOX_SELECT BUTTON_A 738#define PEGBOX_QUIT BUTTON_START 739#define PEGBOX_RESTART BUTTON_B 740#define PEGBOX_LVL_UP BUTTON_R 741#define PEGBOX_LVL_DOWN BUTTON_L 742#define PEGBOX_UP BUTTON_UP 743#define PEGBOX_DOWN BUTTON_DOWN 744#define PEGBOX_RIGHT BUTTON_RIGHT 745#define PEGBOX_LEFT BUTTON_LEFT 746 747#define SELECT_TEXT "A" 748#define QUIT_TEXT "START" 749#define RESTART_TEXT "B" 750#define LVL_UP_TEXT "R" 751#define LVL_DOWN_TEXT "L" 752 753#else 754#error "Unsupported keymap!" 755#endif 756 757#if defined(HAVE_TOUCHSCREEN) 758#ifndef PEGBOX_QUIT 759#define PEGBOX_QUIT BUTTON_TOPLEFT 760#endif 761#ifndef PEGBOX_SELECT 762#define PEGBOX_SELECT BUTTON_CENTER 763#endif 764#ifndef PEGBOX_RESTART 765#define PEGBOX_RESTART BUTTON_TOPRIGHT 766#endif 767#ifndef PEGBOX_LVL_UP 768#define PEGBOX_LVL_UP BUTTON_BOTTOMLEFT 769#endif 770#ifndef PEGBOX_LVL_DOWN 771#define PEGBOX_LVL_DOWN BUTTON_BOTTOMRIGHT 772#endif 773#ifndef PEGBOX_UP 774#define PEGBOX_UP BUTTON_TOPMIDDLE 775#endif 776#ifndef PEGBOX_DOWN 777#define PEGBOX_DOWN BUTTON_BOTTOMMIDDLE 778#endif 779#ifndef PEGBOX_RIGHT 780#define PEGBOX_RIGHT BUTTON_MIDRIGHT 781#endif 782#ifndef PEGBOX_LEFT 783#define PEGBOX_LEFT BUTTON_MIDLEFT 784#endif 785#ifndef SELECT_TEXT 786#define SELECT_TEXT "CENTER" 787#endif 788#ifndef QUIT_TEXT 789#define QUIT_TEXT "TOPLEFT" 790#endif 791#ifndef RESTART_TEXT 792#define RESTART_TEXT "TOPRIGHT" 793#endif 794#ifndef LVL_UP_TEXT 795#define LVL_UP_TEXT "BOTTOMLEFT" 796#endif 797#ifndef LVL_DOWN_TEXT 798#define LVL_DOWN_TEXT "BOTTOMRIGHT" 799#endif 800#endif 801 802/* get several sizes from the bitmaps */ 803#ifdef BMPWIDTH_pegbox_pieces 804#define PIECE_WIDTH BMPWIDTH_pegbox_pieces 805#define PIECE_HEIGHT (BMPHEIGHT_pegbox_pieces/7) 806#else 807/* dummy numbers to avoid #error in dependency generation */ 808#define PIECE_WIDTH 50 809#define PIECE_HEIGHT 10 810#endif 811 812#define BOARD_WIDTH (12*PIECE_WIDTH) 813#define BOARD_HEIGHT (8*PIECE_HEIGHT) 814 815 816/* define a wide layout where the statistics are alongside the board, not above 817* base calculation on the piece bitmaps for the 8x12 board */ 818#if (LCD_WIDTH - BOARD_WIDTH) > (LCD_HEIGHT - BOARD_HEIGHT) 819#define WIDE_LAYOUT 820#endif 821 822 823#define HEADER_WIDTH BMPWIDTH_pegbox_header 824#define HEADER_HEIGHT BMPHEIGHT_pegbox_header 825 826 827#if defined WIDE_LAYOUT 828 829#if ((BOARD_WIDTH + HEADER_WIDTH + 4) <= LCD_WIDTH) 830#define BOARD_X 2 831#else 832#define BOARD_X 1 833#endif 834#define BOARD_Y (LCD_HEIGHT-BOARD_HEIGHT)/2 835 836#if (LCD_WIDTH >= 132) && (LCD_HEIGHT >= 80) 837#define TEXT_X 116 838#define LEVEL_TEXT_Y 14 839#define PEGS_TEXT_Y 58 840#elif (LCD_WIDTH >= 128) && (LCD_HEIGHT >= 64) 841#define TEXT_X 112 842#define LEVEL_TEXT_Y 27 843#define PEGS_TEXT_Y 50 844#else 845#error "Unsupported screen size" 846#endif 847 848#else /* "normal" layout */ 849 850#define BOARD_X (LCD_WIDTH-BOARD_WIDTH)/2 851#if ((BOARD_HEIGHT + HEADER_HEIGHT + 4) <= LCD_HEIGHT) 852#define BOARD_Y HEADER_HEIGHT+2 853#else 854#define BOARD_Y HEADER_HEIGHT 855#endif 856 857#if LCD_WIDTH >= 640 858#define LEVEL_TEXT_X 118 859#define PEGS_TEXT_X 552 860#define TEXT_Y 56 861#elif LCD_WIDTH >= 320 862#define LEVEL_TEXT_X 59 863#define PEGS_TEXT_X 276 864#define TEXT_Y 28 865#elif LCD_WIDTH >= 240 866#define LEVEL_TEXT_X 59 867#define PEGS_TEXT_X 196 868#define TEXT_Y 28 869#elif LCD_WIDTH >= 220 870#define LEVEL_TEXT_X 49 871#define PEGS_TEXT_X 186 872#define TEXT_Y 28 873#elif LCD_WIDTH >= 176 874#define LEVEL_TEXT_X 38 875#define PEGS_TEXT_X 155 876#define TEXT_Y 17 877#elif LCD_WIDTH >= 160 878#define LEVEL_TEXT_X 37 879#define PEGS_TEXT_X 140 880#define TEXT_Y 13 881#elif LCD_WIDTH >= 138 882#define LEVEL_TEXT_X 28 883#define PEGS_TEXT_X 119 884#define TEXT_Y 15 885#elif LCD_WIDTH >= 128 886#if HEADER_HEIGHT > 16 887#define LEVEL_TEXT_X 26 888#define PEGS_TEXT_X 107 889#define TEXT_Y 31 890#else 891#define LEVEL_TEXT_X 15 892#define PEGS_TEXT_X 100 893#define TEXT_Y 5 894#endif /* HEADER_HEIGHT */ 895#elif LCD_WIDTH >= 112 896#define LEVEL_TEXT_X 25 897#define PEGS_TEXT_X 90 898#define TEXT_Y 0 899#elif LCD_WIDTH >= 96 900#define LEVEL_TEXT_X 25 901#define PEGS_TEXT_X 86 902#define TEXT_Y 22 903#endif /* LCD_WIDTH */ 904 905#endif /* WIDE_LAYOUT */ 906 907 908#ifdef HAVE_LCD_COLOR 909#define BG_COLOR LCD_BLACK 910#define TEXT_BG LCD_RGBPACK(189,189,189) 911#endif 912 913 914#ifdef HAVE_TOUCHSCREEN 915#include "lib/pluginlib_touchscreen.h" 916static struct ts_raster pegbox_raster = 917 { BOARD_X, BOARD_Y, COLS*PIECE_WIDTH, ROWS*PIECE_HEIGHT, 918 PIECE_WIDTH, PIECE_HEIGHT }; 919static struct ts_raster_button_mapping pegbox_raster_btn = 920 { &pegbox_raster, false, false, true, false, true, {0, 0}, 0, 0, 0 }; 921#endif 922 923 924struct game_context { 925 unsigned int level; 926 unsigned int highlevel; 927 signed int player_row; 928 signed int player_col; 929 unsigned int num_left; 930 unsigned int playboard[ROWS][COLS]; 931}; 932 933char levels[NUM_LEVELS][ROWS][COLS] = { 934 /* Level 1 */ 935 {{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,}, 936 {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,}, 937 {1, 0, 0, 0, 7, 0, 0, 5, 0, 0, 0, 1,}, 938 {1, 0, 0, 0, 0, 3, 3, 2, 0, 0, 0, 1,}, 939 {1, 0, 0, 0, 4, 6, 0, 5, 0, 0, 0, 1,}, 940 {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,}, 941 {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,}, 942 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,}}, 943 944 /* Level 2 */ 945 {{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,}, 946 {1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 1,}, 947 {1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1,}, 948 {1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1,}, 949 {7, 0, 0, 0, 2, 2, 5, 5, 0, 0, 0, 1,}, 950 {1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1,}, 951 {1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1,}, 952 {1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 1,}}, 953 954 /* Level 3 */ 955 {{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,}, 956 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,}, 957 {1, 0, 0, 0, 0, 0, 2, 0, 7, 0, 0, 0,}, 958 {1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 2, 1,}, 959 {1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1,}, 960 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1,}, 961 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,}, 962 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,}}, 963 964 /* Level 4 */ 965 {{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,}, 966 {6, 0, 4, 0, 2, 0, 2, 0, 0, 0, 0, 1,}, 967 {6, 0, 3, 0, 5, 0, 2, 0, 0, 0, 0, 1,}, 968 {6, 0, 5, 0, 4, 7, 2, 0, 0, 0, 0, 1,}, 969 {6, 0, 2, 0, 4, 0, 2, 0, 3, 0, 0, 1,}, 970 {6, 0, 4, 0, 5, 0, 2, 0, 0, 0, 0, 1,}, 971 {6, 0, 5, 0, 4, 0, 2, 0, 0, 0, 0, 1,}, 972 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,}}, 973 974 /* Level 5 */ 975 {{0, 6, 6, 0, 4, 6, 0, 0, 6, 0, 0, 0,}, 976 {0, 6, 6, 0, 4, 4, 0, 0, 6, 0, 0, 2,}, 977 {2, 6, 6, 0, 6, 6, 6, 0, 1, 2, 2, 2,}, 978 {0, 6, 6, 0, 6, 4, 6, 0, 1, 2, 0, 2,}, 979 {0, 6, 6, 0, 6, 7, 6, 5, 6, 0, 0, 0,}, 980 {2, 6, 6, 0, 6, 6, 6, 0, 6, 0, 0, 0,}, 981 {0, 6, 6, 0, 4, 0, 0, 0, 6, 0, 0, 0,}, 982 {0, 6, 6, 0, 0, 5, 0, 0, 6, 5, 5, 0,}}, 983 984 /* Level 6 */ 985 {{7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,}, 986 {2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0,}, 987 {2, 0, 0, 2, 0, 0, 0, 2, 2, 0, 0, 0,}, 988 {0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 0,}, 989 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,}, 990 {0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1,}, 991 {0, 3, 0, 0, 0, 0, 0, 0, 5, 4, 6, 0,}, 992 {0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1,}}, 993 994 /* Level 7 */ 995 {{1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1,}, 996 {1, 1, 1, 6, 0, 0, 4, 6, 0, 1, 1, 1,}, 997 {1, 1, 1, 1, 0, 1, 5, 1, 0, 1, 1, 1,}, 998 {1, 1, 1, 2, 3, 3, 7, 4, 2, 6, 1, 1,}, 999 {1, 1, 1, 1, 0, 1, 2, 1, 0, 0, 0, 1,}, 1000 {1, 1, 1, 1, 0, 0, 5, 0, 0, 1, 0, 1,}, 1001 {1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1,}, 1002 {1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1,}}, 1003 1004 /* Level 8 */ 1005 {{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,}, 1006 {0, 0, 3, 3, 3, 3, 3, 4, 3, 3, 0, 0,}, 1007 {0, 0, 3, 3, 3, 2, 3, 3, 5, 3, 0, 0,}, 1008 {7, 0, 3, 3, 3, 2, 3, 3, 4, 3, 0, 0,}, 1009 {0, 0, 3, 3, 4, 5, 3, 3, 3, 3, 0, 0,}, 1010 {0, 0, 3, 3, 5, 2, 3, 3, 3, 3, 0, 0,}, 1011 {0, 0, 3, 3, 2, 4, 3, 3, 3, 3, 0, 0,}, 1012 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,}}, 1013 1014 /* Level 9 */ 1015 {{0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0,}, 1016 {0, 3, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0,}, 1017 {0, 0, 0, 0, 2, 4, 4, 3, 0, 1, 1, 0,}, 1018 {0, 1, 0, 0, 2, 1, 0, 0, 0, 1, 1, 1,}, 1019 {0, 0, 0, 2, 2, 7, 1, 0, 0, 0, 0, 2,}, 1020 {0, 0, 0, 0, 2, 1, 0, 0, 1, 1, 1, 1,}, 1021 {0, 3, 1, 0, 2, 5, 5, 0, 0, 0, 3, 0,}, 1022 {0, 0, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0,}}, 1023 1024 /* Level 10 */ 1025 {{1, 1, 1, 1, 2, 1, 1, 1, 0, 0, 0, 0,}, 1026 {1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 7,}, 1027 {0, 0, 4, 0, 6, 6, 6, 0, 0, 0, 3, 0,}, 1028 {0, 3, 3, 0, 6, 6, 6, 0, 4, 3, 4, 0,}, 1029 {0, 3, 3, 0, 6, 6, 6, 0, 4, 3, 4, 0,}, 1030 {0, 0, 0, 0, 6, 6, 6, 0, 3, 0, 0, 0,}, 1031 {1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0,}, 1032 {1, 1, 1, 1, 1, 2, 1, 1, 0, 0, 0, 0,}}, 1033 1034 /* Level 11 */ 1035 {{1, 7, 1, 0, 1, 1, 6, 0, 0, 1, 1, 0,}, 1036 {1, 0, 0, 0, 5, 4, 6, 6, 0, 2, 2, 0,}, 1037 {1, 2, 1, 2, 0, 1, 6, 0, 0, 2, 2, 0,}, 1038 {1, 0, 0, 2, 0, 1, 0, 0, 0, 3, 3, 0,}, 1039 {1, 2, 1, 0, 0, 1, 0, 1, 0, 3, 3, 0,}, 1040 {0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0,}, 1041 {0, 3, 4, 3, 0, 1, 0, 1, 0, 0, 0, 0,}, 1042 {0, 0, 0, 0, 2, 2, 2, 1, 1, 1, 1, 1,}}, 1043 1044 /* Level 12 */ 1045 {{7, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1,}, 1046 {1, 2, 1, 2, 1, 2, 1, 1, 0, 0, 0, 1,}, 1047 {0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1,}, 1048 {1, 2, 1, 2, 1, 2, 1, 0, 0, 0, 0, 1,}, 1049 {0, 0, 0, 0, 0, 0, 1, 1, 5, 5, 6, 1,}, 1050 {1, 2, 1, 2, 1, 2, 1, 1, 0, 2, 2, 1,}, 1051 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1,}, 1052 {1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1,}}, 1053 1054 /* Level 13 */ 1055 {{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,}, 1056 {0, 0, 4, 0, 2, 0, 5, 0, 4, 0, 0, 6,}, 1057 {0, 0, 2, 0, 5, 0, 2, 0, 4, 0, 0, 6,}, 1058 {7, 0, 3, 0, 4, 0, 5, 0, 4, 0, 0, 6,}, 1059 {0, 0, 5, 0, 4, 0, 2, 0, 4, 0, 0, 6,}, 1060 {0, 0, 4, 0, 2, 0, 5, 0, 4, 0, 0, 6,}, 1061 {0, 0, 3, 0, 3, 0, 2, 0, 4, 0, 0, 6,}, 1062 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,}}, 1063 1064 /* Level 14 */ 1065 {{1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1,}, 1066 {1, 1, 0, 2, 0, 0, 4, 0, 0, 2, 0, 1,}, 1067 {1, 6, 0, 0, 5, 1, 0, 1, 1, 0, 0, 1,}, 1068 {1, 1, 1, 0, 0, 3, 5, 3, 0, 0, 1, 1,}, 1069 {1, 1, 0, 0, 1, 1, 0, 1, 5, 0, 0, 6,}, 1070 {1, 1, 0, 2, 0, 0, 4, 0, 0, 0, 7, 1,}, 1071 {1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1,}, 1072 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,}}, 1073 1074 /* Level 15 */ 1075 {{0, 0, 0, 6, 0, 6, 0, 6, 0, 6, 0, 1,}, 1076 {0, 0, 0, 6, 0, 6, 0, 6, 0, 6, 0, 1,}, 1077 {0, 3, 4, 6, 0, 6, 0, 6, 0, 6, 0, 2,}, 1078 {0, 4, 0, 6, 0, 6, 4, 6, 0, 6, 0, 1,}, 1079 {0, 3, 0, 6, 0, 6, 0, 6, 0, 6, 0, 1,}, 1080 {7, 0, 0, 6, 4, 6, 0, 6, 0, 6, 0, 1,}, 1081 {0, 0, 4, 6, 0, 6, 0, 6, 4, 6, 0, 1,}, 1082 {0, 0, 4, 6, 0, 6, 0, 6, 0, 6, 0, 1,}} 1083}; 1084 1085/*********************************************************************** 1086* pegbox_draw_board() draws the game's current level. 1087************************************************************************/ 1088static void pegbox_draw_board(struct game_context* pb) 1089{ 1090 unsigned int r, c, type; 1091 pb->num_left = 0; 1092 1093 rb->lcd_clear_display(); 1094#ifdef WIDE_LAYOUT 1095 rb->lcd_bitmap(pegbox_header,LCD_WIDTH-HEADER_WIDTH,0, 1096 HEADER_WIDTH,LCD_HEIGHT); 1097#else 1098 rb->lcd_bitmap(pegbox_header,(LCD_WIDTH-HEADER_WIDTH)/2,0, 1099 HEADER_WIDTH, HEADER_HEIGHT); 1100#endif /* WIDE_LAYOUT */ 1101 1102#if ((BOARD_HEIGHT + HEADER_HEIGHT + 4) <= LCD_HEIGHT) 1103 rb->lcd_drawrect(BOARD_X-2,BOARD_Y-2,BOARD_WIDTH+4,BOARD_HEIGHT+4); 1104#endif /* enough space for a frame? */ 1105 1106#ifdef HAVE_LCD_COLOR 1107 rb->lcd_set_foreground(LCD_WHITE); 1108#if ((BOARD_HEIGHT + HEADER_HEIGHT + 2) <= LCD_HEIGHT) 1109 rb->lcd_fillrect(BOARD_X-1,BOARD_Y-1,BOARD_WIDTH+2,BOARD_HEIGHT+2); 1110#else 1111 rb->lcd_fillrect(BOARD_X,BOARD_Y,BOARD_WIDTH,BOARD_HEIGHT); 1112#endif 1113 rb->lcd_set_foreground(LCD_BLACK); 1114 rb->lcd_set_background(TEXT_BG); 1115#endif 1116 1117 for (r=0 ; r < ROWS ; r++) { 1118 for (c = 0 ; c < COLS ; c++) { 1119 1120 type = pb->playboard[r][c]; 1121 1122 if(type != SPACE) { 1123 rb->lcd_bitmap_part(pegbox_pieces, 0, (type-1)*PIECE_HEIGHT, 1124 STRIDE( SCREEN_MAIN, 1125 BMPWIDTH_pegbox_pieces,BMPHEIGHT_pegbox_pieces), 1126 c * PIECE_WIDTH + BOARD_X, 1127 r * PIECE_HEIGHT + BOARD_Y, PIECE_WIDTH, 1128 PIECE_HEIGHT); 1129 } 1130 1131 if(pb->playboard[r][c] == PLAYER) { 1132 pb->player_row=r; 1133 pb->player_col=c; 1134 } 1135 else if (type != WALL && type != SPACE && type != HOLE) 1136 pb->num_left++; 1137 } 1138 } 1139 1140#ifdef WIDE_LAYOUT 1141 rb->lcd_putsxyf(TEXT_X, LEVEL_TEXT_Y, "%d", pb->level); 1142 rb->lcd_putsxyf(TEXT_X, PEGS_TEXT_Y, "%d", pb->num_left); 1143#else 1144 rb->lcd_putsxyf(LEVEL_TEXT_X, TEXT_Y, "%d", pb->level); 1145 rb->lcd_putsxyf(PEGS_TEXT_X, TEXT_Y, "%d", pb->num_left); 1146#endif /*WIDE_LAYOUT*/ 1147 1148#ifdef HAVE_LCD_COLOR 1149 rb->lcd_set_background(BG_COLOR); 1150 rb->lcd_set_foreground(LCD_WHITE); 1151#endif 1152 /* print out the screen */ 1153 rb->lcd_update(); 1154} 1155 1156/***************************************************************************** 1157* pegbox_load_level() loads the player's current level from the array and sets the 1158* player's position. 1159******************************************************************************/ 1160static void pegbox_load_level(struct game_context* pb) 1161{ 1162 int r, c; 1163 1164 for(r = 0; r < ROWS; r++) 1165 for(c = 0; c < COLS; c++) 1166 pb->playboard[r][c] = levels[pb->level-1][r][c]; 1167} 1168 1169/***************************************************************************** 1170* pegbox_new_piece() creates a new piece at a specified location. The player 1171* navigates through the pieces and selects one. 1172******************************************************************************/ 1173static void pegbox_new_piece(struct game_context* pb, unsigned int x_loc, 1174 unsigned int y_loc) 1175{ 1176 int button; 1177 bool exit = false; 1178 1179 pb->playboard[x_loc][y_loc] = TRIANGLE; 1180 1181 while (!exit) { 1182 pegbox_draw_board(pb); 1183 button = rb->button_get(true); 1184#ifdef HAVE_TOUCHSCREEN 1185 if(button & BUTTON_TOUCHSCREEN) 1186 { 1187 pegbox_raster_btn.two_d_from.y = x_loc; 1188 pegbox_raster_btn.two_d_from.x = y_loc; 1189 1190 struct ts_raster_button_result ret = 1191 touchscreen_raster_map_button(&pegbox_raster_btn, 1192 rb->button_get_data() >> 16, 1193 rb->button_get_data() & 0xffff, 1194 button); 1195 if(ret.action == TS_ACTION_TWO_D_MOVEMENT) 1196 { 1197 if(ret.to.x > ret.from.x) 1198 button = PEGBOX_UP; 1199 else if(ret.to.x < ret.from.x) 1200 button = PEGBOX_DOWN; 1201 else if(ret.to.y > ret.from.y) 1202 button = PEGBOX_LEFT; 1203 else if(ret.to.y < ret.from.y) 1204 button = PEGBOX_RIGHT; 1205 } 1206 else if(ret.action == TS_ACTION_CLICK 1207 && (unsigned)ret.to.x == y_loc 1208 && (unsigned)ret.to.y == x_loc) 1209 button = PEGBOX_SELECT; 1210 } 1211#endif 1212 switch(button){ 1213 case PEGBOX_LEFT: 1214 case (PEGBOX_LEFT|BUTTON_REPEAT): 1215 case PEGBOX_DOWN: 1216 case (PEGBOX_DOWN|BUTTON_REPEAT): 1217 if (pb->playboard[x_loc][y_loc] < 5) 1218 pb->playboard[x_loc][y_loc]++; 1219 else 1220 pb->playboard[x_loc][y_loc] = TRIANGLE; 1221 break; 1222 case PEGBOX_RIGHT: 1223 case (PEGBOX_RIGHT|BUTTON_REPEAT): 1224 case PEGBOX_UP: 1225 case (PEGBOX_UP|BUTTON_REPEAT): 1226 if (pb->playboard[x_loc][y_loc] > 2) 1227 pb->playboard[x_loc][y_loc]--; 1228 else 1229 pb->playboard[x_loc][y_loc] = CIRCLE; 1230 break; 1231 case PEGBOX_SELECT: 1232 exit=true; 1233 break; 1234 } 1235 } 1236} 1237 1238/***************************************************************************** 1239* pegbox_move_player() moves the player and pieces and updates the board accordingly. 1240******************************************************************************/ 1241static void pegbox_move_player(struct game_context* pb, signed int x_dir, 1242 signed int y_dir) 1243{ 1244 unsigned int type1, type2; 1245 signed int r1,c1,r2,c2; 1246 1247 r1 = pb->player_row+y_dir; 1248 c1 = pb->player_col+x_dir; 1249 r2 = pb->player_row+y_dir*2; 1250 c2 = pb->player_col+x_dir*2; 1251 1252 type1 = pb->playboard[r1][c1]; 1253 type2 = pb->playboard[r2][c2]; 1254 1255 if (r1 == ROWS || c1 == COLS || r1 < 0 || c1 < 0 || type1 == WALL) 1256 return; 1257 else if(type1 != SPACE) { 1258 if (r2 == ROWS || c2 == COLS || r2 < 0 || c2 < 0 || type2 == WALL) 1259 return; 1260 } 1261 1262 1263 pb->playboard[pb->player_row][pb->player_col] = SPACE; 1264 pb->player_row += y_dir; 1265 pb->player_col += x_dir; 1266 1267 if (type1 == HOLE) { 1268 pegbox_draw_board(pb); 1269 rb->splash(HZ*2, "You fell down a hole!"); 1270 pegbox_load_level(pb); 1271 } 1272 else if (type1 == SPACE) 1273 pb->playboard[r1][c1] = PLAYER; 1274 else { 1275 pb->playboard[r1][c1] = PLAYER; 1276 if(type1 == type2) { 1277 if (type1 == TRIANGLE) 1278 pb->playboard[r2][c2] = WALL; 1279 else if (type1 == CROSS) { 1280 pb->playboard[r1][c1] = SPACE; 1281 pegbox_new_piece(pb, r2, c2); 1282 pb->playboard[r1][c1] = PLAYER; 1283 } 1284 else 1285 pb->playboard[r2][c2] = SPACE; 1286 } 1287 else if (type2 == SPACE) 1288 pb->playboard[r2][c2] = type1; 1289 else if (type2 == HOLE) { 1290 if (type1 == SQUARE) 1291 pb->playboard[r2][c2] = SPACE; 1292 } 1293 else { 1294 rb->splash(HZ*2, "Illegal Move!"); 1295 pegbox_load_level(pb); 1296 } 1297 } 1298 1299 pegbox_draw_board(pb); 1300} 1301 1302/*********************************************************************** 1303* pegbox_help() display help text 1304************************************************************************/ 1305static bool pegbox_help(void) 1306{ 1307 static char* help_text[] = { 1308 "Pegbox", "", "Aim", "", 1309 "To", "beat", "each", "level,", "you", "must", "destroy", "all", "of", 1310 "the", "pegs.", "If", "two", "like", "pegs", "are", "pushed", "into", 1311 "each", "other,", "they", "disappear", "except", "for", "triangles", 1312 "which", "form", "a", "solid", "block", "and", "crosses", "which", 1313 "allow", "you", "to", "choose", "a", "replacement", "block.", "", "", 1314 "Controls", "", 1315 RESTART_TEXT, "to", "restart", "level", "", 1316 LVL_UP_TEXT, "to", "go", "up", "a", "level", "", 1317 LVL_DOWN_TEXT, "to", "go", "down", "a", "level", "", 1318 SELECT_TEXT, "to", "choose", "peg", "", 1319 QUIT_TEXT, "to", "quit" 1320 }; 1321 static struct style_text formation[]={ 1322 { 0, TEXT_CENTER|TEXT_UNDERLINE }, 1323 { 2, C_RED }, 1324 { 46, C_RED }, 1325 LAST_STYLE_ITEM 1326 }; 1327 1328 rb->lcd_setfont(FONT_UI); 1329 if (display_text(ARRAYLEN(help_text), help_text, formation, NULL, true)) 1330 return true; 1331 rb->lcd_setfont(FONT_SYSFIXED); 1332 1333 return false; 1334} 1335 1336/*********************************************************************** 1337* pegbox_menu() is the game menu 1338************************************************************************/ 1339static bool _ingame; 1340static int pegbox_menu_cb(int action, 1341 const struct menu_item_ex *this_item, 1342 struct gui_synclist *this_list) 1343{ 1344 (void)this_list; 1345 1346 int i = (intptr_t)this_item; 1347 if( action == ACTION_REQUEST_MENUITEM ) 1348 { 1349 if((!_ingame && (i==0 || i==1)) || ( _ingame && i==2 )) 1350 return ACTION_EXIT_MENUITEM; 1351 } 1352 return action; 1353} 1354 1355static unsigned int pegbox_menu(struct game_context* pb, bool ingame) 1356{ 1357 int selected = 0; 1358 int last_level = pb->level; 1359 1360 MENUITEM_STRINGLIST (main_menu, "Pegbox Menu", pegbox_menu_cb, 1361 "Resume Game", "Restart Level", "Start Game", 1362 "Select Level", "Help", 1363 "Playback Control", "Quit"); 1364 _ingame = ingame; 1365 rb->button_clear_queue(); 1366 1367 while (true) { 1368 switch (rb->do_menu(&main_menu, &selected, NULL, false)) { 1369 case 0: 1370 pb->level = last_level; 1371 pegbox_draw_board(pb); 1372 return 0; 1373 case 1: 1374 case 2: 1375 pegbox_load_level(pb); 1376 pegbox_draw_board(pb); 1377 return 0; 1378 case 3: 1379 if(rb->set_int("Select Level", "", UNIT_INT, &pb->level, 1380 NULL, 1, 1, pb->highlevel, NULL)) 1381 return 1; 1382 break; 1383 case 4: 1384 if (pegbox_help()) 1385 return 1; 1386 break; 1387 case 5: 1388 if (playback_control(NULL)) 1389 return 1; 1390 break; 1391 case 6: 1392 return 1; 1393 case MENU_ATTACHED_USB: 1394 return 1; 1395 default: 1396 break; 1397 } 1398 } 1399} 1400 1401/*********************************************************************** 1402* pegbox_main() is the main game subroutine 1403************************************************************************/ 1404static int pegbox_main(struct game_context* pb) 1405{ 1406 int button; 1407 1408 if (pegbox_menu(pb, false)==1) { 1409 return 1; 1410 } 1411 1412 while (true) { 1413 button = rb->button_get(true); 1414#ifdef HAVE_TOUCHSCREEN 1415 if(button & BUTTON_TOUCHSCREEN) 1416 { 1417 pegbox_raster_btn.two_d_from.y = pb->player_row; 1418 pegbox_raster_btn.two_d_from.x = pb->player_col; 1419 1420 struct ts_raster_button_result ret = 1421 touchscreen_raster_map_button(&pegbox_raster_btn, 1422 rb->button_get_data() >> 16, 1423 rb->button_get_data() & 0xffff, 1424 button); 1425 if(ret.action == TS_ACTION_TWO_D_MOVEMENT) 1426 pegbox_move_player(pb, ret.to.x - ret.from.x, ret.to.y - ret.from.y); 1427 } 1428#endif 1429 switch(button){ 1430 case PEGBOX_LEFT: /* move cursor left */ 1431 case (PEGBOX_LEFT|BUTTON_REPEAT): 1432 pegbox_move_player(pb, -1, 0); 1433 break; 1434 1435 case PEGBOX_RIGHT: /* move cursor right */ 1436 case (PEGBOX_RIGHT|BUTTON_REPEAT): 1437 pegbox_move_player(pb, 1, 0); 1438 break; 1439 1440 case PEGBOX_DOWN: /* move cursor down */ 1441 case (PEGBOX_DOWN|BUTTON_REPEAT): 1442 pegbox_move_player(pb, 0, 1); 1443 break; 1444 1445 case PEGBOX_UP: /* move cursor up */ 1446 case (PEGBOX_UP|BUTTON_REPEAT): 1447 pegbox_move_player(pb, 0, -1); 1448 break; 1449 1450 case PEGBOX_QUIT: 1451 if (pegbox_menu(pb, true)==1) { 1452 return 1; 1453 } 1454 break; 1455 1456#ifdef PEGBOX_RESTART 1457 case PEGBOX_RESTART: 1458 pegbox_load_level(pb); 1459 pegbox_draw_board(pb); 1460 break; 1461#endif 1462 1463#ifdef PEGBOX_LVL_UP 1464 case (PEGBOX_LVL_UP|BUTTON_REPEAT): 1465 case PEGBOX_LVL_UP: 1466 if (pb->level >= pb->highlevel) { 1467 pb->level = 1; 1468 } else { 1469 pb->level++; 1470 } 1471 pegbox_load_level(pb); 1472 pegbox_draw_board(pb); 1473 break; 1474#endif 1475 1476#ifdef PEGBOX_LVL_DOWN 1477 case (PEGBOX_LVL_DOWN|BUTTON_REPEAT): 1478 case PEGBOX_LVL_DOWN: 1479 if(pb->level <= 1) { 1480 pb->level = pb->highlevel; 1481 } else { 1482 pb->level--; 1483 } 1484 pegbox_load_level(pb); 1485 pegbox_draw_board(pb); 1486 break; 1487#endif 1488 } 1489 1490 if (pb->num_left == 0) { 1491 rb->splash(HZ*2, "Nice Pegging!"); 1492 if (pb->level == NUM_LEVELS) { 1493 pegbox_draw_board(pb); 1494 rb->splash(HZ*2, "Congratulations!"); 1495 rb->splash(HZ*2, "You have finished the game!"); 1496 if (pegbox_menu(pb,false)==1) { 1497 return 1; 1498 } 1499 } 1500 else { 1501 pb->level++; 1502 pegbox_load_level(pb); 1503 pegbox_draw_board(pb); 1504 } 1505 1506 if(pb->level > pb->highlevel) 1507 pb->highlevel = pb->level; 1508 1509 } 1510 } 1511 return PLUGIN_OK; 1512} 1513 1514/***************************************************************************** 1515* plugin entry point. 1516******************************************************************************/ 1517enum plugin_status plugin_start(const void* parameter) 1518{ 1519 (void)parameter; 1520 rb->lcd_setfont(FONT_SYSFIXED); 1521#if LCD_DEPTH > 1 1522 rb->lcd_set_backdrop(NULL); 1523#endif 1524#ifdef HAVE_LCD_COLOR 1525 rb->lcd_set_foreground(LCD_WHITE); 1526 rb->lcd_set_background(BG_COLOR); 1527#endif 1528 rb->lcd_clear_display(); 1529 1530 struct game_context pb; 1531 pb.level=1; 1532 pb.highlevel=1; 1533 struct configdata config[] = { 1534 {TYPE_INT, 1, NUM_LEVELS, { .int_p = &(pb.level) }, "level", NULL}, 1535 {TYPE_INT, 1, NUM_LEVELS, { .int_p = &(pb.highlevel) }, "highlevel", NULL}, 1536 }; 1537 configfile_load(CONFIG_FILE_NAME,config,2,0); 1538 pegbox_main(&pb); 1539 configfile_save(CONFIG_FILE_NAME,config,2,0); 1540 rb->lcd_setfont(FONT_UI); 1541 1542 return PLUGIN_OK; 1543}