/* -	-	MM -	-	*/
#define xedvars 0

#include "stdio.h"
#include "types.h"
#include "math.h"
#include "intuition/intuition.h"
#include "intuition/screens.h"
#include "graphics/gfxbase.h"
#include "graphics/text.h"
#include "libraries/dos.h"
#include "libraries/dosextens.h"
#include "exec/memory.h"

#include "devices/timer.h"

struct timerequest tr;
struct MsgPort *tport;

struct IntuitionBase *IntuitionBase;
struct GfxBase *GfxBase;
struct NewScreen gfxscn;
struct Screen *gfxscreen;
struct NewWindow frame;
struct Window *txwin, *gfxwin;
struct IntuiMessage *txmsg, *gfxmsg;
struct RastPort *txrp, *gxrp;
struct MsgPort *xport;
struct IOStdReq *iport;
struct Device *ConsoleDevice;

struct InputEvent ievent =
{
	NULL, /*next event*/
	IECLASS_RAWKEY, /*class*/
	0,0,0
};
/*struct InputEvent
{
	struct InputEvent *ie_NextEvent;
	char ie_Class;
	char ie_SubClass;
	UWORD ie_Code;
	UWORD ie_Qualifier;
	union
	{
		struct
		{
			WORD ie_x;
			WORD ie_y;
		} ie_xy;
		APTR ie_addr;
	} ie_position;
	struct timeval ie_TimeStamp;
};
#define ie_X ie_position.ie_xy.ie_x
#define ie_Y ie_position.ie_xy.ie_y
*/
int MaxStLen = 256;
#define MaxSt1 256  /*maxstlen */

int TOP = 1; /*Cls*/
int BOT = 30;
int PW = 38;
int LLen; /* X Y */
int X,Y;
int GX, GY;
ulong COLOR, BCOLOR; /* 0 brn 1 ylo 2 bk 3 grn*/
ulong Tstyle;
char Nstr[82];
char buff[10];
char func;
char *Msg, Path[258];
int STAT = 2;

/* Define the size of the screen */
#define SC_HEIGHT 256
#define SC_WIDTH	320
#define T_WIDTH	320
#define SC_TOP		0

#include "SCREEN.P";

/* -	-	-	-	-	-	-	*/
/* back to front*/
#define EDIT_MENU 0

#define HELP_ITEM 0
#define QUIT_ITEM 1

static struct IntuiText quit_text =
{
   15,8,JAM1,0,1,NULL,"Quit",NULL
};

struct MenuItem quit_item =
{
	NULL,
	0,11,75,10,
	ITEMTEXT |ITEMENABLED |HIGHCOMP,
	0,(APTR) &quit_text,
	NULL,0,NULL,MENUNULL
};

static struct IntuiText help_text =
{
   15,8,JAM1,0,1,NULL,"Help",NULL
};

struct MenuItem help_item =
{
	&quit_item,
	0,1,75,10,
	ITEMTEXT |ITEMENABLED |HIGHCOMP,
	0,(APTR) &help_text,
	NULL,0,NULL,MENUNULL
};

struct Menu edit_menu =
{
	NULL,
	0,0,75,0,
	MENUENABLED,
   "MasterMind",
	&help_item
};
/* -	-	-	-	-	-	-	*/

short colours[16] =
{
	/* RGB */
	0x0000, 0x0DDD, 0x0a80, 0x0EE0, 0x0F00, 0x0E0E, 0x000F, 0x00EE,
	0x00F0, 0x0800, 0x0808, 0x0008, 0x0ee0, 0x00A0, 0x0555, 0x0888
};
#define BLK 0
#define BRN 2
#define YLO 3
#define RED 4
#define BLU 6
#define GRN 8

