New plugin: robotfindskitten - a zen simulation. More (or less) information on robotfindskitten.org.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@14993 a1c6a512-1295-4272-9138-f99709370657
diff --git a/apps/plugins/CATEGORIES b/apps/plugins/CATEGORIES
index a821fa0..046eb8a 100644
--- a/apps/plugins/CATEGORIES
+++ b/apps/plugins/CATEGORIES
@@ -51,6 +51,7 @@
properties,viewers
random_folder_advance_config,apps
reversi,games
+robotfindskitten,games
rockblox,games
rockbox_flash,viewers
rockboy,viewers
diff --git a/apps/plugins/SOURCES b/apps/plugins/SOURCES
index 20d7328..b725e7f 100644
--- a/apps/plugins/SOURCES
+++ b/apps/plugins/SOURCES
@@ -43,6 +43,7 @@
mazezam.c
text_editor.c
wavview.c
+robotfindskitten.c
/* Plugins needing the grayscale lib on low-depth LCDs */
fire.c
diff --git a/apps/plugins/robotfindskitten.c b/apps/plugins/robotfindskitten.c
new file mode 100644
index 0000000..fa0602b
--- /dev/null
+++ b/apps/plugins/robotfindskitten.c
@@ -0,0 +1,628 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * robotfindskitten: A Zen simulation
+ *
+ * Copyright (C) 1997,2000 Leonard Richardson
+ * leonardr@segfault.org
+ * http://www.crummy.com/devel/
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or EXISTANCE OF KITTEN. See the GNU General
+ * Public License for more details.
+ *
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * Ported to Rockbox 2007 by Jonas Häggqvist
+ */
+
+#include "plugin.h"
+#include "pluginlib_actions.h"
+
+/* This macros must always be included. Should be placed at the top by
+ convention, although the actual position doesn't matter */
+PLUGIN_HEADER
+
+/*The messages go in a separate file because they are collectively
+ huge, and you might want to modify them. It would be nice to load
+ the messages from a text file at run time.*/
+#include "robotfindskitten_messages.h"
+
+#define TRUE true
+#define FALSE false
+
+#define RFK_VERSION "v1.4142135.406"
+
+/* Button definitions stolen from maze.c */
+#if (CONFIG_KEYPAD == IPOD_4G_PAD) || \
+ (CONFIG_KEYPAD == IPOD_3G_PAD) || \
+ (CONFIG_KEYPAD == IPOD_1G2G_PAD)
+# undef __PLUGINLIB_ACTIONS_H__
+# define RFK_QUIT (BUTTON_SELECT | BUTTON_MENU)
+# define RFK_RIGHT BUTTON_RIGHT
+# define RFK_LEFT BUTTON_LEFT
+# define RFK_UP BUTTON_MENU
+# define RFK_DOWN BUTTON_PLAY
+# define RFK_RRIGHT (BUTTON_RIGHT | BUTTON_REPEAT)
+# define RFK_RLEFT (BUTTON_LEFT | BUTTON_REPEAT)
+# define RFK_RUP (BUTTON_MENU | BUTTON_REPEAT)
+# define RFK_RDOWN (BUTTON_PLAY | BUTTON_REPEAT)
+
+#else
+# define RFK_QUIT PLA_QUIT
+# define RFK_RIGHT PLA_RIGHT
+# define RFK_LEFT PLA_LEFT
+# define RFK_UP PLA_UP
+# define RFK_DOWN PLA_DOWN
+# define RFK_RRIGHT PLA_RIGHT_REPEAT
+# define RFK_RLEFT PLA_LEFT_REPEAT
+# define RFK_RUP PLA_UP_REPEAT
+# define RFK_RDOWN PLA_DOWN_REPEAT
+
+#endif
+/*Constants for our internal representation of the screen.*/
+#define EMPTY -1
+#define ROBOT 0
+#define KITTEN 1
+
+/*Screen dimensions.*/
+#define X_MIN 0
+#define X_MAX ((LCD_WIDTH/SYSFONT_WIDTH) - 1)
+#define Y_MIN 3
+#define Y_MAX ((LCD_HEIGHT/SYSFONT_HEIGHT) - 1)
+
+/* Colours used */
+#if LCD_DEPTH >= 16
+#define NUM_COLORS 6
+#define ROBOT_COLOR LCD_DARKGRAY
+const unsigned colors[NUM_COLORS] = {
+ LCD_RGBPACK(255, 255, 0), /* Yellow */
+ LCD_RGBPACK(0, 255, 255), /* Cyan */
+ LCD_RGBPACK(255, 0, 255), /* Purple */
+ LCD_RGBPACK(0, 0, 255), /* Blue */
+ LCD_RGBPACK(255, 0, 0), /* Red */
+ LCD_RGBPACK(0, 255, 0), /* Green */
+};
+#elif LCD_DEPTH == 2
+#define NUM_COLORS 3
+#define ROBOT_COLOR LCD_DARKGRAY
+const unsigned colors[NUM_COLORS] = {
+ LCD_LIGHTGRAY,
+ LCD_DARKGRAY,
+ LCD_BLACK,
+};
+#elif LCD_DEPTH == 1
+#define NUM_COLORS 1
+#define ROBOT_COLOR 0
+const unsigned colors[NUM_COLORS] = {
+ 0,
+};
+#endif /* HAVE_LCD_COLOR */
+
+/*Macros for generating numbers in different ranges*/
+#define randx() (rb->rand() % X_MAX) + 1
+#define randy() (rb->rand() % (Y_MAX-Y_MIN+1))+Y_MIN /*I'm feeling randy()!*/
+#define randchar() rb->rand() % (126-'!'+1)+'!';
+#define randcolor() rb->rand() % NUM_COLORS
+#define randbold() (rb->rand() % 2 ? TRUE:FALSE)
+
+/*Row constants for the animation*/
+#define ADV_ROW 1
+#define ANIMATION_MEET (X_MAX/3)*2
+#define ANIMATION_LENGTH 4
+
+/*This struct contains all the information we need to display an object
+ on the screen*/
+typedef struct
+{
+ int x;
+ int y;
+ int color;
+ bool bold;
+ char character;
+} screen_object;
+
+/*
+ *Function definitions
+ */
+
+/*Initialization and setup functions*/
+void initialize_arrays(void);
+void initialize_robot(void);
+void initialize_kitten(void);
+void initialize_bogus(void);
+void initialize_screen(void);
+void instructions(void);
+void finish(int sig);
+
+/*Game functions*/
+void play_game(void);
+void process_input(int);
+
+/*Helper functions*/
+int validchar(char);
+
+void play_animation(int);
+
+/*Global variables. Bite me, it's fun.*/
+screen_object robot;
+screen_object kitten;
+
+int num_bogus;
+screen_object bogus[MESSAGES];
+int bogus_messages[MESSAGES];
+int used_messages[MESSAGES];
+
+bool exit_rfk;
+
+/* This array contains our internal representation of the screen. The
+ array is bigger than it needs to be, as we don't need to keep track
+ of the first few rows of the screen. But that requires making an
+ offset function and using that everywhere. So not right now. */
+int screen[X_MAX + 1][Y_MAX + 1];
+
+/* 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;
+
+/******************************************************************************
+ *
+ * Begin meaty routines that do the dirty work.
+ *
+ *****************************************************************************/
+
+MEM_FUNCTION_WRAPPERS(rb)
+
+void drawchar(int x, int y, char c)
+{
+ char str[2];
+ rb->snprintf(str, sizeof(str), "%c", c);
+ rb->lcd_putsxy(x*SYSFONT_WIDTH, y*SYSFONT_HEIGHT, str);
+}
+
+void draw(screen_object o)
+{
+#if LCD_DEPTH > 1
+ unsigned oldforeground;
+ oldforeground = rb->lcd_get_foreground();
+ rb->lcd_set_foreground(o.color);
+ drawchar(o.x, o.y, o.character);
+ rb->lcd_set_foreground(oldforeground);
+#else
+ drawchar(o.x, o.y, o.character);
+#endif
+}
+
+void message(char * str)
+{
+ rb->lcd_puts_scroll(0, ADV_ROW, str);
+}
+
+void refresh(void)
+{
+ rb->lcd_update();
+}
+
+/*
+ *play_game waits in a loop getting input and sending it to process_input
+ */
+void play_game()
+{
+ int old_x = robot.x;
+ int old_y = robot.y;
+ int input = 0; /* Not sure what a reasonable initial value is */
+#ifdef __PLUGINLIB_ACTIONS_H__
+ const struct button_mapping *plugin_contexts[] = {generic_directions, generic_actions};
+#endif
+
+ while (input != RFK_QUIT && exit_rfk == false)
+ {
+ process_input(input);
+
+ /*Redraw robot, where applicable. We're your station, robot.*/
+ if (!(old_x == robot.x && old_y == robot.y))
+ {
+ /*Get rid of the old robot*/
+ drawchar(old_x, old_y, ' ');
+ screen[old_x][old_y] = EMPTY;
+
+ /*Meet the new robot, same as the old robot.*/
+ draw(robot);
+ refresh();
+ screen[robot.x][robot.y] = ROBOT;
+
+ old_x = robot.x;
+ old_y = robot.y;
+ }
+#ifdef __PLUGINLIB_ACTIONS_H__
+ input = pluginlib_getaction(rb, TIMEOUT_BLOCK, plugin_contexts, 2);
+#else
+ input = rb->button_get(true);
+#endif
+ }
+ message("Bye!");
+ refresh();
+}
+
+/*
+ *Given the keyboard input, process_input interprets it in terms of moving,
+ *touching objects, etc.
+ */
+void process_input(int input)
+{
+#ifdef __PLUGINLIB_ACTIONS_H__
+ const struct button_mapping *plugin_contexts[] = {generic_directions, generic_actions};
+#endif
+ int check_x = robot.x;
+ int check_y = robot.y;
+
+ switch (input)
+ {
+ case RFK_UP:
+ case RFK_RUP:
+ check_y--;
+ break;
+ case RFK_DOWN:
+ case RFK_RDOWN:
+ check_y++;
+ break;
+ case RFK_LEFT:
+ case RFK_RLEFT:
+ check_x--;
+ break;
+ case RFK_RIGHT:
+ case RFK_RRIGHT:
+ check_x++;
+ break;
+ }
+
+ /*Check for going off the edge of the screen.*/
+ if (check_y < Y_MIN || check_y > Y_MAX || check_x < X_MIN || check_x > X_MAX)
+ {
+ return; /*Do nothing.*/
+ }
+
+ /*
+ * Clear textline
+ * disabled because it breaks the scrolling for some reason
+ */
+ /* rb->lcd_puts_scroll(0, ADV_ROW, " "); */
+
+ /*Check for collision*/
+ if (screen[check_x][check_y] != EMPTY)
+ {
+ switch (screen[check_x][check_y])
+ {
+ case ROBOT:
+ /*We didn't move, or we're stuck in a
+ time warp or something.*/
+ break;
+ case KITTEN: /*Found it!*/
+ play_animation(input);
+ /* Wait for the user to click something */
+ rb->button_clear_queue();
+#ifdef __PLUGINLIB_ACTIONS_H__
+ input = pluginlib_getaction(rb, TIMEOUT_BLOCK, plugin_contexts, 2);
+#else
+ input = rb->button_get(true);
+#endif
+ break;
+ default: /*We hit a bogus object; print its message.*/
+ message(messages[bogus_messages[screen[check_x][check_y]-2]]);
+ refresh();
+ break;
+ }
+ return;
+ }
+
+ /*Otherwise, move the robot.*/
+ robot.x = check_x;
+ robot.y = check_y;
+}
+
+/*finish is called upon signal or progam exit*/
+void finish(int sig)
+{
+ (void)sig;
+ exit_rfk = true;
+}
+
+/******************************************************************************
+ *
+ * Begin helper routines
+ *
+ *****************************************************************************/
+
+int validchar(char a)
+{
+ switch(a)
+ {
+ case '#':
+ case ' ':
+ case 127:
+ return 0;
+ }
+ return 1;
+}
+
+void play_animation(int input)
+{
+ int counter;
+ screen_object left;
+ screen_object right;
+ /*The grand cinema scene.*/
+ rb->lcd_puts_scroll(0, ADV_ROW, " ");
+
+ if (input == RFK_RIGHT || input == RFK_DOWN || input == RFK_RRIGHT || input == RFK_RDOWN) {
+ left = robot;
+ right = kitten;
+ }
+ else {
+ left = kitten;
+ right = robot;
+ }
+ left.y = ADV_ROW;
+ right.y = ADV_ROW;
+ left.x = ANIMATION_MEET - ANIMATION_LENGTH - 1;
+ right.x = ANIMATION_MEET + ANIMATION_LENGTH;
+
+ for (counter = ANIMATION_LENGTH; counter > 0; counter--)
+ {
+ left.x++;
+ right.x--;
+ /* Clear the previous position (empty the first time) */
+ drawchar(left.x - 1, left.y, ' ');
+ drawchar(right.x + 1, right.y, ' ');
+ draw(left);
+ draw(right);
+ refresh();
+ rb->sleep(HZ);
+ }
+
+ message("You found kitten! Way to go, robot!");
+ refresh();
+ finish(0);
+}
+
+/******************************************************************************
+ *
+ * Begin initialization routines (called before play begins).
+ *
+ *****************************************************************************/
+
+void instructions()
+{
+ char buf[X_MAX + 5];
+ rb->snprintf(buf, sizeof(buf), "robotfindskitten %s", RFK_VERSION);
+ /*
+ * fixme: Find a nice way of portably putting a lot of
+ * text on the screen. Fixing it for all these sizes is just a horrible job
+ */
+#if X_MAX >= 52 /* 320 pixels wide */
+ rb->lcd_putsxy(0,0, buf);
+ rb->lcd_putsxy(0,SYSFONT_HEIGHT*1, "By the illustrious Leonard Richardson (C) 1997, 2000");
+ rb->lcd_putsxy(0,SYSFONT_HEIGHT*2, "Written originally for the Nerth Pork");
+ rb->lcd_putsxy(0,SYSFONT_HEIGHT*3, "robotfindskitten contest");
+ rb->lcd_putsxy(0,SYSFONT_HEIGHT*5, "In this game you are robot (#). Your job is to find");
+ rb->lcd_putsxy(0,SYSFONT_HEIGHT*6, "kitten. This task is complicated by the existence of");
+ rb->lcd_putsxy(0,SYSFONT_HEIGHT*7, "various things which are not kitten. Robot must");
+ rb->lcd_putsxy(0,SYSFONT_HEIGHT*8, "touch items to determine if they are kitten or not.");
+ rb->lcd_putsxy(0,SYSFONT_HEIGHT*9, "The game ends when robotfindskitten.");
+ rb->lcd_putsxy(0,SYSFONT_HEIGHT*11, "Press any key to start");
+ rb->lcd_update();
+ rb->button_get(true);
+#elif X_MAX >= 39 /* 240 pixels wide */
+#elif X_MAX >= 35 /* 220 pixels wide */
+#elif X_MAX >= 28 /* 176 pixels wide */
+#elif X_MAX >= 25 /* 160 pixels wide */
+#elif X_MAX >= 20 /* 128 pixels wide */
+#elif X_MAX >= 17 /* 112 pixels wide */
+#endif
+}
+
+void initialize_arrays()
+{
+ unsigned int counter, counter2;
+ screen_object empty;
+
+ /*Initialize the empty object.*/
+ empty.x = -1;
+ empty.y = -1;
+#if LCD_DEPTH > 1
+ empty.color = LCD_BLACK;
+#else
+ empty.color = 0;
+#endif
+ empty.bold = FALSE;
+ empty.character = ' ';
+
+ for (counter = 0; counter <= X_MAX; counter++)
+ {
+ for (counter2 = 0; counter2 <= Y_MAX; counter2++)
+ {
+ screen[counter][counter2] = EMPTY;
+ }
+ }
+
+ /*Initialize the other arrays.*/
+ for (counter = 0; counter < MESSAGES; counter++)
+ {
+ used_messages[counter] = 0;
+ bogus_messages[counter] = 0;
+ bogus[counter] = empty;
+ }
+}
+
+/*initialize_robot initializes robot.*/
+void initialize_robot()
+{
+ /*Assign a position to the player.*/
+ robot.x = randx();
+ robot.y = randy();
+
+ robot.character = '#';
+ robot.color = ROBOT_COLOR;
+ robot.bold = FALSE;
+ screen[robot.x][robot.y] = ROBOT;
+}
+
+/*initialize kitten, well, initializes kitten.*/
+void initialize_kitten()
+{
+ /*Assign the kitten a unique position.*/
+ do
+ {
+ kitten.x = randx();
+ kitten.y = randy();
+ } while (screen[kitten.x][kitten.y] != EMPTY);
+
+ /*Assign the kitten a character and a color.*/
+ do {
+ kitten.character = randchar();
+ } while (!(validchar(kitten.character)));
+ screen[kitten.x][kitten.y] = KITTEN;
+
+ kitten.color = colors[randcolor()];
+ kitten.bold = randbold();
+}
+
+/*initialize_bogus initializes all non-kitten objects to be used in this run.*/
+void initialize_bogus()
+{
+ int counter, index;
+ for (counter = 0; counter < num_bogus; counter++)
+ {
+ /*Give it a color.*/
+ bogus[counter].color = colors[randcolor()];
+ bogus[counter].bold = randbold();
+
+ /*Give it a character.*/
+ do {
+ bogus[counter].character = randchar();
+ } while (!(validchar(bogus[counter].character)));
+
+ /*Give it a position.*/
+ do
+ {
+ bogus[counter].x = randx();
+ bogus[counter].y = randy();
+ } while (screen[bogus[counter].x][bogus[counter].y] != EMPTY);
+
+ screen[bogus[counter].x][bogus[counter].y] = counter+2;
+
+ /*Find a message for this object.*/
+ do {
+ index = rb->rand() % MESSAGES;
+ } while (used_messages[index] != 0);
+ bogus_messages[counter] = index;
+ used_messages[index] = 1;
+ }
+
+}
+
+/*initialize_screen paints the screen.*/
+void initialize_screen()
+{
+ int counter;
+ char buf[40];
+
+ /*
+ * Set up white-on-black screen on color targets
+ */
+#if LCD_DEPTH >= 16
+ rb->lcd_set_backdrop(NULL);
+ rb->lcd_set_foreground(LCD_WHITE);
+ rb->lcd_set_background(LCD_BLACK);
+#endif
+
+ /*
+ *Print the status portion of the screen.
+ */
+ rb->lcd_clear_display();
+ rb->lcd_setfont(FONT_SYSFIXED);
+ rb->snprintf(buf, sizeof(buf), "robotfindskitten %s", RFK_VERSION);
+ rb->lcd_puts_scroll(0, 0, buf);
+ refresh();
+
+ /*Draw a line across the screen.*/
+ for (counter = X_MIN; counter <= X_MAX + 1; counter++)
+ {
+ drawchar(counter, ADV_ROW+1, '_');
+ }
+
+ /*
+ *Draw all the objects on the playing field.
+ */
+ for (counter = 0; counter < num_bogus; counter++)
+ {
+ draw(bogus[counter]);
+ }
+
+ draw(kitten);
+ draw(robot);
+
+ refresh();
+
+}
+
+/* this is the plugin entry point */
+enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
+{
+ (void)parameter;
+ rb = api;
+
+ /* Get a number of non-kitten objects */
+#if X_MAX*Y_MAX < 200
+ num_bogus = 15;
+#else
+ num_bogus = 20;
+#endif
+ exit_rfk = false;
+
+ rb->srand(*rb->current_tick);
+
+ initialize_arrays();
+
+ /*
+ * Now we initialize the various game objects.
+ */
+ initialize_robot();
+ initialize_kitten();
+ initialize_bogus();
+
+ /*
+ * Set up white-on-black screen on color targets
+ */
+#if LCD_DEPTH >= 16
+ rb->lcd_set_backdrop(NULL);
+ rb->lcd_set_foreground(LCD_WHITE);
+ rb->lcd_set_background(LCD_BLACK);
+#endif
+ rb->lcd_clear_display();
+ rb->lcd_setfont(FONT_SYSFIXED);
+
+ /*
+ * Run the game
+ */
+ instructions();
+
+ initialize_screen();
+
+ play_game();
+
+ rb->lcd_setfont(FONT_UI);
+ return PLUGIN_OK;
+}
diff --git a/apps/plugins/robotfindskitten_messages.h b/apps/plugins/robotfindskitten_messages.h
new file mode 100644
index 0000000..e1be4ba
--- /dev/null
+++ b/apps/plugins/robotfindskitten_messages.h
@@ -0,0 +1,453 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * robotfindskitten: A Zen simulation
+ *
+ * Copyright (C) 1997,2000 Leonard Richardson
+ * leonardr@segfault.org
+ * http://www.crummy.com/devel/
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or EXISTANCE OF KITTEN. See the GNU General
+ * Public License for more details.
+ *
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * Ported to Rockbox 2007 by Jonas Häggqvist
+ */
+
+/*Be sure to change MESSAGES when you change the array, or bad things
+ will happen.*/
+
+/*Also, take note that robotfindskitten.c and configure.in
+ currently have the version number hardcoded into them, and they
+ should reflect MESSAGES. */
+
+/* Watch out for fenceposts.*/
+#define MESSAGES (sizeof messages / sizeof (char*))
+
+
+static char* messages[] =
+{
+ "\"I pity the fool who mistakes me for kitten!\", sez Mr. T.",
+ "That's just an old tin can.",
+ "It's an altar to the horse god.",
+ "A box of dancing mechanical pencils. They dance! They sing!",
+ "It's an old Duke Ellington record.",
+ "A box of fumigation pellets.",
+ "A digital clock. It's stuck at 2:17 PM.",
+ "That's just a charred human corpse.",
+ "I don't know what that is, but it's not kitten.",
+ "An empty shopping bag. Paper or plastic?",
+ "Could it be... a big ugly bowling trophy?",
+ "A coat hanger hovers in thin air. Odd.",
+ "Not kitten, just a packet of Kool-Aid(tm).",
+ "A freshly-baked pumpkin pie.",
+ "A lone, forgotten comma, sits here, sobbing.",
+ "ONE HUNDRED THOUSAND CARPET FIBERS!!!!!",
+ "It's Richard Nixon's nose!",
+ "It's Lucy Ricardo. \"Aaaah, Ricky!\", she says.",
+ "You stumble upon Bill Gates' stand-up act.",
+ "Just an autographed copy of the Kama Sutra.",
+ "It's the Will Rogers Highway. Who was Will Rogers, anyway?",
+ "It's another robot, more advanced in design than you but strangely immobile.",
+ "Leonard Richardson is here, asking people to lick him.",
+ "It's a stupid mask, fashioned after a beagle.",
+ "Your State Farm Insurance(tm) representative!",
+ "It's the local draft board.",
+ "Seven 1/4\" screws and a piece of plastic.",
+ "An 80286 machine.",
+ "One of those stupid \"Homes of the Stars\" maps.",
+ "A signpost saying \"TO KITTEN\". It points in no particular direction.",
+ "A hammock stretched between a tree and a volleyball pole.",
+ "A Texas Instruments of Destruction calculator.",
+ "It's a dark, amphorous blob of matter.",
+ "Just a pincushion.",
+ "It's a mighty zombie talking about some love and prosperity.",
+ "\"Dear robot, you may have already won our 10 MILLION DOLLAR prize...\"",
+ "It's just an object.",
+ "A mere collection of pixels.",
+ "A badly dented high-hat cymbal lies on its side here.",
+ "A marijuana brownie.",
+ "A plush Chewbacca.",
+ "Daily hunger conditioner from Australasia",
+ "Just some stuff.",
+ "Why are you touching this when you should be finding kitten?",
+ "A glorious fan of peacock feathers.",
+ "It's some compromising photos of Babar the Elephant.",
+ "A copy of the Weekly World News. Watch out for the chambered nautilus!",
+ "It's the proverbial wet blanket.",
+ "A \"Get Out of Jail Free\" card.",
+ "An incredibly expensive \"Mad About You\" collector plate.",
+ "Paul Moyer's necktie.",
+ "A haircut and a real job. Now you know where to get one!",
+ "An automated robot-hater. It frowns disapprovingly at you.",
+ "An automated robot-liker. It smiles at you.",
+ "It's a black hole. Don't fall in!",
+ "Just a big brick wall.",
+ "You found kitten! No, just kidding.",
+ "Heart of Darkness brand pistachio nuts.",
+ "A smoking branding iron shaped like a 24-pin connector.",
+ "It's a Java applet.",
+ "An abandoned used-car lot.",
+ "A shameless plug for Crummy: http://www.crummy.com/",
+ "A shameless plug for the UCLA Linux Users Group: http://linux.ucla.edu/",
+ "A can of Spam Lite.",
+ "This is another fine mess you've gotten us into, Stanley.",
+ "It's scenery for \"Waiting for Godot\".",
+ "This grain elevator towers high above you.",
+ "A Mentos wrapper.",
+ "It's the constellation Pisces.",
+ "It's a fly on the wall. Hi, fly!",
+ "This kind of looks like kitten, but it's not.",
+ "It's a banana! Oh, joy!",
+ "A helicopter has crashed here.",
+ "Carlos Tarango stands here, doing his best impression of Pat Smear.",
+ "A patch of mushrooms grows here.",
+ "A patch of grape jelly grows here.",
+ "A spindle, and a grindle, and a bucka-wacka-woom!",
+ "A geyser sprays water high into the air.",
+ "A toenail? What good is a toenail?",
+ "You've found the fish! Not that it does you much good in this game.",
+ "A Buttertonsils bar.",
+ "One of the few remaining discoes.",
+ "Ah, the uniform of a Revolutionary-era minuteman.",
+ "A punch bowl, filled with punch and lemon slices.",
+ "It's nothing but a G-thang, baby.",
+ "IT'S ALIVE! AH HA HA HA HA!",
+ "This was no boating accident!",
+ "Wait! This isn't the poker chip! You've been tricked! DAMN YOU, MENDEZ!",
+ "A livery stable! Get your livery!",
+ "It's a perpetual immobility machine.",
+ "\"On this spot in 1962, Henry Winkler was sick.\"",
+ "There's nothing here; it's just an optical illusion.",
+ "The World's Biggest Motzah Ball!",
+ "A tribe of cannibals lives here. They eat Malt-O-Meal for breakfast, you know.",
+ "This appears to be a rather large stack of trashy romance novels.",
+ "Look out! Exclamation points!",
+ "A herd of wild coffee mugs slumbers here.",
+ "It's a limbo bar! How low can you go?",
+ "It's the horizon. Now THAT'S weird.",
+ "A vase full of artificial flowers is stuck to the floor here.",
+ "A large snake bars your way.",
+ "A pair of saloon-style doors swing slowly back and forth here.",
+ "It's an ordinary bust of Beethoven... but why is it painted green?",
+ "It's TV's lovable wisecracking Crow! \"Bite me!\", he says.",
+ "Hey, look, it's war. What is it good for? Absolutely nothing. Say it again.",
+ "It's the amazing self-referential thing that's not kitten.",
+ "A flamboyant feather boa. Now you can dress up like Carol Channing!",
+ "\"Sure hope we get some rain soon,\" says Farmer Joe.",
+ "\"How in heck can I wash my neck if it ain't gonna rain no more?\" asks Farmer Al.",
+ "\"Topsoil's all gone, ma,\" weeps Lil' Greg.",
+ "This is a large brown bear. Oddly enough, it's currently peeing in the woods.",
+ "A team of arctic explorers is camped here.",
+ "This object here appears to be Louis Farrakhan's bow tie.",
+ "This is the world-famous Chain of Jockstraps.",
+ "A trash compactor, compacting away.",
+ "This toaster strudel is riddled with bullet holes!",
+ "It's a hologram of a crashed helicopter.",
+ "This is a television. On screen you see a robot strangely similar to yourself.",
+ "This balogna has a first name, it's R-A-N-C-I-D.",
+ "A salmon hatchery? Look again. It's merely a single salmon.",
+ "It's a rim shot. Ba-da-boom!",
+ "It's creepy and it's kooky, mysterious and spooky. It's also somewhat ooky.",
+ "This is an anagram.",
+ "This object is like an analogy.",
+ "It's a symbol. You see in it a model for all symbols everywhere.",
+ "The object pushes back at you.",
+ "A traffic signal. It appears to have been recently vandalized.",
+ "\"There is no kitten!\" cackles the old crone. You are shocked by her blasphemy.",
+ "This is a Lagrange point. Don't come too close now.",
+ "The dirty old tramp bemoans the loss of his harmonica.",
+ "Look, it's Fanny the Irishman!",
+ "What in blazes is this?",
+ "It's the instruction manual for a previous version of this game.",
+ "A brain cell. Oddly enough, it seems to be functioning.",
+ "Tea and/or crumpets.",
+ "This jukebox has nothing but Cliff Richards albums in it.",
+ "It's a Quaker Oatmeal tube, converted into a drum.",
+ "This is a remote control. Being a robot, you keep a wide berth.",
+ "It's a roll of industrial-strength copper wire.",
+ "Oh boy! Grub! Er, grubs.",
+ "A puddle of mud, where the mudskippers play.",
+ "Plenty of nothing.",
+ "Look at that, it's the Crudmobile.",
+ "Just Walter Mattheau and Jack Lemmon.",
+ "Two crepes, two crepes in a box.",
+ "An autographed copy of \"Primary Colors\", by Anonymous.",
+ "Another rabbit? That's three today!",
+ "It's a segmentation fault. Core dumped, by the way.",
+ "A historical marker showing the actual location of /dev/null.",
+ "Thar's Mobius Dick, the convoluted whale. Arrr!",
+ "It's a charcoal briquette, smoking away.",
+ "A pizza, melting in the sun.",
+ "It's a \"HOME ALONE 2: Lost in New York\" novelty cup.",
+ "A stack of 7 inch floppies wobbles precariously.",
+ "It's nothing but a corrupted floppy. Coaster anyone?",
+ "A section of glowing phosphor cells sings a song of radiation to you.",
+ "This TRS-80 III is eerily silent.",
+ "A toilet bowl occupies this space.",
+ "This peg-leg is stuck in a knothole!",
+ "It's a solitary vacuum tube.",
+ "This corroded robot is clutching a mitten.",
+ "\"Hi, I'm Anson Williams, TV's 'Potsy'.\"",
+ "This subwoofer was blown out in 1974.",
+ "Three half-pennies and a wooden nickel.",
+ "It's the missing chapter to \"A Clockwork Orange\".",
+ "It's a burrito stand flyer. \"Taqueria El Ranchito\".",
+ "This smiling family is happy because they eat LARD.",
+ "Roger Avery, persona un famoso de los Estados Unidos.",
+ "Ne'er but a potted plant.",
+ "A parrot, kipping on its back.",
+ "A forgotten telephone switchboard.",
+ "A forgotten telephone switchboard operator.",
+ "It's an automated robot-disdainer. It pretends you're not there.",
+ "It's a portable hole. A sign reads: \"Closed for the winter\".",
+ "Just a moldy loaf of bread.",
+ "A little glass tub of Carmex. ($.89) Too bad you have no lips.",
+ "A Swiss-Army knife. All of its appendages are out. (toothpick lost)",
+ "It's a zen simulation, trapped within an ASCII character.",
+ "It's a copy of \"The Rubaiyat of Spike Schudy\".",
+ "It's \"War and Peace\" (unabridged, very small print).",
+ "A willing, ripe tomato bemoans your inability to digest fruit.",
+ "A robot comedian. You feel amused.",
+ "It's KITT, the talking car.",
+ "Here's Pete Peterson. His batteries seem to have long gone dead.",
+ "\"Blup, blup, blup\", says the mud pot.",
+ "More grist for the mill.",
+ "Grind 'em up, spit 'em out, they're twigs.",
+ "The boom box cranks out an old Ethel Merman tune.",
+ "It's \"Finding kitten\", published by O'Reilly and Associates.",
+ "Pumpkin pie spice.",
+ "It's the Bass-Matic '76! Mmm, that's good bass!",
+ "\"Lend us a fiver 'til Thursday\", pleas Andy Capp.",
+ "It's a tape of '70s rock. All original hits! All original artists!",
+ "You've found the fabled America Online disk graveyard!",
+ "Empty jewelboxes litter the landscape.",
+ "It's the astounding meta-object.",
+ "Ed McMahon stands here, lost in thought. Seeing you, he bellows, \"YES SIR!\"",
+ "...thingy???",
+ "It's 1000 secrets the government doesn't want you to know!",
+ "The letters O and R.",
+ "A magical... magic thing.",
+ "It's a moment of silence.",
+ "It's Sirhan-Sirhan, looking guilty.",
+ "It's \"Chicken Soup for the Kitten-seeking Soulless Robot.\"",
+ "It is a set of wind-up chatter teeth.",
+ "It is a cloud shaped like an ox.",
+ "You see a snowflake here, melting slowly.",
+ "It's a big block of ice. Something seems to be frozen inside it.",
+ "Vladimir Lenin's casket rests here.",
+ "It's a copy of \"Zen and The Art of Robot Maintenance\".",
+ "This invisible box contains a pantomime horse.",
+ "A mason jar lies here open. It's label reads: \"do not open!\".",
+ "A train of thought chugs through here.",
+ "This jar of pickles expired in 1957.",
+ "Someone's identity disk lies here.",
+ "\"Yes!\" says the bit.",
+ "\"No!\" says the bit.",
+ "A dodecahedron bars your way.",
+ "Mr. Hooper is here, surfing.",
+ "It's a big smoking fish.",
+ "You have new mail in /var/spool/robot",
+ "Just a monitor with the blue element burnt out.",
+ "A pile of coaxial plumbing lies here.",
+ "It's a rotten old shoe.",
+ "It's a hundred-dollar bill.",
+ "It's a Dvorak keyboard.",
+ "It's a cardboard box full of 8-tracks.",
+ "Just a broken hard drive containg the archives of Nerth Pork.",
+ "A broken metronome sits here, it's needle off to one side.",
+ "A sign reads: \"Go home!\"",
+ "A sign reads: \"No robots allowed!\"",
+ "It's the handheld robotfindskitten game, by Tiger.",
+ "This particular monstrosity appears to be ENIAC.",
+ "This is a tasty-looking banana creme pie.",
+ "A wireframe model of a hot dog rotates in space here.",
+ "Just the empty husk of a locust.",
+ "You disturb a murder of crows.",
+ "It's a copy of the robotfindskitten EULA.",
+ "It's Death.",
+ "It's an autographed copy of \"Secondary Colors,\" by Bob Ross.",
+ "It is a marzipan dreadnought that appears to have melted and stuck.",
+ "It's a DVD of \"Crouching Monkey, Hidden Kitten\", region encoded for the moon.",
+ "It's Kieran Hervold. Damn dyslexia!",
+ "A non-descript box of crackers.",
+ "Carbonated Water, High Fructose Corn Syrup, Color, Phosphoric Acid, Flavors, Caffeine.",
+ "\"Move along! Nothing to see here!\"",
+ "It's the embalmed corpse of Vladimir Lenin.",
+ "A coupon for one free steak-fish at your local family diner.",
+ "A set of keys to a 2001 Rolls Royce. Worthless.",
+ "A gravestone stands here. \"Izchak Miller, ascended.\"",
+ "Someone has written \"ad aerarium\" on the ground here.",
+ "A large blue eye floats in midair.",
+ "This appears to be a statue of Perseus.",
+ "There is an opulent throne here.",
+ "It's a squad of Keystone Kops.",
+ "This seems to be junk mail addressed to the finder of the Eye of Larn.",
+ "A wondrous and intricate golden amulet. Too bad you have no neck.",
+ "The swampy ground around you seems to stink with disease.",
+ "An animate blob of acid. Being metallic, you keep well away.",
+ "It's a copy of Knuth with the chapter on kitten-search algorithms torn out.",
+ "A crowd of people, and at the center, a popular misconception.",
+ "It's a blind man. When you touch, he exclaims \"It's a kitten prospecting robot!\"",
+ "It's a lost wallet. It's owner didn't have pets, so you discard it.",
+ "This place is called Antarctica. There is no kitten here.",
+ "It's a mousetrap, baited with soap.",
+ "A book with \"Don't Panic\" in large friendly letters across the cover.",
+ "A compendium of haiku about metals.",
+ "A discredited cosmology, relic of a bygone era.",
+ "A hollow voice says \"Plugh\".",
+ "A knight who says \"Either I am an insane knave, or you will find kitten.\"",
+ "A neural net -- maybe it's trying to recognize kitten.",
+ "A screwdriver.",
+ "A statue of a girl holding a goose like the one in Gottingen, Germany.",
+ "A tetradrachm dated \"42 B.C.\"",
+ "A voice booms out \"Onward, kitten soldiers...\"",
+ "An eminently forgettable zahir.",
+ "Apparently, it's Edmund Burke.",
+ "For a moment, you feel something in your hands, but it disappears!",
+ "Here is a book about Robert Kennedy.",
+ "Hey, robot, leave those lists alone.",
+ "Ho hum. Another synthetic a posteriori.",
+ "It's Asimov's Laws of Robotics. You feel a strange affinity for them.",
+ "It's Bach's Mass in B-minor!",
+ "It's a bug.",
+ "It's a synthetic a priori truth! Immanuel would be so pleased!",
+ "It's the Tiki Room.",
+ "Just some old play by a Czech playwright, and you can't read Czech.",
+ "Kitten is the letter 'Q'. Oh, wait, maybe not.",
+ "Quidquid Latine dictum sit, kitten non est.",
+ "Sutro Tower is visible at some distance through the fog.",
+ "The Digital Millennium Copyright Act of 1998.",
+ "The United States Court of Appeals for the Federal Circuit.",
+ "The non-kitten item like this but with \"false\" and \"true\" switched is true.",
+ "The non-kitten item like this but with \"true\" and \"false\" switched is false.",
+ "This is the chapter called \"A Map of the Cat?\" from Feynman's autobiography.",
+ "This is the forest primeval.",
+ "Werner's \"Pocket Field Guide to Things That Are Not Kitten\".",
+ "You found nettik, but that's backwards.",
+ "You have found some zinc, but you must not stop here, for you must find kitten.",
+ "\"50 Years Among the Non-Kitten Items\", by Ann Droyd.",
+ "\"Robot may not injure kitten, or, through inaction, ...\"",
+ "\"Address Allocation for Private Internets\" by Yakov Rekhter et al.",
+ "\"Mail Routing and the Domain System\" by Craig Partridge.",
+ "\"The Theory and Practice of Oligarchical Collectivism\" by Emmanuel Goldstein.",
+ "\"201 Kitten Verbs, Fully Conjugated\". You look for \"find\".",
+ "A card shark sits here, practicing his Faro shuffle. He ignores you.",
+ "A copy of DeCSS. They're a dime a dozen these days.",
+ "A demonic voice proclaims \"There is no kitten, only Zuul\". You flee.",
+ "A lotus. You make an interesting pair.",
+ "A milk carton, with a black and white picture of kitten on the side.",
+ "Any ordinary robot could see from a mile away that this wasn't kitten.",
+ "A stegosaurus, escaped from the stegosaurusfindsrobot game. It finds you.",
+ "Baling wire and chewing gum.",
+ "Chewing gum and baling wire.",
+ "Here is no kitten but only rock, rock and no kitten and the sandy road.",
+ "Hey, I bet you thought this was kitten.",
+ "It is an ancient mariner, and he stoppeth one of three.",
+ "It pleases you to be kind to what appears to be kitten -- but it's not!",
+ "It's a blatant plug for Ogg Vorbis, http://www.vorbis.com/",
+ "It's a business plan for a new startup, kitten.net.",
+ "It's a revised business plan for a new startup, my.kitten.net.",
+ "It's a square.",
+ "It seems to be a copy of \"A Tail of Two Kitties\".",
+ "It's the Donation of Constantine!",
+ "It's this message, nothing more.",
+ "Lysine, an essential amino acid. Well, maybe not for robots.",
+ "No kitten here.",
+ "The score for a Czech composer's \"Kitten-Finding Symphony in C\".",
+ "This looks like Bradley's \"Appearance and Reality\", but it's really not.",
+ "This non-kitten item no verb.",
+ "You feel strangely unfulfilled.",
+ "You hit the non-kitten item. The non-kitten item fails to yowl.",
+ "You suddenly yearn for your distant homeland.",
+ "You've found the snows of yesteryear! So that's where they all went to.",
+ "Approaching. One car. J. Followed by. Two car. M, M. In five. Minutes.",
+ "Free Jon Johansen!",
+ "Free Dmitry Sklyarov!",
+ "One person shouts \"What do we want?\" The crowd answers \"Free Dmitry!\"",
+ "Judith Platt insults librarians.",
+ "This map is not the territory.",
+ "\"Go back to Libraria!\", says Pat Schroeder.",
+ "This is a porcelain kitten-counter. 0, 0, 0, 0, 0...",
+ "An old bootable business card, unfortunately cracked down the middle.",
+ "A kitten sink, for washing kitten (if only kitten liked water).",
+ "A kitten source (to match the kitten sink).",
+ "If it's one thing, it's not another.",
+ "If it's not one thing, it's another.",
+ "A caboodle.",
+ "A grin.",
+ "A hedgehog. It looks like it knows something important.",
+ "You've found... Oh wait, that's just a cat.",
+ "Robot should not be touching that.",
+ "Air Guitar!!! NA na NA na!!",
+ "An aromatherapy candle burns with healing light.",
+ "You find a bright shiny penny.",
+ "It's a free Jon Johansen!",
+ "It's a free Dmitry Sklyarov!",
+ "The rothe hits! The rothe hits!",
+ "It's an Internet chain letter about sodium laureth sulfate.",
+ "Ed Witten sits here, pondering string theory.",
+ "Something is written here in the dust. You read: \"rJbotf ndQkttten\".",
+ "We wish you a merry kitten, and a happy New Year!",
+ "Run away! Run away!",
+ "You can see right through this copy of Brin\'s \"Transparent Society\".",
+ "This copy of \"Steal This Book\" has been stolen from a bookstore.",
+ "It's Roya Naini.",
+ "This kit is the fourteenth in a series of kits named with Roman letters.",
+ "This is the tenth key you've found so far.",
+ "You find a fraud scheme in which loans are used as security for other loans.",
+ "It's the phrase \"and her\", written in ancient Greek.",
+ "It's the author of \"Randomness and Mathematical Proof\".",
+ "It's the crusty exoskeleton of an arthropod!",
+ "It's Emporer Shaddam the 4th's planet!",
+ "It's the triangle leg adjacent to an angle divided by the leg opposite it.",
+ "It's a bottle of nail polish remover.",
+ "You found netkit! Way to go, robot!",
+ "It's the ASCII Floating Head of Seth David Schoen!",
+ "A frosted pink party-cake, half eaten.",
+ "A bitchin' homemade tesla coil.",
+ "Conan O'Brian, sans jawbone.",
+ "It's either a mirror, or another soulless kitten-seeking robot.",
+ "Preoccupation with finding kitten prevents you from investigating further.",
+ "Fonzie sits here, mumbling incoherently about a shark and a pair of waterskis.",
+ "The ghost of your dance instructor, his face a paper-white mask of evil.",
+ "A bag of groceries taken off the shelf before the expiration date.",
+/* Exclude some messages on targets with less RAM */
+#if PLUGIN_BUFFER_SIZE > 0x8000
+ "A book: Feng Shui, Zen: the art of randomly arranging items that are not kitten.",
+ "This might be the fountain of youth, but you'll never know.",
+ "Tigerbot Hesh.",
+ "Stimutacs.",
+ "A canister of pressurized whipped cream, sans whipped cream.",
+ "The non-kitten item bites!",
+ "A chain hanging from two posts reminds you of the Gateway Arch.",
+ "A mathematician calculates the halting probability of a Turing machine.",
+ "A number of short theatrical productions are indexed 1, 2, 3, ... n.",
+ "A technical university in Australia.",
+ "It is -- I just feel something wonderful is about to happen.",
+ "It's a Cat 5 cable.",
+ "It's a U.S. president.",
+ "It's a piece of cloth used to cover a stage in between performances.",
+ "The ionosphere seems charged with meaning.",
+ "This tomography is like, hella axial, man!",
+ "It's your favorite game -- robotfindscatan!",
+ "Just a man selling an albatross.",
+ "The intermission from a 1930s silent movie.",
+ "It's an inverted billiard ball!",
+ "The spectre of Sherlock Holmes wills you onwards.",
+#endif
+};
diff --git a/docs/CREDITS b/docs/CREDITS
index bfa00b3..cb12c96 100644
--- a/docs/CREDITS
+++ b/docs/CREDITS
@@ -359,3 +359,4 @@
The UCL team
The iPod Linux team
The Vision-8 Emulator team
+The robotfindskitten team
diff --git a/manual/plugins/images/ss-robotfindskitten-112x64x1.png b/manual/plugins/images/ss-robotfindskitten-112x64x1.png
new file mode 100644
index 0000000..eb066e7
--- /dev/null
+++ b/manual/plugins/images/ss-robotfindskitten-112x64x1.png
Binary files differ
diff --git a/manual/plugins/images/ss-robotfindskitten-128x128x16.png b/manual/plugins/images/ss-robotfindskitten-128x128x16.png
new file mode 100644
index 0000000..08661a1
--- /dev/null
+++ b/manual/plugins/images/ss-robotfindskitten-128x128x16.png
Binary files differ
diff --git a/manual/plugins/images/ss-robotfindskitten-132x80x16.png b/manual/plugins/images/ss-robotfindskitten-132x80x16.png
new file mode 100644
index 0000000..029e413
--- /dev/null
+++ b/manual/plugins/images/ss-robotfindskitten-132x80x16.png
Binary files differ
diff --git a/manual/plugins/images/ss-robotfindskitten-138x110x2.png b/manual/plugins/images/ss-robotfindskitten-138x110x2.png
new file mode 100644
index 0000000..27760d7
--- /dev/null
+++ b/manual/plugins/images/ss-robotfindskitten-138x110x2.png
Binary files differ
diff --git a/manual/plugins/images/ss-robotfindskitten-160x128x16.png b/manual/plugins/images/ss-robotfindskitten-160x128x16.png
new file mode 100644
index 0000000..bba982b
--- /dev/null
+++ b/manual/plugins/images/ss-robotfindskitten-160x128x16.png
Binary files differ
diff --git a/manual/plugins/images/ss-robotfindskitten-176x132x16.png b/manual/plugins/images/ss-robotfindskitten-176x132x16.png
new file mode 100644
index 0000000..af45b1e
--- /dev/null
+++ b/manual/plugins/images/ss-robotfindskitten-176x132x16.png
Binary files differ
diff --git a/manual/plugins/images/ss-robotfindskitten-220x176x16.png b/manual/plugins/images/ss-robotfindskitten-220x176x16.png
new file mode 100644
index 0000000..fb94aa0
--- /dev/null
+++ b/manual/plugins/images/ss-robotfindskitten-220x176x16.png
Binary files differ
diff --git a/manual/plugins/images/ss-robotfindskitten-240x320x16.png b/manual/plugins/images/ss-robotfindskitten-240x320x16.png
new file mode 100644
index 0000000..52eece7
--- /dev/null
+++ b/manual/plugins/images/ss-robotfindskitten-240x320x16.png
Binary files differ
diff --git a/manual/plugins/images/ss-robotfindskitten-320x240x16.png b/manual/plugins/images/ss-robotfindskitten-320x240x16.png
new file mode 100644
index 0000000..1239b87
--- /dev/null
+++ b/manual/plugins/images/ss-robotfindskitten-320x240x16.png
Binary files differ
diff --git a/manual/plugins/main.tex b/manual/plugins/main.tex
index f1aa7c5..5a62138 100644
--- a/manual/plugins/main.tex
+++ b/manual/plugins/main.tex
@@ -42,6 +42,8 @@
\opt{HAVE_LCD_BITMAP}{\input{plugins/pong.tex}}
+\opt{HAVE_LCD_BITMAP}{\input{plugins/robotfindskitten.tex}}
+
{\input{plugins/rockblox.tex}}
\opt{HAVE_LCD_BITMAP}{\input{plugins/sliding.tex}}
diff --git a/manual/plugins/robotfindskitten.tex b/manual/plugins/robotfindskitten.tex
new file mode 100644
index 0000000..2a53584
--- /dev/null
+++ b/manual/plugins/robotfindskitten.tex
@@ -0,0 +1,21 @@
+% $Id: robotfindskitten.tex 14738 2007-09-17 21:47:48Z rasher $ %
+\subsection{Robotfindskitten}
+\screenshot{plugins/images/ss-robotfindskitten}{Robotfindskitten}{img:robotfindskitten}
+In this game, you are robot (\#). Your job is to find kitten. This task
+is complicated by the existence of various things which are not kitten.
+Robot must touch items to determine if they are kitten or not. The game
+ends when robotfindskitten.
+
+\begin{table}
+\begin{btnmap}{}{}
+ \opt{IPOD_4G_PAD,IPOD_3G_PAD}{\ButtonMenu, \ButtonPlay,}
+ \opt{IRIVER_H100_PAD,IRIVER_H300_PAD,IAUDIO_X5_PAD,SANSA_E200_PAD,RECORDER_PAD,ONDIO_PAD,GIGABEAT_PAD}{\ButtonUp, \ButtonDown,}%
+ \opt{IRIVER_H10_PAD}{\ButtonScrollUp, \ButtonScrollDown,}
+ \ButtonLeft, \ButtonRight
+ & Move robot\\
+ \opt{IRIVER_H100_PAD,IRIVER_H300_PAD,RECORDER_PAD,ONDIO_PAD}{\ButtonOff}
+ \opt{IPOD_4G_PAD,IPOD_3G_PAD}{\ButtonSelect+\ButtonMenu}
+ \opt{IAUDIO_X5_PAD,IRIVER_H10_PAD,SANSA_E200_PAD,GIGABEAT_PAD}{\ButtonPower}
+ & Quit\\
+\end{btnmap}
+\end{table}