This is GoApp.m in view mode; [Download] [Up]
#include "comment.header" /* Generated by Interface Builder */ /* $Id: GoApp.m,v 1.4 1997/11/04 16:50:42 ergo Exp $ */ /* * $Log: GoApp.m,v $ * Revision 1.4 1997/11/04 16:50:42 ergo * ported to OpenStep * * 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/NSPrintInfo.h> /* the following is included for the definition of fd_set below */ #include <sys/types.h> #include <sys/param.h> #include <sys/stat.h> #include <sys/time.h> #include <string.h> #import "GoApp.h" #import "Board.h" #import "ClickCell.h" #import "GoServer.h" #include "igs.h" #include "godict.h" #define CURRENT_VERSION "Version 3.0" 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, 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, manScoreTemp; BOOL typeOfScoring, manualScoring, AGAScoring; int opn[9]; // opening pattern flag BOOL gameType; BOOL finished, whiteSide, blackSide, printBold; gameHistory gameMoves[500]; int lastMove, boardChanged; BOOL scoringGame, resultsDisplayed; 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 IGSSendString(char *s) { sendstr(s); printBold = YES; [NSApp 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 + (void)initialize { id defaults; defaults = [NSUserDefaults standardUserDefaults]; [defaults setInteger:0 forKey:@"Handicap"]; [defaults setInteger:19 forKey:@"BoardSize"]; [defaults setBool:YES forKey:@"BlackSide"]; [defaults setBool:NO forKey:@"WhiteSide"]; [defaults setBool:YES forKey:@"ManualScoring"]; [defaults setBool:NO forKey:@"TypeOfScoring"]; [defaults setBool:NO forKey:@"AGAScoring"]; [defaults synchronize]; return; } - (void)applicationDidFinishLaunching:(NSNotification *)notification { // NSApplication *theApplication = [notification object]; id defaults; char str[80]; godict = NULL; IGSfont = [ [NSFont fontWithName:@"Ohlfs" size:10] retain]; // IGSboldFont = [ [NSFont fontWithName:@"Ohlfs" size:10] retain]; IGSboldFont = [ [NSFont fontWithName:@"Helvetica-Bold" size:10] retain]; [gameWindow setMiniwindowImage:[ [NSImage imageNamed:@"NeXTGoFile"] retain]]; strcpy(str, "NeXTGo -- "); strcat(str, CURRENT_VERSION); [versionString setStringValue:[NSString stringWithCString:CURRENT_VERSION]]; [gameWindow setTitle:[NSString stringWithCString:str]]; [[IGSStatus documentView] setFont:IGSfont]; [[smartGoComments documentView] setFont:IGSfont]; // [controller initPanel]; lastMove = 0; gameType = LOCAL; defaults = [NSUserDefaults standardUserDefaults]; handicap = [defaults integerForKey:@"Handicap"]; MAXX = [defaults integerForKey:@"BoardSize"]; blackSide = [defaults boolForKey:@"BlackSide"]; whiteSide = [defaults boolForKey:@"WhiteSide"]; manualScoring = [defaults boolForKey:@"ManualScoring"]; typeOfScoring = [defaults boolForKey:@"TypeOfScoring"]; AGAScoring = [defaults boolForKey:@"AGAScoring"]; MAXY = MAXX; manScoreTemp = manualScoring; [handicapSlider setIntValue:handicap]; [handicapText setIntValue:handicap]; [sizeSlider setIntValue:MAXX]; [sizeText setIntValue:MAXX]; [BlackPlayer selectCellAtRow:blackSide column:0]; [WhitePlayer selectCellAtRow:whiteSide column:0]; [scoringMethod selectCellAtRow:manualScoring column:0]; [scoringType selectCellAtRow:typeOfScoring column:0]; [AGAscoringMethodFlag setIntValue:AGAScoring]; [savePrefsFlag setIntValue:1]; neitherSide = 0; bothSides = 0; manScoreTemp = manualScoring; if (!blackSide && !whiteSide) neitherSide++; if (blackSide && whiteSide) bothSides++; [self NewGame:self]; #warning PrintingConversion: The current PrintInfo object now depends on context. '[NSPrintInfo sharedPrintInfo]' used to be '[NSApp printInfo]'. This might want to be [[NSPrintOperation currentOperation] printInfo] or possibly [[PageLayout new] printInfo]. { id newVar = [NSPrintInfo sharedPrintInfo]; [newVar setHorizontallyCentered:YES]; [newVar setVerticallyCentered:YES]; } [gameWindow setFrameAutosaveName:@"NeXTGoGameWindow"]; [gameWindow makeKeyAndOrderFront:self]; [gameInspector setFrameAutosaveName:@"NeXTGoGameInspector"]; [gameInspector makeKeyAndOrderFront:self]; [gameWindow makeKeyAndOrderFront:self]; [IGSPanel setFrameAutosaveName:@"NeXTGoIGSPanel"]; SmartGoGameFlag = 0; CommandSender = nil; } - showError: (const char *)errorMessage { NSRunAlertPanel(@"NeXTGo Error", [NSString stringWithCString:errorMessage], @"OK", nil, nil); 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) { NSRunAlertPanel(@"IGS Error", @"You must first close your IGS session before\n\ beginning a new game.", @"OK", nil, nil); return self; } if (SmartGoGameFlag) { SmartGoGameFlag = 0; [smartGoPanel close]; } gameType = LOCAL; if ((lastMove > 0) && (!finished)) { resp = NSRunAlertPanel(@"NeXTGo Warning", @"A game is in process. Do you wish to abandon it?", @"Abandon", @"Cancel", nil); if (resp == NSAlertAlternateReturn) return self; } [MainGoView startNewGame]; [MainGoView display]; lastMove = 0; return self; } - SetPreferences:sender { 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 && !whiteSide) neitherSide++; if (blackSide && whiteSide) bothSides++; [self NewGame:self]; [prefPanel close]; if ([savePrefsFlag intValue]) { id defaults = [NSUserDefaults standardUserDefaults]; [defaults setInteger:handicap forKey:@"Handicap"]; [defaults setInteger:MAXX forKey:@"BoardSize"]; [defaults setBool:blackSide forKey:@"BlackSide"]; [defaults setBool:whiteSide forKey:@"WhiteSide"]; [defaults setBool:manualScoring forKey:@"ManualScoring"]; [defaults setBool:typeOfScoring forKey:@"TypeOfScoring"]; [defaults setBool:AGAScoring forKey:@"AGAScoring"]; } return self; } - displayNewSGNode { node *var_list, *current_var; [smartGoNodeNumber setIntValue:currentNode->nodenum]; [[smartGoComments documentView] setString:@""]; [[smartgoVariants documentView] setString:@""]; [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 { NSText *docView = [smartGoComments documentView]; [docView setString:[[docView string] stringByAppendingString:[NSString stringWithCString:s]]]; [docView selectAll:docView]; [docView scrollRangeToVisible:[docView selectedRange]]; return self; } - AddSGVariantName:(char *)s { NSText *docView = [smartgoVariants documentView]; NSString *retstr = @"\n", *aString; aString = [[[docView string] stringByAppendingString:retstr] stringByAppendingString:[NSString stringWithCString:s]]; aString = [aString stringByAppendingString:retstr]; [docView selectAll:docView]; [docView scrollRangeToVisible:[docView selectedRange]]; return self; } - SetSGNodeName:(char *)s { [smartGoNodeName setStringValue:[NSString stringWithCString:s]]; [smartGoNodeName display]; return self; } - openNeXTGoFile:(const char*)aFile { FILE *NGoFile; int i, j, t, temp; if ((NGoFile = fopen(aFile, "r")) == NULL) { return self; } SmartGoGameFlag = 0; fscanf(NGoFile, "%d", &handicap); fscanf(NGoFile, "%d", &temp); whiteSide = temp; fscanf(NGoFile, "%d", &temp); blackSide = temp; 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]; PSWait(); return self; } - initTranslator:sender { char filename[MAXPATHLEN+1]; NSBundle *bundle; bundle = [NSBundle bundleForClass:[self class]]; strcpy(filename, [[bundle bundlePath] cString] ); strcat(filename,"/Resources/"); strcat(filename,DEFDICT); if (godict == NULL) { godict = load_dict(filename); if (godict == NULL) { NSRunAlertPanel(@"Translate Error", @"There is a problem opening the dictionary file.", @"OK", nil, nil); return self; } } [translateWindow makeKeyAndOrderFront:self]; [translateWindow setMiniwindowImage:[NSImage imageNamed:@"NeXTGoFile"]]; [translateWindow display]; [translateTerm setStringValue:@""]; [translateTerm selectText:self]; [translateButton setEnabled:YES]; [[translateResults documentView] setString:@""]; return self; } - performTranslate:sender { GODICT *d; char term[80]; extern int termtypes, languages; strcpy(term, [[translateTerm stringValue] cString]); 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 documentView] setString:@""]; 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 { NSString *aString; NSText *docView = [translateResults documentView]; aString = [docView string]; aString = [aString stringByAppendingString:[NSString stringWithCString:s]]; [docView setFont:IGSfont]; printBold = NO; [docView selectAll:docView]; [docView scrollRangeToVisible:[docView selectedRange]]; return self; } - openSmartGoFile:(const char*)aFile { char dispFileName[80]; int i, j; struct stat statbuf; if (gameType != LOCAL) { NSRunAlertPanel(@"IGS Error", @"You must first close your IGS session before\n\ opening a Smart-Go file.", @"OK", nil, nil); return self; } if ((smartGoInputFile = fopen(aFile, "r")) == NULL) { return self; } SGgameMoves = NULL; SmartGoGameFlag = 1; initialization = 0; [smartGoPanel makeKeyAndOrderFront:self]; [smartGoPanel setMiniwindowImage:[NSImage imageNamed:@"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]; PSWait(); return self; } - IGSSendCommand:sender { NSRange aRange; int i, blanks = 0; NSString *aString; if ([ [IGSCommand stringValue] length]) { /* first we catch all commands which have a special implementation */ for (i=0; i< [ [IGSCommand stringValue] length]; i++) if ([[IGSCommand stringValue] characterAtIndex:i] == ' ') blanks++; aString = @"done"; aRange = [[IGSCommand stringValue] rangeOfString:aString]; if (!aRange.length + blanks == [[IGSCommand stringValue] length]){ [IGSCommand selectText:self]; [self IGSdone:self]; } else { aString = @"observe"; aRange = [[IGSCommand stringValue] rangeOfString:aString]; if (aRange.length + blanks == [[IGSCommand stringValue] length]){ [IGSCommand selectText:self]; [self IGSobserve:self]; } else { aString = @"unobserve"; aRange = [[IGSCommand stringValue] rangeOfString:aString]; if (aRange.length + blanks == [[IGSCommand stringValue] length]){ [IGSCommand selectText:self]; [self IGSunobserve:self]; } else { aString = @"load"; aRange = [[IGSCommand stringValue] rangeOfString:aString]; if (aRange.length + blanks == [[IGSCommand stringValue] length]){ [IGSCommand selectText:self]; [self IGSOpenLoadGame:self]; } else { aString = @"quit"; aRange = [[IGSCommand stringValue] rangeOfString:aString]; if (aRange.length + blanks == [[IGSCommand stringValue] length]){ [IGSCommand selectText:self]; [self IGSquit:self]; } else { IGSSendString((char *)[[IGSCommand stringValue] cString]); IGSSendString("\n"); } } } } } } else { IGSSendString("\n"); } if (CommandSender != nil) { [CommandSender makeKeyAndOrderFront:self]; CommandSender = nil; } return self; } - connect:(GoServer*)server { char s[80]; sethost([[server serverName] cString]); setport([server port]); strcpy(IGSLoginText, [ [server login] cString]); strcpy(IGSPasswordText,[ [server password] cString]); if (SmartGoGameFlag) { SmartGoGameFlag = 0; [smartGoPanel close]; } [[IGSStatus documentView] setString:@""]; [IGSPanel makeKeyAndOrderFront:self]; [IGSPanel setMiniwindowImage:[NSImage imageNamed:@"NeXTGoFile"]]; [IGSCommand selectText:self]; if (open_connection()) { [self SetIGSStatus:"Unable to make a connection.\n"]; gameType = LOCAL; NSRunAlertPanel(@"IGS Error", @"I was unable to make a connection.", @"OK", nil, nil); [IGSPanel close]; return self; } [self SetIGSStatus:"Connection established."]; sprintf(s, "Logging in as %s\n", IGSLoginText); [self SetIGSStatus:s]; timer = [[NSTimer scheduledTimerWithTimeInterval:0.25 target:self selector:@selector(checkingNetTraffic:) userInfo:self repeats:YES] retain]; 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 { NSRange selected; id docView = [IGSStatus documentView]; NSString *aString; aString = [NSString stringWithCString:s]; NS_DURING if ((0 == [aString length]) || ('\n' != [aString characterAtIndex:([aString length]-1)])) { aString = [aString stringByAppendingString:@"\n"]; } NS_HANDLER #ifdef DEBUG NSRunAlertPanel(@"Error Panel", @"%@", @"OK", nil, nil, localException); #endif NS_ENDHANDLER [docView selectAll:nil]; selected = [docView selectedRange]; selected.location = selected.length; selected.length = 0; [docView setSelectedRange:selected]; [docView replaceCharactersInRange:selected withString: aString]; selected.length = [aString length]; [docView setFont:IGSfont range:selected]; if (printBold) { [docView setFont:IGSboldFont range:selected]; } [docView scrollRangeToVisible:[docView selectedRange]]; if (printBold) { [IGSCommand selectText:self]; printBold = NO; } // [IGSCommand selectText:self]; return self; } - getGoView{ return MainGoView; } - open:sender { id fileTypes; NSString *fileType1 = @"nextgo", *fileType2 = @"mgt"; id open = [NSOpenPanel new]; fileTypes = [NSArray arrayWithObjects:fileType1, fileType2, nil]; [open setAllowsMultipleSelection:NO]; if (NSOKButton == [open runModalForTypes:fileTypes]) { char * cc = rindex([[open filename] cString],'.'); cc++; if (!strcmp(cc,"mgt")) { [self openSmartGoFile:[[open filename] cString] ]; } else { [self openNeXTGoFile:[[open filename] cString] ]; } return self; } return self; } - save:sender { char aString[256] = ""; id save = [NSSavePanel new]; strcpy(aString, [[gameWindow title] cString]); 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:@"" file:@""])) { if ([[[formatMatrix selectedCell] title] isEqualToString:@"NeXTGo"]) { saveNeXTGoFile([[save filename] cString]); PSWait(); } else { saveSmartGoFile([[save filename] cString]); PSWait(); } } return self; } - setFormat:sender { if ([[[sender selectedCell] title] isEqualToString:@"NeXTGo"]) { [[NSSavePanel savePanel] setRequiredFileType:@"nextgo"]; } else { [[NSSavePanel savePanel] setRequiredFileType:@"mgt"]; } return self; } /* The following methods are the various commands for the Internet Go Server */ - IGSobserve:sender { message mess; NSRect frameRect = {{15, 30}, {497, 226}}, scrollRect = {{0, 0},{ 497, 226}}; NSSize cellSize = {470, 30}; char str[80]; int i; idle = 0; getgames(&mess); observeMatrix = [[NSMatrix alloc] initWithFrame:frameRect mode:NSRadioModeMatrix cellClass:[ClickCell class] numberOfRows:0 numberOfColumns: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 cellAtRow:i column:0]; [observeCell setStringValue:[NSString stringWithCString:str]]; [observeCell setAlignment:NSLeftTextAlignment]; } [observeMatrix sizeToCells]; observeScrollView = [[NSScrollView alloc] initWithFrame:scrollRect]; [observeScrollView setHasVerticalScroller:YES]; [observeScrollView setBorderType:NSBezelBorder]; [observeScrollView setBackgroundColor:[NSColor lightGrayColor]]; [observeScrollView setDocumentView:observeMatrix]; [observeBox addSubview:observeScrollView]; [observeMatrix scrollCellToVisibleAtRow:0 column:0]; [observeBox display]; [observeSelPanel makeKeyAndOrderFront:self]; // [IGSCommand selectText:self]; idle = 1; return self; } - cellClicked:theCell { char str[80]; int n; strcpy(str, [[theCell stringValue] cString]); 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] cString]); idle = 1; [LoadGameWindow close]; return self; } - IGSdone:sender { int q; q = NSRunAlertPanel(@"Save", @"Save the current game to disk ?", @"Save...", @"Dont't save", nil); if (1==q) [self save:self]; IGSSendString("done\n"); return self; } - IGSquit:sender { IGSSendString("quit"); IGSSendString("\n"); [self IGSunobserve:self]; [timer invalidate]; [timer release];; [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] cString]); buf[[[[sender selectedCell] title] length]] = '\n'; buf[[[[sender selectedCell] title] length]+1] = '\0'; IGSSendString(buf); return self; } - gameCompleted { [MainGoView gameCompleted]; return self; } - setCommandSender:(id)aSender { CommandSender = aSender; return self; } - (void)checkingNetTraffic:(NSTimer *)aTimer { [[aTimer userInfo] checkNetTraffic]; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.