#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 INTUITION_REV 29
#define GRAPHICS_REV 29

#define AANTCOL 90

 UWORD colors[AANTCOL] =
 {
 0X00f,0X20f,0X40f,0X60f,0X80f,
 0Xa0f,0Xc0f,0Xe0f,0Xc0f,0Xa0f,
 0X80f,0X60f,0X40f,0X20f,0X00f,

 0Xf00,0Xf02,0Xf04,0Xf06,0Xf08,
 0Xf0a,0Xf0c,0Xf0f,0Xf0c,0Xf0a,
 0Xf08,0Xf06,0Xf04,0Xf02,0Xf00,

 0X00f,0X20f,0X40f,0X60f,0X80f,
 0Xa0f,0Xc0f,0Xe0f,0Xc0f,0Xa0f,
 0X80f,0X60f,0X40f,0X20f,0X00f,

 0X00f,0X20f,0X40f,0X60f,0X80f,
 0Xa0f,0Xc0f,0Xe0f,0Xc0f,0Xa0f,
 0X80f,0X60f,0X40f,0X20f,0X00f,

 0Xf00,0Xf02,0Xf04,0Xf06,0Xf08,
 0Xf0a,0Xf0c,0Xf0f,0Xf0c,0Xf0a,
 0Xf08,0Xf06,0Xf04,0Xf02,0Xf00,

 0X00f,0X20f,0X40f,0X60f,0X80f,
 0Xa0f,0Xc0f,0Xe0f,0Xc0f,0Xa0f,
 0X80f,0X60f,0X40f,0X20f,0X00f,

 }; 

