home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 8 / FreshFishVol8-CD2.bin / bbs / game / arachnid-1.1.lha / Arachnid / Game.c < prev    next >
Text File  |  1993-12-28  |  7KB  |  306 lines

  1. #include <functions.h>
  2. #include <stdio.h>
  3. #include <clib/amigaguide_protos.h>
  4. #include <intuition/intuition.h>
  5.  
  6. extern UWORD *SpielKarten[];
  7. extern BYTE UndoStack[][3],PlayStack[][10],Stack[],EndStack[];
  8.  
  9. extern long CheatLevel,Punkte,UndoCounter,HiOff;
  10. extern BOOL MBFlag,AGFlag,done;
  11.  
  12. extern struct Window *Wnd;
  13. extern struct RastPort *RastPort;
  14. extern struct Image Image;
  15. extern struct Image ImRah;
  16. extern struct IntuiText Text1;
  17. extern struct EasyStruct EndeReq;
  18. extern struct NewAmigaGuide nag;
  19.  
  20. struct EasyStruct Help = {sizeof(struct EasyStruct), 0, "Hilfe",
  21.         "Leider kann die Hilfsfunktion nicht aktiviert werden.\n"
  22.         "(AmigaGuide.library (V34) vorhanden?)", "OK"};
  23.  
  24. void DrawRow(long n);
  25. void FehlerAnz(long nr);
  26. void KartenMischen();
  27.  
  28. void PrintPunkte(long pkt)
  29. {
  30.   char str[5];
  31.  
  32.   sprintf(str,"%d",5 - (Stack[0] / 10));
  33.   Text1.IText = (UBYTE *)&str;
  34.   PrintIText(RastPort, &Text1, 71, 20+HiOff);
  35.   Punkte += pkt;
  36.   if(Punkte < 0) Punkte = 0;
  37.   sprintf(str,"%4d",Punkte);
  38.   Text1.IText = (UBYTE *)&str;
  39.   PrintIText(RastPort, &Text1, 80, 45+HiOff);
  40. }
  41.  
  42. void SetUndo(long w0,long w1,long w2)
  43. {
  44.   UndoStack[UndoCounter][0] = w0;
  45.   UndoStack[UndoCounter][1] = w1;
  46.   UndoStack[UndoCounter++][2] = w2;
  47.   if(UndoCounter == 1) OnMenu(Wnd, 1);
  48. }
  49.  
  50. void Undo()
  51. {
  52.   long i,MR1,MR2,ML1,count,Card,pkt=0;
  53.   long off1,off2,invisible=0;
  54.   char str[5];
  55.  
  56.   if(!UndoCounter) return;
  57.   UndoCounter--;
  58.   MR1 = UndoStack[UndoCounter][0];
  59.   MR2 = UndoStack[UndoCounter][1];
  60.   count = UndoStack[UndoCounter][2];
  61.   if(count == -1)       /* kein normaler Zug */
  62.   {
  63.     if(MR1 == -1)       /* Zug vom Talon */
  64.     {
  65.       invisible = 1;
  66.       pkt = -2;
  67.       if(!Stack[0])
  68.       {
  69.         Image.ImageData = SpielKarten[53];
  70.         DrawImage(RastPort, &Image, 10, HiOff);
  71.       }
  72.       for(i=9;i>=0;i--)
  73.       {
  74.         Stack[++Stack[0]] = PlayStack[PlayStack[0][i]--][i];
  75.         DrawRow(i);
  76.         if(PlayStack[PlayStack[0][i]][i] == Stack[Stack[0]]+1) pkt -= 2;
  77.       }
  78.       sprintf(str,"%d",5 - (Stack[0] / 10));
  79.       Text1.IText = (UBYTE *)&str;
  80.       PrintIText(RastPort, &Text1, 71, 20+HiOff);
  81.       PrintPunkte(pkt);
  82.     }
  83.     else                /* Zug auf EndStack */
  84.     {
  85.       pkt = -26;
  86.       if(MR2 < 0)
  87.       {
  88.         invisible = 1;
  89.         PlayStack[PlayStack[0][MR1]][MR1] *= -1;
  90.         MR2 *= -1;
  91.         pkt -= 10;
  92.         if(PlayStack[0][MR1] == 1) pkt -= 15;
  93.       }
  94.       MR2--;
  95.       Card = EndStack[MR2];
  96.       ML1 = PlayStack[0][MR1]+1;
  97.       for(i=ML1;i<ML1+13;i++)
  98.       {
  99.         PlayStack[i][MR1] = Card--;
  100.         PlayStack[0][MR1]++;
  101.       }
  102.       EndStack[MR2] = 0;
  103.       DrawImage(RastPort, &ImRah, MR2*62+134, HiOff);
  104.       DrawRow(MR1);
  105.       PrintPunkte(pkt);
  106.     }
  107.   }
  108.   else                  /* normaler Spielzug */
  109.   {
  110.     pkt = 0;
  111.     off1 = PlayStack[0][MR1];
  112.     if(MR2 < 0)
  113.     {
  114.       invisible = 1;
  115.       MR2 *= -1;
  116.       PlayStack[off1][MR1] *= -1;
  117.       pkt -= 10;
  118.       if(off1 == 1) pkt -= 15;
  119.     }
  120.     MR2--;
  121.     off2 = PlayStack[0][MR2];
  122.     if(PlayStack[off1][MR1] == PlayStack[off2-count+1][MR2]+1) pkt += 2;
  123.     if(PlayStack[off2-count][MR2] == PlayStack[off2-count+1][MR2]+1) pkt -= 2;
  124.     for(i=1;i<=count;i++) PlayStack[off1+i][MR1] = PlayStack[off2-count+i][MR2];
  125.     PlayStack[0][MR1] += count;
  126.     PlayStack[0][MR2] -= count;
  127.     DrawRow(MR2);
  128.     DrawRow(MR1);
  129.     if(pkt) PrintPunkte(pkt);
  130.   }
  131.   if((CheatLevel+invisible) > 1) PrintPunkte((Punkte+1)/2*-1);
  132.   if(!UndoCounter) OffMenu(Wnd, 1);
  133. }
  134.  
  135. void CheckEnd(long MR1,long ML,long MR2,BOOL dk)
  136. {
  137.   long i;
  138.  
  139.   MR2 -= 2;
  140.  
  141.   if(dk)                               /* only for a good Look */
  142.   {
  143.     i=(PlayStack[ML-12][MR1]/13-1)*2;
  144.     MR2 = (EndStack[i]) ? i+1 : i;
  145.   }
  146.  
  147.   if(EndStack[MR2]) for(i=7;i>=0;i--) if(!EndStack[i]) MR2=i;
  148.   EndStack[MR2] = PlayStack[ML-12][MR1];
  149.   PlayStack[0][MR1] -= 13;
  150.   i=1;
  151.   if(PlayStack[PlayStack[0][MR1]][MR1] < 0)
  152.   {
  153.     PlayStack[PlayStack[0][MR1]][MR1] *= -1;
  154.     i = -1;
  155.     if(PlayStack[0][MR1] == 1) PrintPunkte(51);
  156.     else PrintPunkte(36);
  157.   }
  158.   else PrintPunkte(26);
  159.   DrawRow(MR1);
  160.   Image.ImageData = SpielKarten[EndStack[MR2]];
  161.   DrawImage(RastPort, &Image, MR2*62+134, HiOff);
  162.   SetUndo(MR1,(MR2+1)*i,-1);
  163.   for(i=0;i<8;i++) if(!EndStack[i]) break;
  164.   if(i==8)
  165.     if(EasyRequestArgs(Wnd, &EndeReq, NULL, NULL)) KartenMischen();
  166.     else done = TRUE;
  167. }
  168.  
  169. long Deal_Row()
  170. {
  171.   long i,pkt=2;
  172.  
  173.   if(!Stack[0])
  174.   {
  175.     if(HiOff) return(8);
  176.     else return(0);
  177.   }
  178.   for(i=0;i<10;i++) if(!PlayStack[0][i]) return(1);
  179.   for(i=0;i<10;i++)
  180.   {
  181.     if(PlayStack[PlayStack[0][i]][i] == Stack[Stack[0]]+1) pkt += 2;
  182.     PlayStack[++PlayStack[0][i]][i] = Stack[Stack[0]--];
  183.     DrawRow(i);
  184.   }
  185.   if(!Stack[0]) DrawImage(RastPort, &ImRah, 10, HiOff);
  186.   SetUndo(-1,-1,-1);
  187.  
  188.   PrintPunkte(pkt);
  189.   return(0);
  190. }
  191.  
  192. long SucheZug(long wert,long farbe)
  193. {
  194.   long i,Card;
  195.  
  196.   if(wert != 13)
  197.   {
  198.     Card = wert+1+farbe*13;
  199.     for(i=0;i<10;i++) if(PlayStack[PlayStack[0][i]][i] == Card) break;
  200.     if(i != 10) return(i);
  201.     for(i=0;i<10;i++) if(((PlayStack[PlayStack[0][i]][i]-1)%13) == wert) break;
  202.     if(i != 10) return(i);
  203.   }
  204.   for(i=0;i<10;i++) if(!PlayStack[0][i]) break;
  205.   return(i);
  206. }
  207.  
  208. long Deal_Line(long MR1,long ML1,long MR2,long ML2,BOOL dk)
  209. {
  210.   long i,lastcard,wert,farbe,MLtemp,pkt=0;
  211.   BOOL isRow = FALSE;
  212.  
  213.   if(ML1<0) return(2);
  214.   if(!PlayStack[0][MR1]) return(3);
  215.   MLtemp   = ML1+1;
  216.   ML1      = PlayStack[0][MR1];
  217.   lastcard = ML1-1;
  218.   wert     = (PlayStack[ML1][MR1]-1)%13;
  219.   farbe    = (PlayStack[ML1][MR1]-1)/13;
  220.   while(lastcard)
  221.   {
  222.     if((wert == (PlayStack[lastcard][MR1]-1)%13 - 1)&&
  223.                     (farbe == (PlayStack[lastcard][MR1]-1)/13))
  224.     {
  225.       wert++;
  226.       lastcard--;
  227.     }
  228.     else break;
  229.   }
  230.   lastcard++;
  231.   if((ML1 - lastcard) == 12) isRow = TRUE;
  232.  
  233.   if((ML2 == -1)||(isRow && dk))
  234.   {
  235.     if(!isRow) return(4);
  236.     CheckEnd(MR1,ML1,MR2,dk);
  237.     return(0);
  238.   }
  239.  
  240.   if(!MBFlag)
  241.   {
  242.     if(MLtemp > ML1) MLtemp = ML1;
  243.     if(MLtemp < lastcard) return(6);
  244.     lastcard = MLtemp;
  245.     wert  = (PlayStack[MLtemp][MR1]-1)%13;
  246.     farbe = (PlayStack[MLtemp][MR1]-1)/13;
  247.   }
  248.  
  249.   if(dk)
  250.   {
  251.     MR2 = SucheZug(wert+1,farbe);
  252.     if(MR2 == 10) return(7);
  253.   }
  254.  
  255.   ML2=PlayStack[0][MR2];
  256.   if(((PlayStack[ML2][MR2]-1)%13) == 0) return(5);
  257.   if(ML2)
  258.   {
  259.     if((PlayStack[ML2][MR2]-1)%13 != wert+1) return(6);
  260.     if(PlayStack[lastcard][MR1] == (PlayStack[ML2][MR2]-1)) pkt += 2;
  261.   }
  262.  
  263.   if((PlayStack[lastcard][MR1] == PlayStack[lastcard-1][MR1]-1)&&lastcard>1)
  264.     pkt -= 2;
  265.  
  266.   i = lastcard;
  267.   while(ML1>=i)
  268.   {
  269.     PlayStack[++ML2][MR2] = PlayStack[i++][MR1];
  270.     PlayStack[0][MR2]++;
  271.     PlayStack[0][MR1]--;
  272.   }
  273.  
  274.   MLtemp = 1;
  275.   if((PlayStack[lastcard-1][MR1] < 0)&&(lastcard > 1))
  276.   {
  277.     PlayStack[lastcard-1][MR1] *= -1;
  278.     MLtemp = -1;
  279.     pkt += 10;
  280.     if(lastcard == 2) pkt += 15;
  281.   }
  282.   DrawRow(MR1);
  283.   DrawRow(MR2);
  284.   if(pkt) PrintPunkte(pkt);
  285.  
  286.   SetUndo(MR1,(MR2+1)*MLtemp,ML1-lastcard+1);
  287.  
  288.   return(0);
  289. }
  290.  
  291. void MoveCard(long MR1,long ML1,long MR2,long ML2,BOOL dk)
  292. {
  293.   if((MR1 == MR2)&&(!dk)&&(ML2 != -1)) return;
  294.   if((MR1 == 0)&&(ML1 == -1))
  295.   {
  296.     FehlerAnz(Deal_Row());
  297.     return;
  298.   }
  299.   FehlerAnz(Deal_Line(MR1,ML1,MR2,ML2,dk));
  300. }
  301.  
  302. void Hilfe()
  303. {
  304.   if(AGFlag) CloseAmigaGuide(OpenAmigaGuide(&nag, 0));
  305.   else EasyRequest(Wnd, &Help, NULL, NULL);
  306. }