dslinux/user/pixil/apps/games/minesweep Makefile mine.xpm minesweep.c minesweep.h
amadeus
dslinux_amadeus at user.in-berlin.de
Tue Oct 3 13:24:36 CEST 2006
Update of /cvsroot/dslinux/dslinux/user/pixil/apps/games/minesweep
In directory antilope:/tmp/cvs-serv11916/apps/games/minesweep
Added Files:
Makefile mine.xpm minesweep.c minesweep.h
Log Message:
adding pristine copy of pixil to HEAD so I can branch from it
--- NEW FILE: minesweep.c ---
/*
* Copyright (c) 2003 Century Software, Inc. All Rights Reserved.
*
* This file is part of the PIXIL Operating Environment
*
* The use, copying and distribution of this file is governed by one
* of two licenses, the PIXIL Commercial License, or the GNU General
* Public License, version 2.
*
* Licensees holding a valid PIXIL Commercial License may use this file
* in accordance with the PIXIL Commercial License Agreement provided
* with the Software. Others are governed under the terms of the GNU
* General Public License version 2.
*
* This file may be distributed and/or modified under the terms of the
* GNU General Public License version 2 as published by the Free
* Software Foundation and appearing in the file LICENSE.GPL included
* in the packaging of this file.
*
* This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING
* THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A
* PARTICULAR PURPOSE.
*
* RESTRICTED RIGHTS LEGEND
*
* Use, duplication, or disclosure by the government is subject to
* restriction as set forth in paragraph (b)(3)(b) of the Rights in
* Technical Data and Computer Software clause in DAR 7-104.9(a).
*
* See http://www.pixil.org/gpl/ for GPL licensing
* information.
*
* See http://www.pixil.org/license.html or
* email cetsales at centurysoftware.com for information about the PIXIL
* Commercial License Agreement, or if any conditions of this licensing
* are not clear to you.
*/
#include <pixil_config.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <getopt.h>
#include <nano-X.h>
#include <nxcolors.h>
#include <unistd.h>
#ifdef CONFIG_PAR
#include <par/par.h>
#endif
#include "minesweep.h"
#define WM_PROPS (GR_WM_PROPS_MAXIMIZE | GR_WM_PROPS_BORDER |\
GR_WM_PROPS_CAPTION |\
GR_WM_PROPS_CLOSEBOX)
/* The actual playing field */
static unsigned char minefield[14][14];
/* Various pixmaps and windows */
static GR_WINDOW_ID main_wid, minefield_wid, button_wid, scores_wid;
static GR_WINDOW_ID minefield_pixmap = 0, tileset_pixmap = 0;
/* Global variables */
static GR_FONT_ID g_font;
static int g_width, g_height, g_bombs;
/* The game info structure */
struct
{
unsigned char state;
unsigned char flags_set;
unsigned char tiles_cleared;
int start_time;
int timer;
}
game_info;
/* The number colors will alternate between these three colors */
static GR_COLOR text_colors[3] =
{ GR_COLOR_BLUE, GR_COLOR_GREEN, GR_COLOR_RED };
#define KEY_UP 0x01
static unsigned short g_keyflags = 0;
typedef struct
{
unsigned long date;
int seconds;
}
score_t;
static score_t g_scores[10];
struct
{
char str[25];
GR_WINDOW_ID wid;
}
menus[] =
{
{
"Scores", 0}
,
/* { "Difficulty", 0 }, */
{
"", 0}
};
/* Advance declarations */
void start_game(void);
void clear_tile(int x, int y);
void draw_button(int state);
/* Read the top 10 high scores from the file */
void
load_scores(char *filename, score_t * scores)
{
int i = 0;
FILE *stream = fopen(filename, "r");
if (!stream)
return;
for (i = 0; i < 10; i++)
fscanf(stream, "%ld %d\n", &scores[i].date, &scores[i].seconds);
fclose(stream);
}
void
save_scores(char *filename, score_t * scores)
{
int i = 0;
FILE *stream = fopen(filename, "w+");
if (!stream)
return;
for (i = 0; i < 10; i++)
fprintf(stream, "%ld %d\n", scores[i].date, scores[i].seconds);
fclose(stream);
}
void
draw_scores(void)
{
int ypos = 25;
int i = 0;
GR_GC_ID gc = GrNewGC();
GrSetGCFont(gc, g_font);
GrSetGCForeground(gc, GR_COLOR_BLACK);
GrSetGCBackground(gc, GR_COLOR_WHITE);
GrText(scores_wid, gc, 5, 5, "Minesweeper High Scores", -1, GR_TFTOP);
for (i = 0; i < 10; i++, ypos += 15) {
char str[50];
char *ptr = str;
if (i < 9)
ptr += sprintf(ptr, " %d. ", i + 1);
else
ptr += sprintf(ptr, "%d. ", i + 1);
GrText(scores_wid, gc, 10, ypos, str, -1, GR_TFTOP);
ptr = str;
if (g_scores[i].seconds) {
struct tm *tm = localtime(&g_scores[i].date);
ptr += sprintf(ptr, "%2.2d/%2.2d/%2.2d %2.2d:%2.2d",
tm->tm_mon + 1, tm->tm_mday,
(tm->tm_year + 1900) % 1000, tm->tm_hour,
tm->tm_min);
ptr += sprintf(ptr, " %2.2d:%2.2d",
g_scores[i].seconds / 60,
g_scores[i].seconds % 60);
} else
ptr += sprintf(ptr, "---------- --:--");
GrText(scores_wid, gc, 30, ypos, str, -1, GR_TFTOP);
}
ypos += 15;
GrText(scores_wid, gc, 5, ypos, "Click the window to close...", -1,
GR_TFTOP);
GrDestroyGC(gc);
}
void
show_scores(void)
{
if (!scores_wid) {
scores_wid =
GrNewWindowEx(GR_WM_PROPS_NODECORATE, "Scores", main_wid, 0, 0,
240, 300, GR_COLOR_WHITE);
GrSelectEvents(scores_wid,
GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_BUTTON_DOWN);
}
GrMapWindow(scores_wid);
}
void
load_tileset(char *filename)
{
GR_GC_ID gc = GrNewGC();
char path[256];
#ifdef CONFIG_PAR
db_handle *par_db = db_openDB(db_getDefaultDB(), PAR_DB_MODE_RDONLY);
if (par_db) {
par_getScreentopDir(par_db, "icondir", path, sizeof(path) - 1);
db_closeDB(par_db);
strcat(path, "/");
strcat(path, filename);
} else
#endif
{
getcwd(path, sizeof(path));
strcat(path, "/");
strcat(path, filename);
}
/* Create the pixmap if needed */
if (!tileset_pixmap)
tileset_pixmap = GrNewPixmap(TILE_WIDTH * 6,
TILE_HEIGHT + BUTTON_HEIGHT, 0);
/* Load the image directly from the file */
printf("Trying to draw the image from %s\n", path);
GrDrawImageFromFile(tileset_pixmap, gc, 0, 0, -1, -1, path, 0);
GrDestroyGC(gc);
}
void
init_field(void)
{
int i, x, y;
int field_size = g_height * g_width;
/* Reset each tile to be bomb free and regular */
for (y = 0; y < g_height; y++)
for (x = 0; x < g_width; x++) {
minefield[y][x] = 0;
SET_TILE(minefield[y][x], TILE_REGULAR);
}
/* Add the given number of bombs to the field */
for (i = 0; i < g_bombs; i++) {
int pos;
do
pos = rand() % field_size;
while ((minefield[pos / g_height][pos % g_width]) & BOMB_FLAG);
minefield[pos / g_height][pos % g_width] |= BOMB_FLAG;
}
}
void
draw_menus(void)
{
int mx = 5;
int i = 0;
GR_GC_ID gc = GrNewGC();
GrSetGCForeground(gc, GR_COLOR_BLACK);
GrSetGCBackground(gc, GR_COLOR_WHITE);
GrSetGCFont(gc, g_font);
while (strlen(menus[i].str)) {
int tw, th, tb;
GrGetGCTextSize(gc, menus[i].str, -1, GR_TFTOP, &tw, &th, &tb);
GrText(main_wid, gc, mx, 5, menus[i].str, -1, GR_TFTOP);
GrLine(main_wid, gc, mx, 6 + tb, mx + tw, 6 + tb);
if (!menus[i].wid) {
menus[i].wid = GrNewInputWindow(main_wid, mx, 5, tw, th);
GrSelectEvents(menus[i].wid, GR_EVENT_MASK_BUTTON_DOWN);
GrMapWindow(menus[i].wid);
}
mx += (tw + 10);
i++;
}
}
/* Draw the main window */
void
draw_main(void)
{
char flagstr[32];
char timestr[32];
int w = (240 - TILE_WIDTH * g_width) / 2;
int h =
((300 - TILE_HEIGHT * g_height) / 2) + (TILE_HEIGHT * g_height) + 5;
int tw, th, tb;
GR_GC_ID gc = GrNewGC();
GrSetGCForeground(gc, GR_COLOR_BLACK);
GrSetGCBackground(gc, GR_COLOR_WHITE);
GrSetGCFont(gc, g_font);
sprintf(flagstr, "Flags: %2.2d/%2.2d", game_info.flags_set, g_bombs);
GrText(main_wid, gc, w, h, flagstr, -1, GR_TFTOP);
sprintf(timestr, "Time: %2.2d:%2.2d",
game_info.timer / 60, game_info.timer % 60);
GrGetGCTextSize(gc, timestr, -1, GR_TFTOP, &tw, &th, &tb);
GrText(main_wid, gc, w + (TILE_WIDTH * g_width) - tw, h,
timestr, -1, GR_TFTOP);
GrDestroyGC(gc);
draw_menus();
}
void
draw_tile(int tile, int x, int y)
{
GR_GC_ID gc = GrNewGC();
GrCopyArea(minefield_pixmap, gc, (x * TILE_WIDTH), (y * TILE_HEIGHT),
TILE_WIDTH, TILE_HEIGHT, tileset_pixmap,
(tile - 1) * TILE_WIDTH, 0, MWROP_SRCCOPY);
GrDestroyGC(gc);
}
int
check_neighbors(int x, int y)
{
int count = 0;
if (x > 0) {
if (minefield[y][x - 1] & BOMB_FLAG)
count++;
if (y > 0)
if (minefield[y - 1][x - 1] & BOMB_FLAG)
count++;
if (y < (g_height) - 1)
if (minefield[y + 1][x - 1] & BOMB_FLAG)
count++;
}
if (x < (g_width) - 1) {
if (minefield[y][x + 1] & BOMB_FLAG)
count++;
if (y > 0)
if (minefield[y - 1][x + 1] & BOMB_FLAG)
count++;
if (y < (g_height) - 1)
if (minefield[y + 1][x + 1] & BOMB_FLAG)
count++;
}
if (y > 0)
if (minefield[y - 1][x] & BOMB_FLAG)
count++;
if (y < (g_height) - 1)
if (minefield[y + 1][x] & BOMB_FLAG)
count++;
return (count);
}
void
clear_neighbors(int x, int y)
{
if (x > 0) {
clear_tile(x - 1, y);
if (y > 0)
clear_tile(x - 1, y - 1);
if (y < g_height - 1)
clear_tile(x - 1, y + 1);
}
if (x < g_width - 1) {
clear_tile(x + 1, y);
if (y > 0)
clear_tile(x + 1, y - 1);
if (y < g_height - 1)
clear_tile(x + 1, y + 1);
}
if (y > 0)
clear_tile(x, y - 1);
if (y < g_height - 1)
clear_tile(x, y + 1);
}
void
draw_empty(int x, int y)
{
int count;
GR_GC_ID gc = GrNewGC();
GrSetGCForeground(gc, GR_RGB(0xC5, 0xC2, 0xC5));
draw_tile(TILE_DEPRESSED, x, y);
/* GrFillRect(minefield_pixmap, gc,
(x * TILE_WIDTH), (y * TILE_HEIGHT),
TILE_WIDTH, TILE_HEIGHT); */
count = check_neighbors(x, y);
/* If there are bombs around us, then print how many there are */
if (count) {
char ch;
int w, h, b;
GrSetGCForeground(gc, text_colors[count % 3]);
GrSetGCUseBackground(gc, 0);
GrSetGCFont(gc, g_font);
ch = 48 + count;
GrGetGCTextSize(gc, &ch, 1, GR_TFTOP, &w, &h, &b);
GrText(minefield_pixmap, gc,
(x * TILE_WIDTH) + ((TILE_WIDTH - w) / 2),
(y * TILE_HEIGHT) + ((TILE_HEIGHT - h) / 2), &ch, 1, GR_TFTOP);
}
GrDestroyGC(gc);
}
void
draw_field(void)
{
int x, y;
GR_GC_ID gc = GrNewGC();
for (y = 0; y < g_height; y++) {
for (x = 0; x < g_width; x++) {
switch (GET_TILE(minefield[y][x])) {
case TILE_REGULAR:
case TILE_BOMB:
case TILE_FLAG:
case TILE_WRONG:
draw_tile(GET_TILE(minefield[y][x]), x, y);
break;
case TILE_EMPTY:
draw_empty(x, y);
break;
}
}
}
GrCopyArea(minefield_wid, gc, 0, 0,
TILE_WIDTH * g_width,
TILE_HEIGHT * g_height, minefield_pixmap, 0, 0, MWROP_SRCCOPY);
GrDestroyGC(gc);
}
void
set_bomb(int x, int y)
{
CLEAR_TILE(minefield[y][x]);
SET_TILE(minefield[y][x], TILE_BOMB);
}
void
set_wrong(int x, int y)
{
CLEAR_TILE(minefield[y][x]);
SET_TILE(minefield[y][x], TILE_WRONG);
}
void
set_empty(int x, int y)
{
CLEAR_TILE(minefield[y][x]);
SET_TILE(minefield[y][x], TILE_EMPTY);
game_info.tiles_cleared++;
}
void
clear_tile(int x, int y)
{
/* Only proceed if this tile has been unchecked */
if (GET_TILE(minefield[y][x]) == TILE_EMPTY ||
GET_TILE(minefield[y][x]) == TILE_FLAG)
return;
/* If this tile is hiding a bomb, then return */
if (minefield[y][x] & BOMB_FLAG)
return;
set_empty(x, y);
if (check_neighbors(x, y) != 0)
return;
/* Otherwise, see if we can't clear our any of our neighbors too */
clear_neighbors(x, y);
}
int
is_bomb(int x, int y)
{
if (minefield[y][x] & BOMB_FLAG)
if (GET_TILE(minefield[y][x]) != TILE_FLAG)
return (1);
return (0);
}
/* Immediately set the user up as teh winner */
void
handle_cheat(void)
{
int r, s;
game_info.tiles_cleared = 0;
game_info.flags_set = 0;
for (r = 0; r < g_height; r++)
for (s = 0; s < g_width; s++) {
if (minefield[r][s] & BOMB_FLAG) {
CLEAR_TILE(minefield[r][s]);
SET_TILE(minefield[r][s], TILE_FLAG);
game_info.flags_set++;
} else {
CLEAR_TILE(minefield[r][s]);
SET_TILE(minefield[r][s], TILE_EMPTY);
game_info.tiles_cleared++;
}
}
draw_field();
}
void
handle_minefield_down(GR_EVENT_BUTTON * button)
{
int x = button->x / TILE_WIDTH;
int y = button->y / TILE_HEIGHT;
if (game_info.state == GAME_OVER)
return;
/* On the X86 demo, we use a right button press here, otherwise,
on the PDAs, we use the key */
#ifdef CONFIG_PLATFORM_X86DEMO
if (button->buttons & MWBUTTON_R)
#else
if ((g_keyflags & KEY_UP) == KEY_UP)
#endif
{
switch (GET_TILE(minefield[y][x])) {
case TILE_REGULAR:
if (game_info.flags_set == g_bombs)
return;
CLEAR_TILE(minefield[y][x]);
SET_TILE(minefield[y][x], TILE_FLAG);
game_info.flags_set++;
break;
case TILE_FLAG:
CLEAR_TILE(minefield[y][x]);
SET_TILE(minefield[y][x], TILE_REGULAR);
game_info.flags_set--;
break;
default:
break;
}
} else {
if (GET_TILE(minefield[y][x]) == TILE_EMPTY) {
int bcount = 0;
if (x > 0) {
bcount += is_bomb(x - 1, y);
if (y > 0)
bcount += is_bomb(x - 1, y - 1);
if (y < g_height - 1)
bcount += is_bomb(x - 1, y + 1);
}
if (x < g_width - 1) {
bcount += is_bomb(x + 1, y);
if (y > 0)
bcount += is_bomb(x + 1, y - 1);
if (y < g_height - 1)
bcount += is_bomb(x + 1, y + 1);
}
if (y > 0)
bcount += is_bomb(x, y - 1);
if (y < g_height - 1)
bcount += is_bomb(x, y + 1);
if (!bcount)
clear_neighbors(x, y);
} else {
if (GET_TILE(minefield[y][x]) == TILE_FLAG)
goto dofield;
if (minefield[y][x] & BOMB_FLAG) {
int r, s;
game_info.state = GAME_OVER;
for (r = 0; r < g_height; r++)
for (s = 0; s < g_width; s++) {
if (minefield[r][s] & BOMB_FLAG) {
if (GET_TILE(minefield[r][s]) != TILE_FLAG)
set_bomb(s, r);
} else {
if (GET_TILE(minefield[r][s]) == TILE_FLAG)
set_wrong(s, r);
}
}
draw_button(BUTTON_WRONG);
} else
clear_tile(x, y);
}
}
dofield:
/* Start the timer if the game is active */
if (game_info.state == GAME_START) {
game_info.state = GAME_ACTIVE;
game_info.start_time = time(0);
}
draw_field();
}
void
draw_button(int state)
{
GR_GC_ID gc = GrNewGC();
GrCopyArea(button_wid, gc, 0, 0,
BUTTON_WIDTH, BUTTON_HEIGHT, tileset_pixmap,
(state * BUTTON_WIDTH), TILE_HEIGHT, MWROP_SRCCOPY);
GrDestroyGC(gc);
}
void
handle_button(GR_EVENT_BUTTON * button, int state)
{
draw_button(state);
if (state == 1) {
start_game();
draw_field();
}
}
void
start_game(void)
{
time_t val = time(0);
/* Reseed the randomizer */
srand(val);
/* Initalize the mine field */
init_field();
/* Set some variables */
game_info.flags_set = 0;
game_info.tiles_cleared = 0;
game_info.timer = 0;
game_info.start_time = 0;
game_info.state = GAME_START;
}
int
main(int argc, char **argv)
{
int w, h;
/* The default game width and height */
g_width = g_height = 10;
g_bombs = 0;
while (1) {
signed char ch = getopt(argc, argv, "w:h:b:");
if (ch == -1)
break;
switch (ch) {
case 'w':
g_width = atoi(optarg);
if (g_width > 14)
g_width = 14;
if (g_width < 7)
g_width = 7;
break;
case 'h':
g_height = atoi(optarg);
if (g_height > 14)
g_height = 14;
if (g_height < 7)
g_height = 7;
break;
case 'b':
g_bombs = atoi(optarg);
break;
}
}
/* Load the high scores from the list */
bzero(g_scores, sizeof(g_scores));
load_scores("/tmp/scores", g_scores);
/* Set the number of bombs */
if (!g_bombs)
g_bombs = ((g_width * g_height) / 5);
else if (g_bombs < 5)
g_bombs = 5;
else if (g_bombs > ((g_width * g_height) - 1))
g_bombs = (g_width * g_height) - 1;
if (GrOpen() == -1) {
fprintf(stderr, "Error - Unable to open the graphics engine\n");
exit(-1);
}
g_font = GrCreateFont(GR_FONT_GUI_VAR, 0, 0);
load_tileset("mine.xpm");
/* Initalize the field */
start_game();
/* Creat the main container window */
main_wid =
GrNewWindowEx(WM_PROPS, "Minesweeper", GR_ROOT_WINDOW_ID, 0, 0, 240,
300, 0xFFFFFFFF);
GrSelectEvents(main_wid,
GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_KEY_DOWN |
GR_EVENT_MASK_KEY_UP | GR_EVENT_MASK_CLOSE_REQ);
/* Make the minefield */
w = (240 - TILE_WIDTH * g_width) / 2;
h = (300 - TILE_HEIGHT * g_height) / 2;
minefield_wid = GrNewWindow(main_wid, w, h,
TILE_WIDTH * g_width,
TILE_HEIGHT * g_height,
0, GR_RGB(0xD5, 0xD6, 0xD5), 0);
GrSelectEvents(minefield_wid,
GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_BUTTON_DOWN);
minefield_pixmap = GrNewPixmap(TILE_WIDTH * g_width,
TILE_HEIGHT * g_height, 0);
/* Finally, create the button that we use for game control */
button_wid = GrNewWindow(main_wid, (240 - BUTTON_WIDTH) / 2,
h - (5 + BUTTON_HEIGHT),
BUTTON_WIDTH, BUTTON_HEIGHT, 0, 0, 0);
GrSelectEvents(button_wid,
GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_BUTTON_DOWN |
GR_EVENT_MASK_BUTTON_UP);
GrMapWindow(main_wid);
GrMapWindow(button_wid);
GrMapWindow(minefield_wid);
while (1) {
GR_EVENT event;
GrGetNextEventTimeout(&event, 1000L);
switch (event.type) {
case GR_EVENT_TYPE_EXPOSURE:
if (event.exposure.wid == main_wid)
draw_main();
else if (event.exposure.wid == minefield_wid)
draw_field();
else if (event.exposure.wid == button_wid)
draw_button(BUTTON_REGULAR);
else if (event.exposure.wid == scores_wid)
draw_scores();
// else
//draw_dialog();
break;
case GR_EVENT_TYPE_BUTTON_DOWN:
if (event.button.wid == button_wid)
handle_button(&event.button, BUTTON_WRONG);
else if (event.button.wid == minefield_wid)
handle_minefield_down(&event.button);
else if (event.button.wid == scores_wid)
GrUnmapWindow(scores_wid);
else if (event.button.wid == menus[0].wid)
show_scores();
// else
// dialog_handle_keystroke();
break;
case GR_EVENT_TYPE_BUTTON_UP:
if (event.button.wid == button_wid)
handle_button(&event.button, BUTTON_REGULAR);
break;
case GR_EVENT_TYPE_KEY_DOWN: {
int togglekey = MWKEY_UP;
/* Use the UP key to toggle the flag on the Ipaq */
#ifdef CONFIG_PLATFORM_IPAQ
togglekey = MWKEY_UP;
#endif
/* Use the accpet key to toggle the flag on the Zaurus */
#ifdef CONFIG_PLATFORM_ZAURUS
togglekey = ' ';
#endif
if (event.keystroke.wid == main_wid) {
if (event.keystroke.ch == togglekey)
g_keyflags |= KEY_UP;
if (event.keystroke.ch == 'c')
handle_cheat();
}
}
break;
case GR_EVENT_TYPE_KEY_UP: {
int togglekey = MWKEY_UP;
/* Use the UP key to toggle the flag on the Ipaq */
#ifdef CONFIG_PLATFORM_IPAQ
togglekey = MWKEY_UP;
#endif
/* Use the accpet key to toggle the flag on the Zaurus */
#ifdef CONFIG_PLATFORM_ZAURUS
togglekey = ' ';
#endif
if (event.keystroke.ch == togglekey)
g_keyflags &= ~(KEY_UP);
}
break;
case GR_EVENT_TYPE_TIMEOUT:
break;
case GR_EVENT_TYPE_CLOSE_REQ:
exit(0);
}
if (game_info.state == GAME_ACTIVE) {
int i;
int elapsed = time(0) - game_info.start_time;
if (((g_width * g_height) - g_bombs) == game_info.tiles_cleared) {
game_info.state = GAME_OVER;
draw_button(BUTTON_WON);
/* Check to see if we have a high score */
for (i = 0; i < 10; i++) {
int t;
if (!g_scores[i].seconds || g_scores[i].seconds > elapsed) {
for (t = 9; t >= (i + 1); t--) {
g_scores[t].seconds = g_scores[t - 1].seconds;
g_scores[t].date = g_scores[t - 1].date;
}
break;
}
}
if (i < 10) {
g_scores[i].seconds = elapsed;
g_scores[i].date = time(0);
save_scores("/tmp/scores", g_scores);
}
//show_name_dialog();
} else
game_info.timer = time(0) - game_info.start_time;
}
draw_main();
}
}
--- NEW FILE: minesweep.h ---
/*
* Copyright (c) 2003 Century Software, Inc. All Rights Reserved.
*
* This file is part of the PIXIL Operating Environment
*
* The use, copying and distribution of this file is governed by one
* of two licenses, the PIXIL Commercial License, or the GNU General
* Public License, version 2.
*
* Licensees holding a valid PIXIL Commercial License may use this file
* in accordance with the PIXIL Commercial License Agreement provided
* with the Software. Others are governed under the terms of the GNU
* General Public License version 2.
*
* This file may be distributed and/or modified under the terms of the
* GNU General Public License version 2 as published by the Free
* Software Foundation and appearing in the file LICENSE.GPL included
* in the packaging of this file.
*
* This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING
* THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A
* PARTICULAR PURPOSE.
*
* RESTRICTED RIGHTS LEGEND
*
* Use, duplication, or disclosure by the government is subject to
* restriction as set forth in paragraph (b)(3)(b) of the Rights in
* Technical Data and Computer Software clause in DAR 7-104.9(a).
*
* See http://www.pixil.org/gpl/ for GPL licensing
* information.
*
* See http://www.pixil.org/license.html or
* email cetsales at centurysoftware.com for information about the PIXIL
* Commercial License Agreement, or if any conditions of this licensing
* are not clear to you.
*/
#ifndef _MINESWEEP_H_
#define _MINESWEEP_H_
#define VERT_SIZE 12
#define HORIZ_SIZE 12
#define BOMB_COUNT 28
#define TILE_COUNT 3
#define TILE_WIDTH 17
#define TILE_HEIGHT 17
#define BUTTON_WIDTH 34
#define BUTTON_HEIGHT 34
#define BOMB_FLAG 0x01
/* Tile definitions */
#define TILE_EMPTY 0x0
#define TILE_REGULAR 0x1
#define TILE_DEPRESSED 0x2
#define TILE_FLAG 0x3
#define TILE_BOMB 0x4
#define TILE_WRONG 0x5
#define TILE_MASK 0xF
#define BUTTON_REGULAR 0
#define BUTTON_WRONG 1
#define BUTTON_WON 2
/* Tile managment macros */
#define GET_TILE(val) ((val & 0xF0) >> 4)
#define SET_TILE(val, tile) (val |= (tile << 4))
#define CLEAR_TILE(val) (val &= ~(TILE_MASK << 4))
/* Game States */
#define GAME_OVER 0
#define GAME_START 1
#define GAME_ACTIVE 2
#endif
--- NEW FILE: Makefile ---
#games/minesweep/Makefile
TARGET=minesweep
OBJS=minesweep.o
LIBS+=-lnano-X
ifeq ($(CONFIG_PAR),y)
LIBS+=-lpar
endif
INSTALL_EXTRAS=inst-mine
include $(BASE_DIR)/Rules.make
inst-mine:
mkdir -p $(INSTALL_DIR)/share/images/
cp mine.xpm $(INSTALL_DIR)/share/images/
--- NEW FILE: mine.xpm ---
/* XPM */
static char * mine2_xpm[] = {
"102 51 365 2",
" c None",
". c #FFFFFF",
"+ c #78C9E4",
"@ c #81CDE6",
"# c #6AC3E1",
"$ c #59BDDE",
"% c #46B5DA",
"& c #3BB1D8",
"* c #31ADD6",
"= c #26A6D1",
"- c #1C9CC7",
"; c #1094C0",
"> c #666666",
", c #5C5C5C",
"' c #757575",
") c #858585",
"! c #8D8D8D",
"~ c #999999",
"{ c #F3F3F3",
"] c #B9B9B9",
"^ c #ACACAC",
"/ c #E9E9E9",
"( c #0099CC",
"_ c #0889B4",
": c #BEBEBE",
"< c #A5A5A5",
"[ c #D7D7D7",
"} c #CCCCCC",
"| c #8E8E8E",
"1 c #7D7D7D",
"2 c #DCDCDC",
"3 c #FF0808",
"4 c #FFD5D5",
"5 c #007DA7",
"6 c #B4B4B4",
"7 c #EBEBEB",
"8 c #5B5B5B",
"9 c #001607",
"0 c #767676",
"a c #EFEFEF",
"b c #FF0000",
"c c #FF3333",
"d c #00759C",
"e c #C3C3C3",
"f c #001E0A",
"g c #004116",
"h c #007126",
"i c #00280D",
"j c #3B3B3B",
"k c #4D4D4D",
"l c #D3D3D3",
"m c #FFC2C2",
"n c #FF1919",
"o c #F92828",
"p c #002C0F",
"q c #006A8D",
"r c #E7E7E7",
"s c #868686",
"t c #1D1D1D",
"u c #005D1F",
"v c #008D2F",
"w c #009933",
"x c #00822B",
"y c #434343",
"z c #F7F7F7",
"A c #333333",
"B c #E1E1E1",
"C c #AE5A5A",
"D c #BC1808",
"E c #13862C",
"F c #444444",
"G c #004C19",
"H c #006120",
"I c #424242",
"J c #0F0F0F",
"K c #1A1A1A",
"L c #595959",
"M c #774517",
"N c #A13813",
"O c #005F20",
"P c #4C4C4C",
"Q c #007E2A",
"R c #003110",
"S c #B2B2B2",
"T c #848484",
"U c #A8A8A8",
"V c #000000",
"W c #080808",
"X c #7D4E1A",
"Y c #DBDBDB",
"Z c #000803",
"` c #515151",
" . c #8F8F8F",
".. c #A2230C",
"+. c #770402",
"@. c #3A3A3A",
"#. c #756262",
"$. c #BC0B03",
"%. c #FFACAC",
"&. c #D90D0D",
"*. c #1E1E1E",
"=. c #613B3B",
"-. c #FFB3B3",
";. c #3AB0D8",
">. c #3D3D3D",
",. c #FFECEC",
"'. c #006283",
"). c #005C7A",
"!. c #A7A7A7",
"~. c #004C66",
"{. c #00526D",
"]. c #E1F3F9",
"^. c #C6E8F4",
"/. c #A5DBED",
"(. c #93D4E9",
"_. c #7DCBE5",
":. c #72C7E3",
"<. c #8BD0E8",
"[. c #ADDEEF",
"}. c #E4F4FA",
"|. c #A3DAED",
"1. c #E0F3F9",
"2. c #D7EFF7",
"3. c #9DD8EC",
"4. c #65C2E0",
"5. c #5ABDDE",
"6. c #BCE4F2",
"7. c #A1D9EC",
"8. c #85CEE7",
"9. c #79C9E4",
"0. c #51B9DC",
"a. c #61C0DF",
"b. c #B3E1F0",
"c. c #54BBDD",
"d. c #49B6DB",
"e. c #3CB1D8",
"f. c #B2E0F0",
"g. c #43B4D9",
"h. c #F1F9FC",
"i. c #39ADD4",
"j. c #2BAAD5",
"k. c #CFECF5",
"l. c #21A6D3",
"m. c #30ACD6",
"n. c #19A3D1",
"o. c #29A9D4",
"p. c #4EB6D8",
"q. c #18A3D1",
"r. c #F0F6F8",
"s. c #2AA9D4",
"t. c #8DAEB9",
"u. c #7A8588",
"v. c #ADACAB",
"w. c #6293A3",
"x. c #4F727E",
"y. c #5597AC",
"z. c #089CCE",
"A. c #AED3E0",
"B. c #78888C",
"C. c #6F787B",
"D. c #92918F",
"E. c #D6DCDE",
"F. c #82B9CB",
"G. c #507580",
"H. c #43656F",
"I. c #90A7AE",
"J. c #ABAAAA",
"K. c #4F7B88",
"L. c #878684",
"M. c #505452",
"N. c #F1F1F1",
"O. c #9BD1E3",
"P. c #2F3B3E",
"Q. c #555858",
"R. c #3A5F69",
"S. c #98C2D0",
"T. c #22211F",
"U. c #8D8B8A",
"V. c #AEADAC",
"W. c #7B7B7A",
"X. c #5B5957",
"Y. c #B5B4B3",
"Z. c #759CA8",
"`. c #4D5455",
" + c #242929",
".+ c #48A4C2",
"++ c #ABD9E8",
"@+ c #5A5B58",
"#+ c #535353",
"$+ c #43413F",
"%+ c #41646E",
"&+ c #6A838A",
"*+ c #807E7C",
"=+ c #DFF0F6",
"-+ c #4A5B5F",
";+ c #3F798B",
">+ c #0093C4",
",+ c #CFE9F2",
"'+ c #93C9DA",
")+ c #C6C5C4",
"!+ c #4A4A48",
"~+ c #3C5258",
"{+ c #3EAACD",
"]+ c #637A80",
"^+ c #C5C4C4",
"/+ c #484848",
"(+ c #ABB6BA",
"_+ c #C0D4D9",
":+ c #A0C5D1",
"<+ c #80A3AF",
"[+ c #407483",
"}+ c #434A4A",
"|+ c #E5E5E5",
"1+ c #464543",
"2+ c #BFD4DC",
"3+ c #8DB2BF",
"4+ c #494F50",
"5+ c #3A4B50",
"6+ c #13A1D0",
"7+ c #6E96A3",
"8+ c #6E6F6E",
"9+ c #52666B",
"0+ c #32839E",
"a+ c #80C4DB",
"b+ c #43595F",
"c+ c #292929",
"d+ c #191817",
"e+ c #222222",
"f+ c #829BA3",
"g+ c #192020",
"h+ c #184C5B",
"i+ c #80C5DD",
"j+ c #79ACBC",
"k+ c #797776",
"l+ c #85989E",
"m+ c #309FC4",
"n+ c #40A5C7",
"o+ c #637B81",
"p+ c #A6A6A6",
"q+ c #282623",
"r+ c #949391",
"s+ c #1C1A18",
"t+ c #2B6C81",
"u+ c #EDEDEC",
"v+ c #0D0B0A",
"w+ c #898988",
"x+ c #2E4950",
"y+ c #2A5A6A",
"z+ c #16637D",
"A+ c #057296",
"B+ c #3D9AB9",
"C+ c #71A6B7",
"D+ c #608895",
"E+ c #505758",
"F+ c #2C8FB0",
"G+ c #109FCF",
"H+ c #008CBB",
"I+ c #2093BA",
"J+ c #4C6A73",
"K+ c #394041",
"L+ c #2B6375",
"M+ c #008DBC",
"N+ c #5593A7",
"O+ c #25363A",
"P+ c #777777",
"Q+ c #0A0808",
"R+ c #19363E",
"S+ c #127393",
"T+ c #1E7592",
"U+ c #80B5C7",
"V+ c #0183AE",
"W+ c #56818F",
"X+ c #267792",
"Y+ c #0082AE",
"Z+ c #536E77",
"`+ c #008BBA",
" @ c #017FAA",
".@ c #B3B3B3",
"+@ c #262421",
"@@ c #6DBDD7",
"#@ c #23201E",
"$@ c #0089B6",
"%@ c #007FA9",
"&@ c #70B8D0",
"*@ c #46565A",
"=@ c #9CD4E6",
"-@ c #28A1C9",
";@ c #018AB7",
">@ c #86B6C5",
",@ c #73A9BB",
"'@ c #60A3B9",
")@ c #1B1917",
"!@ c #4D8294",
"~@ c #007BA5",
"{@ c #2086A8",
"]@ c #58B3D1",
"^@ c #182B2F",
"/@ c #0F9DCC",
"(@ c #0084B0",
"_@ c #5D9AAE",
":@ c #386370",
"<@ c #3087A4",
"[@ c #397284",
"}@ c #2E5C6A",
"|@ c #68BBD6",
"1@ c #3C6876",
"2@ c #1C6F8A",
"3@ c #2284A4",
"4@ c #0087B4",
"5@ c #4094B0",
"6@ c #358EAB",
"7@ c #508494",
"8@ c #4AA3BF",
"9@ c #2E85A1",
"0@ c #317A92",
"a@ c #2997BB",
"b@ c #1184AA",
"c@ c #00749B",
"d@ c #0E556C",
"e@ c #096583",
"f@ c #007096",
"g@ c #D0E4EA",
"h@ c #23454F",
"i@ c #134250",
"j@ c #207E9D",
"k@ c #4DB3D5",
"l@ c #306F82",
"m@ c #113A47",
"n@ c #12313A",
"o@ c #006B8F",
"p@ c #A0C8D5",
"q@ c #1C444F",
"r@ c #274F5B",
"s@ c #216373",
"t@ c #215667",
"u@ c #175163",
"v@ c #1682A7",
"w@ c #2C90B0",
"x@ c #096685",
"y@ c #103B48",
"z@ c #1390BA",
"A@ c #106D8C",
"B@ c #103D4B",
"C@ c #115C75",
"D@ c #183F4B",
"E@ c #249FC8",
"F@ c #B0D1DC",
"G@ c #167493",
"H@ c #1B4C5B",
"I@ c #056585",
"J@ c #158BB2",
"K@ c #147B9C",
"L@ c #174958",
"M@ c #1186AD",
"N@ c #158EB6",
"O@ c #0F7394",
"P@ c #117CA0",
"Q@ c #13789A",
"R@ c #134351",
"S@ c #0D5166",
"T@ c #60B0CB",
"U@ c #F2F2F2",
"V@ c #E6E6E6",
"W@ c #608A99",
"X@ c #7D9197",
". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ",
". + @ # $ % & & & & & & & * = - ; . > , > ' ) ) ) ) ) ) ) ) ! ! ~ ~ . . . . . . . . . . . . . . . . . . . . . . . . . . { ] ~ ^ / . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ",
". @ ( ( ( ( ( ( ( ( ( ( ( ( ( ( _ . , : : : : : : : : : : : : : : < . . . . . . . . . . . . [ } . . . . . . . . . . . . | 1 ^ ~ ' 2 . . . . . . 3 3 4 . . . . . [ } . . . . . . . . . . . . . . . . . . . . ",
". # ( ( ( ( ( ( ( ( ( ( ( ( ( ( 5 . > : : : : : : : : : : : : : : 6 . . . . . . . . . 7 ~ 8 9 0 . . . . . . . . . . . } 1 . . . } a . . . . . . 3 b c 4 . 7 ~ 8 9 0 . . . . . . . . . . . . . . . . . . . . ",
". $ ( ( ( ( ( ( ( ( ( ( ( ( ( ( d . ' : : : : : : : : : : : : : : : . . . . . . . e > f g h i } . . . . . . . . . . } j k l . . . . . . . . . . m n b o > f g h p } . . . . . . . . . . . . . . . . . . . . ",
". % ( ( ( ( ( ( ( ( ( ( ( ( ( ( q . ) : : : : : : : : : : : : : : : . . . . r s t i u v w x y z . . . . . . . . . | j A A A ~ . . . . . . . . . B C b b D E w x F z . . . . . . . . . . . . . . . . . . . . ",
". & ( ( ( ( ( ( ( ( ( ( ( ( ( ( q . ) : : : : : : : : : : : : : : : . . r y f G x w w w w H 0 . . . . . . . . . I A I j J K A L . . . . . . r F f G M b b N w O 0 . . . . . . . . . . . . . . . . . . . . . ",
". & ( ( ( ( ( ( ( ( ( ( ( ( ( ( q . ) : : : : : : : : : : : : : : : . . [ P i G Q w w w w R S . . . . . . . . T A ' U T j V W A ~ . . . . . [ P p G Q X b b X R S . . . . . . . . . . . . . . . . . . . . . ",
". & ( ( ( ( ( ( ( ( ( ( ( ( ( ( q . ) : : : : : : : : : : : : : : : . . . . Y ! y R H v w Z z . . . . . . . . j I U . U ` V V K A . . . . . . . B .F R ..b b +.z . . . . . . . . . . . . . . . . . . . . . ",
". & ( ( ( ( ( ( ( ( ( ( ( ( ( ( q . ) : : : : : : : : : : : : : : : . . . . . . . e > i i @.. . . . . . . . . A j T U T j V V W A . . . . . . . . . . e #.$.b b %.. . . . . . . . . . . . . . . . . . . . . ",
". & ( ( ( ( ( ( ( ( ( ( ( ( ( ( q . ) : : : : : : : : : : : : : : : . . . . . . . . . r y ! . . . . . . . . . A J j ` j W V V J A . . . . . . . . . . . . r &.b n m . . . . . . . . . . . . . . . . . . . . ",
". & ( ( ( ( ( ( ( ( ( ( ( ( ( ( q . ) : : : : : : : : : : : : : : : . . . . . . . . . . y Y . . . . . . . . . A K V V V V V V *.A . . . . . . . . . . . . . =.o 3 -.. . . . . . . . . . . . . . . . . . . . ",
". ;.( ( ( ( ( ( ( ( ( ( ( ( ( ( q . ) : : : : : : : : : : : : : : : . . . . . . . . . 7 @.. . . . . . . . . . ~ A W V V V V J A ~ . . . . . . . . . . . . 7 >.4 m ,.. . . . . . . . . . . . . . . . . . . . ",
". * ( ( ( ( ( ( ( ( ( ( ( ( ( ( '.. ! : : : : : : : : : : : : : : : . . . . . . . . . S > . . . . . . . . . . . L A *.W W *.A L . . . . . . . . . . . . . S > . . . . . . . . . . . . . . . . . . . . . . . ",
". = ( ( ( ( ( ( ( ( ( ( ( ( ( ( ).. ! : : : : : : : : : : : : : : : . . . . . . . . . !.!.. . . . . . . . . . . . ~ A A A A ~ . . . . . . . . . . . . . . !.!.. . . . . . . . . . . . . . . . . . . . . . . ",
". - ( ( ( ( ( ( ( ( ( ( ( ( ( ( ~.. ~ : : : : : : : : : : : : : : : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ",
". ; _ 5 d q q q q q q q q '.).~.{.. < < 6 : : : : : : : : : : : : : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ",
". . . . . . . . . . . ].^./.(._._.:._.<.[.].. . . . . . . . . . . . . . . . . . . . . . . ].^./.(._._.:._.<.[.].. . . . . . . . . . . . . . . . . . . . . . . . }.^.|.(._._.:._.<.[.1.. . . . . . . . . . . ",
". . . . . . . . . 2.3.(.(.(.(.<.<._._.:.4.5.# 6.. . . . . . . . . . . . . . . . . . . 2.3.(.(.(.(.<.<._._.:.4.5.# 6.. . . . . . . . . . . . . . . . . . . . 2.3.(.(.(.(.<.<._._.:.# 5.# 6.. . . . . . . . . ",
". . . . . . . 2.7.7.7.7.7.7.7.7.(.<.8.9.:.4.5.0.5.6.. . . . . . . . . . . . . . . 2.7.7.7.7.7.7.7.7.(.<.8.9.:.4.5.0.5.6.. . . . . . . . . . . . . . . . 2.3.3.3.3.3.3.3.3.(.<.8._.:.a.5.0.5.6.. . . . . . . ",
". . . . . . b.(.3./.[.[.[.[.[./.3.3.<.8.9.# a.c.d.;._.. . . . . . . . . . . . . b.(.3./.[.[.[.[.[./.3.3.<.8.9.# a.c.d.e._.. . . . . . . . . . . . . . f.(.3./.[.[.[.[.[./.3.3.<.8._.# a.c.d.;._.. . . . . . ",
". . . . . 7.(.7.[.[.b.6.6.6.6.[.[.7.(.<._.:.# 5.0.g.;.0.h.. . . . . . . . . . 7.(.7.[.[.b.6.6.6.6.[.[.7.(.<._.:.# 5.0.g.i.0.h.. . . . . . . . . . . |.(.3.[.[.f.6.6.6.6.f.[.3.3.<._.:.# 5.0.g.;.0.h.. . . . ",
". . . . 3.(.3.[.b.6.^.^.^.^.^.6.b.[.3.(.8.9.# a.c.d.;.j.d.. . . . . . . . . 3.(.3.[.b.6.^.^.^.^.^.6.b.[.3.(.8.9.# a.c.d.e.j.d.. . . . . . . . . . 3.(.3.[.f.6.^.^.^.^.^.6.f.[.3.(.8._.# a.c.d.;.j.d.. . . . ",
". . . [.<.(./.[.6.^.k.2.2.2.k.^.6.[./.(.<._.:.4.5.d.;.* l.# . . . . . . . [.<.(./.[.6.^.k.2.2.2.k.^.6.[./.(.<._.:.4.5.d.e.m.l.# . . . . . . . . [.<.(./.f.6.^.k.2.2.2.k.^.6.f./.(.<._.:.a.5.d.;.* l.# . . . ",
". . 2.8.(.3.[.b.^.k.2.].].].2.k.^.b.[.3.(.8.:.# 5.0.g.* l.n.b.. . . . . 2.8.(.3.[.b.^.k.2.].].].2.k.^.b.[.3.(.8.:.# 5.0.g.m.o.n.b.. . . . . . 2.8.(.3.[.f.^.k.2.1.1.1.2.k.^.f.[.3.(.8.:.# 5.p.g.* l.q.f.. . ",
". . <.8.(.7.[.6.^.2.].r.h.h.].2.^.6.[.7.(.8.9.# 5.0.g.* s.n.s.. . . . . <.8.(.7.[.6.^.2.].r.h.h.].2.^.6.[.7.(.8.9.# 5.0.g.m.o.n.o.. . . . . . <.8.(.3.[.6.^.2.1.r.h.h.1.2.^.6.[.3.(.8.:.# 5.0.g.* s.q.s.. . ",
". ^.9.8.(.7.[.6.t.u.v.r.. h.].2.^.6.[.7.<.w.x.y.5.0.g.* s.n.z.7.. . . ^.9.8.(.7.[.A.B.C.D.E.. h.].2.^.6.[.7.F.G.H.G.c.c.g.m.o.n.z.7.. . . . ^._.8.(.|.[.6.I.u.J.r.. h.}.2.^.6.[.|.<.w.K.y.5.0.g.* s.q.z.3.. ",
". _._.8.(.7.7.> > L.> M.N.r.].2.^.6.[.O.P.> L.Q.R.0.g.* s.n.z.l.. . . _._.8.(.7.S.T.U.V.W.X.Y.r.].2.^.6.[.Z.`.U.V.W. +.+g.m.o.n.z.l.. . . . _._.8.(.3.++> @+) > #+r.r.1.2.^.6.[.(.$+> ) @+%+p.g.* s.q.z.l.. ",
"].# :.8.(.3.&+> N.. . *+> =+=+k.^.b./.-+L.. . N.Q.;+g.* l.n.z.>+,+. ].# :.8.(.'+`.)+. . . } !+,+2.k.^.b.'+!+} . . . Y.~+{+m.o.n.z.>+,+. . 1.# :.8.(.(.]+ at +} ^+6 @+/+(+_+k.^.:+<+$+ at +6 ^+^+#+[+;.* l.q.z.>+k.",
"[.4.:._.<.<.}+|+. . . . 1+2+k.^.6.[.3+4+. . . . |+5+;.* l.6+z.>+9.. [.4.:._.<.7+8+. . . )+A T.C.k.^.6.[.9+T.A )+. . . > 0+m.l.6+z.>+a+. . [.a.:._.b+A A /+$+A c+c+d+e+A I.f+A $+/+> > /+A c+d+g+h+l.q.z.>+i+",
"9.a.# 9.8.j+M.. . . . . k+l+^.6.b.[.&+*+. . . . . }+m+j.l.6+z.>+n+. _.a.# 9.8.o+p+. . . q+r+X.s+^.6.b.[.s+> U.q+. . . p+t+j.l.6+z.>+{+. u+w.[+%+/+A J.. ^+) /+v+V V V e+#+b+e+w+} . } ~ @+c+V V g+x+y+z+A+B+",
"4.5.# :._.C+> . . . . . U.l+b.b.[.7.D+~ . . . . . E+F+s.n.G+( H+I+. 4.5.# :._.J+Y.. . . q+D.K+s+b.b.[.7.s+!+W.q+. . . p+L+o.n.G+( M+I+. ^+b+K.N+O+#+J.^+J.P+$+V V V Q+c+++++e+> 6 } 6 w+#+e+V V Q+R+S+z+h+T+",
"d.c.a.# 9.U+M.r.^+A A ^+> t.[./.3.3.w.> ^+A A ^+N.}+m+l.n.z.( H+V+. d.c.a.# 9.W+W.. . . )+A T.o+[./.3.3.G.T.A )+. . . 8+X+l.n.z.( M+Y+. . d.c.a.d+#+P+) P+#+e+V V V v+Z+/.3.Z+/+w+~ w+> $+J V V V g+z.( `+ @",
"g.0.5.4.:.9.-+. at +@~ U.+@}+O.3.3.(.<.@@}+#@~ U.+ at v.R.j.l.6+z.>+$@%@. g.0.5.4.:.&@*@} . . . V.X.=@3.3.(.<.a+*@Y.. . . )+*@- at l.6+z.>+;@%@. . g.0.5.x+d+$+/+$+e+V V V V e+>@(.(., at c+#+ at +@+$+g+V V V v+h+z.>+`+ @",
";.d.0.5.4.:.'@4+#@U.> )@w.(.(.<.<._._.!@)@*+k+#@4+F+l.n.G+( H+V+~@. e.d.0.5.4.:.'@T.W.~ 8+K+F.(.(.<.<._._.'@A 8+~ W. +{@o.n.G+( M+Y+~@. . ;.d.0.]@O+J J V V V V V d+Z+(.<.<._.%+e+c+e+J V V V J ^@/@( `+(@~@",
"0.g.d.c.5.4.4._ at A )@)@x.8.8.8.8.9.9.# # :@)@)@P.<@s.l.6+z.>+$@%@{@. 0.e.d.c.5.4.4.:.J+J+W+8.8.8.8.8.9.9.# # 5.[@}@L+m.o.l.6+z.>+;@%@{@. . p.g.d.c.]@K.O+g+J v+J e+K.i+8.8._.:.|@1 at g+J v+J g+R+2@/@z.>+`+ @3@",
"a.;.;.d.0.5.a.# # @@:.9.9.9.9.:.:.# a.5.0.d.n+;.j.l.6+z.( H+4@~@5 at . a.i.g.d.0.5.a.# # :.:.9.9.9.9.:.:.# a.5.0.d.g.i.j.l.6+z.( M+4@~@6 at . . a.;.;.d.0.5.5.'@N+7 at N+|@_.:.:.:.:.# a.5.8 at 9@0 at 9@a at l.q.b@(@`+(@~@5@",
"(.j.;.;.d.0.0.5.a.a.# # # # # # a.a.c.c.d.g.;.j.l.n.G+( >+$@%@c at U+. (.j.i.e.d.0.0.5.a.a.# # # # # # a.a.c.c.d.e.e.j.l.n.G+( >+;@%@c at F.. . (.j.;.0 at 1@0.0.5.a.a.# # # # # # a.a.c.c.d.g.;.j.l.q./@d at e@`+ @c@>@",
"2.l.j.* ;.g.d.0.0.5.5.5.5.5.5.5.c.c.d.g.;.;.j.l.n.G+z.>+H+V+~@f at g@. 2.l.j.m.e.g.d.0.0.5.5.5.5.5.5.5.c.c.d.g.e.e.j.l.n.G+z.>+M+Y+~@f@,+. . 2.l.j.9 at h@g.d.0.0.5.5.5.5.5.5.5.c.c.d.g.;.;.j.l.q./@( i at A+(@~@A+g@",
". ;.l.s.* * ;.g.g.d.0.0.0.0.0.0.d.g.g.;.* s.l.n.G+z.$@$@$@~@f at j@. . . i.l.o.m.m.e.g.g.d.d.k at .+0+[@[@[@l at l@0+m+o.l.n.G+z.>+M+Y+~@f at j@. . . . ;.l.l.R+9@;.g.g.d.d.0.0.0.0.0.d.g.g.;.* s.l.q./@z.A+m@(@~@c at j@. ",
". /.6+l.l.j.* ;.;.;.g.g.g.g.g.;.;.;.* j.j.l.6+6+z.~@n at c@%@c at o@p at . . . /.6+l.l.j.m.m.i.6@}@q at r@}@L+l at t+t+s@t at q@q at u@v@( ( M+4@%@c at o@S.. . . . /.q.q.3 at h@w@;.;.;.g.g.g.g.g.;.;.;.* j.j.l.q./@z. @m at o@~@c at o@:+. ",
". . s.6+n.n.l.s.s.* * * * * * * * s.s.l.n.6+z.z.x at y@x@%@c at o@j at . . . . . o.6+n.n.l.- at t@q at X+m+m.m.m.m.m.o.o.l.n.z@A at B@u@;@;@%@c at o@j at . . . . . . s./@q.T+h at 2@j.* * * * * * * * s.s.l.q.q.z.z.e at g+e@~@c at o@j at . . ",
". . [.z.z.6+6+C at D@X+E at s.s.s.l.l.l.l.n.6+6+z.f@n at n@f@%@c at o@o at F@. . . . . [.z.z.6+6+G at H@l.o.o.o.o.o.o.l.l.n.6+6+z.( >+B at I@%@c at o@o at A.. . . . . . f.z.z.q.J at R+R+3@l.s.s.s.l.l.l.q.q.q./@>+A+m at i@c@~@c at o@o at ++. . ",
". . . a.( ( z.G+K at L@D at L@C at K@M at N@N at M@O at x@L@#@y at x@V+~@c at o@o@'@. . . . . . . a.( ( z.P at P@6+n.n.n.n.n.n.6+6+z.z.( >+>+;@o at I@c at o@o@'@. . . . . . . . a.( ( z./@S+h+^@h+z+j at J@J at J@b at Q@z+h+m at i@e@ @~@c at o@o@'@. . . ",
". . . . m+>+>+( ( z.H+O at C@R at R@y at y@y at R@S at x@V+V+%@~@f at o@o@<@. . . . . . . . . m+>+>+( z.z.z.z.z.z.z.z.z.z.( >+>+;@;@%@~@f at o@o at 0+. . . . . . . . . . s.>+>+( ( z.>+Q at d@h+i at i@m at i@h+d at e@~@(@ @~@c at o@o at 9@. . . . ",
". . . . h.m+H+H+>+>+>+( ( ( >+>+>+>+H+$@$@%@~@c at f@o at o@<@r.. . . . . . . . . h.m+M+M+>+>+>+( ( ( >+>+>+>+M+M+Y+Y+~@c at f@o at o@0+r.. . . . . . . . . . h.a@`+`+>+>+>+( ( ( >+>+>+`+`+`+(@ @~@c at c@o at o@9 at r.. . . . ",
". . . . . . T at V+4@4 at 4@H+H+H+H+$@$@$@V+%@~@c at f@o at o@o@'@. . . . . . . . . . . . . T at Y+4@4 at 4@M+M+M+M+M+4 at 4@Y+%@~@c at f@o at o@o@'@. . . . . . . . . . . . . . ]@(@(@`+`+`+`+`+`+`+`+(@(@ @~@c at c@o at o@o@'@. . . . . . ",
". . . . N.|+} 3+M@%@%@%@%@%@%@%@~@~@~@c at f@o at o@o at O@t.} |+N.. . . . . . . . . U at V@} t.v@%@%@%@%@%@%@%@~@~@~@c at f@o at o@o at G@t.} V at U@. . . . . . . . . . r.V@} 3+b@~@ @ @ @ @ @~@~@~@~@c at c@o at o@o at S+3+} V at r.. . . . ",
". . } p+~ ~ ~ ~ ~ D+K at c@c at c@c at f@f at f@o at o@o at o@O at D+~ ~ ~ ~ ~ p+} . . . . . } p+~ ~ ~ ~ ~ W at P@c at c@c at c@f at f@f at o@o at o@o at G@W@~ ~ ~ ~ ~ p+} . . . . . . } p+~ ~ ~ ~ ~ D+Q at c@c at c@c at c@c at o@o at o@o at o@S+D+~ ~ ~ ~ ~ p+} . . ",
". . } p+~ ~ ~ ~ ~ ~ ~ X@!@X+O at o@o at o@O at X+!@X@~ ~ ~ ~ ~ ~ ~ p+} . . . . . } p+~ ~ ~ ~ ~ ~ ~ X@!@X+G at o@o at o@G at X+!@X@~ ~ ~ ~ ~ ~ ~ p+} . . . . . . } p+~ ~ ~ ~ ~ ~ ~ X@!@T+S+o at o@o at S+T+!@X@~ ~ ~ ~ ~ ~ ~ p+} . . ",
". . . . N.|+} } . at .@. at p+~ ~ ~ ~ ~ ~ ~ ~ ~ p+. at .@.@} } |+N.. . . . . . . . . U at V@} } Y.Y.Y.p+~ ~ ~ ~ ~ ~ ~ ~ ~ p+Y.Y.Y.} } V at U@. . . . . . . . . . r.V@} } 6 6 6 p+~ ~ ~ ~ ~ ~ ~ ~ ~ p+6 6 6 } } V at r.. . . . "};
More information about the dslinux-commit
mailing list