/*
        Screen.c    -   Ein Teil von Gambler

        (c) by Guido Appenzeller - Landessternwarte - 6900 Heidelberg

*/

#include"include.h"

extern struct Spielregeln SR;
extern struct IntuitionBase *IntuitionBase;
extern struct GfxBase *GfxBase;
extern struct Window *GWindow;
extern struct Screen *GScreen;
extern struct RastPort *rp;
extern struct TmpRas myTmpRas;
extern struct AreaInfo myAreaInfo;

extern PLANEPTR *myplane;

extern UWORD areabuffer[2500];

extern LONG xmin,xstep,ymin,ystep;

extern int Spielfeld[50][50];

extern int ZugNr;

extern unsigned char BufferA[10],Undo[50],FileName[50];

extern APTR AutoLearn();

struct NewScreen Screen1 =
{
    0,0,640,256,3,
    0,0,
    HIRES,
    CUSTOMSCREEN,
    NULL,
    NULL,
    NULL,
    NULL
};

struct NewWindow Window1 =
{
    0,0,640,256,
    0,0,
    MOUSEBUTTONS,
    ACTIVATE|BACKDROP|BORDERLESS|RMBTRAP,
    NULL,
    NULL,
    NULL,
    NULL,   /* Set Later */
    NULL,
    640,256,640,256,
    CUSTOMSCREEN
};

SHORT  Lines1[] = {  0,0,    40,0,   40,20,  0,20,   0,0  };
SHORT  Lines2[] = {  0,0,    40,0,   40,20,  0,20,   0,0,
                     40,20,  40,0,   0,20                 };

struct Border B3 = { 0,0,1,0,JAM1,5,Lines1,NULL };
struct Border B1 = { 0,0,0,0,JAM1,8,Lines2,&B3  };
struct Border B2 = { 0,0,1,0,JAM1,8,Lines2,NULL };

struct Gadget EndGadget =
{   NULL, 295,87,49,15, GADGHCOMP, RELVERIFY, BOOLGADGET,
    NULL, NULL, NULL, NULL, NULL, 01, NULL };

struct Gadget Dir8Gadget =
{   &EndGadget,40,25,39,19,GADGHIMAGE, RELVERIFY|TOGGLESELECT, BOOLGADGET,
    (APTR)&B1, (APTR)&B2, NULL, NULL, NULL, 01, NULL   };

struct Gadget Dir7Gadget =
{   &Dir8Gadget,40,65,39,19,GADGHIMAGE, RELVERIFY|TOGGLESELECT, BOOLGADGET,
    (APTR)&B1, (APTR)&B2, NULL, NULL, NULL, 01, NULL   };

struct Gadget Dir6Gadget =
{   &Dir7Gadget,40,105,39,19,GADGHIMAGE, RELVERIFY|TOGGLESELECT, BOOLGADGET,
    (APTR)&B1, (APTR)&B2, NULL, NULL, NULL, 01, NULL   };

struct Gadget Dir5Gadget =
{   &Dir6Gadget,120,105,39,19,GADGHIMAGE, RELVERIFY|TOGGLESELECT, BOOLGADGET,
    (APTR)&B1, (APTR)&B2, NULL, NULL, NULL, 01, NULL   };

struct Gadget Dir4Gadget =
{   &Dir5Gadget,200,105,39,19,GADGHIMAGE, RELVERIFY|TOGGLESELECT, BOOLGADGET,
    (APTR)&B1, (APTR)&B2, NULL, NULL, NULL, 01, NULL   };

struct Gadget Dir3Gadget =
{   &Dir4Gadget,200,65,39,19,GADGHIMAGE, RELVERIFY|TOGGLESELECT, BOOLGADGET,
    (APTR)&B1, (APTR)&B2, NULL, NULL, NULL, 01, NULL   };

struct Gadget Dir2Gadget =
{   &Dir3Gadget,200,25,39,19,GADGHIMAGE, RELVERIFY|TOGGLESELECT, BOOLGADGET,
    (APTR)&B1, (APTR)&B2, NULL, NULL, NULL, 01, NULL   };

struct Gadget Dir1Gadget =
{   &Dir2Gadget,120,25,39,19,GADGHIMAGE, RELVERIFY|TOGGLESELECT, BOOLGADGET,
    (APTR)&B1, (APTR)&B2, NULL, NULL, NULL, 01, NULL   };


