
#include <intuition/intuitionbase.h>
#include <graphics/gfxbase.h>
#include <clib/macros.h>

#define NACHRICHT msg=(struct IntuiMessage *)GetMsg(win->UserPort)

struct IntuitionBase *IntuitionBase;
struct GfxBase *GfxBase;

struct NewScreen screen=
  {
  0,0,320,256,5,1,0,
  NULL,CUSTOMSCREEN,NULL,NULL,NULL,NULL
  };

struct NewWindow window=
  {
  0,0,320,256,0,1,
  CLOSEWINDOW,ACTIVATE|BORDERLESS|WINDOWCLOSE|SMART_REFRESH,
  NULL,NULL,NULL,NULL,NULL,
  0,0,0,0,CUSTOMSCREEN
  };

USHORT farben[32]=
  {
  0x000,0xfff,0xf00,0x0f0,0x00f,0xff0,0x0ff,0xf0f,
  0xfff,0xeee,0xddd,0xccc,0xbbb,0xaaa,0x999,0x888,
  0x777,0x666,0x555,0x444,0x333,0x222,0x111,0x000,
  0x220,0x440,0x660,0x880,0xaa0,0xcc0,0xee0,0x880
  };
int fw[8][3],fr[8][3];

struct Screen *scr;
struct Window *win;
struct RastPort *rp;
struct ViewPort *vp;
struct IntuiMessage *msg;

ULONG Class;
int a,b,mx,my,ende=FALSE;

main()
  {
  IntuitionBase=(struct IntuitionBase *)OpenLibrary("intuition.library",0);
  if(IntuitionBase==NULL) ClearMem("intuition",1);
  GfxBase=(struct GfxBase *)OpenLibrary("graphics.library",0);
  if(GfxBase==NULL) ClearMem("graphics",1);
  scr=(struct Screen *)OpenScreen(&screen);
  if(scr==NULL) ClearMem("screen",1);
  window.Screen=scr;
  win=(struct Window *)OpenWindow(&window);
  if(win==NULL) ClearMem("window",1);
  rp=win->RPort;
  vp=&scr->ViewPort;
  LoadRGB4(vp,farben,32L);
  InitWindow();

  do
    {
    AendereFarben();
    ZeichneRechteck();
    while(NACHRICHT)
      {
      Class=msg->Class;
      ReplyMsg(msg);
      if(Class==CLOSEWINDOW) ende=TRUE;
      }
    }
  while(!ende);

  ClearMem("",0);
  }

InitWindow()
  {
  mx=159; my=127;
  InitHinten();
  InitRahmen();
  for(a=0;a<8;a++)
    {
    fw[a][0]=farben[a]/(16*16);
    fw[a][1]=(farben[a]-(16*16)*fw[a][0])/16;
    fw[a][2]=farben[a]-(16*16)*fw[a][0]-16*fw[a][1];
    for(b=0;b<3;b++)
      {
      fr[a][b]=0;
      fw[a][b]=10*fw[a][b];
      }
    }
  }

InitHinten()
  {
  int x1,y1,x2,y2,fa,dopp;

  fa=8; dopp=0;
  for(a=0;a<=576;a++)
    {
    SetAPen(rp,fa);
    fa+=dopp; if(fa==24) fa=8;
    dopp=1-dopp;
    x1=0; y1=a; x2=a; y2=0;
    if(a>256)
      {
      x1=a-256; y1=256;
      if(a>320)
        {
        x2=320; y2=a-320;
        }
      }
    Move(rp,x1,y1);
    Draw(rp,x2,y2);
    }
  }

InitRahmen()
  {
  int x1,y1,x2,y2,fa,vz;

  fa=24; vz=+1;
  for(a=101;a<=111;a++)
    {
    SetAPen(rp,fa);
    fa+=vz;
    if(fa==30) vz=-1;
    Move(rp,mx-a,my-a);
    Draw(rp,mx-a,my+a);
    Move(rp,mx+a,my-a);
    Draw(rp,mx+a,my+a);
    Move(rp,mx-a,my-a);
    Draw(rp,mx+a,my-a);
    Move(rp,mx-a,my+a);
    Draw(rp,mx+a,my+a);
    }
  SetAPen(rp,0);
  RectFill(rp,mx-100,my-100,mx+100,my+100);
  SetAPen(rp,31);
  RectFill(rp,mx-99,my-99,mx+99,my+99);
  }

AendereFarben()
  {
  USHORT tf;

  for(a=2;a<8;a++)
    {
    for(b=0;b<3;b++)
      {
      if(fr[a][b]==0)
        if(fw[a][b]==0)
          fr[a][b]=0+rnd(1,10);
        else
          fr[a][b]=0-rnd(1,10);
      fw[a][b]=fw[a][b]+fr[a][b];
      if((fw[a][b]>=150)||(fw[a][b]<=0))
        {
        if(fw[a][b]>150) fw[a][b]=150;
        if(fw[a][b]<0  ) fw[a][b]=0  ;
        fr[a][b]=0;
        }
      }
    farben[a]=16*16*(fw[a][0]/10)+16*(fw[a][1]/10)+(fw[a][2]/10);
    }
  tf=farben[23];
  for(a=23;a>8;a--)
    farben[a]=farben[a-1];
  farben[8]=tf;
  tf=farben[24];
/*for(a=24;a<31;a++)
    farben[a]=farben[a+1];
  farben[31]=tf;*/
  LoadRGB4(vp,farben,32L);
  }

ZeichneRechteck()
  {
  int x1,y1,x2,y2,r,t;

  SetAPen(rp,rnd(2,7));
  x1=rnd(0,99);
  x2=rnd(0,99);
  if(x1>x2) {t=x1;x1=x2;x2=t;}
  y1=rnd(x2,99);
  y2=rnd(x2,99);
  if(y1>y2) {t=y1;y1=y2;y2=t;}
  RectFill(rp,mx+x1,my+y1,mx+x2,my+y2);
  RectFill(rp,mx+x1,my-y2,mx+x2,my-y1);
  RectFill(rp,mx-x2,my-y2,mx-x1,my-y1);
  RectFill(rp,mx-x2,my+y1,mx-x1,my+y2);
  RectFill(rp,mx+y1,my+x1,mx+y2,my+x2);
  RectFill(rp,mx+y1,my-x2,mx+y2,my-x1);
  RectFill(rp,mx-y2,my-x2,mx-y1,my-x1);
  RectFill(rp,mx-y2,my+x1,mx-y1,my+x2);
  }

int rnd(von,bis)

int von,bis;
  {
  int b,r;

  r=rand();
  b=bis-von+1;
  r=r-(r/b)*b+von;
  return(r);
  }

ClearMem(text,error)

char *text;
int error;
  {
  if(win) CloseWindow(win);
  if(scr) CloseScreen(scr);
  if (GfxBase) CloseLibrary(GfxBase);
  if (IntuitionBase) CloseLibrary(IntuitionBase);
  if(error)
    {
    printf("Fehler: %s\n",text);
    exit(error);
    }
  }
