1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * Copyright (C) 2007 Copyright Kévin Ferrare based on work by 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 #include "lib/pluginlib_actions.h"
24 #include "lib/picture.h"
28 const struct button_mapping
* plugin_contexts
[]={pla_main_ctx
};
32 #ifdef HAVE_LCD_CHARCELLS
33 #define PICTURE_ROTATION_STEPS 7
34 static unsigned char jackpot_slots_patterns
[]={
35 0x00, 0x0A, 0x1F, 0x1F, 0x1F, 0x0e, 0x04, /* (+00)Heart */
36 0x00, 0x04, 0x0E, 0x1F, 0x1F, 0x04, 0x0E, /* (+07)Spade */
37 0x00, 0x04, 0x0E, 0x1F, 0x0E, 0x04, 0x00, /* (+14)Diamond */
38 0x00, 0x15, 0x0E, 0x1F, 0x0E, 0x15, 0x00, /* (+21)Club */
39 0x03, 0x04, 0x0e, 0x1F, 0x1F, 0x1F, 0x0e, /* (+28)Cherry */
40 0x00, 0x04, 0x04, 0x1F, 0x04, 0x0E, 0x1F, /* (+35)Cross */
41 0x04, 0x0E, 0x15, 0x04, 0x0A, 0x0A, 0x11, /* (+42)Man */
42 0x00, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x00, /* (+49)Square */
43 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* (+56)Empty */
44 0x00, 0x0A, 0x1F, 0x1F, 0x1F, 0x0e, 0x04 /* (+63)Heart */
46 static unsigned long char_patterns
[NB_SLOTS
];
47 #define SLEEP_TIME (HZ/24)
48 #else /* bitmaps LCDs */
50 #define PICTURE_HEIGHT (BMPHEIGHT_jackpot_slots/(NB_PICTURES+1))
52 #define PICTURE_ROTATION_STEPS PICTURE_HEIGHT
54 #define REMOTE_PICTURE_HEIGHT (BMPHEIGHT_jackpot_slots_remote/(NB_PICTURES+1))
55 #define PICTURE_ROTATION_STEPS REMOTE_PICTURE_HEIGHT
58 /* FIXME: would be nice to have better graphics ... */
59 #include "pluginbitmaps/jackpot_slots.h"
61 #include "pluginbitmaps/jackpot_slots_remote.h"
64 const struct picture jackpot_pictures
[]={
65 {jackpot_slots
, BMPWIDTH_jackpot_slots
, BMPHEIGHT_jackpot_slots
,
68 {jackpot_slots_remote
,BMPWIDTH_jackpot_slots_remote
,
69 BMPHEIGHT_jackpot_slots_remote
, REMOTE_PICTURE_HEIGHT
}
73 #define SLEEP_TIME (HZ/200)
74 #endif /* HAVE_LCD_CHARCELLS */
78 /* A slot can display "NB_PICTURES" pictures
79 A picture is moving up, it can take PICTURE_ROTATION_STEPS
80 to move a single picture completely.
81 So values in slot_state are comprised between
82 0 and NB_PICTURES*PICTURE_ROTATION_STEPS
84 int slot_state
[NB_SLOTS
];
86 The real state of the picture in pixels on each screen
87 Different from slot_state because of the synchronised
88 rotation between different sized bitmaps on remote and main screen
90 int state_y
[NB_SCREENS
][NB_SLOTS
];
94 #ifdef HAVE_LCD_CHARCELLS
95 void patterns_init(struct screen
* display
)
98 for(i
=0;i
<NB_SLOTS
;i
++)
99 char_patterns
[i
]=display
->get_locked_pattern();
102 void patterns_deinit(struct screen
* display
)
104 /* Restore the old pattern */
106 for(i
=0;i
<NB_SLOTS
;i
++)
107 display
->unlock_pattern(char_patterns
[i
]);
109 #endif /* HAVE_LCD_CHARCELLS */
111 /*Call when the program exit*/
112 void jackpot_exit(void *parameter
)
115 #ifdef HAVE_LCD_CHARCELLS
116 patterns_deinit(rb
->screens
[SCREEN_MAIN
]);
117 #endif /* HAVE_LCD_CHARCELLS */
120 void jackpot_init(struct jackpot
* game
)
124 for(i
=0;i
<NB_SLOTS
;i
++){
125 game
->slot_state
[i
]=(rb
->rand()%NB_PICTURES
)*PICTURE_ROTATION_STEPS
;
127 game
->state_y
[j
][i
]=-1;
131 int jackpot_get_result(struct jackpot
* game
)
138 result
+=game
->slot_state
[i
]*multiple
/PICTURE_ROTATION_STEPS
;
144 int jackpot_get_gain(struct jackpot
* game
)
146 switch (jackpot_get_result(game
))
148 case 111 : return(20);
149 case 000 : return(15);
150 case 333 : return(10);
151 case 222 : return(8);
152 case 555 : return(5);
153 case 777 : return(4);
154 case 251 : return(4);
155 case 510 : return(4);
156 case 686 : return(3);
157 case 585 : return(3);
158 case 282 : return(3);
159 case 484 : return(3);
160 case 787 : return(2);
161 case 383 : return(2);
167 void jackpot_display_slot_machine(struct jackpot
* game
, struct screen
* display
)
172 #ifdef HAVE_LCD_CHARCELLS
173 display
->putchar(0, 0, '[');
175 const struct picture
* picture
= &(jackpot_pictures
[display
->screen_type
]);
176 int pos_x
=(display
->getwidth()-NB_SLOTS
*(picture
->width
+1))/2;
177 int pos_y
=(display
->getheight()-(picture
->slide_height
))/2;
178 #endif /* HAVE_LCD_CHARCELLS */
179 for(i
=0;i
<NB_SLOTS
;i
++)
181 #ifdef HAVE_LCD_CHARCELLS
182 /* the only charcell lcd is 7 pixel high */
183 int state_y
=(game
->slot_state
[i
]*7)/PICTURE_ROTATION_STEPS
;
186 (picture
->slide_height
*game
->slot_state
[i
])/PICTURE_ROTATION_STEPS
;
187 #endif /* HAVE_LCD_CHARCELLS */
188 int previous_state_y
=game
->state_y
[display
->screen_type
][i
];
189 if(state_y
==previous_state_y
)
190 continue;/*no need to update the picture
191 as it's the same as previous displayed one*/
193 game
->state_y
[display
->screen_type
][i
]=state_y
;
194 #ifdef HAVE_LCD_CHARCELLS
195 char* current_pattern
=&(jackpot_slots_patterns
[state_y
]);
196 display
->define_pattern(char_patterns
[i
],
198 display
->putchar(i
+1, 0, char_patterns
[i
]);
200 vertical_picture_draw_part(display
, picture
, state_y
, pos_x
, pos_y
);
201 pos_x
+=(picture
->width
+1);
205 #ifdef HAVE_LCD_CHARCELLS
206 rb
->snprintf(str
,sizeof(str
),"$%d", game
->money
);
207 display
->putchar(++i
, 0, ']');
208 display
->puts(++i
, 0, str
);
210 rb
->snprintf(str
,sizeof(str
),"money : $%d", game
->money
);
211 display
->puts(0, 0, str
);
218 void jackpot_info_message(struct screen
* display
, char* message
)
220 #ifdef HAVE_LCD_CHARCELLS
221 display
->puts_scroll(0,1,message
);
224 int message_height
, message_width
;
225 display
->getstringsize(message
, &message_width
, &message_height
);
226 xpos
=(display
->getwidth()-message_width
)/2;
227 ypos
=display
->getheight()-message_height
;
228 rb
->screen_clear_area(display
, 0, ypos
, display
->getwidth(),
230 display
->putsxy(xpos
,ypos
,message
);
232 #endif /* HAVE_LCD_CHARCELLS */
235 void jackpot_print_turn_result(struct jackpot
* game
,
236 int gain
, struct screen
* display
)
241 jackpot_info_message(display
, "None ...");
243 jackpot_info_message(display
, "You lose...STOP to quit");
247 rb
->snprintf(str
,sizeof(str
),"You win %d$",gain
);
248 jackpot_info_message(display
, str
);
253 void jackpot_play_turn(struct jackpot
* game
)
255 /* How many pattern? */
256 int nb_turns
[NB_SLOTS
];
257 int i
,d
,gain
,turns_remaining
=0;
261 for(i
=0;i
<NB_SLOTS
;i
++)
263 nb_turns
[i
]=(rb
->rand()%15+5)*PICTURE_ROTATION_STEPS
;
264 turns_remaining
+=nb_turns
[i
];
268 rb
->screens
[d
]->clear_display();
269 jackpot_info_message(rb
->screens
[d
],"Good luck");
271 /* Jackpot Animation */
272 while(turns_remaining
>0)
274 for(i
=0;i
<NB_SLOTS
;i
++)
279 game
->slot_state
[i
]++;
280 if(game
->slot_state
[i
]>=PICTURE_ROTATION_STEPS
*NB_PICTURES
)
281 game
->slot_state
[i
]=0;
286 jackpot_display_slot_machine(game
, rb
->screens
[d
]);
287 rb
->sleep(SLEEP_TIME
);
289 gain
=jackpot_get_gain(game
);
293 jackpot_print_turn_result(game
, gain
, rb
->screens
[d
]);
296 enum plugin_status
plugin_start(const void* parameter
)
301 rb
->srand(*rb
->current_tick
);
302 #ifdef HAVE_LCD_CHARCELLS
303 patterns_init(rb
->screens
[SCREEN_MAIN
]);
304 #endif /* HAVE_LCD_CHARCELLS */
308 rb
->screens
[i
]->clear_display();
309 jackpot_display_slot_machine(&game
, rb
->screens
[i
]);
311 /*Empty the event queue*/
312 rb
->button_clear_queue();
315 action
= pluginlib_getaction(TIMEOUT_BLOCK
,
316 plugin_contexts
, ARRAYLEN(plugin_contexts
));
322 jackpot_play_turn(&game
);
326 if (rb
->default_event_handler_ex(action
, jackpot_exit
, NULL
)
327 == SYS_USB_CONNECTED
)
328 return PLUGIN_USB_CONNECTED
;