/*
 * Die Funktionen Dateiausdrucken und SpielstaerkeAnzeige
 * von rz am 15/12/92 zusätzlich implementiert, ebenso
 * die Ausgabe des aktuellen Status in der Screenleiste
 */

/* Brett.c */

#include "Adt.h"

extern void SpielstaerkeAnzeige(void);

struct Ereignis * WarteEreignis();
struct Zugstat * BesterZug();

 /* globales Spielbrett: */
Figur s[ 9 ][ 9 ];

 /* Spielstärke: 2 = leicht, 3 = schwerer etc. */
int Spielstaerke=2;

main()
{
    int i, j, spende;
    struct Ereignis *e;
    struct Zugstat *zs;
    Special sp;

    OeffneDisplay();
    if( !WillLaden( s, &sp ) ) {

         /* Spielbrett initialisieren: */
        s[ 1 ][ 1 ] = wturm;        s[ 1 ][ 8 ] = sturm;
        s[ 2 ][ 1 ] = wspringer;    s[ 2 ][ 8 ] = sspringer;
        s[ 3 ][ 1 ] = wlaeufer;     s[ 3 ][ 8 ] = slaeufer;
        s[ 4 ][ 1 ] = wdame;        s[ 4 ][ 8 ] = sdame;
        s[ 5 ][ 1 ] = wkoenig;      s[ 5 ][ 8 ] = skoenig;
        s[ 6 ][ 1 ] = wlaeufer;     s[ 6 ][ 8 ] = slaeufer;
        s[ 7 ][ 1 ] = wspringer;    s[ 7 ][ 8 ] = sspringer;
        s[ 8 ][ 1 ] = wturm;        s[ 8 ][ 8 ] = sturm;
        for( i=1; i<=8; i++ ){
            s[ i ][ 2 ] = wbauer;   s[ i ][ 7 ] = sbauer;
            for( j=3; j<=6; j++ )
                s[ i ][ j ] = leer;
        }
        sp = wroch | sroch;
    }

    ZeichneBrett( s, weiss );

    SpielstaerkeAnzeige();

    spende = 0;
    while( 1 ) {
        e = WarteEreignis( s, weiss );
        switch( e->ereignistyp ) {
        case zugs:
            if( !spende ) {
                ZeichneStat( s, 0L );
                ZeichneZug( s, &(e->zug), weiss, &sp );
                if( IstSchach( s, schwarz, 0, sp ) )
                    if( IstMatt( s, schwarz, sp ) ) {
                            NotierAdd( "++" );
                            NotierZug( "-Matt-" );
                            spende = 1; break;
                        } else
                            NotierAdd( " +" );
                if( IstPatt( s, schwarz, sp ) ) {
                    NotierZug( "-Patt-" );
                    spende = 1; break;
                }
                zs = BesterZug( s, schwarz, Spielstaerke, sp );
                ZeichneZug( s, &(zs->zug), weiss, &sp );
                ZeichneStat( s, zs );
                if( IstSchach( s, weiss, 0, sp ) )
                    if( IstMatt( s, weiss, sp ) ) {
                        NotierAdd( "++" );
                        NotierZug( "-Matt-" );
                        spende = 1; break;
                    } else
                        NotierAdd( " +" );
                if( IstPatt( s, weiss, sp ) ) {
                    NotierZug( "-Patt-" );
                    spende = 1; break;
                }
            }
            break;
        case ende:
            if( WillBeenden( s, sp ) ) {
                SchliesseDisplay();
                exit( 0 );
            }
            break;
        }
    }
}

ZeichneZug( s, z, fa, sp )
    Figur s[ 9 ][ 9 ];
    struct Zug *z;
    Farbe fa;
    Special *sp;
{
    char notat[ 7 ], *st;
    int sx, sy, zx, zy;
    Figur fi;

     /* ausführliche Notation: */
    switch( z->figur & figmask ) {
    case bauer:     notat[ 0 ] = ' ';   break;
    case springer:  notat[ 0 ] = 'S';   break;
    case laeufer:   notat[ 0 ] = 'L';   break;
    case turm:      notat[ 0 ] = 'T';   break;
    case dame:      notat[ 0 ] = 'D';   break;
    case koenig:    notat[ 0 ] = 'K';   break;
    }
    sx = z->start >> 4; sy = z->start & yposmask;
    zx = z->ziel >> 4;  zy = z->ziel & yposmask;
    notat[ 1 ] = sx-1+'a';
    notat[ 2 ] = sy+'0';
    notat[ 3 ] = s[ zx ][ zy ] == leer ? '-' : 'x';
    notat[ 4 ] = zx-1+'a';
    notat[ 5 ] = zy+'0';
    notat[ 6 ] = 0;
    st = ( notat[ 0 ] == ' ' ) ? &(notat[ 1 ]) : notat;

     /* Special - Variable aktualisieren: */
    *sp &= ~epmask;
    if( (z->figur&figmask)==bauer && (zy-sy==2 || sy-zy==2) )
	*sp |= sx;
    if( (z->figur&figmask)==koenig )
	if( (z->figur&farbmask)==weiss )
	    *sp &= ~wroch;
	else
	    *sp &= ~sroch;
    if( (z->figur&figmask)==turm )
	if( (z->figur&farbmask)==weiss ) {
	    if( sx==1 )
		*sp &= ~wlroch;
	    else if( sx==8 )
		*sp &= ~wkroch;
	} else
	    if( sx==1 )
		*sp &= ~slroch;
	    else if( sx==8 )
		*sp &= ~skroch;

     /* Zug ausführen */
    fi = s[zx][zy]; s[sx][sy] = leer;
    if( (z->figur&figmask)==koenig && (zx-sx==2 || sx-zx==2) ) {
	s[zx][zy] = z->figur;
	if( zx==7 ) {
	    s[6][sy] = s[8][sy]; s[8][sy] = leer;
	    NotierZug( "O-O" );
	} else {
	    s[4][sy] = s[1][sy]; s[1][sy] = leer;
	    NotierZug( "O-O-O" );
	}
    } else if( (z->figur&figmask)==bauer && fi==leer && sx!=zx ) {
	s[zx][zy] = z->figur; s[zx][sy] = leer;
	notat[3] = 'x';
	NotierZug( st );
	NotierAdd( "ep" );
    } else if( (z->figur&figmask)==bauer && (zy==1 || zy==8) ) {
	s[zx][zy] = (z->figur&farbmask)|dame;
	NotierZug( st );
	NotierAdd( "D" );
    } else {
	NotierZug( st );
	s[zx][zy] = z->figur;
    }

     /* Zug sichtbar machen: */
    BlinkFeld( z->start, fa );
    ZeichneFigur( leer, z->start, fa );
    ZeichneFigur( s[ zx ][ zy ], z->ziel, fa );
    if( (z->figur&figmask)==koenig && (zx-sx==2 || sx-zx==2) )
	if( zx-sx==2 ) {
	    ZeichneFigur( s[8][sy], 8<<4|sy, fa );
	    ZeichneFigur( s[6][sy], 6<<4|sy, fa );
	} else {
	    ZeichneFigur( s[1][sy], 1<<4|sy, fa );
	    ZeichneFigur( s[4][sy], 4<<4|sy, fa );
	}
    if( (z->figur&figmask)==bauer && sx!=zx )
	ZeichneFigur( s[zx][sy], zx<<4|sy, fa );
    BlinkFeld( z->ziel, fa );
}
