2003-07-02 21:38:08 +00:00
|
|
|
/***************************************************************************
|
|
|
|
* __________ __ ___.
|
|
|
|
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
|
|
|
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
|
|
|
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
|
|
|
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
|
|
|
* \/ \/ \/ \/ \/
|
|
|
|
* $Id$
|
|
|
|
*
|
|
|
|
* Copyright (C) 2002 Itai Shaked
|
|
|
|
*
|
2008-06-28 18:10:04 +00:00
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
* of the License, or (at your option) any later version.
|
2003-07-02 21:38:08 +00:00
|
|
|
*
|
|
|
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
|
|
|
* KIND, either express or implied.
|
|
|
|
*
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
/*
|
|
|
|
Snake!
|
|
|
|
|
|
|
|
by Itai Shaked
|
|
|
|
|
|
|
|
ok, a little explanation -
|
|
|
|
board holds the snake and apple position - 1+ - snake body (the number
|
|
|
|
represents the age [1 is the snake's head]).
|
|
|
|
-1 is an apple, and 0 is a clear spot.
|
|
|
|
dir is the current direction of the snake - 0=up, 1=right, 2=down, 3=left;
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "plugin.h"
|
2010-08-25 19:00:58 +00:00
|
|
|
|
2009-09-17 20:38:44 +00:00
|
|
|
#include "lib/configfile.h"
|
2010-02-28 11:27:05 +00:00
|
|
|
#include "lib/highscore.h"
|
2009-08-05 14:29:29 +00:00
|
|
|
#include "lib/playback_control.h"
|
2003-07-02 21:38:08 +00:00
|
|
|
|
2010-08-24 14:30:46 +00:00
|
|
|
|
2006-01-15 18:20:18 +00:00
|
|
|
|
2004-10-18 21:45:00 +00:00
|
|
|
/* variable button definitions */
|
|
|
|
#if CONFIG_KEYPAD == RECORDER_PAD
|
|
|
|
#define SNAKE_QUIT BUTTON_OFF
|
2008-03-22 10:24:28 +00:00
|
|
|
#define SNAKE_LEFT BUTTON_LEFT
|
|
|
|
#define SNAKE_RIGHT BUTTON_RIGHT
|
2005-12-14 01:31:37 +00:00
|
|
|
#define SNAKE_UP BUTTON_UP
|
|
|
|
#define SNAKE_DOWN BUTTON_DOWN
|
2004-10-18 21:45:00 +00:00
|
|
|
#define SNAKE_PLAYPAUSE BUTTON_PLAY
|
|
|
|
|
2007-01-14 13:48:09 +00:00
|
|
|
#elif CONFIG_KEYPAD == ARCHOS_AV300_PAD
|
|
|
|
#define SNAKE_QUIT BUTTON_OFF
|
2008-03-22 10:24:28 +00:00
|
|
|
#define SNAKE_LEFT BUTTON_LEFT
|
|
|
|
#define SNAKE_RIGHT BUTTON_RIGHT
|
2007-01-14 13:48:09 +00:00
|
|
|
#define SNAKE_UP BUTTON_UP
|
|
|
|
#define SNAKE_DOWN BUTTON_DOWN
|
|
|
|
#define SNAKE_PLAYPAUSE BUTTON_SELECT
|
|
|
|
|
2004-10-18 21:45:00 +00:00
|
|
|
#elif CONFIG_KEYPAD == ONDIO_PAD
|
|
|
|
#define SNAKE_QUIT BUTTON_OFF
|
2008-03-22 10:24:28 +00:00
|
|
|
#define SNAKE_LEFT BUTTON_LEFT
|
|
|
|
#define SNAKE_RIGHT BUTTON_RIGHT
|
2005-12-14 01:31:37 +00:00
|
|
|
#define SNAKE_UP BUTTON_UP
|
|
|
|
#define SNAKE_DOWN BUTTON_DOWN
|
2004-10-18 21:45:00 +00:00
|
|
|
#define SNAKE_PLAYPAUSE BUTTON_MENU
|
|
|
|
|
2005-06-29 12:47:24 +00:00
|
|
|
#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
|
|
|
|
(CONFIG_KEYPAD == IRIVER_H300_PAD)
|
2005-02-04 12:41:09 +00:00
|
|
|
#define SNAKE_QUIT BUTTON_OFF
|
2008-03-22 10:24:28 +00:00
|
|
|
#define SNAKE_LEFT BUTTON_LEFT
|
|
|
|
#define SNAKE_RIGHT BUTTON_RIGHT
|
2005-12-14 01:31:37 +00:00
|
|
|
#define SNAKE_UP BUTTON_UP
|
|
|
|
#define SNAKE_DOWN BUTTON_DOWN
|
2005-02-04 12:41:09 +00:00
|
|
|
#define SNAKE_PLAYPAUSE BUTTON_ON
|
|
|
|
|
2006-06-30 16:43:47 +00:00
|
|
|
#define SNAKE_RC_QUIT BUTTON_RC_STOP
|
|
|
|
|
2006-02-24 20:54:09 +00:00
|
|
|
#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \
|
2007-07-27 09:57:27 +00:00
|
|
|
(CONFIG_KEYPAD == IPOD_3G_PAD) || \
|
|
|
|
(CONFIG_KEYPAD == IPOD_1G2G_PAD)
|
2005-12-14 01:31:37 +00:00
|
|
|
#define SNAKE_QUIT (BUTTON_SELECT|BUTTON_MENU)
|
2008-03-22 10:24:28 +00:00
|
|
|
#define SNAKE_LEFT BUTTON_LEFT
|
|
|
|
#define SNAKE_RIGHT BUTTON_RIGHT
|
2005-12-14 01:31:37 +00:00
|
|
|
#define SNAKE_UP BUTTON_MENU
|
|
|
|
#define SNAKE_DOWN BUTTON_PLAY
|
|
|
|
#define SNAKE_PLAYPAUSE BUTTON_SELECT
|
|
|
|
|
2007-03-16 23:02:39 +00:00
|
|
|
#elif (CONFIG_KEYPAD == IAUDIO_X5M5_PAD)
|
2006-01-18 11:09:06 +00:00
|
|
|
#define SNAKE_QUIT BUTTON_POWER
|
2008-03-22 10:24:28 +00:00
|
|
|
#define SNAKE_LEFT BUTTON_LEFT
|
|
|
|
#define SNAKE_RIGHT BUTTON_RIGHT
|
2006-01-18 11:09:06 +00:00
|
|
|
#define SNAKE_UP BUTTON_UP
|
|
|
|
#define SNAKE_DOWN BUTTON_DOWN
|
|
|
|
#define SNAKE_PLAYPAUSE BUTTON_PLAY
|
|
|
|
|
2006-02-24 15:42:52 +00:00
|
|
|
#elif (CONFIG_KEYPAD == GIGABEAT_PAD)
|
2007-05-19 23:38:09 +00:00
|
|
|
#define SNAKE_QUIT BUTTON_POWER
|
2008-03-22 10:24:28 +00:00
|
|
|
#define SNAKE_LEFT BUTTON_LEFT
|
|
|
|
#define SNAKE_RIGHT BUTTON_RIGHT
|
2006-02-24 15:42:52 +00:00
|
|
|
#define SNAKE_UP BUTTON_UP
|
|
|
|
#define SNAKE_DOWN BUTTON_DOWN
|
|
|
|
#define SNAKE_PLAYPAUSE BUTTON_SELECT
|
|
|
|
|
2007-09-20 10:49:48 +00:00
|
|
|
#elif (CONFIG_KEYPAD == SANSA_E200_PAD) || \
|
2009-01-04 23:33:15 +00:00
|
|
|
(CONFIG_KEYPAD == SANSA_C200_PAD) || \
|
|
|
|
(CONFIG_KEYPAD == SANSA_CLIP_PAD) || \
|
2011-11-16 14:08:01 +00:00
|
|
|
(CONFIG_KEYPAD == SANSA_M200_PAD) || \
|
|
|
|
(CONFIG_KEYPAD == SANSA_CONNECT_PAD)
|
2006-10-26 13:38:09 +00:00
|
|
|
#define SNAKE_QUIT BUTTON_POWER
|
2008-03-22 10:24:28 +00:00
|
|
|
#define SNAKE_LEFT BUTTON_LEFT
|
|
|
|
#define SNAKE_RIGHT BUTTON_RIGHT
|
2006-10-26 13:38:09 +00:00
|
|
|
#define SNAKE_UP BUTTON_UP
|
|
|
|
#define SNAKE_DOWN BUTTON_DOWN
|
|
|
|
#define SNAKE_PLAYPAUSE BUTTON_SELECT
|
|
|
|
|
2009-04-10 17:28:26 +00:00
|
|
|
#elif (CONFIG_KEYPAD == SANSA_FUZE_PAD)
|
|
|
|
#define SNAKE_QUIT (BUTTON_HOME|BUTTON_REPEAT)
|
|
|
|
#define SNAKE_LEFT BUTTON_LEFT
|
|
|
|
#define SNAKE_RIGHT BUTTON_RIGHT
|
|
|
|
#define SNAKE_UP BUTTON_UP
|
|
|
|
#define SNAKE_DOWN BUTTON_DOWN
|
|
|
|
#define SNAKE_PLAYPAUSE BUTTON_SELECT
|
|
|
|
|
2006-08-03 20:17:25 +00:00
|
|
|
#elif (CONFIG_KEYPAD == IRIVER_H10_PAD)
|
|
|
|
#define SNAKE_QUIT BUTTON_POWER
|
2008-03-22 10:24:28 +00:00
|
|
|
#define SNAKE_LEFT BUTTON_LEFT
|
|
|
|
#define SNAKE_RIGHT BUTTON_RIGHT
|
2006-08-03 20:17:25 +00:00
|
|
|
#define SNAKE_UP BUTTON_SCROLL_UP
|
|
|
|
#define SNAKE_DOWN BUTTON_SCROLL_DOWN
|
|
|
|
#define SNAKE_PLAYPAUSE BUTTON_PLAY
|
|
|
|
|
Initial commit of the Samsung YP-R0 port.
This port is a hybrid native/RaaA port. It runs on a embedded linux system,
but is the only application. It therefore can implement lots of stuff that
native targets also implement, while leveraging the underlying linux kernel.
The port is quite advanced. User interface, audio playback, plugins work
mostly fine. Missing is e.g. power mangement and USB (see SamsungYPR0 wiki page).
Included in utils/ypr0tools are scripts and programs required to generate
a patched firmware. The patched firmware has the rootfs modified to load
Rockbox. It includes a early/safe USB mode.
This port needs a new toolchain, one that includes glibc headers and libraries.
rockboxdev.sh can generate it, but e.g. codesourcey and distro packages may
also work.
Most of the initial effort is done by Lorenzo Miori and others (on ABI),
including reverse engineering and patching of the original firmware,
initial drivers, and more. Big thanks to you.
Flyspray: FS#12348
Author: Lorenzo Miori, myself
Merry christmas to ypr0 owners! :)
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@31415 a1c6a512-1295-4272-9138-f99709370657
2011-12-24 11:56:46 +00:00
|
|
|
#elif (CONFIG_KEYPAD == GIGABEAT_S_PAD) || \
|
|
|
|
(CONFIG_KEYPAD == SAMSUNG_YPR0_PAD)
|
2008-02-17 12:23:02 +00:00
|
|
|
#define SNAKE_QUIT BUTTON_BACK
|
2008-03-22 10:24:28 +00:00
|
|
|
#define SNAKE_LEFT BUTTON_LEFT
|
|
|
|
#define SNAKE_RIGHT BUTTON_RIGHT
|
2008-02-17 12:23:02 +00:00
|
|
|
#define SNAKE_UP BUTTON_UP
|
|
|
|
#define SNAKE_DOWN BUTTON_DOWN
|
|
|
|
#define SNAKE_PLAYPAUSE BUTTON_SELECT
|
|
|
|
|
2008-03-01 22:55:09 +00:00
|
|
|
#elif (CONFIG_KEYPAD == MROBE100_PAD)
|
|
|
|
#define SNAKE_QUIT BUTTON_POWER
|
2008-03-22 10:24:28 +00:00
|
|
|
#define SNAKE_LEFT BUTTON_LEFT
|
|
|
|
#define SNAKE_RIGHT BUTTON_RIGHT
|
2008-03-01 22:55:09 +00:00
|
|
|
#define SNAKE_UP BUTTON_UP
|
|
|
|
#define SNAKE_DOWN BUTTON_DOWN
|
|
|
|
#define SNAKE_PLAYPAUSE BUTTON_SELECT
|
|
|
|
|
2008-03-22 10:24:28 +00:00
|
|
|
#elif CONFIG_KEYPAD == IAUDIO_M3_PAD
|
|
|
|
#define SNAKE_QUIT BUTTON_RC_REC
|
|
|
|
#define SNAKE_LEFT BUTTON_RC_REW
|
|
|
|
#define SNAKE_RIGHT BUTTON_RC_FF
|
|
|
|
#define SNAKE_UP BUTTON_RC_VOL_UP
|
|
|
|
#define SNAKE_DOWN BUTTON_RC_VOL_DOWN
|
|
|
|
#define SNAKE_PLAYPAUSE BUTTON_RC_PLAY
|
|
|
|
|
|
|
|
#define SNAKE_RC_QUIT BUTTON_REC
|
|
|
|
|
2008-12-04 21:28:56 +00:00
|
|
|
#elif CONFIG_KEYPAD == CREATIVEZVM_PAD
|
|
|
|
#define SNAKE_QUIT BUTTON_BACK
|
|
|
|
#define SNAKE_LEFT BUTTON_LEFT
|
|
|
|
#define SNAKE_RIGHT BUTTON_RIGHT
|
|
|
|
#define SNAKE_UP BUTTON_UP
|
|
|
|
#define SNAKE_DOWN BUTTON_DOWN
|
2008-12-08 09:51:42 +00:00
|
|
|
#define SNAKE_PLAYPAUSE BUTTON_PLAY
|
2008-12-04 21:28:56 +00:00
|
|
|
|
2010-11-02 20:09:02 +00:00
|
|
|
#elif (CONFIG_KEYPAD == PHILIPS_HDD1630_PAD) || \
|
|
|
|
(CONFIG_KEYPAD == PHILIPS_HDD6330_PAD)
|
2009-01-24 22:41:55 +00:00
|
|
|
#define SNAKE_QUIT BUTTON_POWER
|
|
|
|
#define SNAKE_LEFT BUTTON_LEFT
|
|
|
|
#define SNAKE_RIGHT BUTTON_RIGHT
|
|
|
|
#define SNAKE_UP BUTTON_UP
|
|
|
|
#define SNAKE_DOWN BUTTON_DOWN
|
|
|
|
#define SNAKE_PLAYPAUSE BUTTON_MENU
|
|
|
|
|
2009-12-02 01:56:39 +00:00
|
|
|
#elif CONFIG_KEYPAD == PHILIPS_SA9200_PAD
|
|
|
|
#define SNAKE_QUIT BUTTON_POWER
|
|
|
|
#define SNAKE_LEFT BUTTON_PREV
|
|
|
|
#define SNAKE_RIGHT BUTTON_NEXT
|
|
|
|
#define SNAKE_UP BUTTON_UP
|
|
|
|
#define SNAKE_DOWN BUTTON_DOWN
|
|
|
|
#define SNAKE_PLAYPAUSE BUTTON_MENU
|
|
|
|
|
2009-09-17 20:38:44 +00:00
|
|
|
#elif CONFIG_KEYPAD == SAMSUNG_YH_PAD
|
|
|
|
#define SNAKE_QUIT BUTTON_REC
|
|
|
|
#define SNAKE_LEFT BUTTON_LEFT
|
|
|
|
#define SNAKE_RIGHT BUTTON_RIGHT
|
|
|
|
#define SNAKE_UP BUTTON_UP
|
|
|
|
#define SNAKE_DOWN BUTTON_DOWN
|
|
|
|
#define SNAKE_PLAYPAUSE BUTTON_PLAY
|
|
|
|
|
2009-05-06 04:56:35 +00:00
|
|
|
#elif CONFIG_KEYPAD == MROBE500_PAD
|
|
|
|
#define SNAKE_QUIT BUTTON_POWER
|
|
|
|
#define SNAKE_RC_QUIT BUTTON_RC_DOWN
|
|
|
|
|
|
|
|
#elif (CONFIG_KEYPAD == ONDAVX747_PAD)
|
2009-04-07 23:41:44 +00:00
|
|
|
#define SNAKE_QUIT BUTTON_POWER
|
|
|
|
|
2009-08-31 21:11:32 +00:00
|
|
|
#elif (CONFIG_KEYPAD == ONDAVX777_PAD)
|
|
|
|
#define SNAKE_QUIT BUTTON_POWER
|
|
|
|
|
2009-12-15 20:51:41 +00:00
|
|
|
#elif CONFIG_KEYPAD == COWON_D2_PAD
|
2009-09-17 20:38:44 +00:00
|
|
|
#define SNAKE_QUIT BUTTON_POWER
|
2009-08-04 03:08:32 +00:00
|
|
|
|
2010-02-13 15:46:34 +00:00
|
|
|
#elif CONFIG_KEYPAD == PBELL_VIBE500_PAD
|
|
|
|
#define SNAKE_QUIT BUTTON_REC
|
|
|
|
#define SNAKE_LEFT BUTTON_PREV
|
|
|
|
#define SNAKE_RIGHT BUTTON_NEXT
|
|
|
|
#define SNAKE_UP BUTTON_UP
|
|
|
|
#define SNAKE_DOWN BUTTON_DOWN
|
|
|
|
#define SNAKE_PLAYPAUSE BUTTON_PLAY
|
|
|
|
|
2010-04-26 21:40:00 +00:00
|
|
|
#elif CONFIG_KEYPAD == MPIO_HD200_PAD
|
|
|
|
#define SNAKE_QUIT (BUTTON_REC|BUTTON_PLAY)
|
|
|
|
#define SNAKE_LEFT BUTTON_VOL_DOWN
|
|
|
|
#define SNAKE_RIGHT BUTTON_VOL_UP
|
2010-11-02 10:44:34 +00:00
|
|
|
#define SNAKE_UP BUTTON_REW
|
|
|
|
#define SNAKE_DOWN BUTTON_FF
|
2010-04-26 21:40:00 +00:00
|
|
|
#define SNAKE_PLAYPAUSE BUTTON_PLAY
|
|
|
|
|
2010-11-30 10:52:14 +00:00
|
|
|
#elif CONFIG_KEYPAD == MPIO_HD300_PAD
|
|
|
|
#define SNAKE_QUIT (BUTTON_REC|BUTTON_REPEAT)
|
|
|
|
#define SNAKE_LEFT BUTTON_REW
|
|
|
|
#define SNAKE_RIGHT BUTTON_FF
|
|
|
|
#define SNAKE_UP BUTTON_UP
|
|
|
|
#define SNAKE_DOWN BUTTON_DOWN
|
|
|
|
#define SNAKE_PLAYPAUSE BUTTON_PLAY
|
|
|
|
|
2011-10-02 16:21:00 +00:00
|
|
|
#elif CONFIG_KEYPAD == SANSA_FUZEPLUS_PAD
|
|
|
|
#define SNAKE_QUIT BUTTON_POWER
|
|
|
|
#define SNAKE_LEFT BUTTON_LEFT
|
|
|
|
#define SNAKE_RIGHT BUTTON_RIGHT
|
|
|
|
#define SNAKE_UP BUTTON_UP
|
|
|
|
#define SNAKE_DOWN BUTTON_DOWN
|
|
|
|
#define SNAKE_PLAYPAUSE BUTTON_PLAYPAUSE
|
|
|
|
|
2005-02-04 12:41:09 +00:00
|
|
|
#else
|
2008-03-01 22:55:09 +00:00
|
|
|
#error No keymap defined!
|
2004-10-18 21:45:00 +00:00
|
|
|
#endif
|
|
|
|
|
2008-08-23 09:46:38 +00:00
|
|
|
#ifdef HAVE_TOUCHSCREEN
|
2008-04-27 15:30:19 +00:00
|
|
|
#ifndef SNAKE_QUIT
|
|
|
|
#define SNAKE_QUIT BUTTON_TOPLEFT
|
|
|
|
#endif
|
|
|
|
#ifndef SNAKE_LEFT
|
|
|
|
#define SNAKE_LEFT BUTTON_MIDLEFT
|
|
|
|
#endif
|
|
|
|
#ifndef SNAKE_RIGHT
|
|
|
|
#define SNAKE_RIGHT BUTTON_MIDRIGHT
|
|
|
|
#endif
|
|
|
|
#ifndef SNAKE_UP
|
|
|
|
#define SNAKE_UP BUTTON_TOPMIDDLE
|
|
|
|
#endif
|
|
|
|
#ifndef SNAKE_DOWN
|
|
|
|
#define SNAKE_DOWN BUTTON_BOTTOMMIDDLE
|
|
|
|
#endif
|
|
|
|
#ifndef SNAKE_PLAYPAUSE
|
|
|
|
#define SNAKE_PLAYPAUSE BUTTON_CENTER
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
2005-06-05 15:30:27 +00:00
|
|
|
#define BOARD_WIDTH (LCD_WIDTH/4)
|
|
|
|
#define BOARD_HEIGHT (LCD_HEIGHT/4)
|
|
|
|
|
2010-02-28 11:27:05 +00:00
|
|
|
#define CONFIG_FILE_NAME "snake.cfg"
|
2011-03-02 23:43:54 +00:00
|
|
|
#define SCORE_FILE PLUGIN_GAMES_DATA_DIR "/snake.score"
|
2010-02-28 11:27:05 +00:00
|
|
|
#define NUM_SCORES 5
|
|
|
|
|
2005-06-05 15:30:27 +00:00
|
|
|
static int board[BOARD_WIDTH][BOARD_HEIGHT],snakelength;
|
2010-02-28 11:27:05 +00:00
|
|
|
static unsigned int score, level = 1;
|
2009-09-17 20:38:44 +00:00
|
|
|
static int dir;
|
2010-02-28 11:27:05 +00:00
|
|
|
static bool apple, dead, ingame;
|
|
|
|
static struct highscore highscores[NUM_SCORES];
|
2003-07-02 21:38:08 +00:00
|
|
|
|
2009-09-17 20:38:44 +00:00
|
|
|
static struct configdata config[] = {
|
2010-02-28 11:27:05 +00:00
|
|
|
{TYPE_INT, 1, 9, { .int_p = &level }, "level", NULL},
|
2009-09-17 20:38:44 +00:00
|
|
|
};
|
2009-08-08 12:50:26 +00:00
|
|
|
|
2009-09-17 20:38:44 +00:00
|
|
|
static void snake_die (void)
|
2003-07-02 21:38:08 +00:00
|
|
|
{
|
|
|
|
rb->lcd_clear_display();
|
2007-03-28 07:33:18 +00:00
|
|
|
rb->lcd_puts(0,0,"Oops...");
|
2010-08-28 21:46:45 +00:00
|
|
|
rb->lcd_putsf(0,1,"Your score: %d",score);
|
2010-02-28 11:27:05 +00:00
|
|
|
if (highscore_update(score, level, "", highscores, NUM_SCORES) == 0) {
|
2007-03-28 07:33:18 +00:00
|
|
|
rb->lcd_puts(0,2,"New High Score!");
|
2003-07-02 21:38:08 +00:00
|
|
|
}
|
|
|
|
else {
|
2010-08-28 21:46:45 +00:00
|
|
|
rb->lcd_putsf(0,2,"High Score: %d", highscores[0].score);
|
2003-07-02 21:38:08 +00:00
|
|
|
}
|
|
|
|
rb->lcd_update();
|
|
|
|
rb->sleep(3*HZ);
|
2009-09-17 20:38:44 +00:00
|
|
|
dead=true;
|
2003-07-02 21:38:08 +00:00
|
|
|
}
|
|
|
|
|
2009-09-17 20:38:44 +00:00
|
|
|
static void snake_colission (short x, short y)
|
2003-07-02 21:38:08 +00:00
|
|
|
{
|
2009-09-17 20:38:44 +00:00
|
|
|
if (x==BOARD_WIDTH || x<0 || y==BOARD_HEIGHT || y<0) {
|
|
|
|
snake_die();
|
2009-08-18 13:40:08 +00:00
|
|
|
return;
|
|
|
|
}
|
2003-07-02 21:38:08 +00:00
|
|
|
switch (board[x][y]) {
|
|
|
|
case 0:
|
2009-08-08 12:50:26 +00:00
|
|
|
break;
|
2003-07-02 21:38:08 +00:00
|
|
|
case -1:
|
|
|
|
snakelength+=2;
|
|
|
|
score+=level;
|
2009-02-05 14:22:04 +00:00
|
|
|
apple=false;
|
2003-07-02 21:38:08 +00:00
|
|
|
break;
|
|
|
|
default:
|
2009-09-17 20:38:44 +00:00
|
|
|
snake_die();
|
2003-07-02 21:38:08 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-09-17 20:38:44 +00:00
|
|
|
static void snake_move_head (short x, short y)
|
2003-07-02 21:38:08 +00:00
|
|
|
{
|
|
|
|
switch (dir) {
|
|
|
|
case 0:
|
|
|
|
y-=1;
|
|
|
|
break;
|
|
|
|
case 1:
|
2009-08-08 12:50:26 +00:00
|
|
|
x+=1;
|
2003-07-02 21:38:08 +00:00
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
y+=1;
|
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
x-=1;
|
|
|
|
break;
|
|
|
|
}
|
2009-09-17 20:38:44 +00:00
|
|
|
snake_colission (x,y);
|
2003-07-02 21:38:08 +00:00
|
|
|
if (dead)
|
|
|
|
return;
|
|
|
|
board[x][y]=1;
|
|
|
|
rb->lcd_fillrect(x*4,y*4,4,4);
|
|
|
|
}
|
|
|
|
|
2009-09-17 20:38:44 +00:00
|
|
|
static void snake_redraw (void)
|
|
|
|
{
|
|
|
|
short x,y;
|
|
|
|
rb->lcd_clear_display();
|
|
|
|
for (x=0; x<BOARD_WIDTH; x++) {
|
|
|
|
for (y=0; y<BOARD_HEIGHT; y++) {
|
|
|
|
switch (board[x][y]) {
|
|
|
|
case -1:
|
|
|
|
rb->lcd_fillrect((x*4)+1,y*4,2,4);
|
|
|
|
rb->lcd_fillrect(x*4,(y*4)+1,4,2);
|
|
|
|
break;
|
|
|
|
case 0:
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
rb->lcd_fillrect(x*4,y*4,4,4);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
rb->lcd_update();
|
|
|
|
}
|
|
|
|
|
|
|
|
static void snake_frame (void)
|
2003-07-02 21:38:08 +00:00
|
|
|
{
|
|
|
|
short x,y,head=0;
|
2005-06-05 15:30:27 +00:00
|
|
|
for (x=0; x<BOARD_WIDTH; x++) {
|
|
|
|
for (y=0; y<BOARD_HEIGHT; y++) {
|
2003-07-02 21:38:08 +00:00
|
|
|
switch (board[x][y]) {
|
|
|
|
case 1:
|
|
|
|
if (!head) {
|
2009-09-17 20:38:44 +00:00
|
|
|
snake_move_head(x,y);
|
2003-07-02 21:38:08 +00:00
|
|
|
if (dead)
|
|
|
|
return;
|
|
|
|
board[x][y]++;
|
|
|
|
head=1;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 0:
|
|
|
|
break;
|
|
|
|
case -1:
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
if (board[x][y]==snakelength) {
|
|
|
|
board[x][y]=0;
|
2005-06-24 22:33:21 +00:00
|
|
|
rb->lcd_set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID);
|
|
|
|
rb->lcd_fillrect(x*4,y*4,4,4);
|
|
|
|
rb->lcd_set_drawmode(DRMODE_SOLID);
|
2003-07-02 21:38:08 +00:00
|
|
|
}
|
2009-08-08 12:50:26 +00:00
|
|
|
else
|
2003-07-02 21:38:08 +00:00
|
|
|
board[x][y]++;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
rb->lcd_update();
|
|
|
|
}
|
|
|
|
|
2009-09-17 20:38:44 +00:00
|
|
|
static void snake_game_init(void) {
|
2003-07-02 21:38:08 +00:00
|
|
|
short x,y;
|
|
|
|
rb->lcd_clear_display();
|
2009-09-17 20:38:44 +00:00
|
|
|
|
2005-06-05 15:30:27 +00:00
|
|
|
for (x=0; x<BOARD_WIDTH; x++) {
|
|
|
|
for (y=0; y<BOARD_HEIGHT; y++) {
|
2009-09-17 20:38:44 +00:00
|
|
|
board[x][y]=0;
|
2003-07-02 21:38:08 +00:00
|
|
|
}
|
|
|
|
}
|
2009-09-17 20:38:44 +00:00
|
|
|
apple=false;
|
|
|
|
dead=false;
|
|
|
|
snakelength=4;
|
|
|
|
score=0;
|
2010-02-28 11:27:05 +00:00
|
|
|
dir=1;
|
|
|
|
board[11][7]=1;
|
2009-09-17 20:38:44 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static int snake_menu_cb(int action, const struct menu_item_ex *this_item)
|
|
|
|
{
|
|
|
|
if(action == ACTION_REQUEST_MENUITEM
|
2010-02-28 11:27:05 +00:00
|
|
|
&& !ingame && ((intptr_t)this_item)==0)
|
2009-09-17 20:38:44 +00:00
|
|
|
return ACTION_EXIT_MENUITEM;
|
|
|
|
return action;
|
|
|
|
}
|
|
|
|
|
2010-02-28 11:27:05 +00:00
|
|
|
static int snake_game_menu(void)
|
2009-09-17 20:38:44 +00:00
|
|
|
{
|
|
|
|
MENUITEM_STRINGLIST(main_menu,"Snake Menu",snake_menu_cb,
|
|
|
|
"Resume Game",
|
|
|
|
"Start New Game",
|
|
|
|
"Snake Speed",
|
|
|
|
"High Score",
|
|
|
|
"Playback Control",
|
|
|
|
"Quit");
|
2010-02-28 11:27:05 +00:00
|
|
|
int selected = 0;
|
|
|
|
|
|
|
|
rb->button_clear_queue();
|
|
|
|
|
2009-09-17 20:38:44 +00:00
|
|
|
while (true) {
|
2010-02-28 11:27:05 +00:00
|
|
|
switch (rb->do_menu(&main_menu, &selected, NULL, false)) {
|
2009-09-17 20:38:44 +00:00
|
|
|
case 0:
|
|
|
|
snake_redraw();
|
|
|
|
return 0;
|
|
|
|
case 1:
|
|
|
|
snake_game_init();
|
|
|
|
return 0;
|
|
|
|
case 2:
|
2010-02-28 11:27:05 +00:00
|
|
|
rb->set_int("Snake Speed", "", UNIT_INT, &level,
|
|
|
|
NULL, 1, 1, 9, NULL);
|
2009-09-17 20:38:44 +00:00
|
|
|
break;
|
|
|
|
case 3:
|
2010-02-28 11:27:05 +00:00
|
|
|
highscore_show(-1, highscores, NUM_SCORES, true);
|
|
|
|
rb->lcd_setfont(FONT_UI);
|
2009-09-17 20:38:44 +00:00
|
|
|
break;
|
|
|
|
case 4:
|
|
|
|
playback_control(NULL);
|
|
|
|
break;
|
|
|
|
case 5:
|
|
|
|
return 1;
|
|
|
|
case MENU_ATTACHED_USB:
|
|
|
|
return 1;
|
2004-10-18 21:45:00 +00:00
|
|
|
default:
|
|
|
|
break;
|
2003-07-02 21:38:08 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-09-17 20:38:44 +00:00
|
|
|
static int snake_game_loop (void) {
|
2004-10-18 21:45:00 +00:00
|
|
|
int button;
|
2003-07-02 21:38:08 +00:00
|
|
|
short x,y;
|
2010-02-28 11:27:05 +00:00
|
|
|
bool pause = false;
|
|
|
|
|
|
|
|
if (snake_game_menu())
|
2009-09-17 20:38:44 +00:00
|
|
|
return 1;
|
|
|
|
|
2010-02-28 11:27:05 +00:00
|
|
|
ingame = true;
|
2009-09-17 20:38:44 +00:00
|
|
|
while (true) {
|
|
|
|
if (!pause) {
|
|
|
|
snake_frame();
|
|
|
|
if (dead) {
|
2010-02-28 11:27:05 +00:00
|
|
|
ingame = false;
|
|
|
|
return 0;
|
2009-09-17 20:38:44 +00:00
|
|
|
}
|
|
|
|
if (!apple) {
|
|
|
|
do {
|
|
|
|
x=rb->rand() % BOARD_WIDTH;
|
|
|
|
y=rb->rand() % BOARD_HEIGHT;
|
|
|
|
} while (board[x][y]);
|
|
|
|
apple=true;
|
|
|
|
board[x][y]=-1;
|
|
|
|
rb->lcd_fillrect((x*4)+1,y*4,2,4);
|
|
|
|
rb->lcd_fillrect(x*4,(y*4)+1,4,2);
|
|
|
|
}
|
2003-07-02 21:38:08 +00:00
|
|
|
|
2009-09-17 20:38:44 +00:00
|
|
|
rb->sleep(HZ/level);
|
|
|
|
}
|
2003-07-02 21:38:08 +00:00
|
|
|
|
2004-10-18 21:45:00 +00:00
|
|
|
button=rb->button_get(false);
|
2010-02-28 11:27:05 +00:00
|
|
|
|
2006-07-30 03:10:09 +00:00
|
|
|
#ifdef HAS_BUTTON_HOLD
|
2010-02-28 11:27:05 +00:00
|
|
|
if (rb->button_hold() && !pause)
|
|
|
|
button = SNAKE_PLAYPAUSE;
|
2006-07-30 03:10:09 +00:00
|
|
|
#endif
|
2004-10-18 21:45:00 +00:00
|
|
|
switch (button) {
|
2010-02-28 11:27:05 +00:00
|
|
|
case SNAKE_UP:
|
|
|
|
if (dir!=2) dir=0;
|
|
|
|
break;
|
|
|
|
case SNAKE_RIGHT:
|
|
|
|
if (dir!=3) dir=1;
|
|
|
|
break;
|
|
|
|
case SNAKE_DOWN:
|
|
|
|
if (dir!=0) dir=2;
|
|
|
|
break;
|
|
|
|
case SNAKE_LEFT:
|
|
|
|
if (dir!=1) dir=3;
|
|
|
|
break;
|
2009-09-17 20:38:44 +00:00
|
|
|
case SNAKE_PLAYPAUSE:
|
|
|
|
pause = !pause;
|
|
|
|
if (pause)
|
|
|
|
rb->splash (HZ, "Paused");
|
|
|
|
else
|
|
|
|
snake_redraw();
|
|
|
|
break;
|
2006-06-30 16:43:47 +00:00
|
|
|
#ifdef SNAKE_RC_QUIT
|
2010-02-28 11:27:05 +00:00
|
|
|
case SNAKE_RC_QUIT:
|
2006-06-30 16:43:47 +00:00
|
|
|
#endif
|
2010-02-28 11:27:05 +00:00
|
|
|
case SNAKE_QUIT:
|
|
|
|
return 0;
|
2003-07-02 21:38:08 +00:00
|
|
|
break;
|
2004-10-18 21:45:00 +00:00
|
|
|
default:
|
2009-09-17 20:38:44 +00:00
|
|
|
if (rb->default_event_handler (button) == SYS_USB_CONNECTED)
|
2010-02-28 11:27:05 +00:00
|
|
|
return 1;
|
2004-10-18 21:45:00 +00:00
|
|
|
break;
|
2003-07-02 21:38:08 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-01-16 10:34:40 +00:00
|
|
|
enum plugin_status plugin_start(const void* parameter)
|
2003-07-02 21:38:08 +00:00
|
|
|
{
|
2009-09-17 20:38:44 +00:00
|
|
|
(void)parameter;
|
2003-07-02 21:38:08 +00:00
|
|
|
|
2010-02-28 11:27:05 +00:00
|
|
|
configfile_load(CONFIG_FILE_NAME, config, 1, 0);
|
|
|
|
highscore_load(SCORE_FILE, highscores, NUM_SCORES);
|
2009-09-17 20:38:44 +00:00
|
|
|
rb->lcd_clear_display();
|
2010-02-28 11:27:05 +00:00
|
|
|
ingame = false;
|
|
|
|
while(snake_game_loop() == 0)
|
|
|
|
;
|
|
|
|
configfile_save(CONFIG_FILE_NAME, config, 1, 0);
|
|
|
|
highscore_save(SCORE_FILE, highscores, NUM_SCORES);
|
2009-09-17 20:38:44 +00:00
|
|
|
return PLUGIN_OK;
|
2003-07-02 21:38:08 +00:00
|
|
|
}
|