BOOL OpenTheScreen()
{
	gfxscn.LeftEdge = 0;
	gfxscn.TopEdge	 = 0;
	gfxscn.Width	 = SC_WIDTH;
	gfxscn.Height	 = SC_HEIGHT;
	gfxscn.Depth	 = 4;
	gfxscn.DetailPen= BRN;
	gfxscn.BlockPen = YLO;
	gfxscn.ViewModes= 0;
	gfxscn.Type		 = 0;
	gfxscn.Font		 = 0;
   gfxscn.DefaultTitle = "";
	gfxscn.Gadgets	 = 0;
	gfxscreen = (struct Screen *)OpenScreen(&gfxscn);
	return((bool)(gfxscreen != 0));
}

BOOL OpenTWindow(T)
int T;
{
	frame.LeftEdge = 0;
	frame.TopEdge	= SC_TOP;
	frame.Width		= SC_WIDTH;
	frame.Height	= SC_HEIGHT-SC_TOP;
	frame.DetailPen= BRN;
	frame.BlockPen = YLO;
	frame.IDCMPFlags = MENUPICK| GADGETDOWN| GADGETUP| REQCLEAR| REQSET| RAWKEY;
	frame.Flags		= WINDOWDRAG| SMART_REFRESH| ACTIVATE;
	frame.Screen	= gfxscreen;
	frame.MinWidth = 0;
	frame.MaxWidth = -1;
	frame.MinHeight= 0;
	frame.MaxHeight= -1;
	frame.Type		= CUSTOMSCREEN;
	if(T == 1)
	{
      frame.Title = "MasterMind";
		txwin = (struct Window *)OpenWindow(&frame);
		return((bool)(txwin != 0));
	} else {
      frame.Title = "Help";
		gfxwin = (struct Window *)OpenWindow(&frame);
		return((bool)(gfxwin != 0));
	}
}

ClGs()
{
	SetAPen(gxrp,(ulong)BLK);
	RectFill(gxrp,0L,10L,(long)SC_WIDTH,(long)(SC_HEIGHT));
}
/*-------------------------*/
#define DX 30
#define DY 15
int GetMXY()
{
	int x,y,n,m,p;
	x = ievent.ie_position.ie_xy.ie_x;
	y = ievent.ie_position.ie_xy.ie_y;
	if((ievent.ie_Code == SELECTDOWN))
	{
		if((x < 633) && (y < 249)) { /* This sets a tolerance on xy pos */
			n = (x - 4) / DX; m = (n * DX) + 10; /* -10 + 6 */
			if((x - m) < 13) {
				n = (y - 12) / DY; p = (n * DY) + 15; /* -15 + 3 */
				if((y - p) < 7) { X = m; Y = p; return(1); }
			}
		}
	}
	return(0);
}

MenuCmd()
{
	int C = -1,code;
	code = txmsg->Code;
	if(code != MENUNULL)
	{
		switch(MENUNUM(code))
		{
			case EDIT_MENU:
			{
			switch(ITEMNUM(code))
			{
			case HELP_ITEM: Help(); break;
			case QUIT_ITEM: STAT = 0; C = 13; break;
			default: break;
			}
			}
			default: break;
		}
	}
	return(C);
}

char AsKey()
{
	int C = -1, len;
	if(txmsg->Code & IECODE_UP_PREFIX) {;}
	else
	{
		buff[0] = 0; buff[1] = 0; buff[2] = 0;
		ievent.ie_Code = txmsg->Code;
		ievent.ie_Qualifier = txmsg->Qualifier;
		ievent.ie_position.ie_addr = * (APTR *)txmsg->IAddress;
		len = RawKeyConvert(&ievent,buff,10,NULL);
		if(len > 0)
		{
			if(len == 1) { C = buff[0]; if(C == 0x7f) C = 7; }
			else										 /*DEL .. ^code*/
			{
				C = buff[1];
				if(buff[2] == '~') /* help & function keys */
				{
					func = '?';
					if((C >= '0') && (C <= '9')) func = C + 1;
					C = 31;
				}
				switch(C) /* arrow keys */
				{
				case 'A': C = 5;	break; /*^E ^*/
				case 'B': C = 24; break; /*^X v*/
				case 'C': C = 4;	break; /*^D >*/
				case 'D': C = 19; break; /*^S <*/
				case 'T': C = 18; break; /*^R ^^*/
				case 'S': C = 3;	break; /*^C vv*/
				case ' ':
				{
					if(buff[2] == 'A') C = 1; /*^A <<*/
					if(buff[2] == '@') C = 6; /*^F >>*/ break;
				}
				}
			}
		}
	}
	return(C);
}