struct Gadget Opt2Gadget =
{
    NULL, 50,32,100,15, GADGHCOMP, RELVERIFY, BOOLGADGET,
    NULL, NULL, NULL, NULL, NULL, 02, NULL
};

struct Gadget Opt1Gadget =
{
    &Opt2Gadget, 150,32,100,15, GADGHCOMP, RELVERIFY, BOOLGADGET,
    NULL, NULL, NULL, NULL, NULL, 01, NULL
};

struct StringInfo NumInfo =
{
    BufferA,Undo,0,10,0,0,0,0,0,0,0,0
};

struct StringInfo StrInfo =
{
    FileName,Undo,0,50,0,0,0,0,0,0,0,0
};

struct Gadget NumGadget =
{
    NULL, 150,32,50,15, GADGHCOMP, STRINGCENTER|LONGINT|RELVERIFY,
    STRGADGET, NULL, NULL, NULL, NULL,(APTR) &NumInfo, 03, NULL
};

struct Gadget StrGadget =
{
    NULL, 150,32,160,15, GADGHCOMP, STRINGCENTER|RELVERIFY,
    STRGADGET, NULL, NULL, NULL, NULL,(APTR) &StrInfo, 03, NULL
};

struct NewWindow RqWindow =
{
    0,100,640,56,
    0,0,
    GADGETUP,
    ACTIVATE,
    &Opt1Gadget,
    NULL,
    NULL,
    NULL,   /* Set Later */
    NULL,
    0,0,0,0,
    CUSTOMSCREEN
};

struct NewWindow NmWindow =
{
    0,100,640,56,
    0,0,
    GADGETUP,
    ACTIVATE,
    &NumGadget,
    NULL,
    NULL,
    NULL,   /* Set Later */
    NULL,
    0,0,0,0,
    CUSTOMSCREEN
};

struct NewWindow StrWindow =
{
    0,100,640,56,
    0,0,
    GADGETUP,
    ACTIVATE,
    &StrGadget,
    NULL,
    NULL,
    NULL,   /* Set Later */
    NULL,
    0,0,0,0,
    CUSTOMSCREEN
};

struct NewWindow DirWindow =
{
    120,50,400,150,
    0,0,
    GADGETUP,
    ACTIVATE,
    &Dir1Gadget,
    NULL,
    NULL,
    NULL,   /* Set Later */
    NULL,
    0,0,0,0,
    CUSTOMSCREEN
};

BildschirmAn()
{
 if(( IntuitionBase=(struct IntuitionBase*)
   OpenLibrary("intuition.library",0L) ) == NULL ) return(1);

 if(( GfxBase=(struct GfxBase*)
   OpenLibrary("graphics.library",0L) ) == NULL ) return(1);

 if(( GScreen = OpenScreen(&Screen1) ) == NULL ) return(1);

 Window1.Screen = GScreen;
 RqWindow.Screen = GScreen;
 NmWindow.Screen = GScreen;
 StrWindow.Screen = GScreen;
 DirWindow.Screen = GScreen;

 if(( GWindow = OpenWindow(&Window1) ) == NULL ) return(1);

 rp = GWindow->RPort;

 InitArea(&myAreaInfo,&areabuffer[0],1000L);
 rp->AreaInfo = &myAreaInfo;

 myplane = AllocRaster(640L,256L);
 if( myplane == NULL ) return(1);
 InitTmpRas(&myTmpRas,myplane,(long)RASSIZE(640,256));
 rp->TmpRas = &myTmpRas;

 ShowTitle(GScreen,FALSE);
 SetColors();

}

BildschirmAus()
{
    FreeRaster(myplane,640L,256L);
    CloseWindow(GWindow);
    CloseScreen(GScreen);
    CloseLibrary(IntuitionBase);
    CloseLibrary(GfxBase);
}

SetColors()
{

SetRGB4(&(GScreen->ViewPort),0L,0L,0L,0L);
SetRGB4(&(GScreen->ViewPort),1L,15L,15L,15L);
SetRGB4(&(GScreen->ViewPort),2L,7L,7L,7L);
SetRGB4(&(GScreen->ViewPort),3L,15L,0L,0L);
SetRGB4(&(GScreen->ViewPort),4L,15L,15L,0L);
SetRGB4(&(GScreen->ViewPort),5L,0L,15L,0L);
SetRGB4(&(GScreen->ViewPort),6L,0L,0L,15L);
SetRGB4(&(GScreen->ViewPort),7L,12L,12L,12L);

}

