/*  :ts=8
 * stars.c:  An attmept to fight boredom (yet again).
 * by Leo L. Schwab   8606.30
 */

#include <exec/types.h>
#include <intuition/intuition.h>

#define NSTARS          64

extern void *OpenLibrary(), *OpenScreen(), *OpenWindow(), *GetMsg();
extern short rnd();

long *IntuitionBase, *GfxBase;

struct NewScreen scrdef = {
        0, 0, 320, 200,
        4,              /*  # planes  */
        -1, -1,
        NULL,
        CUSTOMSCREEN,
        NULL, NULL, NULL, NULL
};

struct NewWindow windef = {
        0, 0, 320, 200,
        -1, -1,
        CLOSEWINDOW,
        WINDOWCLOSE,
        NULL, NULL, NULL, NULL, NULL,
        0, 0, 0, 0,
        CUSTOMSCREEN
};

struct Window *win;
struct Screen *scr;
struct RastPort *rp;
short x[NSTARS], y[NSTARS], z[NSTARS];
short xo[NSTARS], yo[NSTARS];


main (ac, av)
char *av[];
int ac;
{
        long xs, ys;
        long *msg;
        short magic;
        register short i, inc;

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

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

        openstuff ();
        rnd (-5286);
        SetRast (rp, 0L);
        for (xs=0; xs<16; xs++)
                SetRGB4 (&(scr -> ViewPort), xs, xs, xs, xs);

        for (i=0; i<NSTARS; i++)
                mkpoint (i);

        FOREVER {
                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 (rp, 0L);
                        WritePixel (rp, (long) xo[i], (long) yo[i]);
                        if (xs < 0 || xs > 319 || ys < 0 || ys > 199)
                                mkpoint (i);
                        else {
                                SetAPen (rp, (long) (256-z[i] >> 4));
                                WritePixel (rp, xs, ys);
                                xo[i] = xs;  yo[i] = ys;
                        }
                }
                if (msg = GetMsg (win -> UserPort)) {
                        ReplyMsg (msg);
                        break;
                }
        }

        closestuff ();
}

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

openstuff ()
{
        if (!(IntuitionBase = OpenLibrary ("intuition.library", 0L))) {
                printf ("Intuition open failed.\n");
                die ();
        }

        if (!(GfxBase = OpenLibrary ("graphics.library", 0L))) {
                printf ("graphics open failed.\n");
                die ();
        }

        if (!(scr = OpenScreen (&scrdef))) {
                printf ("Can't open screen.\n");
                die ();
        }

        windef.Screen = scr;
        if (!(win = OpenWindow (&windef))) {
                printf ("Window painted shut.\n");
                die ();
        }
        rp = &(scr -> RastPort);
}

closestuff ()
{
        if (win)                CloseWindow  (win);
        if (scr)                CloseScreen  (scr);
        if (GfxBase)            CloseLibrary (GfxBase);
        if (IntuitionBase)      CloseLibrary (IntuitionBase);
}

die ()
{
        closestuff ();
        exit (-1);
}