char GetKey()
{
	int C = -1, class;
	do {
		if((txmsg = (struct IntuiMessage *)GetMsg(txwin->UserPort)) == 0L)
		{
			Wait(1 << txwin->UserPort->mp_SigBit); continue;
		}
		class = txmsg->Class;
		if(class == RAWKEY) C = AsKey();
		else if(class == MENUPICK) C = MenuCmd();
		ReplyMsg((struct Message *)txmsg);
	} while(C == -1);
	return(C);
}
/*-------------------------*/

/* - - SCREEN - - */
/*#include "XEDVARS";*/
#ifndef BRN
#define BRN 0
#define YLO 1
#define BLK 2
#define GRN 3
#endif
char etKey() /* keys convert to WS control codes. del = ^G */
{
	int C = -1, class, len;
	do {
		if((txmsg = (struct IntuiMessage *)GetMsg(txwin->UserPort)) == 0L)
		{
			Wait(1 << txwin->UserPort->mp_SigBit); continue;
		}
		class = txmsg->Class;
		if(class == RAWKEY) /* convert arrow keys et al to char code */
		{
			if(txmsg->Code & IECODE_UP_PREFIX) {;}
			else
			{
				buff[0] = 0; buff[1] = 0; buff[2] = 0;
				ievent.ie_Code = txmsg->Code;
				ievent.ie_Qualifier = txmsg->Qualifier;
				ievent.ie_position.ie_addr = * (APTR *)txmsg->IAddress;
				len = RawKeyConvert(&ievent,buff,10,NULL);
				if(len > 0)
				{
					if(len == 1) { C = buff[0]; if(C == 0x7f) C = 7; }
					else										 /*DEL .. ^code*/
					{
						C = buff[1];
						if(buff[2] == '~') /* help & function keys */
						{
							func = '?';
							if((C >= '0') && (C <= '9')) func = C + 1;
							C = 31;
						}
						switch(C) /* arrow keys */
						{
							case 'A': C = 5;	break; /*^E ^*/
							case 'B': C = 24; break; /*^X v*/
							case 'C': C = 4;	break; /*^D >*/
							case 'D': C = 19; break; /*^S <*/
							case 'T': C = 18; break; /*^R ^^*/
							case 'S': C = 3;	break; /*^C vv*/
							case ' ':
							{
								if(buff[2] == 'A') C = 1; /*^A <<*/
								if(buff[2] == '@') C = 6; /*^F >>*/ break;
							}
						}
					}
				}
			}
		}
		ReplyMsg((struct Message *)txmsg);
	} while(C == -1);
	return(C);
}

SetAttr(S) /* Normal = 0 Uline = 1/2 Bold = 3/4 italic = 5/6 */
int S;
{
	ulong en;
	switch(S)
	{
	case 0: Tstyle = 0; break;
	case 1: Tstyle = Tstyle | 1; break;
	case 2: Tstyle = Tstyle & 6; break;
	case 3: Tstyle = Tstyle | 2; break;
	case 4: Tstyle = Tstyle & 5; break;
	case 5: Tstyle = Tstyle | 4; break;
	case 6: Tstyle = Tstyle & 3; break;
	}
	en = AskSoftStyle(txrp); SetSoftStyle(txrp,(ulong)Tstyle,en);
}

