1 static char sccsid[] = " subs.c 4.2 82/11/27 "; 2 3 #include <stdio.h> 4 #include "back.h" 5 6 int buffnum; 7 char outbuff[BUFSIZ]; 8 9 static char plred[] = "Player is red, computer is white."; 10 static char plwhite[] = "Player is white, computer is red."; 11 static char nocomp[] = "(No computer play.)"; 12 13 char *descr[] = { 14 "Usage: backgammon [-] [n r w b pr pw pb t3a]\n", 15 "\t-\tgets this list\n\tn\tdon't ask for rules or instructions", 16 "\tr\tplayer is red (implies n)\n\tw\tplayer is white (implies n)", 17 "\tb\ttwo players, red and white (implies n)", 18 "\tpr\tprint the board before red's turn", 19 "\tpw\tprint the board before white's turn", 20 "\tpb\tprint the board before both player's turn", 21 "\tterm\tterminal is a term", 22 "\tsfile\trecover saved game from file", 23 0 24 }; 25 26 errexit (s) 27 register char *s; 28 { 29 write (2,"\n",1); 30 perror (s); 31 getout(); 32 } 33 34 strset (s1,s2) 35 register char *s1, *s2; 36 { 37 while ( (*s1++ = *s2++) != '\0'); 38 } 39 40 addbuf (c) 41 register char c; 42 43 { 44 buffnum++; 45 if (buffnum == BUFSIZ) { 46 if (write(1,outbuff,BUFSIZ) != BUFSIZ) 47 errexit ("addbuf (write):"); 48 buffnum = 0; 49 } 50 outbuff[buffnum] = c; 51 } 52 53 buflush () { 54 if (buffnum < 0) 55 return; 56 buffnum++; 57 if (write (1,outbuff,buffnum) != buffnum) 58 errexit ("buflush (write):"); 59 buffnum = -1; 60 } 61 62 readc () { 63 char c; 64 65 if (tflag) { 66 cline(); 67 newpos(); 68 } 69 buflush(); 70 if (read(0,&c,1) != 1) 71 errexit ("readc"); 72 if (c == '\177') 73 getout(); 74 if (c == '\033' || c == '\015') 75 return ('\n'); 76 if (cflag) 77 return (c); 78 if (c == '\014') 79 return ('R'); 80 if (c >= 'a' && c <= 'z') 81 return (c & 0137); 82 return (c); 83 } 84 85 writec (c) 86 char c; 87 { 88 if (tflag) 89 fancyc (c); 90 else 91 addbuf (c); 92 } 93 94 writel (l) 95 register char *l; 96 { 97 #ifdef DEBUG 98 register char *s; 99 100 if (trace == NULL) 101 trace = fopen ("bgtrace","w"); 102 103 fprintf (trace,"writel: \""); 104 for (s = l; *s; s++) { 105 if (*s < ' ' || *s == '\177') 106 fprintf (trace,"^%c",(*s)^0100); 107 else 108 putc (*s,trace); 109 } 110 fprintf (trace,"\"\n"); 111 fflush (trace); 112 #endif 113 114 while (*l) 115 writec (*l++); 116 } 117 118 proll () { 119 if (d0) 120 swap; 121 if (cturn == 1) 122 writel ("Red's roll: "); 123 else 124 writel ("White's roll: "); 125 writec (D0+'0'); 126 writec ('\040'); 127 writec (D1+'0'); 128 if (tflag) 129 cline(); 130 } 131 132 wrint (n) 133 int n; 134 { 135 register int i, j, t; 136 137 for (i = 4; i > 0; i--) { 138 t = 1; 139 for (j = 0; j<i; j++) 140 t *= 10; 141 if (n > t-1) 142 writec ((n/t)%10+'0'); 143 } 144 writec (n%10+'0'); 145 } 146 147 gwrite() { 148 register int r, c; 149 150 if (tflag) { 151 r = curr; 152 c = curc; 153 curmove (16,0); 154 } 155 156 if (gvalue > 1) { 157 writel ("Game value: "); 158 wrint (gvalue); 159 writel (". "); 160 if (dlast == -1) 161 writel (color[0]); 162 else 163 writel (color[1]); 164 writel (" doubled last."); 165 } else { 166 switch (pnum) { 167 case -1: /* player is red */ 168 writel (plred); 169 break; 170 case 0: /* player is both colors */ 171 writel (nocomp); 172 break; 173 case 1: /* player is white */ 174 writel (plwhite); 175 } 176 } 177 178 if (rscore || wscore) { 179 writel (" "); 180 wrscore(); 181 } 182 183 if (tflag) { 184 cline(); 185 curmove (r,c); 186 } 187 } 188 189 quit () { 190 register int i; 191 192 if (tflag) { 193 curmove (20,0); 194 clend(); 195 } else 196 writec ('\n'); 197 writel ("Are you sure you want to quit?"); 198 if (yorn (0)) { 199 if (rfl) { 200 writel ("Would you like to save this game?"); 201 if (yorn(0)) 202 save(0); 203 } 204 cturn = 0; 205 return (1); 206 } 207 return (0); 208 } 209 210 yorn (special) 211 register char special; /* special response */ 212 { 213 register char c; 214 register int i; 215 216 i = 1; 217 while ( (c = readc()) != 'Y' && c != 'N') { 218 if (special && c == special) 219 return (2); 220 if (i) { 221 if (special) { 222 writel (" (Y, N, or "); 223 writec (special); 224 writec (')'); 225 } else 226 writel (" (Y or N)"); 227 i = 0; 228 } else 229 writec ('\007'); 230 } 231 if (c == 'Y') 232 writel (" Yes.\n"); 233 else 234 writel (" No.\n"); 235 if (tflag) 236 buflush(); 237 return (c == 'Y'); 238 } 239 240 wrhit (i) 241 register int i; 242 { 243 writel ("Blot hit on "); 244 wrint (i); 245 writec ('.'); 246 writec ('\n'); 247 } 248 249 nexturn () { 250 register int c; 251 252 cturn = -cturn; 253 c = cturn/abs(cturn); 254 home = bar; 255 bar = 25-bar; 256 offptr += c; 257 offopp -= c; 258 inptr += c; 259 inopp -= c; 260 Colorptr += c; 261 colorptr += c; 262 } 263 264 getarg (arg) 265 register char ***arg; 266 267 { 268 register char **s; 269 270 /* process arguments here. dashes are ignored, nbrw are ignored 271 if the game is being recovered */ 272 273 s = *arg; 274 while (s[0][0] == '-') { 275 switch (s[0][1]) { 276 277 /* don't ask if rules or instructions needed */ 278 case 'n': 279 if (rflag) 280 break; 281 aflag = 0; 282 args[acnt++] = 'n'; 283 break; 284 285 /* player is both read and white */ 286 case 'b': 287 if (rflag) 288 break; 289 pnum = 0; 290 aflag = 0; 291 args[acnt++] = 'b'; 292 break; 293 294 /* player is red */ 295 case 'r': 296 if (rflag) 297 break; 298 pnum = -1; 299 aflag = 0; 300 args[acnt++] = 'r'; 301 break; 302 303 /* player is white */ 304 case 'w': 305 if (rflag) 306 break; 307 pnum = 1; 308 aflag = 0; 309 args[acnt++] = 'w'; 310 break; 311 312 /* print board after move according to following character */ 313 case 'p': 314 if (s[0][2] != 'r' && s[0][2] != 'w' && s[0][2] != 'b') 315 break; 316 args[acnt++] = 'p'; 317 args[acnt++] = s[0][2]; 318 if (s[0][2] == 'r') 319 bflag = 1; 320 if (s[0][2] == 'w') 321 bflag = -1; 322 if (s[0][2] == 'b') 323 bflag = 0; 324 break; 325 326 case 't': 327 if (s[0][2] == '\0') { /* get terminal caps */ 328 s++; 329 tflag = getcaps (*s); 330 } else 331 tflag = getcaps (&s[0][2]); 332 break; 333 334 case 's': 335 s++; 336 /* recover file */ 337 recover (s[0]); 338 break; 339 } 340 s++; 341 } 342 if (s[0] != 0) 343 recover(s[0]); 344 } 345 346 init () { 347 register int i; 348 for (i = 0; i < 26;) 349 board[i++] = 0; 350 board[1] = 2; 351 board[6] = board[13] = -5; 352 board[8] = -3; 353 board[12] = board[19] = 5; 354 board[17] = 3; 355 board[24] = -2; 356 off[0] = off[1] = -15; 357 in[0] = in[1] = 5; 358 gvalue = 1; 359 dlast = 0; 360 } 361 362 wrscore () { 363 writel ("Score: "); 364 writel (color[1]); 365 writec (' '); 366 wrint (rscore); 367 writel (", "); 368 writel (color[0]); 369 writec (' '); 370 wrint (wscore); 371 } 372 373 fixtty (mode) 374 int mode; 375 { 376 if (tflag) 377 newpos(); 378 buflush(); 379 tty.sg_flags = mode; 380 if (stty (0,&tty) < 0) 381 errexit("fixtty"); 382 } 383 384 getout () { 385 /* go to bottom of screen */ 386 if (tflag) { 387 curmove (23,0); 388 cline(); 389 } else 390 writec ('\n'); 391 392 /* fix terminal status */ 393 fixtty (old); 394 exit(); 395 } 396 roll () { 397 register char c; 398 register int row; 399 register int col; 400 401 if (iroll) { 402 if (tflag) { 403 row = curr; 404 col = curc; 405 curmove (17,0); 406 } else 407 writec ('\n'); 408 writel ("ROLL: "); 409 c = readc(); 410 if (c != '\n') { 411 while (c < '1' || c > '6') 412 c = readc(); 413 D0 = c-'0'; 414 writec (' '); 415 writec (c); 416 c = readc(); 417 while (c < '1' || c > '6') 418 c = readc(); 419 D1 = c-'0'; 420 writec (' '); 421 writec (c); 422 if (tflag) { 423 curmove (17,0); 424 cline(); 425 curmove (row,col); 426 } else 427 writec ('\n'); 428 return; 429 } 430 if (tflag) { 431 curmove (17,0); 432 cline(); 433 curmove (row,col); 434 } else 435 writec ('\n'); 436 } 437 D0 = rnum(6)+1; 438 D1 = rnum(6)+1; 439 d0 = 0; 440 } 441