home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 8 / FreshFishVol8-CD2.bin / bbs / game / arachnid-1.1.lha / Arachnid / Arachnid.c < prev    next >
C/C++ Source or Header  |  1993-12-28  |  12KB  |  486 lines

  1. #include <functions.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <time.h>
  6. #include <libraries/asl.h>
  7. #include <libraries/amigaguide.h>
  8.  
  9. #define Reihenlaenge 40
  10. #define KartenBreite 53
  11. #define KartenHohe   70
  12. #define MaxZuege    500
  13.  
  14. extern UWORD *Rahmen[],*Pointer1[], *Pointer2[];
  15. extern APTR VisualInfo;
  16. extern struct Screen   *Scr;
  17. extern struct Window   *Wnd;
  18. extern struct Menu     *Menus;
  19. extern struct TextAttr  topaz8;
  20.  
  21. long seconds,micros,sec2,mic2,MRold,MLold;
  22. long CheatLevel,Punkte,UndoCounter,HiOff = 0,CardOverlay = 13;
  23. BOOL MoveFlag,MBFlag,AGFlag = TRUE,VerboseFlag = TRUE,done = FALSE;
  24. BYTE UndoStack[MaxZuege][3];
  25. BYTE Stack[105],st[105];
  26. BYTE PlayStack[Reihenlaenge][10];
  27. BYTE EndStack[8],f[4];
  28. char FileNamen[40],DirNamen[80],FileTemp[100] = "";
  29. FILE *Datei;
  30.  
  31. struct Library  *IntuitionBase  = 0;
  32. struct Library  *GadToolsBase   = 0;
  33. struct Library  *GfxBase        = 0;
  34. struct Library  *AslBase        = 0;
  35. struct Library  *AmigaGuideBase = 0;
  36.  
  37. struct IntuiMessage  *message;
  38. struct MsgPort       *UserPort;
  39. struct RastPort      *RastPort;
  40. struct Image Image = {1,1,51,66,3,NULL,7,7,NULL};
  41. struct Image ImRah = {0,0,53,68,1,(UWORD*)&Rahmen,1,0,NULL};
  42. struct IntuiText Text1 = {1, 0, JAM2, 0, 0, NULL, NULL, NULL};
  43. struct NewAmigaGuide nag = {0,(UBYTE*)"Arachnid.hilfe",0,0,0,0,0,0,0,0,0,0,0};
  44.  
  45. struct EasyStruct About = {sizeof(struct EasyStruct), 0, "Autor",
  46.         "Arachnid V1.1\nFrank Nießen, © 1993\nIdee: Ian Heath 1991 (Arachnid V1.2)", "OK"};
  47. struct EasyStruct EndeReq = {sizeof(struct EasyStruct), 0, "Spielende",
  48.         "Sie haben die Patience erfolgreich gelöst.\n"
  49.         "Wollen Sie nochmal oder das Programm beenden ?", "Nochmal|Ende"};
  50. struct EasyStruct SicherReq = {sizeof(struct EasyStruct), 0, NULL,
  51.         "%s\nSind sie sicher ?", "Ja|Nein"};
  52. struct EasyStruct LoadErr = {sizeof(struct EasyStruct), 0, NULL,
  53.         "Fehler beim %s aufgetreten!\n%s", "OK"};
  54. struct EasyStruct DoNot = {sizeof(struct EasyStruct), 0, NULL,
  55.         "nicht Implementiert", "OK"};
  56.  
  57. void CloseArachnidWindow();
  58. void CloseDownScreen();
  59. void CloseSCWindow();
  60. void CloseWin();
  61. long Deal_Row();
  62. void FehlerAnz(long nr);
  63. void FehlerAus(long nr);
  64. void Hilfe();
  65. void KartenAnzeigen();
  66. void KartenAusteilen();
  67. void KartenMischen();
  68. void MoveCard(long MR1,long ML1,long MR2,long ML2,BOOL dk);
  69. long OpenArachnidWindow();
  70. long OpenSCWindow();
  71. long OpenWin();
  72. void ReiheZeigen();
  73. long SetupScreen();
  74. void SucheKarte();
  75. void Undo();
  76.  
  77. long OpenLib(void)
  78. {
  79.   if(!(IntuitionBase = (struct Library*)OpenLibrary("intuition.library",37)))
  80.     return(1);
  81.   if(!(GfxBase = (struct Library*)OpenLibrary("graphics.library",37)))
  82.     return(2);
  83.   if(!(GadToolsBase = (struct Library*)OpenLibrary("gadtools.library",37)))
  84.     return(3);
  85.   if(!(AslBase = (struct Library*)OpenLibrary("asl.library",37)))
  86.     return(4);
  87.   if(!(AmigaGuideBase = (struct Library*)OpenLibrary("amigaguide.library",34)))
  88.     AGFlag = FALSE;
  89.   return(0);
  90. }
  91.  
  92. void CleanUp()
  93. {
  94.   CloseWin();
  95.   CloseDownScreen();
  96.   if(AmigaGuideBase) CloseLibrary(AmigaGuideBase);
  97.   CloseLibrary(AslBase);
  98.   CloseLibrary(GadToolsBase);
  99.   CloseLibrary(GfxBase);
  100.   CloseLibrary(IntuitionBase);
  101. }
  102.  
  103. void Load()
  104. {
  105.   long i,j;
  106.   char tempstr[10];
  107.   union {long zahl;char z[4];} temp;
  108.   struct FileRequester *fr;
  109.  
  110.   if(!(fr = (struct FileRequester *)AllocAslRequestTags(ASL_FileRequest,
  111.                            ASL_Hail,      "Spiel laden",
  112.                            ASL_Dir,       DirNamen,
  113.                            ASL_File,      FileNamen,
  114.                            ASL_Pattern,   "#?.game",
  115.                          /*ASL_FuncFlags, FILF_PATGAD,*/
  116.                            ASL_Window,    Wnd,
  117.                            TAG_DONE)))
  118.   {
  119.     FehlerAus(10);
  120.     return;
  121.   }
  122.  
  123.   if(!AslRequest(fr, NULL))
  124.   {
  125.     FreeAslRequest(fr);      /* Cancel */
  126.     return;
  127.   }
  128.   strcpy(DirNamen, fr->rf_Dir);
  129.   strcpy(FileNamen, fr->rf_File);
  130.   FreeAslRequest(fr);
  131.  
  132.   strcpy(FileTemp, DirNamen);
  133.   AddPart((UBYTE *)FileTemp, (UBYTE *)FileNamen, 100);
  134.  
  135.   if(!(Datei = fopen(FileTemp, "rb")))
  136.   {
  137.     EasyRequest(Wnd, &LoadErr, NULL, "Laden","Dateiname ist falsch.");
  138.     return;
  139.   }
  140.  
  141.   fgets(tempstr, 9, Datei);
  142.   if(strcmp("Arachnid",tempstr))
  143.   {
  144.     EasyRequest(Wnd, &LoadErr, NULL, "Laden","Datei ist keine Arachniddatei.");
  145.     return;
  146.   }
  147.  
  148.   Stack[0] = fgetc(Datei);
  149.   for(i=1;i<=Stack[0];i++) Stack[i] = fgetc(Datei);
  150.  
  151.   for(j=0;j<10;j++)
  152.   {
  153.     PlayStack[0][j] = fgetc(Datei);
  154.     for(i=1;i<=PlayStack[0][j];i++) PlayStack[i][j] = fgetc(Datei);
  155.   }
  156.  
  157.   for(i=0;i<8;i++) EndStack[i] = fgetc(Datei);
  158.   for(i=0;i<105;i++) st[i] = fgetc(Datei);
  159.   for(i=0;i<4;i++) f[i] = fgetc(Datei);
  160.  
  161.   for(i=0;i<4;i++) temp.z[i] = fgetc(Datei);   /* 4 char -> 1 long */
  162.   UndoCounter = temp.zahl;
  163.  
  164.   for(i=0;i<UndoCounter;i++)
  165.   {
  166.     UndoStack[i][0] = fgetc(Datei);
  167.     UndoStack[i][1] = fgetc(Datei);
  168.     UndoStack[i][2] = fgetc(Datei);
  169.   }
  170.  
  171.   for(i=0;i<4;i++) temp.z[i] = fgetc(Datei);   /* 4 char -> 1 long */
  172.   Punkte = temp.zahl;
  173.  
  174.   fclose(Datei);
  175.  
  176.   if(UndoCounter) OnMenu(Wnd, 1);
  177.   else OffMenu(Wnd, 1);
  178.  
  179.   KartenAnzeigen();
  180. }
  181.  
  182. long SaveAs()
  183. {
  184.   char *c;
  185.   struct FileRequester *fr;
  186.  
  187.   if(!(fr = (struct FileRequester *)AllocAslRequestTags(ASL_FileRequest,
  188.                            ASL_Hail,      "Spiel speichern",
  189.                            ASL_Dir,       DirNamen,
  190.                            ASL_File,      FileNamen,
  191.                            ASL_Pattern,   "#?.game",
  192.                            ASL_FuncFlags, FILF_SAVE,
  193.                            ASL_Window,    Wnd,
  194.                            TAG_DONE)))
  195.   {
  196.     FehlerAus(10);
  197.     return(10);
  198.   }
  199.  
  200.   if(!AslRequest(fr, NULL))
  201.   {
  202.     FreeAslRequest(fr);      /* Cancel */
  203.     return(-1);
  204.   }
  205.   strcpy(DirNamen, fr->rf_Dir);
  206.   strcpy(FileNamen, fr->rf_File);
  207.   FreeAslRequest(fr);
  208.  
  209.   if(c=strrchr(FileNamen, '.')) *c = 0;
  210.   strcat(FileNamen, ".game");
  211.  
  212.   strcpy(FileTemp, DirNamen);
  213.   AddPart((UBYTE *)FileTemp, (UBYTE *)FileNamen, 100);
  214.  
  215.   return(0);
  216. }
  217.  
  218. void Save()
  219. {
  220.   long i,j;
  221.   char anz;
  222.   union {long zahl;char z[4];} temp;
  223.  
  224.   if(!strlen(FileTemp)) if(SaveAs()) return;
  225.  
  226.   if(!(Datei = fopen(FileTemp, "wb")))
  227.   {
  228.     EasyRequest(Wnd, &LoadErr, NULL, "Speichern","Datei läßt sich nicht öffnen.");
  229.     return;
  230.   }
  231.  
  232.   fputs("Arachnid", Datei);
  233.  
  234.   anz = Stack[0];
  235.   putc(anz, Datei);
  236.   for(i=1;i<=anz;i++) putc(Stack[i], Datei);
  237.  
  238.   for(j=0;j<10;j++)
  239.   {
  240.     anz = PlayStack[0][j];
  241.     putc(anz, Datei);
  242.     for(i=1;i<=anz;i++) putc(PlayStack[i][j], Datei);
  243.   }
  244.  
  245.   for(i=0;i<8;i++) putc(EndStack[i], Datei);
  246.   for(i=0;i<105;i++) putc(st[i], Datei);
  247.   for(i=0;i<4;i++) putc(f[i], Datei);
  248.  
  249.   temp.zahl = UndoCounter;
  250.   for(i=0;i<4;i++) putc(temp.z[i], Datei);
  251.  
  252.   for(i=0;i<UndoCounter;i++)
  253.   {
  254.     putc(UndoStack[i][0], Datei);
  255.     putc(UndoStack[i][1], Datei);
  256.     putc(UndoStack[i][2], Datei);
  257.   }
  258.  
  259.   temp.zahl = Punkte;
  260.   for(i=0;i<4;i++) putc(temp.z[i], Datei);
  261.  
  262.   fclose(Datei);
  263. }
  264.  
  265. BOOL MenuAction(long select)
  266. {
  267.   long i,j,flags,menu,item,subit;
  268.  
  269.   menu = MENUNUM(select);
  270.   item = ITEMNUM(select);
  271.   subit = SUBNUM(select);
  272.   ClearPointer(Wnd);
  273.   switch(menu)
  274.   {
  275.     case 0:
  276.       switch(item)
  277.       {
  278.         case 0: if(EasyRequest(Wnd, &SicherReq, NULL,
  279.                     "Hiermit starten Sie ein neues Spiel!"))
  280.                   KartenMischen();
  281.                 break;
  282.         case 1: Load();
  283.                 break;
  284.         case 2: SaveAs();
  285.         case 3: Save();
  286.                 break;
  287.         case 5: if(EasyRequest(Wnd, &SicherReq, NULL, "Programmende!"))
  288.                   return(TRUE);
  289.       } break;
  290.     case 1:
  291.       switch(item)
  292.       {
  293.         case 0: Undo();
  294.                 break;
  295.         case 1: if(UndoCounter&&(EasyRequest(Wnd, &SicherReq, NULL,
  296.                      "Alle Züge werden zurückgenommen!")))
  297.                 {
  298.                   for(i=1;i<105;i++) Stack[i] = st[i];
  299.                   KartenAusteilen();
  300.                 }
  301.                 break;
  302.         case 3: FehlerAnz(Deal_Row());
  303.                 break;
  304.       } break;
  305.     case 2:
  306.       switch(item)
  307.       {
  308.         case 0: ReiheZeigen();
  309.                 break;
  310.         case 1: SucheKarte();
  311.                 break;
  312.         case 3:
  313.         case 4:
  314.         case 5: break;
  315.