/* init.c */

#include <proto/intuition.h>
#include <proto/graphics.h>
#include <math.h>
#include <time.h>
#include "golf.h"
#include "init.h"
#include "menus.h"
#include "initreq.h"

int event(ULONG,USHORT,CPTR);

struct Window *PlayWindow = NULL;
extern struct NewScreen NewPlayScreen;
extern struct NewWindow backWin;
struct IntuiMessage *msg;

struct forinit {
   struct forinit *n,*p;
   int k;
} forinit[52];

int rnd(int x)
{
   return((rand()%x)+1);
}

int initScreen(void)
{
   int i,r,g,b,t;
   
   if (PlayScreen) return(0);
   PlayScreen = (struct Screen *)OpenScreen(&NewPlayScreen);
   if (!PlayScreen) {
      return(-1);
   }
   ShowTitle(PlayScreen,FALSE);
   backWin.Screen = PlayScreen;
   PlayWindow = (struct Window *)OpenWindow(&backWin);
   if (!PlayWindow) {
      CloseScreen(PlayScreen);
      PlayScreen = NULL;
      return(-2);
   }
   PlayViewPort = &PlayScreen->ViewPort;
   PlayRastPort = &PlayScreen->RastPort;
   SetMenuStrip(PlayWindow,FIRSTMENU);
   /* Screen geöffnet */
   /* jetzt dir Palette setzen */
   for (i=0;i<16;i++) {
      t = palette[i];
      r = t>>8;
      g = t>>4 & 0xf;
      b = t & 0xf;
      SetRGB4(PlayViewPort,i,r,g,b);
      /* Das müßte eigentlich auch einfacher gehen, aber ich weiß nicht wie */
   };
   return(0); /* O.K., das wars */
}

int closeScreen(void)
{
   ClearMenuStrip(PlayWindow);
   CloseWindow(PlayWindow);
   PlayWindow = NULL;
   CloseScreen(PlayScreen);
   PlayScreen = NULL;
   return(0);
}

static int anz = 52;
static struct forinit *f = forinit;
static int SetCard(int weiter,int spalte,int zeile,int von)
{
   int vor = von;
   
   if (--anz<0) {
      puts("setcard zu oft aufgerufen");
      return(255);
   }
   if (von >= 255) {
      vor = 255;
      von -= 255;
   } /* die letzte Karte,von der aus gesucht wird und Markierung behalten */
   /* von Kartennummer von, weiter Karten weitergehen, die Nummer zurückgeben */
   for(;weiter;weiter--) f = f->n;
   f->n->p = f->p;
   f->p->n = f->n; /* forinit-Element für diese Karte löschen */
   von = f->k;
   Karten[von].spalte = spalte;
   Karten[von].zeile = zeile;
   Karten[von].vor = vor;
   return(von);
}

int initCards(int AnzStapel,int AnzZeilen)
{
   int letzteKarte=0,spalte,zeile;
   
   srand((unsigned)time(NULL));
   for (zeile=1;zeile<51;zeile++) {
      forinit[zeile].n = &forinit[zeile+1];
      forinit[zeile].p = &forinit[zeile-1];
      forinit[zeile].k = zeile;
   }
   forinit[0].n = &forinit[1];
   forinit[0].p = &forinit[51];
   forinit[0].k = 0;
   forinit[51].n = &forinit[0];
   forinit[51].p = &forinit[50];
   forinit[51].k = 51;
   anz = 52;
   f = forinit;
   for(spalte = AnzStapel+1;spalte>1;spalte--) {
      /* auf jeden Stapel AnzZeilen Karten legen */
      letzteKarte += 255;
      for(zeile=0;zeile<AnzZeilen;zeile++)
         if ((letzteKarte = SetCard(rnd(52),spalte,zeile,letzteKarte))== 255)
            return(-1); /* da war ein Fehler */
      stapel[spalte] = letzteKarte;
      /* unterste Karte der Spalte merken, in der Reihenfolge werden sie entnommen */
   }
   stapel[1] = letzteKarte = SetCard(rnd(52),1,0,letzteKarte+255);
   Karten[stapel[1]].letzte = 255;
   /* eine Karte wird aufgedeckt */
   letzteKarte += 255;
   for (zeile=0;zeile<51-AnzStapel*AnzZeilen;zeile++)
      letzteKarte = SetCard(rnd(52),0,zeile,letzteKarte);
   /* den Stapel zum Aufnehmen aufbauen */
   stapel[0] = letzteKarte;
   return(0);
}

void getEvents(void)
{
   ULONG class;
   USHORT code;
   CPTR iaddr;
   
   do {
      Wait(1L << PlayWindow->UserPort->mp_SigBit);
      if (msg = (struct IntuiMessage *)GetMsg(PlayWindow->UserPort)) {
         class = msg->Class;
         code = msg->Code;
         iaddr = (CPTR)msg->IAddress;
         ReplyMsg((struct Message *)msg);
      } else continue;
   } while(event(class,code,iaddr));
   while(msg = (struct IntuiMessage *)GetMsg(PlayWindow->UserPort))
      ReplyMsg((struct Message *)msg);
   /* Die restlichen Msg in den Müll */
}

