ml@brumuc.muc.sub.org (Marc Laukien) (05/20/91)
Submitted-by: ml@brumuc.muc.sub.org Archive-name: UnixChess/part02 ---- Cut Here and feed the following to sh ---- #!/bin/sh # this is chess.02 (part 2 of UnixChess) # do not concatenate these parts, unpack them in order with /bin/sh # file ch/init.c continued # if test ! -r _shar_seq_.tmp; then echo 'Please unpack part 1 first!' exit 1 fi (read Scheck if test "$Scheck" != 2; then echo Please unpack part "$Scheck" next! exit 1 else exit 0 fi ) < _shar_seq_.tmp || exit 1 if test ! -f _shar_wnt_.tmp; then echo 'x - still skipping ch/init.c' else echo 'x - continuing file ch/init.c' sed 's/^X//' << 'SHAR_EOF' >> 'ch/init.c' && X { X farbe |= WEI; X i++; X continue; X } X X if(str[i]=='B') /* Komb. fuer Schwarz ? */ X { X farbe |= SCH; X i++; X continue; X } X X strncpy(str2,str+i,4); /* Zug holen */ X str2[4]=0; /* beenden */ X X open[j]=wandle_inv(str2); /* umwandeln */ X if(open[j]==(WORD)0) /* Fehler ? */ X open[j]=wandle_inv("a1a1"); X /* unmoeglicher Zug */ X X j++; X i += 4; /* naechster Zug */ X } X X open[j]=(WORD)0; /* beenden */ X X op[opnr]=(WORD *)malloc((unsigned)sizeof(WORD)*(j+1)); X if(op[opnr]==(WORD *)0) /* Fataler Fehler */ X exit(1); X X op_fa[opnr]=farbe; X memcpy((char *)op[opnr++],(char *)open, X (int)sizeof(WORD)*(j+1));/* kopieren */ X } X X fclose(fp); /* schliessen */ X X for(i=opnr;i<MAXOP;i++) /* loeschen */ X op[i]=(WORD *)0; } SHAR_EOF echo 'File ch/init.c is complete' && chmod 0644 ch/init.c || echo 'restore of ch/init.c failed' Wc_c="`wc -c < 'ch/init.c'`" test 4881 -eq "$Wc_c" || echo 'ch/init.c: original size 4881, current size' "$Wc_c" rm -f _shar_wnt_.tmp fi # ============= ch/list.c ============== if test -f 'ch/list.c' -a X"$1" != X"-c"; then echo 'x - skipping ch/list.c (File already exists)' rm -f _shar_wnt_.tmp else > _shar_wnt_.tmp echo 'x - extracting ch/list.c (Text)' sed 's/^X//' << 'SHAR_EOF' > 'ch/list.c' && /****************************************************************/ /* */ /* XChess V2.7: Zugliste */ /* */ /* (c) 1991 by Marc Laukien */ /* */ /****************************************************************/ X #include "ch.h" /* Def. des Schachspiels */ X static void add(); static void zugliste2(); X /****************************************************************/ /* Zugliste erstellen */ /****************************************************************/ /* Return: Anzahl der Zuege */ /****************************************************************/ X int zugliste(dat,pos) X SPDAT *dat; /* Spieldaten */ BYTE pos; /* Position */ { X int nr=0; /* Anzahl der Zuege */ X register int i,j; /* Zaehler */ X X dat->zlist[0]=0; /* loeschen */ X X if(pos) /* nur ein Feld ? */ X zugliste2(dat,pos,&nr); X else X { X if(dat->farbe==SCH) /* Schwarz von unten nach oben */ X for(j=0;j<8;j++) /* alle Felder durchgehen */ X for(i=0;i<8;i++) X if(!_istlee(dat->brett[pos= X (BYTE)((j+RAND)*ZLEN+i+RAND)])) X zugliste2(dat,pos,&nr); X X if(dat->farbe==WEI) /* Weiss von oben nach unten */ X for(j=7;j>=0;j--) /* alle Felder durchgehen */ X for(i=0;i<8;i++) X if(!_istlee(dat->brett[pos= X (BYTE)((j+RAND)*ZLEN+i+RAND)])) X zugliste2(dat,pos,&nr); X } X X return(nr); } X static void zugliste2(dat,posa,nr) X SPDAT *dat; /* Spieldaten */ register BYTE posa; /* alte Position */ int *nr; /* Zugzaehler */ { X static short wzuege[][12] = /* Weisse Zuege */ X { X {0,0}, X /* Bauerzuege */ X {2,11,13,12,0}, X /* X Bauerzuege */ X {2,11,13,12,24,0}, X /* Springerzuege */ X {0,14,25,23,10,-14,-25,-23,-10,0}, X /* Laeuferzuege */ X {1,13,11,-13,-11,0}, X /* Turmzuege */ X {1,1,12,-1,-12,0}, X /* X Turmzuege */ X {1,1,12,-1,-12,0}, X /* Damenzuege */ X {1,1,13,12,11,-1,-13,-12,-11,0}, X /* Koenigzuege */ X {0,1,13,12,11,-1,-13,-12,-11,0}, X /* X Koenigzuege */ X {3,2,-2,1,13,12,11,-1,-13,-12,-11,0} X }; X X static short szuege[][12] = /* Schwarze Zuege */ X { X {0,0}, X /* Bauerzuege */ X {2,-11,-13,-12,0}, X /* X Bauerzuege */ X {2,-11,-13,-12,-24,0}, X /* Springerzuege */ X {0,14,25,23,10,-14,-25,-23,-10,0}, X /* Laeuferzuege */ X {1,13,11,-13,-11,0}, X /* Turmzuege */ X {1,1,12,-1,-12,0}, X /* X Turmzuege */ X {1,1,12,-1,-12,0}, X /* Damenzuege */ X {1,1,13,12,11,-1,-13,-12,-11,0}, X /* Koenigzuege */ X {0,1,13,12,11,-1,-13,-12,-11,0}, X /* X Koenigzuege */ X {3,2,-2,1,13,12,11,-1,-13,-12,-11,0} X }; X X short (*zuege)[12]; /* effektive Zugliste */ X X /* ^ alle Zuege fuer RAND = 2 */ X X register BYTE fig; /* Figur */ X register BYTE k; /* Zaehler */ X register BYTE posn; /* neue Position */ X register short zug; /* aktueller Zug */ X X fig=dat->brett[posa]; /* Figur holen */ X X if(_farbe(fig) != dat->farbe) /* falsche Farbe ? */ X return; X X if(dat->farbe == WEI) /* eff. Zugl. best.*/ X zuege=wzuege; X else X zuege=szuege; X X switch(zuege[_figur(fig)][0]) X { X case 0: /* keine Wiederholung */ X for(k=1;zug=zuege[_figur(fig)][k];k++) X /* alle Zuege durchg. */ X { X posn=(BYTE)((short)posa+zug); X X if(!(dat->farbe & _farbe(dat->brett[posn]))) X add(dat,nr,posa,posn); X /* Zug anhaengen */ X } X break; X case 1: /* wiederholen */ X for(k=1;zug=zuege[_figur(fig)][k];k++) X /* alle Zuege durchg. */ X { X posn=(BYTE)((short)posa+zug); X X while(_istlee(dat->brett[posn])) X { X add(dat,nr,posa,posn); X /* Zug anhaengen */ X posn= (BYTE)((short)posn+zug); X } X X if(!(dat->farbe&_farbe(dat->brett[posn]))) X add(dat,nr,posa,posn); X /* Zug anhaengen */ X } X break; X case 2: /* Bauer */ X for(k=1;zug=zuege[_figur(fig)][k];k++) X /* alle Zuege durchg. */ X { X posn=(BYTE)((short)posa+zug); X if(k<=2) /* nur schlagen */ X { X if(_istlee(dat->brett[posn])) X /* Feld leer, schlagen nur e.p. mgl. */ X { X int nb,f2,bz; X X nb = /* Figur neben Bauer */ X (short)_npos(dat->lzug) X - (short)posa==1 || X (short)_npos(dat->lzug) X - (short)posa==-1 X ; X f2 = /* letzter Zug 2 Felder */ X (short)_apos(dat->lzug) X - (short)_npos(dat->lzug)==24 || X (short)_apos(dat->lzug) X - (short)_npos(dat->lzug)==-24 X ; X bz = /* letzter zu Bauer */ X _istbau(dat->brett[_npos(dat->lzug)]) X ; X if(!(nb && f2 && bz)) X /* nicht e.p., also Abbruch */ X continue; X } X } X else /* nicht schlagen */ X if(!_istlee(dat->brett[posn])) X break; X X if(!(dat->farbe & _farbe(dat->brett[posn]))) X add(dat,nr,posa,posn); X /* Zug anhaengen */ X } X break; X case 3: /* X Koenig */ X for(k=1;zug=zuege[_figur(fig)][k];k++) X /* alle Zuege durchg. */ X { X posn=(BYTE)((short)posa+zug); X X if(k==1) /* Rochade rechts */ X { X if(!_istlee(dat->brett[posa+1])) X continue; X if(!_istxtur(dat->brett[posa+3])) X continue; X if(bedrohung(dat,posa+1)) X continue; X if(bedrohung(dat,posa)) X continue; X } X X if(k==2) /* Rochade links */ X { X if(!_istlee(dat->brett[posa-1])) X continue; X if(!_istlee(dat->brett[posa-3])) X continue; X if(!_istxtur(dat->brett[posa-4])) X continue; X if(bedrohung(dat,posa-1)) X continue; X if(bedrohung(dat,posa)) X continue; X } X X if(!(dat->farbe & _farbe(dat->brett[posn]))) X add(dat,nr,posa,posn); X /* Zug anhaengen */ X } X break; X } } X static void add(dat,nr,posa,posn) X SPDAT *dat; /* Spieldaten */ int *nr; /* Anzahl der eingetragen Zuege */ BYTE posa,posn; /* alte und neue Position */ { X /* Bedrohung ueberpruefen bis minimale Rechentiefe */ X if((mode&16) || /* Bedrohung immer ueberpruefen ? */ X (spdat.maxstufe-dat->maxstufe < spdat.minstufe)) X /* ^ Falsche Berechnung beim Vorsortieren, daher dort mode|=16 */ X { X BYTE figa,fign,pos; X /* zieht Koenig selbst ? */ X if(posa==dat->wkpos || posa==dat->skpos) X pos=posn; X else if(dat->farbe==WEI) X pos=dat->wkpos; X else X pos=dat->skpos; X X figa=dat->brett[posa]; /* retten */ X fign=dat->brett[posn]; X X dat->brett[posa]=LEE; /* ziehen */ X dat->brett[posn]=figa; X X if(bedrohung(dat,pos)) X { X dat->brett[posa]=figa; /* zuruecknehmen */ X dat->brett[posn]=fign; X return; /* Koenig bedroht */ X } X X dat->brett[posa]=figa; /* zuruecknehmen */ X dat->brett[posn]=fign; X } X X dat->zlist[(*nr)++]= posa+((WORD)posn<<8); /* eintragen */ X dat->zlist[*nr]= 0; /* beenden */ } X /****************************************************************/ /* Zugliste sortieren */ /****************************************************************/ /* Return: Anzahl der Zuege */ /****************************************************************/ X int sortliste(dat,stufe) X SPDAT *dat; /* Spieldaten */ int stufe; /* Vorsortierstufe */ { X int anz; /* Anzahl der Zuege */ X int minc,maxc; /* Kopien der Stufen */ X int modec; /* Kopie des Modus */ X int i,j; /* Zaehler */ X long bew; /* Bewertung */ X WORD zug; /* Zug */ X WORD bzug[MAXTIEFE]; /* beste Kombination */ X X minc=dat->minstufe; /* Stufen retten */ X maxc=dat->maxstufe; X modec=mode; X X dat->minstufe=stufe; /* Sortierstufen */ X dat->maxstufe=stufe; X mode |= 16; /* Koenigsbedr. immer Ueberpruefen */ X X comp_zug(dat,dat->farbe==WEI ? MATT:-MATT,bzug); X X if(beende) /* Beenden ? */ X return(0); X X dat->minstufe=minc; /* wieder herstellen */ X dat->maxstufe=maxc; X mode=modec; X X for(anz=0;dat->zlist[anz]!=(WORD)0;anz++)/* Anzahl bestimmen */ X ; X X for(i=0 ;i<anz-1;i++) /* sortieren */ X for(j=i+1;j<anz ;j++) X if(dat->farbe==WEI ? X dat->blist[i]<dat->blist[j] : dat->blist[i]>dat->blist[j]) X { X bew =dat->blist[i]; X dat->blist[i] =dat->blist[j]; X dat->blist[j] =bew; X zug =dat->zlist[i]; X dat->zlist[i] =dat->zlist[j]; X dat->zlist[j] =zug; X } X X return(anz); } SHAR_EOF chmod 0644 ch/list.c || echo 'restore of ch/list.c failed' Wc_c="`wc -c < 'ch/list.c'`" test 7783 -eq "$Wc_c" || echo 'ch/list.c: original size 7783, current size' "$Wc_c" rm -f _shar_wnt_.tmp fi # ============= ch/archiv.c ============== if test -f 'ch/archiv.c' -a X"$1" != X"-c"; then echo 'x - skipping ch/archiv.c (File already exists)' rm -f _shar_wnt_.tmp else > _shar_wnt_.tmp echo 'x - extracting ch/archiv.c (Text)' sed 's/^X//' << 'SHAR_EOF' > 'ch/archiv.c' && /****************************************************************/ /* */ /* XChess V2.7: Archiv */ /* */ /* (c) 1991 by Marc Laukien */ /* */ /****************************************************************/ X #include <string.h> #include <stdio.h> #include <ctype.h> #include "ch.h" /* Def. des Schachspiels */ X extern void exit(); extern char *malloc(); extern char *memcpy(); extern void free(); X /****************************************************************/ /* Spiel speichern */ /****************************************************************/ /* Return: 1-alles ok, 0-Fehler */ /****************************************************************/ X int save_game(name) X char name[]; /* Filename */ { X FILE *fp; /* Filepointer */ X char na[STRLEN]; /* effektiver Name */ X int i; X X while(*name==' ') /* Spaces loeschen */ X name++; X X strcpy(na,name); /* Name aufbereiten */ X strcat(na,".ch"); X X if((fp=fopen(na,"w"))==(FILE *)0) /* eroeffnen */ X return(0); /* Fehler */ X X fwrite((char *)&spdat,sizeof(SPDAT),1,fp); /* schreiben */ X for(i=0;i<spdat.zuege+1;i++) X fwrite((char *)archiv[i],sizeof(ARCHIV),1,fp); X fwrite((char *)&mode,sizeof(mode),1,fp); X fwrite((char *)&stufe,sizeof(stufe),1,fp); X fwrite((char *)&varianten,sizeof(varianten),1,fp); X fwrite((char *)&zeit,sizeof(zeit),1,fp); X fwrite((char *)&varprosek,sizeof(varprosek),1,fp); X fwrite((char *)&compzuege,sizeof(compzuege),1,fp); X X fclose(fp); X X return(1); } X /****************************************************************/ /* Spiel laden */ /****************************************************************/ /* Return: 1-alles ok, 0-Fehler */ /****************************************************************/ X int load_game(name) X char name[]; /* Filename */ { X FILE *fp; /* Filepointer */ X char na[STRLEN]; /* effektiver Name */ X int i; X X while(*name==' ') /* Spaces loeschen */ X name++; X X strcpy(na,name); /* Name aufbereiten */ X strcat(na,".ch"); X X if((fp=fopen(na,"r"))==(FILE *)0) /* eroeffnen */ X return(0); /* Fehler */ X X for(i=0;i<MAXSP;i++) /* Speicher freigeben */ X if(archiv[i]!=(ARCHIV *)0) X { X free(archiv[i]); X archiv[i]=(ARCHIV *)0; X } X X fread((char *)&spdat,sizeof(SPDAT),1,fp); /* lesen */ X for(i=0;i<spdat.zuege+1;i++) X { X archiv[i]=(ARCHIV *)malloc((unsigned)sizeof(ARCHIV)); X if(archiv[i]==(ARCHIV *)0) /* Fataler Fehler */ X exit(1); X X fread((char *)archiv[i],sizeof(ARCHIV),1,fp); X } X fread((char *)&mode,sizeof(mode),1,fp); X fread((char *)&stufe,sizeof(stufe),1,fp); X fread((char *)&varianten,sizeof(varianten),1,fp); X fread((char *)&zeit,sizeof(zeit),1,fp); X fread((char *)&varprosek,sizeof(varprosek),1,fp); X fread((char *)&compzuege,sizeof(compzuege),1,fp); X X fclose(fp); X X return(1); } X /****************************************************************/ /* Spieldaten laden */ /****************************************************************/ /* Return: 1-alles ok, 0-Fehler */ /****************************************************************/ X int load_spdat(name,dat) X char name[]; /* Filename */ SPDAT *dat; /* Spieldaten */ { X FILE *fp; /* Filepointer */ X char na[STRLEN]; /* effektiver Name */ X X while(*name==' ') /* Spaces loeschen */ X name++; X X strcpy(na,name); /* Name aufbereiten */ X strcat(na,".ch"); X X if((fp=fopen(na,"r"))==(FILE *)0) /* eroeffnen */ X return(0); /* Fehler */ X X fread((char *)dat,sizeof(SPDAT),1,fp); /* lesen */ X X fclose(fp); X X return(1); } X /****************************************************************/ /* Spieldaten archivieren */ /****************************************************************/ X void archiviere(dat) X SPDAT *dat; /* Spieldaten */ { X int nr; /* Zugnummer */ X int i,j; X BYTE fig1,fig2; X X nr=dat->zuege; /* Zugnummer bestimmen */ X X if(nr>=MAXSP) /* Speicher voll ? */ X exit(1); /* Fehler */ X X if(archiv[nr]==(ARCHIV *)0) X { X archiv[nr]=(ARCHIV *)malloc((unsigned)sizeof(ARCHIV)); X /* Speicher holen */ X if(archiv[nr]==(ARCHIV *)0) /* Fataler Fehler */ X exit(1); X } X X memcpy((char *)archiv[nr]->brett,(char *)dat->brett,GROE); X /* Spielfeld kopieren */ X X archiv[nr]->farbe=dat->farbe; /* sonstige Daten kopieren */ X archiv[nr]->wkpos=dat->wkpos; X archiv[nr]->skpos=dat->skpos; X archiv[nr]->lzug=dat->lzug; X X archiv[nr]->wdh= -1; /* Keine Wiederholung */ X for(i=nr-1;i>=0;i--) /* alle durchgehen */ X { X for(j=0;j<GROE;j++) X { X fig1=archiv[nr]->brett[j]; X if(_istxtur(fig1)) X fig1=TUR | _farbe(fig1); X if(_istxkoe(fig1)) X fig1=KOE | _farbe(fig1); X X fig2=archiv[i]->brett[j]; X if(_istxtur(fig2)) X fig2=TUR | _farbe(fig2); X if(_istxkoe(fig2)) X fig2=KOE | _farbe(fig2); X X if(fig1 != fig2) X break; X } X X if(j==GROE) /* Wiederholung gefunden */ X { X archiv[nr]->wdh=i; X break; X } X } } X /****************************************************************/ /* Spieldaten zurueckholen */ /****************************************************************/ /* 0: Fehler 1: ok */ /****************************************************************/ X int hole_zurueck(dat,nr) X SPDAT *dat; /* Spieldaten */ int nr; /* Zugnummer */ { X if(nr>=MAXSP || nr<0) X return(0); /* Fehler */ X X if(archiv[nr]==(ARCHIV *)0) /* nicht belegt ? */ X return(0); /* Fehler */ X X dat->zuege=nr; /* Zugnummer bestimmen */ X X memcpy((char *)dat->brett,(char *)archiv[nr]->brett,GROE); X /* Spielfeld kopieren */ X X dat->farbe=archiv[nr]->farbe; /* sonstige Daten kop. */ X dat->wkpos=archiv[nr]->wkpos; X dat->skpos=archiv[nr]->skpos; X dat->lzug =archiv[nr]->lzug; X X return(1); } SHAR_EOF chmod 0644 ch/archiv.c || echo 'restore of ch/archiv.c failed' Wc_c="`wc -c < 'ch/archiv.c'`" test 5629 -eq "$Wc_c" || echo 'ch/archiv.c: original size 5629, current size' "$Wc_c" rm -f _shar_wnt_.tmp fi # ============= ch/open.c ============== if test -f 'ch/open.c' -a X"$1" != X"-c"; then echo 'x - skipping ch/open.c (File already exists)' rm -f _shar_wnt_.tmp else > _shar_wnt_.tmp echo 'x - extracting ch/open.c (Text)' sed 's/^X//' << 'SHAR_EOF' > 'ch/open.c' && /****************************************************************/ /* */ /* XChess V2.7: Eroeffnung und Spielphase */ /* */ /* (c) 1991 by Marc Laukien */ /* */ /****************************************************************/ X #include <math.h> #include <stdio.h> #include "ch.h" /* Def. des Schachspiels */ #include "ph.h" /* Def. der Spielphasen */ X static WORD op_zug(); X /****************************************************************/ /* effektive Stufe einstellen und Spielphase erkennen */ /****************************************************************/ X void eff_stufe(dat) X SPDAT *dat; /* Spieldaten */ { X double wanz,sanz; /* Anzahl der Figurenbew. */ X int w_b,w_sl,w_td; /* Anzahl der weissen Figuren */ X int s_b,s_sl,s_td; /* Anzahl der schwarzen Figuren */ X WORD pos; X static double bew[]= /* Bewgungsfreiheit */ X /* unter opt. Bedingungen */ X {BWLEE,BWBAU,BWXBAU,BWSPR,BWLAE,BWTUR,BWXTUR,BWDAM,BWKOE,BWXKOE}; X static double maxanz= /* Bewegunsfreiheit am Anfang */ X 2* (8*BWXBAU + 2*BWSPR + 2*BWLAE + 2*BWXTUR + BWDAM + BWXKOE); X X wanz=0.; sanz=0.; /* loeschen */ X w_b=0; w_sl=0; w_td=0; X s_b=0; s_sl=0; s_td=0; X X for(pos=RAND*ZLEN,wanz=0.,sanz=0.;pos<GROE-RAND*ZLEN;pos++) X if(_istwei(dat->brett[pos])) X { X wanz+=bew[_figur(dat->brett[pos])]; X switch(_figur(dat->brett[pos])) X { X case BAU: /* Anzahl der Figuren */ X case XBAU: /* bestimmen */ X w_b++; X break; X case SPR: X case LAE: X w_sl++; X break; X case TUR: X case XTUR: X case DAM: X w_td++; X break; X } X } X else if(_istsch(dat->brett[pos])) X { X sanz+=bew[_figur(dat->brett[pos])]; X switch(_figur(dat->brett[pos])) X { X case BAU: /* Anzahl der Figuren */ X case XBAU: /* bestimmen */ X s_b++; X break; X case SPR: X case LAE: X s_sl++; X break; X case TUR: X case XTUR: X case DAM: X s_td++; X break; X } X } X X /*** Phasenerkennung ********************************************/ X X /* Bei Spielbeginn gibt es 16 Bauern und 14 Offiziere */ X X if(s_b+s_sl+s_td+w_b+w_sl+w_td == 0) /* Remis ? */ X phase=REMIS; X else if(!w_sl && !w_td) /* Weisser Koenig ohne Offiziere ? */ X phase=WKOEOO; X else if(!s_sl && !s_td) /* Schwarzer Koenig ohne Offiziere ? */ X phase=SKOEOO; X else if(w_b+s_b<=8 || w_sl+w_td+s_sl+s_td<=7) X phase=ENDSPI; /* Endspiel */ X else if(w_b+s_b<=12 || w_sl+w_td+s_sl+s_td<=12) X phase=MITTEL; /* Mittelspiel */ X else X phase=EROEFF; /* Eroeffnung */ X X /*** Ende Phasenerkennung ***************************************/ X X if(mode&8 && wanz != 0 && sanz != 0) /* Stufenanpassung ? */ X { X dat->minstufe= /* Rechentiefen */ X (int) ((double)mintiefe[stufe]*log(maxanz)/log(wanz+sanz)+.5); X dat->maxstufe= X (int) ((double)maxtiefe[stufe]*log(maxanz)/log(wanz+sanz)+.5); X if(dat->maxstufe%2 != 0) X dat->maxstufe--; X X /* Maximal doppelt */ X X if(dat->minstufe>mintiefe[stufe]*2) X dat->minstufe=mintiefe[stufe]*2; X X if(dat->maxstufe>maxtiefe[stufe]*2) X dat->maxstufe=maxtiefe[stufe]*2; X } X else X { X dat->minstufe=mintiefe[stufe]; X dat->maxstufe=maxtiefe[stufe]; X } } X /****************************************************************/ /* Zug aus Bibliothek suchen */ /****************************************************************/ /* Return: Zug oder 0 falls keiner gefunden */ /****************************************************************/ X WORD bib_zug() X { X int j,i,anz=0; X int mgl[MAXOP]; /* Liste mit mgl. Eroeffnungen */ X WORD ko[MAXSP]; /* Kombination */ X X if(!(mode&32) || noop<=0) /* Bibliothek aus ? */ X return((WORD)0); X X noop--; /* Bibl.zaehler erniedrigen */ X X if(mode&64) /* bestimmte Eroeffnung nehmen */ X { X i=testopnr; X X for(j=0;j<spdat.zuege && op[i][j]!=(WORD)0;j++) X if(archiv[j+1]->lzug!=op[i][j]) X break; /* passt nicht */ X X if(j==spdat.zuege && op[i][j]!=(WORD)0) X { /* passt */ X mgl[anz++]=i; X noop=OPTRYS; /* Bibl. wieder oeffnen */ X } X } X else X for(i=0;i<opnr;i++) /* Eroeffnungen testen */ X { X for(j=0;j<spdat.zuege;j++) /* Komb. erstellen */ X ko[j]=archiv[j+1]->lzug; X X ko[j]=(WORD)0; /* beenden */ X X X if(op_zug(ko,&op[i][0]) != (WORD)0) X { /* Zug gefunden */ X if(op_fa[i] & spdat.farbe) X mgl[anz++]=i; X /* Eroeffnung fuer die richtige Farbe */ X X noop=OPTRYS; /* Bibl. wieder oeffnen */ X /* ^ Wichtig ! Die Bib. muss auch er- */ X /* oeffnet werden, wenn die Farbe nicht */ X /* stimmt, da sonst beim naechsten Zug */ X /* fuer die andere Farbe nicht mehr */ X /* nachgesehen wird. */ X } X } X X if(anz == 0) X return((WORD)0); /* nix gefunden */ X X i=rand(); /* zufaellig beginnen */ X while(i>=anz) X i -= anz; X #ifdef ANALYSE /* einfache Analyse ein ? */ X if(mode & 128) X { X WORD komb[2]; /* Kombination */ X char str[STRLEN]; X X komb[0]=op[mgl[i]][spdat.zuege]; /* eintragen */ X komb[1]=(WORD)0; /* beenden */ X X strcpy(str,kombination(&spdat,komb)); X strcat(str," (Library)"); X ANALYSE(str); X } #endif X X return(op[mgl[i]][spdat.zuege]); /* gefunden */ } X static WORD op_zug(ko,er) X WORD *ko,*er; /* Kombination, Eroeffnung */ { X int len,i,j; X WORD ek[MAXSP]; /* Kopie der Eroeffnung */ X X len=spdat.zuege; /* Laenge der Kombination feststellen */ X X for(i=0;i<len+1;i++) /* er in ek kopieren */ X { X if(er[i]==(WORD)0) /* Kombination laenger als */ X return((WORD)0); /* Eroeffnung */ X X ek[i]=er[i]; X } X X ek[len]=(WORD)0; /* beenden */ X X for(i=0;i<len;i += 2) /* Weisse Zuege durchsuchen */ X { X for(j=0;j<len;j += 2) X if(ek[j]==ko[i]) /* Zug gefunden */ X { X ek[j]=(WORD)0; /* streichen */ X break; X } X X if(j>=len) /* Zug nicht gefunden */ X return((WORD)0); X } X X for(i=1;i<len;i += 2) /* Schwarze Zuege durchsuchen */ X { X for(j=1;j<len;j += 2) X if(ek[j]==ko[i]) /* Zug gefunden */ X { X ek[j]=(WORD)0; /* streichen */ X break; X } X X if(j>=len) /* Zug nicht gefunden */ X return((WORD)0); X } X X return(er[len]); /* Zug als Ergebnis */ } X /****************************************************************/ /* Eroeffungen aus Bibliothek testen */ /****************************************************************/ /* Return: 1: alles ok 0: Fehler */ /****************************************************************/ X int bib_test() X { X FILE *fp2,*fp=(FILE *)0; /* Filepointer */ X int zug; /* Zugnummer */ X int mode2; X char str[200*5]; X int i; X X mode2 = mode; /* retten */ X X mode &= !(1+128); /* Analyse aus */ X mode |= 32+64; /* Eroeffnungstest ein */ X X init(&spdat,1); /* Initialisierungen */ X X testopnr=0; /* Eroeffungsnummer */ X X if((fp2=fopen("chess.op","r"))==(FILE *)0) /* oeffnen */ X exit(1); /* Fehler */ X X while(testopnr<opnr) X { X while(!feof(fp2)) /* Eroeffnung suchen */ X { X fgets(str,999,fp2); /* einlesen */ X X i=0; X while(str[i]!='#' && str[i]!='\n' && str[i]!=0) X i++; X X str[i]=0; /* beenden */ X X if(strlen(str)) /* Keine Leerzeile ? */ X break; X } X X zug=0; /* erster Zug */ X fprintf(stderr,"%d/%d\n",testopnr+1,opnr); X X while((spdat.bzug=bib_zug())!=(WORD)0) /* Zug in Bib. ?*/ X { X if(zug_test(&spdat,spdat.bzug)) /* Testen */ X { X ziehe(&spdat,spdat.bzug);/* ziehen */ X archiviere(&spdat); /* speichern */ X zug++; X } X else /* Fehler ! */ X { X /* Fehlerfile oeffnen */ X if(fp==(FILE *)0) X fp=fopen("error.op","w"); X X fprintf(fp,"%d%c%d/%d:\n%s\n", X testopnr+1,TAB,zug/2+1,zug%2+1,str); X break; X } X } X X testopnr++; /* naechste Eroeffung */ X X init(&spdat,1); /* Initialisierungen */ X } X X mode=mode2; /* wieder herstellen */ X X fclose(fp2); X X if(fp!=(FILE *)0) /* Fehler gefunden ? */ X { X fclose(fp); /* schliessen */ X return(0); /* Fehler ! */ X } X else X return(1); /* alles ok */ } SHAR_EOF chmod 0644 ch/open.c || echo 'restore of ch/open.c failed' Wc_c="`wc -c < 'ch/open.c'`" test 7762 -eq "$Wc_c" || echo 'ch/open.c: original size 7762, current size' "$Wc_c" rm -f _shar_wnt_.tmp fi # ============= ch/stat.c ============== if test -f 'ch/stat.c' -a X"$1" != X"-c"; then echo 'x - skipping ch/stat.c (File already exists)' rm -f _shar_wnt_.tmp else > _shar_wnt_.tmp echo 'x - extracting ch/stat.c (Text)' sed 's/^X//' << 'SHAR_EOF' > 'ch/stat.c' && /****************************************************************/ /* */ /* XChess V2.7: Status */ /* */ /* (c) 1991 by Marc Laukien */ /* */ /****************************************************************/ X #include <string.h> #include <stdio.h> #include <ctype.h> #include "ch.h" /* Def. des Schachspiels */ #include "ph.h" /* Spielphase */ X /****************************************************************/ /* Status bestimmen */ /****************************************************************/ X void status_aus(dat,ret) X SPDAT *dat; /* Spieldaten */ char *ret[]; /* Antworten */ { X int anz; /* Zaehler */ X char bed; /* Bedrohung */ X int i; X X eff_stufe(dat); /* Phasenerkennung */ X X /*--- Test auf 3-fache Wiederholung --------------------*/ X X for(i=dat->zuege;i>=0;i--) /* Wdh. finden */ X if(archiv[i]->wdh != -1) X if(archiv[archiv[i]->wdh]->wdh!= -1) X break; /* gefunden */ X X if(i > -1) /* 3-fache Wiederholung */ X { X sprintf(ret[zaehler++],"3"); X return; X } X X /*--- Test, ob Koenige fehlen ---------------------------*/ X X if(dat->wkpos==(BYTE)0 && dat->skpos==(BYTE)0) X { X strcpy(ret[zaehler++],"r"); /* Remis */ X return; X } X else if(dat->wkpos==(BYTE)0) X { X strcpy(ret[zaehler++],"mw"); /* Weiss ist matt */ X return; X } X else if(dat->skpos==(BYTE)0) X { X strcpy(ret[zaehler++],"ms"); /* Schwarz ist matt */ X return; X } X X /*--- Spielphase auf Remis untersuchen -----------------*/ X X if(phase==REMIS) X { X strcpy(ret[zaehler++],"r"); X return; X } X X /*--- Test auf Matt und Patt und Schach ----------------*/ X X anz=zugliste(dat,(BYTE)0); /* Zuege bestimmen */ X X if(dat->farbe==WEI && bedrohung(dat,dat->wkpos)) X bed='w'; X else if(dat->farbe==SCH && bedrohung(dat,dat->skpos)) X bed='s'; X else X bed='\0'; X X if(!anz) /* Matt oder Patt ? */ X { X if(bed=='\0') /* Patt ? */ X strcpy(ret[zaehler++],"p"); X X else /* Matt */ X sprintf(ret[zaehler++],"m%c",bed); X } X else /* nur Schach oder nix */ X sprintf(ret[zaehler++],"%c",bed); } SHAR_EOF chmod 0644 ch/stat.c || echo 'restore of ch/stat.c failed' Wc_c="`wc -c < 'ch/stat.c'`" test 2027 -eq "$Wc_c" || echo 'ch/stat.c: original size 2027, current size' "$Wc_c" rm -f _shar_wnt_.tmp fi # ============= ad/main.c ============== if test ! -d 'ad'; then echo 'x - creating directory ad' mkdir 'ad' fi if test -f 'ad/main.c' -a X"$1" != X"-c"; then echo 'x - skipping ad/main.c (File already exists)' rm -f _shar_wnt_.tmp else > _shar_wnt_.tmp echo 'x - extracting ad/main.c (Text)' sed 's/^X//' << 'SHAR_EOF' > 'ad/main.c' && /****************************************************************/ /* */ /* XChess V2.7 Adapter: Curses */ /* */ /* (c) 1991 by Marc Laukien */ /* */ /* Programmteil: Hauptprogramm */ /* */ /****************************************************************/ X #include <curses.h> #include <stdio.h> #include <string.h> #include <fcntl.h> #include "ad.h" X char *pname; /* Prgname: argv[0] */ char *cwd; /* Working Directory */ char stdname[STRLEN]=""; /* Standardname fuers Speichern */ char def[STRLEN]=LANG; /* Definitionen */ int lock=0; /* Falls 1: Lock erworben */ int curses=0; /* Falls 1: Curses an */ int inter; /* Falls 1: Es war ein Interrupt*/ int break_pid= -1; /* Prozessid des Unterbrechers */ WINDOW *win=(WINDOW *)0; /* Subwindow */ WINDOW *setupwin=(WINDOW *)0; /* Setup-Subwindow */ X char farbe; /* w=weiss,s=schwarz */ int wei; /* 0=Spieler */ int sch; /* 1=Computer oder Gegener */ char gegner[STRLEN]; /* Spielgegner (leer:Computer) */ int level; /* Spielstufe */ int ende; /* 1:Matt oder Patt */ int modus; /* eingestellter Modus */ char ant[PTR][81]; /* Antworten */ char *ptr[PTR]; /* Pointer auf Antw. */ X int old_moves; /* Anzahl der Zuege bei Spielbeginn */ /* ^ Wird benoetigt, um festzustellen, ob beim Verlassen */ /* eines Turnierspieles gegen den Computer (regulaer oder */ /* durch Interrupt) Speichern noetig ist */ X extern void exit(); extern int umask(); X /****************************************************************/ /* Hauptprogramm */ /****************************************************************/ X int main(argc,argv,envp) X int argc; char *argv[]; char *envp[]; { X extern char *optarg; X extern int optind,opterr; X char c; X char str[STRLEN]; X int testop=0; /* Falls 1: Eroeffungen testen */ X int expire=0; /* Falls 1: Expire */ X int i; X X umask(077); /* Filecreationmask */ X X pname=argv[0]; /* Programmname */ X X for(i=0;i<PTR;i++) /* Pointer setzen */ X ptr[i]= &ant[i][0]; X X cwd=getcwd((char *)0,STRLEN); /* Directory retten */ X X if(chdir(WORKDIR)== -1) /* Directory aendern */ X { X fprintf(stderr, X "%s: unknown path %s\n",pname,WORKDIR); X exit(1); X } X X /* Optionen einlesen *******************************************/ X X opterr=1; X while((c=(char)getopt(argc,argv,"etd:"))!=EOF) X switch(c) X { X case 'd': /* andere Sprache */ X strcpy(def,optarg); X break; X X case 't': /* Eroeffungsbibliothek testen */ X testop=1; X break; X X case 'e': /* Expire */ X expire=1; X break; X X default: X case '?': /* Fehler */ X opterr++; X break; X } X X if(opterr>1) /* falsche Optionen */ X { X fprintf(stderr, X "usage: %s [-t] [-e] [-d file]\n",pname); X ad_deinit(); X exit(1); X } X X /* Ende Optionen einlesen **************************************/ X X if(testop) /* Eroeffungen testen */ X { X schach("testbib",ptr); X X if(ptr[0][0]=='?') /* Fehler ? */ X { X fprintf(stderr, X "%s: error in chess.op (see error.op for more information)\n",pname); X ad_deinit(); X exit(1); X } X else X fprintf(stderr,"%s: no errors in chess.op\n",pname); X X } X else if(expire) /* Expire ? */ X { X ad_expire(); X } X else /* Normales Spiel */ X { X ad_init(); /* initialsieren */ X X ad_admin(); /* Administrationsmenue */ X X ad_deinit(); /* deinitialsieren */ X } X X return(0); /* alles ok */ } SHAR_EOF chmod 0644 ad/main.c || echo 'restore of ad/main.c failed' Wc_c="`wc -c < 'ad/main.c'`" test 3355 -eq "$Wc_c" || echo 'ad/main.c: original size 3355, current size' "$Wc_c" rm -f _shar_wnt_.tmp fi # ============= ad/init.c ============== if test -f 'ad/init.c' -a X"$1" != X"-c"; then echo 'x - skipping ad/init.c (File already exists)' rm -f _shar_wnt_.tmp else > _shar_wnt_.tmp echo 'x - extracting ad/init.c (Text)' sed 's/^X//' << 'SHAR_EOF' > 'ad/init.c' && /****************************************************************/ /* */ /* XChess V2.7 Adapter: Curses */ /* */ /* (c) 1991 by Marc Laukien */ /* */ /* Programmteil: Initialisierungen */ /* */ /****************************************************************/ X #include <curses.h> #include <stdio.h> #include <signal.h> #include <string.h> #include "ad.h" X extern void exit(); X static struct termio term,oterm; /* Terminaldaten */ X /****************************************************************/ /* Initialisierungen */ /****************************************************************/ X void ad_init() { X int i,ch; X int pfd[2]; X X lex(); /* Strings einlesen */ X X if(startcmd[0]!=(char)0) X system(startcmd); /* Startkommando ausf. */ X X /**** Unterbrecher starten ****/ X X if(pipe(pfd)== -1) /* Pipe erzeugen */ X { /* Fehler ? */ X ad_error(""); X ad_deinit(); X exit(1); X } X X if((break_pid=fork())== -1) /* Fehler ? */ X { X ad_error(""); X ad_deinit(); X exit(1); X } X X if(break_pid==0) /* Sohn ? */ X { X close(1); /* Standardausgabe schliessen */ X dup(pfd[1]); /* neue Standardausgabe */ X close(pfd[0]); /* Pipes schliessen */ X close(pfd[1]); X execlp("./chbrk","./chbrk",(char *)0); /* starten */ X ad_error(""); X ad_deinit(); X exit(1); X } X else /* Vater ? */ X { X close(0); /* Standardeingabe schliessen */ X dup(pfd[0]); /* neue Standardeingabe */ X close(pfd[0]); /* Pipes schliessen */ X close(pfd[1]); X } X X /**** Ende Unterbrecher starten ****/ X X initscr(); /* Curses ein */ X curses=1; X X if(ioctl(1,TCGETA,&oterm)== -1) /* termio retten */ X { X ad_error(""); X ad_deinit(); X exit(1); X } X X if(ioctl(1,TCGETA,&term)== -1) /* termio holen */ X { X ad_error(""); X ad_deinit(); X exit(1); X } X X term.c_cc[VEOF]=1; /* veraendern */ X term.c_cc[VEOL]=1; X term.c_lflag &= ~(ICANON | ECHO); X X if(ioctl(1,TCSETA,&term)) X { X ad_error(""); X ad_deinit(); X exit(1); X } X X ad_startint(); /* Interrupt starten */ } X /****************************************************************/ /* Deinitialisierungen */ /****************************************************************/ X void ad_deinit() { X if(break_pid!= -1) /* Unterbrecher laeuft ?*/ X kill(break_pid,SIGTERM);/* beenden */ X X if(lock==1) /* Lock erworben ? */ X ad_unlock(); /* freigeben */ X X if(curses==1) /* Curses an ? */ X { X char s[STRLEN]; X X ioctl(1,TCSETA,&oterm); /* termio herstellen */ X endwin(); /* Curses aus */ X X if(stdname[0]!='\0' && !ende && UEBUNG()) X { X ad_lock(); X sprintf(s,"save %s",stdname); X schach(s,ptr); /* Speichern */ X ad_unlock(); X } X X if(stdname[0]!='\0' && !ende && TURNCOM()) X { X schach("info",ptr); /* Info holen */ X X if(atoi(ptr[1]) != old_moves) X { /* veraendert ? */ X ad_lock(); X sprintf(s,"save %s",stdname); X schach(s,ptr); /* Speichern */ X ad_unlock(); X } X } X } X X fflush(stdout); /* Buffer leeren */ X fflush(stdin); X X chdir(cwd); /* Directory herstellen */ } X /****************************************************************/ /* Neustart */ /****************************************************************/ X void ad_new() { X static int first=1; X X if(first) /* Laden der Bib. einmal anzeigen */ X { X ad_msg(load_lib); X first=0; X } X X schach("init",ptr); /* Initialsieren */ X if(ptr[0][0]=='?') /* Fehler ? */ X { X ad_error(""); X ad_deinit(); X exit(1); X } X schach("stufe 2",ptr); /* Stufe einstellen */ X X if(UEBUNG()) /* Uebungsspiel ? */ X { X char str[STRLEN]; X X sprintf(str,"stufe %d",atoi(tr_lv)-1); X schach(str,ptr); /* Level einstellen */ X X wei=0; /* 0=Spieler */ X sch=1; /* 1=Computer */ X } X X if(TURNIER()) /* Turnierspiel */ X { X char str[STRLEN]; X X sprintf(str,"stufe %d",atoi(to_lv)-1); X schach(str,ptr); /* Level einstellen */ X } X X ende=0; /* 1:Matt oder Patt */ X X ad_brett(); /* Brett aufbauen */ X X schach("info",ptr); /* Info holen */ X modus = atoi(ptr[9]); /* merken */ X farbe = ptr[0][0]; X level = atoi(ptr[6]); X X X ad_menu(); /* Menue ausgeben */ X X move(23,79); /* Cursor weg */ } X /****************************************************************/ /* Partie loeschen */ /****************************************************************/ X void ad_remove() { X char str[STRLEN*2]; X X if(stdname[0]=='\0') /* Kein Name definiert ? */ X return; X X sprintf(str,"%s/%s.ch",WORKDIR,stdname); X unlink(str); X X sprintf(str,"%s/%s.lock",WORKDIR,stdname); X unlink(str); } SHAR_EOF chmod 0644 ad/init.c || echo 'restore of ad/init.c failed' Wc_c="`wc -c < 'ad/init.c'`" test 4435 -eq "$Wc_c" || echo 'ad/init.c: original size 4435, current size' "$Wc_c" rm -f _shar_wnt_.tmp fi # ============= ad/utility.c ============== if test -f 'ad/utility.c' -a X"$1" != X"-c"; then echo 'x - skipping ad/utility.c (File already exists)' rm -f _shar_wnt_.tmp else > _shar_wnt_.tmp echo 'x - extracting ad/utility.c (Text)' sed 's/^X//' << 'SHAR_EOF' > 'ad/utility.c' && /****************************************************************/ /* */ /* XChess V2.7 Adapter: Curses */ /* */ /* (c) 1991 by Marc Laukien */ /* */ /* Programmteil: Utilities */ /* */ /****************************************************************/ X #include <curses.h> #include <stdio.h> #include <ctype.h> #include <signal.h> #include <fcntl.h> #include <pwd.h> #include "ad.h" X static char ad_convert(); /* Vorwaerstdeklaration */ X /****************************************************************/ /* Brett aufbauen */ /****************************************************************/ X void ad_brett() X { X int x=0,y=0; /* Koordinaten */ X int ch; X int i; X static char fig[]="KDTTLLSSBBBBBBBB"; /* Figuren */ X int wfig[16]; /* schw. Fig. */ X int sfig[16]; /* wei. Fig */ X X schach("brett",ptr); /* ausfuehren */ X X for(i=0;i<16;i++) /* loeschen */ X { X wfig[i]=(int)ad_convert(tolower(fig[i]))|A_BOLD; X sfig[i]=(int)ad_convert(fig[i])|A_REVERSE; X } X X for(y=0;y<8;y++) /* Koordinaten durchgehen */ X for(x=0;x<8;x++) X { X ch=(int)ant[y][x*2]; X X if(islower(ch)) /* weiss ? */ X { X for(i=0;i<16;i++) /* durchsuchen */ X if((char)wfig[i]==ad_convert((char)ch)) X { /* eintragen */ X wfig[i]=(int)ad_convert('.'); X break; X } X X ch = (int)ad_convert((char)ch)|A_BOLD; X /* hell */ X } X else if(isupper(ch)) /* schwarz ? */ X { X for(i=0;i<16;i++) /* durchsuchen */ X if((char)sfig[i]==ad_convert((char)ch)) X { /* eintragen */ X sfig[i]=(int)ad_convert('.'); X break; X } X X ch = (int)ad_convert((char)ch)|A_REVERSE; X /* invers */ X } X else if(ch==(int)'.') /* leer ? */ X { X ch = (int)ad_convert((char)ch); X if(!(x%2 ^ y%2)) /* schwarzes Feld ? */ X ch |= A_REVERSE|A_BOLD; X else X ch |= A_BOLD; X } X X mvaddch(y*3+1,x*5+3,ch); /* eintragen */ X } X X move(20,8*5+3); /* geschl. schw. Fig ausgeben */ X for(i=0;i<16;i++) X { X addch(sfig[i]); X addch((int)' '); X } X move(21,8*5+3); /* geschl. weisse Fig ausgeben */ X for(i=0;i<16;i++) X { X addch(wfig[i]); X addch((int)' '); X } X X ad_status(); /* Status ausgeben */ } X static char ad_convert(ch) /* Figur umwandeln */ X char ch; { X char ret; X X ret=ch; /* Returnwert */ X X switch(ch) X { X case 'b': /* Bauer */ X ret=figtab[0]; X break; X case 's': /* Springer */ X ret=figtab[1]; X break; X case 'l': /* Laeufer */ X ret=figtab[2]; X break; X case 't': /* Turm */ X ret=figtab[3]; X break; X case 'd': /* Dame */ X ret=figtab[4]; X break; X case 'k': /* Koenig */ X ret=figtab[5]; X break; X case 'B': /* Bauer */ X ret=figtab[6]; X break; X case 'S': /* Springer */ X ret=figtab[7]; X break; X case 'L': /* Laeufer */ X ret=figtab[8]; X break; X case 'T': /* Turm */ X ret=figtab[9]; X break; X case 'D': /* Dame */ X ret=figtab[10]; X break; X case 'K': /* Koenig */ X ret=figtab[11]; X break; X case '.': /* Koenig */ X ret=figtab[12]; X break; X } X X return(ret); } X /****************************************************************/ /* Status ausgeben */ /****************************************************************/ X void ad_status() X { X int i; X X attrset(0); /* Alle Attribute aus */ X X schach("status",ptr); /* ausfuehren */ X ende=0; X move(3,MPOS); X X if(!strcmp(ptr[0],"p")) /* Patt */ X { X addstr(patt); X ende=PATT; X } X else if(!strcmp(ptr[0],"r")) /* Remis */ X { X addstr(patt); X ende=PATT; X } X else if(!strcmp(ptr[0],"mw")) /* Matt Weiss */ X { X addstr(w_mate); X ende=W_MATT; X } X else if(!strcmp(ptr[0],"ms")) /* Matt Schwarz */ X { X addstr(b_mate); X ende=S_MATT; X } X else if(!strcmp(ptr[0],"w")) /* Schach Weiss */ X addstr(w_chess); X else if(!strcmp(ptr[0],"s")) /* Schach Schwarz */ X addstr(b_chess); X else if(!strcmp(ptr[0],"3")) /* Dreifache Wiederholung */ X { X addstr(remis_3); X ende=1; X } X X for(i=stdscr->_curx;i<79;i++) /* Rest der Zeile loeschen */ X mvaddch(stdscr->_cury,i,(int)' '); X X move(23,79); } X /****************************************************************/ /* Eigenes read() */ /****************************************************************/ X int ad_read(fd,buf,num) X int fd; /* Filedeskriptor */ char *buf; /* Buffer */ int num; /* Anzahl der Zeichen */ X { X int ret; /* Returnwert */ X X do X { X inter=0; /* Interrupt ruecksetzen */ X ret=read(fd,buf,num); /* Zeichen lesen */ X } while(inter==1); X X return(ret); } X /****************************************************************/ /* Eingabebuffer leeren */ /****************************************************************/ X void ad_flush() { X int flags; /* Flags fuer read() */ X char c; X X flags=fcntl(0,F_GETFL,0); /* flags retten */ X X /* Buffer leeren */ X fcntl(0,F_SETFL,flags | O_NDELAY); /* blockierung aus */ X while(read(0,&c,1)); /* Zeichen lesen */ X fcntl(0,F_SETFL,flags & ~O_NDELAY); /* blockierung ein */ } SHAR_EOF chmod 0644 ad/utility.c || echo 'restore of ad/utility.c failed' Wc_c="`wc -c < 'ad/utility.c'`" test 4819 -eq "$Wc_c" || echo 'ad/utility.c: original size 4819, current size' "$Wc_c" rm -f _shar_wnt_.tmp fi # ============= ad/monitor.c ============== if test -f 'ad/monitor.c' -a X"$1" != X"-c"; then echo 'x - skipping ad/monitor.c (File already exists)' rm -f _shar_wnt_.tmp else > _shar_wnt_.tmp echo 'x - extracting ad/monitor.c (Text)' sed 's/^X//' << 'SHAR_EOF' > 'ad/monitor.c' && /****************************************************************/ /* */ /* XChess V2.7 Adapter: Curses */ /* */ /* (c) 1991 by Marc Laukien */ /* */ /* Programmteil: Analyse */ /* */ /****************************************************************/ X #include <curses.h> #include "ad.h" X /****************************************************************/ /* Analyse ausgeben */ /****************************************************************/ X void ad_analyse(str) X char *str; { X int i; X X move(23,0); /* an die Ausgabestelle gehen */ X attrset(A_REVERSE); X addstr(str); /* ausgeben */ X attrset(0); X for(i=0+strlen(str);i<79;i++) /* loeschen */ X addch((int)' '|A_REVERSE); X refresh(); /* ausgeben */ } SHAR_EOF chmod 0644 ad/monitor.c || echo 'restore of ad/monitor.c failed' Wc_c="`wc -c < 'ad/monitor.c'`" test 752 -eq "$Wc_c" || echo 'ad/monitor.c: original size 752, current size' "$Wc_c" rm -f _shar_wnt_.tmp fi # ============= ad/window.c ============== if test -f 'ad/window.c' -a X"$1" != X"-c"; then echo 'x - skipping ad/window.c (File already exists)' rm -f _shar_wnt_.tmp else > _shar_wnt_.tmp echo 'x - extracting ad/window.c (Text)' sed 's/^X//' << 'SHAR_EOF' > 'ad/window.c' && /****************************************************************/ /* */ /* XChess V2.7 Adapter: Curses */ /* */ /* (c) 1991 by Marc Laukien */ /* */ /* Programmteil: Windows */ /* */ /****************************************************************/ X #include <curses.h> #include <stdio.h> #include <ctype.h> #include <string.h> #include "ad.h" X /****************************************************************/ /* info ausgeben */ /****************************************************************/ X void ad_info() X { X char str[STRLEN]; /* String */ X int l=2; /* Zeile */ X int nr=0; /* Ausgabe Nummer */ X char c; X X schach("info",ptr); /* ausfuehren */ X X win=newwin(15,35,4,3); /* neues Window */ X box(win,0,0); /* mit Rahmen */ X X farbe=ptr[nr][0]; /* FARBE */ X sprintf(str,"%s%s",info[0],ptr[nr++][0]=='w'?white:black); X wmove(win,l++,2); /* positionieren */ X waddstr(win,str); /* ausgeben */ X X sprintf(str,"%s%s",info[1],ptr[nr++]); /* ZUEGE */ X wmove(win,l++,2); /* positionieren */ X waddstr(win,str); /* ausgeben */ X X sprintf(str,"%s%s",info[2],ptr[nr++]); /* WERTUNG */ X wmove(win,l++,2); /* positionieren */ X waddstr(win,str); /* ausgeben */ X X sprintf(str,"%s%s",info[3],ptr[nr++]); /* VARIANTEN */ X wmove(win,l++,2); /* positionieren */ X waddstr(win,str); /* ausgeben */ X X sprintf(str,"%s%s",info[4],ptr[nr++]); /* VAR/SEK */ X wmove(win,l++,2); /* positionieren */ X waddstr(win,str); /* ausgeben */ X X sprintf(str,"%s%s",info[5],ptr[nr++]); /* DURCHSCHNITT */ X wmove(win,l++,2); /* positionieren */ X waddstr(win,str); /* ausgeben */ X X sprintf(str,"%s%d",info[6],atoi(ptr[nr++])+1); /* STUFE*/ X wmove(win,l++,2); /* positionieren */ X waddstr(win,str); /* ausgeben */ X X sprintf(str,"%s%s",info[7],ptr[nr++]); /* TIEFE MIN */ X wmove(win,l++,2); /* positionieren */ X waddstr(win,str); /* ausgeben */ X X sprintf(str,"%s%s",info[8],ptr[nr++]); /* TIEFE MAX */ X wmove(win,l++,2); /* positionieren */ X waddstr(win,str); /* ausgeben */ X X nr++; /* MODE wird nicht benoetigt */ X X sprintf(str,"%s%s",info[9],ptr[nr++]); /* LETZTER ZUG */ X wmove(win,l++,2); /* positionieren */ X waddstr(win,str); /* ausgeben */ X X wmove(win,l++,2); /* positionieren */ X waddstr(win,press_key); /* TASTE */ X wrefresh(win); /* ausgeben */ X move(23,79); X refresh(); X X ad_read(0,&c,1); /* auf Taste warten */ X X delwin(win); /* Fenster aus */ X win=(WINDOW *)0; X touchwin(stdscr); } X /****************************************************************/ /* Filenamen/Gegnernamen einlesen */ /****************************************************************/ X char *ad_name(mode) X char mode; /* f = Filename g = Gegner */ { X char str[STRLEN]; /* String */ X static char s[STRLEN]; /* Return-String */ X char c; /* Zeichen */ X int i=0; X X if(mode!='g' && mode !='f') /* Fehler ? */ X return(""); X X win=newwin(3,60,10,10); /* neues Window */ X box(win,0,0); /* mit Rahmen */ X wmove(win,1,1); X waddstr(win,mode=='f' ? enter:opponent); X wmove(win,1,1+strlen(mode=='f' ? enter:opponent)); X X str[i]=0; /* loeschen */ X X do X { X wrefresh(win); /* ausgeben */ X ad_read(0,&c,1); /* Zeichen einlesen */ X X if(c=='\b' && i>0) /* Backspace */ X { X waddstr(win,"\b \b"); X str[--i]=0; X } X X if(c==127) /* Delete */ X while(i>0) X { X waddstr(win,"\b \b"); X str[--i]=0; X } X X if(isprint(c) && X (mode == 'f' ? i<5 : i<57-strlen(opponent)) X && c!='/' && c!='.' && c!=' ') X { X waddch(win,(int)c); /* ausgeben */ X str[i]=c; X str[++i]=0; X } X } X while(c!='\n' && c!=(char)13); X X wrefresh(win); /* ausgeben */ X delwin(win); /* Fenster aus */ X win=(WINDOW *)0; X X move(23,79); X touchwin(stdscr); X wnoutrefresh(stdscr); X if(setupwin != (WINDOW *)0) X { X touchwin(setupwin); X wnoutrefresh(setupwin); X } X doupdate(); X X if(mode=='f') X { X sprintf(s,"training/%s.",ad_id(getlogin())); X /* Pfad dazu */ X strcat(s,str); X } X else X strcpy(s,str); /* ohne Pfad */ X X return(s); } X /****************************************************************/ /* Fehlermeldung */ /****************************************************************/ X void ad_error(s) X char *s; { X char str[STRLEN]; /* String */ X char c; X X if(curses) /* Curses an ? */ X { X if(s[0]==0) /* externer Fehler ? */ X sprintf(str,"%s%s",error,sys_errlist[errno]); X else /* interner Fehler ? */ X sprintf(str,"%s%s",error,s); X X win=newwin(3,60,10,10); /* neues Window */ X box(win,0,0); /* mit Rahmen */ X wmove(win,1,1); X waddstr(win,str); X wmove(win,1,59-strlen(press_key)); X waddstr(win,press_key); X X refresh(); X wrefresh(win); /* ausgeben */ X move(23,79); X refresh(); X X ad_read(0,&c,1); /* auf Taste warten */ X X delwin(win); /* Fenster aus */ X win=(WINDOW *)0; X X move(23,79); X touchwin(stdscr); X wnoutrefresh(stdscr); X if(setupwin != (WINDOW *)0) X { X touchwin(setupwin); X wnoutrefresh(setupwin); X } X doupdate(); X } X else X fprintf(stderr,"%s: %s\n",pname,sys_errlist[errno]); } X /****************************************************************/ /* Meldung */ /****************************************************************/ X void ad_msg(s) X char *s; { X int i; X X win=newwin(2,80,22,0); /* neues Window */ X wmove(win,0,0); X for(i=0;i<80;i++) /* Linie */ X waddch(win,(int)'-'); X X wmove(win,1,39-strlen(s)/2); X waddstr(win,s); X X refresh(); X wrefresh(win); /* ausgeben */ X move(23,79); X refresh(); X X delwin(win); /* Fenster aus */ X win=(WINDOW *)0; X X move(23,79); X touchwin(stdscr); X wnoutrefresh(stdscr); X if(setupwin != (WINDOW *)0) X { X touchwin(setupwin); X wnoutrefresh(setupwin); X } } X /****************************************************************/ /* Sicherheitsabfrage */ /****************************************************************/ /* Return: 0-nein 1-ja */ /****************************************************************/ X int ad_sure(mode) X char mode; /* s = Sicher ? a = Aufgeben ? */ { X char c; /* Zeichen */ X char *str; X X if(mode=='s') X str=sure; X else if(mode=='a') X str=give_up; X else X return(0); X X win=newwin(3,60,10,10); /* neues Window */ X box(win,0,0); /* mit Rahmen */ X wmove(win,1,1+(58-strlen(str+2))/2); X waddstr(win,str+2); X X wrefresh(win); /* ausgeben */ X move(23,79); X refresh(); X X do X { X ad_read(0,&c,1); /* auf Taste warten */ X X if(isupper(c)) /* klein machen */ X c=tolower(c); X X if(c!=str[0] && c!=str[1]) SHAR_EOF true || echo 'restore of ad/window.c failed' fi echo 'End of UnixChess part 2' echo 'File ad/window.c is continued in part 3' echo 3 > _shar_seq_.tmp exit 0 -- / | -: Marc Laukien :- | /__ | | _ _ __ / \ /_ / / | ml@brumuc.muc.sub.org | / \/ | / / / /____/ / /__/ | sigma@salyko.doit.sub.org | / | /__/ /__