home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
GEMini Atari
/
GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso
/
files
/
gnu
/
gchsrc31
/
nuxui.cc
< prev
next >
Wrap
C/C++ Source or Header
|
1992-04-27
|
18KB
|
769 lines
/* nuxui.c - (new) Unix user interface for CHESS
This file was extracted from the original GNU Chess file nuxui.c
and converted to C++ by Warwick Allison. It represents the ASCII
interface requirements to implement ui.h.
Revision: 1990-05-09
Copyright (C) 1986, 1987, 1988, 1989, 1990 Free Software Foundation, Inc.
Copyright (c) 1988, 1989, 1990 John Stanback
Modified extensively Nov 1989 Christopher North-Keys
40x24 two-colour display
option for shading black squares
expanded game save, list, and restore features using $HOME
option to disable display of coordinates
optional auto-updating of positional information
optional starring of black side
mass toggle for reverse-video functions
This file is part of CHESS.
CHESS is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY. No author or distributor accepts responsibility to anyone for
the consequences of using it or for whether it serves any particular
purpose or works at all, unless he says so in writing. Refer to the CHESS
General Public License for full details.
Everyone is granted permission to copy, modify and redistribute CHESS, but
only under the conditions described in the CHESS General Public License.
A copy of this license is supposed to have been given to you along with
CHESS so you can know your rights and responsibilities. It should be in a
file named COPYING. Among other things, the copyright notice and this
notice must be preserved on all copies.
*/
#include <ctype.h>
#include <signal.h>
#ifdef MSDOS
#include <dos.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define ESC 0x1B
#define refresh() fflush(stdout)
int mycntl1, mycntl2;
static void param (short n);
#else
//#define refresh()
#include <sys/param.h>
#include <sys/types.h>
#include <sys/file.h>
#include <curses.h>
#undef bool // Curses defines it as char !!!
#undef TRUE
#undef FALSE
#include <bool.h>
#endif /* MSDOS */
static char* ColorStr[2] = {"White", "Black"};
#include "ui.h"
#include "gnuchess.h"
#define pxx " PNBRQK"
#define qxx " pnbrqk"
#define rxx "12345678"
#define cxx "abcdefgh"
#define TAB (43)
/* coordinates within a square for the following are ([1,5],[1,3]) */
#define SQW (5)
#define SQH (3)
#define VIR_C(s) ((flag.reverse) ? 7-column(s) : column(s))
#define VIR_R(s) ((flag.reverse) ? 7-row(s) : row(s))
#define VSQ_X(x) ((flag.reverse) ? SQW + 1 - (x) : (x))
#define VSQ_Y(y) ((flag.reverse) ? SQH + 1 - (y) : (y))
#define Vblack(s) (!((VIR_C(s) + VIR_R(s)) % 2))
/* Squares swapped */
#define Vcoord(s,x,y) \
((SQW)*(VIR_C(s)))+(x),((SQH)*(7-VIR_R(s))+(y))
#define XYcoord(X,Y,x,y) \
(((SQW)*(X))+(x)),((SQH)*(7-(Y))+(y))
/* Squares and internal locations swapped */
#define VcoordI(s,x,y) \
((SQW)*(VIR_C(s)))+(VSQ_X(x)),((SQH)*(7-VIR_R(s))+(VSQ_Y(y)))
/* Squares and internal rows swapped */
#define VcoordR(s,x,y) \
((SQW)*(VIR_C(s)))+(x),((SQH)*(7-VIR_R(s))+(VSQ_Y(y)))
#if defined(MSDOS) && !defined(SEVENBIT)
short rv = 0;
static void ONormal (void);
static void OReverse (void);
#else
short stars = 0;
short rv = 1;
short shade = 0;
static void ONormal (void);
static void OReverse (void);
#endif /* MSDOS && !SEVENBIT */
//#define standout() wstandout(stdscr)
//#define standend() wstandend(stdscr)
//#define clear() wclear(stdscr)
//#define move(x,y) wmove(stdscr,x,y)
//#define clrtoeol() wclrtoeol(stdscr)
void TerminateSearch (int);
void ui_Initialize()
{
#ifndef MSDOS
initscr ();
crmode ();
#else
mycntl1 = mycntl2 = 0;
#endif /* MSDOS */
}
void ui_Finalize()
{
gotoXY (1, 24);
#ifndef MSDOS
nocrmode ();
endwin ();
#endif /* MSDOS */
}
void ui_GiveHelp (int compiswhite,int level,int easy,int maxdep,int dither,int hash)
{
ClrScreen ();
wprintw(stdscr,"CHESS command summary\n");
wprintw(stdscr,"g1f3 move from g1 to f3 quit Exit Chess\n");
wprintw(stdscr,"Nf3 move knight to f3 beep on/off\n");
wprintw(stdscr,"o-o castle king side easy on/off\n");
wprintw(stdscr,"o-o-o castle queen side hash on/off\n");
wprintw(stdscr,"bd redraw board reverse board display\n");
wprintw(stdscr,"list game to chess.lst book on/off\n");
wprintw(stdscr,"undo undo last ply remove take back a move\n");
wprintw(stdscr,"edit edit board force enter game moves\n");
wprintw(stdscr,"switch sides with computer both computer match\n");
wprintw(stdscr,"white computer plays white black computer plays black\n");
wprintw(stdscr,"depth set search depth level select level\n");
wprintw(stdscr,"post principle variation hint suggest a move\n");
wprintw(stdscr,"save game to file get game from file\n");
wprintw(stdscr,"random randomize play new start new game\n");
wprintw(stdscr,"rv toggle reverse video coords toggle coords\n");
#if !defined(MSDOS) || defined(SEVENBIT)
wprintw(stdscr,"shade toggle shade black stars toggle stars\n");
#endif /* !MSDOS || SEVENBIT */
wprintw(stdscr,"p show coordinate values\n");
gotoXY (10, 21);
wprintw(stdscr,"Computer: %s", ColorStr[compiswhite]);
gotoXY (10, 22);
wprintw(stdscr,"Opponent: %s", ColorStr[!compiswhite]);
gotoXY (10, 23);
wprintw(stdscr,"Level: %ld", level);
gotoXY (10, 24);
wprintw(stdscr,"Easy mode: %s", easy ? "ON" : "OFF");
gotoXY (40, 21);
wprintw(stdscr,"Depth: %d", maxdep);
gotoXY (40, 22);
wprintw(stdscr,"Random: %s", (dither) ? "ON" : "OFF");
gotoXY (40, 23);
wprintw(stdscr,"Transposition table: %s", hash ? "ON" : "OFF");
gotoXY (40, 24);
wprintw(stdscr,"Hit <RET> to return: ");
refresh ();
fflush(stdin);
getchar();
ClrScreen ();
UpdateDisplay (0, 0, 1, 0);
}
void ui_ShowEditHelp()
{
ClrScreen ();
UpdateDisplay (0, 0, 1, 0);
gotoXY (TAB, 3);
wprintw(stdscr,". Exit to main");
gotoXY (TAB, 4);
wprintw(stdscr,"# Clear board");
gotoXY (TAB, 5);
wprintw(stdscr,"c Change sides");
gotoXY (TAB, 7);
wprintw(stdscr,"Enter piece & location: ");
}
void ui_ShowEditColor(int col)
{
gotoXY (TAB, 6);
wprintw(stdscr,"Editing: %s", ColorStr[col]);
gotoXY (TAB + 24, 7);
ClrEoln ();
}
void ui_GetPieceAndLocation(char *s)
{
wrefresh(stdscr);
wscanw(stdscr,"%s", s);
}
void ui_ShowPlayers(bool reverse,int CompIsBlack)
{
gotoXY (TAB, ((reverse) ? 23 : 2));
wprintw(stdscr,"%s", (CompIsBlack) ? "Computer" : "Human ");
gotoXY (TAB, ((reverse) ? 2 : 23));
wprintw(stdscr,"%s", (!CompIsBlack) ? "Computer" : "Human ");
}
void ui_ShowDepth(int depth, char ch)
{
gotoXY (TAB, 4);
wprintw(stdscr,"Depth= %d%c ", depth, ch);
ClrEoln ();
}
void ui_ShowScore(int score)
{
gotoXY (TAB, 5);
wprintw(stdscr,"Score= %d", score);
ClrEoln ();
}
void ui_ShowMessage(char *msg)
{
gotoXY (TAB, 6);
wprintw(stdscr,"%s", msg);
ClrEoln ();
}
void ui_ClearMessage()
{
gotoXY (TAB, 6);
ClrEoln ();
}
void ui_ShowCurrentMove(int pnt, char *move)
{
gotoXY (TAB, 7);
wprintw(stdscr,"(%2d) %4s", pnt, move);
}
void ui_ShowTitle()
{
gotoXY (TAB, 10);
#ifdef MSDOS
wprintw(stdscr,"GNU Chess display (MS-DOS, Mar 90)");
#else
wprintw(stdscr,"GNU Chess display (Nov 89)");
#endif /* MSDOS */
}
void ui_ShowSideToMove(int movenum, int who)
{
gotoXY (TAB, 14);
wprintw(stdscr,"%2d: %s", movenum,ColorStr[who]);
ClrEoln ();
}
void ui_PromptForMove()
{
gotoXY (TAB, 19);
wprintw(stdscr,"Your move is? ");
ClrEoln ();
}
void ui_ShowNodeCnt(long int NodeCnt, long int evrate)
{
gotoXY (TAB, 21);
wprintw(stdscr,"Nodes= %8ld, Nodes/Sec= %5ld", NodeCnt, evrate);
ClrEoln ();
}
void ui_ShowPlyMove(int ply,char *move)
{
if (ply % 4 == 1)
{
gotoXY (TAB, 8+ply/4);
ClrEoln ();
}
wprintw(stdscr,"%5s ", move);
}
void ui_NoMorePly(int ply)
{
ClrEoln ();
while (ply < 52)
{
if (ply % 4 == 1)
{
gotoXY (TAB, 8+ply/4);
ClrEoln ();
}
ply++;
}
}
void ui_SearchStartStuff(int side)
{
int i;
signal (SIGINT, TerminateSearch);
#ifdef MSDOS
side++; /* shut up the compiler */
#else
signal (SIGQUIT, TerminateSearch);
#endif /* MSDOS */
for (i = 4; i < 14; i++)
{
gotoXY (TAB, i);
ClrEoln ();
}
}
void ui_ShowComputerMove(char *move, int feature)
{
gotoXY (TAB, 17);
wprintw(stdscr,"My move is: %s", move);
if (flag.beep)
putchar (7);
ClrEoln ();
gotoXY (TAB, 24);
switch (feature)
{
case 1: wprintw(stdscr,"Drawn game!");
break; case 2: wprintw(stdscr,"Opponent mates!");
break; case 3: wprintw(stdscr,"Computer mates!");
break; case 4: wprintw(stdscr,"Opponent will soon mate!");
break; case 5: wprintw(stdscr,"Computer will soon mate!");
}
ClrEoln ();
}
void ui_ShowMaxTree(int maxtree)
{
gotoXY (TAB, 22);
wprintw(stdscr,"Max Tree= %5d", maxtree);
ClrEoln ();
}
void ui_ShowClock(bool OnWhiteSide, int minutes, int seconds)
{
if (OnWhiteSide)
gotoXY (60, 23);
else
gotoXY (60, 2);
wprintw(stdscr,"%d:%2d ", minutes, seconds);
}
void ui_ClrScreen()
{
#ifdef MSDOS
putchar(ESC);
putchar('[');
putchar('2');
putchar('J');
#else
clear ();
#endif /* MSDOS */
refresh ();
}
void ui_DrawPiece(bool used, bool isblack, int x, int y, int piece)
{
gotoXY (2+SQW*x, 2+SQH*(7-y));
if (used)
{
if (isblack) {
if (rv)
OReverse ();
#if defined(MSDOS) && !defined(SEVENBIT)
wprintw(stdscr," %c ", qxx[piece]);
#else
wprintw(stdscr,(stars ? "*%c*" : " %c "), qxx[piece]);
#endif /* MSDOS && !SEVENBIT */
ONormal ();
} else {
#if defined(MSDOS) && !defined(SEVENBIT)
if (!rv)
OReverse ();
wprintw(stdscr," %c ", qxx[piece]);
ONormal ();
#else
wprintw(stdscr," %c ", qxx[piece]);
#endif /* MSDOS && !SEVENBIT */
}
} else {
#if defined(MSDOS) && !defined(SEVENBIT)
if (rv)
wprintw(stdscr,Vblack (sq) ? "\262\262\262" : "\260\260\260");
else
wprintw(stdscr,Vblack (sq) ? "\260\260\260" : "\262\262\262");
#else
if (shade)
/*wprintw(stdscr,Vblack (sq) ? "///" : " ");*/
wprintw(stdscr,(!((x + y) % 2)) ? "///" : " ");
else
{
/*if (Vblack (sq))*/
if (!((x + y) % 2))
OReverse ();
wprintw(stdscr," ");
ONormal ();
}
#endif /* MSDOS && !SEVENBIT */
}
}
void ui_DrawSquare(int x, int y, bool isblack)
{
#if defined(MSDOS) && !defined(SEVENBIT)
if (rv)
{
gotoXY (XYcoord (x,y, 1, 1));
wprintw(stdscr,isblack ? "\262\262\262\262\262" : "\260\260\260\260\260");
gotoXY (XYcoord (x,y, 1, 2));
wprintw(stdscr,isblack ? "\262\262\262\262\262" : "\260\260\260\260\260");
gotoXY (XYcoord (x,y, 1, 3));
wprintw(stdscr,isblack ? "\262\262\262\262\262" : "\260\260\260\260\260");
}
else
{
gotoXY (XYcoord (x,y, 1, 1));
wprintw(stdscr,isblack ? "\260\260\260\260\260" : "\262\262\262\262\262");
gotoXY (XYcoord (x,y, 1, 2));
wprintw(stdscr,isblack ? "\260\260\260\260\260" : "\262\262\262\262\262");
gotoXY (XYcoord (x,y, 1, 3));
wprintw(stdscr,isblack ? "\260\260\260\260\260" : "\262\262\262\262\262");
}
#else
if (shade)
{
gotoXY (XYcoord (x,y, 1, 1));
wprintw(stdscr,isblack ? "/////" : " ");
gotoXY (XYcoord (x,y, 1, 2));
wprintw(stdscr,isblack ? "/////" : " ");
gotoXY (XYcoord (x,y, 1, 3));
wprintw(stdscr,isblack ? "/////" : " ");
}
else
{
if (isblack)
OReverse ();
gotoXY (XYcoord (x,y, 1, 1));
wprintw(stdscr," ");
gotoXY (XYcoord (x,y, 1, 2));
wprintw(stdscr," ");
gotoXY (XYcoord (x,y, 1, 3));
wprintw(stdscr," ");
ONormal ();
}
#endif /* MSDOS && !SEVENBIT */
}
void ui_DrawCoords()
{
short z;
for (z = 0; z <= 7; z++)
{
short sq;
sq = z << 3;
gotoXY (VcoordI (sq, 1, 1));
#if !defined(MSDOS) || defined(SEVENBIT)
if ((Vblack (sq) || shade) && rv)
#endif /* !MSDOS || SEVENBIT */
OReverse ();
wprintw(stdscr,"%d", 1 + z);
ONormal ();
}
for (z = 0; z <= 7; z++)
{
short sq;
sq = z;
gotoXY (VcoordI (sq, SQW, SQH));
#if !defined(MSDOS) || defined(SEVENBIT)
if ((Vblack (sq) || shade) && rv)
#endif /* !MSDOS || SEVENBIT */
OReverse ();
wprintw(stdscr,"%c", cxx[z]);
ONormal ();
}
#if !defined(MSDOS) || defined(SEVENBIT)
for (z = 1; z <= (8 * SQH); z++)
{
gotoXY ((8 * SQW) + 1, z);
wprintw(stdscr,"|");
}
#endif /* MSDOS && !SEVENBIT */
}
void ui_ShowPosnValue(short sq, int score)
{
gotoXY (VcoordR (sq, 2, 1));
#if !defined(MSDOS) || defined(SEVENBIT)
if (Vblack (sq) && !shade)
OReverse ();
#endif /* !MSDOS || SEVENBIT */
if (color[sq] != neutral)
wprintw(stdscr,"%3d", svalue[sq]);
else
#if defined(MSDOS) && !defined(SEVENBIT)
{
if (rv)
wprintw(stdscr,Vblack (sq) ? "\262\262\262" : "\260\260\260");
else
wprintw(stdscr,Vblack (sq) ? "\260\260\260" : "\262\262\262");
}
#else
wprintw(stdscr,shade && Vblack (sq) ? "///" : " ");
#endif /* MSDOS && !SEVENBIT */
ONormal ();
}
void ui_GetFilename(char *prompt,char *name)
{
ShowMessage ("File name: ");
wrefresh(stdscr);
wscanw(stdscr,"%s", name);
}
void ui_ShowFileLoading(char *name)
{
ShowMessage("Loading ");
wprintw(stdscr,"%s", name);
}
void ui_LoadDone()
{
ShowMessage ("Load done. Press <Ret>");
fflush (stdin);
getchar ();
}
void ui_LoadFailed()
{
ShowMessage ("Load failed");
return;
}
void ui_ShowFileSaving(char *name)
{
ShowMessage("Saving ");
wprintw(stdscr,"%s", name);
}
void ui_SaveFailed()
{
ShowMessage ("Not saved");
return;
}
void ui_SaveDone()
{
ShowMessage ("Save done. Press <Ret>");
fflush (stdin);
getchar ();
}
void ui_ChangeSearchDepth(int *newdepth)
{
ShowMessage ("depth= ");
wrefresh(stdscr);
wscanw(stdscr,"%hd", newdepth);
}
void ui_ChangeContempt(int *newcontempt)
{
ShowMessage ("contempt= ");
wrefresh(stdscr);
wscanw(stdscr,"%hd", newcontempt);
}
void ui_ChangeLevel(int *newlevel)
{
ClrScreen ();
gotoXY (32, 2);
wprintw(stdscr,"CHESS");
gotoXY (20, 4);
wprintw(stdscr," 1. 60 moves in 5 minutes");
gotoXY (20, 5);
wprintw(stdscr," 2. 60 moves in 15 minutes");
gotoXY (20, 6);
wprintw(stdscr," 3. 60 moves in 30 minutes");
gotoXY (20, 7);
wprintw(stdscr," 4. 40 moves in 30 minutes");
gotoXY (20, 8);
wprintw(stdscr," 5. 40 moves in 60 minutes");
gotoXY (20, 9);
wprintw(stdscr," 6. 40 moves in 120 minutes");
gotoXY (20, 10);
wprintw(stdscr," 7. 40 moves in 240 minutes");
gotoXY (20, 11);
wprintw(stdscr," 8. 1 move in 15 minutes");
gotoXY (20, 12);
wprintw(stdscr," 9. 1 move in 60 minutes");
gotoXY (20, 13);
wprintw(stdscr,"10. 1 move in 600 minutes");
gotoXY (20, 17);
wprintw(stdscr,"Enter Level: ");
refresh ();
wrefresh(stdscr);
wscanw(stdscr,"%ld", &Level);
ClrScreen ();
}
void ui_ChoosePiece(char *s)
{
ShowMessage ("Enter piece: ");
wrefresh(stdscr);
wscanw(stdscr,"%s", s);
}
void ui_GetMove(char *s)
{
ui_PromptForMove();
wrefresh(stdscr);
wscanw(stdscr,"%s", s);
}
void ui_ToggleRV()
{
rv = !rv;
#if !defined(MSDOS) || defined(SEVENBIT)
shade = !rv;
stars = !rv;
#endif /* MSDOS && !SEVENBIT */
UpdateDisplay (0, 0, 1, 0);
}
void OReverse()
{
#ifdef MSDOS
putchar (ESC);
putchar ('[');
param (7);
putchar ('m');
#else
standout ();
/* attron (A_REVERSE); */
#endif /* MSDOS */
}
void ONormal()
{
#ifdef MSDOS
putchar (ESC);
putchar ('[');
param (0);
putchar ('m');
#else
standend ();
/* attroff (A_REVERSE);*/
#endif /* MSDOS */
}
void ui_ToggleStars()
{
stars = !stars;
UpdateDisplay (0, 0, 1, 0);
}
void ui_ToggleShade()
{
shade = !shade;
ClrScreen ();
UpdateDisplay (0, 0, 1, 0);
}
void
gotoXY (short int x, short int y)
{
#ifdef MSDOS
putchar(ESC);
putchar('[');
param(y);
putchar(';');
param(x);
putchar('H');
#else
move (y - 1, x - 1);
#endif /* MSDOS */
}
void
ClrScreen (void)
{
ui_ClrScreen();
}
void
ClrEoln (void)
{
#ifdef MSDOS
putchar(ESC);
putchar('[');
putchar('K');
#else
clrtoeol ();
#endif /* MSDOS */
refresh ();
}
#ifdef MSDOS
void
param(short n)
{
if (n >= 10)
{
register short d, q;
q = n/10; d = n%10;
putchar(q + '0');
putchar(d + '0');
}
else
putchar(n + '0');
}
#endif /* MSDOS */
int ui_AskAbort()
{
char s[80];
ShowMessage ("Abort? ");
wrefresh(stdscr);
wscanw(stdscr,"%s", s);
return (strcmp (s, "yes") == 0);
}
void ui_ClearEditHelp()
{
ClrScreen();
}
void ui_RefreshEarly()
{
wrefresh(stdscr);
}
void ui_ShowHint(char *move)
{
gotoXY (TAB, 6);
wprintw(stdscr,"Try: %s", move);
ClrEoln ();
}
void ui_RejectMove(char *move)
{
ui_ShowMessage("Illegal move");
}