/* 0 brn 1 ylo 2 bk 3 grn*/
SetCols() { SetAPen(txrp,COLOR); SetBPen(txrp,BCOLOR); }
YR() { COLOR = YLO; BCOLOR = BRN; SetCols(); SetAttr(0); }
UYR(){ COLOR = YLO; BCOLOR = BRN; SetCols(); Tstyle = 0; SetAttr(1); }
YK() { COLOR = YLO; BCOLOR = BLK; SetCols(); SetAttr(0); }
KY() { COLOR = BLK; BCOLOR = YLO; SetCols(); SetAttr(0); }
KR() { COLOR = BLK; BCOLOR = BRN; SetCols(); SetAttr(0); }
UKR(){ COLOR = BLK; BCOLOR = BRN; SetCols(); Tstyle = 0; SetAttr(1); }
KG() { COLOR = BLK; BCOLOR = GRN; SetCols(); SetAttr(0); }
GK() { COLOR = GRN; BCOLOR = BLK; SetCols(); SetAttr(0); }

L1() { GX = 4; GY = 18; }
L2() { GX = 4; GY = 26; }
/*Nl() { GX = 4; GY += 8; }*/

Bs() { GX -= 8; if(GX < 4) GX = 4; }
BsN(L) int L; { GX -=(L * 8); if(GX < 4) GX = 4; }

int SetStLen(str)
char *str;
{
	char C; int E = 0, L = -1;
	do { ++L; C = str[L]; if((C == 0) || (C == 10) || (L >= MaxSt1)) E = 1; } while(E == 0);
	str[L] = 0;
	if(L >= MaxSt1)
	{
		E = 0; do { --L; C = str[L]; if((C > 32) || (L < 0)) E = 1; } while(E == 0);
		++L; str[L] = 0;
	}
	return(L);
}

WriteStr(str) char *str; { long L; Move(txrp,(long)GX,(long)GY); L = (long)SetStLen(str); Text(txrp,str,(ulong)L); GX +=(L * 8); }

WriteStN(str,L) char *str; int L; { Move(txrp,(long)GX,(long)GY); Text(txrp,str,(ulong)L); GX +=(L * 8); }

 /* due to the extra Moves it's faster to compose a str */
WriteCh(C) char C; { Move(txrp,(long)GX,(long)GY); Nstr[0] = C; Text(txrp,Nstr,(ulong)1); GX += 8; }

WriteCN(C,N) char C; int N; { int L; for(L = 0; L < N; L++) Nstr[L] = C; WriteStN(Nstr,N); }

WriteLong(W)
long W;
{
	int L = 79, S = 0;
	Nstr[L--] = 0;
	if(W < 0) { W = -W; S = 1; }
	do { Nstr[L--] = ((W % 10) + 48); W /= 10; } while((W > 0) && (L > 1));
	if(S == 1) Nstr[L--] = '-';
	WriteStr(&Nstr[(L + 1)]);
}
WriteInt(N) int N; { WriteLong((long)N); }

GotoY(L) int L; /*origin 1,1*/ { GX = 4; GY = (L * 8) + 10; /*if(GY == 18) GY = 17;*/ }
GotoXY(N,L) int N,L; { GX = (N * 8) - 4; GY = (L * 8) + 10; }

Cel() { int N; N = (PW - (GX / 8)); WriteCN(' ',N); GX -= N * 8; }
Cll(L) int L; { GotoY(L); WriteCN(' ',PW); GX = 4; }
Cls()
{
	SetAPen(txrp,(ulong)BRN);
	RectFill(txrp,2L,10L,(long)SC_WIDTH-4,(long)(SC_HEIGHT-2));
	SetCols();
}

char UPcase(C) char C; { if((C < 97) || (C > 122)) {;} else C -= 32; return(C); }

int StoI(str)
char *str;
{
	char C; int L, M = 0, N = -1;
	L = SetStLen(str);
	if((L > 0) && (str[0] != 10))
	{
		N = 0;
		do {
			C = str[M] - 48;
			if((C >= 0) && (C <= 9)) N = (N * 10) + C; else N = -1; ++M;
		}
		while((M < L) && (N != -1));
	}
	return(N);
}

