A modern Music Player Daemon based on Rockbox open source high quality audio player
libadwaita
audio
rust
zig
deno
mpris
rockbox
mpd
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}