/*
      Programma: LINES , versie 1.2 .
      Auteur: Only Once p.a. Zeishof 58
                             6681 EN  Bemmel .
      Taal: C , te vertalen met Lattice en Aztec .

      Dit programma is een zuiver voorbeeld van hoe het niet moet in C,
      maar hoe het wel sneller gaat. Het is een kleine demonstratie van
      het trekken van lijnen in de hoogste resolutie.
      Om te stoppen klik linksboven, om het scherm te wissen klik een of
      andere muisknop (niet linksboven).
*/


#include "exec/types.h"
#include "graphics/gfxbase.h"
#include "intuition/intuition.h"

#define ac    16
#define depth 4
#define bx    640
#define by    500
#define type  HIRES | LACE

#define move(rp,a,b) { (rp)->cp_x = a ; (rp)->cp_y = b ; }
#define draw(rp,a,b) { Draw(rp,a,b); }

struct Window *w; struct Screen *s; struct IntuitionBase *IntuitionBase; struct GfxBase *GfxBase;
struct NewScreen ns = { 0,0,bx,by,depth,0,1,type,CUSTOMSCREEN,NULL,"",NULL,NULL };
struct NewWindow nw =
{  0,0,bx,by,-1,-1,CLOSEWINDOW|MOUSEBUTTONS,SIMPLE_REFRESH|ACTIVATE|WINDOWCLOSE,NULL,NULL,"",NULL,NULL,0,0,0,0,CUSTOMSCREEN };
struct ViewPort *vp; struct IntuiMessage *m;

_main()
{
  register int *rp ; /* Dit is een heel vuil truukje */
  if( ! (IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library")) || 
       ! (GfxBase = (struct GfxBase *)OpenLibrary("graphics.library",0)) ) exit(20);
   if( (s = (struct Screen *)OpenScreen( &ns ) ) == NULL ) exit(1);
   ShowTitle( s,FALSE ); nw.Screen = s;
   if( (w = (struct Window *)OpenWindow( &nw ) ) == NULL ) { CloseScreen(s); exit(1); }
   vp = &s->ViewPort; rp = w->RPort;
   SetBPen(rp,0); SetDrMd(rp,JAM1); m = NULL;
   while( !m || m->Class != CLOSEWINDOW )
   {  register a = RangeRand(bx); register x = RangeRand(bx);
      register b = RangeRand(by); register y = RangeRand(by);
      register ad = RangeRand(20)-10; register xd = RangeRand(20)-10; register bd = RangeRand(20)-10;
      register yd = RangeRand(20)-10; register aa = RangeRand(100)+50 ;
      if( m && m->Class == MOUSEBUTTONS )
      {  register aq;
         for( aq=0; aq<ac; aq++) SetRGB4( vp,aq,RangeRand(16),RangeRand(16),RangeRand(16));
         RectFill(rp,0,0,bx,by);
      }
      SetAPen(rp,RangeRand(ac));
      if( ! RangeRand(20) ) SetRGB4(vp,RangeRand(16),RangeRand(16),RangeRand(16),RangeRand(16));
      while( aa-- )
      {  move(rp,(a+=(a+ad>bx||a+ad<0)?(ad=-ad):ad),(b+=(b+bd>by||b+bd<0)?(bd=-bd):bd));
         draw(rp,(x+=(x+xd>bx||x+xd<0)?(xd=-xd):xd),(y+=(y+yd>by||y+yd<0)?(yd=-yd):yd));
         move(rp,bx-a,b); draw(rp,bx-x,y);
         move(rp,bx-a,by-b); draw(rp,bx-x,by-y);
         move(rp,a,by-b); draw(rp,x,by-y);
      }
      m = (struct IntuiMessage *)GetMsg( w->UserPort );
   }
   CloseWindow(w);CloseScreen(s);
}
