#include <functions.h>
#include <stdlib.h>
#include <intuition/intuition.h>

extern BYTE Stack[],st[],f[];
extern BYTE PlayStack[][10];
extern BYTE EndStack[];
extern UWORD *SpielKarten[];
extern long UndoCounter,Punkte,CardOverlay,HiOff;
extern BOOL MBFlag;
extern struct Window *Wnd;
extern struct RastPort *RastPort;
extern struct Image Image;
extern struct Image ImRah;
extern struct IntuiText Text1;

void PrintPunkte(long pkt);

void CleanRow(long n)
{
  long i;
  for(i=0;i<7;i++) EraseImage(RastPort, &Image, n*62+10, i*66+80+HiOff);
  DrawImage(RastPort, &ImRah, (n*62)+10, 80+HiOff);
}

void DrawRow(long n)
{
  long i,KartenNr;

  CleanRow(n);
  for(i=1;i<=PlayStack[0][n];i++)
  {
    if(!(KartenNr = PlayStack[i][n])) break;
    if(KartenNr > 0) Image.ImageData = SpielKarten[KartenNr];
    else Image.ImageData = SpielKarten[53];
    DrawImage(RastPort, &Image, (n*62)+10, (i-1)*CardOverlay+80+HiOff);
  }
}

void KartenAnzeigen()
{
  long i;

  Text1.IText = (UBYTE *)"Talon :";
  PrintIText(RastPort, &Text1, 71, 10+HiOff);
  Text1.IText = (UBYTE *)"0 von 5";
  PrintIText(RastPort, &Text1, 71, 20+HiOff);
  Text1.IText = (UBYTE *)"Punkte:";
  PrintIText(RastPort, &Text1, 71, 35+HiOff);
  PrintPunkte(0);

  for(i=0;i<10;i++)
  {
    if(i != 1) DrawImage(RastPort, &ImRah, i*62+10, HiOff);
    if((i > 1)&&(EndStack[i-2]))
    {
      Image.ImageData = SpielKarten[EndStack[i-2]];
      DrawImage(RastPort, &Image, i*62+10, HiOff);
    }
  }

  Image.ImageData = SpielKarten[53];
  DrawImage(RastPort, &Image, 10, HiOff);

  for(i=0;i<10;i++)
  {
    DrawRow(i);
  }
}

void KartenAusteilen()
{
  long i,r;

  MBFlag = TRUE;
  UndoCounter=0;
  Punkte = 0;

  OffMenu(Wnd, 1);
  /* SpielFeld löschen */
  for(i=0;i<10;i++)
    for(r=1;r<40;r++)
      PlayStack[r][i] = 0;
  for(i=0;i<8;i++) EndStack[i] = 0;

  /* Karten austeilen */
  for(i=0;i<10;i++)  PlayStack[i/10][i%10] = 5;

  for(i=10;i<50;i++) PlayStack[i/10][i%10] = Stack[114-i] * -1;

  for(i=50;i<60;i++) PlayStack[i/10][i%10] = Stack[114-i];
  for(i=0;i<4;i++)
  {
    PlayStack[6][f[i]] = Stack[54-i];
    PlayStack[5][f[i]] *= -1;
    PlayStack[0][f[i]] = 6;
  }
  for(i=51;i<105;Stack[i++] = 0);
  Stack[0] = 50;

  KartenAnzeigen();
}

void KartenMischen()
{
  long i,r,temp[10];

  /* mischen */
  for(i=1;i<53;i++) st[i] = i;
  for(i=53;i<105;i++) st[i] = i-52;

  for(i=104;i>1;i--)
  {
    r = rand() % i + 1;
    Stack[i] = st[r];
    st[r] = st[i];
  }
  Stack[1] = st[1];
  for(i=1;i<105;i++) st[i] = Stack[i];

  for(i=0;i<10;i++) temp[i]=i;
  for(i=4;i>0;i--)
  {
    r = rand() % (i+5);
    f[i-1] = temp[r];
    temp[r]  = temp[i+5];
  }
  KartenAusteilen();
}
