#include "exec/types.h"
#include "exec/memory.h"
#include "graphics/gfxmacros.h"
#include "graphics/copper.h"
#include "intuition/intuition.h"

#include "hardware/custom.h"


struct IntuitionBase *IntuitionBase;
struct Window *NoBorder;
struct GfxBase *GfxBase;
struct Screen *Scrn;
struct IntuiMessage *mesg;
struct RastPort *r;
struct ViewPort *vp;

#define MAXW  320 /* max width van window ! */
#define MAXH  200 /* max height van window ! */
#define HALFMAXH MAXH/2-1
#define NSTARS   64


struct NewScreen NewScrn = {
        0, 0,           /* LeftEdge, TopEdge */
        320, 200,       /* Width, Height */
        5,              /* Depth */
        0, 1,           /* DetailPen, BlockPen */
        NULL,           /* ViewModes ... value of 0 = low resolution */
        CUSTOMSCREEN,   /* Type of screen */
        NULL,           /* Font to be used as default for this screen */
        NULL,           /* DefaultTitle for its title bar */
        NULL,           /* screens user-gadgets, always NULL, ignored */
        NULL };         /* address of custom bitmap for screen */

struct NewWindow NewNoBorder = {
        0,              /* LeftEdge */
        0,              /* TopEdge  */
        MAXW, MAXH,     /* Width, Height of this window */
        -1,             /* DetailPen */
        -1,             /* BlockPen */
        MOUSEBUTTONS,   /* IDCMP Flags */
        ACTIVATE|NOCAREREFRESH|BORDERLESS|GIMMEZEROZERO,
                        /* Window Flags:  (see below for more info) */
        NULL,           /* FirstGadget */
        NULL,           /* CheckMark   */
        NULL,           /* Window title */
        NULL,           /* Pointer to Screen if not workbench */
        NULL,           /* Pointer to BitMap if a SUPERBITMAP window */
        0, 0,           /* minimum width, minimum height */
        0,0,            /* maximum width, maximum height */
        CUSTOMSCREEN    /* type waarin window opend */
        };


#define INTUITION_REV 29
#define GRAPHICS_REV 29

#define AANTCOL 90

 UWORD colors[AANTCOL] =
 {
 0X10f,0X20e,0X30d,0X40c,0X50b,
 0X60a,0X709,0X808,0X907,0Xa06,
 0Xb05,0Xc04,0Xd03,0Xe02,0Xf01,

 0Xf01,0Xe02,0Xd03,0Xc04,0Xb05,
 0Xa06,0X907,0X808,0X709,0X60a,
 0X50b,0X40c,0X30d,0X20e,0X10f,

 0X10f,0X20e,0X30d,0X40c,0X50b,
 0X60a,0X709,0X808,0X907,0Xa06,
 0Xb05,0Xc04,0Xd03,0Xe02,0Xf01,

 0Xf01,0Xe02,0Xd03,0Xc04,0Xb05,
 0Xa06,0X907,0X808,0X709,0X60a,
 0X50b,0X40c,0X30d,0X20e,0X10f,

 0X10f,0X20e,0X30d,0X40c,0X50b,
 0X60a,0X709,0X808,0X907,0Xa06,
 0Xb05,0Xc04,0Xd03,0Xe02,0Xf01,

 0Xf01,0Xe02,0Xd03,0Xc04,0Xb05,
 0Xa06,0X907,0X808,0X709,0X60a,
 0X50b,0X40c,0X30d,0X20e,0X10f


 }; 

extern short rnd();

SHORT x[NSTARS], y[NSTARS], z[NSTARS];
SHORT xo[NSTARS], yo[NSTARS];


