UnixChess02/10
Marc Laukien
ml at brumuc.muc.sub.org
Mon May 20 10:31:04 AEST 1991
Submitted-by: ml at 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 at brumuc.muc.sub.org | / \/ | / / /
/____/ / /__/ | sigma at salyko.doit.sub.org | / | /__/ /__
More information about the Alt.sources
mailing list