int warteMausclick(void)
{
   struct IntuiMessage *msg;
   
   Wait(1L << PlayWindow->UserPort->mp_SigBit);
   while (msg = (struct IntuiMessage *)GetMsg(PlayWindow->UserPort))
      ReplyMsg((struct Message *)msg);
   return(0);
}

int getBackNr(void)
{
   struct IntuiMessage *msg;
   int flag = 1,nr,y;
   ULONG class;
   struct Gadget *iaddr;
   
/* die Gadgetnummern gehen von 2 an aufwärts los */
/* nr = ((struct Gadget *)msg->iaddr)->GadgetID */
   do {
      Wait(1L << PlayWindow->UserPort->mp_SigBit);
      if (msg = (struct IntuiMessage *)GetMsg(PlayWindow->UserPort)) {
         class = msg->Class;
         y = msg->MouseY;
         iaddr = (struct Gadget *)msg->IAddress;
         ReplyMsg((struct Message *)msg); /* das soll ja möglichst bald geschehen */
         switch(class) {
            case GADGETUP:    nr = iaddr->GadgetID;
                              if (nr > 1 && nr < 9) {
                                 nr -= 2;
                                 if (y > leftImageY+30) nr += 7;
                                 if (nr > 10) nr -= 7;
                                 flag = 0;
                              }
                              break;
            case CLOSEWINDOW: nr = -1;
                              flag = 0;
                              break;
         }
      }
   } while(flag);
   while (msg = (struct IntuiMessage *)GetMsg(PlayWindow->UserPort))
      ReplyMsg((struct Message *)msg);
   return(nr);
}

void getSpalten(void)
{
   ULONG class;
   USHORT code;
   CPTR iaddr;
   int flag=1,sp=AnzStapel,zl=AnzZeilen;
   
   /* AnzStapel 1-10, AnzZeilen 1-7 */
   stci_d(sGadget3_buf,AnzZeilen);
   stci_d(sGadget0_buf,AnzStapel);
   if (Request(&sRequester,PlayWindow)==FALSE) return;
   do {
      Wait(1L << PlayWindow->UserPort->mp_SigBit);
      if (msg = (struct IntuiMessage *)GetMsg(PlayWindow->UserPort)) {
         class = msg->Class;
         code = msg->Code;
         iaddr = (CPTR)msg->IAddress;
         ReplyMsg((struct Message *)msg);
         if (class==GADGETUP) {
            switch(((struct Gadget *)iaddr)->GadgetID) {
               case 30: sp = sGadget0_info.LongInt;
                        if (sp > 10) stci_d(sGadget0_buf,(sp=10));
                        if (sp*zl > 51) zl = 51/sp;
                        RefreshGadgets(&sGadget0,PlayWindow,&sRequester);
                        break;
               case 31: if (sp < 10) sp++;
                        if ((sp+1)*zl > 51) stci_d(sGadget3_buf,--zl);
                        stci_d(sGadget0_buf,sp);
                        RefreshGadgets(&sGadget0,PlayWindow,&sRequester);
                        break;
               case 32: if (sp > 0) sp--;
                        stci_d(sGadget0_buf,sp);
                        RefreshGadgets(&sGadget0,PlayWindow,&sRequester);
                        break;
               case 33: zl = sGadget3_info.LongInt;
                        if (sp*zl > 51) stci_d(sGadget3_buf,(zl=51/sp));
                        RefreshGadgets(sGadget3,PlayWindow,&sRequester);
                        break;
               case 34: if (sp*(zl+1) < 52) zl++;
                        stci_d(sGadget3_buf,zl);
                        RefreshGadgets(&sGadget3,PlayWindow,&sRequester);
                        break;
               case 35: if (zl > 0) zl--;
                        stci_d(sGadget3_buf,zl);
                        RefreshGadgets(&sGadget3,PlayWindow,&sRequester);
                        break;
               case 36: AnzStapel = sp;
                        AnzZeilen = zl;
               case 37: flag = 0;
                        break;
            }
         }
      }
   } while(flag);
   while(msg = (struct IntuiMessage *)GetMsg(PlayWindow->UserPort))
      ReplyMsg((struct Message *)msg);
   /* Die restlichen Msg in den Müll */
}

void showRequest(char *str,int abort)
{
   ULONG class;
   USHORT code;
   CPTR iaddr;
   int flag=1;
   
   cFRLibTexts[0].NextText = (abort)? &cFRLibTexts[1] : NULL;
   cFRLibTexts[0].IText = (str)? str : errmsg;
   if (Request(&cFRLibRequester,PlayWindow)==FALSE) return;
   do {
      Wait(1L << PlayWindow->UserPort->mp_SigBit);
      if (msg = (struct IntuiMessage *)GetMsg(PlayWindow->UserPort)) {
         class = msg->Class;
         code = msg->Code;
         iaddr = (CPTR)msg->IAddress;
         ReplyMsg((struct Message *)msg);
         if (class==GADGETUP) {
            if (((struct Gadget *)iaddr)->GadgetID == 40) flag = 0;
         }
      }
   } while(flag);
   while(msg = (struct IntuiMessage *)GetMsg(PlayWindow->UserPort))
      ReplyMsg((struct Message *)msg);
   /* Die restlichen Msg in den Müll */
}

