This is igsglue.m in view mode; [Download] [Up]
#include "comment.header"
/* $Id: igsglue.m,v 1.3 1997/07/06 19:37:59 ergo Exp $ */
/*
* $Log: igsglue.m,v $
* Revision 1.3 1997/07/06 19:37:59 ergo
* actual version
*
* Revision 1.3 1997/05/04 18:56:56 ergo
* added time control for moves
*
*/
#include "igs.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "shared.h"
#import <appkit/appkit.h>
#import "GoApp.h"
#import "Board.h"
typedef piece boardtype[19][19];
message mesg;
char prefix[20];
int boardon = 0;
int boardmode = 0;
int beepcount = 1;
int ingame = -1;
extern int MAXX, MAXY;
char local[1000], *loc;
int observing = 0;
void showboard(boardtype b) {
extern unsigned char p[19][19];
int i, j;
for (i = 0; i < 19; i++)
for (j = 0; j < 19; j++)
p[i][j] = b[i][j];
[[NXApp getGoView] refreshIO];
}
void igsbeep(void) {
id beepSound = [Sound findSoundFor:"Bonk"];
[beepSound play];
}
int startgame(int n) {
char str[100];
int ret;
sprintf(str, "games %d\n", n);
sendstr(str);
do {
do {
ret = getmessage(&mesg, 0);
if (ret < 0)
exit(1);
} while (!ret);
if (mesg.id == MOVE)
[NXApp SetIGSStatus:"%Premature move. Restart game.\n"];
} while (mesg.id != GAMES);
if (mesg.gamecount != 1)
return -1;
if (mesg.gamelist[0].bsize > 19) {
[NXApp SetIGSStatus:"%Boardsize too large\n"];
return -1;
}
if (observing) {
[NXApp SetIGSStatus:"Removing observe\n"];
sprintf(str, "unobserve\n");
sendstr(str);
do {
do {
ret = getmessage(&mesg, 0);
if (ret < 0)
exit(1);
} while (!ret);
} while (mesg.id != PROMPT);
observing = 0;
}
ingame = n;
MAXX = MAXY = mesg.gamelist[0].bsize;
[[NXApp getGoView] startNewGame];
[[NXApp getGoView] refreshIO];
[[NXApp getGoView] display];
[[NXApp getGoView] setGameNumber:ingame];
sprintf(str, "%s (%s)", mesg.gamelist[0].white, mesg.gamelist[0].wrank);
[[NXApp getGoView] setWhiteName:str];
sprintf(str, "%s (%s)", mesg.gamelist[0].black, mesg.gamelist[0].brank);
[[NXApp getGoView] setBlackName:str];
[[NXApp getGoView] setIGSHandicap:mesg.gamelist[0].hcap];
sprintf(str, "%3.1f", mesg.gamelist[0].komi);
[[NXApp getGoView] setIGSKomi:str];
[[NXApp getGoView] setByoTime:mesg.byo];
boardon = 1;
return 0;
}
void makemove(int x, int y, int movenum, int color, int btime, int bbyo,
int wtime, int wbyo) {
extern void sethand(int);
if ((x < MAXX) && (y < MAXY)) {
[[NXApp getGoView] makeMove: color: x: y];
[[NXApp getGoView] setTimeAndByo: btime: bbyo: wtime: wbyo];
[[NXApp getGoView] dispTime];
}
else if (x > 100) {
sethand(x-100);
[[NXApp getGoView] display];
}
}
void makemovesilent(int x, int y, int movenum, int color, int btime, int bbyo,
int wtime, int wbyo)
{
extern void sethand(int);
if ((x < MAXX) && (y < MAXY))
{
[[NXApp getGoView] makeMoveSilent: color: x: y];
}
else if (x > 100)
{
sethand(x-100);
}
}
void removeGroup(int x, int y)
{
extern unsigned char p[19][19], patternmat[19][19];
extern int blackCaptured, whiteCaptured, currentStone;
extern void find_pattern_in_board(int,int);
int i, j;
currentStone = p[x][y];
find_pattern_in_board(x,y);
for (i = 0; i < MAXX; i++)
for (j = 0; j < MAXY; j++)
if (patternmat[i][j])
{
p[i][j] = EMPTY;
if (currentStone==BLACK)
blackCaptured++;
else
whiteCaptured++;
}
[[NXApp getGoView] setblacksPrisoners:blackCaptured];
[[NXApp getGoView] setwhitesPrisoners:whiteCaptured];
[[NXApp getGoView] refreshIO];
}
void getmoves(int n)
{
int ret;
char str[100];
sprintf(str, "moves %d\n", n);
sendstr(str);
do {
do {
ret = getmessage(&mesg, 0);
if (ret < 0)
exit(1);
} while (!ret);
if (mesg.id == MOVE)
makemovesilent(mesg.x, mesg.y, mesg.movenum, mesg.color, mesg.btime,
mesg.bbyo, mesg.wtime, mesg.wbyo);
else if (mesg.id && mesg.id != PROMPT)
[NXApp SetIGSStatus:mesg.text];
} while (mesg.id != PROMPT); /* MOVE || mesg.id == 0); */
lastMove--;
makemove(mesg.x, mesg.y, mesg.movenum, mesg.color, mesg.btime,
mesg.bbyo, mesg.wtime, mesg.wbyo);
[[NXApp getGoView] refreshIO];
[[NXApp getGoView] display];
}
void getgames(message *mess)
{
int ret;
sendstr("games\n");
do {
do {
ret = getmessage(mess, 0);
if (ret < 0)
exit(1);
} while (!ret);
if (mess->id == MOVE)
[NXApp SetIGSStatus:"%Premature move. Restart game.\n"];
} while (mess->id != GAMES);
}
void unobserve(void) {
char str[100];
sprintf(str, "unobserve %d\n", ingame);
sendstr(str);
observing=0; ingame= -1; setgame(-1);
}
int observegame(int n) {
int ret;
char str[20];
if (!observing && ingame != -1) {
[NXApp SetIGSStatus:"Can't observe while playing.\n"];
return 1;
}
if (startgame(n))
return 1;
getmoves(n);
sprintf(str, "observe %d\n", n);
sendstr(str);
observing = 1;
do {
do {
ret = getmessage(&mesg, 0);
if (ret < 0)
exit(1);
} while (!ret);
if ((mesg.id == INFO) && !strncmp(mesg.text, "Removing", 8))
[NXApp SetIGSStatus:"%fatal sync error. Restart igs.\n"];
} while (mesg.id != MOVE && mesg.id != UNDO);
return 0;
}
/* commented out because currently not used
*
* int peekgame(int n)
* {
* if (!observing && ingame != -1) {
* [NXApp SetIGSStatus:"Can't peek while playing.\n"];
* return 1;
* }
* if (startgame(n))
* return 1;
* getmoves(n);
* setgame(-1);
* return 0;
* }
*/
void setgame(int newgame) {
if (newgame != ingame) {
ingame = newgame;
/* [[NXApp getGoView] setGameNumber:ingame]; */
}
}
void loadgame(char *name)
{
char str[100];
int ret;
sprintf(str, "load %s\n", name);
sendstr(str);
do {
ret = getmessage(&mesg, 0);
if (ret < 0)
exit(1);
sprintf(str, "&&%d&&\n", mesg.id);
[NXApp SetIGSStatus:str];
} while (mesg.id != MOVE && mesg.id != ERROR);
if (mesg.id == ERROR)
[NXApp SetIGSStatus:mesg.text];
else {
if (!startgame(mesg.gamenum))
getmoves(mesg.gamenum);
}
}
void doserver(void)
{
int ret;
NXEvent peek_ev, *get_ev;
loc = local;
idle = 0;
ret = getmessage(&mesg, 1);
if (ret < 0 && ret != KEY) {
[NXApp SetIGSStatus:"Connection closed\n"];
}
if (ret > 0)
switch (mesg.id) {
case QUITMESG:
[NXApp SetIGSStatus:mesg.text];
break;
case ONSERVER:
[NXApp SetIGSStatus:"Connection established\n"];
break;
case BEEP:
break;
case MOVE:
if (!boardon)
[NXApp SetIGSStatus:"%Error: isolated move received\n"];
else {
makemove(mesg.x, mesg.y, mesg.movenum, mesg.color,
mesg.btime,
mesg.bbyo, mesg.wtime, mesg.wbyo);
setgame(mesg.gamenum);
}
break;
case UNDO:
if (!boardon)
[NXApp SetIGSStatus:"%Error: isolated undo received"];
else {
setgame(mesg.gamenum);
[[NXApp getGoView] undo];
[[NXApp getGoView] display];
}
break;
case SCOREUNDO:
/* endgame(); */
[NXApp SetIGSStatus:"Scoring undone."];
break;
case LOAD:
if (!startgame(mesg.gamenum))
getmoves(mesg.gamenum);
break;
case MATCH:
startgame(mesg.gamenum);
break;
case REMOVE:
removeGroup(mesg.x, mesg.y);
break;
case SCORE:
{
char str[50];
showboard(mesg.board);
sprintf(str, "Black: %g\nWhite: %g\n", mesg.bscore,
mesg.wscore);
[NXApp SetIGSStatus:str];
}
break;
case LOOK_M: {
int pris[2];
if (mesg.boardsize > 19)
[NXApp SetIGSStatus:"%Boardsize of saved game too big.\n"];
else {
MAXX = MAXY = mesg.boardsize;
[[NXApp getGoView] startNewGame];
[[NXApp getGoView] display];
boardon = 1;
pris[0] = mesg.bcap;
pris[1] = mesg.wcap;
[[NXApp getGoView] setblacksPrisoners:pris[0]];
[[NXApp getGoView] setwhitesPrisoners:pris[1]];
[[NXApp getGoView] refreshIO];
showboard(mesg.board);
}
}
break;
case KIBITZ:{
char s[300];
sprintf(s, "%s: %s\n", mesg.kibitzer, mesg.kibitz);
[NXApp SetIGSStatus:s];
}
break;
case STORED:
if (!strlen(mesg.text))
[NXApp SetIGSStatus:"No stored games\n"];
else
[NXApp SetIGSStatus:mesg.text];
break;
case INFO:
if (strstr(mesg.text, "Removing")) {
observing = 0;
setgame(-1);
}
if (strstr(mesg.text, "game completed")) {
[NXApp gameCompleted];
}
[NXApp SetIGSStatus:mesg.text];
break;
case PROMPT:
if (ingame != -1 && mesg.prompttype == 5) {
setgame(-1);
observing = 0;
[NXApp gameCompleted];
}
case 0:
break;
default:
[NXApp SetIGSStatus:mesg.text];
break;
}
idle = 1;
if( [NXApp peekNextEvent: NX_MOUSEDOWNMASK into: &peek_ev] )
{
get_ev = [NXApp getNextEvent: NX_MOUSEDOWNMASK];
[NXApp sendEvent: get_ev];
}
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.