main()
{
 ULONG flags,mclass;
 SHORT x,y,w,h,d,c0,c1,einde,txt0ycrd,txt1ycrd,txt2ycrd,xt;
 USHORT mode;
 int len;
 char *txt[10];
 struct TextFont *FontPtr;
 static struct TextAttr SysFont=
       {"topaz.font",9,0,0};

  UWORD jm;


 VOID OpenALL();


  txt[6] = "BAMIGA SECTOR ONE";
  txt[7] = "PRESENTS";
  txt[8] = "FRACTION ACTION (FINAL)";


 OpenALL();

 /* ======Open een hires custom screen====== */

 y=0;
 w=320;
 h=200;
 d=5; /* max 32 colors ! */
 c0=0x00;
 c1=0x01;
 mode=NULL;

 Scrn=(struct Screen *)
         make_screen(y,w,h,d,c0,c1,mode,NULL);

 /* ======open een borderless window ====== */

 x=y=0;
 w=320;
 h=200;
 flags=ACTIVATE|NOCAREREFRESH|BORDERLESS|BACKDROP;
 NoBorder=(struct Window *)
             make_window(x,y,w,h,NULL,flags,Scrn);

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

 ShowTitle(Scrn,0);

 /* ======definitie van RPort !====== */

 r=NoBorder->RPort;
 vp=ViewPortAddress(NoBorder);

  SetRGB4(ViewPortAddress(NoBorder),0,0,0,0);

  for(x=1;x<16;x++)
   {
   SetRGB4(vp,   x,x-1,x-1,x+1);
   SetRGB4(vp,16+x,x+1,x+1,x-1);
   };

  txt[3] = "BAMIGA_SECTOR_ONE ";
  txt[4] = "PRESENTS ";
  txt[5] = "FRACTION ACTION (FINAL) ";


  for(xt=159;xt>=0;xt--)
   {
   SetAPen(r,xt%31);

   Move(r,159,99);Draw(r,159-xt,0);
   Move(r,159,99);Draw(r,159+xt,0);
   Move(r,159,99);Draw(r,159-xt,199);
   Move(r,159,99);Draw(r,159+xt,199);
   };

  for(xt=159;xt>=0;xt--)
   {
   SetAPen(r,xt%31);

   Move(r,79,0);Draw(r,159-xt,99);
   Move(r,239,0);Draw(r,159+xt,99);
   Move(r,79,199);Draw(r,159-xt,99);
   Move(r,239,199);Draw(r,159+xt,99);
   };


  /* zwart vlak om in te schrijven */

  SetAPen(r,0);
  SetBPen(r,0);
  for(xt=0;xt<160;xt++)
  {
   Move(r,159-xt,99-50);Draw(r,159-xt,99+50);
   Move(r,160+xt,99-50);Draw(r,160+xt,99+50);
  }
   
  SetAPen(r,10);
  RectFill(r,5,99-55+10,319-5,99+55-10);

  SetAPen(r,0);
  RectFill(r,10,99-55+15,319-10,99+55-15);


  /* text , zie ook OpenAll() */
  /* 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 hetzelfe als txt0, txt1, txt2 zijn */



  txt[0] = "BAMIGA SECTOR ONE";
  txt[1] = "PRESENTS";
  txt[2] = "FRACTION ACTION (FINAL)";


  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(;;);

 
 

 /*==Font==*/

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

  SetAPen(r,31);
  SetFont(r,FontPtr);
  SetSoftStyle(r,FSF_BOLD,FSF_BOLD);
  PrintAt(r,73,99-20-4,txt[0]);
  PrintAt(r,118,104-4,txt[1]);

  PrintAt(r,159-strlen(txt[2])*5,99+33-6,txt[2]);/* 1LETTER = 10.4 PIXELS*/


 /* ======einde in stijl !====== */
einde=0;
while(!einde)
 {
  while((mesg=(struct IntuiMessage *)
      GetMsg(NoBorder->UserPort))==NULL)
  {
   usecopper(jm++);
  }

  ReplyMsg(mesg);
  mclass=mesg->Class;


  if(mclass==MOUSEBUTTONS)
   {
     einde=1;

     txt[1]="\n\nBAMIGA SECTOR ONE : Leading the way for Belgium on the Amiga !\n";
     txt[2]="Greetings go to :\n";
     txt[3]="KENT TEAM, RGB CANADA, ADJ, TLC (MZP : Wake up Christian !), THE MOVERS,";
     txt[4]="HOTLINE, BST (Fine imports !), ACTION 2009, DANISH GOLD, ACS, THE WEB INC.,";
     txt[5]="IRATA, 1001 CREW, DESTROYER, JOSTEIN, THE GENERAL and all good friends !\n";
     txt[6]="Special Greetings go to :\n";
     txt[7]="The best Amiga-demo-makers in the Universe, namely : THE STARFRONTIERS !";
     txt[8]="Your Uridium-Intro v1.0 is breathtaking, dazzling, astonishing, ...";
     txt[9]="(Thanks again for helping us with that AmigaDos programming problem.)\n";

     for(xt=1;xt<10;xt++)puts(txt[xt]);
 
     usecopper((UWORD)0);

     for(xt=159;xt>=0;xt--)
     {
      Move(r,159-xt,99-45);Draw(r,159-xt,99+45);
      Move(r,160+xt,99-45);Draw(r,160+xt,99+45);
     }

     FreeVPortCopLists(vp);RemakeDisplay();

     SetAPen(r,31);
     SetDrMd(r,JAM2);
     PrintAt(r,73,99+r->TxBaseline,txt[0]);
     SetSoftStyle(r,FS_NORMAL,FS_NORMAL);

     CloseFont(FontPtr);


     for(xt=0;xt<50;xt++)
     {
      Move(r,0,xt);Draw(r,319,xt);
      Move(r,0,199-xt);Draw(r,319,199-xt);
      Delay(2);
     }

     scrollscreen(Scrn);


     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);

}

make_window(x,y,w,h,name,flags,screen)
SHORT x,y,w,h;
UBYTE *name;
ULONG flags;
struct Screen *screen;

{
 struct NewWindow NewWindow;

 NewWindow.LeftEdge = x;
 NewWindow.TopEdge = y;
 NewWindow.Width = w;
 NewWindow.Height = h;
 NewWindow.DetailPen = -1;
 NewWindow.BlockPen = -1;
 NewWindow.Title = name;
 NewWindow.Flags = flags;
 NewWindow.IDCMPFlags = MOUSEBUTTONS;
 NewWindow.Type = CUSTOMSCREEN;
 NewWindow.FirstGadget = NULL;
 NewWindow.CheckMark = NULL;
 NewWindow.Screen = screen;
 NewWindow.BitMap = NULL;
 NewWindow.MinWidth = 0;
 NewWindow.MinHeight = 0;
 NewWindow.MaxWidth = 0;
 NewWindow.MaxHeight = 0;

 return(OpenWindow(&NewWindow));

}


make_screen(y,w,h,d,color0,color1,mode,name)
SHORT y,w,h,d;
UBYTE color0,color1,*name;
USHORT mode;
{
 struct NewScreen NewScreen;

 NewScreen.LeftEdge = 0;
 NewScreen.TopEdge = y;
 NewScreen.Width = w;
 NewScreen.Height = h;
 NewScreen.Depth = d;
 NewScreen.DetailPen = color0;
 NewScreen.BlockPen = color1;
 NewScreen.ViewModes = mode;
 NewScreen.Type = CUSTOMSCREEN;
 NewScreen.Font = NULL;
 NewScreen.DefaultTitle = name;
 NewScreen.Gadgets = NULL;
 NewScreen.CustomBitMap = NULL;

 return(OpenScreen(&NewScreen));
}

scrollscreen(screen)
struct Screen *screen;
{
 SHORT i;

 for(i=0;i<50;i++) MoveScreen(screen,0,4);

}


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,54+i,0);
    CMOVE(cl,custom.color[31],colors[(i+j) % AANTCOL]);
    }
    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();
}  






