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