home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Interactive Guide / c-cplusplus-interactive-guide.iso / c_ref / csource4 / 240_01 / bg2.c < prev    next >
Text File  |  1987-07-31  |  40KB  |  1,538 lines

  1.  
  2. /*
  3. **  bg2.c  -- initialization; major utils: play, arrange, etc.
  4. */
  5.  
  6. #include "backgmmn.h"
  7.  
  8.  
  9. /*==========================================================================
  10.  
  11.   INITIALIZATION and NEWBOARD commands -- start of a new game, or cold
  12.  
  13. ===========================================================================*/
  14.  
  15.  
  16. static char *getAtkn() {
  17.      if (tokenstyle) return( get5tkn() );
  18.      else return( get1tkn() );
  19. }
  20. static char *getBtkn() {
  21.      if (tokenstyle) return( get6tkn() );
  22.      else return( get2tkn() );
  23. }
  24. static char *getCtkn() {
  25.      if (tokenstyle) return( get7tkn() );
  26.      else return( get3tkn() );
  27. }
  28. static char *getDtkn() {
  29.      if (tokenstyle) return( get8tkn() );
  30.      else return( get4tkn() );
  31. }
  32.  
  33.  
  34. static wipeout() {
  35. static int i;
  36.  
  37.      player = 0;
  38.      barcube();
  39.      for (i = 0; i < 28; i++) {
  40.           point[i].stones = point[i].owner = 0;
  41.      }
  42.      update();
  43.  
  44. } /* end: wipeout */
  45.  
  46.  
  47. setup() {
  48. static int i, j, k; char *copyright;
  49.  
  50.      myscore = yrscore = player = dice[0] = dice[1] = 0;
  51.      tokenstyle = swapped = tswap = 
  52.      expert = helpdisabled = yrdice = FALSE;
  53.      show = moremsgline = tone = TRUE;
  54.  
  55.      /* please be sure that main has called vid_init()...!!! */
  56.  
  57.      off_cursor(); 
  58.      title();
  59.  
  60.      token1 = getAtkn();
  61.      token2 = getBtkn();
  62.      copyright = backtalk[ MYLEVEL + 1 ];
  63.      draw_board( copyright );
  64.  
  65.      for (i = 0; i < 28; i++) {
  66.           point[i].stones = point[i].owner = 0;
  67.           point[i].x = point[i].y = point[i].lastx = point[i].lasty = 0;
  68.           point[i].cx = point[i].cy = 0;
  69.      }
  70.  
  71.      k = 68;
  72.      for (i = 1; i < 13; i++ ) { /* establish xy coords for the points */
  73.           j = 25 - i;
  74.           point[i].cx = point[j].cx = point[i].x = point[j].x = k; 
  75.           k -= 5;
  76.           point[i].y = 4;
  77.           point[j].y = 18;
  78.           point[i].cy = 2;
  79.           point[j].cy = 20;
  80.           if (k == 38) k -= 5; /* skip over bar */
  81.      }
  82.  
  83.      point[MYBAR].x  = point[YRBAR].x  = 38;
  84.      point[MYHOME].x = point[YRHOME].x = 75;
  85.  
  86.      point[MYBAR].y  = point[MYHOME].y =  5;
  87.      point[YRBAR].y  = point[YRHOME].y = 17;
  88.  
  89. } /* end: setup */
  90.  
  91.  
  92.  
  93. newboard() {
  94. static int i;  
  95.  
  96.      startcubevalue = 1;
  97.      wipedice(); wipeout();
  98.  
  99.      putstone( MYHOME, 15, ME  );
  100.      putstone( YRHOME, 15, YU );
  101.  
  102.      putstone( YRHOME, 13, YU );
  103.      putstone(  1, 2, YU );
  104.  
  105.      putstone( YRHOME, 8, YU );
  106.      putstone( 12, 5, YU );
  107.  
  108.      putstone( YRHOME, 5, YU );
  109.      putstone( 17, 3, YU );
  110.  
  111.      putstone( YRHOME, 0, 0 ); 
  112.      putstone( 19, 5, YU );
  113.  
  114.      putstone( MYHOME, 10, ME );
  115.      putstone(  6, 5, ME  );
  116.  
  117.      putstone( MYHOME,  7, ME );
  118.      putstone(  8, 3, ME  );
  119.  
  120.      putstone( MYHOME,  2, ME );
  121.      putstone( 13, 5, ME  );
  122.  
  123.      putstone( MYHOME, 0, 0 );
  124.      putstone( 24, 2, ME  );
  125.  
  126. } /* end: newboard */
  127.  
  128.  
  129. void draw_board( c ) char *c; {
  130. static int line,k;
  131. static char *m = "     ", *picture[] = {
  132. "The Peelgrunt Game of GAMMON IV%s",
  133. /* nice ain't it? */
  134. "╔╤═══════════════════════════════╕o╒═══════════════════════════════╤╗",
  135. "║│ ░░   ▓▓   ░░   ▓▓   ░░   ▓▓   │║│  ░░   ▓▓   ░░   ▓▓   ░░   ▓▓  │║",
  136. "║│                               │║│                               │║",
  137. "║│ ▓▓   ░░   ▓▓   ░░   ▓▓   ░░   │║│  ▓▓   ░░   ▓▓   ░░   ▓▓   ░░  │║",
  138. "╚╧═══════════════════════════════╛o╘═══════════════════════════════╧╝"
  139. };
  140.  
  141.      clr_screen();
  142.      off_cursor();
  143.      msg(5,23, c );
  144.      off_cursor();
  145.      line = 0;
  146.      gotoxy(0,line++); wprintf(m); wprintf(picture[0],bgversion);
  147.      line = 3;
  148.      gotoxy(0,line++); wprintf(m); wprintf(picture[1]);
  149.  
  150.      for (k = 0; k < 6; k++) { 
  151.           gotoxy( 0,line++ ); wprintf(m); wprintf(picture[2]);
  152.      }
  153.      gotoxy(0,line++); wprintf(m); wprintf(picture[3]);
  154.      gotoxy(0,line++); wprintf(m); wprintf(picture[3]);
  155.      gotoxy(0,line++); wprintf(m); wprintf(picture[3]);
  156.  
  157.      for (k = 0; k < 6; k++) {
  158.           gotoxy( 0,line++ ); wprintf(m); wprintf(picture[4]);
  159.      }
  160.      gotoxy(0,line); wprintf(m); wprintf(picture[5]);
  161.  
  162. } /* end: draw_board */
  163.  
  164.  
  165.  
  166.  
  167.  
  168. /*=========================================================================
  169.  
  170.   DICE Commands:  How to roll the dice
  171.  
  172. ===========================================================================*/
  173.  
  174.  
  175. haltgame() {
  176.         player = -1;  /* if play resumes, ask whose roll it is */
  177.         msg(5,22,"Ok.");
  178.         jumpjack(); 
  179.  
  180. } /* end: haltgame */
  181.  
  182.  
  183.  
  184. static dpeek() {
  185.      if (yrdice) return;  /* you know your own dice, probably...? */
  186.      if (expert) msg(5,22,"");
  187.      else msg(5,22,"The Dice will Rattle until you Roll.  Now on ");
  188.      getdice();
  189.      wprintf("[%d] [%d] ...",dice[0],dice[1]);
  190. } /* end: dpeek */
  191.  
  192.  
  193.  
  194.  
  195. static getonedie() {
  196.      return ( (abs(acg()) % 6) + 1 );
  197. } /* end: getonedie */
  198.  
  199.  
  200.  
  201.  
  202. static fixup() {     /* ensure that the low die is in dice[0] */
  203. int d,e;
  204.      if (player == 0) return;  /* whofirst?  don't mess with the odds */
  205.      d = min(dice[0],dice[1]);
  206.      e = max(dice[0],dice[1]);
  207.      dice[0] = d;
  208.      dice[1] = e;
  209. } /* end: fixup */
  210.  
  211.  
  212.  
  213.  
  214. static getdice() {
  215. int ch;
  216.  
  217.      /* if it's MY dice we're using, generate random dice... */
  218.      if (!yrdice) {
  219.           dice[0] = getonedie(); 
  220.           acg();    /* bounce a little for luck */
  221.           dice[1] = getonedie();
  222.      }
  223.  
  224.      /* but if it's YOUR dice, then get roll from user's real dice... */
  225.      else do
  226.      {
  227.           msg(5,23,"<> ");
  228.           wprintf( "%s roll: ", ((player == ME)? "My": "Your"));
  229.           if (!expert) wprintf("\b\b, using your dice: ");
  230.           wprintf(" First? ");
  231.     
  232.           ch = keyin( acg );
  233.           if (ch == 27) haltgame();
  234.           ch -= '0';
  235.           if (ch < 1 || ch > 6) continue;
  236.  
  237.           wink( ch + '0');
  238.           dice[0] = ch;
  239.  
  240.           wprintf("  Second? ");
  241.           ch =  keyin( acg );
  242.           if (ch == 27) haltgame();
  243.           ch -= '0';
  244.           if (ch < 1 || ch > 6) continue;
  245.  
  246.           wink( ch + '0');
  247.           dice[1] = ch;
  248.  
  249.           wprintf("  All Ok? ");
  250.           ch = keyin( acg );
  251.           ch = toupper( ch );
  252.           if (ch == 27) haltgame();
  253.  
  254.      } while ( ch != 'Y' && ch != '\015' );
  255.  
  256.      fixup();
  257.  
  258. } /* end: getdice */
  259.  
  260.  
  261.  
  262.  
  263. static rolldice( who ) int who; {
  264. int waiting,ch;
  265.  
  266.      setchat("You Roll: ");
  267.      if (!expert) {
  268.           if (!yrdice) strcat(chatter," ^φP^eek,"); 
  269.           strcat(chatter," ^φD^ouble, ^φQ^uit, or <^φAnyKey^> to Roll ");
  270.      }
  271.      if (player == YU) {  /* not executed if player == 0, i.e., whofirst */
  272.           waiting = TRUE; 
  273.           while (waiting) {
  274.                msg(5,23,chatter);
  275.                ch = keyin(acg);
  276.                ch = toupper(ch);
  277.                switch ( ch ) {
  278.                     case 27 : { haltgame(); break; }
  279.                     case -69: /* F1 */
  280.                     case 'P': { dpeek(); break; }
  281.                     case -68: /* F2 */
  282.                     case 'D': { udouble(); break; }
  283.                     case -60: /* F10 */
  284.                     case 'Q': { winner(ME,topstone(YU)); break; }
  285.                     default : waiting = FALSE;
  286.           }     }
  287.           off_cursor(); msg(5,22,""); msg(5,23,"");
  288.      }
  289.      highroller(who);
  290.  
  291. } /* end: rolldice */
  292.  
  293.  
  294.  
  295.  
  296. static highroller( who ) int who; {  /* parameter is not redundant */
  297. static int y = 11;
  298. static int xme, xyu;
  299.  
  300.      /* get the values for two dice, either yours or mine */
  301.  
  302.      getdice();
  303.  
  304.      /* display the values of the dice in the board area */
  305.  
  306.      off_cursor();
  307.      xme = 47; xyu = 12;    /* decide which half to show the values in */ 
  308.      if (point[1].x > 40) { 
  309.           xme = 12; 
  310.           xyu = 47; 
  311.      }
  312.      if (player) {
  313.           gotoxy(xyu,y); blanks(18); /* erase, if not whofirst */
  314.           gotoxy(xme,y); blanks(18);
  315.      }
  316.      if (who == ME) {
  317.           gotoxy(xme,y); wprintf("My");
  318.      }
  319.      else {
  320.           gotoxy(xyu,y); wprintf("Your");
  321.      }
  322.      wprintf(" Roll> [%d] ",dice[0]);
  323.      if (player) wprintf("[%d