/*


        zug2.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                ZX[8],ZY[8];
extern int                EndFlag,WinNr;

/* --- Sucht nach unvollständigen Reihen der Länge LAENGE -------------- */

int ZaehleReihen(Laenge,SpielerNr)
int Laenge,SpielerNr;
{

    int     Wertung,b,h,t,g,z1,z2,z3,z4,i,n1,n2,n3,n4;
    long    sf;

    sf = SR.Siegflags[SpielerNr];

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

    Wertung = 0;

    if( (sf & S_REIHE_H) >0 )
        {
          for( g=0; g < h; g++)
           {
            z1=0; n1=0; z2=0; n2=0;
            for( t=0; t < b; t++ )
             {
               if( Hilfsfeld[t][g] == (SpielerNr+1) ){z1++;z2=0;n2=0;}
               if( Hilfsfeld[t][g] == (2-SpielerNr) ){z2++;z1=0;n1=0;}
               if( Hilfsfeld[t][g] ==      7   ){z1=0;z2=0;n1=0;n2=0;}
               if( Hilfsfeld[t][g] == NULL )
                 {
                    n1 = ++z1; z1=0;
                    n2 = ++z2; z2=0;
                 }
               if( (n1+z1) >= Laenge ) Wertung = Wertung + 20;
               if( (n2+z2) >= Laenge ) Wertung = Wertung - 100;
             }
           }
        }

      if( (sf & S_REIHE_V) >0 )
        {
          for( t=0; t < b; t++)
           {
            z1=0; n1=0; z2=0; n2=0;
            for( g=0; g < h; g++ )
             {
               if( Hilfsfeld[t][g] == (SpielerNr+1) ){z1++;z2=0;n2=0;}
               if( Hilfsfeld[t][g] == (2-SpielerNr) ){z2++;z1=0;n1=0;}
               if( Hilfsfeld[t][g] ==      7   ){z1=0;z2=0;n1=0;n2=0;}
               if( Hilfsfeld[t][g] == NULL )
                 {
                    n1 = ++z1; z1=0;
                    n2 = ++z2; z2=0;
                 }
               if( (n1+z1) >= Laenge ) Wertung = Wertung + 20;
               if( (n2+z2) >= Laenge ) Wertung = Wertung - 100;
             }
           }
        }

    if( (sf & S_REIHE_D) >0 )
      {
        for( t=0; t <= (b-Laenge); t++)
         {
          z1=0; n1=0; z2=0; n2=0;
          z3=0; n3=0; z4=0; n4=0;
          i = t; g = 0;
          do {
               if( Hilfsfeld[i][g] == (SpielerNr+1) ){z1++;z2=0;n2=0;}
               if( Hilfsfeld[i][g] == (2-SpielerNr) ){z2++;z1=0;n1=0;}
               if( Hilfsfeld[t][g] ==      7   ){z1=0;z2=0;n1=0;n2=0;}
               if( Hilfsfeld[i][g] == NULL )
                 {
                    n1 = ++z1; z1=0;
                    n2 = ++z2; z2=0;
                 }
               if( Hilfsfeld[b-i-1][g] == (SpielerNr+1) ){z3++;z4=0;n4=0;}
               if( Hilfsfeld[b-i-1][g] == (2-SpielerNr) ){z4++;z3=0;n3=0;}
               if( Hilfsfeld[b-i-1][g] ==      7   ){z3=0;z4=0;n3=0;n4=0;}
               if( Hilfsfeld[b-i-1][g] == NULL )
                 {
                    n3 = ++z3; z3=0;
                    n4 = ++z4; z4=0;
                 }
               if( (n3+z3) >= Laenge ) Wertung = Wertung + 20;
               if( (n4+z4) >= Laenge ) Wertung = Wertung - 100;
               if( (n1+z1) >= Laenge ) Wertung = Wertung + 20;
               if( (n2+z2) >= Laenge ) Wertung = Wertung - 100;

             } while( (++i < b) && (++g < h) );
         }

       for( t=0; t <= (h-Laenge); t++)
        {
         z1=0; n1=0; z2=0; n2=0;
         z3=0; n3=0; z4=0; n4=0;
         g = t; i = 0;
         do  {
               if( Hilfsfeld[i][g] == (SpielerNr+1) ){z1++;z2=0;n2=0;}
               if( Hilfsfeld[i][g] == (2-SpielerNr) ){z2++;z1=0;n1=0;}
               if( Hilfsfeld[t][g] ==      7   ){z1=0;z2=0;n1=0;n2=0;}
               if( Hilfsfeld[i][g] == NULL )
                 {
                    n1 = ++z1; z1=0;
                    n2 = ++z2; z2=0;
                 }
               if( Hilfsfeld[b-i-1][g] == (SpielerNr+1) ){z3++;z4=0;n4=0;}
               if( Hilfsfeld[b-i-1][g] == (2-SpielerNr) ){z4++;z3=0;n3=0;}
               if( Hilfsfeld[b-i-1][g] ==      7   ){z3=0;z4=0;n3=0;n4=0;}
               if( Hilfsfeld[b-i-1][g] == NULL )
                 {
                    n3 = ++z3; z3=0;
                    n4 = ++z4; z4=0;
                 }
               if( (n3+z3) >= Laenge ) Wertung = Wertung + 20;
               if( (n4+z4) >= Laenge ) Wertung = Wertung - 100;
               if( (n1+z1) >= Laenge ) Wertung = Wertung + 20;
               if( (n2+z2) >= Laenge ) Wertung = Wertung - 100;

             } while( (i++ < b) && (g++ < h) );
         }
      }

    return(Wertung);
}

