home *** CD-ROM | disk | FTP | other *** search
/ Gold Fish 2 / goldfish_vol2_cd1.bin / files / game / think / 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.         case 6: EasyRequest(Wnd, &DoNot, NULL, NULL);
  316.                 break;
  317.       } break;
  318.     case 3:
  319.       switch(item)
  320.       {
  321.         case 0: EasyRequest(Wnd, &About, NULL, NULL);
  322.                 break;
  323.         case 1: Hilfe();
  324.       }
  325.   }
  326.   MoveFlag = FALSE;
  327.   seconds = 0;
  328.  
  329.   for(i=0;i<3;i++)
  330.   {
  331.     j = FULLMENUNUM(2, 4, i);
  332.     flags = ((struct MenuItem *)ItemAddress(Menus, j))->Flags;
  333.     if(flags & CHECKED) CheatLevel = i;
  334.   }
  335.   j = FULLMENUNUM(2, 5, 0);
  336.   flags = ((struct MenuItem *)ItemAddress(Menus, j))->Flags;
  337.   VerboseFlag = (flags & CHECKED);
  338.   j = FULLMENUNUM(2, 3, 0);
  339.   flags = ((struct MenuItem *)ItemAddress(Menus, j))->Flags;
  340.   i = (flags & CHECKED) ? -80 : 0;
  341.   if(i != HiOff)
  342.   {
  343.     HiOff = i;
  344.     EraseRect(RastPort, 0, 0, 639, 511);
  345.     KartenAnzeigen();
  346.   }
  347.  
  348.   return(FALSE);
  349. }
  350.  
  351. void ButtonAction(long code)
  352. {
  353.   long MR,ML;
  354.  
  355.   if((code != SELECTDOWN)&&(code != MIDDLEDOWN)) return;
  356.  
  357.   MR = message->MouseX;
  358.   ML = message->MouseY;
  359.   MR = ((MR % 62)<10) ? -1 : MR/62;
  360.   if(MR>9) MR = -1;
  361.   if(MR == -1) return;
  362.   ML = (ML < 80+HiOff) ? -1 : (ML-80-HiOff)/CardOverlay;
  363.   if(DoubleClick(seconds,micros,message->Seconds,message->Micros))
  364.   {
  365.     if(!((code == SELECTDOWN) == MBFlag)) return;
  366.     ClearPointer(Wnd);
  367.     MoveFlag = FALSE;
  368.     seconds = 0;
  369.     if(MRold == MR) MoveCard(MR,ML,MR,ML,TRUE);
  370.     else            MoveCard(MRold,MLold,MR,ML,FALSE);
  371.   }
  372.   else
  373.   {
  374.     if(MoveFlag)
  375.     {
  376.       if((!(code == SELECTDOWN) == MBFlag)) return;
  377.       ClearPointer(Wnd);
  378.       seconds = 0;
  379.       MoveCard(MRold,MLold,MR,ML,FALSE);
  380.     }
  381.     else
  382.     {
  383.       MBFlag = (code == SELECTDOWN);
  384.       seconds = message->Seconds;
  385.       micros = message->Micros;
  386.       if(MBFlag) SetPointer(Wnd, (UWORD*)Pointer1, 11, 16, -1, 0);
  387.       else       SetPointer(Wnd, (UWORD*)Pointer2, 11, 16, -1, 0);
  388.     }
  389.     MoveFlag = !MoveFlag;
  390.   }
  391.   MRold = MR;
  392.   MLold = ML;
  393. }
  394.  
  395. long main()
  396. {
  397.   long i;
  398.   long class,code,select;
  399.   time_t t1;
  400.   BPTR lock;
  401.  
  402.   srand(time(&t1));
  403.  
  404.   /*************** Resourcen öffnen ***************/
  405.   if(i = OpenLib())
  406.   {
  407.     CleanUp();
  408.     FehlerAus(i);
  409.     return(10);
  410.   }
  411.  
  412.   if(i = SetupScreen())
  413.   {
  414.     CleanUp();
  415.     FehlerAus(i);
  416.     return(10);
  417.   }
  418.   nag.nag_Screen = Scr;
  419.  
  420.   if(i = OpenWin())
  421.   {
  422.     CleanUp();
  423.     FehlerAus(i);
  424.     return(10);
  425.   }
  426.  
  427.   if(!(lock = Lock(nag.nag_Name, ACCESS_READ))) AGFlag = FALSE;
  428.   else UnLock(lock);
  429.  
  430.   UserPort = Wnd->UserPort;
  431.   RastPort = Wnd->RPort;
  432.  
  433.   KartenMischen();
  434.  
  435.   /*************** Benutzereingabe holen **********/
  436.   while (!(done))
  437.   {
  438.     Wait(1L << UserPort->mp_SigBit);
  439.     while(message = (struct IntuiMessage *) GT_GetIMsg(UserPort))
  440.     {
  441.       class = message->Class;
  442.       code  = message->Code;
  443.       switch(class)
  444.       {
  445.         case IDCMP_MENUPICK: for(select=code;
  446.                                  select != MENUNULL;
  447.                                  select = (ItemAddress(Menus,select))->NextSelect)
  448.                                done = MenuAction(select);
  449.                              break;
  450.         case IDCMP_MOUSEBUTTONS: ButtonAction(code);
  451.                                  break;
  452.         case IDCMP_RAWKEY:
  453.         case IDCMP_VANILLAKEY: if((code == 't')||(code == 'T'))
  454.                                {
  455.                                   ButtonAction(MIDDLEDOWN); /* dirty hack; replace MMB */
  456.                                   break;
  457.                                }
  458.                                ClearPointer(Wnd);
  459.                                if((code == 'u')||(code == 'U')) Undo();
  460.                                if((code == 'o')||(code == 'O')) SucheKarte();
  461.                                if((code == 'd')||(code == 'D')) ReiheZeigen();
  462.                                if((code == 'h')||(code == 'H')||(code == 95)) Hilfe(); /* Help-taste */
  463.                                MoveFlag = FALSE;
  464.                                seconds = 0;
  465.       }
  466.       GT_ReplyIMsg(message);
  467.     }
  468.   }
  469.  
  470.   CleanUp();
  471.   return(0);
  472. }
  473.  
  474. #ifdef __MAXON__
  475. #include <workbench/startup.h>
  476.  
  477. void wbmain(struct WBStartup *ws)
  478. {
  479.   BPTR oldlock;
  480.  
  481.   oldlock = CurrentDir(ws->sm_ArgList[0].wa_Lock);
  482.   main();
  483.   CurrentDir(oldlock);
  484. }
  485. #endif
  486.