|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T p
Length: 7415 (0x1cf7) Types: TextFile Names: »prbord.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987 └─⟦this⟧ »EUUGD18/General/Draughts/prbord.c«
#include "damdefs.h" /* display routines for dam.c */ #define DELAY 7 extern int mvnr,game[],conv[],reconv[],bord[],*gp; extern int timew,timeb,optg,playw,playb; int ospeed; int pb = 1; /* nonzero if at begin of line */ int disp = 0; /* nonzero if HP display desired */ int dirt = 0; /* nonzero if garbage printed below board */ int prall = 1; /* if nonzero the display is rewritten */ char prtarr[] = ".wzWZ?"; char *dsparr[] = { "\033&dJ \0xxx", "\033&dJO \0xxx", "\033&dJX \0xxx", "O \0xxxxxxxxxx", "X \0xxxxxxxxxx", "? \0xxxxxxxxxx" }; char *emparr[] = { /* 0 */ "\033&dB ", /* 1 */ "\033&dJ ", /* 2 */ "\033&dJ%2d", /* 3 */ "\033&dJ\016%2d\017", /* 4 */ "\033&d@\016%2d\017", 0 }; char *fularr[] = { /* 0 */ "w ","z ","W ","Z ", /* 1 */ "w ","z ","WW","ZZ", /* 2 */ "w ","b ","W ","B ", /* 3 */ "o ","x ","O ","X ", /* 4 */ "\016V \017","\016$ \017","\016VV\017","\016$$\017", /* 5 */ "\016[ \017","\016_ \017","\016[[\017","\016__\017", /* 6 */ "\033&dJO ","\033&dJX ","O ","X ", 0 }; /* cursor home and clear screen */ home(){ printf("\033H\033J"); dirt = 0; } /* position cursor */ int lastrow; posit(l,c) int l,c; { printf("\033&a%dr%dC",l,c); lastrow = l; delay(); } /* print string inverted (i.e. against white background) */ /* make sure no greek chars are printed */ whstr(s) char *s; { printf("\033&dB\017%s\033&d@",s); delay(); } /* revert to black */ blstr(){ printf("\033&d@"); delay(); } /* delay is necessary after changes of color or position */ delay(){ register int ct; ct = DELAY; if(ospeed == 300) ct = 1; while(ct--) putchar('\177'); } int col1 = 26; int col2 = 56; #define COLW 14 /* width of column of moves */ #define ROW0 16 /* row of conversation below the board */ prmove(mvpt) int *mvpt; { int fin,ct,inh; prmvnr(); prnum(*mvpt++); fin = *mvpt++; ct = *mvpt++; inh = (ct>1 ? 1 : 0); if(!ct){ putchar('-'); prnum(fin); } else { putchar('x'); prnum(fin); putchar('('); while(--ct){ prnum(*mvpt++); putchar(','); } prnum(*mvpt++); putchar(')'); } pb = mvnr&1; pb |= inh+optg; putchar(pb ? '\n' : '\t'); } prnum(num) int num; { printf("%2d", reconv[ num & 0377 ]); } /* define printing position before printing a move */ int rowdif; prmvnr(){ int cl,rw,clr; clr = 0; rw = (mvnr>>1) + rowdif; if((mvnr&1) && pb) rw++; while(rw > 88) rw -= 44; if(rw > 66){ rw -= 66; cl = col2; clr = 80-col2; } else if(rw > 44){ rw -= 44; cl = col1; clr = col2-col1; } else if(rw > 22){ rw -= 22; cl = col2; } else cl = col1; if(mvnr&1){ if(pb){ rowdif++; if(clr) clear(rw,cl,clr); if(disp) posit(rw,cl); printf("%2d. ...\t", mvnr>>1); } if(disp) posit(rw, cl+COLW); } else { if(clr) clear(rw,cl,clr); if(disp) posit(rw, cl); printf("%2d. ", mvnr>>1); } } /* clear the line below the given line, and the given line only if it is line 1 */ clear(rw,cl,ct) int rw,cl,ct; { register int i; if(!disp) return; if(rw == 1){ posit(rw,cl); for(i=ct; i--; ) putchar(' '); } posit(rw+1,cl); for(i=ct; i--; ) putchar(' '); } int prev_bord[66]; /* remember, and print differences only */ unsigned prbwait = 0; /* delay after each prbord() */ pbundef(){ /* force printing of entire board */ register int i; for(i=0; i<66; i++) prev_bord[i] = -1; } prbord(){ register int i,*mp1; int bdi,xi,yi; if(prall) { if(disp) home(); pbundef(); } if(!disp){ if(!pb){ putchar('\n'); pb++; } putchar('\n'); } if(disp){ /* write times above board */ posit(1,5); printf("%s%4d \016:\017 %4d %s", dsparr[3],timew,timeb,dsparr[4]); if(prall) printf("\n\n \0161 2 3 4 5\017\n"); } for(i=1; i<=50; i++){ bdi = bord[conv[i]]; if(disp && (prev_bord[conv[i]] == bdi)) continue; if((i/10)*10+1 == i) if(!disp) putchar(' '); switch(bdi){ case EMPTY: bdi = 0; break; case WHITE: bdi = 1; break; case BLACK: bdi = 2; break; case WHITE+DAM: bdi = 3; break; case BLACK+DAM: bdi = 4; break; default: bdi = 5; } if(disp) { /* first compute position */ yi = (i-1)/5; xi = 4*(i - 5*yi) - 2; if(yi&1) xi--; else xi++; /* then display it there */ posit(yi+4, xi+2); if(bdi) whstr(dsparr[bdi]); else { printf(dsparr[0],i); blstr(); } if((i%5 == 0) && (i%10 != 0)) printf("\016%2d\017\n \016%2d\017",i,i+1); } else { putchar(prtarr[bdi]); if(i%5 == 0) putchar('\n'); else putchar(' '); } } if(disp && prall) printf("\n \016 46 47 48 49 50\017\n"); if(prall) { prall = 0; if(disp){ rowdif = 0; i = mvnr; /* save temporarily */ mvnr = 1; for(mp1 = game; mp1<gp; ){ mvnr++; prmove(mp1); mp1 += 2; mp1 += *mp1++; } mvnr = i; } } else for(i = ROW0+dirt-2; i >= ROW0-1; i--) clear(i,0,col1); dirt = 0; if(disp) posit(ROW0,0); else putchar('\n'); for(i=0; i<66; i++) prev_bord[i] = bord[i]; if(prbwait) sleep(prbwait); } prposit(){ prlist("w",WHITE); prlist("z",BLACK); prlist("wd",WHITE|DAM); prlist("zd",BLACK|DAM); printf(".\n"); } prlist(s,c) char *s; int c; { register int i; int seen; seen = 0; for(i=1; i<=50; i++) if(bord[conv[i]] == c){ if(!seen++) printf("%s: %d",s,i); else printf(",%d",i); } if(seen) printf("\n"); } int fieldw,linpos; putcr(c) char c; { putchar(c); linpos++; if(c == '\n') linpos = 0; else if(linpos == col1){ putchar('\n'); linpos = 0; } if(linpos == 0) dirt++; } printo(n) int n; { if(n){ fieldw--; printo((n>>3) & 017777); } for(fieldw--; fieldw>0; fieldw--) putcr(' '); putcr('0' + (n & 07)); } printd(n) int n; { int a; if(a = n/10){ fieldw--; printd(a); } for(fieldw--; fieldw > 0; fieldw--) putcr(' '); putcr('0' + n%10); } /*VARARGS1*/ pmesg(fmt,args) char *fmt; int *args; { int x; register char *s,c; register int *ap; ap = &args; if(disp && lastrow != ROW0) { posit(ROW0,0); linpos = 0; } while(c = *fmt++){ fieldw = -1; if(c != '%') putcr(c); else { c = *fmt++; if(c >= '0' && c <= '9'){ fieldw = c-'0'; c = *fmt++; } switch(c){ case 'o': printo(*ap++); continue; case 'd': x = *ap++; if(x < 0){ putcr('-'); printd(-x); } else printd(x); continue; case 's': s = (char *) (*ap++); while(c = *s++) putcr(c); continue; case 'c': putcr(*ap++); continue; default: /* in particular when c=0 */ error("bad string?"); } } } } extern int optf,crownmv,altermv,rdifmin; outgame(){ int mvnr0; register int *mp1; outfil(); mvnr0 = mvnr; mvnr = 1; printf("***** dam%s version of %s *****\n",VERSION,DATE); printf("rdifmin = %d\n", rdifmin); if(crownmv) printf("crownmv = %d\n", crownmv); if(altermv) printf("altermv = %d\n", altermv); if(playw == USER) printf("user has white\n"); if(playb == USER) printf("user has black\n"); for(mp1=game; mp1<gp; ){ mvnr++; prmove(mp1); mp1 += 2; mp1 += *mp1++; } prbord(); rdcomd("t"); /* %% recursive call */ mvnr = mvnr0; outterm(); } outboard(){ outfil(); prbord(); outterm(); } outposit(){ outfil(); prposit(); outterm(); } int disp0,fterm; outfil(){ if(optf<0) { pmesg("no file\n"); return; } fterm = dup(1); (void) close(1); if(dup(optf) != 1) error("f not 1 in outfil"); disp0 = disp; disp = 0; } outterm(){ disp = disp0; (void) close(1); if(dup(fterm) != 1) error("f not 1 in outterm"); (void) close(fterm); } initterm(){}