main(ac, av)
char *av[];
int ac;
{
 ULONG mclass;
 SHORT magic,xt,halfmaxw,quartmaxw;
 int len;
 char *txt[12];
 UWORD jm;
 LONG xs, ys;
 register short i, inc;

 struct TextFont *FontPtr;
 static struct TextAttr SysFont=
       {"topaz.font",9,0,0};


 VOID OpenALL();

 OpenALL();

 rnd(-5599);

  halfmaxw = MAXW/2-1;
  quartmaxw = MAXW/4;



  /* controle op originaliteit :
     txt0,txt1,txt2 zijn de echte texten
     txt3,txt4,txt5 zijn nep texten die niet hetzelfde mogen zijn als de anderen
     txt6,txt7,txt8 moeten hetzelfde als txt0, txt1, txt2 zijn */

  txt[0] = "BAMIGA SECTOR ONE";
  txt[1] = "PROUDLY PRESENTS";
  txt[2] = "EARL WEAVER BASEBALL";

  txt[3] = "BAMIGA_SECTOR_ONE ";
  txt[4] = "PROUDLY PRESENTS ";
  txt[5] = "EARL WEAVER BASEBALL ";

  txt[6] = "BAMIGA SECTOR ONE";
  txt[7] = "PROUDLY PRESENTS";
  txt[8] = "EARL WEAVER BASEBALL";


  if(len=(strcmp(txt[0],txt[6]))!=0) for(;;);
  if(len=(strcmp(txt[1],txt[7]))!=0) for(;;);
  if(len=(strcmp(txt[2],txt[8]))!=0) for(;;);

  if(len=(strcmp(txt[0],txt[3]))==0) for(;;);
  if(len=(strcmp(txt[1],txt[4]))==0) for(;;);
  if(len=(strcmp(txt[2],txt[5]))==0) for(;;);



 if((Scrn = (struct Screen *) OpenScreen(&NewScrn)) == 0) exit(10);
 
 NewNoBorder.Screen = Scrn;

 if((NoBorder = (struct Window *) OpenWindow(&NewNoBorder)) == 0) exit(20);



 /* ======geen screentitel====== */

  ShowTitle(Scrn,FALSE);
  ClearMenuStrip(NoBorder);



 /* ======definitie van rasterport en viewport ====== */

 r=&(Scrn->RastPort);
 vp=ViewPortAddress(NoBorder);

 /*==Font==*/

  FontPtr=(struct TextFont *)OpenFont(&SysFont);
  if (FontPtr== 0)exit(FALSE);


  for(xt=0;xt<16;xt++)
   {
   SetRGB4(vp,   xt,xt,xt,xt);
   }
  for(xt=16;xt<30;xt++)
   {
   SetRGB4(vp,   xt,xt,xt,xt);
   }
  
  SetRGB4(vp,30,0,0,0);
  SetRGB4(vp,31,0,0,0);

 SetAPen(r,15);
 for(xt=0;xt<NSTARS;xt++) WritePixel(r,xt,xt);

 if (ac > 1)
   magic = atoi(av[1]); 
 else
   magic = 256;

 if(ac > 2)
   inc = atoi (av[2]);
 else
   inc = 3;

 for(xt=0;xt<NSTARS;xt++) mkpoint(xt); /* alle sterrren initialiseren */

 /* ======einde in stijl !====== */


for(;;)
 {
   while((mesg=(struct IntuiMessage *) GetMsg(NoBorder->UserPort))==NULL)
   {
    /* usecopper(jm++); */
   
    for(i=0;i<NSTARS;i++)
    {
     if ((z[i] -= inc) <= 0) mkpoint(i);
     xs = x[i] * magic / z[i] + 160;
     ys = y[i] * magic / z[i] + 100;
     SetAPen(r,0);
     WritePixel(r,xo[i], yo[i]);
     if(xs < 0 || xs > 319 || ys < 0 || ys > 199)
       mkpoint(i);
     else
       {
        SetAPen(r,(256-z[i])%16);
        WritePixel(r,xs,ys);
        xo[i] = xs; yo[i] = ys;
        }
     } /* end for */
   } /* end while */

   ReplyMsg(mesg);
   mclass=mesg->Class;
   if( (mclass=mesg->Class) == MOUSEBUTTONS) break;

 } /* end for ever loop */

 SetAPen(r,31);
 for(xt=halfmaxw;xt>=0;xt--)
 {
  Move(r,halfmaxw-xt,0);Draw(r,halfmaxw-xt,MAXH-1);
  Move(r,halfmaxw + 1+xt,0);Draw(r,halfmaxw + 1+xt,MAXH-1);
 }

   usecopper((UWORD)0);

  SetAPen(r,0);
  SetBPen(r,31);
  SetDrMd(r,JAM2);
  PrintAt(r,halfmaxw-strlen(txt[0])*5,HALFMAXH+3,txt[0]);
  SetSoftStyle(r,FS_NORMAL,FS_NORMAL);

  CloseFont(FontPtr);

  SetAPen(r,0);
  SetDrMd(r,JAM1);

  SetDrPt(r,0xAAAA);

  for(xt=0;xt<160;xt+=2)
  {
   Move(r,159-xt,0);Draw(r,159-xt,MAXH);
   Move(r,160+xt,0);Draw(r,160+xt,MAXH);
  }
  for(xt=1;xt<160;xt+=2)
  {
   Move(r,159-xt,0);Draw(r,159-xt,MAXH);
   Move(r,160+xt,0);Draw(r,160+xt,MAXH);
  }


  SetDrPt(r,0xffff);
  for(xt=0;xt<160;xt+=2)
  {
   Move(r,159-xt,0);Draw(r,159-xt,MAXH);
   Move(r,160+xt,0);Draw(r,160+xt,MAXH);
  }
  for(xt=1;xt<160;xt+=2)
  {
   Move(r,159-xt,0);Draw(r,159-xt,MAXH);
   Move(r,160+xt,0);Draw(r,160+xt,MAXH);
  }
     
     FreeVPortCopLists(vp);RemakeDisplay();
 
     txt[1] ="\n\nBAMIGA SECTOR ONE : Leading the way for Belgium on the Amiga!\n\nYou'd better contact us ... at POSTBUS 163, 2018 ANTWERP, BELGIUM!\n";
     txt[2] ="Greetings go to :\n";
     txt[3] ="THE KENT TEAM, RGB CANADA, THE MOVERS, THE GENERAL, DESTROYER, EXPLORER,";
     txt[4] ="ADJ, TLC, THE STARFRONTIERS, BST (Fine imports !), DANISH GOLD, ACS,";
     txt[5] ="ACTION 2009, THE WEB INC., IRATA, 1001 CREW, JOSTEIN & HOTLINE!";
     txt[6] ="\nSpecial Announcement : BAMIGA SECTOR ONE is now :";
     txt[7] ="";
     txt[8]  ="BAMIGA SECTOR ONE (SUBDIVISION UNITED STATES OF AMERICA) : JEFF";
     txt[9]  ="BAMIGA SECTOR ONE (SUBDIVISION HOLLAND)                  : DDL";
     txt[10] ="BAMIGA SECTOR ONE (SUBDIVISION WALLONIA)                 : CHIPS";
     txt[11] ="BAMIGA SECTOR ONE (HEADQUARTERS in BELGIUM)              : EMD & AMY\n";

     for(xt=1;xt<12;xt++)puts(txt[xt]);
 
     CloseWindow(NoBorder);
     CloseScreen(Scrn);
     CloseLibrary(GfxBase);


} 
/********************************** einde van main **********************/

