/*
        learn.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 char               *b0,*b1,*p0,*p1;
extern char               *c0,*c1,*d0,*d1;
extern int                WinNr,ZugNr,EndFlag;
extern int                Spielfeld[50][50];

extern char               *FindStellung();
extern APTR               *AskMessage();

AddPlayer(Player)
{
    CompressStellung(Spielfeld);
    if( Player == 0 )
        {
            AddStellung(d0);
            d0 = d0 + CLength;
        }

    if( Player == 1 )
        {
            AddStellung(d1);
            d1 = d1 + CLength;
        }

}

MerkeStellungen()
{
    int p,c,w,z;
    long l1,l0;
    char *ptr,*ptr2;

    if( WinNr == 2 ) p = -2;
    if( WinNr == 0 ) p =  20;
    if( WinNr == 1 ) p = -20;

    if( WinNr == 2 ) return();

    c = ZugNr/2+1;

    for( ptr = c0; ptr < d0; ptr = ptr + CLength )
        {
            GetCompressed(ptr);
            ptr2 = FindStellung(b0,p0);
            if( ptr2 == NULL )
                {
                    AddStellung(p0);
                    ptr2 = p0;
                    p0 = p0 + CLength;
                }
            w = *(ptr2+CLength-1);
            w = w + p/c;
            if( w < -120 ) w = -120;
            if( w >  120 ) w =  120;
            *(ptr2+CLength-1) = w;
            c--;
        }

    if( WinNr == 2 ) p =  2;
    if( WinNr == 1 ) p =  20;
    if( WinNr == 0 ) p = -20;

    c = ZugNr/2+1;

    for( ptr = c1; ptr < d1; ptr = ptr + CLength )
        {
            GetCompressed(ptr);
            ptr2 = FindStellung(b1,p1);
            if( ptr2 == NULL )
                {
                    AddStellung(p1);
                    ptr2 = p1;
                    p1 = p1 + CLength;
                }
            w = *(ptr2+CLength-1);
            w = w + p/c;
            if( w < -120 ) w = -120;
            if( w >  120 ) w =  120;
            *(ptr2+CLength-1) = w;
            c--;
        }

    l0 = p0 - b0; l1 = p1 - b1;

}

int HoleWertung(PlayerNr)
int PlayerNr;
{
    int a;
    char *c;

    if( PlayerNr == 0 )
        {
            c = FindStellung(b0,p0);
            if( c == NULL ) return(0);
            a = *(c+CLength-1);
            return(a);
        }

    if( PlayerNr == 1 )
        {
            c = FindStellung(b1,p1);
            if( c == NULL )  return(0);
            a = *(c+CLength-1);
            return(a);
        }
}

APTR AutoLearn()
{
    int  qw;
    APTR message;

    qw = SR.Brettbreite * SR.Bretthoehe * 5;

    EndFlag = 0;
    WinNr = 0;
    ZugNr = 0;

    d0 = c0;
    d1 = c1;

    ShowText("- Neues Spiel ! -");
    NewLine();

    InitStellung(Spielfeld);

    while( EndFlag == 0 )
        {
            message = AskMessage();
            if( message != 0 ) return(message);

            MacheZug(Spielfeld,0);
            AddPlayer(0);
            EndFlag = EndFlag + Sieg(Spielfeld,0);
            ZugNr++;

            if( EndFlag == 0)
                {
                    MacheZug(Spielfeld,1);
                    AddPlayer(1);
                    EndFlag = EndFlag | Sieg(Spielfeld,1);
                    ZugNr++;
                }
            if( ZugNr > qw ) { EndFlag = 1; WinNr = 2; }
        }

    NewLine();

    if( WinNr ==  0 )
      {
        ShowText("Pl1 gewinnt !");
      }
    if( WinNr == 1 )
      {
        ShowText("Pl2 gewinnt !");
      }
    if( WinNr == 2 )
      {
        ShowText("Unentschieden!");
      }

    MerkeStellungen();

    NewLine();

    return(NULL);
}


