/* based on the articles on cycloids in Creative Computing May-June 1984
and the article in February 1984 BYTE "Five Original Graphics" */

struct CopList { int dummy; };
struct UCopList { int dummy; };
struct cprlist { int dummy; };
struct Region { int dummy; };
struct VSprite { int dummy; };
struct collTable { int dummy; };
struct KeyMap { int dummy; };
struct Device { int dummy; };
struct Unit { int dummy; };
struct GfxBase { int dummy; };
void IMsg();
short int stopcheck();

/* Include the definitions  and functions we need */

#include "hypocycloid.h"
#include "hypo.c"

struct IntuiText Menu0IText [] = {

   {
   0,3,JAM2,      /* Front Pen, Back Pen, Draw Mode */
   0,0,            /* Left Edge, Top Edge */
   &TestFont,         /* pointer to Text Font */
   " new",   /* text of Menu Item */
   NULL            /* pointer to next IText */
   },

   {0,3,JAM2,0,0,&TestFont," go ",NULL },
   {0,3,JAM2,0,0,&TestFont,"stop",NULL },
   {0,3,JAM2,0,0,&TestFont,"save",NULL },
   {0,3,JAM2,0,0,&TestFont,"quit",NULL },
};

struct MenuItem Menu0Item[5] = {
   {
   &Menu0Item[1],         /* pointer to next Item */
   0,0,45,9,      /* Left, Top, Width, Height */
   ITEMTEXT | ITEMENABLED | HIGHCOMP,   /* Flags */
   0,            /* no mutual exclude */
   (APTR)&Menu0IText[0],   /* Render info */   
   NULL,NULL,NULL,         /*Alt Image, Command (amiga) char, subitem*/
   MENUNULL      /* next select */
   },

   {&Menu0Item[2],0,9,45,9,ITEMTEXT | ITEMENABLED | HIGHCOMP,
   0,(APTR)&Menu0IText[1],NULL,NULL,NULL,MENUNULL},

   {&Menu0Item[3],0,18,45,9,ITEMTEXT | ITEMENABLED | HIGHCOMP,
   0,(APTR)&Menu0IText[2],NULL,NULL,NULL,MENUNULL},

   {&Menu0Item[4],0,27,45,9,ITEMTEXT | ITEMENABLED | HIGHCOMP,
   0,(APTR)&Menu0IText[3],NULL,NULL,NULL,MENUNULL},

   {NULL,0,36,45,9,ITEMTEXT | ITEMENABLED | HIGHCOMP,
   0,(APTR)&Menu0IText[4],NULL,NULL,NULL,MENUNULL}
};

struct IntuiText Menu1IText [] = {

   {
   0,3,JAM2,      /* Front Pen, Back Pen, Draw Mode */
   0,0,            /* Left Edge, Top Edge */
   &TestFont,         /* pointer to Text Font */
   "  0   ",   /* text of Menu Item */
   NULL            /* pointer to next IText */
   },

   {0,3,JAM2,0,0,&TestFont," .25  ",NULL },
   {0,3,JAM2,0,0,&TestFont," .50  ",NULL },
   {0,3,JAM2,0,0,&TestFont," .75  ",NULL },
   {0,3,JAM2,0,0,&TestFont," 1.0  ",NULL },
   {0,3,JAM2,0,0,&TestFont," 1.25 ",NULL },
   {0,3,JAM2,0,0,&TestFont," 1.50 ",NULL },
   {0,3,JAM2,0,0,&TestFont," 1.75 ",NULL },
   {0,3,JAM2,0,0,&TestFont," 2.0  ",NULL },
   {0,3,JAM2,0,0,&TestFont," 2.5  ",NULL },
};

struct MenuItem Menu1Item[10] = {
   {
   &Menu1Item[1],         /* pointer to next Item */
   0,0,65,9,      /* Left, Top, Width, Height */
   ITEMTEXT | ITEMENABLED | HIGHCOMP,   /* Flags */
   0,            /* no mutual exclude */
   (APTR)&Menu1IText[0],   /* Render info */
   NULL,NULL,NULL,         /*Alt Image, Command (amiga) char, subitem*/
   MENUNULL      /* next select */
   },