/* -- GetPos() : Fragt Position ab --------------------------------------- */

int GetPos()
{
    int x,y;
    int fl;

    struct  IntuiMessage *message;

    do {

    fl = 0;

    while( ( message = (struct IntuiMessage *) GetMsg(GWindow->UserPort) )
                 != NULL ) ReplyMsg(message);

    message = ( struct IntuiMessage *) WaitPort(GWindow->UserPort);
    x       = message->MouseX;
    y       = message->MouseY;

    if( (x>496) && (y>130) && (y<150) ) return(99);

    if( (x<xmin) || (y<ymin) ) fl = 1;

    x = (x-xmin)/xstep;
    y = (y-ymin)/ystep;

    if( (x<0) || (y<0) ) fl = 1;
    if( (x>(SR.Brettbreite-1)) || (y>(SR.Bretthoehe-1)) ) fl = 1;

    } while ( fl == 1 );

    return( x+y*100 );
}

/* -- ZeichneFeld() : Zeichnet die Brettstelle mit den Koordinaten x/y -- */

ZeichneFeld(x,y)
int x,y;
{
    LONG a,b,c,d;
    LONG c1,c2;

    if( SR.BrettFlags == KAESTCHEN )   { c1 = 6; c2 = 6; }
    if( SR.BrettFlags == SCHACHBRETT ) { c1 = 1; c2 = 0; }
    if( SR.BrettFlags == LINIEN )      { c1 = 5; c2 = 5; }
    if( SR.AusgangsBrett[x][y] == 7 )  { c1 = 0; c2 = 0; }

    if( (x+y) == (((x+y)/2)*2) ) SetAPen(rp,c1);
    else SetAPen(rp,c2);
    a = xmin+x*xstep;
    b = xmin+xstep*x+xstep-1;
    c = ymin+ystep*y;
    d = ymin+ystep*y+ystep-1;
    RectFill(rp,a,c,b,d);

    if( SR.BrettFlags == KAESTCHEN )
    {
        SetAPen(rp,1L);
        Move(rp,a,c);Draw(rp,b,c);Draw(rp,b,d);
        Draw(rp,a,d);Draw(rp,a,c);
    }

    if( SR.BrettFlags == LINIEN )
    {
        SetAPen(rp,0L);
        Move(rp,a,(c+d)/2); Draw(rp,b,(c+d)/2);
        Move(rp,(a+b)/2,c); Draw(rp,(a+b)/2,d);
    }

}

/* --- ZeichneStein() : Zeichnet Stein des Typs <typ> an der Stelle x/y -- */

ZeichneStein(x,y,typ)
int x,y,typ;
{
    LONG c3,c4,a,b;

    if( SR.BrettFlags == KAESTCHEN )   { c3 = 3; c4 = 4; }
    if( SR.BrettFlags == SCHACHBRETT ) { c3 = 1; c4 = 0; }
    if( SR.BrettFlags == LINIEN )      { c3 = 1; c4 = 0; }

    a = xmin+xstep*x+xstep/2;
    b = ymin+ystep*y+ystep/2;

    if( typ&1 ) SetAPen(rp,c3);
    else SetAPen(rp,c4);

    DrawEllipse(rp,a,b,xstep/3,ystep/3+2);
    Flood(rp,1L,a+1,b+1);

    if( typ&1 ) SetAPen(rp,c4);
    else SetAPen(rp,c3);

    DrawEllipse(rp,a,b,xstep/3,ystep/3+2);
    DrawEllipse(rp,a,b,xstep/4,ystep/4+2);

    if( typ > 2 )
        {
            DrawEllipse(rp,a,b,xstep/5,ystep/5+2);
            DrawEllipse(rp,a,b,xstep/7,ystep/7+2);
        }
}

/* --- InitFeld : Zeichnet die gesamte aktuelle Stellung neu ----------- */

