1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * Copyright (C) 2003 Pierre Delore
12 * All files in this archive are subject to the GNU General Public License.
13 * See the file COPYING in the source tree root for full license agreement.
15 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
16 * KIND, either express or implied.
18 ****************************************************************************/
21 #ifdef HAVE_LCD_CHARCELLS
23 /* NIM game for the player
28 Two players (you and the cpu) alternately pick a certain number of matches and the one,
29 who takes the last match, loses.
35 First release of the game
37 I Change the patterns definition in order to have a clean code
39 Patch from JB that change:
40 . the win and lose message
41 . the BUTTON_STOP code
43 I suppress the exit variable
44 I suppress or translates the comments which were in French
45 I put min=1 at the of the main loop ( When there are 21 matches you can decide not to
46 take a match. Later you are obliged to take at least one.)
51 /*Pattern for the game*/
52 static unsigned char smile
[]={0x00, 0x11, 0x04, 0x04, 0x00, 0x11, 0x0E}; /* :-) */
53 static unsigned char cry
[] ={0x00, 0x11, 0x04, 0x04, 0x00, 0x0E, 0x11}; /* :-( */
54 static unsigned char pattern3
[]={0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15}; /*3 parts*/
55 static unsigned char pattern2
[]={0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14}; /*2 parts*/
56 static unsigned char pattern1
[]={0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10}; /*1 part*/
58 static unsigned char str
[12]; /*String use to display the first line*/
59 static unsigned long hsmile
,hcry
,h1
,h2
; /*Handle for the new pattern*/
61 static bool end
; /*If true game is finished*/
62 static struct plugin_api
* rb
;
65 /*Display that the action it's impossible*/
66 static void impossible(void)
68 rb
->lcd_puts(0,1,"Impossible!");
74 /*Display that the CPU lose :) */
75 static void lose(void)
77 rb
->lcd_define_pattern(hsmile
,smile
);
78 rb
->lcd_puts(0,1,"You Win!!");
79 rb
->lcd_putc(8,1,hsmile
);
87 /* Display that the CPU win :( */
90 rb
->lcd_define_pattern(hcry
,cry
);
91 rb
->lcd_puts(0,1,"You Lose!!");
92 rb
->lcd_putc(9,1,hcry
);
100 /*Display the first line*/
101 static void display_first_line(int x
)
105 rb
->snprintf(str
,sizeof(str
)," =%d",x
);
106 rb
->lcd_puts(0,0,str
);
108 rb
->lcd_define_pattern(h1
,pattern3
);
110 rb
->lcd_putc(i
,0,h1
);
114 rb
->lcd_define_pattern(h2
,pattern2
);
115 rb
->lcd_putc(i
,0,h2
);
119 rb
->lcd_define_pattern(h2
,pattern1
);
120 rb
->lcd_putc(i
,0,h2
);
124 /* Call when the program end */
125 static void nim_exit(void *parameter
)
129 /*Restore the old pattern*/
130 rb
->lcd_unlock_pattern(h1
);
131 rb
->lcd_unlock_pattern(h2
);
132 rb
->lcd_unlock_pattern(hsmile
);
133 rb
->lcd_unlock_pattern(hcry
);
136 rb
->lcd_clear_display();
140 /* this is the plugin entry point */
141 enum plugin_status
plugin_start(struct plugin_api
* api
, void* parameter
)
148 /* if you don't use the parameter, you can do like
149 this to avoid the compiler warning about it */
152 /* if you are using a global api pointer, don't forget to copy it!
153 otherwise you will get lovely "I04: IllInstr" errors... :-) */
156 /*Get the pattern handle*/
157 h1
=rb
->lcd_get_locked_pattern();
158 h2
=rb
->lcd_get_locked_pattern();
159 hcry
=rb
->lcd_get_locked_pattern();
160 hsmile
=rb
->lcd_get_locked_pattern();
163 rb
->splash(HZ
, "NIM V1.2");
164 rb
->lcd_clear_display();
176 /*Empty the event queue*/
177 rb
->button_clear_queue();
186 display_first_line(x
);
188 rb
->snprintf(str
,sizeof(str
),"[%d..%d]?=%d",min
,v
,y
);
189 rb
->lcd_puts(0,1,str
);
195 button
= rb
->button_get(true);
198 case BUTTON_STOP
|BUTTON_REL
:
204 case BUTTON_PLAY
|BUTTON_REL
:
208 case BUTTON_LEFT
|BUTTON_REL
:
214 case BUTTON_RIGHT
|BUTTON_REL
:
221 if (rb
->default_event_handler_ex(button
, nim_exit
,
222 NULL
) == SYS_USB_CONNECTED
)
223 return PLUGIN_USB_CONNECTED
;
226 display_first_line(x
);
227 rb
->snprintf(str
,sizeof(str
),"[%d..%d]?=%d",min
,v
,y
);
228 rb
->lcd_puts(0,1,str
);
232 if ( (y
==0) && (x
<21))
239 if (y
!=0) /*If y=0 and x=21 jump to CPU code */
258 display_first_line(x
);
281 if ((y
==0) && (x
>14))
288 rb
->snprintf(str
,sizeof(str
),"I take=%d",y
);
289 rb
->lcd_puts(0,1,str
);