home *** CD-ROM | disk | FTP | other *** search
/ The Best of Select: Games 3 / cd.iso / os2 / pmgnuchs / mswdsp.c < prev    next >
Text File  |  1994-04-20  |  12KB  |  425 lines

  1. //
  2. //  Copyright (C) 1986, 1987, 1988, 1989, 1990 Free Software Foundation, Inc.
  3. //  Copyright (c) 1988, 1989, 1990  John Stanback
  4. //
  5. //  Project:    OS/2 PM Port of GNU CHESS 4.0 (PmChess)
  6. //
  7. //  Version:    1994-4-17
  8. //
  9. //   Porter:    Ported to Windows 3.0 by Darly Baker
  10. //
  11. //   Porter:    Ported to OS/2 1.2+ by Kent Cedola
  12. //
  13. //   Porter:    Revised and ported to OS/2 2.1 by Yibing Fan
  14. //
  15. //   System:    OS2 2.1 using emx0.8g 
  16. //
  17. //  Remarks:    This code modified very little from KC's code (YF)
  18. //
  19. //  Remarks:    This code converted from Windows to PM using a straight port
  20. //              method with some editing improvements.
  21. //
  22. //  Functions defined in this module:
  23. //     void ShowPlayers (void)
  24. //     void ShowDepth (char ch)
  25. //     void ShowScore (short score)
  26. //     void ShowMessage(HWND hWnd, PSZ pszText)
  27. //     void SMessageBox(HWND hWnd, SHORT str_num, SHORT str1_num)
  28. //     void clearMsg ***     empty
  29. //     void ShowCurrentMove (short int pnt, short int f, short int t)
  30. //     void ShowNodeCnt (long int NodeCnt, long int evrate)
  31. //     void ShowSidetoMove (void)
  32. //     void ShowPrompt (void)
  33. //     ShowResults (short int score, short unsigned int *bstline, char ch)
  34. //     void SearchStartStuff (short int side)
  35. //     void OutputMove (HWND hWnd)
  36. //     void UpdateClocks (void)
  37. //     void ShowPostnValue (short int sq)
  38. //     void ShowPostnValues (void)
  39. //     void DrawPiece(HWND hWnd, short f)
  40. //     UpdateDisplay (HWND hWnd, short int f, short int t, short int redraw, short int isspec)
  41. //     void GiveHint (HWND hWnd)
  42. //
  43. //  License:
  44. //
  45. //    CHESS is distributed in the hope that it will be useful, but WITHOUT ANY
  46. //    WARRANTY.  No author or distributor accepts responsibility to anyone for
  47. //    the consequences of using it or for whether it serves any particular
  48. //    purpose or works at all, unless he says so in writing.  Refer to the
  49. //    CHESS General Public License for full details.
  50. //
  51. //    Everyone is granted permission to copy, modify and redistribute CHESS,
  52. //    but only under the conditions described in the CHESS General Public
  53. //    License.  A copy of this license is supposed to have been given to you
  54. //    along with CHESS so you can know your rights and responsibilities.  It
  55. //    should be in a file named COPYING.  Among other things, the copyright
  56. //    notice and this notice must be preserved on all copies.
  57. //
  58.  
  59. #define INCL_DOS
  60. #define INCL_PM
  61. #include <os2.h>
  62. #include <stdio.h>
  63. #include <string.h>
  64. #include "PmChess.h"
  65. #include "GnuChess.h"
  66. #include "Defs.h"
  67. #include "Resource.h"
  68. #include "help.h"
  69.  
  70.  
  71. extern short boarddraw[64];
  72. extern short colordraw[64];
  73. extern char mvstr[4][6];
  74. extern long evrate;
  75.  
  76. extern HWND hComputerColor;
  77. extern HWND hComputerMove;
  78. extern HWND hWhosTurn;
  79. extern HWND hClockComputer;
  80. extern HWND hClockHuman;
  81. extern HWND hMsgComputer;
  82. extern HWND hMsgHuman;
  83. extern HWND hStats;
  84.  
  85. static char* ColorStr[2] = {"White", "Black"};
  86.  
  87. void ShowPlayers (void)
  88. {
  89.   /* display in the status line what color the computer is playing */
  90.   if(flag.bothsides) WinSetWindowText ( hComputerColor,  CP[230] /*"Computer is both" */);
  91.    else if(flag.force) WinSetWindowText ( hComputerColor,  CP[233] /*"User Enter moves"*/ );
  92.    else  WinSetWindowText ( hComputerColor, (computer == black) ? CP[232] /*"Computer is black"*/ :
  93.                                                       CP[231] /* "Computer is white" */);
  94. }
  95.  
  96. void ShowDepth (char ch)
  97. {
  98.    char tmp[30];
  99.    if ( hStats ) {
  100.       sprintf ( tmp, "%d%c", Sdepth, ch);
  101.       WinSetDlgItemText ( hStats, IDC_STATS_DEPTH, tmp);
  102.    }
  103. }
  104.  
  105. void ShowScore (short score)
  106. {
  107.    char tmp[30];
  108.    if ( hStats) {
  109.       sprintf ( tmp, "%d",score);
  110.       WinSetDlgItemText ( hStats, IDC_STATS_SCORE, tmp);
  111.    }
  112. }
  113.  
  114.  
  115. //***************************************************************************
  116. //
  117. //  Routine: ShowMessage(In, In)
  118. //
  119. //  Remarks: This subroutine is called to display the specified text to the
  120. //           user in a message box.
  121. //
  122. //  Returns: None.
  123. //
  124. void ShowMessage(HWND hWnd, PSZ pszText)
  125.   {
  126.   WinMessageBox(HWND_DESKTOP, hWnd, pszText, szAppName, 0,
  127.                 MB_OK | MB_ICONEXCLAMATION);
  128.   }
  129.  
  130.  
  131. //***************************************************************************
  132. //
  133. //  Routine: SMessageBox(In, In, In)
  134. //
  135. //  Remarks: This subroutine is called to display a the specified string
  136. //           resource text to the user.
  137. //
  138. //  Returns: None.
  139. //
  140. void SMessageBox(HWND hWnd, SHORT str_num, SHORT str1_num)
  141.   {
  142.   char str[100], str1[100];
  143.  
  144.  
  145.   WinLoadString(hab, 0, str_num,  sizeof(str),  str);
  146.   WinLoadString(hab, 0, str1_num, sizeof(str1), str1);
  147.  
  148.   WinMessageBox(HWND_DESKTOP, hWnd, str, str1, 0, MB_OK | MB_ICONEXCLAMATION);
  149.   }
  150.  
  151. /**************************************************************************
  152.  *
  153.  *  Name       : MessageBox(hwndOwner, nIdMsg, fsStyle, fBeep)
  154.  *
  155.  *  Description:  Displays the message box with the message
  156.  *                given in idMsg retrieved from the message table
  157.  *                and using the style flags in fsStyle.
  158.  *
  159.  *  Concepts:     Called whenever a message box is to be displayed
  160.  *
  161.  *                - Message string is loaded from the process'
  162.  *                    message table
  163.  *                - Alarm beep is sounded if desired
  164.  *                - Message box with the message is displayed
  165.  *                - WinMessageBox return value is returned
  166.  *
  167.  *  API's      :  WinLoadMessage
  168.  *                WinAlarm
  169.  *                WinMessageBox
  170.  *
  171.  *  Parameters :  hwndOwner = window handle of the owner
  172.  *                nIdMsg    = message i.d.
  173.  *                fsStyle   = style flags for the message box
  174.  *                fBeep     = should an alarm be sounded?
  175.  *
  176.  *  Return     :  return value from WinMessageBox
  177.  *
  178.  *************************************************************************/
  179. ULONG MessageBox(HWND hwndOwner, ULONG idMsg, ULONG fsStyle, BOOL fBeep)
  180. {
  181.    CHAR szText[MESSAGELEN];
  182.  
  183.    if(!WinLoadMessage(hab,
  184.                      (HMODULE)NULL,
  185.                      idMsg,
  186.                      MESSAGELEN,
  187.                      (PSZ)szText))
  188.    {
  189.       WinAlarm(HWND_DESKTOP, WA_ERROR);
  190.       return MBID_ERROR;
  191.    }
  192.  
  193.    if(fBeep)
  194.       WinAlarm(HWND_DESKTOP, WA_ERROR);
  195.  
  196.    return(WinMessageBox(HWND_DESKTOP,
  197.                         hwndOwner,
  198.                         szText,
  199.                         (PSZ)NULL,
  200.                         MSGBOXID,
  201.                         fsStyle));
  202.  
  203. }   /* End of MessageBox   */
  204.  
  205. void ClearMessage (void)
  206. {
  207. }
  208.  
  209. void ShowCurrentMove (short int pnt, short int f, short int t)
  210. {
  211.    char tmp[30];
  212.  
  213.    if ( hStats) {
  214.       algbr (f, t, false);
  215.       sprintf ( tmp, "(%2d) %4s",pnt, (char *)mvstr[0]);
  216.       WinSetDlgItemText ( hStats, IDC_STATS_POSITION, tmp);
  217.    }
  218. }
  219.  
  220. void ShowSidetoMove (void)
  221. {
  222.    char tmp[30];
  223.    sprintf ( tmp, "It is %s's turn",(char *)ColorStr[player]);
  224.    WinSetWindowText ( hWhosTurn, tmp);
  225.  
  226. }
  227.  
  228. void ShowPrompt (void)
  229. {
  230. }
  231.  
  232. void ShowNodeCnt (long int NodeCnt, long int evrate)
  233. {
  234.    char tmp[40];
  235.  
  236.    if ( hStats ) {
  237.       sprintf ( tmp,"%-8ld", NodeCnt);
  238.       WinSetDlgItemText ( hStats, IDC_STATS_NODES, tmp);
  239.       sprintf ( tmp,"%-5ld", evrate);
  240.       WinSetDlgItemText ( hStats, IDC_STATS_RATE, tmp);
  241.    }
  242. }  
  243.  
  244. void
  245. ShowResults (short int score, short unsigned int *bstline, char ch)
  246. {
  247.   unsigned char d, ply;
  248.   char str[300];
  249.   int s;
  250.  
  251.   if (flag.post)
  252.     {
  253.       ShowDepth (ch);
  254.       ShowScore (score);
  255.       d = 7; s = 0;
  256.       for (ply = 1; bstline[ply] > 0; ply++)
  257.         {
  258.          algbr ((short) bstline[ply] >> 8, (short) bstline[ply] & 0xFF, false);
  259.          if ( ply==5 || ply==9 || ply==13 || ply==17)
  260.             s += sprintf ( str+s,"\n");
  261.          s += sprintf ( str+s,"%-5s ", (char *) mvstr[0]);
  262.         }
  263.       WinSetDlgItemText ( hStats, IDC_STATS_BEST, str);
  264.     }
  265. }
  266.  
  267. void SearchStartStuff (short int side)
  268. {
  269. }
  270.  
  271. void OutputMove (HWND hWnd)
  272. {
  273.   char tmp[30];
  274.  
  275.   UpdateDisplay (hWnd, root->f, root->t, 0, (short) root->flags);
  276.   sprintf ( tmp, "My move is %s",(char *) mvstr[0]);
  277.   WinSetWindowText ( hComputerMove, tmp);
  278.  
  279.   if (root->flags & draw)
  280.     SMessageBox ( hWnd, IDS_DRAWGAME,IDS_CHESS);
  281.   else if (root->score == -9999)
  282.     SMessageBox ( hWnd, IDS_YOUWIN, IDS_CHESS);
  283.   else if (root->score == 9998)
  284.     SMessageBox ( hWnd, IDS_COMPUTERWIN,IDS_CHESS);
  285.   else if (root->score < -9000)
  286.     SMessageBox ( hWnd, IDS_MATESOON,IDS_CHESS);
  287.   else if (root->score > 9000)
  288.     SMessageBox ( hWnd, IDS_COMPMATE,IDS_CHESS);
  289.   if (flag.post)
  290.     {
  291.       ShowNodeCnt (NodeCnt, evrate);
  292. /*
  293.       for (i = 1999; i >= 0 && Tree[i].f == 0 && Tree[i].t == 0; i--);
  294.       printz ("Max Tree= %5d", i);
  295. */
  296.     }
  297. }
  298.  
  299. void UpdateClocks (void)
  300. {
  301.   short m, s;
  302.   char timeleft[20];
  303.  
  304.   m = (short) (et / 6000);
  305.   s = (short) (et - 6000 * (long) m) / 100;
  306.   if (TCflag)
  307.     {
  308.       m = (short) ((TimeControl.clock[player] - et) / 6000);
  309.       s = (short) ((TimeControl.clock[player] - et - 6000 * (long) m) / 100);
  310.     }
  311.   if (m < 0) m = 0;
  312.   if (s < 0) s = 0;
  313.  
  314.   sprintf ( timeleft, "%0d:%02d",m,s);
  315.   if ( player == computer ) {
  316.       WinSetWindowText (hClockComputer, timeleft);
  317.   } else {
  318.       WinSetWindowText (hClockHuman, timeleft);
  319.   }
  320.  
  321.   if (flag.post)
  322.     ShowNodeCnt (NodeCnt, evrate);
  323. }
  324.  
  325. void
  326. ShowPostnValue (short int sq)
  327. {
  328. }
  329.  
  330. void
  331. ShowPostnValues (void)
  332. {
  333. }
  334.  
  335. //***************************************************************************
  336. //
  337. //  Routine: DrawPiece(In, In)
  338. //
  339. //  Remarks: This subroutine is called to display a piece by invalidating
  340. //           it's region and letting the paint logic draw it in.
  341. //
  342. //  Returns: None.
  343. //
  344. void DrawPiece(HWND hWnd, short f)
  345.   {
  346.   POINTL aptl[4];
  347.   RECTL  rcl;
  348.   short  x,y;
  349.  
  350.   //
  351.   //  Compute the (x,y) coordinate of the piece to draw.
  352.   //
  353.   if (flag.reverse)
  354.     {
  355.     x = 7 - (f % 8);
  356.     y = 7 - (f / 8);
  357.     }
  358.    else
  359.     {
  360.     x = f % 8;
  361.     y = f / 8;
  362.     }
  363.  
  364.   //
  365.   //  Retrieve the corners of the piece to redraw.
  366.   //
  367.   QuerySqCoords(x, y, aptl);
  368.  
  369.   //
  370.   //  Invalidate the area around the piece to redraw.
  371.   //
  372.   rcl.xLeft   = aptl[0].x - 1;
  373.   rcl.yBottom = aptl[0].y;
  374.   rcl.xRight  = aptl[2].x + 1;
  375.   rcl.yTop    = aptl[2].y;
  376.   WinInvalidateRect(hWnd, &rcl, FALSE);
  377.   }
  378.  
  379.  
  380. void
  381. UpdateDisplay (HWND hWnd, short int f, short int t, short int redraw, short int isspec)
  382. {
  383.   short sq;
  384.   
  385.   for (sq=0; sq<64; sq++) {
  386.          boarddraw[sq] = board[sq];
  387.          colordraw[sq] = color[sq];
  388.   }
  389.  
  390.   if (redraw){
  391.       WinInvalidateRect ( hWnd, NULL, TRUE);
  392.       ShowPlayers ();
  393.       WinUpdateWindow ( hWnd );
  394.   } else {
  395.       DrawPiece (hWnd, f);
  396.       DrawPiece (hWnd, t);
  397.       if (isspec & cstlmask)
  398.         if (t > f)
  399.           {
  400.             DrawPiece (hWnd, f + 3);
  401.             DrawPiece (hWnd, t - 1);
  402.           }
  403.         else
  404.           {
  405.             DrawPiece (hWnd, f - 4);
  406.             DrawPiece (hWnd, t + 1);
  407.           }
  408.       else if (isspec & epmask)
  409.         {
  410.           DrawPiece (hWnd, t - 8);
  411.           DrawPiece (hWnd, t + 8);
  412.         }
  413.       WinUpdateWindow (hWnd);
  414.     }
  415. }
  416.  
  417. void GiveHint (HWND hWnd)
  418. {
  419.   char s[40];
  420.   algbr ((short) (hint >> 8), (short) (hint & 0xFF), false);
  421.   strcpy (s, "try ");
  422.   strcat (s, mvstr[0]);
  423.   ShowMessage (hWnd, s);
  424. }
  425.