   {&Menu1Item[2],0,9,65,9,ITEMTEXT | ITEMENABLED | HIGHCOMP,
   0,(APTR)&Menu1IText[1],NULL,NULL,NULL,MENUNULL},

   {&Menu1Item[3],0,18,65,9,ITEMTEXT | ITEMENABLED | HIGHCOMP,
   0,(APTR)&Menu1IText[2],NULL,NULL,NULL,MENUNULL},

   {&Menu1Item[4],0,27,65,9,ITEMTEXT | ITEMENABLED | HIGHCOMP,
   0,(APTR)&Menu1IText[3],NULL,NULL,NULL,MENUNULL},

   {&Menu1Item[5],0,36,65,9,ITEMTEXT | ITEMENABLED | HIGHCOMP,
   0,(APTR)&Menu1IText[4],NULL,NULL,NULL,MENUNULL},

   {&Menu1Item[6],0,45,65,9,ITEMTEXT | ITEMENABLED | HIGHCOMP,
   0,(APTR)&Menu1IText[5],NULL,NULL,NULL,MENUNULL},

   {&Menu1Item[7],0,54,65,9,ITEMTEXT | ITEMENABLED | HIGHCOMP,
   0,(APTR)&Menu1IText[6],NULL,NULL,NULL,MENUNULL},

   {&Menu1Item[8],0,63,65,9,ITEMTEXT | ITEMENABLED | HIGHCOMP,
   0,(APTR)&Menu1IText[7],NULL,NULL,NULL,MENUNULL},

   {&Menu1Item[9],0,72,65,9,ITEMTEXT | ITEMENABLED | HIGHCOMP,
   0,(APTR)&Menu1IText[8],NULL,NULL,NULL,MENUNULL},

   {NULL,0,81,65,9,ITEMTEXT | ITEMENABLED | HIGHCOMP,
   0,(APTR)&Menu1IText[9],NULL,NULL,NULL,MENUNULL}
};
struct IntuiText Menu2IText [] = {

   {
   0,3,JAM2,      /* Front Pen, Back Pen, Draw Mode */
   0,0,            /* Left Edge, Top Edge */
   &TestFont,         /* pointer to Text Font */
   "  0  ",   /* text of Menu Item */
   NULL            /* pointer to next IText */
   },

   {0,3,JAM2,0,0,&TestFont," 10% ",NULL },
   {0,3,JAM2,0,0,&TestFont," 20% ",NULL },
   {0,3,JAM2,0,0,&TestFont," 30% ",NULL },
};

struct MenuItem Menu2Item[4] = {
   {
   &Menu2Item[1],         /* pointer to next Item */
   0,0,55,9,      /* Left, Top, Width, Height */
   ITEMTEXT | ITEMENABLED | HIGHCOMP,   /* Flags */
   0,            /* no mutual exclude */
   (APTR)&Menu2IText[0],   /* Render info */
   NULL,NULL,NULL,         /*Alt Image, Command (amiga) char, subitem*/
   MENUNULL      /* next select */
   },

   {&Menu2Item[2],0,9,55,9,ITEMTEXT | ITEMENABLED | HIGHCOMP,
   0,(APTR)&Menu2IText[1],NULL,NULL,NULL,MENUNULL},

   {&Menu2Item[3],0,18,55,9,ITEMTEXT | ITEMENABLED | HIGHCOMP,
   0,(APTR)&Menu2IText[2],NULL,NULL,NULL,MENUNULL},

   {NULL,0,27,55,9,ITEMTEXT | ITEMENABLED | HIGHCOMP,
   0,(APTR)&Menu2IText[3],NULL,NULL,NULL,MENUNULL}
};
struct IntuiText Menu3IText [] = {

   {
   0,3,JAM2,      /* Front Pen, Back Pen, Draw Mode */
   0,0,            /* Left Edge, Top Edge */
   &TestFont,         /* pointer to Text Font */
   "10%",   /* text of Menu Item */
   NULL            /* pointer to next IText */
   },

