home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 7 Games / 07-Games.zip / CHECKER4.ZIP / CKRJUDGE.C < prev    next >
C/C++ Source or Header  |  1990-09-01  |  10KB  |  275 lines

  1. /*---------------------------------------------------------------
  2.    CKRJUDGE.C -- JudgeWndProc for controlling game, Version 0.40
  3.                  (c) 1990, Charles Petzold
  4.   ---------------------------------------------------------------*/
  5.  
  6. #include <os2.h>
  7. #include "checkers.h"
  8. #include "ckrmoves.h"
  9. #include "ckrstrat.h"
  10.  
  11. MRESULT EXPENTRY JudgeWndProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2)
  12.      {
  13.      static BOOL  fKing, fNewKing, fMustJump ;
  14.      static BOARD brd = { 0x00000FFF, 0xFFF00000, 0x00000000 }, brdLast ;
  15.      static HWND  hwndPlayer [2], hwndBoard, hwndClient ;
  16.      static MOVE  move ;
  17.      static SHORT sColor = BLACK, iBegin, iEnd, iJump, iBoardMove ;
  18.      NEWGAME      *pnewgame ;
  19.      ULONG        ulBit, ulMove, ulJump ;
  20.  
  21.      switch (msg)
  22.           {
  23.           case WM_NEW_GAME:
  24.                pnewgame = PVOIDFROMMP (mp1) ;
  25.  
  26.                hwndPlayer [BLACK] = pnewgame->hwndBlack ;
  27.                hwndPlayer [WHITE] = pnewgame->hwndWhite ;
  28.                hwndBoard          = pnewgame->hwndBoard ;
  29.                hwndClient         = pnewgame->hwndClient ;
  30.                brd                = pnewgame->brd ;
  31.  
  32.                WinSendMsg (hwndPlayer [BLACK], WM_NEW_GAME, mp1, mp2) ;
  33.                WinSendMsg (hwndPlayer [WHITE], WM_NEW_GAME, mp1, mp2) ;
  34.  
  35.                if (hwndBoard != hwndPlayer [BLACK] &&
  36.                    hwndBoard != hwndPlayer [WHITE])
  37.                     {
  38.                     WinSendMsg (hwndBoard, WM_NEW_GAME, mp1, mp2) ;
  39.                     }
  40.  
  41.                sColor = BLACK ;
  42.  
  43.                move.sColor          = sColor ;
  44.                move.sKing           = 0 ;
  45.                move.cSubMoves       = 0 ;
  46.                move.fNewKing        = FALSE ;
  47.                move.asubmove[0].brd = brd ;
  48.  
  49.                WinSendMsg (hwndPlayer [sColor],
  50.                            WM_JUDGE_SAYS_MAKE_MOVE,
  51.                            MPFROMP (&move), MPFROMSHORT (sColor)) ;
  52.  
  53.                if (hwndPlayer [sColor] != hwndBoard)
  54.                     WinSendMsg (hwndBoard, WM_JUDGE_SAYS_SHOW_HOURGLASS,
  55.                                 NULL, NULL) ;
  56.  
  57.                return 0 ;
  58.  
  59.           case WM_QUERY_JUDGE_CURRENT_BOARD:
  60.                * (PBOARD) PVOIDFROMMP(mp1) = brd ;
  61.                return 0 ;
  62.  
  63.           case WM_QUERY_JUDGE_PICKUP_PIECE:
  64.                iBegin    = SHORT1FROMMP (mp1) ;
  65.                ulBit     = 1L << iBegin ;
  66.                fKing     = brd.ulKing & ulBit ? TRUE : FALSE ;
  67.                fMustJump = FALSE ;
  68.                fNewKing  = FALSE ;
  69.                ulMove    = CkmQueryAllMoveablePieces (&brd, sColor) ;
  70.                ulJump    = CkmQueryAllJumpablePieces (&brd, sColor) ;
  71.  
  72.                if (ulJump != 0)         // ie, some possible jumps
  73.                     {
  74.                     if (!(ulBit & ulJump))
  75.                          return FALSE ;      // invalid piece for jumping
  76.  
  77.                     fMustJump = TRUE ;
  78.                     }
  79.                else                     // no possible jumps
  80.                     {
  81.                     if (!(ulBit & ulMove))   // invalid piece for moving
  82.                          return FALSE ;
  83.                     }
  84.                                         // save the board and adjust it
  85.                brdLast = brd ;
  86.  
  87.                if (sColor == BLACK)
  88.                     brd.ulBlack &= ~ulBit ;
  89.                else
  90.                     brd.ulWhite &= ~ulBit ;
  91.  
  92.                brd.ulKing &= ~ulBit ;
  93.  
  94.                return (MRESULT) TRUE ;
  95.  
  96.           case WM_QUERY_JUDGE_IF_KING:
  97.                return (MRESULT) fKing ;
  98.  
  99.           case WM_QUERY_JUDGE_PUTDOWN_PIECE:
  100.                ulBit  = 1L << iBegin ;
  101.                ulMove = CkmQueryMoveDestinations (&brdLast, sColor, ulBit) ;
  102.                ulJump = CkmQueryJumpDestinations (&brdLast, sColor, ulBit) ;
  103.                iEnd   = SHORT1FROMMP (mp1) ;
  104.                ulBit  = 1L << iEnd ;
  105.  
  106.                if (fMustJump)
  107.                     {
  108.                     if (!(ulBit & ulJump))
  109.                          return FALSE ;      // not a valid jump destination
  110.  
  111.                     iJump = CkmQueryJumpedPiece (iBegin, iEnd) ;
  112.                     }
  113.                else
  114.                     {
  115.                     if (!(ulBit & ulMove))
  116.                          return FALSE ;      // not a valid move destination
  117.  
  118.                     iJump = -1 ;
  119.                     }
  120.                                              // adjust board
  121.                brdLast = brd ;
  122.  
  123.                if (sColor == BLACK)
  124.                     {
  125.                     brd.ulBlack |= ulBit ;
  126.  
  127.                     if (iJump != -1)
  128.                          brd.ulWhite &= ~(1L << iJump) ;
  129.  
  130.                     if (iEnd >= 28 || fKing == TRUE)
  131.                          {
  132.                          brd.ulKing |= ulBit ;
  133.  
  134.                          if (!fKing)
  135.                               fNewKing = TRUE ;
  136.                          }
  137.                     }
  138.                else      // (sColor == WHITE)
  139.                     {
  140.                     brd.ulWhite |= ulBit ;
  141.  
  142.                     if (iJump != -1)
  143.                          brd.ulBlack &= ~(1L << iJump) ;
  144.  
  145.                     if (iEnd <= 3 || fKing == TRUE)
  146.                          {
  147.                          brd.ulKing |= ulBit ;
  148.  
  149.                          if (!fKing)
  150.                               fNewKing = TRUE ;
  151.                          }
  152.                     }
  153.  
  154.                if (fNewKing)
  155.                     fKing = TRUE ;
  156.                                              // inform board of jumped piece
  157.                if (iJump != -1)
  158.                     WinSendMsg (hwndBoard, WM_JUDGE_SAYS_REMOVE_PIECE,
  159.                                 MPFROMSHORT (iJump), NULL) ;
  160.  
  161.                return (MRESULT) TRUE ;
  162.  
  163.           case WM_QUERY_JUDGE_CONTINUE_MOVE:
  164.                if (fNewKing)
  165.                     return FALSE ;
  166.  
  167.                if (!fMustJump)
  168.                     return FALSE ;
  169.  
  170.                iBegin = SHORT1FROMMP (mp1) ;
  171.                ulBit  = 1L << iBegin ;
  172.                ulJump = CkmQueryAllJumpablePieces (&brd, sColor) ;
  173.  
  174.                if (ulBit & ulJump)
  175.                     {
  176.                     fMustJump = TRUE ;
  177.                     brdLast = brd ;
  178.  
  179.                     if (sColor == BLACK)
  180.                          brd.ulBlack &= ~ulBit ;
  181.                     else
  182.                          brd.ulWhite &= ~ulBit ;
  183.  
  184.                     brd.ulKing &= ~ulBit ;
  185.  
  186.                     return (MRESULT) TRUE ;
  187.                     }
  188.  
  189.                return FALSE ;
  190.  
  191.           case WM_TELL_JUDGE_BOARD_MOVE_ENDED:
  192.                sColor ^= 1 ;
  193.  
  194.                if (CkmQueryAllMoveablePieces (&brd, sColor) > 0 ||
  195.                    CkmQueryAllJumpablePieces (&brd, sColor) > 0)
  196.                     {
  197.                     move.sColor          = sColor ;
  198.                     move.sKing           = 0 ;
  199.                     move.cSubMoves       = 0 ;
  200.                     move.fNewKing        = FALSE ;
  201.                     move.asubmove[0].brd = brd ;
  202.  
  203.                     if (hwndPlayer [sColor] != hwndBoard)
  204.                          WinSendMsg (hwndBoard, WM_JUDGE_SAYS_SHOW_HOURGLASS,
  205.                                      NULL, NULL) ;
  206.  
  207.                     WinSendMsg (hwndPlayer [sColor], WM_JUDGE_SAYS_MAKE_MOVE,
  208.                                 MPFROMP (&move), MPFROMSHORT (sColor)) ;
  209.                     }
  210.                else
  211.                     {
  212.                     WinSendMsg (hwndBoard, WM_JUDGE_SAYS_SHOW_ARROW,
  213.                                 NULL, NULL) ;
  214.  
  215.                     WinSendMsg (hwndClient, WM_TELL_CLIENT_GAME_OVER,
  216.                                 MPFROMSHORT (sColor ^ 1), NULL) ;
  217.                     }
  218.  
  219.                return 0 ;
  220.  
  221.           case WM_TELL_JUDGE_STRAT_MOVE_ENDED:
  222.                iBoardMove = 0 ;
  223.  
  224.                if (move.cSubMoves > 0)
  225.                     {
  226.                     WinSendMsg (hwndBoard, WM_JUDGE_SAYS_MOVE_PIECE,
  227.                                 MPFROM2SHORT (move.asubmove[0].iBeg,
  228.                                               move.asubmove[0].iEnd),
  229.                                 MPFROM2SHORT (move.sColor,
  230.                                               move.sKing)) ;
  231.  
  232.                     brd = move.asubmove[1].brd ;
  233.                     }
  234.                else
  235.                     {
  236.                     WinSendMsg (hwndClient, WM_TELL_JUDGE_BOARD_MOVE_ENDED,
  237.                                 NULL, NULL) ;
  238.                     }
  239.  
  240.                return 0 ;
  241.  
  242.           case WM_TELL_JUDGE_PIECE_MOVED:
  243.                if (move.asubmove[iBoardMove].iJmp != -1)
  244.                     {
  245.                     WinSendMsg (hwndBoard, WM_JUDGE_SAYS_REMOVE_PIECE,
  246.                                 MPFROMSHORT (move.asubmove[iBoardMove].iJmp),
  247.                                 NULL) ;
  248.                     }
  249.  
  250.                iBoardMove ++ ;
  251.  
  252.                if (iBoardMove < move.cSubMoves)
  253.                     {
  254.                     WinSendMsg (hwndBoard, WM_JUDGE_SAYS_MOVE_PIECE,
  255.                                 MPFROM2SHORT (move.asubmove[iBoardMove].iBeg,
  256.                                               move.asubmove[iBoardMove].iEnd),
  257.                                 MPFROM2SHORT (move.sColor, move.sKing)) ;
  258.  
  259.                     brd = move.asubmove[iBoardMove + 1].brd ;
  260.                     }
  261.                else
  262.                     {
  263.                     if (move.fNewKing)
  264.                          WinSendMsg (hwndBoard, WM_JUDGE_SAYS_KING_PIECE,
  265.                               MPFROMSHORT (move.asubmove[iBoardMove-1].iEnd),
  266.                               NULL) ;
  267.  
  268.                     WinSendMsg (hwnd, WM_TELL_JUDGE_BOARD_MOVE_ENDED,
  269.                                 NULL, NULL) ;
  270.                     }
  271.                return 0 ;
  272.           }
  273.      return WinDefWindowProc (hwnd, msg, mp1, mp2) ;
  274.      }
  275.