InitFeld()
{
    int  x,y;             /* Hilfsvariablen */
    LONG a,b;

    Move(rp,0L,0L); ClearScreen(rp);

    if ( SR.Bretthoehe > SR.Brettbreite )
        {
            ymin = 10; ystep = 235/SR.Bretthoehe;
            a = (460*SR.Brettbreite)/SR.Bretthoehe;
            xmin = 250-a/2; xstep = a/SR.Brettbreite;
        }
    if ( SR.Brettbreite >= SR.Bretthoehe )
        {
            xmin = 20; xstep = 460/SR.Brettbreite;
            a = (235*SR.Bretthoehe)/SR.Brettbreite;
            ymin = 128-a/2; ystep = a/SR.Bretthoehe;
        }

    for( x=0 ; x<SR.Brettbreite ; x++ )
        for( y=0 ; y<SR.Bretthoehe ; y++ ) ZeichneFeld(x,y);

    SetAPen(rp,1L);
    a = xmin+xstep*SR.Brettbreite;
    b = ymin+ystep*SR.Bretthoehe;
    Move(rp,xmin-1,ymin-1); Draw(rp,xmin-1,b);
    Draw(rp,a,b); Draw(rp,a,ymin-1); Draw(rp,xmin-1,ymin-1);

    Move(rp,496L,0L); Draw(rp,496L,255L);
    Draw(rp,639L,255L); Draw(rp,639L,0L);
    Draw(rp,496L,0L);

    Move(rp,496L,150L); Draw(rp,639L,150L);
    Move(rp,496L,130L); Draw(rp,639L,130L);
    Move(rp,500L,132L); Draw(rp,635L,132L);
    Draw(rp,635L,148L); Draw(rp,500L,148L);
    Draw(rp,500L,132L);

    Move(rp,534L,143L); Text(rp,"Aufhören!",9L);

    Move(rp,500L,20L); Text(rp,"     GAMBLER     ",17L);
    Move(rp,500L,30L); Text(rp,"       von       ",17L);
    Move(rp,500L,40L); Text(rp,"Guido Appenzeller",17L);

    Move(rp,510L,125L); Text(rp,"Halbzüge:     ",14L);

    ShowText("   Hallo User!");
    NewLine();
    ShowText("Dies ist V1.0 von");
    ShowText("  G A M B L E R");
    NewLine();
}

ShowNum(x)
int x;
{
    int z;
    char c;

    if( x > 99) { z = x/100;c = 48+z; Text(rp,&c,1L); x = x - z*100;}
    if( x > 9 ) { z = x/10; c = 48+z; Text(rp,&c,1L); x = x - z*10; }
    c = 48+x; Text(rp,&c,1L);
}

FillBuffer(x)
int x;
{
    int z,c,y;
    c = 0;
    y = x;

    if( y > 999) { z = x/1000; BufferA[c++]=z+48; x = x - z*1000;}
    if( y > 99 ) { z = x/100 ; BufferA[c++]=z+48; x = x - z*100 ;}
    if( y > 9  ) { z = x/10  ; BufferA[c++]=z+48; x = x - z*10  ;}
    BufferA[c++] = 48+x;
    BufferA[c] = 0;
}


ShowMove(x,y)
int x,y;
{
    ShowNum(++x);
    Text(rp,",",1L);
    ShowNum(++y);
}

ShowText(t)
char *t;
{
    long l;

    SetAPen(rp,1L);
    ScrollRaster(rp,0L,8L,497L,151L,638L,254L);
    Move(rp,500L,251L);
    l = strlen(t);
    Text(rp,t,l);
}

AText(t)
char *t;
{
    long l;

    SetAPen(rp,1L);
    l = strlen(t);
    Text(rp,t,l);
}

NewLine()
{
    ScrollRaster(rp,0L,8L,497L,151L,638L,254L);
}

/* --- AskUser() - Erzeugt einen Requester ---------------------------- */