   {0,3,JAM2,0,0,&TestFont,"20%",NULL },
   {0,3,JAM2,0,0,&TestFont,"30%",NULL },
   {0,3,JAM2,0,0,&TestFont,"40%",NULL },
   {0,3,JAM2,0,0,&TestFont,"50%",NULL },
   {0,3,JAM2,0,0,&TestFont,"60%",NULL },
   {0,3,JAM2,0,0,&TestFont,"70%",NULL },
   {0,3,JAM2,0,0,&TestFont,"80%",NULL },
};

struct MenuItem Menu3Item[8] = {
   {
   &Menu3Item[1],         /* pointer to next Item */
   0,0,35,9,      /* Left, Top, Width, Height */
   ITEMTEXT | ITEMENABLED | HIGHCOMP,   /* Flags */
   0,            /* no mutual exclude */
   (APTR)&Menu3IText[0],   /* Render info */
   NULL,NULL,NULL,         /*Alt Image, Command (amiga) char, subitem*/
   MENUNULL      /* next select */
   },

   {&Menu3Item[2],0,9,35,9,ITEMTEXT | ITEMENABLED | HIGHCOMP,
   0,(APTR)&Menu3IText[1],NULL,NULL,NULL,MENUNULL},

   {&Menu3Item[3],0,18,35,9,ITEMTEXT | ITEMENABLED | HIGHCOMP,
   0,(APTR)&Menu3IText[2],NULL,NULL,NULL,MENUNULL},

   {&Menu3Item[4],0,27,35,9,ITEMTEXT | ITEMENABLED | HIGHCOMP,
   0,(APTR)&Menu3IText[3],NULL,NULL,NULL,MENUNULL},

   {&Menu3Item[5],0,36,35,9,ITEMTEXT | ITEMENABLED | HIGHCOMP,
   0,(APTR)&Menu3IText[4],NULL,NULL,NULL,MENUNULL},

   {&Menu3Item[6],0,45,35,9,ITEMTEXT | ITEMENABLED | HIGHCOMP,
   0,(APTR)&Menu3IText[5],NULL,NULL,NULL,MENUNULL},

   {&Menu3Item[7],0,54,35,9,ITEMTEXT | ITEMENABLED | HIGHCOMP,
   0,(APTR)&Menu3IText[6],NULL,NULL,NULL,MENUNULL},

   {NULL,0,63,35,9,ITEMTEXT | ITEMENABLED | HIGHCOMP,
   0,(APTR)&Menu3IText[7],NULL,NULL,NULL,MENUNULL}
};
struct IntuiText Menu4IText [] = {

   {
   0,3,JAM2,      /* Front Pen, Back Pen, Draw Mode */
   0,0,            /* Left Edge, Top Edge */
   &TestFont,         /* pointer to Text Font */
   "  0  ",   /* text of Menu Item */
   NULL            /* pointer to next IText */
   },

   {0,3,JAM2,0,0,&TestFont,"  3  ",NULL },
   {0,3,JAM2,0,0,&TestFont,"  6  ",NULL },
   {0,3,JAM2,0,0,&TestFont,"  9  ",NULL },
   {0,3,JAM2,0,0,&TestFont," 12  ",NULL },
   {0,3,JAM2,0,0,&TestFont," 15  ",NULL },
   {0,3,JAM2,0,0,&TestFont," 18  ",NULL },
   {0,3,JAM2,0,0,&TestFont," 21  ",NULL },
   {0,3,JAM2,0,0,&TestFont," 24  ",NULL },
   {0,3,JAM2,0,0,&TestFont," 30  ",NULL },
};

struct MenuItem Menu4Item[10] = {
   {
   &Menu4Item[1],         /* pointer to next Item */
   0,0,55,9,      /* Left, Top, Width, Height */
   ITEMTEXT | ITEMENABLED | HIGHCOMP,   /* Flags */
   0,            /* no mutual exclude */
   (APTR)&Menu4IText[0],   /* Render info */
   NULL,NULL,NULL,         /*Alt Image, Command (amiga) char, subitem*/
   MENUNULL      /* next select */
   },