StJoin(str,str2) /*str(LLen) + str2*/
char *str; char *str2;
{
	char C; int E = 0, L, P = 0;
	L = --LLen;
	do { C = str2[P++]; str[++L] = C; if((C == 0) || (L >= MaxStLen)) E = 1; } while(E == 0);
	str[L] = 0; LLen = L;
}

StCat(str,str2) /*str + str2 sets LLen*/
char *str; char *str2;
{	LLen = SetStLen(str); StJoin(str,str2); }

StCopy(str,str2) /*str << str2 sets LLen */
char *str; char *str2;
{	LLen = 0; StJoin(str,str2); }
/* - - SCREEN - - */

/* -	-	MM -	-	*/
 int NCOLS = 12;
 int NCOL = 6;
 int NROWS = 12;
 int NROW = 4;
 long NGames = 0;
 long NTries = 0;
 char dotstr[] = "...............";
 char chrstr[] = "ABCDEFGHIJKLMNO"; /*for Help*/
 char dots[16];
 char chrs[16];
 char fstr[16];

Nl() /*with scroll*/
{
	int N;
	GX = 4; GY += 8;
	if(GY > ((BOT+1) * 8))
	{
		GY -= 8;
		for(N = 0; N < 4; N++)
		{
			ScrollRaster(txrp,0L,2L,2L,12L,(long)SC_WIDTH-3,(long)SC_HEIGHT-3);
		}
	}
}

WriteIn3(W)
long W;
{
	int L = 3;
   StCopy(Nstr,"000");
	do { Nstr[--L] = ((W % 10) + 48); W /= 10; } while((W > 0) && (L > 0));
	WriteStN(Nstr,3);
}

CllMsg() { Nl(); UKR(); Cll((GY - 9)/ 8); KY(); WriteStr(Msg); KR(); }
_getback() { if(LLen > 0) { WriteCh(' '); GX -= 16; --LLen; } else LLen = 0; }
GetStM() /* Path << kb ESC LLen*/
{
	char C;
	Path[0] = 0; CllMsg();	/*This version tracks down the screen */
	LLen = 0;					/* and at the bottom, the screen scrolls */
	do {
		KG(); WriteCh(' '); GX -= 8; C = toupper(GetKey()); YR();
		if(C > 31)
		{
			if((C < 127) || (C > 159)) WriteCh(C); else WriteCh(169);
			Path[LLen] = C; ++LLen;
		}
		else
		{
			switch (C)
			{
			case	8:/* ^H */
			case 30:/* BS */ _getback(); break;
			case 27:/*ESC */ { C = 13; Path[0] = 10; LLen = 1; } break;
			case 31:/*help*/ { C = 13; Path[0] = 31; LLen = 1; } break;
			default : break;
			}
		}
		if(LLen >= MaxSt1) { do { _getback(); } while(LLen >= MaxSt1); }
	}
	while(C != 13);
	Path[LLen] = 0;
}

 ulong R_N_D; int R_N_;
unsigned RndInt(K) /* 0..K-1 */
unsigned K;
{
	ulong N;
	N = R_N_D; N++;
	R_N_++; if(R_N_ > 6) R_N_ = 0;
	switch (R_N_)
	{
		case	0: N *= 75; break;
		case	1: N *= 47; break;
		case	2: N *= 41; break;
		case	3: N *= 66; break;
		case	4: N *= 76; break;
		case	5: N *= 25; break;
		default: N *= 7; break;
	}
	R_N_D = N >> 1;
	return((N >> 2) % K);
}

Randomise()
{
	ulong micro;
	if(OpenDevice(TIMERNAME,UNIT_MICROHZ,(struct IORequest *) &tr,0) == 0L)
	{
		if((tport = (struct MsgPort *)CreatePort(0,0)) != 0)
		{
			tr.tr_node.io_Message.mn_Node.ln_Type = NT_MESSAGE;
			tr.tr_node.io_Message.mn_Node.ln_Pri  = 0;
			tr.tr_node.io_Message.mn_Node.ln_Name = 0L;
			tr.tr_node.io_Message.mn_ReplyPort	  = tport;
			tr.tr_node.io_Command					  = TR_GETSYSTIME;
			DoIO((struct IORequest *) &tr);
			micro=tr.tr_time.tv_micro;
			DeletePort(tport);
		}
		CloseDevice((struct IORequest *) &tr);
	}
	R_N_D = micro; R_N_ = micro & 7;
}