int AskUser(BodyText,Opt1,Opt2)
char *BodyText,*Opt1,*Opt2;
{
    struct  IntuiMessage *message;

    long bl,o1l,o2l;
    struct Window *RWindow;
    struct RastPort *rp2;
    long w,w1,w2,r,x1,x2,x;

    bl = strlen(BodyText);
    o1l = strlen(Opt1);
    o2l = strlen(Opt2);

    w = bl*8+80;

    RqWindow.Width = w+1;
    RqWindow.LeftEdge = 320-w/2;

    w1 = o1l*8+20; w2 = o2l*8+20;
    x1 = w/4-w1/2; x2 = 3*w/4-w2/2;

    Opt1Gadget.LeftEdge = x1;
    Opt1Gadget.Width    = w1+1;

    Opt2Gadget.LeftEdge = x2;
    Opt2Gadget.Width    = w2+1;

    RWindow = OpenWindow(&RqWindow);
    if( RWindow == NULL ) { return(1); }
    rp2 = RWindow->RPort;

    Move(rp2,0L,0L);  Draw(rp2,w,0L); Draw(rp2,w,55L);
    Draw(rp2,0L,55L); Draw(rp2,0L,0L);

    Move(rp2,40L,16L); Text(rp2,BodyText,bl);

    Move(rp2,(long)(x1+10),42L); Text(rp2,Opt1,o1l);
    Move(rp2,(long)(x2+10),42L); Text(rp2,Opt2,o2l);

    Move(rp2,x1,32L); Draw(rp2,(long)(x1+w1),32L);
    Draw(rp2,(long)(x1+w1),46L); Draw(rp2,x1,46L);
    Draw(rp2,x1,32L);

    Move(rp2,x2,32L); Draw(rp2,(long)(x2+w2),32L);
    Draw(rp2,(long)(x2+w2),46L); Draw(rp2,x2,46L);
    Draw(rp2,x2,32L);

    message = ( struct IntuiMessage *) WaitPort(RWindow->UserPort);
    x       = message->MouseX;

    if( x< (w/2) ) r = 0;
    else           r = 1;

    CloseWindow(RWindow);

    return(r);
}

int AskNumber(BodyText,Default)
char *BodyText;
int  Default;
{
    struct  IntuiMessage *message;

    long bl;
    struct Window *RWindow;
    struct RastPort *rp2;
    long w,w1,w2,x1,x2,x;
    int  r;

    bl = strlen(BodyText);

    w = bl*8+80;

    NmWindow.Width = w+1;
    NmWindow.LeftEdge = 320-w/2;

    w1 = w/2-25;

    NumGadget.LeftEdge = w1;

    w1 = w1-7;

    FillBuffer(Default);

    RWindow = OpenWindow(&NmWindow);
    if( RWindow == NULL ) { return(3); }
    rp2 = RWindow->RPort;

    Move(rp2,w1,28L);  Draw(rp2,w1,43L); Draw(rp2,(long)(w1+60),43L);
    Draw(rp2,(long)(w1+60),28L); Draw(rp2,w1,28L);

    Move(rp2,0L,0L);  Draw(rp2,w,0L); Draw(rp2,w,55L);
    Draw(rp2,0L,55L); Draw(rp2,0L,0L);

    Move(rp2,40L,16L); Text(rp2,BodyText,bl);

    message = ( struct IntuiMessage * ) WaitPort(RWindow->UserPort);

    r = NumInfo.LongInt;

    CloseWindow(RWindow);

    return(r);
}

AskString(BodyText)
char *BodyText;
{
    struct  IntuiMessage *message;

    long bl;
    struct Window *RWindow;
    struct RastPort *rp2;
    long w,w1,w2,x1,x2,x;
    int  r;

    bl = strlen(BodyText);

    w = bl*8+80;
    if( w < 250 ) w = 250;

    StrWindow.Width = w+1;
    StrWindow.LeftEdge = 320-w/2;

    w1 = w/2-80;

    StrGadget.LeftEdge = w1;

    w1 = w1-7;

    RWindow = OpenWindow(&StrWindow);
    if( RWindow == NULL ) { return(3); }
    rp2 = RWindow->RPort;

    Move(rp2,w1,28L);  Draw(rp2,w1,43L); Draw(rp2,(long)(w1+170),43L);
    Draw(rp2,(long)(w1+170),28L); Draw(rp2,w1,28L);

    Move(rp2,0L,0L);  Draw(rp2,w,0L); Draw(rp2,w,55L);
    Draw(rp2,0L,55L); Draw(rp2,0L,0L);

    Move(rp2,40L,16L); Text(rp2,BodyText,bl);

    message = ( struct IntuiMessage * ) WaitPort(RWindow->UserPort);

    CloseWindow(RWindow);
}

