1 static char sccsid[] = " subs.c 4.1 82/05/11 "; 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 if (*s == '-' && s[1] == '\0') { 275 tflag = 0; 276 text (descr); 277 getout (); 278 } 279 for (; *s != '\0'; s++) { 280 switch (*s) { 281 282 /* ignore dashes */ 283 case '-': 284 break; 285 286 /* don't ask if rules or instructions needed */ 287 case 'n': 288 if (rflag) 289 break; 290 aflag = 0; 291 args[acnt++] = *s; 292 break; 293 294 /* player is both read and white */ 295 case 'b': 296 if (rflag) 297 break; 298 pnum = 0; 299 aflag = 0; 300 args[acnt++] = *s; 301 break; 302 303 /* player is red */ 304 case 'r': 305 if (rflag) 306 break; 307 pnum = -1; 308 aflag = 0; 309 args[acnt++] = *s; 310 break; 311 312 /* player is white */ 313 case 'w': 314 if (rflag) 315 break; 316 pnum = 1; 317 aflag = 0; 318 args[acnt++] = *s; 319 break; 320 321 /* print board after move according to following character */ 322 case 'p': 323 s++; 324 if (*s != 'r' && *s != 'w' && *s != 'b') 325 break; 326 args[acnt++] = 'p'; 327 args[acnt++] = *s; 328 if (*s == 'r') 329 bflag = 1; 330 if (*s == 'w') 331 bflag = -1; 332 if (*s == 'b') 333 bflag = 0; 334 break; 335 336 case 't': 337 if (*++s == '\0') /* get terminal caps */ 338 tflag = getcaps (*(++*arg)); 339 else 340 tflag = getcaps (s); 341 return; 342 343 case 's': 344 if (*++s == '\0') /* recover file */ 345 recover (*(++*arg)); 346 else 347 recover (s); 348 return; 349 } 350 } 351 } 352 353 init () { 354 register int i; 355 for (i = 0; i < 26;) 356 board[i++] = 0; 357 board[1] = 2; 358 board[6] = board[13] = -5; 359 board[8] = -3; 360 board[12] = board[19] = 5; 361 board[17] = 3; 362 board[24] = -2; 363 off[0] = off[1] = -15; 364 in[0] = in[1] = 5; 365 gvalue = 1; 366 dlast = 0; 367 } 368 369 wrscore () { 370 writel ("Score: "); 371 writel (color[1]); 372 writec (' '); 373 wrint (rscore); 374 writel (", "); 375 writel (color[0]); 376 writec (' '); 377 wrint (wscore); 378 } 379 380 fixtty (mode) 381 int mode; 382 { 383 if (tflag) 384 newpos(); 385 buflush(); 386 tty.sg_flags = mode; 387 if (stty (0,&tty) < 0) 388 errexit("fixtty"); 389 } 390 391 getout () { 392 /* go to bottom of screen */ 393 if (tflag) { 394 curmove (23,0); 395 cline(); 396 } else 397 writec ('\n'); 398 399 /* fix terminal status */ 400 fixtty (old); 401 exit(); 402 } 403 roll () { 404 register char c; 405 register int row; 406 register int col; 407 408 if (iroll) { 409 if (tflag) { 410 row = curr; 411 col = curc; 412 curmove (17,0); 413 } else 414 writec ('\n'); 415 writel ("ROLL: "); 416 c = readc(); 417 if (c != '\n') { 418 while (c < '1' || c > '6') 419 c = readc(); 420 D0 = c-'0'; 421 writec (' '); 422 writec (c); 423 c = readc(); 424 while (c < '1' || c > '6') 425 c = readc(); 426 D1 = c-'0'; 427 writec (' '); 428 writec (c); 429 if (tflag) { 430 curmove (17,0); 431 cline(); 432 curmove (row,col); 433 } else 434 writec ('\n'); 435 return; 436 } 437 if (tflag) { 438 curmove (17,0); 439 cline(); 440 curmove (row,col); 441 } else 442 writec ('\n'); 443 } 444 D0 = rnum(6)+1; 445 D1 = rnum(6)+1; 446 d0 = 0; 447 } 448