home *** CD-ROM | disk | FTP | other *** search
/ Big Green CD 8 / BGCD_8_Dev.iso / NEXTSTEP / Games / NeXTGo-3.0-MIS / igsglue.m < prev    next >
Encoding:
Text File  |  1997-11-19  |  9.8 KB  |  403 lines

  1. #include "comment.header"
  2.  
  3. /* $Id: igsglue.m,v 1.4 1997/11/04 16:52:58 ergo Exp $ */
  4.  
  5. /*
  6.  * $Log: igsglue.m,v $
  7.  * Revision 1.4  1997/11/04 16:52:58  ergo
  8.  * ported to OpenStep
  9.  *
  10.  * Revision 1.3  1997/07/06 19:37:59  ergo
  11.  * actual version
  12.  *
  13.  * Revision 1.3  1997/05/04 18:56:56  ergo
  14.  * added time control for moves
  15.  *
  16.  */
  17.  
  18. #include "igs.h"
  19. #include <stdlib.h>
  20. #include <stdio.h>
  21. #include <string.h>
  22. #include "shared.h"
  23.  
  24. #import <AppKit/AppKit.h>
  25. #import "GoApp.h"
  26. #import "Board.h"
  27.  
  28. typedef piece boardtype[19][19];
  29.  
  30. message mesg;
  31.  
  32. char prefix[20];
  33. int boardon = 0;
  34. int boardmode = 0;
  35. int beepcount = 1;
  36.  
  37. int ingame = -1;
  38. extern int MAXX, MAXY;
  39.  
  40. char local[1000], *loc;
  41.  
  42. int observing = 0;
  43.  
  44. void showboard(boardtype b) {
  45.     extern unsigned char p[19][19];
  46.     int i, j;
  47.  
  48.     for (i = 0; i < 19; i++)
  49.         for (j = 0; j < 19; j++)
  50.             p[i][j] = b[i][j];
  51.  
  52.     [[NSApp getGoView] refreshIO];
  53. }
  54.  
  55. void igsbeep(void) {
  56.     NSBeep();
  57. }
  58.  
  59. int startgame(int n) {
  60.     char str[100];
  61.     int ret;
  62.   
  63.     sprintf(str, "games %d\n", n);
  64.     sendstr(str);
  65.     do {
  66.         do {
  67.               ret = getmessage(&mesg, 0);
  68.               if (ret < 0)
  69.                 exit(1);
  70.         } while (!ret);
  71.         if (mesg.id == MOVE)
  72.           [NSApp SetIGSStatus:"%Premature move.  Restart game.\n"];
  73.       } while (mesg.id != GAMES);
  74.     if (mesg.gamecount != 1)
  75.         return -1;
  76.       if (mesg.gamelist[0].bsize > 19) {
  77.         [NSApp SetIGSStatus:"%Boardsize too large\n"];
  78.         return -1;
  79.       }
  80.       if (observing) {
  81.         [NSApp SetIGSStatus:"Removing observe\n"];
  82.         sprintf(str, "unobserve\n");
  83.         sendstr(str);
  84.         do {
  85.               do {
  86.                 ret = getmessage(&mesg, 0);
  87.                 if (ret < 0)
  88.                       exit(1);
  89.               } while (!ret);
  90.         } while (mesg.id != PROMPT);
  91.         observing = 0;
  92.       }
  93.       ingame = n;
  94.       MAXX = MAXY = mesg.gamelist[0].bsize;
  95.       [[NSApp getGoView] startNewGame];
  96.       [[NSApp getGoView] refreshIO];
  97.       [[NSApp getGoView] display];
  98.       [[NSApp getGoView] setGameNumber:ingame];
  99.       sprintf(str, "%s (%s)", mesg.gamelist[0].white, mesg.gamelist[0].wrank);
  100.       [[NSApp getGoView] setWhiteName:str];
  101.       sprintf(str, "%s (%s)", mesg.gamelist[0].black, mesg.gamelist[0].brank);
  102.       [[NSApp getGoView] setBlackName:str];
  103.       [[NSApp getGoView] setIGSHandicap:mesg.gamelist[0].hcap];
  104.       sprintf(str, "%3.1f", mesg.gamelist[0].komi);
  105.       [[NSApp getGoView] setIGSKomi:str];
  106.     [[NSApp getGoView] setByoTime:mesg.byo];
  107.       boardon = 1;
  108.       return 0;
  109. }
  110.  
  111. void makemove(int x, int y, int movenum, int color, int btime, int bbyo,
  112.           int wtime, int wbyo) {
  113.     extern void sethand(int);
  114.     
  115.     if ((x < MAXX) && (y < MAXY)) {
  116.         [[NSApp getGoView] makeMove: color: x: y];
  117.         [[NSApp getGoView] setTimeAndByo: btime: bbyo: wtime: wbyo];
  118.         [[NSApp getGoView] dispTime];
  119.     }
  120.     else if (x > 100) {
  121.         sethand(x-100);
  122.         [[NSApp getGoView] setIGSHandicap:x-100];
  123.         [[NSApp getGoView] display];
  124.     }
  125. }
  126.  
  127. void makemovesilent(int x, int y, int movenum, int color, int btime, int bbyo,
  128.           int wtime, int wbyo) {
  129.     extern void sethand(int);
  130.  
  131.     if ((x < MAXX) && (y < MAXY)) {
  132.         [[NSApp getGoView] makeMoveSilent: color: x: y];
  133.     }
  134.     else if (x > 100) {
  135.       sethand(x-100);
  136.     }
  137. }
  138.  
  139. void removeGroup(int x, int y)    {
  140.     extern unsigned char p[19][19], patternmat[19][19];
  141.     extern int blackCaptured, whiteCaptured, currentStone;
  142.     extern void find_pattern_in_board(int,int);
  143.     int i, j;
  144.  
  145.     currentStone = p[x][y];
  146.  
  147.     find_pattern_in_board(x,y);
  148.     for (i = 0; i < MAXX; i++)
  149.         for (j = 0; j < MAXY; j++)
  150.             if (patternmat[i][j]) {
  151.                 p[i][j] = EMPTY;
  152.                 if (currentStone==BLACK)
  153.                     blackCaptured++;
  154.                 else
  155.                     whiteCaptured++;
  156.                 }
  157.     [[NSApp getGoView] setblacksPrisoners:blackCaptured];
  158.     [[NSApp getGoView] setwhitesPrisoners:whiteCaptured];
  159.  
  160.     [[NSApp getGoView] refreshIO];
  161. }
  162.  
  163. void getmoves(int n) {
  164.     int ret;
  165.     char str[100];
  166.  
  167.     sprintf(str, "moves %d\n", n);
  168.     sendstr(str);
  169.     do {
  170.         do {
  171.             ret = getmessage(&mesg, 0);
  172.             if (ret < 0)
  173.                 exit(1);
  174.         } while (!ret);
  175.         if (mesg.id == MOVE)
  176.             makemovesilent(mesg.x, mesg.y, mesg.movenum, mesg.color, mesg.btime,
  177.                            mesg.bbyo, mesg.wtime, mesg.wbyo);
  178.         else if (mesg.id && mesg.id != PROMPT)
  179.             [NSApp SetIGSStatus:mesg.text];
  180.     } while (mesg.id != PROMPT);    /* MOVE || mesg.id == 0); */
  181.     lastMove--;
  182.     makemove(mesg.x, mesg.y, mesg.movenum, mesg.color, mesg.btime,
  183.        mesg.bbyo, mesg.wtime, mesg.wbyo);
  184.     [[NSApp getGoView] refreshIO];
  185.     [[NSApp getGoView] display];
  186. }
  187.  
  188. void getgames(message *mess) {
  189.     int ret;
  190.  
  191.     sendstr("games\n");
  192.     do {
  193.         do {
  194.             ret = getmessage(mess, 0);
  195.             if (ret < 0)
  196.                 exit(1);
  197.         } while (!ret);
  198.         if (mess->id == MOVE)
  199.             [NSApp SetIGSStatus:"%Premature move.  Restart game.\n"];
  200.     } while (mess->id != GAMES);
  201. }
  202.  
  203. void unobserve(void) {
  204.     char str[100];
  205.     sprintf(str, "unobserve %d\n", ingame);
  206.     sendstr(str);
  207.     observing=0; ingame= -1; setgame(-1); 
  208. }
  209.  
  210. int observegame(int n) {
  211.     int ret;
  212.     char str[20];
  213.   
  214.     if (!observing && ingame != -1) {
  215.         [NSApp SetIGSStatus:"Can't observe while playing.\n"];
  216.         return 1;
  217.       }
  218.       if (startgame(n))
  219.         return 1;
  220.       getmoves(n);
  221.       sprintf(str, "observe %d\n", n);
  222.       sendstr(str);
  223.       observing = 1;
  224.       do {
  225.         do {
  226.               ret = getmessage(&mesg, 0);
  227.               if (ret < 0)
  228.                 exit(1);
  229.         } while (!ret);
  230.         if ((mesg.id == INFO) && !strncmp(mesg.text, "Removing", 8))
  231.               [NSApp SetIGSStatus:"%fatal sync error.  Restart igs.\n"];
  232.     } while (mesg.id != MOVE && mesg.id != UNDO);
  233.       return 0;
  234. }
  235.  
  236. /* commented out because currently not used
  237.  *
  238.  * int peekgame(int n)
  239.  * {
  240.  * if (!observing && ingame != -1) {
  241.  *   [NXApp SetIGSStatus:"Can't peek while playing.\n"];
  242.  *   return 1;
  243.  * }
  244.  * if (startgame(n))
  245.  *   return 1;
  246.  * getmoves(n);
  247.  * setgame(-1);
  248.  * return 0;
  249.  * }
  250.  */
  251.  
  252. void setgame(int newgame) {
  253.     if (newgame != ingame) {
  254.         ingame = newgame;
  255.     /*    [[NXApp getGoView] setGameNumber:ingame];    */ 
  256.     }
  257. }
  258.  
  259. void loadgame(char *name) {
  260.     char str[100];
  261.     int ret;
  262.     sprintf(str, "load %s\n", name);
  263.     sendstr(str);
  264.     do {
  265.         ret = getmessage(&mesg, 0);
  266.         if (ret < 0)
  267.             exit(1);
  268.         sprintf(str, "&&%d&&\n", mesg.id);
  269.         [NSApp SetIGSStatus:str];
  270.     } while (mesg.id != MOVE && mesg.id != ERROR);
  271.     if (mesg.id == ERROR)
  272.         [NSApp SetIGSStatus:mesg.text];
  273.     else {
  274.         if (!startgame(mesg.gamenum))
  275.             getmoves(mesg.gamenum);
  276.     }
  277. }
  278.  
  279. void doserver(void) {
  280.       int ret;
  281. //      NSEvent  *get_ev;
  282.   
  283.       loc = local;
  284.       idle = 0;
  285.       ret = getmessage(&mesg, 1);
  286.       if (ret < 0 && ret != KEY) {
  287.         [NSApp SetIGSStatus:"Connection closed\n"];
  288.       }
  289.       if (ret > 0)
  290.         switch (mesg.id) {
  291.             case QUITMESG:
  292.                   [NSApp SetIGSStatus:mesg.text];
  293.                   break;
  294.             case ONSERVER:
  295.                   [NSApp SetIGSStatus:"Connection established\n"];
  296.                   break;
  297.             case BEEP:
  298.                   break;
  299.             case MOVE:
  300.                   if (!boardon)
  301.                 [NSApp SetIGSStatus:"%Error: isolated move received\n"];
  302.                   else {
  303.                 makemove(mesg.x, mesg.y, mesg.movenum, mesg.color, 
  304.                      mesg.btime,
  305.                      mesg.bbyo, mesg.wtime, mesg.wbyo);
  306.                 setgame(mesg.gamenum);
  307.                   }
  308.                   break;
  309.             case UNDO:
  310.                   if (!boardon)
  311.                 [NSApp SetIGSStatus:"%Error: isolated undo received"];
  312.                   else {
  313.                 setgame(mesg.gamenum);
  314.                 [[NSApp getGoView] undo];
  315.                 [[NSApp getGoView] display];
  316.                   }
  317.                   break;
  318.             case SCOREUNDO:
  319.                   /*    endgame();  */
  320.                   [NSApp SetIGSStatus:"Scoring undone."];
  321.                   break;
  322.             case LOAD:
  323.                   if (!startgame(mesg.gamenum))
  324.                     getmoves(mesg.gamenum);
  325.                   break;
  326.             case MATCH:
  327.                   startgame(mesg.gamenum);
  328.                   break;
  329.             case REMOVE:
  330.                   removeGroup(mesg.x, mesg.y);
  331.                   break;
  332.             case SCORE:
  333.                   {
  334.                             char str[50];
  335.                             showboard(mesg.board);
  336.                             sprintf(str, "Black: %g\nWhite: %g\n", mesg.bscore,
  337.                                     mesg.wscore);
  338.                             [NSApp SetIGSStatus:str];
  339.                   }
  340.                   break;
  341.             case LOOK_M: {
  342.                   int pris[2];
  343.                   if (mesg.boardsize > 19)
  344.                     [NSApp SetIGSStatus:"%Boardsize of saved game too big.\n"];
  345.                   else {
  346.                     MAXX = MAXY = mesg.boardsize;
  347.                     [[NSApp getGoView] startNewGame];
  348.                     [[NSApp getGoView] display];
  349.                     boardon = 1;
  350.                     pris[0] = mesg.bcap;
  351.                     pris[1] = mesg.wcap;
  352.                     [[NSApp getGoView] setblacksPrisoners:pris[0]];
  353.                     [[NSApp getGoView] setwhitesPrisoners:pris[1]];
  354.                     [[NSApp getGoView] refreshIO];
  355.                     showboard(mesg.board);
  356.                   }
  357.                 }
  358.                   break;
  359.                 case KIBITZ:{
  360.                         char s[300];
  361.                   sprintf(s, "%s: %s\n", mesg.kibitzer, mesg.kibitz);
  362.                   [NSApp SetIGSStatus:s];
  363.                         }
  364.                   break;
  365.             case STORED:
  366.                   if (!strlen(mesg.text))
  367.                     [NSApp SetIGSStatus:"No stored games\n"];
  368.                   else
  369.                     [NSApp SetIGSStatus:mesg.text];
  370.                   break;
  371.             case INFO:
  372.                   if (strstr(mesg.text, "Removing")) {
  373.                     observing = 0;
  374.                     setgame(-1);
  375.                 }
  376.                   if (strstr(mesg.text, "game completed")) {
  377.                     [NSApp gameCompleted];
  378.                 }
  379.                 [NSApp SetIGSStatus:mesg.text];
  380.                   break;
  381.             case PROMPT:
  382.                   if (ingame != -1 && mesg.prompttype == 5) {
  383.                     setgame(-1);
  384.                     observing = 0;
  385.                     [NSApp gameCompleted];
  386.                   }
  387.             case 0:
  388.                   break;
  389.             default:
  390.                   [NSApp SetIGSStatus:mesg.text];
  391.                   break;
  392.            }
  393.       idle = 1;
  394. /*
  395.         if( [NSApp nextEventMatchingMask:NSLeftMouseDownMask untilDate:[NSDate distantFuture]inMode:NSEventTrackingRunLoopMode dequeue:NO] ) {
  396.             get_ev = [NSApp nextEventMatchingMask:NSLeftMouseDownMask untilDate:[NSDate distantFuture]inMode:NSEventTrackingRunLoopMode dequeue:YES];
  397.             [NSApp sendEvent:get_ev];
  398.         }
  399. */
  400. }
  401.  
  402.  
  403.