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 ****************************************************************************/
22 #include "lib/pluginlib_exit.h"
24 /* NIM game for the player
29 Two players (you and the cpu) alternately pick a certain number of matches and the one,
30 who takes the last match, loses.
36 First release of the game
38 I Change the patterns definition in order to have a clean code
40 Patch from JB that change:
41 . the win and lose message
42 . the BUTTON_STOP code
44 I suppress the exit variable
45 I suppress or translates the comments which were in French
46 I put min=1 at the of the main loop ( When there are 21 matches you can decide not to
47 take a match. Later you are obliged to take at least one.)
52 /*Pattern for the game*/
53 static unsigned char smile
[]={0x00, 0x11, 0x04, 0x04, 0x00, 0x11, 0x0E}; /* :-) */
54 static unsigned char cry
[] ={0x00, 0x11, 0x04, 0x04, 0x00, 0x0E, 0x11}; /* :-( */
55 static unsigned char pattern3
[]={0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15}; /*3 parts*/
56 static unsigned char pattern2
[]={0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14}; /*2 parts*/
57 static unsigned char pattern1
[]={0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10}; /*1 part*/
59 static unsigned long hsmile
,hcry
,h1
,h2
; /*Handle for the new pattern*/
61 static bool end
; /*If true game is finished*/
63 /*Display that the action it's impossible*/
64 static void impossible(void)
66 rb
->lcd_puts(0,1,"Impossible!");
72 /*Display that the CPU lose :) */
73 static void lose(void)
75 rb
->lcd_define_pattern(hsmile
,smile
);
76 rb
->lcd_puts(0,1,"You Win!!");
77 rb
->lcd_putc(8,1,hsmile
);
85 /* Display that the CPU win :( */
88 rb
->lcd_define_pattern(hcry
,cry
);
89 rb
->lcd_puts(0,1,"You Lose!!");
90 rb
->lcd_putc(9,1,hcry
);
98 /*Display the first line*/
99 static void display_first_line(int x
)
103 rb
->lcd_putsf(0,0," =%d",x
);
105 rb
->lcd_define_pattern(h1
,pattern3
);
107 rb
->lcd_putc(i
,0,h1
);
111 rb
->lcd_define_pattern(h2
,pattern2
);
112 rb
->lcd_putc(i
,0,h2
);
116 rb
->lcd_define_pattern(h2
,pattern1
);
117 rb
->lcd_putc(i
,0,h2
);
121 /* Call when the program end */
122 static void nim_exit(void)
124 /*Restore the old pattern*/
125 rb
->lcd_unlock_pattern(h1
);
126 rb
->lcd_unlock_pattern(h2
);
127 rb
->lcd_unlock_pattern(hsmile
);
128 rb
->lcd_unlock_pattern(hcry
);
131 rb
->lcd_clear_display();
135 /* this is the plugin entry point */
136 enum plugin_status
plugin_start(const void* parameter
)
144 /* if you don't use the parameter, you can do like
145 this to avoid the compiler warning about it */
148 /*Get the pattern handle*/
149 h1
=rb
->lcd_get_locked_pattern();
150 h2
=rb
->lcd_get_locked_pattern();
151 hcry
=rb
->lcd_get_locked_pattern();
152 hsmile
=rb
->lcd_get_locked_pattern();
155 rb
->splash(HZ
, "NIM V1.2");
156 rb
->lcd_clear_display();
168 /*Empty the event queue*/
169 rb
->button_clear_queue();
178 display_first_line(x
);
180 rb
->lcd_putsf(0,1,"[%d..%d]?=%d",min
,v
,y
);
186 button
= rb
->button_get(true);
189 case BUTTON_STOP
|BUTTON_REL
:
194 case BUTTON_PLAY
|BUTTON_REL
:
198 case BUTTON_LEFT
|BUTTON_REL
:
204 case BUTTON_RIGHT
|BUTTON_REL
:
214 display_first_line(x
);
215 rb
->lcd_putsf(0,1,"[%d..%d]?=%d",min
,v
,y
);
219 if ( (y
==0) && (x
<21))
226 if (y
!=0) /*If y=0 and x=21 jump to CPU code */
245 display_first_line(x
);
268 if ((y
==0) && (x
>14))
275 rb
->lcd_putsf(0,1,"I take=%d",y
);