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 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(const void* parameter
)
148 /* if you don't use the parameter, you can do like
149 this to avoid the compiler warning about it */
152 /*Get the pattern handle*/
153 h1
=rb
->lcd_get_locked_pattern();
154 h2
=rb
->lcd_get_locked_pattern();
155 hcry
=rb
->lcd_get_locked_pattern();
156 hsmile
=rb
->lcd_get_locked_pattern();
159 rb
->splash(HZ
, "NIM V1.2");
160 rb
->lcd_clear_display();
172 /*Empty the event queue*/
173 rb
->button_clear_queue();
182 display_first_line(x
);
184 rb
->snprintf(str
,sizeof(str
),"[%d..%d]?=%d",min
,v
,y
);
185 rb
->lcd_puts(0,1,str
);
191 button
= rb
->button_get(true);
194 case BUTTON_STOP
|BUTTON_REL
:
200 case BUTTON_PLAY
|BUTTON_REL
:
204 case BUTTON_LEFT
|BUTTON_REL
:
210 case BUTTON_RIGHT
|BUTTON_REL
:
217 if (rb
->default_event_handler_ex(button
, nim_exit
,
218 NULL
) == SYS_USB_CONNECTED
)
219 return PLUGIN_USB_CONNECTED
;
222 display_first_line(x
);
223 rb
->snprintf(str
,sizeof(str
),"[%d..%d]?=%d",min
,v
,y
);
224 rb
->lcd_puts(0,1,str
);
228 if ( (y
==0) && (x
<21))
235 if (y
!=0) /*If y=0 and x=21 jump to CPU code */
254 display_first_line(x
);
277 if ((y
==0) && (x
>14))
284 rb
->snprintf(str
,sizeof(str
),"I take=%d",y
);
285 rb
->lcd_puts(0,1,str
);