WriteCStr(cstr) /* If you try and use too many colours, it's hard to see */
char *cstr;
{
	int C, E, N;
	if(NCOL > 7) WriteStr(cstr);
	else
	{
		for(N = 0; N < NROW; N++)
		{
			C = cstr[N]; E = C - '@' + 2; if(E == 1) E = 9;
			SetAPen(txrp,(ulong)E); WriteCh(C);
		}
	}
	YR();
}

xhlp()
{
                                                                              WriteStr("Try  ABCD"); Nl(); WriteStr("then BCDE"); Nl(); WriteStr("     CDEF    etc.."); Nl(); WriteStr("Watch the total increase or decrease."); Nl(); 
                                                                              WriteStr("I put in comments like"); Nl(); WriteStr("     B NOT E=    etc.."); Nl();
}
OpenTxt()
{
	WindowToFront(txwin);
	ActivateWindow(txwin);
}
OpenGFX()
{
	WindowToFront(gfxwin);
	ActivateWindow(gfxwin);
}

 int nhlp = 0;
 int helpflag = 0;
Help()
{
	struct RastPort *trp;
	int ox,oy;
	if(helpflag == 0)
	{
		helpflag = 1; ox = GX; oy = GY;
		OpenGFX();
		trp = txrp; txrp = gxrp;
		Cls(); YR();
		StCopy(chrs,chrstr); chrs[NCOL] = 0;
		L1();	  /*12345678901234567890123456789012345678*/ Nl();
      WriteStr("The computer generates a "); WriteInt(NROW); WriteStr(" letter code."); Nl();
      WriteStr("Each letter may be "); WriteStr(chrs); Nl(); Nl();
      WriteStr("At each attempt , the computer tells"); Nl();
      WriteStr("        you how many letters are :"); Nl();
      WriteStr("White.. correct letter in correct place"); Nl();
      WriteStr("Black.. correct letter in wrong place."); Nl(); Nl();
      WriteStr("The number of characters and rows"); Nl();
      WriteStr("   may be set...       MM C R"); Nl();
      WriteStr("The default is 6 chars 4 rows."); Nl();
      WriteStr("Maximum is 12 chars 12 rows."); Nl();
      WriteStr("ABCD= < one extra nonalpha == comment."); Nl(); Nl();            if(nhlp > 2) xhlp();
      WriteStr("   Best of luck. JDG");
		Wait(1 << gfxwin->UserPort->mp_SigBit);
		Wait(1 << gfxwin->UserPort->mp_SigBit);
		txrp = trp; nhlp++;
		OpenTxt(); helpflag = 0; GX = ox; GY = oy;
	}
}

int Check()
{
	int C, M, E = 0;
	M = SetStLen(Path);
   if(M < NROW) { E = 1; WriteStr(" Too few letters"); }
   if(M > NROW) { E = 2; if(Path[M - 1] > 64) WriteStr(" Too many letters"); }
	if(E == 0)
	{
		M = 0;
		do {
			C = Path[M++];
			if((C < 'A') || (C > ('@' + NCOL)))
			{
            E = 3; WriteCh(' '); WriteStr(chrs); WriteStr(" please");
			}
		}
		while((M < NROW) && (E == 0));
	}
	return(E);
}

