This is GoApp.m in view mode; [Download] [Up]
#include "comment.header" /* Generated by Interface Builder */ /* $Id: GoApp.m,v 1.3 1997/07/06 19:37:57 ergo Exp $ */ /* * $Log: GoApp.m,v $ * Revision 1.3 1997/07/06 19:37:57 ergo * actual version * * Revision 1.5 1997/06/03 23:00:58 ergo * changed the appearance of the windows * * Revision 1.4 1997/05/30 18:44:15 ergo * Added an Inspector * * Revision 1.3 1997/05/04 18:56:53 ergo * added time control for moves * */ #import <appkit/appkit.h> #import <appkit/PrintInfo.h> #include <string.h> #import "GoApp.h" #import "Board.h" #import "ClickCell.h" #import "MatrixScrollView.h" #import "GoServer.h" #import "ServerList.h" #include "igs.h" #include "godict.h" #define CURRENT_VERSION "Version 2.7" unsigned char p[19][19], l[19][19], ma[19][19], ml[19][19]; char special_characters[19][19], sgComment[2000], sgNodeName[200]; int hist[19][19], currentMoveNumber; int rd, lib, play, pass, handicap, whiteSide, blackSide, MAXX, MAXY; int currentStone, opposingStone, blackCaptured, whiteCaptured; int blackTerritory, whiteTerritory, SmartGoGameFlag, initialization; float black_Score, white_Score; int blackCapturedKoI, blackCapturedKoJ, whiteCapturedKoI, whiteCapturedKoJ; int bothSides, neitherSide, blackPassed, whitePassed, manualScoring, manScoreTemp; int typeOfScoring, AGAScoring; int opn[9]; // opening pattern flag int gameType; BOOL finished, printBold; gameHistory gameMoves[500]; int lastMove, boardChanged; node *SGgameMoves, *currentNode, *rootNode; FILE *smartGoInputFile; char *SGfile, *currentSGfilePosition; char *IGSStatusText, IGSPasswordText[20], IGSLoginText[20]; GODICT *godict; char *getpassword(void) { return IGSPasswordText; } char *getloginname(void) { return IGSLoginText; } void checkingNetTraffic(DPSTimedEntry timedEntry, double timeNow, void *data) { [(id)data checkNetTraffic]; } void IGSSendString(char *s) { sendstr(s); printBold = YES; [NXApp SetIGSStatus:s]; } void stripChar(char *s, char c) { int i, j; i = 0; while (i < strlen(s)) { if (s[i] == c) { for (j = i; j < strlen(s) - 1; j++) s[j] = s[j+1]; s[strlen(s) - 1] = 0; } else { i++; } } } int saveNeXTGoFile(const char *fileName) { FILE *NGoFile; int i, j; if ((NGoFile = fopen(fileName, "w")) == NULL) return 1; fprintf(NGoFile, "%d\n", handicap); fprintf(NGoFile, "%d\n", whiteSide); fprintf(NGoFile, "%d\n", blackSide); fprintf(NGoFile, "%d\n", MAXX); fprintf(NGoFile, "%d\n", MAXY); fprintf(NGoFile, "%d\n", currentStone); fprintf(NGoFile, "%d\n", opposingStone); fprintf(NGoFile, "%d\n", blackCaptured); fprintf(NGoFile, "%d\n", whiteCaptured); fprintf(NGoFile, "%d\n", blackCapturedKoI); fprintf(NGoFile, "%d\n", blackCapturedKoJ); fprintf(NGoFile, "%d\n", whiteCapturedKoI); fprintf(NGoFile, "%d\n", whiteCapturedKoJ); fprintf(NGoFile, "%d\n", bothSides); fprintf(NGoFile, "%d\n", neitherSide); fprintf(NGoFile, "%d\n", blackPassed); fprintf(NGoFile, "%d\n", whitePassed); fprintf(NGoFile, "%d\n", lastMove); for (i = 0; i < 9; i++) fprintf(NGoFile, "%d\n", opn[i]); for (i = 0; i < lastMove; i++) { fprintf(NGoFile, "%d\n", gameMoves[i].numchanges); fprintf(NGoFile, "%d\n", gameMoves[i].blackCaptured); fprintf(NGoFile, "%d\n", gameMoves[i].whiteCaptured); for (j = 0; j < gameMoves[i].numchanges; j++) { fprintf(NGoFile, "%d\n", gameMoves[i].changes[j].added); fprintf(NGoFile, "%d\n", gameMoves[i].changes[j].color); fprintf(NGoFile, "%d\n", gameMoves[i].changes[j].x); fprintf(NGoFile, "%d\n", gameMoves[i].changes[j].y); } } fclose(NGoFile); return 0; } int saveSmartGoFile(const char *fileName) { FILE *NGoFile; int i, j; if ((NGoFile = fopen(fileName, "w")) == NULL) return 1; fprintf(NGoFile, "(\n;\nGaMe[1]\nVieW[]\n"); fprintf(NGoFile, "SiZe[%d]\nKoMi[%3.1f]\nHAndicap[%d]", MAXX, ((handicap == 0)?KOMI:0.5), handicap); fprintf(NGoFile,"\nComment[ A game between "); if (gameType != LOCAL) { fprintf(NGoFile, "two people on the network.\n\n"); } else if (neitherSide) { fprintf(NGoFile,"two human players.\n\n"); } else if (bothSides) { fprintf(NGoFile,"two computer players.\n\n"); } else { fprintf(NGoFile,"the computer and a human player.\n\n"); } if (finished) { fprintf(NGoFile," Result: %s wins by %8.1f.]\n", (black_Score > white_Score)?"Black":"White", fabs(black_Score - white_Score)); } else { fprintf(NGoFile, "]\n"); } if (handicap > 1) { int q, half; q = (MAXX < 13)?2:3; half = (MAXX + 1)/2 - 1; switch (handicap) { case 2: fprintf(NGoFile, "AddBlack[%c%c][%c%c]\n", q+'a', MAXY-q-1+'a', MAXX-q-1+'a', q+'a'); break; case 3: fprintf(NGoFile, "AddBlack[%c%c][%c%c][%c%c]\n", q+'a', MAXY-q-1+'a', MAXX-q-1+'a', q+'a', q+'a', q+'a'); break; case 4: fprintf(NGoFile, "AddBlack[%c%c][%c%c][%c%c][%c%c]\n", q+'a', MAXY-q-1+'a', MAXX-q-1+'a', q+'a', q+'a', q+'a', MAXX-q-1+'a', MAXY-q-1+'a'); break; case 5: fprintf(NGoFile, "AddBlack[%c%c][%c%c][%c%c][%c%c][%c%c]\n", q+'a', MAXY-q-1+'a', MAXX-q-1+'a', q+'a', q+'a', q+'a', MAXX-q-1+'a', MAXY-q-1+'a', half+'a', half+'a'); break; case 6: fprintf(NGoFile, "AddBlack[%c%c][%c%c][%c%c][%c%c][%c%c][%c%c]\n", q+'a', MAXY-q-1+'a', MAXX-q-1+'a', q+'a', q+'a', q+'a', MAXX-q-1+'a', MAXY-q-1+'a', q+'a', half+'a', MAXX-q-1+'a', half+'a'); break; case 7: fprintf(NGoFile, "AddBlack[%c%c][%c%c][%c%c][%c%c][%c%c][%c%c][%c%c]\n", q+'a', MAXY-q-1+'a', MAXX-q-1+'a', q+'a', q+'a', q+'a', MAXX-q-1+'a', MAXY-q-1+'a', q+'a', half+'a', MAXX-q-1+'a', half+'a', half+'a', half+'a'); break; case 8: fprintf(NGoFile, "AddBlack[%c%c][%c%c][%c%c][%c%c][%c%c][%c%c][%c%c][%c%c]\n", q+'a', MAXY-q-1+'a', MAXX-q-1+'a', q+'a', q+'a', q+'a', MAXX-q-1+'a', MAXY-q-1+'a', q+'a', half+'a', MAXX-q-1+'a', half+'a', half+'a', q+'a', half+'a', MAXY-q-1+'a'); break; case 9: fprintf(NGoFile, "AddBlack[%c%c][%c%c][%c%c][%c%c][%c%c][%c%c][%c%c][%c%c][%c%c]\n", q+'a', MAXY-q-1+'a', MAXX-q-1+'a', q+'a', q+'a', q+'a', MAXX-q-1+'a', MAXY-q-1+'a', q+'a', half+'a', MAXX-q-1+'a', half+'a', half+'a', q+'a', half+'a', MAXY-q-1+'a', half+'a', half+'a'); break; } } for (i = 0; i < lastMove; i++) { for (j = 0; j < gameMoves[i].numchanges; j++) { if (gameMoves[i].changes[j].added) switch (gameMoves[i].changes[j].color) { case 1: if (gameMoves[i].changes[j].x >= 0) { fprintf(NGoFile,";\nWhite[%c%c]\n", gameMoves[i].changes[j].x+'a', gameMoves[i].changes[j].y+'a'); } else { fprintf(NGoFile, ";\nWhite[tt]\n"); } break; case 2: if (gameMoves[i].changes[j].x >= 0) { fprintf(NGoFile,";\nBlack[%c%c]\n", gameMoves[i].changes[j].x+'a', gameMoves[i].changes[j].y+'a'); } else { fprintf(NGoFile, ";\nBlack[tt]\n"); } break; } } } fprintf(NGoFile,")\n\n"); fclose(NGoFile); return 0; } @implementation GoApp + initialize { static NXDefaultsVector NeXTGoDefaults = { {"Handicap", "0"}, {"BoardSize", "19"}, /* MAXX */ {"BlackSide", "1"}, {"WhiteSide", "0"}, {"ManualScoring", "1"}, {"TypeOfScoring", "0"}, {"AGAScoring", "0"}, {"Server0", "igs.nuri.net 6969 guest guest"}, {"Server1", "nngs.cosmic.org 9696 guest guest"}, {NULL, NULL} }; NXRegisterDefaults("NeXTGo", NeXTGoDefaults); return self; } - appDidInit:app { char str[80]; godict = NULL; IGSfont = [Font newFont:"Ohlfs" size:10]; IGSboldFont = [Font newFont:"Helvetica" size:10]; [gameWindow setMiniwindowIcon:"NeXTGoFile"]; strcpy(str, "NeXTGo -- "); strcat(str, CURRENT_VERSION); [versionString setStringValue:CURRENT_VERSION]; [gameWindow setTitle:str]; [[IGSStatus docView] setFont:IGSfont]; [[smartGoComments docView] setFont:IGSfont]; [controller initPanel]; lastMove = 0; gameType = LOCAL; handicap = atoi(NXGetDefaultValue("NeXTGo", "Handicap")); MAXX = atoi(NXGetDefaultValue("NeXTGo", "BoardSize")); blackSide = atoi(NXGetDefaultValue("NeXTGo", "BlackSide")); whiteSide = atoi(NXGetDefaultValue("NeXTGo", "WhiteSide")); manualScoring = atoi(NXGetDefaultValue("NeXTGo", "ManualScoring")); typeOfScoring = atoi(NXGetDefaultValue("NeXTGo", "TypeOfScoring")); AGAScoring = atoi(NXGetDefaultValue("NeXTGo", "AGAScoring")); MAXY = MAXX; manScoreTemp = manualScoring; [handicapSlider setIntValue:handicap]; [handicapText setIntValue:handicap]; [sizeSlider setIntValue:MAXX]; [sizeText setIntValue:MAXX]; [BlackPlayer selectCellAt:blackSide:0]; [WhitePlayer selectCellAt:whiteSide:0]; [scoringMethod selectCellAt:manualScoring:0]; [scoringType selectCellAt:typeOfScoring:0]; [AGAscoringMethodFlag setIntValue:AGAScoring]; [savePrefsFlag setIntValue:1]; neitherSide = 0; bothSides = 0; manScoreTemp = manualScoring; if ((blackSide == 0) && (whiteSide == 0)) neitherSide++; if ((blackSide == 1) && (whiteSide == 1)) bothSides++; [self NewGame:self]; [[[NXApp printInfo] setHorizCentered:YES] setVertCentered:YES]; [gameWindow setFrameAutosaveName:"NeXTGoGameWindow"]; [gameWindow makeKeyAndOrderFront:self]; [gameInspector setFrameAutosaveName:"NeXTGoGameInspector"]; [gameInspector makeKeyAndOrderFront:self]; [gameWindow makeKeyAndOrderFront:self]; [IGSPanel setFrameAutosaveName:"NeXTGoIGSPanel"]; SmartGoGameFlag = 0; CommandSender = nil; return self; } - showError: (const char *)errorMessage { NXRunAlertPanel("NeXTGo Error", errorMessage,"OK", NULL, NULL); return self; } - UserPass:sender { if (SmartGoGameFlag) return self; [MainGoView passMove]; return self; } - stopGame:sender { if (SmartGoGameFlag) return self; [MainGoView stop:self]; return self; } - startGame:sender { if (SmartGoGameFlag) return self; [MainGoView go:self]; return self; } - NewGame:sender { int resp; if (gameType == IGSGAME) { NXRunAlertPanel("IGS Error", "You must first close your IGS session before\n\ beginning a new game.", "OK", NULL, NULL); return self; } if (SmartGoGameFlag) { SmartGoGameFlag = 0; [smartGoPanel close]; } gameType = LOCAL; if ((lastMove > 0) && (!finished)) { resp = NXRunAlertPanel("NeXTGo Warning", "A game is in process. Do you wish to abandon it?", "Abandon", "Cancel", 0); if (resp == NX_ALERTALTERNATE) return self; } [MainGoView startNewGame]; [MainGoView display]; lastMove = 0; return self; } - SetPreferences:sender { char str[80]; handicap = [handicapSlider intValue]; MAXX = MAXY = [sizeSlider intValue]; blackSide = [BlackPlayer selectedRow]; whiteSide = [WhitePlayer selectedRow]; manualScoring = [scoringMethod selectedRow]; typeOfScoring = [scoringType selectedRow]; AGAScoring = [AGAscoringMethodFlag intValue]; neitherSide = 0; bothSides = 0; manScoreTemp = manualScoring; if ((blackSide == 0) && (whiteSide == 0)) neitherSide++; if ((blackSide == 1) && (whiteSide == 1)) bothSides++; [self NewGame:self]; [prefPanel close]; if ([savePrefsFlag intValue]) { sprintf(str, "%d", handicap); NXWriteDefault("NeXTGo", "Handicap", str); sprintf(str, "%d", MAXX); NXWriteDefault("NeXTGo", "BoardSize", str); sprintf(str, "%d", blackSide); NXWriteDefault("NeXTGo", "BlackSide", str); sprintf(str, "%d", whiteSide); NXWriteDefault("NeXTGo", "WhiteSide", str); sprintf(str, "%d", manualScoring); NXWriteDefault("NeXTGo", "ManualScoring", str); sprintf(str, "%d", typeOfScoring); NXWriteDefault("NeXTGo", "TypeOfScoring", str); sprintf(str, "%d", AGAScoring); NXWriteDefault("NeXTGo", "AGAScoring", str); } return self; } - displayNewSGNode { node *var_list, *current_var; [smartGoNodeNumber setIntValue:currentNode->nodenum]; [[smartGoComments docView] setText:""]; [[smartgoVariants docView] setText:""]; [self AddSGComment:sgComment]; [self SetSGNodeName:sgNodeName]; [MainGoView display]; [MainGoView setblacksPrisoners:blackCaptured]; [MainGoView setwhitesPrisoners:whiteCaptured]; for (var_list = currentNode->variants; var_list != NULL; var_list = var_list->next_var) { char var_name[80]; current_var = var_list; while (current_var->properties == NULL) { current_var = forwardOneNode(current_var); } sgNodeName[0] = 0; buildToNode(current_var); if (boardChanged) [MainGoView doClick]; sprintf(var_name, "%d: %s", current_var->nodenum, sgNodeName); [self AddSGVariantName:var_name]; } if (currentNode->variants != NULL) { sgNodeName[0] = 0; sgComment[0] = 0; buildToNode(currentNode); if (boardChanged) [MainGoView doClick]; } return self; } - stepSmartGoFile:sender { sgComment[0] = 0; sgNodeName[0] = 0; currentNode = stepForward(currentNode); [self displayNewSGNode]; return self; } - stepBackSmartGoFile:sender { sgComment[0] = 0; sgNodeName[0] = 0; currentNode = stepBackward(currentNode); [self displayNewSGNode]; return self; } - jumpSmartGoFile:sender { sgComment[0] = 0; sgNodeName[0] = 0; currentNode = jumpForward(currentNode); [self displayNewSGNode]; return self; } - jumpBackSmartGoFile:sender { sgComment[0] = 0; sgNodeName[0] = 0; currentNode = jumpBackward(currentNode); [self displayNewSGNode]; return self; } - AddSGComment:(char *)s { Text *docView = [smartGoComments docView]; int dvLen; char retstr[5]; strcpy(retstr, "\n"); dvLen = [docView textLength]; [docView setSel:dvLen :dvLen]; [docView replaceSel: s]; [docView setSel:[docView textLength] :[docView textLength]]; [docView scrollSelToVisible]; return self; } - AddSGVariantName:(char *)s { Text *docView = [smartgoVariants docView]; int dvLen; char retstr[5]; strcpy(retstr, "\n"); dvLen = [docView textLength]; [docView setSel:dvLen :dvLen]; [docView replaceSel: s]; [docView setSel:[docView textLength] :[docView textLength]]; [docView replaceSel: retstr]; [docView setSel:[docView textLength] :[docView textLength]]; [docView scrollSelToVisible]; return self; } - SetSGNodeName:(char *)s { [smartGoNodeName setStringValue:s]; [smartGoNodeName display]; return self; } - openNeXTGoFile:(const char*)aFile { FILE *NGoFile; int i, j, t; if ((NGoFile = fopen(aFile, "r")) == NULL) { return self; } SmartGoGameFlag = 0; fscanf(NGoFile, "%d", &handicap); fscanf(NGoFile, "%d", &whiteSide); fscanf(NGoFile, "%d", &blackSide); fscanf(NGoFile, "%d", &MAXX); fscanf(NGoFile, "%d", &MAXY); [MainGoView startNewGame]; fscanf(NGoFile, "%d", &opposingStone); fscanf(NGoFile, "%d", ¤tStone); fscanf(NGoFile, "%d", &blackCaptured); fscanf(NGoFile, "%d", &whiteCaptured); fscanf(NGoFile, "%d", &blackCapturedKoI); fscanf(NGoFile, "%d", &blackCapturedKoJ); fscanf(NGoFile, "%d", &whiteCapturedKoI); fscanf(NGoFile, "%d", &whiteCapturedKoJ); fscanf(NGoFile, "%d", &bothSides); fscanf(NGoFile, "%d", &neitherSide); fscanf(NGoFile, "%d", &blackPassed); fscanf(NGoFile, "%d", &whitePassed); fscanf(NGoFile, "%d", &lastMove); for (i = 0; i < 9; i++) { fscanf(NGoFile, "%d", &t); opn[i] = t; } for (i = 0; i < MAXX; i++) for (j = 0; j < MAXY; j++) p[i][j] = hist[i][j] = 0; for (i = 0; i < lastMove; i++) { fscanf(NGoFile, "%d", &gameMoves[i].numchanges); fscanf(NGoFile, "%d", &gameMoves[i].blackCaptured); fscanf(NGoFile, "%d", &gameMoves[i].whiteCaptured); gameMoves[i].changes = (struct change *) malloc((size_t)sizeof(struct change)*gameMoves[i].numchanges); for (j = 0; j < gameMoves[i].numchanges; j++) { fscanf(NGoFile, "%d", &gameMoves[i].changes[j].added); fscanf(NGoFile, "%d", &gameMoves[i].changes[j].color); fscanf(NGoFile, "%d", &gameMoves[i].changes[j].x); fscanf(NGoFile, "%d", &gameMoves[i].changes[j].y); } } for (i = 0; i < lastMove; i++) for (j = 0; j < gameMoves[i].numchanges; j++) { if (gameMoves[i].changes[j].added) { p[gameMoves[i].changes[j].x][gameMoves[i].changes[j].y] = gameMoves[i].changes[j].color; hist[gameMoves[i].changes[j].x][gameMoves[i].changes[j].y] = i; } else { p[gameMoves[i].changes[j].x][gameMoves[i].changes[j].y] = 0; } } blackCaptured = gameMoves[lastMove-1].blackCaptured; whiteCaptured = gameMoves[lastMove-1].whiteCaptured; [MainGoView refreshIO]; [MainGoView resetButtons]; fclose(NGoFile); [MainGoView lockFocus]; [[MainGoView window] flushWindow]; [MainGoView display]; [MainGoView unlockFocus]; NXPing(); return self; } - initTranslator:sender { char filename[MAXPATHLEN+1]; NXBundle *bundle; bundle = [NXBundle bundleForClass:[self class]]; strcpy(filename, [bundle directory] ); strcat(filename,"/"); strcat(filename,DEFDICT); if (godict == NULL) { godict = load_dict(filename); if (godict == NULL) { NXRunAlertPanel("Translate Error","There is a problem opening the dictionary file.", "OK", 0, 0); return self; } } [translateWindow makeKeyAndOrderFront:self]; [translateWindow setMiniwindowIcon:"NeXTGoFile"]; [translateWindow display]; [translateTerm setStringValue:""]; [translateTerm selectText:self]; [translateButton setEnabled:YES]; [[translateResults docView] setText:""]; return self; } - performTranslate:sender { GODICT *d; char term[80]; extern int termtypes, languages; strcpy(term, [translateTerm stringValue]); if (strlen(term) == 0) return self; termtypes = CD_MISC*[transTypeMISC intValue]; termtypes += CD_NAME*[transTypeNAME intValue]; termtypes += CD_CHAM*[transTypeCHAM intValue]; termtypes += CD_TECH*[transTypeTECH intValue]; termtypes += CD_POLI*[transTypePOLI intValue]; termtypes += CD_DIGI*[transTypeDIGI intValue]; languages = LANG_DG*[transLangDG intValue]; languages += LANG_CP*[transLangCP intValue]; languages += LANG_JP*[transLangJP intValue]; languages += LANG_CH*[transLangCH intValue]; languages += LANG_RK*[transLangRK intValue]; languages += LANG_GB*[transLangGB intValue]; languages += LANG_NL*[transLangNL intValue]; languages += LANG_GE*[transLangGE intValue]; languages += LANG_FR*[transLangFR intValue]; languages += LANG_SV*[transLangSV intValue]; [[translateResults docView] setText:""]; d = godict; while (d != NULL) { d = search_dict(d,term); if (d != NULL) { [self translateOutput:d]; d = d->dct_next; } } [translateTerm selectText:self]; return self; } - translateOutput:(GODICT *)d { extern int languages; printBold = YES; [self addTranslateResults:LB_CD]; switch(d->dct_type) { case CD_CHAM: [self addTranslateResults:MSG_CHAM]; break; case CD_TECH: [self addTranslateResults:MSG_TECH]; break; case CD_NAME: [self addTranslateResults:MSG_NAME]; break; case CD_POLI: [self addTranslateResults:MSG_POLI]; break; case CD_DIGI: [self addTranslateResults:MSG_DIGI]; break; default: [self addTranslateResults:MSG_MISC]; break; } [self addTranslateResults:"\n"]; if (d->dct_jp && (languages & (LANG_JP))) { printBold = YES; [self addTranslateResults:LB_JP]; [self addTranslateResults:d->dct_jp]; [self addTranslateResults:"\n"]; } if (d->dct_ch && (languages & (LANG_CH))) { printBold = YES; [self addTranslateResults:LB_CH]; [self addTranslateResults:d->dct_ch]; [self addTranslateResults:"\n"]; } if (d->dct_rk && (languages & (LANG_RK))) { printBold = YES; [self addTranslateResults:LB_RK]; [self addTranslateResults:d->dct_rk]; [self addTranslateResults:"\n"]; } if (d->dct_gb && (languages & (LANG_GB))) { printBold = YES; [self addTranslateResults:LB_GB]; [self addTranslateResults:d->dct_gb]; [self addTranslateResults:"\n"]; } if (d->dct_nl && (languages & (LANG_NL))) { printBold = YES; [self addTranslateResults:LB_NL]; [self addTranslateResults:d->dct_nl]; [self addTranslateResults:"\n"]; } if (d->dct_ge && (languages & (LANG_GE))) { printBold = YES; [self addTranslateResults:LB_GE]; [self addTranslateResults:d->dct_ge]; [self addTranslateResults:"\n"]; } if (d->dct_fr && (languages & (LANG_FR))) { printBold = YES; [self addTranslateResults:LB_FR]; [self addTranslateResults:d->dct_fr]; [self addTranslateResults:"\n"]; } if (d->dct_fr && (languages & (LANG_SV))) { printBold = YES; [self addTranslateResults:LB_SV]; [self addTranslateResults:d->dct_sv]; [self addTranslateResults:"\n"]; } if (d->dct_dg && (languages & (LANG_DG))) { printBold = YES; [self addTranslateResults:LB_DG]; [self addTranslateResults:"\n"]; [self addTranslateResults:d->dct_dg]; [self addTranslateResults:"\n"]; } if (d->dct_cp && (languages & (LANG_CP))) { printBold = YES; [self addTranslateResults:LB_CP]; [self addTranslateResults:d->dct_cp]; [self addTranslateResults:"\n"]; } [self addTranslateResults:"\n\n"]; return self; } - addTranslateResults:(char *)s { Text *docView = [translateResults docView]; int dvLen; dvLen = [docView textLength]; [docView setSel:dvLen :dvLen]; [docView setSelFont:IGSfont]; printBold = NO; [docView replaceSel:s]; [docView setSel:[docView textLength] :[docView textLength]]; [docView scrollSelToVisible]; return self; } - openSmartGoFile:(const char*)aFile { char dispFileName[80]; int i, j; struct stat statbuf; if (gameType != LOCAL) { NXRunAlertPanel("IGS Error", "You must first close your IGS session before\n\ opening a Smart-Go file.", "OK", NULL, NULL); return self; } if ((smartGoInputFile = fopen(aFile, "r")) == NULL) { return self; } SGgameMoves = NULL; SmartGoGameFlag = 1; initialization = 0; [smartGoPanel makeKeyAndOrderFront:self]; [smartGoPanel setMiniwindowIcon:"NeXTGoFile"]; [smartGoPanel display]; [stepForwardButton setEnabled:YES]; stat(aFile, &statbuf); SGfile = (char *) malloc ((size_t)statbuf.st_size+10); if (fread(SGfile, statbuf.st_size, 1, smartGoInputFile) != 1) { [self showError:"Error on Read"]; fclose(smartGoInputFile); free(SGfile); return self; } fclose(smartGoInputFile); [MainGoView startNewGame]; [MainGoView setMess1:"Smart-Go Playback"]; j = 0; for (i = 0; i < strlen(aFile); i++) { if (aFile[i] == '/') { j = i; } } for (i = j+1; i < strlen(aFile); i++) { dispFileName[i-j-1] = aFile[i]; } dispFileName[strlen(aFile) - j - 1] = 0; [MainGoView setMess2:dispFileName]; rootNode = parse_tree(SGfile); MAXX = MAXY = 19; currentNode = stepForward(rootNode); [self displayNewSGNode]; NXPing(); return self; } - IGSSendCommand:sender { /* first we catch all commands which have a special implementation */ id aString = [[MiscString alloc] initString:[IGSCommand stringValue]]; if (strstr((char *)[IGSCommand stringValue], "done") && ([aString numOf:" "] + strlen("done")) == [aString length]){ [IGSCommand selectText:self]; [self IGSdone:self]; } else if (strstr((char *)[IGSCommand stringValue], "unobserve") && ([aString numOf:" "] + strlen("unobserve")) == [aString length]){ [self IGSunobserve:self]; [IGSCommand selectText:self]; } else if (strstr((char *)[IGSCommand stringValue], "observe") && ([aString numOf:" "] + strlen("observe")) == [aString length]){ [self IGSobserve:self]; [IGSCommand selectText:self]; } else if (strstr((char *)[IGSCommand stringValue], "load") && ([aString numOf:" "] + strlen("load")) == [aString length]){ [self IGSOpenLoadGame:self]; [IGSCommand selectText:self]; } else if (strstr((char *)[IGSCommand stringValue], "quit") && ([aString numOf:" "]+strlen("quit")) == [aString length]){ [self IGSquit:self]; [IGSCommand selectText:self]; } else { IGSSendString((char *)[IGSCommand stringValue]); IGSSendString("\n"); } if (CommandSender != nil) { [CommandSender makeKeyAndOrderFront:self]; CommandSender = nil; } return self; } - connect:(GoServer*)server { char s[80]; sethost((char*)[server name]); setport([server port]); strcpy(IGSLoginText, (char *)[server login]); strcpy(IGSPasswordText,[server password]); if (SmartGoGameFlag) { SmartGoGameFlag = 0; [smartGoPanel close]; } [[IGSStatus docView] setText:""]; [IGSPanel makeKeyAndOrderFront:self]; [IGSPanel setMiniwindowIcon:"NeXTGoFile"]; [IGSCommand selectText:self]; if (open_connection()) { [self SetIGSStatus:"Unable to make a connection.\n"]; gameType = LOCAL; NXRunAlertPanel("IGS Error", "I was unable to make a connection.", "OK", 0, 0); [IGSPanel close]; return self; } [self SetIGSStatus:"Connection established."]; sprintf(s, "Logging in as %s\n", IGSLoginText); [self SetIGSStatus:s]; timer = DPSAddTimedEntry(0.25, &checkingNetTraffic, self, NX_BASETHRESHOLD); gameType = IGSGAME; finished = YES; idle = 1; [loadMenuCell setEnabled:YES]; [observeMenuCell setEnabled:YES]; initparser(); return self; } - checkNetTraffic { fd_set readers; struct timeval to; int sel; to.tv_sec = 0; to.tv_usec = 0; FD_ZERO(&readers); FD_SET(sock, &readers); sel = select(sock + 1, &readers, NULL, NULL, &to); if (FD_ISSET(sock, &readers)) incomingserver(); return self; } - SetIGSStatus:(char *)s { Text *docView = [IGSStatus docView]; int dvLen; char retstr[5]; strcpy(retstr, "\n"); dvLen = [docView textLength]; [docView setSel:dvLen :dvLen]; [docView setSelFont:IGSfont]; [docView replaceSel: s]; if (printBold) { [docView setSel:dvLen :[docView textLength]]; [docView setSelFont:IGSboldFont]; [docView setSelFontStyle:NX_BOLD]; printBold = NO; } else [docView setSel:[docView textLength] :[docView textLength]]; if (s[strlen(s) - 1] != '\n') { [docView setSel:[docView textLength] :0]; [docView replaceSel: retstr]; [docView scrollSelToVisible]; } [docView scrollSelToVisible]; [IGSCommand selectText:self]; return self; } - getGoView{ return MainGoView; } - open:sender { const char* const types[] = {"nextgo", "mgt", NULL}; id open = [OpenPanel new]; [open allowMultipleFiles:NO]; if (NX_OKTAG == [open runModalForTypes:types]) { char * cc = rindex([open filename],'.'); cc++; if (strcmp(cc,types[0])) { [self openSmartGoFile:[open filename] ]; } else { [self openNeXTGoFile:[open filename] ]; } return self; } return self; } - save:sender { char aString[256] = ""; id save = [SavePanel new]; strcpy(aString, [gameWindow title]); stripChar(aString, ' '); stripChar(aString, '('); stripChar(aString, ')'); stripChar(aString, '*'); /* set the initial format */ [self setFormat:formatMatrix]; /* put format box in view */ [save setAccessoryView:formatMatrix]; if ((1 == [save runModalForDirectory: [save directory] file:aString])) { if (!strcmp([ [formatMatrix selectedCell] title], "NeXTGo")) { saveNeXTGoFile([save filename]); NXPing(); } else { saveSmartGoFile([save filename]); NXPing(); } } return self; } - setFormat:sender { const char *const types[] = {"nextgo", "mgt", NULL}; if (!strcmp([ [sender selectedCell] title],"NeXTGo")) { [ [SavePanel new] setRequiredFileType:types[0]]; } else { [ [SavePanel new] setRequiredFileType:types[1]]; } return self; } /* The following methods are the various commands for the Internet Go Server */ - IGSobserve:sender { message mess; NXRect frameRect = {15, 30, 497, 226}, scrollRect = {0, 0, 497, 226}; NXSize cellSize = {470, 30}; char str[80]; int i; idle = 0; getgames(&mess); observeMatrix = [[Matrix alloc] initFrame:&frameRect mode:NX_RADIOMODE cellClass:[ClickCell class] numRows:0 numCols:1]; [observeMatrix setCellSize:&cellSize]; for (i = 0; i < mess.gamecount; i++) { sprintf(str, "%3d -- %12s [%3s] vs. %12s [%3s] (%3d %d %d %3.1f)", mess.gamelist[i].gnum, mess.gamelist[i].white, mess.gamelist[i].wrank, mess.gamelist[i].black, mess.gamelist[i].brank, mess.gamelist[i].mnum, mess.gamelist[i].bsize, mess.gamelist[i].hcap, mess.gamelist[i].komi); [observeMatrix addRow]; observeCell = [observeMatrix cellAt:i :0]; [observeCell setStringValue:str]; [observeCell setAlignment:NX_LEFTALIGNED]; } [observeMatrix sizeToCells]; observeScrollView = [[ScrollView alloc] initFrame:&scrollRect]; [observeScrollView setVertScrollerRequired:YES]; [observeScrollView setBorderType:NX_BEZEL]; [observeScrollView setBackgroundGray:NX_LTGRAY]; [observeScrollView setDocView:observeMatrix]; [observeBox addSubview:observeScrollView]; [observeMatrix scrollCellToVisible:0 :0]; [observeBox display]; [observeSelPanel makeKeyAndOrderFront:self]; [IGSCommand selectText:self]; idle = 1; return self; } - cellClicked:theCell { char str[80]; int n; strcpy(str, [theCell stringValue]); sscanf(str, "%3d", &n); idle = 0; observegame(n); idle = 1; [unobserveMenuCell setEnabled: YES]; [observeMenuCell setEnabled:NO]; [loadMenuCell setEnabled:NO]; [observeSelPanel close]; return self; } - IGSunobserve:sender { sendstr("unobserve\n"); [self SetIGSStatus:"Removing observe\n"]; [unobserveMenuCell setEnabled: NO]; [observeMenuCell setEnabled:YES]; [loadMenuCell setEnabled:YES]; [MainGoView gameCompleted]; [MainGoView removeTE]; return self; } - IGSOpenLoadGame:sender { [LoadGameWindow makeKeyAndOrderFront:self]; [LoadGameText selectText:self]; return self; } - IGSLoadGame:sender { idle = 0; loadgame((char *)[LoadGameText stringValue]); idle = 1; [LoadGameWindow close]; return self; } - IGSdone:sender { int q; q = NXRunAlertPanel("Save", "Save the current game to disk ?", "Save...", "Dont't save",0); if (1==q) [self save:self]; IGSSendString("done\n"); return self; } - IGSquit:sender { IGSSendString("quit"); IGSSendString("\n"); [self IGSunobserve:self]; DPSRemoveTimedEntry(timer); [loadMenuCell setEnabled:NO]; [observeMenuCell setEnabled:NO]; [unobserveMenuCell setEnabled:NO]; [MainGoView removeTE]; gameType = LOCAL; [IGSPanel close]; return self; } - sendCommand:sender { char buf[256]; strcpy(buf, [ [sender selectedCell] title]); buf[strlen([ [sender selectedCell] title])] = '\n'; buf[strlen([ [sender selectedCell] title])+1] = '\0'; IGSSendString(buf); return self; } - gameCompleted { [MainGoView gameCompleted]; return self; } - setCommandSender:(id)aSender { CommandSender = aSender; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.