home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / games / volume11 / reve / patch3f / patches03c
Text File  |  1991-01-03  |  48KB  |  1,422 lines

  1.  
  2. ------- main.c -------
  3. *** /tmp/da07594    Sun Dec  9 15:14:38 1990
  4. --- main.c    Sat Dec  8 19:41:09 1990
  5. ***************
  6. *** 25,37 ****
  7.   #include "reve.h"
  8.   #include "color.h"
  9.   #include "patchlevel.h"
  10. ! #ifdef SYSV
  11. ! #include <string.h>
  12. ! #include <sys/times.h>
  13. ! #else
  14. ! #include <strings.h>
  15. ! #include <sys/time.h>
  16. ! #endif /*SYSV*/
  17.   
  18.   #ifdef X11
  19.   #include <X11/Xos.h>
  20. --- 25,31 ----
  21.   #include "reve.h"
  22.   #include "color.h"
  23.   #include "patchlevel.h"
  24. ! #include <ctype.h>
  25.   
  26.   #ifdef X11
  27.   #include <X11/Xos.h>
  28. ***************
  29. *** 45,58 ****
  30.   #endif /*NO_TIMEVAL*/
  31.   
  32.   /* Text values for the cyclic buttons. */
  33. ! char *diff_values[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9", NULL } ;
  34. ! char *notes_values[] = { "off", "on", NULL } ;
  35.   char *player_values[] = { "human", "computer", NULL } ;
  36.   
  37.   enum cantype cmode, last_cmode ;
  38.   enum disp_type dtype ;
  39.   enum dpy_type cur_dpyno ;
  40.   enum set_type direction ;   /* Incremental direction for cycle item. */
  41.   
  42.   int tx, ty, tw, th ;    /* Position and size of text field. */
  43.   
  44. --- 39,65 ----
  45.   #endif /*NO_TIMEVAL*/
  46.   
  47.   /* Text values for the cyclic buttons. */
  48. ! char *comp_plays[]    = { "white", "black", "neither", "both" } ;
  49. ! char *diff_values[]   = { "1", "2", "3", "4", "5", "6", "7", "8", "9", NULL } ;
  50. ! char *notes_values[]  = { "off", "on", NULL } ;
  51.   char *player_values[] = { "human", "computer", NULL } ;
  52.   
  53. + char *resources[] = {      /* Reve X resources read. */
  54. +   "animate",               /* Boolean: show animation. */
  55. +   "bestmove",              /* Boolean: show computer best move so far. */
  56. +   "difficulty",            /* Integer: difficulty level. */
  57. +   "last",                  /* Boolean: show last move (with a square). */
  58. +   "log",                   /* Boolean: write computer info to log file. */
  59. +   "notes",                 /* Boolean: show computer notes. */
  60. +   "number",                /* Boolean: show last move (number on stone). */
  61. +   "quick"                  /* Boolean: play quick game (don't flip stones). */
  62. + } ;
  63.   enum cantype cmode, last_cmode ;
  64.   enum disp_type dtype ;
  65.   enum dpy_type cur_dpyno ;
  66.   enum set_type direction ;   /* Incremental direction for cycle item. */
  67. + enum win_type curwin ;      /* Window the current event for in. */
  68.   
  69.   int tx, ty, tw, th ;    /* Position and size of text field. */
  70.   
  71. ***************
  72. *** 59,75 ****
  73.   int piece_x ;           /* Current X position of moving piece. */
  74.   int piece_y ;           /* Current Y position of moving piece */
  75.   
  76. - int animation ;         /* If set, show computer move glide and piece drag. */
  77.   int best_cmove ;        /* Best computer move so far. */
  78.   int bfont_height ;      /* Height in pixels for bold font. */
  79.   int but_inverted ;      /* Value of panel item inverted. */
  80.   int color ;             /* Current color value. */
  81.   int cur_ch ;            /* Current character pressed. */
  82.   int curx ;              /* Current mouse X position. */
  83.   int cury ;              /* Current mouse Y position. */
  84. - int do_bestmove ;       /* If set, continuously update computers best move. */
  85. - int do_last ;           /* If set, don't show last move. */
  86. - int do_number ;         /* If set, the last stone placed is numbered. */
  87.   int down ;              /* Indicates is a mouse button is down. */
  88.   int first_move = 0 ;    /* Set if computer plays first move. */
  89.   int iconic ;            /* Set if window is currently iconic. */
  90. --- 66,79 ----
  91.   int piece_x ;           /* Current X position of moving piece. */
  92.   int piece_y ;           /* Current Y position of moving piece */
  93.   
  94.   int best_cmove ;        /* Best computer move so far. */
  95.   int bfont_height ;      /* Height in pixels for bold font. */
  96.   int but_inverted ;      /* Value of panel item inverted. */
  97. + int cmove_depth ;       /* Depth of the current best computer move. */
  98.   int color ;             /* Current color value. */
  99.   int cur_ch ;            /* Current character pressed. */
  100.   int curx ;              /* Current mouse X position. */
  101.   int cury ;              /* Current mouse Y position. */
  102.   int down ;              /* Indicates is a mouse button is down. */
  103.   int first_move = 0 ;    /* Set if computer plays first move. */
  104.   int iconic ;            /* Set if window is currently iconic. */
  105. ***************
  106. *** 94,103 ****
  107.   int nfont_height ;      /* Height in pixels for normal font. */
  108.   int play_computer ;     /* Set if playing against the computer. */
  109.   int posspec ;           /* Set if -Wp or -g option is present (for X11) */
  110. ! int quickgame ;         /* If set, don't flash turning stones. */
  111.   int saveres = 0 ;       /* If set, save computer results to log file. */
  112.   int show_moves ;        /* If set, all possible moves are being shown. */
  113. - int show_notes ;        /* If set, display notes value from play_reve. */
  114.   int suggestion = -1 ;   /* Positive if a suggested move. */
  115.   int suggest_x ;         /* X position of suggested move. */
  116.   int suggest_y ;         /* Y position of suggested move. */
  117. --- 98,107 ----
  118.   int nfont_height ;      /* Height in pixels for normal font. */
  119.   int play_computer ;     /* Set if playing against the computer. */
  120.   int posspec ;           /* Set if -Wp or -g option is present (for X11) */
  121. ! int processing ;        /* If set, computer is procesing a move. */
  122. ! int props_showing ;     /* If set, the property window is visible. */
  123.   int saveres = 0 ;       /* If set, save computer results to log file. */
  124.   int show_moves ;        /* If set, all possible moves are being shown. */
  125.   int suggestion = -1 ;   /* Positive if a suggested move. */
  126.   int suggest_x ;         /* X position of suggested move. */
  127.   int suggest_y ;         /* Y position of suggested move. */
  128. ***************
  129. *** 127,186 ****
  130.   
  131.   BOARD moves[64] ;          /* Complete array of board moves. */
  132.   
  133. ! struct iteminfo items[MAXITEMS] = {                     /* Panel items. */
  134.   
  135. ! /*   type   x   y   width   height   text   value   function */
  136.   
  137. ! { P_BUTTON,  BBORDER + (0*(BWIDTH+BGAP)), BBORDER + (0*(BHEIGHT+BGAP)),
  138. !              BWIDTH, BHEIGHT, "load",     0, draw_textfield },
  139.   
  140. ! { P_BUTTON,  BBORDER + (1*(BWIDTH+BGAP)), BBORDER + (0*(BHEIGHT+BGAP)),
  141. !              BWIDTH, BHEIGHT, "moves?",   0, show_all_moves },
  142.   
  143. ! { P_BUTTON,  BBORDER + (2*(BWIDTH+BGAP)), BBORDER + (0*(BHEIGHT+BGAP)),
  144. !              BWIDTH, BHEIGHT, "new game", 0, new_game },
  145.   
  146. ! { P_BUTTON,  BBORDER + (3*(BWIDTH+BGAP)), BBORDER + (0*(BHEIGHT+BGAP)),
  147. !              BWIDTH, BHEIGHT, "save",     0, draw_textfield },
  148.   
  149. ! { P_BUTTON,  BBORDER + (4*(BWIDTH+BGAP)), BBORDER + (0*(BHEIGHT+BGAP)),
  150. !              BWIDTH, BHEIGHT, "suggest",  0, suggest },
  151.   
  152. ! { P_BUTTON,  BBORDER + (5*(BWIDTH+BGAP)), BBORDER + (0*(BHEIGHT+BGAP)),
  153. !              BWIDTH, BHEIGHT, "undo",     0, undo },
  154.   
  155. ! { P_BUTTON,  BBORDER + (0*(BWIDTH+BGAP)), BBORDER + (1*(BHEIGHT+BGAP)),
  156. !              BWIDTH, BHEIGHT, "iconify",  0, done },
  157.   
  158. ! { P_BUTTON,  -1,                          -1,   /* Not normally active. */
  159. !              BWIDTH, BHEIGHT, "cancel",  0, remove_textfield },
  160.   
  161. ! { P_BUTTON,  BBORDER + (5*(BWIDTH+BGAP)), BBORDER + (1*(BHEIGHT+BGAP)),
  162. !              BWIDTH, BHEIGHT, "quit",     0, quit },
  163.   
  164. ! { P_CYCLE,   BBORDER + (0*(BWIDTH+BGAP)), BBORDER + (2*(BHEIGHT+BGAP)),
  165. !              CWIDTH, CHEIGHT, "Black:", 0, init_player },
  166.   
  167. ! { P_CYCLE,   BBORDER + (3*(BWIDTH+BGAP)), BBORDER + (2*(BHEIGHT+BGAP)),
  168. !              CWIDTH, CHEIGHT, "White:", 1, init_player },
  169.   
  170. ! { P_CYCLE,   BBORDER + (0*(BWIDTH+BGAP)), BBORDER + (3*(BHEIGHT+BGAP)),
  171. !              CWIDTH, CHEIGHT, "Difficulty:", INIT_DEPTH, difficulty },
  172.   
  173. ! { P_CYCLE,   BBORDER + (3*(BWIDTH+BGAP)), BBORDER + (3*(BHEIGHT+BGAP)),
  174. !              CWIDTH, CHEIGHT, "Notes:",      FALSE,      init_notes },
  175.   
  176. ! { P_MESSAGE, BBORDER + (0*(BWIDTH+BGAP)), BBORDER + (4*(BHEIGHT+BGAP)),
  177. !              0, 0, "Use left mouse button to move", 0, NULL },
  178.   
  179. ! { P_MESSAGE, BBORDER + (0*(BWIDTH+BGAP)), BBORDER + (5*(BHEIGHT+BGAP)),
  180. !              0, 0, "",                                   0, NULL },
  181.   
  182. ! { P_MESSAGE, BBORDER + (0*(BWIDTH+BGAP)), BBORDER + (6*(BHEIGHT+BGAP)),
  183. !              0, 0, "White:  2, Black:  2",               0, NULL },
  184.   
  185. ! { P_MESSAGE, BBORDER + (3*(BWIDTH+BGAP)), BBORDER + (6*(BHEIGHT+BGAP)),
  186. !              0, 0, "",                                   0, NULL },
  187.   } ;
  188.   
  189.   char geometry[MAXDPY][MAXLINE] ;       /* X11 geometry information. */
  190. --- 131,376 ----
  191.   
  192.   BOARD moves[64] ;          /* Complete array of board moves. */
  193.   
  194. ! struct iteminfo items[MAXITEMS] = {   /* Panel items. */
  195.   
  196. ! /*  wtype     type    lx    ly           Main window items.
  197. !  *  label
  198. !  *  x         y
  199. !  *  width     height  text  value
  200. !  *  options   nopts
  201. !  *  function
  202. !  */
  203.   
  204. !   {                                   /* load button. */
  205. !     W_MAIN, P_BUTTON, 0, 0,
  206. !     "",
  207. !     BBORDER + (0*(BWIDTH+BGAP)), BBORDER + (0*(BHEIGHT+BGAP)),
  208. !     BWIDTH, BHEIGHT, "load", 0,
  209. !     (char **) NULL, 0,
  210. !     draw_textfield
  211. !   },
  212.   
  213. !   {                                   /* moves? button. */
  214. !     W_MAIN, P_BUTTON, 0, 0,
  215. !     "",
  216. !     BBORDER + (1*(BWIDTH+BGAP)), BBORDER + (0*(BHEIGHT+BGAP)),
  217. !     BWIDTH, BHEIGHT, "moves?", 0,
  218. !     (char **) NULL, 0,
  219. !     show_all_moves
  220. !   },
  221.   
  222. !   {                                   /* new game button. */
  223. !     W_MAIN, P_BUTTON, 0, 0,
  224. !     "",
  225. !     BBORDER + (2*(BWIDTH+BGAP)), BBORDER + (0*(BHEIGHT+BGAP)),
  226. !     BWIDTH, BHEIGHT, "new game", 0,
  227. !     (char **) NULL, 0,
  228. !     new_game
  229. !   },
  230.   
  231. !   {                                   /* save button. */
  232. !     W_MAIN, P_BUTTON, 0, 0,
  233. !     "",
  234. !     BBORDER + (3*(BWIDTH+BGAP)), BBORDER + (0*(BHEIGHT+BGAP)),
  235. !     BWIDTH, BHEIGHT, "save", 0,
  236. !     (char **) NULL, 0,
  237. !     draw_textfield
  238. !   },
  239. !   
  240. !   {                                   /* suggest button. */
  241. !     W_MAIN, P_BUTTON, 0, 0,
  242. !     "",
  243. !     BBORDER + (4*(BWIDTH+BGAP)), BBORDER + (0*(BHEIGHT+BGAP)),
  244. !     BWIDTH, BHEIGHT, "suggest", 0,
  245. !     (char **) NULL, 0,
  246. !     suggest
  247. !   },
  248. !   
  249. !   {                                   /* undo button. */
  250. !     W_MAIN, P_BUTTON, 0, 0,
  251. !     "",
  252. !     BBORDER + (5*(BWIDTH+BGAP)), BBORDER + (0*(BHEIGHT+BGAP)),
  253. !     BWIDTH, BHEIGHT, "undo", 0,
  254. !     (char **) NULL, 0,
  255. !     undo
  256. !   },
  257. !   
  258. !   {                                   /* props button. */
  259. !     W_MAIN, P_BUTTON, 0, 0,
  260. !     "",
  261. !     BBORDER + (0*(BWIDTH+BGAP)), BBORDER + (1*(BHEIGHT+BGAP)),
  262. !     BWIDTH, BHEIGHT, "props", 0,
  263. !     (char **) NULL, 0,
  264. !     do_props
  265. !   },
  266.   
  267. !   {                                   /* cancel button. */
  268. !     W_MAIN, P_BUTTON, 0, 0,
  269. !     "",
  270. !     -1, -1,                           /* Not normally active. */
  271. !     BWIDTH, BHEIGHT, "cancel", 0,
  272. !     (char **) NULL, 0,
  273. !     remove_textfield
  274. !   },
  275. !   
  276. !   {                                   /* quit button. */
  277. !     W_MAIN, P_BUTTON, 0, 0,
  278. !     "",
  279. !     BBORDER + (5*(BWIDTH+BGAP)), BBORDER + (1*(BHEIGHT+BGAP)),
  280. !     BWIDTH, BHEIGHT, "quit", 0,
  281. !     (char **) NULL, 0,
  282. !     quit
  283. !   },
  284. !   
  285. !   {                                   /* Black player message item. */
  286. !     W_MAIN, P_MESSAGE,
  287. !     BBORDER + (0*(BWIDTH+BGAP)), BBORDER + (2*(BHEIGHT+BGAP)),
  288. !     "Black:",
  289. !     BBORDER + (2*(BWIDTH+BGAP)), BBORDER + (2*(BHEIGHT+BGAP)),
  290. !     CWIDTH, CHEIGHT, "", 0,
  291. !     (char **) NULL, 0,
  292. !     NULL
  293. !   },
  294. !   
  295. !   {                                   /* White player message item. */
  296. !     W_MAIN, P_MESSAGE,
  297. !     BBORDER + (3*(BWIDTH+BGAP)), BBORDER + (2*(BHEIGHT+BGAP)),
  298. !     "White:",
  299. !     BBORDER + (5*(BWIDTH+BGAP)), BBORDER + (2*(BHEIGHT+BGAP)),
  300. !     CWIDTH, CHEIGHT, "", 1,
  301. !     (char **) NULL, 0,
  302. !     NULL
  303. !   },
  304.   
  305. !   {                                   /* Panel message item. */
  306. !     W_MAIN, P_MESSAGE, 0, 0,
  307. !     "",
  308. !     BBORDER + (0*(BWIDTH+BGAP)), BBORDER + (3*(BHEIGHT+BGAP)),
  309. !     0, 0, "Use left mouse button to move", 0,
  310. !     (char **) NULL, 0,
  311. !     NULL
  312. !   },
  313.   
  314. !   {                                   /* Notes message item. */
  315. !     W_MAIN, P_MESSAGE, 0, 0,
  316. !     "",
  317. !     BBORDER + (0*(BWIDTH+BGAP)), BBORDER + (4*(BHEIGHT+BGAP)),
  318. !     0, 0, "", 0,
  319. !     (char **) NULL, 0,
  320. !     NULL
  321. !   },
  322.   
  323. !   {                                   /* Score message item. */
  324. !     W_MAIN, P_MESSAGE, 0, 0,
  325. !     "",
  326. !     BBORDER + (0*(BWIDTH+BGAP)), BBORDER + (5*(BHEIGHT+BGAP)),
  327. !     0, 0, "White:  2, Black:  2", 0,
  328. !     (char **) NULL, 0,
  329. !     NULL
  330. !   },
  331.   
  332. !   {                                   /* Turn message item. */
  333. !     W_MAIN, P_MESSAGE, 0, 0,
  334. !     "",
  335. !     BBORDER + (3*(BWIDTH+BGAP)), BBORDER + (5*(BHEIGHT+BGAP)),
  336. !     0, 0, "", 0,
  337. !     (char **) NULL, 0,
  338. !     NULL
  339. !   },
  340.   
  341. ! /*  wtype     type                    Property window items.
  342. !  *  lx        ly
  343. !  *  label
  344. !  *  x         y
  345. !  *  width     height  text  value
  346. !  *  options   nopts
  347. !  *  function
  348. !  */
  349.   
  350. !   {                                   /* Computer plays choice item. */
  351. !     W_PROPS, P_CHOICE,
  352. !     BBORDER + (0*(BWIDTH+BGAP)), BBORDER + (0*(BHEIGHT+BGAP)),
  353. !     "Computer plays:",
  354. !     BBORDER + (2*(BWIDTH+BGAP)), BBORDER + (0*(BHEIGHT+BGAP)),
  355. !     0, 0, "", 0,
  356. !     (char **) comp_plays, 4,
  357. !     set_option
  358. !   },
  359.   
  360. !   {                                   /* Difficulty choice item. */
  361. !     W_PROPS, P_CHOICE,
  362. !     BBORDER + (0*(BWIDTH+BGAP)), BBORDER + (1*(BHEIGHT+BGAP)),
  363. !     "Difficulty:",
  364. !     BBORDER + (2*(BWIDTH+BGAP)), BBORDER + (1*(BHEIGHT+BGAP)),
  365. !     0, 0, "", 0,
  366. !     (char **) diff_values, 9,
  367. !     set_option
  368. !   },
  369.   
  370. !   {                                   /* Set search depth cycle item. */
  371. !     W_PROPS, P_CYCLE,
  372. !     BBORDER + (0*(BWIDTH+BGAP)), BBORDER + (2*(BHEIGHT+BGAP)),
  373. !     "Set search depth:",
  374. !     BBORDER + (2*(BWIDTH+BGAP)), BBORDER + (2*(BHEIGHT+BGAP)),
  375. !     0, 0, "", INIT_DEPTH,
  376. !     (char **) NULL, 0,
  377. !     set_option
  378. !   },
  379.   
  380. !   {                                   /* Options (Animate Move) item. */
  381. !     W_PROPS, P_TOGGLE,
  382. !     BBORDER + (0*(BWIDTH+BGAP)), BBORDER + (3*(BHEIGHT+BGAP)),
  383. !     "Options:",
  384. !     BBORDER + (2*(BWIDTH+BGAP)), BBORDER + (3*(BHEIGHT+BGAP)),
  385. !     TICKWIDTH, TICKHEIGHT, "Animate Move", 0,
  386. !     (char **) NULL, 0,
  387. !     set_option
  388. !   },
  389.   
  390. !   {                              /* Options (Show Current Best Move) item. */
  391. !     W_PROPS, P_TOGGLE, 0, 0,
  392. !     "",
  393. !     BBORDER + (2*(BWIDTH+BGAP)), BBORDER + (4*(BHEIGHT+BGAP)),
  394. !     TICKWIDTH, TICKHEIGHT, "Show Current Best Move", 0,
  395. !     (char **) NULL, 0,
  396. !     set_option
  397. !   },
  398.   
  399. !   {                                   /* Options (Show Last Move) item. */
  400. !     W_PROPS, P_TOGGLE, 0, 0,
  401. !     "",
  402. !     BBORDER + (2*(BWIDTH+BGAP)), BBORDER + (5*(BHEIGHT+BGAP)),
  403. !     TICKWIDTH, TICKHEIGHT, "Show Last Move", 0,
  404. !     (char **) NULL, 0,
  405. !     set_option
  406. !   },
  407.   
  408. !   {                              /* Options (Show Evaluation Info.) item. */
  409. !     W_PROPS, P_TOGGLE, 0, 0,
  410. !     "",
  411. !     BBORDER + (2*(BWIDTH+BGAP)), BBORDER + (6*(BHEIGHT+BGAP)),
  412. !     TICKWIDTH, TICKHEIGHT, "Show Evaluation Info.", 0,
  413. !     (char **) NULL, 0,
  414. !     set_option
  415. !   },
  416. !   {                                   /* Options (Number Last Move) item. */
  417. !     W_PROPS, P_TOGGLE, 0, 0,
  418. !     "",
  419. !     BBORDER + (2*(BWIDTH+BGAP)), BBORDER + (7*(BHEIGHT+BGAP)),
  420. !     TICKWIDTH, TICKHEIGHT, "Number Last Move", 0,
  421. !     (char **) NULL, 0,
  422. !     set_option
  423. !   },
  424. !   {                                   /* Options (Don't Show Flip) item. */
  425. !     W_PROPS, P_TOGGLE, 0, 0,
  426. !     "",
  427. !     BBORDER + (2*(BWIDTH+BGAP)), BBORDER + (8*(BHEIGHT+BGAP)),
  428. !     TICKWIDTH, TICKHEIGHT, "Don't Show Flip", 0,
  429. !     (char **) NULL, 0,
  430. !     set_option
  431. !   },
  432.   } ;
  433.   
  434.   char geometry[MAXDPY][MAXLINE] ;       /* X11 geometry information. */
  435. ***************
  436. *** 197,202 ****
  437. --- 387,393 ----
  438.   int damier[NIVEAUMAX][64] ;  /* Boards at different depth level */
  439.   int tacouleur, macouleur ;   /* Your and my colors during evaluation */
  440.   int mnb, profmax ;           /* Number of moves played, current max. depth */
  441. + int max_depth = 2 ;          /* Computer strategy - maximum depth. */
  442.   int vp0, vo0 ;               /* Current mobility components */
  443.   long c1, c2, c3 ;            /* Constants used in evaluation function */
  444.   long edges[6561] ;           /* Edges Stability Table */
  445. ***************
  446. *** 213,221 ****
  447. --- 404,419 ----
  448.     STRCPY(progname, argv[0]) ;   /* Save program name for later use. */
  449.     STRCPY(gamefile, "reve.game") ;
  450.     SPRINTF(line, " Reve.  V1.1.%1d", PATCHLEVEL) ;
  451. +   init_graphics(&argc, argv) ;
  452.     initialise() ;                /* Initialise variables used by reve. */
  453. +   load_resources() ;            /* Get resources from various places. */
  454. +   read_resources() ;            /* Read resources from merged database. */
  455.     get_options(argc, argv) ;     /* Read command line options. */
  456. + #ifndef XVIEW
  457.     init_edge_table(edgefile) ;   /* Load reve edge table values. */
  458. + #endif /*XVIEW*/
  459.     set_display_types() ;         /* Work out what displays to initialise. */
  460.     if (init_ws_type())           /* Determine window system type. */
  461.       {
  462. ***************
  463. *** 231,236 ****
  464. --- 429,448 ----
  465.   
  466.   
  467.   void
  468. + do_computer_move(player)
  469. + int player ;
  470. + {
  471. +   set_cursor(CANVASCUR) ;
  472. +   if (ANIMATION == TRUE) animate_move(move) ;
  473. +   if (best_cmove != -1 && DO_BESTMOVE == TRUE)
  474. +     draw_square(best_cmove, IS_OFF, 2) ;
  475. +   do_move(player) ;
  476. +   last_move = move ;
  477. +   cmode = (enum cantype) (OPPONENT(player) + 1) ;
  478. + }
  479. + void
  480.   generate_graphics(argc, argv, dpyno)
  481.   enum dpy_type dpyno ;
  482.   int argc ;
  483. ***************
  484. *** 241,255 ****
  485.     make_frame(argc, argv) ;      /* Create reve window/icon. */
  486.     make_canvas() ;               /* Create drawing canvas. */
  487.     init_fonts() ;                /* Load normal and bold fonts. */
  488. -   create_menu(BLACK_PLAYS, player_values) ;
  489. -   create_menu(WHITE_PLAYS, player_values) ;
  490. -   create_menu(DIFFICULTY,  diff_values) ;
  491. -   create_menu(NOTES,       notes_values) ;
  492.     initboard() ;
  493.     set_cursor(CANVASCUR) ;
  494.   }
  495.   
  496.   
  497.   void
  498.   get_options(argc, argv)   /* Read and process command line options. */
  499.   int argc ;
  500. --- 453,492 ----
  501.     make_frame(argc, argv) ;      /* Create reve window/icon. */
  502.     make_canvas() ;               /* Create drawing canvas. */
  503.     init_fonts() ;                /* Load normal and bold fonts. */
  504.     initboard() ;
  505.     set_cursor(CANVASCUR) ;
  506.   }
  507.   
  508.   
  509. + get_bool_resource(rtype, boolval)   /* Get boolean resource from the server. */
  510. + enum res_type rtype ;
  511. + int *boolval ;
  512. + {
  513. +   char *val, tempstr[MAXLINE] ;
  514. +   int n ;
  515. +   if ((val = get_resource(rtype)) == NULL) return(0) ;
  516. +   STRCPY(tempstr, val) ;
  517. +   for (n = 0; n < strlen(tempstr); n++)
  518. +     if (isupper(tempstr[n])) tempstr[n] = tolower(tempstr[n]) ;
  519. +   if (EQUAL(tempstr, "true")) *boolval = TRUE ;
  520. +   else                        *boolval = FALSE ;
  521. +   return(1) ;
  522. + }
  523. + get_int_resource(rtype, intval)   /* Get integer resource from the server. */
  524. + enum res_type rtype ;
  525. + int *intval ;
  526. + {
  527. +   char *val ;
  528. +   if ((val = get_resource(rtype)) == NULL) return(0) ;
  529. +   *intval = atoi(val) ;
  530. +   return(1) ;
  531. + }
  532.   void
  533.   get_options(argc, argv)   /* Read and process command line options. */
  534.   int argc ;
  535. ***************
  536. *** 265,273 ****
  537.           switch (argv[0][1])
  538.             {
  539.               case 'a' : /* Allow computer glide and piece dragging. */
  540. !                        if (EQUAL(argv[0], "-animate")) animation = TRUE ;
  541.                          break ;
  542. !             case 'b' : if (EQUAL(argv[0], "-bestmove")) do_bestmove = TRUE ;
  543.                          else if (EQUAL(argv[0], "-black"))
  544.                            {
  545.                              isblack = 1 ;
  546. --- 502,510 ----
  547.           switch (argv[0][1])
  548.             {
  549.               case 'a' : /* Allow computer glide and piece dragging. */
  550. !                        if (EQUAL(argv[0], "-animate")) ANIMATION = TRUE ;
  551.                          break ;
  552. !             case 'b' : if (EQUAL(argv[0], "-bestmove")) DO_BESTMOVE = TRUE ;
  553.                          else if (EQUAL(argv[0], "-black"))
  554.                            {
  555.                              isblack = 1 ;
  556. ***************
  557. *** 284,290 ****
  558.                          getparam(next, argv, "-d needs difficulty") ;
  559.                          level = atoi(next) ;
  560.                          if (level < 1 || level > MAXDIFF) level = INIT_DEPTH ;
  561. !                        items[(int) DIFFICULTY].value = level - 1 ;
  562.                          break ;
  563.               case 'e' : INC ;
  564.                          getparam(edgefile, argv, "-e needs an edgetable file") ;
  565. --- 521,527 ----
  566.                          getparam(next, argv, "-d needs difficulty") ;
  567.                          level = atoi(next) ;
  568.                          if (level < 1 || level > MAXDIFF) level = INIT_DEPTH ;
  569. !                        items[(int) DIFF_CHOICE].value = level - 1 ;
  570.                          break ;
  571.               case 'e' : INC ;
  572.                          getparam(edgefile, argv, "-e needs an edgetable file") ;
  573. ***************
  574. *** 295,301 ****
  575.                          break ;
  576.               case 'i' : inv_video = 1 ;       /* Display in inverse video. */
  577.                          break ;
  578. !             case 'l' :      if (EQUAL(argv[0], "-last")) do_last = TRUE ;
  579.                          else if (EQUAL(argv[0], "-load"))
  580.                            {
  581.                              INC ;             /* Reve game file to load. */
  582. --- 532,539 ----
  583.                          break ;
  584.               case 'i' : inv_video = 1 ;       /* Display in inverse video. */
  585.                          break ;
  586. !             case 'l' :      if (EQUAL(argv[0], "-last")) DO_LAST = TRUE ;
  587. !                        else if (EQUAL(argv[0], "-log"))  saveres = TRUE ;
  588.                          else if (EQUAL(argv[0], "-load"))
  589.                            {
  590.                              INC ;             /* Reve game file to load. */
  591. ***************
  592. *** 306,322 ****
  593.               case 'm' : monochrome = 1 ;      /* Force display to mono. */
  594.                          for (i = 0; i < MAXDPY; i++) iscolor[i] = 0 ;
  595.                          break ;
  596. !             case 'n' : if (EQUAL(argv[0], "-notes"))
  597. !                          {
  598. !                            show_notes = TRUE ;
  599. !                            items[(int) NOTES].value = 1 ;
  600. !                          }
  601. !                        else if (EQUAL(argv[0], "-number")) do_number = TRUE ;
  602.                          break ;
  603. !             case 'q' : if (EQUAL(argv[0], "-quick")) quickgame = TRUE ;
  604.                          break ;
  605. -             case 'r' : saveres = 1 ;       /* Save computer results to file. */
  606. -                        break ;
  607.               case '?' :
  608.               case 'v' : usage() ;
  609.   
  610. --- 544,554 ----
  611.               case 'm' : monochrome = 1 ;      /* Force display to mono. */
  612.                          for (i = 0; i < MAXDPY; i++) iscolor[i] = 0 ;
  613.                          break ;
  614. !             case 'n' :      if (EQUAL(argv[0], "-notes")) SHOW_NOTES = TRUE ;
  615. !                        else if (EQUAL(argv[0], "-number")) DO_NUMBER = TRUE ;
  616.                          break ;
  617. !             case 'q' : if (EQUAL(argv[0], "-quick")) QUICKGAME = TRUE ;
  618.                          break ;
  619.               case '?' :
  620.               case 'v' : usage() ;
  621.   
  622. ***************
  623. *** 387,392 ****
  624. --- 619,636 ----
  625.   }
  626.   
  627.   
  628. + get_str_resource(rtype, strval)   /* Get a string resource from the server. */
  629. + enum res_type rtype ;
  630. + char *strval ;
  631. + {
  632. +   char *val ;
  633. +   if ((val = get_resource(rtype)) == NULL) return(0) ;
  634. +   STRCPY(strval, val) ;
  635. +   return(1) ;
  636. + }
  637.   void
  638.   getparam(s, argv, errmes)
  639.   char *s, *argv[], *errmes ;
  640. ***************
  641. *** 407,418 ****
  642.     int adjust, d, i, n, x, y ;
  643.    
  644.     d = (int) cur_dpyno ;
  645. !   color_area(0, 0, TOTAL_WIDTH, TOTAL_HEIGHT, C_WHITE) ;
  646.     if (iscolor[d])
  647.       {
  648. !       color_area(0, 0, TOTAL_WIDTH, CY, C_BEIGE) ;
  649. !       color_area(0, CY, TOTAL_WIDTH, TOTAL_WIDTH, C_DBROWN) ;
  650. !       color_area(0 + BBORDER, CY + BBORDER, BOARD_SIZE * CELL_SIZE,
  651.                    BOARD_SIZE * CELL_SIZE, C_LBROWN) ;
  652.       }
  653.     make_panel() ;                /* Create panel and panel items. */
  654. --- 651,662 ----
  655.     int adjust, d, i, n, x, y ;
  656.    
  657.     d = (int) cur_dpyno ;
  658. !   color_area(W_MAIN, 0, 0, TOTAL_WIDTH, TOTAL_HEIGHT, C_WHITE) ;
  659.     if (iscolor[d])
  660.       {
  661. !       color_area(W_MAIN, 0, 0, TOTAL_WIDTH, CY, C_BEIGE) ;
  662. !       color_area(W_MAIN, 0, CY, TOTAL_WIDTH, TOTAL_WIDTH, C_DBROWN) ;
  663. !       color_area(W_MAIN, 0 + BBORDER, CY + BBORDER, BOARD_SIZE * CELL_SIZE,
  664.                    BOARD_SIZE * CELL_SIZE, C_LBROWN) ;
  665.       }
  666.     make_panel() ;                /* Create panel and panel items. */
  667. ***************
  668. *** 426,435 ****
  669.         if (n == 0 || n == BOARD_SIZE) color = C_BLACK ;
  670.         if (color == C_LGREY) adjust = 1 ;
  671.         else adjust = 0 ;
  672. !       draw_line((n*CELL_SIZE)+BBORDER, CY+BBORDER+adjust,   /* Vertical. */
  673. !                 (n*CELL_SIZE)+BBORDER,
  674.                    CY+BBORDER+(BOARD_SIZE*CELL_SIZE)-adjust, RSRC, color) ;
  675. !       draw_line(BBORDER+adjust, CY+BBORDER+(n*CELL_SIZE),   /* Horizontal. */
  676.                   BBORDER+(BOARD_SIZE*CELL_SIZE)-adjust,
  677.                   CY+BBORDER+(n*CELL_SIZE), RSRC, color) ;
  678.       }
  679. --- 670,680 ----
  680.         if (n == 0 || n == BOARD_SIZE) color = C_BLACK ;
  681.         if (color == C_LGREY) adjust = 1 ;
  682.         else adjust = 0 ;
  683. !       draw_line(W_MAIN, (n*CELL_SIZE)+BBORDER,              /* Vertical. */
  684. !                 CY+BBORDER+adjust, (n*CELL_SIZE)+BBORDER,
  685.                    CY+BBORDER+(BOARD_SIZE*CELL_SIZE)-adjust, RSRC, color) ;
  686. !       draw_line(W_MAIN, BBORDER+adjust,                     /* Horizontal. */
  687. !                 CY+BBORDER+(n*CELL_SIZE),
  688.                   BBORDER+(BOARD_SIZE*CELL_SIZE)-adjust,
  689.                   CY+BBORDER+(n*CELL_SIZE), RSRC, color) ;
  690.       }
  691. ***************
  692. *** 439,460 ****
  693.       {
  694.         color = (iscolor[d]) ? C_WHITE : C_BLACK ;
  695.         SPRINTF(s1, "%c", 'a' + i) ;
  696. !       draw_text(BBORDER + (i * CELL_SIZE) + (CELL_SIZE / 2) - 2,
  697.                   CY + BBORDER - 4, BFONT, color, s1) ;
  698. !       draw_text(BBORDER + (i * CELL_SIZE) + (CELL_SIZE / 2) - 2,
  699.                   CY + (2 * BBORDER) + (BOARD_SIZE * CELL_SIZE) - 4,
  700.                   BFONT, color, s1) ;
  701.         SPRINTF(sa, "%c", '1' + i) ;
  702. !       draw_text(BBORDER / 2 - 2, CY + BBORDER + (i * CELL_SIZE) +
  703.                   (CELL_SIZE / 2) + 2, BFONT, color, sa) ;
  704. !       draw_text(BBORDER + (BOARD_SIZE * CELL_SIZE) + (BBORDER / 2) - 2,
  705.                   CY + BBORDER + (i * CELL_SIZE) + (CELL_SIZE / 2) + 2,
  706.                   BFONT, color, sa) ;
  707.       }
  708.     batch(IS_OFF) ;
  709. -   show_last(last_move, IS_ON) ;
  710. -   show_number(last_move, IS_ON) ;
  711. -   show_suggestion() ;
  712.     batch(IS_ON) ;
  713.     FOR_BOARD(i)
  714.       if (board.square[i])
  715. --- 684,702 ----
  716.       {
  717.         color = (iscolor[d]) ? C_WHITE : C_BLACK ;
  718.         SPRINTF(s1, "%c", 'a' + i) ;
  719. !       draw_text(W_MAIN, BBORDER + (i * CELL_SIZE) + (CELL_SIZE / 2) - 2,
  720.                   CY + BBORDER - 4, BFONT, color, s1) ;
  721. !       draw_text(W_MAIN, BBORDER + (i * CELL_SIZE) + (CELL_SIZE / 2) - 2,
  722.                   CY + (2 * BBORDER) + (BOARD_SIZE * CELL_SIZE) - 4,
  723.                   BFONT, color, s1) ;
  724.         SPRINTF(sa, "%c", '1' + i) ;
  725. !       draw_text(W_MAIN, BBORDER / 2 - 2, CY + BBORDER + (i * CELL_SIZE) +
  726.                   (CELL_SIZE / 2) + 2, BFONT, color, sa) ;
  727. !       draw_text(W_MAIN, BBORDER + (BOARD_SIZE * CELL_SIZE) + (BBORDER / 2) - 2,
  728.                   CY + BBORDER + (i * CELL_SIZE) + (CELL_SIZE / 2) + 2,
  729.                   BFONT, color, sa) ;
  730.       }
  731.     batch(IS_OFF) ;
  732.     batch(IS_ON) ;
  733.     FOR_BOARD(i)
  734.       if (board.square[i])
  735. ***************
  736. *** 462,470 ****
  737.           get_xy(i, &x, &y) ;
  738.           draw_piece(board.square[i], x, CY+y, RSRC) ;
  739.         }
  740. !   batch(IS_OFF) ;
  741.     set_score() ;
  742.     message(TURN_MES, "Black to move.") ;
  743.   
  744.     if (loadgame)
  745.       {
  746. --- 704,715 ----
  747.           get_xy(i, &x, &y) ;
  748.           draw_piece(board.square[i], x, CY+y, RSRC) ;
  749.         }
  750. !   if (DO_LAST) show_last(last_move, IS_ON) ;
  751. !   if (DO_NUMBER) show_number(last_move, 60 - board.moves_left, IS_ON) ;
  752. !   show_suggestion() ;
  753.     set_score() ;
  754.     message(TURN_MES, "Black to move.") ;
  755. +   batch(IS_OFF) ;
  756.   
  757.     if (loadgame)
  758.       {
  759. ***************
  760. *** 490,510 ****
  761.     last_move     = -1 ;
  762.     last_outline  = -1 ;
  763.     next_player   = BLACK ;
  764. !   animation     = FALSE ;
  765.     best_cmove    = -1 ;
  766.     but_inverted  = -1 ;
  767. !   do_bestmove   = FALSE ;
  768. !   do_last       = FALSE ;
  769. !   do_number     = FALSE ;
  770. !   quickgame     = FALSE ;
  771.     validkey      = 0 ;
  772.     cmode         = BLACK_START ;
  773.     show_moves    = FALSE ;
  774. !   show_notes    = FALSE ;
  775.     isblack       = 0 ;
  776.     iswhite       = 0 ;
  777.     level         = INIT_DEPTH ;
  778. !   items[(int) DIFFICULTY].value = level - 1 ;
  779.   
  780.     black_dpy = NULL ;              /* X11 black piece display information. */
  781.     white_dpy = NULL ;              /* X11 white piece display information. */
  782. --- 735,757 ----
  783.     last_move     = -1 ;
  784.     last_outline  = -1 ;
  785.     next_player   = BLACK ;
  786. !   ANIMATION     = FALSE ;
  787.     best_cmove    = -1 ;
  788.     but_inverted  = -1 ;
  789. !   DO_BESTMOVE   = FALSE ;
  790. !   DO_LAST       = FALSE ;
  791. !   DO_NUMBER     = FALSE ;
  792. !   processing    = FALSE ;             /* No computer move initially. */
  793. !   props_showing = FALSE ;
  794. !   QUICKGAME     = FALSE ;
  795.     validkey      = 0 ;
  796.     cmode         = BLACK_START ;
  797.     show_moves    = FALSE ;
  798. !   SHOW_NOTES    = FALSE ;
  799.     isblack       = 0 ;
  800.     iswhite       = 0 ;
  801.     level         = INIT_DEPTH ;
  802. !   items[(int) DIFF_CHOICE].value = level - 1 ;
  803.   
  804.     black_dpy = NULL ;              /* X11 black piece display information. */
  805.     white_dpy = NULL ;              /* X11 white piece display information. */
  806. ***************
  807. *** 515,572 ****
  808.   
  809.   
  810.   void
  811. ! init_edge_table(edgefile)     /* Load reve edge table values. */
  812. ! char *edgefile ;
  813.   {
  814. !   char buf[MAXLINE], *getenv(), name[MAXLINE], *paths, *ptr ;
  815. !   int i, line ;
  816. !   FILE *fp = NULL ;
  817.   
  818. !   i = 0 ;
  819. !   if ((fp = fopen(edgefile, "r")) == NULL)
  820. !     {
  821. !       paths = getenv("PATH") ;
  822. !       if ((ptr = paths) && edgefile[0] != '/')
  823. !         for (;;)
  824. !           if (*ptr == ':' || *ptr == 0)
  825. !             {
  826. !               if (*ptr == 0) break ;
  827. !               name[i++] = '/' ;
  828. !               name[i] = 0 ;
  829. !               STRCAT(name, edgefile) ;
  830. !               if ((fp = fopen(name, "r")) != NULL) break ;
  831. !               if (*ptr == '\0') break ;
  832. !               ptr++ ;
  833. !               i = 0 ;
  834. !             }
  835. !           else name[i++] = *ptr++ ;
  836. !     }
  837.   
  838. !   if (fp == NULL)
  839.       {
  840. !       FPRINTF(stderr, "Cannot open Edge Stability Table file\n") ;
  841. !       exit(1) ;
  842.       }
  843. !   line = 0 ;
  844. !   while (fgets(buf, MAXLINE, fp) != NULL)
  845. !     {
  846. !       line++ ;
  847. !       if (buf[0] == '\n' || buf[0] == '#') continue ;
  848. !       if ((ptr = index(buf, '[')) == NULL)
  849. !         {
  850. !           FPRINTF(stderr, "Cannot read edge table file at line %d\n", line) ;
  851. !           exit(1) ;
  852. !         }
  853. !       SSCANF(ptr+1, "%d", &i) ;
  854. !       if ((ptr = index(buf, '=')) == NULL)
  855. !         {
  856. !           FPRINTF(stderr, "Cannot read edge table file at line %d\n", line) ;
  857. !           exit(1) ;
  858. !         }
  859. !       SSCANF(ptr+1, "%ld", &edges[i]) ;
  860. !     }
  861. !   FCLOSE(fp) ;
  862. !   for (i = 0 ; i < 3281; i++) edges[6560 - i] = - edges[i] ;
  863.   }
  864.   
  865.   
  866. --- 762,786 ----
  867.   
  868.   
  869.   void
  870. ! read_resources()            /* Read all possible resources from database. */
  871.   {
  872. !   int boolval, intval ;
  873.   
  874. !   if (get_bool_resource(R_ANIMATE,  &boolval)) ANIMATION   = boolval ;
  875. !   if (get_bool_resource(R_BESTMOVE, &boolval)) DO_BESTMOVE = boolval ;
  876.   
  877. !   if (get_int_resource(R_DIFFICULTY, &intval))
  878.       {
  879. !       level = intval ;
  880. !       if (level < 1 || level > MAXDIFF) level = INIT_DEPTH ;
  881. !       items[(int) DIFF_CHOICE].value = level - 1 ;
  882.       }
  883. !   if (get_bool_resource(R_LAST,   &boolval)) DO_LAST = boolval ;
  884. !   if (get_bool_resource(R_LOG,    &boolval)) saveres = boolval ;
  885. !   if (get_bool_resource(R_NOTES,  &boolval)) SHOW_NOTES = boolval ;
  886. !   if (get_bool_resource(R_NUMBER, &boolval)) DO_NUMBER = boolval ;
  887. !   if (get_bool_resource(R_QUICK,  &boolval)) QUICKGAME = boolval ;
  888.   }
  889.   
  890.   
  891. ***************
  892. *** 593,598 ****
  893. --- 807,814 ----
  894.   void
  895.   set_display_types()
  896.   {
  897. +   int val ;
  898.          if (isblack && iswhite) play_computer = 0 ;
  899.          if (isblack && iswhite) dtype = XBOTH ;
  900.     else if (isblack)            dtype = XBLACK ;
  901. ***************
  902. *** 625,632 ****
  903.          if (dtype == XBLACK)                 isblack = 1 ;
  904.     else if (dtype == XWHITE)                 iswhite = first_move = 1 ;
  905.     else if (dtype == XTWO || dtype == XBOTH) isblack = iswhite    = 1 ;
  906. !   items[(int) BLACK_PLAYS].value = (isblack == 0) ;
  907. !   items[(int) WHITE_PLAYS].value = (iswhite == 0) ;
  908.   }
  909.   
  910.   
  911. --- 841,854 ----
  912.          if (dtype == XBLACK)                 isblack = 1 ;
  913.     else if (dtype == XWHITE)                 iswhite = first_move = 1 ;
  914.     else if (dtype == XTWO || dtype == XBOTH) isblack = iswhite    = 1 ;
  915. !   val = (isblack == 0) ;
  916. !   items[(int) BLACK_PLAYS].value = val ;
  917. !   STRCPY(items[(int) BLACK_PLAYS].text, player_values[val]) ;
  918. !   val = (iswhite == 0) ;
  919. !   items[(int) WHITE_PLAYS].value = val ;
  920. !   STRCPY(items[(int) WHITE_PLAYS].text, player_values[val]) ;
  921.   }
  922.   
  923.   
  924. ***************
  925. *** 638,651 ****
  926.     move = TRUE ;            /* Make sure the computer clock is decremented. */
  927.     best_cmove = -1 ;
  928.     message(EVAL_MES, "") ;
  929.     play_reve(board.square, player, level, &move, ¬e) ;
  930. !   set_cursor(CANVASCUR) ;
  931. !   if (animation == TRUE) animate_move(move) ;
  932. !   if (best_cmove != -1 && do_bestmove == TRUE)
  933. !     draw_square(best_cmove, IS_OFF, 2) ;
  934. !   do_move(player) ;
  935. !   last_move = move ;
  936. !   cmode = (enum cantype) (OPPONENT(player) + 1) ;
  937.   }
  938.   
  939.   
  940. --- 860,871 ----
  941.     move = TRUE ;            /* Make sure the computer clock is decremented. */
  942.     best_cmove = -1 ;
  943.     message(EVAL_MES, "") ;
  944. + #ifdef XVIEW
  945. +   write_to_reve(M_MOVE, board.square, player, level, &move, ¬e) ;
  946. + #else
  947.     play_reve(board.square, player, level, &move, ¬e) ;
  948. !   do_computer_move(player) ;
  949. ! #endif /*XVIEW*/
  950.   }
  951.   
  952.   
  953.  
  954. ------- procs.c -------
  955. *** /tmp/da07597    Sun Dec  9 15:14:39 1990
  956. --- procs.c    Sat Dec  8 19:41:37 1990
  957. ***************
  958. *** 29,37 ****
  959.   
  960.   
  961.   void
  962. ! difficulty()
  963.   {
  964. !   level = next_setting(DIFFICULTY, diff_values) + 1 ;
  965.   }
  966.   
  967.   
  968. --- 29,39 ----
  969.   
  970.   
  971.   void
  972. ! do_props()
  973.   {
  974. !   props_showing = !props_showing ;
  975. !   if (props_showing == TRUE) open_frame(W_PROPS) ;
  976. !   else                       close_frame(W_PROPS) ;
  977.   }
  978.   
  979.   
  980. ***************
  981. *** 48,60 ****
  982.     if (state == LEFT_DOWN)
  983.       {
  984.         draw_outline(cy * BOARD_SIZE + cx, IS_ON) ;
  985. !       if (animation == TRUE)
  986.           draw_piece(next_player, piece_x, piece_y, RINV) ;
  987.         cmode = (enum cantype) ((int) cmode - 1) ;
  988.       }
  989.     else
  990.       {
  991. !       if (animation == TRUE)
  992.           draw_piece(next_player, piece_x, piece_y, RINV) ;
  993.         draw_outline(last_outline, IS_OFF) ;
  994.         move = cy * BOARD_SIZE + cx ;
  995. --- 50,62 ----
  996.     if (state == LEFT_DOWN)
  997.       {
  998.         draw_outline(cy * BOARD_SIZE + cx, IS_ON) ;
  999. !       if (ANIMATION == TRUE)
  1000.           draw_piece(next_player, piece_x, piece_y, RINV) ;
  1001.         cmode = (enum cantype) ((int) cmode - 1) ;
  1002.       }
  1003.     else
  1004.       {
  1005. !       if (ANIMATION == TRUE)
  1006.           draw_piece(next_player, piece_x, piece_y, RINV) ;
  1007.         draw_outline(last_outline, IS_OFF) ;
  1008.         move = cy * BOARD_SIZE + cx ;
  1009. ***************
  1010. *** 64,126 ****
  1011.   
  1012.   
  1013.   void
  1014. ! done()
  1015.   {
  1016. !   iconic = 1 ;
  1017. !   close_frame() ;
  1018. ! }
  1019.   
  1020. ! void
  1021. ! init_notes()
  1022. ! {
  1023. !   show_notes = next_setting(NOTES, notes_values) ;
  1024. !   if (show_notes == FALSE) message(EVAL_MES, "") ;
  1025. ! }
  1026. ! void
  1027. ! init_player()
  1028. ! {
  1029. !   enum panel_type item, other ;
  1030. !   int curi, curo ;
  1031. ! /*  XXX: Currently computer vs computer is not implemented, because of the
  1032. !  *       inability to break out of it, once started, with some of the
  1033. !  *       graphics versions. If the user has asked for this, then force it
  1034. !  *       to toggle the other player, so this situation can't happen.
  1035. !  */
  1036. !   if (curx < (BBORDER + (3*(BWIDTH+BGAP))))
  1037.       {
  1038. !       item = BLACK_PLAYS ;
  1039. !       other = WHITE_PLAYS ;
  1040.       }
  1041. -   else
  1042. -     {
  1043. -       item = WHITE_PLAYS ;
  1044. -       other = BLACK_PLAYS ;
  1045. -     }
  1046. -   curo = items[(int) other].value ;
  1047. -   curi = next_setting(item, player_values) ;
  1048. -   if (curi == COMPUTER && curo == COMPUTER)
  1049. -     {
  1050. -       curi = HUMAN ;
  1051. -       set_cycle(item, player_values[curi]) ;
  1052. -       items[(int) item].value = curi ;
  1053. -       message(PANEL_MES, "Computer can't play both players.") ;
  1054. -     }
  1055. -   if (curi == HUMAN    && curo == COMPUTER)
  1056. -     dtype = (item == BLACK_PLAYS) ? XBLACK : XWHITE ;
  1057. -   else if (curi == COMPUTER && curo == HUMAN)
  1058. -     dtype = (item == BLACK_PLAYS) ? XWHITE : XBLACK ;
  1059. -   else if (curi == HUMAN    && curo == HUMAN)
  1060. -     dtype = (dtype == XTWO) ? XTWO : XBOTH ; 
  1061.   
  1062. !   if (curi == COMPUTER)
  1063. !     if ((item == BLACK_PLAYS && cmode == BLACK_START) ||
  1064. !         (item == WHITE_PLAYS && cmode == WHITE_START))
  1065. !       computer_move(next_player) ;
  1066.   }
  1067.   
  1068.   
  1069. --- 66,95 ----
  1070.   
  1071.   
  1072.   void
  1073. ! do_suggest(player, suggestion, note, state)
  1074. ! int player, suggestion, note ;
  1075. ! enum bltype state ;
  1076.   {
  1077. !   set_cursor(CANVASCUR) ;
  1078.   
  1079. !   if (suggestion == -1) return ;
  1080. !   if (best_cmove != -1 && DO_BESTMOVE == TRUE)
  1081.       {
  1082. !       draw_square(best_cmove, IS_OFF, 2) ;
  1083. !       if (DO_NUMBER) show_number(best_cmove, cmove_depth, IS_OFF) ;
  1084.       }
  1085.   
  1086. !   suggest_x = BBORDER + ((suggestion & 7)  + 1) * CELL_SIZE - CELL_SIZE / 2 ;
  1087. !   suggest_y = BBORDER + ((suggestion >> 3) + 1) * CELL_SIZE - CELL_SIZE / 2 ;
  1088. !   if (state == IS_OFF)
  1089. !     color = (iscolor[(int) cur_dpyno]) ? C_LBROWN : C_WHITE ;
  1090. !   else color = C_BLACK ;
  1091. !   draw_line(W_MAIN, suggest_x-5, CY+suggest_y-5,
  1092. !                     suggest_x+5, CY+suggest_y+5, RSRC, color) ;
  1093. !   draw_line(W_MAIN, suggest_x-5, CY+suggest_y+5,
  1094. !                     suggest_x+5, CY+suggest_y-5, RSRC, color) ;
  1095. !   if (SHOW_NOTES && state == IS_ON) set_eval(player, suggestion, note) ;
  1096.   }
  1097.   
  1098.   
  1099. ***************
  1100. *** 160,199 ****
  1101.     init_canvas() ;
  1102.     message(EVAL_MES, "") ;
  1103.     message(PANEL_MES, "Use left mouse button to move") ;
  1104. !   draw_button(NEW_GAME_BUT, C_LGREY, BUT_NORMAL) ;
  1105.   }
  1106.   
  1107.   
  1108. ! next_setting(item, choices)
  1109. ! enum panel_type item ;
  1110. ! char *choices[] ;
  1111.   {
  1112. !   switch (direction)
  1113.       {
  1114. !       case INCREMENT : if (choices[++item_value] != NULL)
  1115. !                          items[(int) item].value++ ;
  1116. !                        else items[(int) item].value = item_value = 0 ;
  1117. !                        break ;
  1118. !       case DECREMENT : if (--item_value == -1)
  1119. !                          {
  1120. !                            while (choices[++item_value] != NULL) continue ;
  1121. !                            item_value-- ;
  1122. !                            items[(int) item].value = item_value ;
  1123. !                          }
  1124. !                        else items[(int) item].value-- ;
  1125. !                        break ;
  1126. !       case NONE      : /* Handled elsewhere. */ ;
  1127.       }
  1128. !   set_cycle(item, choices[item_value]) ;
  1129. !   return(items[(int) item].value) ;
  1130.   }
  1131.   
  1132.   
  1133.   void
  1134. ! quit()
  1135.   {
  1136. !   destroy_frame() ;
  1137. !   exit(0) ;
  1138.   }
  1139.   
  1140.   
  1141. --- 129,258 ----
  1142.     init_canvas() ;
  1143.     message(EVAL_MES, "") ;
  1144.     message(PANEL_MES, "Use left mouse button to move") ;
  1145. !   draw_button(W_MAIN, NEW_GAME_BUT, C_LGREY, BUT_NORMAL) ;
  1146.   }
  1147.   
  1148.   
  1149. ! void
  1150. ! quit()
  1151.   {
  1152. !   destroy_frame() ;
  1153. !   exit(0) ;
  1154. ! }
  1155. ! void
  1156. ! set_computer(val)
  1157. ! int val ;
  1158. ! {
  1159. !   int color, curi ;
  1160. !   if (val == CP_WHITE)
  1161.       {
  1162. !       dtype = XBLACK ;
  1163. !       play_computer = TRUE ;
  1164. !       items[(int) BLACK_PLAYS].value = HUMAN ;
  1165. !       STRCPY(items[(int) BLACK_PLAYS].text, player_values[HUMAN]) ;
  1166. !       items[(int) WHITE_PLAYS].value = COMPUTER ;
  1167. !       STRCPY(items[(int) WHITE_PLAYS].text, player_values[COMPUTER]) ;
  1168.       }
  1169. !   else if (val == CP_BLACK)
  1170. !     {
  1171. !       dtype = XWHITE ;
  1172. !       play_computer = TRUE ;
  1173. !       items[(int) BLACK_PLAYS].value = COMPUTER ;
  1174. !       STRCPY(items[(int) BLACK_PLAYS].text, player_values[COMPUTER]) ;
  1175. !       items[(int) WHITE_PLAYS].value = HUMAN ;
  1176. !       STRCPY(items[(int) WHITE_PLAYS].text, player_values[HUMAN]) ;
  1177. !     }
  1178. !   else if (val == CP_NEITHER)
  1179. !     {
  1180. !       dtype = XTWO ;
  1181. !       play_computer = FALSE ;
  1182. !       items[(int) BLACK_PLAYS].value = HUMAN ;
  1183. !       STRCPY(items[(int) BLACK_PLAYS].text, player_values[HUMAN]) ;
  1184. !       items[(int) WHITE_PLAYS].value = HUMAN ;
  1185. !       STRCPY(items[(int) WHITE_PLAYS].text, player_values[HUMAN]) ; 
  1186. !     }
  1187. !   color = (iscolor[(int) cur_dpyno]) ? C_BEIGE : C_WHITE ;
  1188. !   draw_choice(W_PROPS, COMP_CHOICE, color) ;
  1189. !   val = items[(int) BLACK_PLAYS].value ;
  1190. !   val = items[(int) WHITE_PLAYS].value ;
  1191. !   if (next_player == BLACK) curi = items[(int) BLACK_PLAYS].value ;
  1192. !   else                      curi = items[(int) WHITE_PLAYS].value ;
  1193. !   if (curi == COMPUTER)
  1194. !     if ((next_player == BLACK && cmode == BLACK_START) ||
  1195. !         (next_player == WHITE && cmode == WHITE_START))
  1196. !       computer_move(next_player) ;
  1197.   }
  1198.   
  1199.   
  1200.   void
  1201. ! set_option()
  1202.   {
  1203. !   char str[4] ;
  1204. !   int color, d, maxw, n, val ;
  1205. !   d = (int) cur_dpyno ;
  1206. !   switch (itemno)
  1207. !     {
  1208. !       case COMP_CHOICE : maxw = items[itemno].width / items[itemno].nopts ;
  1209. !                          val = (curx - items[itemno].x) / maxw ;
  1210. !                          if (val != CP_BOTH)
  1211. !                            {
  1212. !                              items[itemno].value = val ;
  1213. !                              set_computer(val) ;
  1214. !                            }
  1215. !                          else message(PANEL_MES,
  1216. !                                "Computer plays both is not implemented yet.") ;
  1217. !                          break ;
  1218. !       case DIFF_CHOICE : maxw = items[itemno].width / items[itemno].nopts ;
  1219. !                          val = (curx - items[itemno].x) / maxw ;
  1220. !                          level = val + 1 ;
  1221. !                          items[itemno].value = val ;
  1222. !                          color = (iscolor[d]) ? C_BEIGE : C_WHITE ;
  1223. !                          draw_choice(W_PROPS, DIFF_CHOICE, color) ;
  1224. !                          break ;
  1225. !       case MAX_DEPTH   : val = items[itemno].value ;
  1226. !                          if (direction == INCREMENT && val < MAX_PROFMAX)
  1227. !                            items[itemno].value++ ;
  1228. !                          else if (direction == DECREMENT && val > INIT_DEPTH)
  1229. !                            items[itemno].value-- ;
  1230. !                          SPRINTF(str, "%d", items[itemno].value) ;
  1231. !                          color = (iscolor[d]) ? C_LGREY : C_WHITE ;
  1232. !                          set_cycle(W_PROPS, MAX_DEPTH, str) ;
  1233. !                          profmax = items[itemno].value ;
  1234. !                          level = 1 ;
  1235. !                          break ;
  1236. !       case OPT_ANIM    : ANIMATION   = !ANIMATION ;
  1237. !                          break ;
  1238. !       case OPT_BEST    : DO_BESTMOVE = !DO_BESTMOVE ;
  1239. !                          break ;
  1240. !       case OPT_LAST    : DO_LAST     = !DO_LAST ;
  1241. !                          n = 63 - board.moves_left ;
  1242. !                          show_last(moves[n].move, DO_LAST) ;
  1243. !                          break ;
  1244. !       case OPT_EVAL    : SHOW_NOTES  = !SHOW_NOTES ;
  1245. !                          if (!SHOW_NOTES) message(EVAL_MES, "") ;
  1246. !                          break ;
  1247. !       case OPT_NUM     : DO_NUMBER   = !DO_NUMBER ;
  1248. !                          n = 63 - board.moves_left ;
  1249. !                          show_number(moves[n].move, 60 - board.moves_left,
  1250. !                                      DO_NUMBER, DO_NUMBER) ;
  1251. !                          break ;
  1252. !       case OPT_FLIP    : QUICKGAME   = !QUICKGAME ;
  1253. !     }
  1254.   }
  1255.   
  1256.   
  1257. ***************
  1258. *** 212,229 ****
  1259.     long note ;
  1260.   
  1261.     if (cmode == GAME_OVER) return ;
  1262.     if (cmode == WHITE_START) player = WHITE ;
  1263.     else                      player = BLACK ;
  1264.     suggestion = FALSE ;   /* Make sure the computer clock isn't decremented. */
  1265.     play_reve(&board.square[0], player, level, &suggestion, ¬e) ;
  1266. !   suggest_x = BBORDER + ((suggestion & 7)  + 1) * CELL_SIZE - CELL_SIZE / 2 ;
  1267. !   suggest_y = BBORDER + ((suggestion >> 3) + 1) * CELL_SIZE - CELL_SIZE / 2 ;
  1268. !   draw_line(suggest_x-5, CY+suggest_y-5,
  1269. !             suggest_x+5, CY+suggest_y+5, RSRC, C_BLACK) ;
  1270. !   draw_line(suggest_x-5, CY+suggest_y+5,
  1271. !             suggest_x+5, CY+suggest_y-5, RSRC, C_BLACK) ;
  1272. !   if (show_notes) set_eval(player, suggestion, note) ;
  1273.   }
  1274.   
  1275.   
  1276. --- 271,286 ----
  1277.     long note ;
  1278.   
  1279.     if (cmode == GAME_OVER) return ;
  1280. +   set_cursor(HOURGLASS) ;
  1281.     if (cmode == WHITE_START) player = WHITE ;
  1282.     else                      player = BLACK ;
  1283.     suggestion = FALSE ;   /* Make sure the computer clock isn't decremented. */
  1284. + #ifdef XVIEW
  1285. +   write_to_reve(M_SUGGESTION, board.square, player, level, &move, ¬e) ;
  1286. + #else
  1287.     play_reve(&board.square[0], player, level, &suggestion, ¬e) ;
  1288. !   do_suggest(player, suggestion, note, IS_ON) ;
  1289. ! #endif /*XVIEW*/
  1290.   }
  1291.   
  1292.   
  1293. ***************
  1294. *** 252,266 ****
  1295.   undo_move(player)
  1296.   int player ;
  1297.   {
  1298. !   int i, n, x, y ;
  1299.   
  1300. !   n = 62 - board.moves_left ;
  1301. !   while (moves[n-1].player == player) n-- ;
  1302.   
  1303. !   if (n >= 3)
  1304.       {
  1305. !       show_last(last_move, IS_OFF) ;
  1306. !       show_number(last_move, IS_OFF) ;
  1307.         FOR_BOARD(i)
  1308.           {
  1309.             if (moves[n].square[i] != board.square[i])
  1310. --- 309,325 ----
  1311.   undo_move(player)
  1312.   int player ;
  1313.   {
  1314. !   int i, limit, n, x, y ;
  1315.   
  1316. !   n = 63 - board.moves_left ;
  1317. !   while (moves[n].player != player) n-- ;
  1318.   
  1319. !   limit = (items[(int) BLACK_PLAYS].value == COMPUTER) ? 4 : 3 ;
  1320. !   if (n >= limit)
  1321.       {
  1322. !       if (DO_LAST) show_last(last_move, IS_OFF) ;
  1323. !       if (DO_NUMBER) show_number(last_move, 60 - board.moves_left, IS_OFF) ;
  1324. !       do_suggest(player, suggestion, note, IS_OFF) ;
  1325.         FOR_BOARD(i)
  1326.           {
  1327.             if (moves[n].square[i] != board.square[i])
  1328. ***************
  1329. *** 267,273 ****
  1330.               {
  1331.                 get_xy(i, &x, &y) ;
  1332.                 if (moves[n].square[i] == FREE)
  1333. !                 color_area(x, CY+y, PSIZE, PSIZE,
  1334.                              (iscolor[(int) cur_dpyno]) ? C_LBROWN : C_WHITE) ;
  1335.                 else draw_piece(moves[n].square[i], x, CY+y, RSRC) ;
  1336.               }
  1337. --- 326,332 ----
  1338.               {
  1339.                 get_xy(i, &x, &y) ;
  1340.                 if (moves[n].square[i] == FREE)
  1341. !                 color_area(W_MAIN, x, CY+y, PSIZE, PSIZE,
  1342.                              (iscolor[(int) cur_dpyno]) ? C_LBROWN : C_WHITE) ;
  1343.                 else draw_piece(moves[n].square[i], x, CY+y, RSRC) ;
  1344.               }
  1345. ***************
  1346. *** 290,295 ****
  1347. --- 349,358 ----
  1348.   
  1349.         timeleft = board.timeleft ;
  1350.   
  1351. + #ifdef XVIEW
  1352. +       reset_time(timeleft) ;
  1353. + #endif /*XVIEW*/
  1354.         if (OPPONENT(player) == BLACK) cmode = BLACK_START ;
  1355.         else                           cmode = WHITE_START ;
  1356.         message(PANEL_MES, "") ;
  1357. ***************
  1358. *** 296,304 ****
  1359.   
  1360.         if (n > 3)
  1361.           {
  1362. !           show_last(last_move, IS_ON) ;
  1363. !           show_number(last_move, IS_ON) ;
  1364. !           if (show_notes) set_eval(board.player, board.move, board.note) ;
  1365.           }
  1366.         else message(EVAL_MES, "") ;
  1367.         next_player = OPPONENT(board.player) ;
  1368. --- 359,367 ----
  1369.   
  1370.         if (n > 3)
  1371.           {
  1372. !           if (DO_LAST) show_last(last_move, IS_ON) ;
  1373. !           if (DO_NUMBER) show_number(last_move, 60 - board.moves_left, IS_ON) ;
  1374. !           if (SHOW_NOTES) set_eval(board.player, board.move, board.note) ;
  1375.           }
  1376.         else message(EVAL_MES, "") ;
  1377.         next_player = OPPONENT(board.player) ;
  1378.  
  1379.