Play()
{
	int C, E, N, M, B = 0, W = 0;
	if((E = Check()) == 0)
	{
		++NTries; GX = 92; WriteCh(' '); WriteCStr(Path);
		StCopy(Nstr,fstr);
		for(N = 0; N < NROW; N++)
		{
			if(Path[N] == Nstr[N]) { ++W; Path[N] = 0; Nstr[N] = 0; }
		}
		for(N = 0; N < NROW; N++)
		{
			C = Path[N];
			if(C > 32)
			{
				M = E = 0;
				do {
					if(C == Nstr[M]) { ++B; Path[N] = 0; Nstr[M] = 0; E = 1; }
					M++;
				}
				while((M < NROW) && (E == 0));
			}
		}
      WriteCh(' '); WriteInt(W); WriteStr("W "); WriteInt(B); WriteStr("B");
	}
	return(W);
}

Start()
{
	int C = 0, N, W; long L;
	Cls();
	Randomise();
	do {
		STAT = 2;
		StCopy(dots,dotstr); dots[NROW] = 0;
		StCopy(chrs,chrstr); chrs[NCOL] = 0;
		Cls(); L1();
      SetAPen(txrp,(ulong)10); SetBPen(txrp,(ulong)2); WriteStr("Esc");
		GX = 100; WriteStr(dots); SetAPen(txrp,(ulong)13);
      GX = 204; WriteStr("Game "); WriteLong(++NGames);
		GX = 268; WriteInt(NCOL); WriteCh(' '); WriteInt(NROW);

		for(N = 0; N < NROW; N++) { fstr[N] = 'A' + RndInt(NCOL); } fstr[NROW] = 0;
		do {
         Msg = "Your guess ?"; GetStM(); C = Path[0]; Cel();
			if(STAT > 0)
			{
				if(C == 31) Help();
				else
				{
					if(C == 10) W = 42; else W = Play();
					if(W >= NROW)
					{
						if(C == 10) /*Esc*/
						{
                     WriteStr("The code was .."); WriteCStr(fstr);
							NGames = NTries = 0;
						}
						else
						{
                     WriteStr(" Congratulations"); Nl();
                     GX = 100; WriteStr("   Q = ");
							L = (1000 * (NGames + 2)) / (NTries + 36);
							N = (int)L; WriteLong(L); WriteCh('.');
							L = ((1000000 * (NGames + 2)) / (NTries + 36)) - (1000 * (long)N);
							WriteIn3(L);
						}
                  Msg = "Another game ?"; GetStM(); C = Path[0];
						if((C == 'Y') || (C == '?')) STAT = 1; else STAT = 0;
					}
				}
			}
		}
		while(STAT > 1);
	}
	while(STAT > 0);
}

 int error;
main(argc,argv)
int argc;
char *argv[];
{
	long d;
	if(argc > 1 ) NCOL = StoI(argv[1]);
	if(NCOL < 2) NCOL = 2; if(NCOL > NCOLS) NCOL = NCOLS;
	if(argc > 2 ) NROW = StoI(argv[2]);
	if(NROW < 2) NROW = 2; if(NROW > NROWS) NROW = NROWS;

   if((IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library",0)) != 0)
	{
      if((GfxBase = (struct GfxBase *)OpenLibrary("graphics.library",0)) != 0)
		{
			if(OpenTheScreen())
			{
				LoadRGB4(&gfxscreen->ViewPort,colours,16L); /* Set the colours */
				if(OpenTWindow(0))
				{
					gxrp = gfxwin->RPort;
					if(OpenTWindow(1)) /* tx on top */
					{
						txrp = txwin->RPort;
						SetMenuStrip(txwin, &edit_menu); /* Set up the menu strip */
                  if((xport = (struct MsgPort *)CreatePort("conread",0)) != 0L)
						{
							if((iport = (struct IOStdReq *)CreateStdIO(xport)) != 0L)
							{
                        if((d = OpenDevice("console.device",-1,iport,0)) == 0)
								{
									ConsoleDevice = iport->io_Device;

									Start();

									if((d = CheckIO(iport)) == FALSE) AbortIO(iport);
								}
								DeleteStdIO(iport);
							}
							DeletePort(xport);
						}
						ClearMenuStrip(txwin);
						CloseWindow(txwin);
					}
					CloseWindow(gfxwin);
				}
				CloseScreen(gfxscreen);
			}
		}
	}
}

