rockbox/apps/plugins/jackpot.c

278 lines
7.8 KiB
C

/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id$
*
* Copyright (C) 2003 Pierre Delore
*
* All files in this archive are subject to the GNU General Public License.
* See the file COPYING in the source tree root for full license agreement.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
****************************************************************************/
/*
History:
* V1.0: 21/07/03
First version with a dirty definition of the patterns.
* V1.1: 24/07/03
Clean definition of the patterns.
Init message change
*/
#include "plugin.h"
#ifdef HAVE_LCD_CHARCELLS
PLUGIN_HEADER
/* Jackpot game for the player */
static unsigned char pattern[]={
0x00, 0x0A, 0x1F, 0x1F, 0x1F, 0x0e, 0x04, /* (+00)Coeur */
0x00, 0x04, 0x0E, 0x1F, 0x1F, 0x04, 0x0E, /* (+07)Pique */
0x00, 0x04, 0x0E, 0x1F, 0x0E, 0x04, 0x00, /* (+14)Carreau */
0x00, 0x15, 0x0E, 0x1F, 0x0E, 0x15, 0x00, /* (+21)Treffle */
0x03, 0x04, 0x0e, 0x1F, 0x1F, 0x1F, 0x0e, /* (+28)Cerise */
0x00, 0x04, 0x04, 0x1F, 0x04, 0x0E, 0x1F, /* (+35)Carreau */
0x04, 0x0E, 0x15, 0x04, 0x0A, 0x0A, 0x11, /* (+42)Homme */
0x00, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x00, /* (+49)Carre */
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* (+56)Empty */
0x00, 0x0A, 0x1F, 0x1F, 0x1F, 0x0e, 0x04 /* (+63)Coeur */
};
static unsigned char str[12]; /*Containt the first line*/
static unsigned char h1,h2,h3; /*Handle for the pattern*/
/* here is a global api struct pointer. while not strictly necessary,
it's nice not to have to pass the api pointer in all function calls
in the plugin */
static struct plugin_api* rb;
/*Display the first line*/
static void display_first_line(int g)
{
rb->snprintf(str,sizeof(str),"[ ]$%d",g);
rb->lcd_puts(0,0,str);
rb->lcd_putc(1,0, h1);
rb->lcd_putc(2,0, h2);
rb->lcd_putc(3,0, h3);
}
/*Call when the program exit*/
static void jackpot_exit(void *parameter)
{
(void)parameter;
/* Restore the old pattern (i don't find another way to do this. Any
idea?) */
rb->lcd_unlock_pattern(h1);
rb->lcd_unlock_pattern(h2);
rb->lcd_unlock_pattern(h3);
/* Clear the screen */
rb->lcd_clear_display();
}
/* this is the plugin entry point */
enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
{
int i,button,w,j;
int s[3];
int n[3];
int g=20;
bool exit=false;
bool go;
/* if you don't use the parameter, you can do like
this to avoid the compiler warning about it */
(void)parameter;
/* if you are using a global api pointer, don't forget to copy it!
otherwise you will get lovely "I04: IllInstr" errors... :-) */
rb = api;
rb->srand(*rb->current_tick);
/*Get the pattern handle*/
h1=rb->lcd_get_locked_pattern();
h2=rb->lcd_get_locked_pattern();
h3=rb->lcd_get_locked_pattern();
/*Init message*/
rb->lcd_define_pattern(h1, pattern);
rb->lcd_define_pattern(h2, pattern+7);
rb->lcd_define_pattern(h3, pattern+28);
rb->snprintf(str,sizeof(str),"%c%cJackpot%c%c",h1,h2,h2,h1);
rb->lcd_puts(0,0,str);
rb->snprintf(str,sizeof(str)," %c V1.1 %c",h3,h3);
rb->lcd_puts(0,1,str);
rb->sleep(HZ*2);
rb->lcd_clear_display();
/*First display*/
rb->snprintf(str,sizeof(str),"[ ]$%d",g);
rb->lcd_puts(0,0,str);
rb->lcd_puts_scroll(0,1,"PLAY to begin");
/*Empty the event queue*/
rb->button_clear_queue();
/* Define the start pattern */
s[0]=(rb->rand()%9)*7;
s[1]=(rb->rand()%9)*7;
s[2]=(rb->rand()%9)*7;
/*Main loop*/
while (!exit)
{
/*Keyboard loop*/
go=false;
while (!go)
{
button = rb->button_get(true);
switch ( button )
{
case BUTTON_STOP|BUTTON_REL:
exit = true;
go = true;
break;
case BUTTON_PLAY|BUTTON_REL:
exit = false;
if (g>0)
{
go = true;
g--;
}
break;
default:
if (rb->default_event_handler_ex(button, jackpot_exit,
NULL) == SYS_USB_CONNECTED)
return PLUGIN_USB_CONNECTED;
break;
}
}
/*Clear the Second line*/
rb->lcd_puts_scroll(0,1,"Good luck");
/*GO !!!!*/
if ( go && !exit )
{
/* How many pattern? */
n[0]=(rb->rand()%15+5)*7;
n[1]=(rb->rand()%15+5)*7;
n[2]=(rb->rand()%15+5)*7;
display_first_line(g);
/* Jackpot Animation */
while((n[0]>=0) || (n[1]>=0) || (n[2]>=0))
{
if (n[0]>=0)
rb->lcd_define_pattern(h1, pattern+s[0]);
if (n[1]>=0)
rb->lcd_define_pattern(h2, pattern+s[1]);
if (n[2]>=0)
rb->lcd_define_pattern(h3, pattern+s[2]);
rb->sleep(HZ/24);
rb->lcd_putc(1,0, h1);
rb->lcd_putc(2,0, h2);
rb->lcd_putc(3,0, h3);
for(i=0;i<3;i++)
{
if (n[i]>=0)
{
n[i]--;
s[i]++;
if (s[i]>=63)
s[i]=0;
}
}
}
/* You won? */
s[0]--;
s[1]--;
s[2]--;
w=(s[0]/7)*100+(s[1]/7)*10+(s[2]/7);
j=0;
switch (w)
{
case 111 :
j=20;
break;
case 000 :
j=15;
break;
case 333 :
j=10;
break;
case 222 :
j=8;
break;
case 555 :
j=5;
break;
case 777 :
j=4;
break;
case 251 :
j=4;
break;
case 510 :
j=4;
break;
case 686 :
j=3;
break;
case 585 :
j=3;
break;
case 282 :
j=3;
break;
case 484 :
j=3;
break;
case 787 :
j=2;
break;
case 383 :
j=2;
break;
case 80 :
j=2;
break;
}
if (j==0)
{
rb->lcd_puts(0,1,"None...");
if (g<=0)
rb->lcd_puts_scroll(0,1,"You lose...STOP to quit");
}
else
{
g+=j;
display_first_line(g);
rb->snprintf(str,sizeof(str),"You win %d$",j);
rb->lcd_puts(0,1,str);
}
}
}
/* This is the end */
jackpot_exit(NULL);
/* Bye */
return PLUGIN_OK;
}
#endif