1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * Copyright (C) 2003 Pierre Delore
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.
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
20 ****************************************************************************/
23 #ifdef HAVE_LCD_CHARCELLS
25 /* NIM game for the player
30 Two players (you and the cpu) alternately pick a certain number of matches and the one,
31 who takes the last match, loses.
37 First release of the game
39 I Change the patterns definition in order to have a clean code
41 Patch from JB that change:
42 . the win and lose message
43 . the BUTTON_STOP code
45 I suppress the exit variable
46 I suppress or translates the comments which were in French
47 I put min=1 at the of the main loop ( When there are 21 matches you can decide not to
48 take a match. Later you are obliged to take at least one.)
53 /*Pattern for the game*/
54 static unsigned char smile
[]={0x00, 0x11, 0x04, 0x04, 0x00, 0x11, 0x0E}; /* :-) */
55 static unsigned char cry
[] ={0x00, 0x11, 0x04, 0x04, 0x00, 0x0E, 0x11}; /* :-( */
56 static unsigned char pattern3
[]={0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15}; /*3 parts*/
57 static unsigned char pattern2
[]={0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14}; /*2 parts*/
58 static unsigned char pattern1
[]={0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10}; /*1 part*/
60 static unsigned char str
[12]; /*String use to display the first line*/
61 static unsigned long hsmile
,hcry
,h1
,h2
; /*Handle for the new pattern*/
63 static bool end
; /*If true game is finished*/
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 cleanup(UNUSED_ATTR
void *parameter
)
127 /*Restore the old pattern*/
128 rb
->lcd_unlock_pattern(h1
);
129 rb
->lcd_unlock_pattern(h2
);
130 rb
->lcd_unlock_pattern(hsmile
);
131 rb
->lcd_unlock_pattern(hcry
);
134 rb
->lcd_clear_display();
138 /* this is the plugin entry point */
139 enum plugin_status
plugin_start(UNUSED_ATTR
const void* parameter
)
146 /* if you don't use the parameter, you can do like
147 this to avoid the compiler warning about it */
149 /*Get the pattern handle*/
150 h1
=rb
->lcd_get_locked_pattern();
151 h2
=rb
->lcd_get_locked_pattern();
152 hcry
=rb
->lcd_get_locked_pattern();
153 hsmile
=rb
->lcd_get_locked_pattern();
156 rb
->splash(HZ
, "NIM V1.2");
157 rb
->lcd_clear_display();
169 /*Empty the event queue*/
170 rb
->button_clear_queue();
179 display_first_line(x
);
181 rb
->snprintf(str
,sizeof(str
),"[%d..%d]?=%d",min
,v
,y
);
182 rb
->lcd_puts(0,1,str
);
188 button
= rb
->button_get(true);
191 case BUTTON_STOP
|BUTTON_REL
:
197 case BUTTON_PLAY
|BUTTON_REL
:
201 case BUTTON_LEFT
|BUTTON_REL
:
207 case BUTTON_RIGHT
|BUTTON_REL
:
214 if (rb
->default_event_handler_ex(button
, nim_exit
,
215 NULL
) == SYS_USB_CONNECTED
)
216 return PLUGIN_USB_CONNECTED
;
219 display_first_line(x
);
220 rb
->snprintf(str
,sizeof(str
),"[%d..%d]?=%d",min
,v
,y
);
221 rb
->lcd_puts(0,1,str
);
225 if ( (y
==0) && (x
<21))
232 if (y
!=0) /*If y=0 and x=21 jump to CPU code */
251 display_first_line(x
);
274 if ((y
==0) && (x
>14))
281 rb
->snprintf(str
,sizeof(str
),"I take=%d",y
);
282 rb
->lcd_puts(0,1,str
);