home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 5 / amigaformatcd05.iso / screenplay / shareware / mastermind / source / mastermind.jl.c < prev    next >
C/C++ Source or Header  |  1996-08-13  |  8KB  |  248 lines

  1.  
  2. /* MasterMind.jl By Kamran Karimi.
  3.  
  4.    Should be linked with JustLook (© Kamran Karimi) routines.
  5.  
  6.    To compile:
  7.    1> sc MasterMind.jl.c
  8.    1> slink lib:c.o MasterMind.jl.o JustLook.o Handlers.o lib lib:sc.lib\
  9.             lib:amiga.lib
  10.  
  11.    To use it, first run MasterMind, then this program. Just Look!. 
  12. */
  13.  
  14. #include <stdlib.h>
  15. #include <stdio.h>
  16. #include <intuition/intuition.h>
  17. #include <clib/intuition_protos.h>
  18. #include <clib/exec_protos.h>
  19. #include <clib/dos_protos.h>
  20.  
  21. #include "JustLook.h"
  22.  
  23. #include "MasterMind.jl.h"
  24.  
  25. #define DEBUG
  26. #ifdef DEBUG
  27. #define Write_err if(err) printf("err = %08lx\n",err)
  28. #else
  29. #define Write_err  ;
  30. #endif
  31.  
  32. #define Message Text(JLWindow->RPort,Mess,count2++)
  33.  
  34. struct IntuitionBase *IntuitionBase;
  35.  
  36. struct Window *JLWindow = NULL;
  37. struct Screen *scr = NULL;
  38. struct ScrMap SM; /* global, so that it can be in various routintes */
  39.  
  40. VOID CleanUp(VOID);
  41. VOID Text(struct RastPort *rp,char **TextArray,ULONG Index);
  42. VOID ClearLastLine(struct RastPort *rp);
  43. VOID HandleSolutionWindow(VOID);
  44. VOID HandleCheatWindow(VOID);
  45.  
  46. main()
  47. {
  48.  struct Screen *scr1 = NULL,*scr2 = NULL;
  49.  struct Window *win = NULL;
  50.  ErrorCode err;
  51.  SHORT count,count2 = 0,ShouldClose = FALSE;
  52.  
  53.  IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library",0);
  54.  if(IntuitionBase == 0) exit(100);
  55.  
  56.  scr1 = FindScreen("                             MasterMind V1.6");
  57.  scr2 = FindScreen("                             MasterMind V1.6                     Scrollable");
  58.  if((scr1 > SCR_REPEATED) && (scr2 == NULL) || (scr1 == NULL) && (scr2 > SCR_REPEATED))
  59.  {
  60.   scr = (scr1 > SCR_REPEATED) ? scr1 : scr2;
  61.   if((scr->Width > 640) || (scr->Height > 200) && (scr->Height != 256)) 
  62.    ShouldClose = TRUE;
  63.   win = FindWindow("MasterMind Window",scr);
  64.   if(win > WIN_REPEATED) 
  65.   {
  66.    InitSM(&SM,scr);
  67.    err = IEDisable(MOUSE|KBD); Write_err;
  68.    if((scr->LeftEdge) || (scr->TopEdge)) 
  69.     MoveScreen(scr,-(scr->LeftEdge),-(scr->TopEdge)); /*bring the screen up!*/
  70.    ScreenToFront(scr);
  71.    ActivateWindow(win);
  72.    Delay(30);
  73.    if(FindWindow("Choose!",scr) > WIN_REPEATED) Click(&SM,RBUTTON,0,DOWN_UP);
  74.    HandleCheatWindow();
  75.    HandleSolutionWindow();
  76.    Delay(30);
  77.    JLNewWindow.Screen = scr;
  78.    if(!(JLWindow = OpenWindow(&JLNewWindow))) CleanUp();
  79.    Message; if(IEWait(MOUSE) & RBMASK) CleanUp();/* 1 */ 
  80.    ClearLastLine(JLWindow->RPort);
  81.    err = WinResize(&SM,JLWindow,RELATIVE,-135,-45); Write_err;
  82.    Message; if(IEWait(MOUSE) & RBMASK) CleanUp();/*  2 */
  83.    ClearLastLine(JLWindow->RPort);
  84.    err = ClickGad(&SM,win,NULL,502,1); Write_err; /* clear play board */
  85.    Delay(100); /* give some time to MasterMind to open possible window */
  86.    HandleSolutionWindow(); /* this may show up after 'Abort!' */ 
  87.    if(ShouldClose) 
  88.     MoveWindow(JLWindow,0,scr->Height - JLWindow->TopEdge - 150); 
  89.    Message; if(IEWait(MOUSE) & RBMASK) CleanUp();/* 3 */
  90.    ClearLastLine(JLWindow->RPort);
  91.    err = ClickGad(&SM,win,NULL,503,1); Write_err;/* begin changing configuration */
  92.    Delay(30);
  93.    err = ClickGad(&SM,win,NULL,1000,1); Write_err;/* how many colors to guess? */
  94.     Delay(30);
  95.    err = RawType(RawColum,5,10); Write_err;
  96.    Delay(30);
  97.    err = ClickGad(&SM,win,NULL,1001,1); Write_err; /* among how many colors? */
  98.    Delay(20);
  99.    err = RawType(RawColor,6,10); Write_err; 
  100.    Delay(20);
  101.    err = ClickGad(&SM,win,NULL,1002,1); Write_err; /* how many trials are allowed? */
  102.    Delay(30);
  103.    err = RawType(RawRow,5,10); Write_err;
  104.    Delay(30);
  105.    if(ShouldClose) CloseWindow(JLWindow);
  106.    err = ClickGad(&SM,win,NULL,503,1); Write_err;
  107.    /* now it is possible that the screen has changed! */
  108.    if(ShouldClose) 
  109.    {
  110.     Delay(150); /* this should be enough even for the slowest Amigas! */
  111.     scr = FindScreen("                             MasterMind V1.6");
  112.     win = FindWindow("MasterMind Window",scr);
  113.     InitSM(&SM,scr);
  114.     JLNewWindow.Screen = scr; 
  115.     JLNewWindow.Width = 417;
  116.     JLNewWindow.Height = 75;
  117.     JLNewWindow.LeftEdge = 20;
  118.     JLNewWindow.TopEdge = 15;
  119.     if(!(JLWindow = OpenWindow(&JLNewWindow))) CleanUp();
  120.    }
  121.    Message; if(IEWait(MOUSE) & RBMASK) CleanUp();/*  4 */
  122.    ClearLastLine(JLWindow->RPort);
  123.    for(count = 0;count < 4;count++)
  124.    {
  125.     err = ClickGad(&SM,win,NULL,100 + 2 * count,1); Write_err;
  126.     Delay(30);
  127.     err = ClickGad(&SM,win,NULL,1 + count,1); Write_err; 
  128.     Delay(30);
  129.    }                     /* we did not click the last square! */ 
  130.    Message; if(IEWait(MOUSE) & RBMASK) CleanUp();/*  5 */
  131.    ClearLastLine(JLWindow->RPort);
  132.    err = ClickGad(&SM,win,"<- Done",0,1); Write_err;  
  133.    /* here we got an error from MasterMind */
  134.    /* let us "correct" it as follows: */ 
  135.    Message; if(IEWait(MOUSE) & RBMASK) CleanUp();/*  6 */
  136.    ClearLastLine(JLWindow->RPort);
  137.    err = ClickGad(&SM,win,NULL,1 + 4,1); Write_err;
  138.    Delay(30); /* two repetative colors! */
  139.  
  140.    err = ClickGad(&SM,win,"<- Done",0,1); Write_err;/* try again the Done gadget */
  141.    Delay(30); 
  142.    Message; if(IEWait(MOUSE) & RBMASK) CleanUp();/*  7 */
  143.    ClearLastLine(JLWindow->RPort);
  144.    err = ClickGad(&SM,win,NULL,100 + 4 * 2,1); Write_err; 
  145.    Delay(30);
  146.    err = ClickGad(&SM,win,NULL,1 + 4,1); Write_err; 
  147.    Delay(30);
  148.    Message; if(IEWait(MOUSE) & RBMASK) CleanUp();/*  8 */
  149.    ClearLastLine(JLWindow->RPort);
  150.    err = ClickGad(&SM,win,"<- Done",0,1); Write_err; /* try again the Done gadget */
  151.    Delay(30); 
  152.  
  153.    if(FindGad(win,"   OK   ",0)) /* We Won!!! */
  154.    {
  155.     count2 = 10;
  156.     Message; if(IEWait(MOUSE) & RBMASK) CleanUp();
  157.     ClearLastLine(JLWindow->RPort);
  158.     err = ClickGad(&SM,win,"   OK   ",0,1); 
  159.     Write_err;  Delay(30);
  160.     count2 = 8; 
  161.    }
  162.    Message; if(IEWait(MOUSE) & RBMASK) CleanUp();/*  9 */
  163.    ClearLastLine(JLWindow->RPort);
  164.    err = ClickGad(&SM,win," Cheat! ",0,1); Write_err;
  165.    Delay(30);
  166.    
  167.    HandleCheatWindow();
  168.  
  169.    Message; IEWait(MOUSE); /* 10 */
  170.    CloseWindow(JLWindow);
  171.    err = ClickGad(&SM,win,NULL,502,1);
  172.    Write_err;  Delay(30);
  173.    HandleSolutionWindow();
  174.    Delay(100);
  175.    err = ClickGad(&SM,win,"Quit Game",0,1); /* really DONE! */
  176.    Write_err; 
  177.    err = IEEnable(MOUSE|KBD);
  178.    Write_err;
  179.   }
  180.   else if(win == WIN_REPEATED) 
  181.    printf("Impossible: Two windows with the same name in MasterMind Screen!\n");
  182.   else printf("Impossible: MasterMind window not found!\n");
  183.  }
  184.  else if((scr1 == SCR_REPEATED) || (scr2 == SCR_REPEATED)) 
  185.   printf("you have Two screens with the same name open!\n");
  186.  else if((scr1 == NULL) && (scr2 == NULL))
  187.   printf("you should first run MasterMind, then this program!\n"); 
  188.  CloseLibrary((struct Library *)IntuitionBase);
  189.  exit(0);
  190. }
  191.  
  192. VOID HandleCheatWindow(VOID)
  193. {
  194.  struct Window *win;
  195.  ErrorCode err;
  196.  
  197.  win = FindWindow("Naughty!",scr);
  198.  if(win)
  199.  {
  200.   Delay(50);
  201.   err = WinAct(&SM,win,CLOSEWIN); Write_err;
  202.  }
  203.  
  204. VOID HandleSolutionWindow(VOID)
  205. {
  206.  struct Window *win;
  207.  ErrorCode err;
  208.  
  209.  win = FindWindow("Solution",scr);
  210.  if(win) 
  211.  {
  212.   err = WinDrag(&SM,win,ABSOLUTE,250,30); Write_err; 
  213.   Delay(50);
  214.   err = WinAct(&SM,win,CLOSEWIN); Write_err;
  215.  }
  216. }
  217.  
  218. VOID CleanUp(VOID)
  219. {
  220.  if(JLWindow) CloseWindow(JLWindow);
  221.  IEEnable(MOUSE|KBD);
  222.  CloseLibrary((struct Library *)IntuitionBase);
  223.  exit(0);
  224. }
  225.  
  226. VOID Text(struct RastPort *rp,char **TextArray,ULONG Index)
  227. {
  228.  int count;
  229.  
  230.  for(count = 0;count < 6;count++)
  231.  {
  232.   TextToShow[0].IText = TextToShow[1].IText;
  233.   TextToShow[1].IText = TextToShow[2].IText;
  234.   TextToShow[2].IText = TextToShow[3].IText;
  235.   TextToShow[3].IText = TextToShow[4].IText;
  236.   TextToShow[4].IText = TextToShow[5].IText;
  237.   TextToShow[5].IText = TextArray[Index * 6 + count];
  238.   PrintIText(rp,&TextToShow[5],0,0);
  239.  }
  240. }
  241.  
  242. VOID ClearLastLine(struct RastPort *rp)
  243. {
  244.  PrintIText(rp,&BlankLine,0,0);
  245. }
  246.  
  247.