#! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh README <<'END_OF_README' XHere are the sources for the mines game. I hacked this up from the chess Xtool - you might recognize the lineage. I've been too lazy to write a Xmanual page for it; however, it's pretty simple: X XTop Subwindow (the "level" subwindow): Controls how many mines are hidden Xin the array. To change the level, just type a decimal number in this Xwindow and hit return. Typing return by itself will start a new game Xat the same level as the previous one. No path is guaranteed to exist; Xhowever, the game is unplayable above about 80 mines or so, and at this Xlevel the lack of a path is rare enough to not be frustrating. X XMiddle Subwindow (the "clairvoyance" subwindow): Tells you how many Xmines are in immediately adjacent squares (including diagonals). The Xtop left four squares are always guaranteed to be free of mines. X XBottom Subwindow (the "minefield" subwindow): The object is to get from Xthe upper left square to the lower right square without being blown up. XClick: X - the left mouse button on any adjacent square to move there. X Squares that you have occupied are highlighted. X X - the middle mouse button on any square to mark the square as X "dangerous". Once the square is marked as dangerous, you X cannot accidentally move there. X X - the right mouse button on any square to mark the square as X "safe". This has no effect on your ability to move on the square, X but eliminates the need to keep a separate piece of paper around X or to have an excessively high IQ. X XThe middle and right mouse buttons are "toggles" - that is, clicking on Xa square again toggles the square's designation or changes its type (i.e., Xfrom "safe" to "dangerous"). Both have no effect on squares you have Xalready occupied. X XTom Anderson, (206) 356-5895 XJohn Fluke Mfg. Co., Inc., P.O. Box C9090 M/S 245F, Everett, Wa. 98206 X{ hplsla, microsoft, uw-beaver, sun, tikal }!fluke!toma END_OF_README if test 1878 -ne `wc -c Makefile <<'END_OF_Makefile' X# X# Makefile for nchess package. X# X XOBJS = board.o boardsw.o levelsw.o main.o msgsw.o tool.o XSRCS = board.c boardsw.c levelsw.c main.c msgsw.c tool.c XHDRS = mines.h XICONS = blackSquare.icon whiteSquare.icon mineSquare.icon mines.icon \ X playerSquare.icon safeSquare.icon XCURSORS = crosshairs.cursor X X#CFLAGS = -g XCFLAGS = -O X Xmines : $(OBJS) X cc $(CFLAGS) -o mines $(OBJS) -lsuntool -lsunwindow -lpixrect X Xlint : $(SRCS) $(HDRS) X lint $(SRCS) X Xlist : $(SRCS) $(HDRS) X lpr -x2 -p -J"mines" *.h *.c X Xclean : X rm -f *.o mines X X$(OBJS) : $(HDRS) X Xshar : dist.sh X Xdist.sh : Makefile $(HDRS) $(SRCS) $(ICONS) $(CURSORS) X shar Makefile $(HDRS) $(SRCS) $(ICONS) $(CURSORS) > dist.sh END_OF_Makefile if test 676 -ne `wc -c blackSquare.icon <<'END_OF_blackSquare.icon' X/* Format_version=1, Width=64, Height=64, Depth=1, Valid_bits_per_item=16 X */ X 0xFFFF,0x0000,0x0000,0x0000,0x8001,0x0000,0x0000,0x0000, X 0xAAA9,0x0000,0x0000,0x0000,0x9555,0x0000,0x0000,0x0000, X 0xAAA9,0x0000,0x0000,0x0000,0x9555,0x0000,0x0000,0x0000, X 0xAAA9,0x0000,0x0000,0x0000,0x9555,0x0000,0x0000,0x0000, X 0xAAA9,0x0000,0x0000,0x0000,0x9555,0x0000,0x0000,0x0000, X 0xAAA9,0x0000,0x0000,0x0000,0x9555,0x0000,0x0000,0x0000, X 0xAAA9,0x0000,0x0000,0x0000,0x9555,0x0000,0x0000,0x0000, X 0x8001,0x0000,0x0000,0x0000,0xFFFF,0x0000,0x0000,0x0000, X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, X 0x0000,0x0000,0xFFFF,0xFFFF,0x0000,0x0000,0x8000,0x0001, X 0x0000,0x0000,0xAAAA,0xAAA9,0x0000,0x0000,0x9555,0x5555, X 0x0000,0x0000,0xAAAA,0xAAA9,0x0000,0x0000,0x9555,0x5555, X 0x0000,0x0000,0xAAAA,0xAAA9,0x0000,0x0000,0x9555,0x5555, X 0x0000,0x0000,0xAAAA,0xAAA9,0x0000,0x0000,0x9555,0x5555, X 0x0000,0x0000,0xAAAA,0xAAA9,0x0000,0x0000,0x9555,0x5555, X 0x0000,0x0000,0xAAAA,0xAAA9,0x0000,0x0000,0x9555,0x5555, X 0x0000,0x0000,0xAAAA,0xAAA9,0x0000,0x0000,0x9555,0x5555, X 0x0000,0x0000,0xAAAA,0xAAA9,0x0000,0x0000,0x9555,0x5555, X 0x0000,0x0000,0xAAAA,0xAAA9,0x0000,0x0000,0x9555,0x5555, X 0x0000,0x0000,0xAAAA,0xAAA9,0x0000,0x0000,0x9555,0x5555, X 0x0000,0x0000,0xAAAA,0xAAA9,0x0000,0x0000,0x9555,0x5555, X 0x0000,0x0000,0xAAAA,0xAAA9,0x0000,0x0000,0x9555,0x5555, X 0x0000,0x0000,0xAAAA,0xAAA9,0x0000,0x0000,0x9555,0x5555, X 0x0000,0x0000,0xAAAA,0xAAA9,0x0000,0x0000,0x9555,0x5555, X 0x0000,0x0000,0x8000,0x0001,0x0000,0x0000,0xFFFF,0xFFFF END_OF_blackSquare.icon if test 1933 -ne `wc -c board.c <<'END_OF_board.c' X/* X * manage the board state X * X * Copyright (c) 1987 Tom Anderson; 20831 Frank Waters Road; X * Stanwood, WA 98282. All rights reserved. X */ Xstatic char copyright[] = "Copyright 1987 Tom Anderson"; X X#include X#include X#include X X#include "mines.h" X XSquare MainBoard[SIDE_SIZE][SIDE_SIZE]; XBoardCoordinate PlayerLocation; XBOOL GameOver; X X/* X * set up the playing surface at the beginning of the game X */ Xvoid XInitBoard(level) X int level; /* number of mines */ X{ X register int i, j, minesPlaced, cutoff; X register Square * sqp; X int pass = 0; X BOOL connected; X X /* X * retry mine placement until a route can be had from the entry to X * the exit (this needs work) X */ X do { X /* X * zero the board X */ X for (i = 0 ; i < SIDE_SIZE ; i++) { X for (j = 0 ; j < SIDE_SIZE ; j++) { X sqp = &MainBoard[i][j]; X sqp->traversed = sqp->mined = sqp->occupied X = sqp->unsafe = sqp->safe = FALSE; X } X } X /* X * make several passes over the board, placing mines at X * a probability calculated to require about 3 passes on the average X */ X cutoff = level / 3 + 1; X for (minesPlaced = 0 ; minesPlaced < level ; ) { X for (i = 0 ; i < SIDE_SIZE ; i++) { X for (j = 0 ; j < SIDE_SIZE ; j++) { X if ((random() % (SIDE_SIZE * SIDE_SIZE)) < cutoff X && ! MainBoard[i][j].mined X && minesPlaced < level X && ! (i <= 1 && j <= 1) X && ! (i == SIDE_SIZE-1 && j == SIDE_SIZE-1)) { X MainBoard[i][j].mined = TRUE; X minesPlaced++; X } X } X } X } X connected = TRUE; /* ignore impossible mazes for now */ X } while ( ! connected); X PlayerLocation.x = PlayerLocation.y = 0; X MainBoard[0][0].occupied = MainBoard[0][0].traversed = TRUE; X GameOver = FALSE; X} X X/* X * describe the state of the board square at x, y X */ XSquare * XGetSquare(bloc) X BoardCoordinate * bloc; X{ X return (&MainBoard[bloc->y][bloc->x]); X} X X/* X * toggle a square's marking as being probably safe or unsafe X */ Xvoid XMarkSquare(suspect, safe) X BoardCoordinate * suspect; X BOOL safe; X{ X register Square * sqp = &MainBoard[suspect->y][suspect->x]; X X if (sqp->traversed) X return; X if (safe) { X sqp->safe = ! sqp->safe; X sqp->unsafe = FALSE; X } else { X sqp->unsafe = ! sqp->unsafe; X sqp->safe = FALSE; X } X DrawSquare(suspect); X} X X X/* X * try to move to a certain board coordinate X */ Xvoid XDoMove(dest) X BoardCoordinate * dest; X{ X register int y, x; X register Square * sqp; X X /* X * if not adjacent to or equal to our current position X * or the destination has been marked unsafe, ignore the move X */ X if (abs(dest->x - (x = PlayerLocation.x)) > 1 X || abs(dest->y - (y = PlayerLocation.y)) > 1 X || (dest->x == PlayerLocation.x && dest->y == PlayerLocation.y) X || MainBoard[dest->y][dest->x].unsafe) X return; X /* X * step off our current square X */ X MainBoard[y][x].occupied = FALSE; X DrawSquare(&PlayerLocation); X sqp = &MainBoard[dest->y][dest->x]; X /* X * if we stepped on a mine, blow him up X */ X if (sqp->mined) { X GameOver = TRUE; X Message("You just exploded"); X DrawBoard(); X } X /* X * else if this is home, render congratulations X */ X else if (dest->x == SIDE_SIZE-1 && dest->y == SIDE_SIZE-1) { X PlayerLocation = * dest; X sqp->traversed = sqp->occupied = TRUE; X GameOver = TRUE; X Message("You made it!"); X DrawBoard(); X } X /* X * else move onto the new square X */ X else { X PlayerLocation = * dest; X sqp->traversed = sqp->occupied = TRUE; X DrawSquare(dest); X Message(MineWarningMessage()); X } X} X X/* X * return a pointer to the warning message X */ Xchar * XMineWarningMessage() X{ X static char warning[128]; X register int x, y; X int minesFound; X X minesFound = 0; X for (x = PlayerLocation.x - 1 ; x <= PlayerLocation.x + 1 ; x++) { X for (y = PlayerLocation.y - 1 ; y <= PlayerLocation.y + 1 ; y++) { X if (x >= 0 && x < SIDE_SIZE && y >= 0 && y < SIDE_SIZE && MainBoard[y][x].mined) X minesFound++; X } X } X sprintf(warning, "%d mine(s) nearby", minesFound); X return(warning); X} X END_OF_board.c if test 4101 -ne `wc -c boardsw.c <<'END_OF_boardsw.c' X/* X * handle the board subwindow X * X * Copyright (c) 1987 Tom Anderson; 20831 Frank Waters Road; X * Stanwood, WA 98282. All rights reserved. X */ Xstatic char copyright[] = "Copyright 1987 Tom Anderson"; X X#include X#include X#include X#include X#include X#include X#include X#include X X#include "mines.h" X X/* X * cross-hairs cursor X */ Xstatic short CrosshairsImage[] = { X#include "crosshairs.cursor" X}; XDEFINE_CURSOR_FROM_IMAGE(CrosshairsCursor, 8, 8, PIX_SRC^PIX_DST, CrosshairsImage); X X/* X * square pixrects X */ Xunsigned short WhiteSquareImage[] = { X#include "whiteSquare.icon" X}; Xmpr_static(WhiteSquarePR, 64, 64, 1, WhiteSquareImage); X Xunsigned short BlackSquareImage[] = { X#include "blackSquare.icon" X}; Xmpr_static(BlackSquarePR, 64, 64, 1, BlackSquareImage); X Xunsigned short PlayerSquareImage[] = { X#include "playerSquare.icon" X}; Xmpr_static(PlayerSquarePR, 64, 64, 1, PlayerSquareImage); X Xunsigned short MineSquareImage[] = { X#include "mineSquare.icon" X}; Xmpr_static(MineSquarePR, 64, 64, 1, MineSquareImage); X Xunsigned short SafeSquareImage[] = { X#include "safeSquare.icon" X}; Xmpr_static(SafeSquarePR, 64, 64, 1, SafeSquareImage); X X/* board subwindow handles */ Xstruct toolsw * BoardSW; Xstruct gfxsubwindow * Board; X X/* square sizes */ Xint SquareWidth = 32, SquareHeight = 32; X/* icon offsets */ Xstruct pr_pos IconOffset = { 32, 32 }; X X/* X * board sigwinch handler X */ X/*ARGSUSED*/ XboardSigwinch(sw) X caddr_t sw; X{ X gfxsw_interpretesigwinch(Board); X gfxsw_handlesigwinch(Board); X if (Board->gfx_flags & GFX_RESTART) { X Board->gfx_flags &= ~ GFX_RESTART; X DrawBoard(); X } X} X X/* X * map a mouse coordinate to a board coordinate X */ Xvoid XmapMouseToBoard(mlocp, blocp) X struct pr_pos * mlocp; X BoardCoordinate * blocp; X{ X blocp->x = mlocp->x / (SquareWidth-1); X blocp->y = mlocp->y / (SquareHeight-1); X} X X/* X * map a board coordinate to a mouse coordinate X */ Xvoid XmapBoardToMouse(blocp, mlocp) X BoardCoordinate * blocp; X struct pr_pos * mlocp; X{ X mlocp->x = blocp->x * (SquareWidth-1) - 1; X mlocp->y = blocp->y * (SquareHeight-1) - 1; X} X X/* X * board select() handler X */ X/*ARGSUSED*/ XboardSelected(nullsw, ibits, obits, ebits, timer) X caddr_t * nullsw; X int * ibits, * obits, * ebits; X struct timeval ** timer; X{ X struct inputevent ie; X struct pr_pos mloc; X BoardCoordinate bloc; X X /* X * read the input event X */ X if (input_readevent(BoardSW->ts_windowfd, &ie) == -1) { X perror("input failed"); X abort(); X } X if (win_inputposevent(&ie)) { X switch(ie.ie_code) { X /* X * if it is an attempt to move X */ X case MS_LEFT: X mloc.x = ie.ie_locx; mloc.y = ie.ie_locy; X mapMouseToBoard(&mloc, &bloc); X DoMove(&bloc); X break; X /* X * else if he is toggling a square's unsafe marking X */ X case MS_MIDDLE: X mloc.x = ie.ie_locx; mloc.y = ie.ie_locy; X mapMouseToBoard(&mloc, &bloc); X MarkSquare(&bloc, FALSE); X break; X /* X * else if he is toggling a square's safe marking X */ X case MS_RIGHT: X mloc.x = ie.ie_locx; mloc.y = ie.ie_locy; X mapMouseToBoard(&mloc, &bloc); X MarkSquare(&bloc, TRUE); X break; X } X } X * ibits = * obits = * ebits = 0; X} X X/* X * initialize the board subwindow X */ Xvoid XInitBoardSW() X{ X struct inputmask mask; X register unsigned int i; X X /* X * initialize the subwindow X */ X if ((BoardSW = gfxsw_createtoolsubwindow(MinesTool, "", X TOOL_SWEXTENDTOEDGE, X /* playing surface + victim area */ X (SquareHeight-1) * SIDE_SIZE, X NULL)) == NULL) X { X fprintf(stderr, "Can't create board subwindow\n"); X exit(1); X } X Board = (struct gfxsubwindow *) BoardSW->ts_data; X gfxsw_getretained(Board); X BoardSW->ts_io.tio_handlesigwinch = boardSigwinch; X BoardSW->ts_io.tio_selected = boardSelected; X input_imnull(&mask); X win_setinputcodebit(&mask, MS_LEFT); X win_setinputcodebit(&mask, MS_MIDDLE); X win_setinputcodebit(&mask, MS_RIGHT); X win_setinputcodebit(&mask, LOC_MOVEWHILEBUTDOWN); X win_setinputcodebit(&mask, LOC_WINEXIT); X mask.im_flags |= IM_NEGEVENT; X win_setinputmask(BoardSW->ts_windowfd, &mask, NULL, WIN_NULLLINK); X win_setcursor(BoardSW->ts_windowfd, &CrosshairsCursor); X} X X/* X * draw a square X */ Xvoid XDrawSquare(bloc) X BoardCoordinate * bloc; X{ X struct pr_pos mloc; X struct pixrect * pr; X Square * sqp = GetSquare(bloc); X X /* determine which pixrect to paint the square with */ X if (sqp->occupied) X pr = &PlayerSquarePR; X else if (sqp->traversed) X pr = &BlackSquarePR; X else if ( ! GameOver && sqp->unsafe || GameOver && sqp->mined) X pr = &MineSquarePR; X else if ( ! GameOver && sqp->safe) X pr = &SafeSquarePR; X else X pr = &WhiteSquarePR; X /* paint the square */ X mapBoardToMouse(bloc, &mloc); X pw_rop(Board->gfx_pixwin, X mloc.x, mloc.y, SquareWidth, SquareHeight, PIX_SRC, pr, IconOffset.x, IconOffset.y); X} X X/* X * draw the playing surface and victim area X */ Xvoid XDrawBoard() X{ X BoardCoordinate bloc; X X /* clear the board area */ X pw_rop(Board->gfx_pixwin, X 0, 0, Board->gfx_rect.r_width, Board->gfx_rect.r_height, X PIX_CLR, (struct pixrect *) 0, 0, 0); X /* draw the playing area */ X for (bloc.x = 0 ; bloc.x < SIDE_SIZE ; bloc.x++) { X for (bloc.y = 0 ; bloc.y < SIDE_SIZE ; bloc.y++) { X DrawSquare(&bloc); X } X } X} END_OF_boardsw.c if test 5429 -ne `wc -c crosshairs.cursor <<'END_OF_crosshairs.cursor' X/* Format_version=1, Width=16, Height=16, Depth=1, Valid_bits_per_item=16 X */ X 0x0000,0x0100,0x0100,0x0100,0x0100,0x0100,0x0000,0x7C7C, X 0x0000,0x0100,0x0100,0x0100,0x0100,0x0100,0x0000,0x0000 END_OF_crosshairs.cursor if test 193 -ne `wc -c levelsw.c <<'END_OF_levelsw.c' X/* X * level display/control subwindow handling X * X * Copyright (c) 1987 Tom Anderson; 20831 Frank Waters Road; X * Stanwood, WA 98282. All rights reserved. X */ Xstatic char copyright[] = "Copyright 1987 Tom Anderson"; X X#include X#include X#include X#include X X#include "mines.h" X X#define MAX_SEND_LENGTH 60 X Xstruct toolsw * LevelSW; XPanel LevelPanel; X XPanel_item ChangeLevelItem; X X/*ARGSUSED*/ XlevelProc(item, event) X Panel_item item; X struct inputevent *event; X{ X char c[MAX_SEND_LENGTH+1]; X static int oldLevel = DEFAULT_MINE_QTY; X int newLevel; X X /* get the new level request text */ X strcpy(c, (char *) panel_get_value(ChangeLevelItem)); X /* set the new level text to nil */ X panel_set_value(ChangeLevelItem, ""); X if (sscanf(c, "%d", &newLevel) == 1 X && newLevel >= 0 X && newLevel < SIDE_SIZE * SIDE_SIZE - 20) X oldLevel = newLevel; X InitBoard(oldLevel); X DrawBoard(); X Message(MineWarningMessage()); X sprintf(c, "[%d]", oldLevel); X panel_set(ChangeLevelItem, X PANEL_LABEL_STRING, c, X 0); X} X X/* X * set up the level control subwindow X * (if we are playing against the machine, leave them out) X */ Xvoid XInitLevelSW() X{ X char c[128]; X X if ((LevelSW = panel_create(MinesTool, 0)) == NULL) { X fprintf(stderr, "Can't create level control subwindow\n"); X exit(1); X } X sprintf(c, "[%d]", DEFAULT_MINE_QTY); X LevelPanel = LevelSW->ts_data; X ChangeLevelItem = panel_create_item(LevelPanel, PANEL_TEXT, X PANEL_LABEL_STRING, c, X PANEL_NOTIFY_STRING, "\n\r", X PANEL_NOTIFY_LEVEL, PANEL_SPECIFIED, X PANEL_NOTIFY_PROC, levelProc, X PANEL_VALUE_STORED_LENGTH, MAX_SEND_LENGTH, X 0); X panel_fit_height(LevelPanel); X} END_OF_levelsw.c if test 1738 -ne `wc -c main.c <<'END_OF_main.c' X/* X * main part of the mines program X * X * Copyright (c) 1987 Tom Anderson; 20831 Frank Waters Road; X * Stanwood, WA 98282. All rights reserved. X */ Xstatic char copyright[] = "Copyright 1987 Tom Anderson"; X X#include X#include X#include X#include X#include X X#include "mines.h" X Xint errno; /* global error number */ X Xmain(argc, argv) X int argc; X char ** argv; X{ X register int i, j; X char * cp; X X /* randomize things a bit */ X (void) srandom((long) getpid()); X /* parse and strip out the tool-related arguments */ X ParseToolArgs(&argc, argv); X for (i = 1 ; i < argc ; i++) { X if (argv[i][0] == '-') { X switch(argv[i][1]) { X /* small (16 x 16) version */ X case 's': X IconOffset.x = IconOffset.y = 0; X SquareWidth = SquareHeight = 16; X break; X } X } X } X /* initialize the board state */ X InitBoard(DEFAULT_MINE_QTY); X /* initialize and install the tool */ X InitTool(); X tool_install(MinesTool); X /* now play the game */ X RunTool(); X} X END_OF_main.c if test 1061 -ne `wc -c mineSquare.icon <<'END_OF_mineSquare.icon' X/* Format_version=1, Width=64, Height=64, Depth=1, Valid_bits_per_item=16 X */ X 0xFFFF,0x0000,0x0000,0x0000,0x8101,0x0000,0x0000,0x0000, X 0x9201,0x0000,0x0000,0x0000,0x8041,0x0000,0x0000,0x0000, X 0x8481,0x0000,0x0000,0x0000,0xB401,0x0000,0x0000,0x0000, X 0x8201,0x0000,0x0000,0x0000,0x93C1,0x0000,0x0000,0x0000, X 0xA3E1,0x0000,0x0000,0x0000,0x87F1,0x0000,0x0000,0x0000, X 0x87F1,0x0000,0x0000,0x0000,0x87F1,0x0000,0x0000,0x0000, X 0x83E1,0x0000,0x0000,0x0000,0x81C1,0x0000,0x0000,0x0000, X 0x8001,0x0000,0x0000,0x0000,0xFFFF,0x0000,0x0000,0x0000, X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, X 0x0000,0x0000,0xFFFF,0xFFFF,0x0000,0x0000,0x8000,0x0001, X 0x0000,0x0000,0x8000,0x0001,0x0000,0x0000,0x8000,0x0001, X 0x0000,0x0000,0x8180,0x0001,0x0000,0x0000,0x8540,0x0001, X 0x0000,0x0000,0x840C,0x0001,0x0000,0x0000,0xA024,0x0001, X 0x0000,0x0000,0x9C90,0x0001,0x0000,0x0000,0x8500,0x0001, X 0x0000,0x0000,0x8100,0x0001,0x0000,0x0000,0x8100,0x0001, X 0x0000,0x0000,0xA0E3,0xE001,0x0000,0x0000,0x9CF7,0xF801, X 0x0000,0x0000,0x80FB,0xFC01,0x0000,0x0000,0x807B,0xFE01, X 0x0000,0x0000,0x803B,0xFF01,0x0000,0x0000,0x8047,0xFF01, X 0x0000,0x0000,0x80FF,0xFF81,0x0000,0x0000,0x80FF,0xFF81, X 0x0000,0x0000,0x80FF,0xFF81,0x0000,0x0000,0x80FF,0xFF81, X 0x0000,0x0000,0x80FF,0xFF81,0x0000,0x0000,0x807F,0xFF01, X 0x0000,0x0000,0x807F,0xFF01,0x0000,0x0000,0x803F,0xFE01, X 0x0000,0x0000,0x801F,0xFC01,0x0000,0x0000,0x800F,0xF801, X 0x0000,0x0000,0x8003,0xE001,0x0000,0x0000,0x8000,0x0001, X 0x0000,0x0000,0x8000,0x0001,0x0000,0x0000,0xFFFF,0xFFFF END_OF_mineSquare.icon if test 1933 -ne `wc -c mines.h <<'END_OF_mines.h' X/* X * mines header X * X * Copyright (c) 1987 Tom Anderson; 20831 Frank Waters Road; X * Stanwood, WA 98282. All rights reserved. X */ X X#define BOOL int X#ifndef TRUE X#define TRUE 1 X#endif X#ifndef FALSE X#define FALSE 0 X#endif X X/* X * number of board squares per side X */ X#define SIDE_SIZE 16 X X/* X * default number of mines X */ X#define DEFAULT_MINE_QTY 20 X X/* X * board coordinates X */ Xtypedef struct { X int x; X int y; X} BoardCoordinate; X X/* X * square state X */ Xtypedef struct { X BOOL traversed; /* has the poor soul stepped here? */ X BOOL mined; /* is this square mined? */ X BOOL occupied; /* is this square occupied? */ X BOOL unsafe; /* has the player determined a mine here? */ X BOOL safe; /* has the player determined no mines here? */ X} Square; X Xextern void InitBoard(), DoMove(), InitBoardSW(), DrawSquare(), X DrawBoard(), InitLevelSW(), InitMsgSW(), Message(), X ParseToolArgs(), InitTool(), RunTool(), MarkSquare(); Xextern Square * GetSquare(); Xextern struct tool * MinesTool; Xextern char * MineWarningMessage(); Xextern BOOL GameOver; Xextern struct pr_pos IconOffset; Xextern int SquareWidth, SquareHeight; END_OF_mines.h if test 1151 -ne `wc -c mines.icon <<'END_OF_mines.icon' X/* Format_version=1, Width=64, Height=64, Depth=1, Valid_bits_per_item=16 X */ X 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, X 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xE000,0x0000,0x0000,0x0007, X 0xE000,0x3800,0x0000,0x0007,0xE000,0x1C60,0x075D,0x4007, X 0xE005,0x8760,0x0251,0x8007,0xE003,0x9B20,0x025D,0x4007, X 0xE000,0x4100,0x0000,0x0007,0xE000,0x7F60,0x00EB,0xA807, X 0xE000,0x0AC0,0x004A,0x3007,0xE000,0xE440,0x004B,0xA807, X 0xE001,0xC6F0,0x0000,0x0007,0xE000,0x0620,0x001D,0x7507, X 0xE000,0x0600,0x0009,0x4607,0xE000,0x0C00,0x0009,0x7507, X 0xE000,0x1800,0x0000,0x0007,0xE000,0x3000,0x0000,0x0007, X 0xE000,0x6000,0x0001,0x2407,0xE000,0xC00F,0xE000,0x0007, X 0xE000,0xC03F,0xFC00,0x0007,0xE000,0xC0FF,0xFF00,0x0007, X 0xE000,0x79FF,0xFFC0,0x0007,0xE000,0x7CFF,0xF3E2,0x4007, X 0xE000,0x747F,0xEDF1,0x2007,0xE000,0x6D3F,0xD4F8,0x9007, X 0xE000,0x3B9F,0xFB7C,0x0007,0xE000,0x07CF,0xF77E,0x0007, X 0xE000,0xCFCF,0xFFFF,0x0007,0xE000,0xE7CF,0xFFFF,0x0007, X 0xE001,0xF39F,0xFFFF,0x8007,0xE001,0xF81F,0xFFFF,0x8007, X 0xE001,0xFC7F,0xFFFF,0xC007,0xE003,0xFFFF,0xFFFF,0xC007, X 0xE003,0xFFFF,0xFFFF,0xE007,0xE003,0xFFFF,0xFFFF,0xE007, X 0xE003,0xFFFF,0xFFFF,0xE007,0xE003,0xFFFF,0xFFFF,0xE007, X 0xE003,0xFFFF,0xFFFF,0xE007,0xE003,0xFFFF,0xFFFF,0xE007, X 0xE003,0xFFFF,0xFFFF,0xE007,0xE003,0xFFFF,0xFFFF,0xE007, X 0xE001,0xFFFF,0xFFFF,0xE007,0xE009,0xFFFF,0xFFFF,0xC007, X 0xE008,0xFFFF,0xFFFF,0xC007,0xE024,0xFFFF,0xFFFF,0xC007, X 0xE022,0x7FFF,0xFFDF,0x8007,0xE010,0x7FFF,0xFFAB,0x8007, X 0xE008,0x3FFF,0xFF77,0x0007,0xE000,0x1FFF,0xFFAE,0x0007, X 0xE000,0x0FFF,0xFFFC,0x0007,0xE000,0x07FF,0xFFF8,0x0007, X 0xE000,0x03FF,0xFFF0,0x0007,0xE000,0x00FF,0xFFC0,0x0007, X 0xE000,0x007F,0xFF80,0x0007,0xE000,0x001F,0xFC00,0x0007, X 0xE000,0x0000,0x0000,0x0007,0xE000,0x0000,0x0000,0x0007, X 0xE000,0x0000,0x0000,0x0007,0xE000,0x0000,0x0000,0x0007, X 0xE000,0x0000,0x0000,0x0007,0xFFFF,0xFFFF,0xFFFF,0xFFFF, X 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF END_OF_mines.icon if test 1933 -ne `wc -c msgsw.c <<'END_OF_msgsw.c' X/* X * message subwindow handling X * X * Copyright (c) 1987 Tom Anderson; 20831 Frank Waters Road; X * Stanwood, WA 98282. All rights reserved. X */ Xstatic char copyright[] = "Copyright 1987 Tom Anderson"; X X#include X#include X#include X#include X#include X X#include "mines.h" X Xstruct toolsw * MessageSW; XPanel MessagePanel; X XPanel_item MessageItem; X X/* X * set up the message subwindow X */ Xvoid XInitMsgSW() X{ X if ((MessageSW = panel_create(MinesTool, 0)) == NULL) { X fprintf(stderr, "Can't create message panel\n"); X exit(1); X } X MessagePanel = MessageSW->ts_data; X /* create the message panel item */ X MessageItem = panel_create_item(MessagePanel, PANEL_MESSAGE, X PANEL_LABEL_STRING, MineWarningMessage(), X PANEL_SHOW_ITEM, TRUE, X 0); X panel_fit_height(MessagePanel); X} X Xvoid XMessage(cp) X char * cp; X{ X panel_set(MessageItem, X PANEL_LABEL_STRING, cp, X PANEL_SHOW_ITEM, TRUE, X 0); X} END_OF_msgsw.c if test 973 -ne `wc -c playerSquare.icon <<'END_OF_playerSquare.icon' X/* Format_version=1, Width=64, Height=64, Depth=1, Valid_bits_per_item=16 X */ X 0xFFFF,0x0000,0x0000,0x0000,0x8001,0x0000,0x0000,0x0000, X 0x8081,0x0000,0x0000,0x0000,0x81C1,0x0000,0x0000,0x0000, X 0x81C1,0x0000,0x0000,0x0000,0x8081,0x0000,0x0000,0x0000, X 0x8081,0x0000,0x0000,0x0000,0x83E1,0x0000,0x0000,0x0000, X 0x8491,0x0000,0x0000,0x0000,0x8081,0x0000,0x0000,0x0000, X 0x81C1,0x0000,0x0000,0x0000,0x81C1,0x0000,0x0000,0x0000, X 0x8221,0x0000,0x0000,0x0000,0x8221,0x0000,0x0000,0x0000, X 0x8001,0x0000,0x0000,0x0000,0xFFFF,0x0000,0x0000,0x0000, X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, X 0x0000,0x0000,0xFFFF,0xFFFF,0x0000,0x0000,0x8000,0x0001, X 0x0000,0x0000,0x8000,0x0001,0x0000,0x0000,0x8000,0x0001, X 0x0000,0x0000,0x8000,0x0001,0x0000,0x0000,0x8000,0x0001, X 0x0000,0x0000,0x8000,0x0001,0x0000,0x0000,0x8003,0x8001, X 0x0000,0x0000,0x8004,0x4001,0x0000,0x0000,0x8004,0x4001, X 0x0000,0x0000,0x8004,0x4001,0x0000,0x0000,0x8003,0x8001, X 0x0000,0x0000,0x8001,0x0001,0x0000,0x0000,0x8001,0x0001, X 0x0000,0x0000,0x8001,0x0001,0x0000,0x0000,0x800F,0xE001, X 0x0000,0x0000,0x8001,0x0001,0x0000,0x0000,0x8001,0x0001, X 0x0000,0x0000,0x8001,0x0001,0x0000,0x0000,0x8001,0x0001, X 0x0000,0x0000,0x8001,0x0001,0x0000,0x0000,0x8001,0x0001, X 0x0000,0x0000,0x8001,0x0001,0x0000,0x0000,0x8002,0x8001, X 0x0000,0x0000,0x8004,0x4001,0x0000,0x0000,0x8004,0x4001, X 0x0000,0x0000,0x8008,0x2001,0x0000,0x0000,0x8010,0x1001, X 0x0000,0x0000,0x8000,0x0001,0x0000,0x0000,0x8000,0x0001, X 0x0000,0x0000,0x8000,0x0001,0x0000,0x0000,0xFFFF,0xFFFF END_OF_playerSquare.icon if test 1933 -ne `wc -c safeSquare.icon <<'END_OF_safeSquare.icon' X/* Format_version=1, Width=64, Height=64, Depth=1, Valid_bits_per_item=16 X */ X 0xFFFF,0x0000,0x0000,0x0000,0x8001,0x0000,0x0000,0x0000, X 0x8001,0x0000,0x0000,0x0000,0x8001,0x0000,0x0000,0x0000, X 0x800D,0x0000,0x0000,0x0000,0x801D,0x0000,0x0000,0x0000, X 0x803D,0x0000,0x0000,0x0000,0x8071,0x0000,0x0000,0x0000, X 0x8061,0x0000,0x0000,0x0000,0x98C1,0x0000,0x0000,0x0000, X 0x8D81,0x0000,0x0000,0x0000,0x8701,0x0000,0x0000,0x0000, X 0x8201,0x0000,0x0000,0x0000,0x8201,0x0000,0x0000,0x0000, X 0x8001,0x0000,0x0000,0x0000,0xFFFF,0x0000,0x0000,0x0000, X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, X 0x0000,0x0000,0xFFFF,0xFFFF,0x0000,0x0000,0x8000,0x0001, X 0x0000,0x0000,0x8000,0x0001,0x0000,0x0000,0x8000,0x0001, X 0x0000,0x0000,0x8000,0x0001,0x0000,0x0000,0x8000,0x0001, X 0x0000,0x0000,0x8000,0x0001,0x0000,0x0000,0x8000,0x0001, X 0x0000,0x0000,0x8000,0x0001,0x0000,0x0000,0x8000,0x0001, X 0x0000,0x0000,0x8000,0x0001,0x0000,0x0000,0x8000,0x4001, X 0x0000,0x0000,0x8000,0x4001,0x0000,0x0000,0x801C,0x4801, X 0x0000,0x0000,0x8022,0x5001,0x0000,0x0000,0x8022,0x6001, X 0x0000,0x0000,0x8022,0x6001,0x0000,0x0000,0x8022,0x5001, X 0x0000,0x0000,0x8022,0x4801,0x0000,0x0000,0x801C,0x4401, X 0x0000,0x0000,0x8000,0x0001,0x0000,0x0000,0x8000,0x0001, X 0x0000,0x0000,0x8000,0x0001,0x0000,0x0000,0x8000,0x0001, X 0x0000,0x0000,0x8000,0x0001,0x0000,0x0000,0x8000,0x0001, X 0x0000,0x0000,0x8000,0x0001,0x0000,0x0000,0x8000,0x0001, X 0x0000,0x0000,0x8000,0x0001,0x0000,0x0000,0x8000,0x0001, X 0x0000,0x0000,0x8000,0x0001,0x0000,0x0000,0xFFFF,0xFFFF END_OF_safeSquare.icon if test 1933 -ne `wc -c tool.c <<'END_OF_tool.c' X/* X * handle the tool environment X * X * Copyright (c) 1987 Tom Anderson; 20831 Frank Waters Road; X * Stanwood, WA 98282. All rights reserved. X */ Xstatic char copyright[] = "Copyright 1987 Tom Anderson"; X X#include X#include X#include X#include X#include X#include X#include X X#include "mines.h" X Xstruct tool * MinesTool; Xchar ** ToolAttrs = (char **) NULL; Xchar * ToolName; X X/* X * iconic form of window X */ Xunsigned short IconImage[] = { X#include "mines.icon" X}; X XDEFINE_ICON_FROM_IMAGE(WindowIcon, IconImage); X Xsigwinched() X{ X tool_sigwinch(MinesTool); X} X X/* X * parse the tool args. X */ Xvoid XParseToolArgs(argc, argv) X int *argc; X char **argv; X{ X ToolName = argv[0]; X (*argc)--; X argv++; X if (tool_parse_all(argc, argv, &ToolAttrs, ToolName) == -1) { X tool_usage(ToolName); X exit(1); X } X (*argc)++; X} X X/* X * set up the tool environment X */ Xvoid XInitTool() X{ X register unsigned int height; X register struct toolsw * twsp; X X if ((MinesTool = tool_make( X WIN_LABEL, ToolName, X WIN_ICON, &WindowIcon, X WIN_ATTR_LIST, ToolAttrs, X WIN_WIDTH, SIDE_SIZE * (SquareWidth-1) + 2 * tool_borderwidth(MinesTool) - 1, X /* X * NOTE: The following line was unnecessary in Sun release 2.2, X * but is necessary in release 3.0. For some unknown reason, the X * call to tool_set_attributes following the call to InitBoardSW X * now fails to uncover the board area that was obscured by the X * default tool height being too small (note that the tool has not X * been installed yet). X */ X WIN_HEIGHT, 2000, X 0)) == (struct tool *) NULL) X { X fputs("Can't make tool\n", stderr); X exit(1); X } X tool_free_attribute_list(ToolAttrs); X /* initialize the subwindows */ X InitLevelSW(); X InitMsgSW(); X InitBoardSW(); X /* X * add up subwindow heights and force the tool to the resulting size X */ X height = tool_stripeheight(MinesTool) + tool_borderwidth(MinesTool) - tool_subwindowspacing(MinesTool); X for (twsp = MinesTool->tl_sw ; twsp != (struct toolsw *) 0 ; twsp = twsp->ts_next) X height += twsp->ts_height + tool_subwindowspacing(MinesTool); X /* X * NOTE: under 2.2, the above calculation yielded the correct height. X * under 3.0, we need to add a few pixels to make it come out right (the X * reason is not yet known). X */ X height += 2; X tool_set_attributes(MinesTool, WIN_HEIGHT, height, 0); X signal(SIGWINCH, sigwinched); X} X Xvoid XRunTool() X{ X /* X * NOTE: this is another difference between release 2.2 and 3.0: X * in release 2.2, the SIGWINCH handler would get called once at the X * outset to draw the board area; in release 3.0, this doesn't happen. X */ X DrawBoard(); X tool_select(MinesTool, 0); X tool_destroy(MinesTool); X} X END_OF_tool.c if test 2847 -ne `wc -c whiteSquare.icon <<'END_OF_whiteSquare.icon' X/* Format_version=1, Width=64, Height=64, Depth=1, Valid_bits_per_item=16 X */ X 0xFFFF,0x0000,0x0000,0x0000,0x8001,0x0000,0x0000,0x0000, X 0x8001,0x0000,0x0000,0x0000,0x8001,0x0000,0x0000,0x0000, X 0x8001,0x0000,0x0000,0x0000,0x8001,0x0000,0x0000,0x0000, X 0x8001,0x0000,0x0000,0x0000,0x8001,0x0000,0x0000,0x0000, X 0x8001,0x0000,0x0000,0x0000,0x8001,0x0000,0x0000,0x0000, X 0x8001,0x0000,0x0000,0x0000,0x8001,0x0000,0x0000,0x0000, X 0x8001,0x0000,0x0000,0x0000,0x8001,0x0000,0x0000,0x0000, X 0x8001,0x0000,0x0000,0x0000,0xFFFF,0x0000,0x0000,0x0000, X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, X 0x0000,0x0000,0xFFFF,0xFFFF,0x0000,0x0000,0x8000,0x0001, X 0x0000,0x0000,0x8000,0x0001,0x0000,0x0000,0x8000,0x0001, X 0x0000,0x0000,0x8000,0x0001,0x0000,0x0000,0x8000,0x0001, X 0x0000,0x0000,0x8000,0x0001,0x0000,0x0000,0x8000,0x0001, X 0x0000,0x0000,0x8000,0x0001,0x0000,0x0000,0x8000,0x0001, X 0x0000,0x0000,0x8000,0x0001,0x0000,0x0000,0x8000,0x0001, X 0x0000,0x0000,0x8000,0x0001,0x0000,0x0000,0x8000,0x0001, X 0x0000,0x0000,0x8000,0x0001,0x0000,0x0000,0x8000,0x0001, X 0x0000,0x0000,0x8000,0x0001,0x0000,0x0000,0x8000,0x0001, X 0x0000,0x0000,0x8000,0x0001,0x0000,0x0000,0x8000,0x0001, X 0x0000,0x0000,0x8000,0x0001,0x0000,0x0000,0x8000,0x0001, X 0x0000,0x0000,0x8000,0x0001,0x0000,0x0000,0x8000,0x0001, X 0x0000,0x0000,0x8000,0x0001,0x0000,0x0000,0x8000,0x0001, X 0x0000,0x0000,0x8000,0x0001,0x0000,0x0000,0x8000,0x0001, X 0x0000,0x0000,0x8000,0x0001,0x0000,0x0000,0x8000,0x0001, X 0x0000,0x0000,0x8000,0x0001,0x0000,0x0000,0xFFFF,0xFFFF END_OF_whiteSquare.icon if test 1933 -ne `wc -c