VOID OpenALL()
{
 /*==Intuition==*/

 IntuitionBase=(struct IntuitionBase *)
            OpenLibrary("intuition.library",INTUITION_REV);

 if(IntuitionBase==NULL)
    exit(FALSE);

 /*==Graphics Library==*/

 GfxBase=(struct GfxBase *)
          OpenLibrary("graphics.library",GRAPHICS_REV);

 if(GfxBase==NULL)
    exit(FALSE);

}


PrintAt(rast,x,y,s)
struct RastPort *rast;
int x,y;
char *s;
{
 Move(rast,x,y);
 Text(rast,s,strlen(s));
}

usecopper(j)
UWORD j;
{
  UWORD i;
  struct UCopList *cl;
  void *dspins,*sprins,*clrins;  

  cl = AllocMem(sizeof(struct UCopList),MEMF_PUBLIC|MEMF_CLEAR,MEMF_CHIP);

    for(i=0;i<AANTCOL;i++)
    {
    CWAIT(cl,MAXH/2-46+i,0); /* 225/2-46 */
    CMOVE(cl,custom.color[31],colors[(i+j) % AANTCOL]);
    }
    CWAIT(cl,MAXH/2+45,0);
    CMOVE(cl,custom.color[31],0);
    CEND(cl);

    dspins=vp->DspIns; sprins=vp->SprIns; clrins=vp->ClrIns;

    Forbid();
     vp->DspIns=vp->SprIns=vp->ClrIns=0;
     FreeVPortCopLists(vp);
     vp->DspIns=dspins; vp->SprIns = sprins; vp->ClrIns=clrins;
     vp->UCopIns=cl;
    Permit();
 
    RethinkDisplay();
}  


mkpoint(i)
register short i;
{
 x[i] = rnd(256)- 128;
 y[i] = rnd(150)-75; 
 z[i] = 255;
}



