Path: utzoo!utgpu!news-server.csri.toronto.edu!cs.utexas.edu!sun-barr!newstop!sun!uunet.UU.NET
From: uunet!globes!jimmc@uunet.UU.NET (Jim McBeath)
Newsgroups: comp.sources.x
Subject: v09i028: xmines, Part02/03
Message-ID: <142274@sun.Eng.Sun.COM>
Date: 12 Sep 90 08:26:00 GMT
References: 
Sender: news@sun.Eng.Sun.COM
Lines: 1821
Approved: argv@sun.com

Submitted-by: uunet!globes!jimmc@uunet.UU.NET (Jim McBeath)
Posting-number: Volume 9, Issue 28
Archive-name: xmines/part02

#! /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 mines.h <<'END_OF_mines.h'
X/*
X * Copyright (c) 1987 Tom Anderson; 20831 Frank Waters Road;
X * Stanwood, WA  98282.
X *
X * Permission to use, copy, modify, distribute, and sell this software and its
X * documentation for any purpose is hereby granted without fee, provided that
X * the above copyright notice appear in all copies and that both that
X * copyright notice and this permission notice appear in supporting
X * documentation, and that the name of Tom Anderson not be used
X * in advertising or publicity pertaining to distribution of the software
X * without specific, written prior permission.  Tom Anderson makes
X * no representations about the suitability of this software for any purpose.
X * It is provided "as is" without express or implied warranty.
X *
X * TOM ANDERSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
X * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.  IN NO
X * EVENT SHALL TOM ANDERSON BE LIABLE FOR ANY SPECIAL, INDIRECT OR
X * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
X * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
X * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
X * OF THIS SOFTWARE.
X *
X */
X
X/* #define TINY_GAME	/* for debugging */
X
X/*
X * mines header
X *
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	MAX_BOARD_ROWS		100
X#define MAX_BOARD_COLS		100
X#define DEFAULT_BOARD_ROWS	12
X#define DEFAULT_BOARD_COLS	12
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    BOOL visited;		/* has connected test looked here yet?	*/
X    int nearby;			/* number of mines nearby.		*/
X    short row,col;
X    Widget w;
X} Square;
X
X/* end */
END_OF_mines.h
if test 2111 -ne `wc -c patchlevel.h <<'END_OF_patchlevel.h'
X/*
X * Copyright 1990 Globetrotter Software, Inc.
X *
X * Permission to use, copy, modify, distribute, and sell this software and its
X * documentation for any purpose is hereby granted without fee, provided that
X * the above copyright notice appear in all copies and that both that
X * copyright notice and this permission notice appear in supporting
X * documentation, and that the name of Globetrotter Software not be used
X * in advertising or publicity pertaining to distribution of the software
X * without specific, written prior permission.  Globetrotter Software makes
X * no representations about the suitability of this software for any purpose.
X * It is provided "as is" without express or implied warranty.
X *
X * GLOBETROTTER SOFTWARE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
X * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.  IN NO
X * EVENT SHALL GLOBETROTTER SOFTWARE BE LIABLE FOR ANY SPECIAL, INDIRECT OR
X * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
X * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
X * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
X * OF THIS SOFTWARE.
X *
X * Author:  Jim McBeath, Globetrotter Software
X *	    globes!jimmc@oliveb.olivetti.com
X *	    (408)741-0489
X */
X
X/* patchlevel.h for xmines
X */
X
Xchar *MinesVersion = "XMines v1.1";
X
X/*
X * Current patchlevel is 0 - this is the original!
X */
X
X/* end */
END_OF_patchlevel.h
if test 1453 -ne `wc -c actions.c <<'END_OF_actions.c'
X/*
X * Copyright 1990 Globetrotter Software, Inc.
X *
X * Permission to use, copy, modify, distribute, and sell this software and its
X * documentation for any purpose is hereby granted without fee, provided that
X * the above copyright notice appear in all copies and that both that
X * copyright notice and this permission notice appear in supporting
X * documentation, and that the name of Globetrotter Software not be used
X * in advertising or publicity pertaining to distribution of the software
X * without specific, written prior permission.  Globetrotter Software makes
X * no representations about the suitability of this software for any purpose.
X * It is provided "as is" without express or implied warranty.
X *
X * GLOBETROTTER SOFTWARE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
X * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.  IN NO
X * EVENT SHALL GLOBETROTTER SOFTWARE BE LIABLE FOR ANY SPECIAL, INDIRECT OR
X * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
X * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
X * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
X * OF THIS SOFTWARE.
X *
X * Author:  Jim McBeath, Globetrotter Software
X *	    globes!jimmc@oliveb.olivetti.com
X *	    (408)741-0489
X */
X
X/* actions.c - action functions
X */
X
X#include 
X#include "mines.h"
X
Xextern int BoardRows, BoardCols;
X
Xextern Square *GetSquare();
X
Xvoid
XDrawCell(w,ev,params,num_params)
XWidget w;
XXEvent *ev;
XString *params;
XCardinal *num_params;
X{
X	int row, col;
X	Square *sqp, *GetWidgetSquare();
X
X	if (*num_params == 0) {
X		sqp = GetWidgetSquare(w);
X		DrawSquare(sqp);
X		return;
X	}
X	if (*num_params != 2)
X		return;
X	row = atoi(params[0]);
X	col = atoi(params[1]);
X	if (row<0 || row>=BoardRows)
X		return;
X	if (col<0 || col>=BoardCols)
X		return;
X	sqp = GetSquare(row,col);
X	DrawSquare(sqp);
X}
X
Xvoid
XMovePlayer(w,ev,params,num_params)
XWidget w;
XXEvent *ev;
XString *params;
XCardinal *num_params;
X{
X	Square *sqp;
X
X	if (*num_params != 0)
X		return;
X	sqp = GetWidgetSquare(w);
X	if (!sqp)
X		return;
X	DoMove(sqp);
X}
X
Xvoid
XMarkMined(w,ev,params,num_params)
XWidget w;
XXEvent *ev;
XString *params;
XCardinal *num_params;
X{
X	Square *sqp;
X
X	if (*num_params != 0)
X		return;
X	sqp = GetWidgetSquare(w);
X	if (!sqp)
X		return;
X	MarkSquare(sqp,FALSE);
X}
X
Xvoid
XMarkSafe(w,ev,params,num_params)
XWidget w;
XXEvent *ev;
XString *params;
XCardinal *num_params;
X{
X	Square *sqp;
X
X	if (*num_params != 0)
X		return;
X	sqp = GetWidgetSquare(w);
X	if (!sqp)
X		return;
X	MarkSquare(sqp,TRUE);
X}
X
XXtActionsRec actions[] = {
X	{ "DrawCell", DrawCell},
X	{ "MovePlayer", MovePlayer},
X	{ "MarkMined", MarkMined},
X	{ "MarkSafe", MarkSafe},
X};
X
XInitActions(appctx)
XXtAppContext appctx;
X{
X	XtAppAddActions(appctx,actions,XtNumber(actions));
X}
X
X/* end */
END_OF_actions.c
if test 2816 -ne `wc -c board.c <<'END_OF_board.c'
X/*
X * Copyright (c) 1987 Tom Anderson; 20831 Frank Waters Road;
X * Stanwood, WA  98282.
X *
X * Permission to use, copy, modify, distribute, and sell this software and its
X * documentation for any purpose is hereby granted without fee, provided that
X * the above copyright notice appear in all copies and that both that
X * copyright notice and this permission notice appear in supporting
X * documentation, and that the name of Tom Anderson not be used
X * in advertising or publicity pertaining to distribution of the software
X * without specific, written prior permission.  Tom Anderson makes
X * no representations about the suitability of this software for any purpose.
X * It is provided "as is" without express or implied warranty.
X *
X * TOM ANDERSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
X * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.  IN NO
X * EVENT SHALL TOM ANDERSON BE LIABLE FOR ANY SPECIAL, INDIRECT OR
X * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
X * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
X * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
X * OF THIS SOFTWARE.
X *
X */
X
X/*
X * manage the board state
X *
X */
Xstatic char copyright[] = "Copyright 1987 Tom Anderson";
X
X#include 
X#include 
X#include 
X
X#include 
X#include "mines.h"
X
Xextern char *malloc();
X
XSquare **MainBoard;
Xint BoardRows;
Xint BoardCols;
XSquare *PlayerSquare;
XBOOL GameOver;
XBOOL Impossible;
X
Xstatic int lastlevel;
X
Xstatic char *
Xs_malloc(size)
Xint size;
X{
X	char *p;
X
X	p = malloc(size);
X	if (!p) {
X		fprintf(stderr,"Can't allocate memory for playing board\n");
X		exit(1);
X	}
X	return p;
X}
X
Xvoid
XAllocBoard(numrows,numcols,deflevel)
Xint numrows,numcols;
Xint deflevel;	/* default number of mines to put in */
X{
X	int i;
X
X	BoardRows = numrows;
X	BoardCols = numcols;
X
X	if (BoardRows < 3)
X		BoardRows = 3;
X	if (BoardCols < 3)
X		BoardCols = 3;
X	if (BoardRows > MAX_BOARD_ROWS)
X		BoardRows = MAX_BOARD_ROWS;
X	if (BoardCols > MAX_BOARD_COLS)
X		BoardCols = MAX_BOARD_COLS;
X
X	MainBoard = (Square **)s_malloc(BoardRows * sizeof(Square *));
X	for (i=0; i0)	/* set default mine quantity */
X		lastlevel = deflevel;
X	else
X		lastlevel = (BoardRows + BoardCols) / 2;
X}
X
X/*
X * set up the playing surface at the beginning of the game
X */
Xvoid
XInitBoard(level)
Xint level;			/* number of mines */
X{
X	register int i, j, minesPlaced, cutoff;
X	register Square * sqp;
X	int pass = 0;
X	void MazeConnected();
X	char *MineWarningMessage();
X
X	if (level<=0) level=lastlevel;
X	if (level > (BoardRows*BoardCols-5))
X		level = BoardRows*BoardCols-5;	/* avoid infinite loop below */
X	lastlevel = level;
X	SetMineCountDisplay(level);
X
X	/* zero the board */
X	for (i = 0 ; i < BoardRows ; i++) {
X		for (j = 0 ; j < BoardCols ; j++) {
X			sqp = &MainBoard[i][j];
X			sqp->traversed = sqp->mined = sqp->occupied 
X			    = sqp->unsafe = sqp->safe = FALSE;
X			sqp->nearby = 0;
X			sqp->visited = FALSE;
X			sqp->row = i;
X			sqp->col = j;
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 < BoardRows ; i++) {
X			for (j = 0 ; j < BoardCols ; j++) {
X				if ((random() % (BoardRows * BoardCols)) w == w) {
X				return sqp;
X			}
X		}
X	}
X	return NULL;
X}
X
X/* toggle a square's marking as being probably safe or unsafe */
Xvoid
XMarkSquare(sqp,safe)
XSquare *sqp;
XBOOL safe;
X{
X	if (sqp->traversed)
X		return;
X
X	if (safe) {
X#ifndef NOSCORE
X		IncrSafesMarked(sqp->safe ? -1 : 1);
X		IncrMinesMarked(sqp->unsafe ? -1 : 0);
X#endif
X		sqp->safe = ! sqp->safe;
X		sqp->unsafe = FALSE;
X	} else {
X#ifndef NOSCORE
X		IncrSafesMarked(sqp->safe ? -1 : 0);
X		IncrMinesMarked(sqp->unsafe ? -1 : 1);
X#endif
X		sqp->unsafe = ! sqp->unsafe;
X		sqp->safe = FALSE;
X	}
X	DrawSquare(sqp);
X}
X
X
X/* try to move to a certain board coordinate */
Xvoid 
XDoMove(sqp)
XSquare *sqp;
X{
X	int row,col;
X	register int y = PlayerSquare->row;
X	register int x = PlayerSquare->col;
X
X	row = sqp->row;
X	col = sqp->col;
X	if ((col == x) && (row == y)) return;
X	if (MainBoard[row][col].unsafe) return;
X
X	if ((abs(col - x) > 1) || (abs(row - y) > 1)) {
X		int xx, yy;
X
X		/* allow moving to any square which is or is adjacent to
X		 * a traversed square */
X		for (xx = col - 1 ; xx <= col + 1 ; xx++) {
X			for (yy = row - 1 ; yy <= row + 1 ; yy++) {
X				if (xx >= 0 && xx < BoardCols &&
X				    yy >= 0 && yy < BoardRows &&
X				    MainBoard[yy][xx].traversed) goto ok;
X			}
X		}
X		return;
X	}
X
Xok:
X
X#ifndef NOSCORE
X	IncrNumberMoves(1);
X#endif
X
X	/* step off our current square */
X	MainBoard[y][x].occupied = FALSE;
X	DrawSquare(PlayerSquare);
X	sqp = &MainBoard[row][col];
X
X	/* if we stepped on a mine, blow him up */
X	if (sqp->mined) {
X		GameOver = TRUE;
X		Message("You just exploded.  ");
X		DrawBoard(0);
X	}
X
X	/* else if this is home, render congratulations */
X	else if (col == BoardCols-1 && row == BoardRows-1) {
X		PlayerSquare = sqp;
X		sqp->traversed = sqp->occupied = TRUE;
X		GameOver = TRUE;
X		Message("You honestly made it!");
X		DrawBoard(0);
X	}
X
X	/* else move onto the new square */
X	else {
X		/* if player marked that square as safe, unmark */
X		if (sqp->safe) {
X#ifndef NOSCORE
X			IncrSafesMarked(-1);
X#endif
X			sqp->safe = FALSE;
X		}
X		PlayerSquare = sqp;
X		Message(MineWarningMessage());
X		sqp->traversed = sqp->occupied = TRUE;
X		DrawSquare(sqp);
X	}
X}
X
XSquare *
XGetHintSquare()	/* returns pointer to a square suitable for a hint; or NULL */
X{
X	int i;
X	int j;
X	int x = PlayerSquare->col;
X	int y = PlayerSquare->row;
X
X	for (j = y-1; j <= y+1; j++) {
X		if (j < 0 || j == BoardRows) continue;
X		for (i = x-1; i <= x+1; i++) {
X			if (i < 0 || i == BoardCols) continue;
X			if (j == y && i == x) continue;
X
X			if (MainBoard[j][i].traversed) continue;
X
X			if (!MainBoard[j][i].mined) {
X
X#ifndef NOSCORE
X				IncrHints(1);
X#endif
X				MainBoard[j][i].safe = TRUE;
X				MainBoard[j][i].unsafe = FALSE;
X
X				return (GetSquare(j,i));
X			}
X		}
X	}
X	return NULL;
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 = 0;
X
X	if (!PlayerSquare->traversed) {
X		for (x = PlayerSquare->col - 1 ;
X		     x <= PlayerSquare->col + 1 ;
X		     x++) {
X			for (y = PlayerSquare->row - 1 ;
X			     y <= PlayerSquare->row + 1 ;
X			     y++) {
X				if (x >= 0 && x < BoardCols &&
X				    y >= 0 && y < BoardRows &&
X				    MainBoard[y][x].mined)
X					minesFound++;
X			}
X		}
X		PlayerSquare->nearby = minesFound;
X	} else {
X		minesFound = PlayerSquare->nearby;
X	}
X
X	if (minesFound == 0) {
X		sprintf(warning, "No mines nearby.");
X	} else if (minesFound == 1) {
X		sprintf(warning, "1 mine nearby.");
X	} else {
X		sprintf(warning, "%d mines nearby.", minesFound);
X	}
X
X	return(warning);
X}
X
X/* end */
END_OF_board.c
if test 8437 -ne `wc -c buttons.c <<'END_OF_buttons.c'
X/*
X * Copyright 1990 Globetrotter Software, Inc.
X *
X * Permission to use, copy, modify, distribute, and sell this software and its
X * documentation for any purpose is hereby granted without fee, provided that
X * the above copyright notice appear in all copies and that both that
X * copyright notice and this permission notice appear in supporting
X * documentation, and that the name of Globetrotter Software not be used
X * in advertising or publicity pertaining to distribution of the software
X * without specific, written prior permission.  Globetrotter Software makes
X * no representations about the suitability of this software for any purpose.
X * It is provided "as is" without express or implied warranty.
X *
X * GLOBETROTTER SOFTWARE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
X * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.  IN NO
X * EVENT SHALL GLOBETROTTER SOFTWARE BE LIABLE FOR ANY SPECIAL, INDIRECT OR
X * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
X * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
X * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
X * OF THIS SOFTWARE.
X *
X * Author:  Jim McBeath, Globetrotter Software
X *	    globes!jimmc@oliveb.olivetti.com
X *	    (408)741-0489
X */
X
X/* buttons.c - command button processing
X */
X
X#include 
X#include 
X#include 
X#include 
X#include 
X#include "mines.h"
X
X#define MBUFSIZE 6
Xchar MineCountBuf[MBUFSIZE];
XWidget TotalMineCountWidget;
X
Xvoid
XSetMineCountDisplay(n)
Xint n;
X{
X	char mbuf[MBUFSIZE];
X	Arg arg;
X
X	bzero(mbuf,sizeof(mbuf));
X	sprintf(mbuf,"%d",n);
X	XtSetArg(arg,"string",mbuf);
X	XtSetValues(TotalMineCountWidget,&arg,1);
X}
X
Xstatic void
XRestartGameCB(w,client_data,call_data)
XWidget w;
Xcaddr_t client_data, call_data;	/* ignored */
X{
X	int n;
X	Arg arg;
X	char *ss;
X
X	XtSetArg(arg,"string",&ss);
X	XtGetValues(TotalMineCountWidget,&arg,1);
X	n = atoi(ss);
X	InitBoard(n);
X	DrawBoard(1);	/* redraw the board */
X}
X
Xstatic void
XQuitCB(w,client_data,call_data)
XWidget w;
Xcaddr_t client_data, call_data;	/* ignored */
X{
X	exit(0);	/* TBD - any saving options or anything? */
X}
X
Xstatic void
XGiveHintCB(w,client_data,call_data)
XWidget w;
Xcaddr_t client_data, call_data;	/* ignored */
X{
X	Square *sqp, *GetHintSquare();
X
X	sqp = GetHintSquare();
X	if (!sqp)
X		return;
X	DrawSquare(sqp);
X}
X
XWidget
XInitButtons(parent,above)
XWidget parent;
XWidget above;
X{
X	int i;
X	Arg args[10];
X	Widget lasthwidget, minecountw;
X
X	i = 0;
X	XtSetArg(args[i],XtNfromVert,above);
X	i++;
X	lasthwidget = XtCreateManagedWidget("countlabel",
X			labelWidgetClass, parent, args, i);
X
X	i = 0;
X	XtSetArg(args[i],XtNfromVert,above);
X	i++;
X	XtSetArg(args[i],XtNfromHoriz,lasthwidget);
X	i++;
X	XtSetArg(args[i],XtNeditType,XawtextEdit);
X	i++;
X	XtSetArg(args[i],XtNstring,MineCountBuf);
X	i++;
X	XtSetArg(args[i],XtNlength,sizeof(MineCountBuf)-1);
X	i++;
X	lasthwidget = TotalMineCountWidget = XtCreateManagedWidget(
X		"mineinputcount",asciiTextWidgetClass, parent, args, i);
X	minecountw = lasthwidget;
X
X	i = 0;
X	XtSetArg(args[i],XtNfromVert,above);
X	i++;
X	XtSetArg(args[i],XtNfromHoriz,lasthwidget);
X	i++;
X	lasthwidget = XtCreateManagedWidget("restart",
X			commandWidgetClass, parent, args, i);
X	XtAddCallback(lasthwidget,XtNcallback,RestartGameCB,(caddr_t)0);
X	XtInstallAccelerators(minecountw,lasthwidget);
X
X	i = 0;
X	XtSetArg(args[i],XtNfromVert,above);
X	i++;
X	XtSetArg(args[i],XtNfromHoriz,lasthwidget);
X	i++;
X	lasthwidget = XtCreateManagedWidget("hint",
X			commandWidgetClass, parent, args, i);
X	XtAddCallback(lasthwidget,XtNcallback,GiveHintCB,(caddr_t)0);
X
X	i = 0;
X	XtSetArg(args[i],XtNfromVert,above);
X	i++;
X	XtSetArg(args[i],XtNfromHoriz,lasthwidget);
X	i++;
X	lasthwidget = XtCreateManagedWidget("quit",
X			commandWidgetClass, parent, args, i);
X	XtAddCallback(lasthwidget,XtNcallback,QuitCB,(caddr_t)0);
X
X	return lasthwidget;
X}
X
X/* end */
END_OF_buttons.c
if test 3958 -ne `wc -c draw.c <<'END_OF_draw.c'
X/*
X * Copyright 1990 Globetrotter Software, Inc.
X *
X * Permission to use, copy, modify, distribute, and sell this software and its
X * documentation for any purpose is hereby granted without fee, provided that
X * the above copyright notice appear in all copies and that both that
X * copyright notice and this permission notice appear in supporting
X * documentation, and that the name of Globetrotter Software not be used
X * in advertising or publicity pertaining to distribution of the software
X * without specific, written prior permission.  Globetrotter Software makes
X * no representations about the suitability of this software for any purpose.
X * It is provided "as is" without express or implied warranty.
X *
X * GLOBETROTTER SOFTWARE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
X * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.  IN NO
X * EVENT SHALL GLOBETROTTER SOFTWARE BE LIABLE FOR ANY SPECIAL, INDIRECT OR
X * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
X * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
X * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
X * OF THIS SOFTWARE.
X *
X * Author:  Jim McBeath, Globetrotter Software
X *	    globes!jimmc@oliveb.olivetti.com
X *	    (408)741-0489
X */
X
X/* draw.c - functions to draw stuff on the screen
X */
X
X#include 
X#include 
X#include "mines.h"
X
X/* include all of the bitmaps */
X#include "bMine.xbm"		/* bad mine */
X#include "bMineSm.xbm"		/* bad mine, small version */
X#include "bSafe.xbm"		/* bad safee */
X#include "bSafeSm.xbm"
X#include "hMine.xbm"		/* hidden mine */
X#include "hMineSm.xbm"
X#include "mine.xbm"
X#include "mineSm.xbm"
X#include "safe.xbm"
X#include "safeSm.xbm"
X
X#include "e0.xbm"		/* empty traversed square with 0 mines around */
X#include "e0Sm.xbm"		/* small version of 0-mine empty */
X#include "e1.xbm"		/* one mine in neighboring cells */
X#include "e1Sm.xbm"
X#include "e2.xbm"
X#include "e2Sm.xbm"
X#include "e3.xbm"
X#include "e3Sm.xbm"
X#include "e4.xbm"
X#include "e4Sm.xbm"
X#include "e5.xbm"
X#include "e5Sm.xbm"
X#include "e6.xbm"
X#include "e6Sm.xbm"
X#include "e7.xbm"
X#include "e7Sm.xbm"
X#include "e8.xbm"
X#include "e8Sm.xbm"
X
X#include "pl0.xbm"		/* player square with 0 mine around it */
X#include "pl0Sm.xbm"		/* small version of 0-mine player square */
X#include "pl1.xbm"
X#include "pl1Sm.xbm"
X#include "pl2.xbm"
X#include "pl2Sm.xbm"
X#include "pl3.xbm"
X#include "pl3Sm.xbm"
X#include "pl4.xbm"
X#include "pl4Sm.xbm"
X#include "pl5.xbm"
X#include "pl5Sm.xbm"
X#include "pl6.xbm"
X#include "pl6Sm.xbm"
X#include "pl7.xbm"
X#include "pl7Sm.xbm"
X#include "pl8.xbm"
X#include "pl8Sm.xbm"
X
Xextern int BoardRows, BoardCols;
Xextern BOOL GameOver;
X
Xextern Square *GetSquare();
X
X/* bitmaps and small bitmaps */
XPixmap MineSquareBM, BadMineSquareBM, HiddenMineSquareBM;
XPixmap MineSquareSBM, BadMineSquareSBM, HiddenMineSquareSBM;
XPixmap SafeSquareBM, BadSafeSquareBM;
XPixmap SafeSquareSBM, BadSafeSquareSBM;
X
XPixmap player_squaresBM[9];
XPixmap player_squaresSBM[9];
XPixmap numbered_squaresBM[9];
XPixmap numbered_squaresSBM[9];
X
XInitBitmaps(dpy,win)
XDisplay *dpy;
XWindow win;
X{
X#define BB(var,file) \
X	var = XCreateBitmapFromData(dpy,win,\
X		file/**/_bits,file/**/_width,file/**/_height);
X	BB(MineSquareBM,mine);
X	BB(MineSquareSBM,mineSmall);
X	BB(BadMineSquareBM,badmine);
X	BB(BadMineSquareSBM,badmineSmall);
X	BB(HiddenMineSquareBM,hiddenmine);
X	BB(HiddenMineSquareSBM,hiddenmineSmall);
X	BB(SafeSquareBM,safe);
X	BB(SafeSquareSBM,safeSmall);
X	BB(BadSafeSquareBM,badsafe);
X	BB(BadSafeSquareSBM,badsafeSmall);
X	BB(player_squaresBM[0],plZero);
X	BB(player_squaresSBM[0],plZeroSmall);
X	BB(player_squaresBM[1],plOne);
X	BB(player_squaresSBM[1],plOneSmall);
X	BB(player_squaresBM[2],plTwo);
X	BB(player_squaresSBM[2],plTwoSmall);
X	BB(player_squaresBM[3],plThree);
X	BB(player_squaresSBM[3],plThreeSmall);
X	BB(player_squaresBM[4],plFour);
X	BB(player_squaresSBM[4],plFourSmall);
X	BB(player_squaresBM[5],plFive);
X	BB(player_squaresSBM[5],plFiveSmall);
X	BB(player_squaresBM[6],plSix);
X	BB(player_squaresSBM[6],plSixSmall);
X	BB(player_squaresBM[7],plSeven);
X	BB(player_squaresSBM[7],plSevenSmall);
X	BB(player_squaresBM[8],plEight);
X	BB(player_squaresSBM[8],plEightSmall);
X	BB(numbered_squaresBM[0],zero);
X	BB(numbered_squaresSBM[0],zeroSmall);
X	BB(numbered_squaresBM[1],one);
X	BB(numbered_squaresSBM[1],oneSmall);
X	BB(numbered_squaresBM[2],two);
X	BB(numbered_squaresSBM[2],twoSmall);
X	BB(numbered_squaresBM[3],three);
X	BB(numbered_squaresSBM[3],threeSmall);
X	BB(numbered_squaresBM[4],four);
X	BB(numbered_squaresSBM[4],fourSmall);
X	BB(numbered_squaresBM[5],five);
X	BB(numbered_squaresSBM[5],fiveSmall);
X	BB(numbered_squaresBM[6],six);
X	BB(numbered_squaresSBM[6],sixSmall);
X	BB(numbered_squaresBM[7],seven);
X	BB(numbered_squaresSBM[7],sevenSmall);
X	BB(numbered_squaresBM[8],eight);
X	BB(numbered_squaresSBM[8],eightSmall);
X}
X
X/*
X * draw a square
X */
Xvoid
XDrawSquare(sqp)
XSquare *sqp;
X{
X	Pixmap bm,sbm;
X	String bmname;
X	char nbuf[30];
X	Widget w;
X	Window win;
X	Display *dpy;
X	GC gc;
X	int width,height,bmsize;
X	int dx,dy;
X	int i;
X	Arg args[10];
X	static int lastwidth, lastheight;
X
X	if (!sqp)
X		return;
X	/* determine which bitmap to paint the square with */
X	if (sqp->occupied) {
X		bm = player_squaresBM[sqp->nearby];
X		sbm = player_squaresSBM[sqp->nearby];
X		sprintf(nbuf,"pl%d",sqp->nearby);
X		bmname = nbuf;
X	} else if (sqp->traversed) {
X		bm = numbered_squaresBM[sqp->nearby];
X		sbm = numbered_squaresSBM[sqp->nearby];
X		sprintf(nbuf,"%d",sqp->nearby);
X		bmname = nbuf;
X	} else if (GameOver) {
X		if (sqp->mined) {
X			if (sqp->safe) {
X				bm = BadSafeSquareBM;
X				sbm = BadSafeSquareSBM;
X				bmname = "badsafe";
X			} else if (sqp->unsafe) {
X				bm = MineSquareBM;
X				sbm = MineSquareSBM;
X				bmname = "mine";
X			} else {
X				bm = HiddenMineSquareBM;
X				sbm = HiddenMineSquareSBM;
X				bmname = "hiddenmine";
X			}
X		} else {
X			if (sqp->unsafe) {
X				bm = BadMineSquareBM;
X				sbm = BadMineSquareSBM;
X				bmname = "badmine";
X			} else if (sqp->safe) {
X				bm = SafeSquareBM;
X				sbm = SafeSquareSBM;
X				bmname = "safe";
X			} else {
X				bm = sbm = NULL;
X				bmname = "white";
X			}
X		}
X	} else if (sqp->unsafe) {
X		bm = MineSquareBM;
X		sbm = MineSquareSBM;
X		bmname = "mine";
X	} else if (sqp->safe) {
X		bm = SafeSquareBM;
X		sbm = SafeSquareSBM;
X		bmname = "safe";
X	} else {
X		bm = sbm = NULL;
X		bmname = "white";
X	}
X
X	/* paint the square */
X	w = sqp->w;
X	win = XtWindow(w);
X	dpy = XtDisplay(w);
X	gc = XDefaultGC(dpy,XDefaultScreen(dpy));
X	XClearWindow(dpy,win);
X#if 0 /* doesn't work */
X	i=0;
X	XtSetArg(args[i],XtNwidth,&width);
X	i++;
X	XtSetArg(args[i],XtNheight,&height);
X	i++;
X	XtGetValues(w,args,i);
X#else
X/* a hack to avoid getting the size for every cell */
X	if (sqp->row==0 && sqp->col==0) {
X		Window root;
X		int x,y,bwidth,depth;
X		XGetGeometry(dpy,win,&root,&x,&y,&width,&height,&bwidth,&depth);
X		lastwidth = width;
X		lastheight = height;
X	} else {
X		width = lastwidth;
X		height = lastheight;
X	}
X#endif
X	if (width<32 || height<32) {
X		bm = sbm;	/* use small bitmap */
X		bmsize = 16;
X	} else {
X		bmsize = 32;
X	}
X	dx = (width-bmsize)/2;
X	dy = (height-bmsize)/2;
X	if (bm) {
X		XCopyPlane(dpy,bm,win,gc,0,0,bmsize,bmsize,dx,dy,1);
X	}
X#if 0
X	XDrawImageString(dpy,win,gc,0,12,bmname,strlen(bmname));
X#endif
X}
X
Xvoid
XDrawBoard(clearflag)
Xint clearflag;	/* ignored for now */
X{
X	int x,y;
X	Square *sqp;
X
X	for (y=0; yinfo.c <<'END_OF_info.c'
X/*
X * Copyright 1990 Globetrotter Software, Inc.
X *
X * Permission to use, copy, modify, distribute, and sell this software and its
X * documentation for any purpose is hereby granted without fee, provided that
X * the above copyright notice appear in all copies and that both that
X * copyright notice and this permission notice appear in supporting
X * documentation, and that the name of Globetrotter Software not be used
X * in advertising or publicity pertaining to distribution of the software
X * without specific, written prior permission.  Globetrotter Software makes
X * no representations about the suitability of this software for any purpose.
X * It is provided "as is" without express or implied warranty.
X *
X * GLOBETROTTER SOFTWARE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
X * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.  IN NO
X * EVENT SHALL GLOBETROTTER SOFTWARE BE LIABLE FOR ANY SPECIAL, INDIRECT OR
X * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
X * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
X * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
X * OF THIS SOFTWARE.
X *
X * Author:  Jim McBeath, Globetrotter Software
X *	    globes!jimmc@oliveb.olivetti.com
X *	    (408)741-0489
X */
X
X/* info.c - add an info button to a form; it will pop up an info panel
X *
X * 19.Jul.90  jimmc  Initial definition
X */
X
X#include 
X#include 
X#include 
X#include 
X#include 
X#include "mines.h"
X
Xextern char *MinesVersion;
X
Xstatic char infotext[] = "\
XCopyright 1990 Globetrotter Software, Inc.\n\
XPortions Copyright 1987 Tom Anderson.\n\
XThis software is freely redistributable\n\
X(with some restrictions).\n\
X\n\
XOriginal version written by Tom Anderson;\n\
Xmodified by Brian Dalio;\n\
Xmodified and ported to X11 by Jim McBeath.";
X
Xstatic void
XInfoCB(w,client_data,call_data)
XWidget w;
Xcaddr_t client_data, call_data;	/* ignored */
X{
X	Widget shell = (Widget)client_data;
X
X	XtPopup(shell,XtGrabNone);
X}
X
Xstatic void
XInfoDownCB(w,client_data,call_data)
XWidget w;
Xcaddr_t client_data, call_data;	/* ignored */
X{
X	Widget shell = (Widget)client_data;
X
X	XtPopdown(shell);
X}
X
Xvoid
XInitInfoButton(topw,parent,fromhoriz)
XWidget topw;
XWidget parent;
XWidget fromhoriz;
X{
X	int i;
X	Arg args[10];
X	Widget infoshell, infoform, w;
X
X/* first, make the popup with the info in it */
X	i = 0;
X	infoshell = XtCreatePopupShell("xmines_info",
X		applicationShellWidgetClass,
X			topw,args,i);
X
X	i = 0;
X	infoform = XtCreateManagedWidget("info",formWidgetClass,
X			infoshell,args,i);
X
X	i = 0;
X	XtSetArg(args[i],XtNlabel,MinesVersion);
X	i++;
X	w = XtCreateManagedWidget("version",labelWidgetClass,infoform,args,i);
X
X	i = 0;
X	XtSetArg(args[i],XtNlabel,infotext);
X	i++;
X	XtSetArg(args[i],XtNfromVert,w);
X	i++;
X	w = XtCreateManagedWidget("text",commandWidgetClass,infoform,args,i);
X		/* put in the text */
X	XtAddCallback(w,XtNcallback,InfoDownCB,(caddr_t)infoshell);
X
X/* now add a button to the parent form which will bring up the info popup */
X	i = 0;
X	XtSetArg(args[i],XtNfromHoriz,fromhoriz);
X	i++;
X	w = XtCreateManagedWidget("info",
X			commandWidgetClass, parent, args, i);
X	XtAddCallback(w,XtNcallback,InfoCB,(caddr_t)infoshell);
X}
X
X/* end */
END_OF_info.c
if test 3308 -ne `wc -c main.c <<'END_OF_main.c'
X/*
X * Copyright 1990 Globetrotter Software, Inc.
X *
X * Permission to use, copy, modify, distribute, and sell this software and its
X * documentation for any purpose is hereby granted without fee, provided that
X * the above copyright notice appear in all copies and that both that
X * copyright notice and this permission notice appear in supporting
X * documentation, and that the name of Globetrotter Software not be used
X * in advertising or publicity pertaining to distribution of the software
X * without specific, written prior permission.  Globetrotter Software makes
X * no representations about the suitability of this software for any purpose.
X * It is provided "as is" without express or implied warranty.
X *
X * GLOBETROTTER SOFTWARE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
X * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.  IN NO
X * EVENT SHALL GLOBETROTTER SOFTWARE BE LIABLE FOR ANY SPECIAL, INDIRECT OR
X * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
X * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
X * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
X * OF THIS SOFTWARE.
X *
X * Author:  Jim McBeath, Globetrotter Software
X *	    globes!jimmc@oliveb.olivetti.com
X *	    (408)741-0489
X */
X
X/* xmines - the minestool game for X11
X */
X
X#include 
X#include 
X#include 
X#include 
X#include  
X#include 
X#include "mines.h"
X#include "patchlevel.h"	/* pick up the version string */
X
Xchar *Progname;
XXtAppContext appctx;
X
X/* we use the AppResources structure to collect info from the calls to
X * XtGetApplicationResources.
X */
Xtypedef struct {
X	int cellsize;	/* width and height of each cell in the array */
X	int numrows, numcols;
X	int minecount;
X} AppResources, *AppResourcesPtr;
X
X/* a place to put data into from the call to XtGetApplicationResources. */
Xstatic AppResources Adata = { 32, DEFAULT_BOARD_ROWS, DEFAULT_BOARD_COLS};
X
X/* fallback resources in case we can't find the app-defaults file */
Xstatic String fallback_resources[] = {
X	"*Cell.height: 32",
X	"*Cell.width: 32",
X	"*ArraySize: 12",
X	"*Mines: 26",
X	"*cell.*.translations: #override \n\
X		 : MovePlayer() \n\
X		 : MarkMined() \n\
X		 : MarkSafe()",
X	"*mineinputcount.accelerators: #override \n\
X		R : set() notify() unset() \n\
X		Return : set() notify() unset()",
X	"*restart.accelerators: #override \n\
X		R : set() notify() unset() \n\
X		Return : set() notify() unset()",
X	NULL
X};
X
X/* command line options */
Xstatic XrmOptionDescRec options[] = {
X	{"-cellsize",	"cellSize",	XrmoptionSepArg,   NULL },
X	{"-rows",	"rows",		XrmoptionSepArg,   NULL },
X	{"-columns",	"columns",	XrmoptionSepArg,   NULL },
X	{"-mines",	"mines",	XrmoptionSepArg,   NULL },
X};
X
X/* resource items that can be specified in the users resources database
X * (e.g. xmines*cellsize)
X */
Xstatic XtResource resources[] = {
X	{"cellSize", "CellSize", XtRInt, sizeof(int),
X		XtOffset(AppResourcesPtr,cellsize), XtRInt, (char *)0},
X	{"rows", "ArraySize", XtRInt, sizeof(int),
X		XtOffset(AppResourcesPtr,numrows), XtRInt, (char *)0},
X	{"columns", "ArraySize", XtRInt, sizeof(int),
X		XtOffset(AppResourcesPtr,numcols), XtRInt, (char *)0},
X	{"mines", "Mines", XtRInt, sizeof(int),
X		XtOffset(AppResourcesPtr,minecount), XtRInt, (char *)0},
X};
X
X
Xvoid usage()
X{
Xfprintf(stderr,"usage: %s\n",Progname);
Xfprintf(stderr,
X  "       [-cellsize]");
Xexit(1);
X}
X
Xvoid main(argc, argv)
Xint argc;
Xchar *argv[];
X{
X	char host[256];
X	Widget top;
X	Arg arg;
X	int i,n;
X	Display *dpy;
X	XrmDatabase rmdb;
X
X	Progname = rindex(argv[0],'/');
X	if (Progname) Progname++;
X	else Progname=argv[0];
X
X#if 0
X/* If I call these functions instead of XtInitialize, I get error messages
X * about not having a type converter registered for String to Orientation.
X */
X	XtToolkitInitialize();
X	appctx = XtCreateApplicationContext();
X	XtAppSetFallbackResources(appctx,fallback_resources);
X	dpy = XtOpenDisplay(appctx,NULL,Progname,"XMines",
X		options,XtNumber(options),&argc,argv);
X	top = XtAppCreateShell(Progname,"XMines",
X		applicationShellWidgetClass,dpy,NULL,0);
X	if (argc != 1) usage();
X#else
X#if 0
X	top = XtInitialize(Progname,"XMines",options,XtNumber(options),
X		&argc,argv);
X	appctx = XtWidgetToApplicationContext(top);
X	XtAppSetFallbackResources(appctx,fallback_resources);
X	dpy = XtDisplay(top);
X#else
X	top = XtAppInitialize(&appctx,"XMines",options,XtNumber(options),
X		&argc,argv,fallback_resources,NULL,0);
X	dpy = XtDisplay(top);
X#endif
X#endif
X	InitActions(appctx);
X
X	XtGetApplicationResources(top,&Adata,resources,XtNumber(resources),
X		NULL,0);
X	if (Adata.cellsize==0)
X		Adata.cellsize = 32;
X
X	if (Adata.numrows==0)
X		Adata.numrows = DEFAULT_BOARD_ROWS;
X	if (Adata.numcols==0)
X		Adata.numcols = DEFAULT_BOARD_COLS;
X
X	AllocBoard(Adata.numrows,Adata.numcols,Adata.minecount);
X
X	makeform(top,Adata.numrows,Adata.numcols,Adata.cellsize);
X	XtRealizeWidget(top);
X	InitBitmaps(dpy,XtWindow(top));
X	InitBoard(0);
X	XtAppMainLoop(appctx);
X	/* NOTREACHED */
X}
X
X/* end */
END_OF_main.c
if test 5104 -ne `wc -c makeform.c <<'END_OF_makeform.c'
X/*
X * Copyright 1990 Globetrotter Software, Inc.
X *
X * Permission to use, copy, modify, distribute, and sell this software and its
X * documentation for any purpose is hereby granted without fee, provided that
X * the above copyright notice appear in all copies and that both that
X * copyright notice and this permission notice appear in supporting
X * documentation, and that the name of Globetrotter Software not be used
X * in advertising or publicity pertaining to distribution of the software
X * without specific, written prior permission.  Globetrotter Software makes
X * no representations about the suitability of this software for any purpose.
X * It is provided "as is" without express or implied warranty.
X *
X * GLOBETROTTER SOFTWARE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
X * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.  IN NO
X * EVENT SHALL GLOBETROTTER SOFTWARE BE LIABLE FOR ANY SPECIAL, INDIRECT OR
X * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
X * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
X * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
X * OF THIS SOFTWARE.
X *
X * Author:  Jim McBeath, Globetrotter Software
X *	    globes!jimmc@oliveb.olivetti.com
X *	    (408)741-0489
X */
X
X/* makeform.c - builds the form which displays everything
X */
X
X#include 
X#include 
X#include 
X#include 
X#include 
X#include 
X#include 
X#include 
X#include  
X#include 
X#include "mines.h"
X
Xextern char *MinesVersion;
X
Xvoid
Xmakeform(topw,numrows,numcols,cellsize)
XWidget topw;
Xint numrows, numcols;
Xint cellsize;	/* size of each cell in pixels */
X{
X	Widget form, cells;
X	Widget top, bottom, bar;
X	Widget lasthwidget, lastvwidget, w;
X	Widget InitButtons(), InitMsg();
X	Arg args[10];
X	int i, b;
X	int x,y;
X	char buf[100],buf2[100],tbuf[100];
X	XtTranslations tr;
X
X	i = 0;
X	form = XtCreateManagedWidget("form", formWidgetClass, topw, args, i);
X
X	i = 0;
X	XtSetArg(args[i],XtNlabel,MinesVersion);
X	i++;
X	lastvwidget = XtCreateManagedWidget("title",
X			labelWidgetClass, form, args, i);
X
X	InitInfoButton(topw,form,lastvwidget);
X
X	lastvwidget = InitButtons(form,lastvwidget);
X			/* init command buttons */
X
X	lastvwidget = InitMsg(form,lastvwidget);
X			/* init the message area */
X
X	i = 0;
X	XtSetArg(args[i],XtNfromVert,lastvwidget);
X	i++;
X	cells = XtCreateManagedWidget("cell",formWidgetClass,form,args,i);
X	lastvwidget = 0;
X
X	for (y=0; y : DrawCell(%d %d)",
X					y,x);
X			tr = XtParseTranslationTable(tbuf);
X			XtOverrideTranslations(w,tr);	/* add the expose tr */
X			lasthwidget = w;
X			SetCellWidget(y,x,w);
X		}
X		lastvwidget = w;
X	}
X}
X
X/* end */
END_OF_makeform.c
if test 3274 -ne `wc -c msg.c <<'END_OF_msg.c'
X/*
X * Copyright 1990 Globetrotter Software, Inc.
X *
X * Permission to use, copy, modify, distribute, and sell this software and its
X * documentation for any purpose is hereby granted without fee, provided that
X * the above copyright notice appear in all copies and that both that
X * copyright notice and this permission notice appear in supporting
X * documentation, and that the name of Globetrotter Software not be used
X * in advertising or publicity pertaining to distribution of the software
X * without specific, written prior permission.  Globetrotter Software makes
X * no representations about the suitability of this software for any purpose.
X * It is provided "as is" without express or implied warranty.
X *
X * GLOBETROTTER SOFTWARE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
X * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.  IN NO
X * EVENT SHALL GLOBETROTTER SOFTWARE BE LIABLE FOR ANY SPECIAL, INDIRECT OR
X * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
X * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
X * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
X * OF THIS SOFTWARE.
X *
X * Author:  Jim McBeath, Globetrotter Software
X *	    globes!jimmc@oliveb.olivetti.com
X *	    (408)741-0489
X */
X
X/* msg.c - deals with the message window
X */
X
X#include 
X#include 
X#include 
X#include 
X#include "mines.h"
X
Xextern BOOL Impossible;
Xextern int Hints;
X
Xint NumberMoves;
Xint SafesMarked;
Xint MinesMarked;
Xint Hints;
X
Xstatic char *lastmessage;
Xstatic char *firstmessage="Welcome to XMines";
X
XWidget MsgWidget;
XWidget MoveCountWidget, HintCountWidget;
XWidget SafeCountWidget, MineCountWidget;
X
Xstatic Widget
XMakeCountWidget(name,parent,above,left)
Xchar *name;
XWidget parent;
XWidget above, left;
X{
X	int i;
X	Arg args[10];
X	char namebuf[50];
X	Widget lasthwidget;
X
X	i = 0;
X	XtSetArg(args[i],XtNfromVert,above);
X	i++;
X	if (left) {
X		XtSetArg(args[i],XtNfromHoriz,left);
X		i++;
X	}
X	sprintf(namebuf,"%slabel",name);
X	lasthwidget = XtCreateManagedWidget(namebuf,
X			labelWidgetClass, parent, args, i);
X
X	i = 0;
X	XtSetArg(args[i],XtNfromVert,above);
X	i++;
X	XtSetArg(args[i],XtNfromHoriz,lasthwidget);
X	i++;
X	sprintf(namebuf,"%scount",name);
X	lasthwidget = XtCreateManagedWidget(namebuf,
X			labelWidgetClass, parent, args, i);
X	return lasthwidget;
X}
X
XWidget
XInitMsg(parent,above)
XWidget parent;
XWidget above;
X{
X	int i;
X	Arg args[10];
X	Widget lasthwidget;
X
X	lasthwidget = (Widget)0;
X
X#ifndef NOSCORE
X	MoveCountWidget = lasthwidget =
X		MakeCountWidget("move",parent,above,lasthwidget);
X	HintCountWidget = lasthwidget =
X		MakeCountWidget("hint",parent,above,lasthwidget);
X	SafeCountWidget = lasthwidget =
X		MakeCountWidget("safe",parent,above,lasthwidget);
X	MineCountWidget = lasthwidget =
X		MakeCountWidget("mine",parent,above,lasthwidget);
X	above = lasthwidget;
X#endif
X
X	i = 0;
X	XtSetArg(args[i],XtNstring,firstmessage);
X	i++;
X	XtSetArg(args[i],XtNfromVert,above);
X	i++;
X	MsgWidget = XtCreateManagedWidget("message", labelWidgetClass,
X			parent, args, i);
X	if (lastmessage) {
X		i=0;
X		XtSetArg(args[0],XtNlabel,lastmessage);
X		i++;
X		XtSetValues(MsgWidget,args,1);
X	}
X	return MsgWidget;
X};
X
Xstatic void
XSetCountWidget(w,n)
XWidget w;
Xint n;
X{
X	Arg arg;
X	char buf[10];
X
X	if (!w)
X		return;
X	sprintf(buf,"%d  ",n);
X	XtSetArg(arg,XtNlabel,buf);
X	XtSetValues(w,&arg,1);
X}
X
X#ifndef NOSCORE
XSetNumberMoves(n)
Xint n;
X{
X	NumberMoves = n;
X	SetCountWidget(MoveCountWidget,n);
X}
X
XSetMinesMarked(n)
Xint n;
X{
X	MinesMarked = n;
X	SetCountWidget(MineCountWidget,n);
X}
X
XSetSafesMarked(n)
Xint n;
X{
X	SafesMarked = n;
X	SetCountWidget(SafeCountWidget,n);
X}
X
XSetHints(n)
Xint n;
X{
X	Hints = n;
X	SetCountWidget(HintCountWidget,n);
X}
X
XIncrNumberMoves(n)
Xint n;
X{
X	if (n==0) return;
X	SetNumberMoves(NumberMoves+n);
X}
X
XIncrMinesMarked(n)
Xint n;
X{
X	if (n==0) return;
X	SetMinesMarked(MinesMarked+n);
X}
X
XIncrSafesMarked(n)
Xint n;
X{
X	if (n==0) return;
X	SetSafesMarked(SafesMarked+n);
X}
X
XIncrHints(n)
Xint n;
X{
X	if (n==0) return;
X	SetHints(Hints+n);
X}
X#endif NOSCORE
X
Xvoid 
XMessage(cp)
Xchar * cp;
X{
X	Arg arg;
X	static char full_message[100];
X
X	sprintf(full_message, "%s %s",
X	    cp,
X	    Impossible ? "(impossible)" : "");
X
X	lastmessage = full_message;
X	if (MsgWidget) {
X		XtSetArg(arg,XtNlabel,full_message);
X		XtSetValues(MsgWidget,&arg,1);
X	}
X}
X
X/* end */
END_OF_msg.c
if test 4388 -ne `wc -c