/*
        sieg.c    -   Ein Teil von Gambler

        (c) by Guido Appenzeller - Landessternwarte - 6900 Heidelberg

*/

#include "gambler.h"

extern struct Spielregeln SR;
extern char               Compressed[350];
extern char               BestMove[350];
extern int                CLength;
extern int                Slt[2];
extern int                Spielfeld[50][50];
extern int                Hilfsfeld[50][50];
extern int                EndFlag;
extern int                WinNr;

/* --- Der Zuggenerator mit Hilfsroutinen --------------------------- */

int Sieg(St1,SpielerNr)
int St1[50][50];
int SpielerNr;
{
    int t,g,i,s0,s1,s2,s3,h,b,z,z2;
    int SteinZahl[2];
    long sf;

    sf = SR.Siegflags[SpielerNr];

    s0 = SR.Siegzahl[0][SpielerNr];
    s1 = SR.Siegzahl[1][SpielerNr];
    s2 = SR.Siegzahl[2][SpielerNr];
    s3 = SR.Siegzahl[3][SpielerNr];

    h = SR.Bretthoehe;
    b = SR.Brettbreite;

    SteinZahl[0] = Slt[0];
    SteinZahl[1] = Slt[1];

    if( (sf & S_REIHE_H) >0 )
        {
          for( g=0; g < h; g++)
           {
            z=0;
            for( t=0; t < b; t++ )
                {
                    if( St1[t][g] == (SpielerNr+1) ) z++;
                    else z=0;
                    if( z == s0 )
                        {
                            WinNr = SpielerNr;
                            return(1);
                        }
                }
           }
        }

    if( (sf & S_REIHE_V) >0 )
        {
          for( t=0; t < b; t++)
           {
            z=0;
            for( g=0; g < h; g++ )
                {
                    if( St1[t][g] == (SpielerNr+1) ) z++;
                    else z=0;
                    if( z == s0 )
                        {
                            WinNr = SpielerNr;
                            return(1);
                        }
                }
           }
        }

    if( (sf & S_REIHE_D) >0 )
        {
          for( t=0; t <= (b-s0); t++)
           {
            z=0; z2=0; i=t; g=0;
            do {
                    if( St1[i][g] == (SpielerNr+1) ) z++;
                    else z=0;
                    if( St1[b-i-1][g] == (SpielerNr+1) ) z2++;
                    else z2=0;
                    if( (z == s0) || (z2 == s0) )
                        {
                            WinNr = SpielerNr;
                            return(1);
                        }
                } while( (++i < b) && (++g < h) );
           }

          for( t=0; t <= (h-s0); t++)
           {
            z=0; z2=0; g=t; i=0;
            do  {
                    if( St1[i][g] == (SpielerNr+1) ) z++;
                    else z=0;
                    if( St1[b-i-1][g] == (SpielerNr+1) ) z2++;
                    else z2=0;
                    if( (z == s0) || (z2 == s0) )
                        {
                            WinNr = SpielerNr;
                            return(1);
                        }
                } while( (i++ < b) && (g++ < h) );
           }
        }

    if( (sf & S_SPALTE) >0 )
        {
            if( s0 != 99 )
                for( t=0; t<h; t++ )
                    if( St1[t][s0] == (SpielerNr+1) )
                        {
                            WinNr = SpielerNr;
                            return(1);
                        }
            if( s1 != 99 )
                for( t=0; t<b; t++ )
                    if( St1[s1][t] == (SpielerNr+1) )
                        {
                            WinNr = SpielerNr;
                            return(1);
                        }
        }

    for( t=0; t < b; t++)
        for( g=0; g < h; g++ )
          {
            if( (St1[t][g] == 1) || (St1[t][g] == 3) )
              {
                SteinZahl[0]++;
                if( SR.SteineFlags[ St1[t][g]-1 ] & UMTAUSCH )
                    if( (SR.Siegzahl[0][0] == g) || (SR.Siegzahl[1][0] == t))
                       St1[t][g] = 3;
              }

            if( (St1[t][g] == 2) || (St1[t][g] == 4) )
              {
                SteinZahl[1]++;
                if( SR.SteineFlags[ St1[t][g]-1 ] & UMTAUSCH )
                   if( (SR.Siegzahl[0][1] == g) || (SR.Siegzahl[1][1] == t))
                       St1[t][g] = 4;
              }
          }

    if( SteinZahl[SpielerNr] == NULL )
        {
            if( sf & S_KEINSTEIN ) WinNr = SpielerNr;
            else                   WinNr = 1-SpielerNr;
            return(1);
        }

    if( SteinZahl[1-SpielerNr] == NULL )
        {
            if( sf & S_KEINSTEIN ) WinNr = 1-SpielerNr;
            else                   WinNr = SpielerNr;
            return(1);
        }


    return(0);

}