   {&Menu4Item[2],0,9,55,9,ITEMTEXT | ITEMENABLED | HIGHCOMP,
   0,(APTR)&Menu4IText[1],NULL,NULL,NULL,MENUNULL},

   {&Menu4Item[3],0,18,55,9,ITEMTEXT | ITEMENABLED | HIGHCOMP,
   0,(APTR)&Menu4IText[2],NULL,NULL,NULL,MENUNULL},

   {&Menu4Item[4],0,27,55,9,ITEMTEXT | ITEMENABLED | HIGHCOMP,
   0,(APTR)&Menu4IText[3],NULL,NULL,NULL,MENUNULL},

   {&Menu4Item[5],0,36,55,9,ITEMTEXT | ITEMENABLED | HIGHCOMP,
   0,(APTR)&Menu4IText[4],NULL,NULL,NULL,MENUNULL},

   {&Menu4Item[6],0,45,55,9,ITEMTEXT | ITEMENABLED | HIGHCOMP,
   0,(APTR)&Menu4IText[5],NULL,NULL,NULL,MENUNULL},

   {&Menu4Item[7],0,54,55,9,ITEMTEXT | ITEMENABLED | HIGHCOMP,
   0,(APTR)&Menu4IText[6],NULL,NULL,NULL,MENUNULL},

   {&Menu4Item[8],0,63,55,9,ITEMTEXT | ITEMENABLED | HIGHCOMP,
   0,(APTR)&Menu4IText[7],NULL,NULL,NULL,MENUNULL},

   {&Menu4Item[9],0,72,55,9,ITEMTEXT | ITEMENABLED | HIGHCOMP,
   0,(APTR)&Menu4IText[8],NULL,NULL,NULL,MENUNULL},

   {NULL,0,81,55,9,ITEMTEXT | ITEMENABLED | HIGHCOMP,
   0,(APTR)&Menu4IText[9],NULL,NULL,NULL,MENUNULL}
};
struct Menu BdMenu[5] = {
   {
   &BdMenu[1],      /* ptr to next Menu */
   10,0,45,0,   /* left,top,width,height--top and height ignored */
   MENUENABLED,   /* Flags */
   "Main",   /* menu title */
   &Menu0Item[0]   /* First Item in list */
   },
{&BdMenu[2],65,0,65,0,MENUENABLED,"Reduce",&Menu1Item[0]},
{&BdMenu[3],140,0,55,0,MENUENABLED,"Begin",&Menu2Item[0]},
{&BdMenu[4],205,0,35,0,MENUENABLED,"End",&Menu3Item[0]},
{NULL,250,0,55,0,MENUENABLED,"Angle",&Menu4Item[0]}
};
short int an,bd,cc,ex,nf,rr;
double bf,bl,cf,dd,l,z;
extern short int aa,bb;

main()
{
   USHORT drawing;

   drawing=1;
   nf=0;
   ex=0;
   cc=0;
   an=0;
   rr=1;
   bd=1;
   dd=360.0;
   bf=0;
   cf=.1;
   l=0;
   bl=1.0;
   z=1;
   getradii();
   initwind();
   init_scr();
   fillscreen();
   precalculate();
   while(drawing){
      IMsg();
   }
}   /* end of main */

getradii()
{
   aa=0;
   bb=1;
   while (aa<bb){
   printf("What is the large radius");
   scanf ("%h",&aa);
   printf("What is the small radius");
   scanf ("%h",&bb);
   }
}

void IMsg()