AskDir(typ)
int typ;
{
    struct  IntuiMessage *message;

    long bl;
    struct Window *RWindow;
    struct RastPort *rp2;
    long w,w1,w2,x1,x2,x;
    LONG c3,c4,a,b;
    int  r;

    RWindow = OpenWindow(&DirWindow);
    if( RWindow == NULL ) { return(3); }
    rp2 = RWindow->RPort;
    rp2->TmpRas = &myTmpRas;

    Move(rp2,295L,87L);  Draw(rp2,295L,103L); Draw(rp2,345L,103L);
    Draw(rp2,345L,87L); Draw(rp2,295L,87L);
    Move(rp2,300L,97L); Text(rp2," OK!",4L);
    Move(rp2,252L,40L); Text(rp2,"Geben Sie nun die",17L);
    Move(rp2,252L,48L); Text(rp2,"  möglichen Zug- ",17L);
    Move(rp2,252L,56L); Text(rp2,"  richtungen an! ",17L);

    Move(rp2,0L,0L);   Draw(rp2,399L,0L); Draw(rp2,399L,149L);
    Draw(rp2,0L,149L); Draw(rp2,0L,0L);

    if( SR.BrettFlags == KAESTCHEN )   { c3 = 3; c4 = 4; }
    if( SR.BrettFlags == SCHACHBRETT ) { c3 = 1; c4 = 0; }
    if( SR.BrettFlags == LINIEN )      { c3 = 1; c4 = 0; }

    if( typ&1 ) SetAPen(rp2,c4);
    else        SetAPen(rp2,c3);

    DrawEllipse(rp2,140L,75L,50L,25L);
    Flood(rp2,1L,140L,75L);

    if( typ&1 ) SetAPen(rp2,c3);
    else        SetAPen(rp2,c4);

    DrawEllipse(rp2,140L,75L,50L,25L);
    DrawEllipse(rp2,140L,75L,40L,20L);

    if( typ > 2 )
        {   DrawEllipse(rp2,140L,75L,34L,17L);
            DrawEllipse(rp2,140L,75L,30L,15L);  }

    do {

    while( ( message = (struct IntuiMessage *) GetMsg(RWindow->UserPort) )
                 != NULL ) ReplyMsg(message);

    message = ( struct IntuiMessage * ) WaitPort(RWindow->UserPort);

    } while ( (message->MouseX) < 290 );

    CloseWindow(RWindow);

    r = 0;
    if ( Dir1Gadget.Flags & SELECTED ) r = r | 1;
    if ( Dir2Gadget.Flags & SELECTED ) r = r | 2;
    if ( Dir3Gadget.Flags & SELECTED ) r = r | 4;
    if ( Dir4Gadget.Flags & SELECTED ) r = r | 8;
    if ( Dir5Gadget.Flags & SELECTED ) r = r | 16;
    if ( Dir6Gadget.Flags & SELECTED ) r = r | 32;
    if ( Dir7Gadget.Flags & SELECTED ) r = r | 64;
    if ( Dir8Gadget.Flags & SELECTED ) r = r | 128;

    return(r);
}


/* --- ZeigeStellung - Vergleicht Stellung und korrigiert Änderungen -- */

ZeigeStellung()
{
static int ZFeld[50][50];

int x,y;

    for( x=0 ; x<SR.Brettbreite ; x++ )
      for( y=0 ; y<SR.Bretthoehe ; y++ )
        {
            if( ZFeld[x][y] != Spielfeld[x][y] )
                {
                     ZeichneFeld(x,y);
                     if( ( Spielfeld[x][y] != 0 ) && (Spielfeld[x][y] != 7 ))
                        ZeichneStein(x,y,Spielfeld[x][y]);
                }
             ZFeld[x][y] = Spielfeld[x][y];
        }

    SetAPen(rp,1L);
    Move(rp,510L,125L); Text(rp,"Halbzüge: ",10L);
    ShowNum(ZugNr);

}

struct IntuiMessage *AskMessage()
{
    struct  IntuiMessage *message;

    message = ( struct IntuiMessage *) GetMsg(GWindow->UserPort);

    if( message == NULL ) return(0);
    else return(message);
}

WaitLearn()
{
    int x,y;
    int fl;

    struct  IntuiMessage *message;

    do {

    fl = 0;

    while( ( message = (struct IntuiMessage *) GetMsg(GWindow->UserPort) )
                 != NULL ) ReplyMsg(message);

    Delay(120L);

    message = ( struct IntuiMessage *) GetMsg(GWindow->UserPort);

    while( message == NULL )
        {
            message = AutoLearn();
        }

    x       = message->MouseX;
    y       = message->MouseY;
    ReplyMsg(message);

    if( (x>496) && (y>130) && (y<150) ) return(99);

    if( (x<xmin) || (y<ymin) ) fl = 1;

    x = (x-xmin)/xstep;
    y = (y-ymin)/ystep;

    if( (x<0) || (y<0) ) fl = 1;
    if( (x>(SR.Brettbreite-1)) || (y>(SR.Bretthoehe-1)) ) fl = 1;

    } while ( fl == 1 );
}