/* --- MenschZug() : Spieler kann einmal ziehen -------------------------- */

MenschZug(St1,SpielerNr)
int St1[50][50];
int SpielerNr;
{
    int x,y,p,fl,fl2,xx,yy,SteinTyp,z,x1,y1,mode;
    int x2,y2,k,c;

    ShowText("Ihr Zug:");

    mode = 0;

    do {

    fl = 0;

    if( mode == 0 )
       {

            p = GetPos();

                if( p == 99 )
                    {
                      ShowText("Aufhören!");
                      EndFlag = 1;
                      if( ( SR.Siegflags[1-SpielerNr] & S_ANDERERFEST ) > 0 )
                              WinNr = 1-SpielerNr;
                      else WinNr = 2;
                      return();
                    }

            y = p/100;
            x = p-y*100;
       }
    else if( mode == 2 )
        {
            x = x1; y = y1;
        }

    ShowMove(x,y);

    if( Slt[SpielerNr] > 0 )
      {
        if( St1[x][y] == 0 )
            {
                Slt[SpielerNr]--;
                St1[x][y] = SpielerNr+1;
            }
        else fl = 1; fl2=0;

        if( (SR.SteineFlags[SpielerNr] & FALLSETZEN) > 0 )
          if( fl != 1 )
            {
                if(y < (SR.Bretthoehe-1) )
                    if( St1[x][y+1] == NULL )
                        {
                            Slt[SpielerNr]++;
                            St1[x][y] = NULL;
                            fl = 1;
                        }
            }
      }
    else
      {
        if( (St1[x][y] != (SpielerNr+1)) && (St1[x][y] != (SpielerNr+3)) )
            fl = 1;
        else
            {
                SteinTyp = St1[x][y]-1;
                AText("-");
                xx = x; yy = y;
                Delay(10L);
                p = GetPos();
                if( p == 99 )
                    {
                        ShowText("Aufhören!");
                        EndFlag = 1;
                        if( ( SR.Siegflags[1-SpielerNr] & S_ANDERERFEST ) > 0 )
                        WinNr = 1-SpielerNr;
                        else WinNr = 2;
                        return();
                    }
                y = p/100;
                x = p-y*100;
                fl = 1;
                ShowMove(x,y);

                if( mode != 2 )

                {

                if( SR.SteineFlags[SteinTyp] & ZIEHEN )
                  if( St1[x][y] == NULL )
                    for( z=0; z<8; z++ )
                     if( SR.Zugrichtungen[SteinTyp] & ( 1 << z ) )
                      if( (x == (xx+ZX[z]) ) && (y == (yy+ZY[z]) ) ) fl = 0;

                if( SR.SteineFlags[SteinTyp] & SCHLAGEN )
                  if( ( St1[x][y] == (2-SpielerNr)) ||
                      ( St1[x][y] == (4-SpielerNr))  )
                    for( z=0; z<8; z++ )
                     if( SR.Zugrichtungen[SteinTyp] & ( 1 << z ) )
                      if( (x == (xx+ZX[z]) ) && (y == (yy+ZY[z]) ) ) fl = 0;

                }

                if( fl != 0 )
                 if( SR.SteineFlags[SteinTyp] & SPRINGEN )
                  if( St1[x][y] == NULL )
                    for( z=0; z<8; z++ )
                     if( SR.Zugrichtungen[SteinTyp] & ( 1 << z ) )
                      if( (x == (xx+2*ZX[z]) ) && (y == (yy+2*ZY[z]) ) )
                       if( (St1[ xx+ZX[z] ][ yy+ZY[z] ] == (2-SpielerNr))
                        || (St1[ xx+ZX[z] ][ yy+ZY[z] ] == (4-SpielerNr)) )
                           { fl = 0; fl2 = 2; }

                if( fl != 0 )
                 if( SR.SteineFlags[SteinTyp] & WEITZUG )
                  if( St1[x][y] == NULL )
                    for( z=0; z<8; z++ )
                     for( k=2; k<50; k++ )
                      if( SR.Zugrichtungen[SteinTyp] & ( 1 << z ) )
                       if( (x == (xx+k*ZX[z]) ) && (y == (yy+k*ZY[z]) ) )
                        {
                          x2 = xx; y2 = yy; fl = 0;
                          while( (x != x2) && (y != y2 ) )
                          {
                            x2 = (x2>x) ? (x2-1) : (x2+1) ;
                            y2 = (y2>y) ? (y2-1) : (y2+1) ;
                            if( St1[x2][y2] != NULL) fl = 1;
                          }
                        }

                if( fl != 0 )
                 if( SR.SteineFlags[SteinTyp] & WEITSPRUNG )
                  if( St1[x][y] == NULL )
                    for( z=0; z<8; z++ )
                     for( k=2; k<50; k++ )
                      if( SR.Zugrichtungen[SteinTyp] & ( 1 << z ) )
                       if( (x == (xx+k*ZX[z]) ) && (y == (yy+k*ZY[z]) ) )
                        {
                          x2 = xx; y2 = yy; fl = 0; c = 0;
                          x2 = (x2>x) ? (x2-1) : (x2+1) ;
                          y2 = (y2>y) ? (y2-1) : (y2+1) ;
                          while( (x != x2) && (y != y2 ) )
                          {
                            if( (St1[ xx+ZX[z] ][ yy+ZY[z] ]==(2-SpielerNr))
                            || (St1[ xx+ZX[z] ][ yy+ZY[z] ]==(4-SpielerNr)))
                                    c++;
                            if( (St1[ xx+ZX[z] ][ yy+ZY[z] ]==(1+SpielerNr))
                            || (St1[ xx+ZX[z] ][ yy+ZY[z] ]==(3+SpielerNr)))
                                    fl = 1;
                            if( (St1[ xx+ZX[z] ][ yy+ZY[z] ]==7)) fl = 1;
                            x2 = (x2>x) ? (x2-1) : (x2+1) ;
                            y2 = (y2>y) ? (y2-1) : (y2+1) ;
                          }
                          if( c>1 ) fl = 1;
                          if( fl == 0 ) fl2 = 2;
                        }

                if( fl == NULL )
                 {
                  St1[xx][yy] = NULL;
                  if( (SR.SteineFlags[SteinTyp] & SPRUNGSCHLAG) && (fl2==2) )
                     {
                        while( (x != xx) || (y != yy ) )
                          {
                            St1[xx][yy] = NULL;
                            if( x!=xx) xx = (xx>x) ? (xx-1) : (xx+1) ;
                            if( y!=yy) yy = (yy>y) ? (yy-1) : (yy+1) ;
                          }
                        x1 = xx; y1 = yy;
                        if( SR.SteineFlags[SteinTyp] & MULTISPRUNG )
                            { mode = 2; ShowText("Weiter:"); fl = 0;}
                     }
                  St1[ x][ y] = SteinTyp+1;
                 }
            }
      }

    if( mode == 2 ) fl = 1-fl;

    if( (fl == 1) && (mode != 2) )
        {
            ShowText("Zug ungültig!");
            Delay(20L);
            ShowText("Ihr Zug: ");
        }

    } while ( fl == 1 );

}