{
   struct IntuiMessage *BdMsg;      /* Intuition message structure */
   ULONG Mclass;               /* Message class */
   USHORT Mcode;            /* Message code */

   if (nf==1){
      Cleanup();
      getradii();
      initwind();
      init_scr();
      fillscreen();
      precalculate();
   }
while (BdMsg = (struct IntuiMessage *)GetMsg(w->UserPort))
   {
   Mclass = BdMsg->Class;
   Mcode = BdMsg->Code;
   ReplyMsg(BdMsg);
   switch (Mclass) {
      case CLOSEWINDOW:
         Cleanup();
         exit(TRUE);
         break;

      case MENUPICK:
         switch (MENUNUM(Mcode)){
            case 0:
               switch (ITEMNUM(Mcode)){
                  case 0:
                     Cleanup();
                     getradii();
                     initwind();
                     init_scr();
                     fillscreen();
                     precalculate();
                     break;
                  case 1:
                     fillscreen();
                     precalculate();
                     epic();
                     doepic();
                     break;
                  case 2:
                     break;
                  case 3:
                     SavePicture();
                     initwind();
                     init_scr();
                     fillscreen();
                     precalculate();
                     break;
                  case 4:
                     Cleanup();
                     exit(TRUE);
                     break;
               }
               break;
            case 1:
               switch (ITEMNUM(Mcode)){
                  case 0:
                     cc=0;
                     break;
                  case 1:
                     cc=.25;
                     break;
                  case 2:
                     cc=.5;
                     break;
                  case 3:
                     cc=.75;
                     break;
                  case 4:
                     cc=1.0;
                     break;
                  case 5:
                     cc=1.25;
                     break;
                  case 6:
                     cc=1.5;
                     break;
                  case 7:
                     cc=1.75;
                     break;
                  case 8:
                     cc=2.0;
                     break;
                  case 9:
                     cc=2.5;
                     break;
               }
               break;
            case 2:
               switch (ITEMNUM(Mcode)){
                  case 0:
                     bf=0;
                     break;
                  case 1:
                     bf=.1;
                     break;
                  case 2:
                     bf=.2;
                     break;
                  case 3:
                     bf=.3;
                     break;
               }
               break;
            case 3:
               switch (ITEMNUM(Mcode)){
                  case 0:
                     cf=.1;
                     break;
                  case 1:
                     cf=.2;
                     break;
                  case 2:
                     cf=.3;
                     break;
                  case 3:
                     cf=.4;
                     break;
                  case 4:
                     cf=.5;
                     break;
                  case 5:
                     cf=.6;
                     break;
                  case 6:
                     cf=.7;
                     break;
                  case 7:
                     cf=.8;
                     break;
               }
               break;
            case 4:
               switch (ITEMNUM(Mcode)){
                  case 0:
                     an=0;
                     break;
                  case 1:
                     an=3;
                     break;
                  case 2:
                     an=6;
                     break;
                  case 3:
                     an=9;
                     break;
                  case 4:
                     an=12;
                     break;
                  case 5:
                     an=15;
                     break;
                  case 6:
                     an=18;
                     break;
                  case 7:
                     an=21;
                     break;
                  case 8:
                     an=24;
                     break;
                  case 9:
                     an=30;
                     break;
               }
               break;
         }
   } 
  /* end of Class switch */      
   }/* while */
}

init_scr()
{
 
SetMenuStrip(w,&BdMenu);

}   /* end of init_scr */

Cleanup()
{
   CloseWindow(w);
   CloseScreen(screen);
}

short int stopcheck()

{
   struct IntuiMessage *BdMsg;      /* Intuition message structure */
   ULONG Mclass;               /* Message class */
   USHORT Mcode,ItemNum;

ex = 0;
nf = 0;
while (BdMsg = (struct IntuiMessage *)GetMsg(w->UserPort))
   {
   Mclass = BdMsg->Class;
   Mcode = BdMsg->Code;
   ReplyMsg(BdMsg);
   switch (Mclass) {
      case CLOSEWINDOW:
         Cleanup();
         exit(TRUE);
         break;
      case MENUPICK:
         switch (MENUNUM(Mcode)){
            case 0:
               ItemNum = ITEMNUM(Mcode);
               switch (ItemNum){
                  case 0:
                     ex = 1;
                     nf = 1;
                     break;
                  case 1:
                     break;
                  case 2:
                     ex = 1;
                     break;
                  case 3:
                     break;
                  case 4:
                     Cleanup();
                     exit(TRUE);
               }
               break;
         }
   }
   }/* while */

return(ex);
}
