(*---------------------------------------------------------------------------
   :Program.    Sterne.mod
   :Contents.   Looks fine, I think
   :Remark.     Rewritten in Modula-2 from C by M.Peuckert
   :History.    V1.0 First C-Version by ... (weiß nich mehr) Fishdisk (#33 ?)
   :History.    V1.0 M2, Marku Peuckert, November 89
   :History.    V1.1 Ported this to Oberon, Fridtjof Siebert, 8. April 90
   :Author.     Markus Peuckert
   :Address.    Schützenstr. 50, D-3550 Marburg, West-Germany,
   :Copyright.  PD
   :Language.   Modula-2
   :Translator. Oberon Compiler Demo
---------------------------------------------------------------------------*)

MODULE Sterne;

IMPORT I: Intuition,
       g: Graphics,
       e: Exec,
       r: Random,
          SYSTEM;

CONST  nStars = 50;
       inc    = 3;
       Magic  = 128;

TYPE ArrayTyp = ARRAY nStars OF INTEGER;

VAR
  screen : I.ScreenPtr;
  window : I.WindowPtr;
  rp     : g.RastPortPtr;
  vp     : g.ViewPortPtr;

  x, y, z,
  xlo, yo  : ArrayTyp;
  xls, ys, fz : INTEGER;

  ns: I.NewScreen;
  nw: I.NewWindow;

  Msg : e.MessagePtr;
  i   : INTEGER;


PROCEDURE MakePoint (i : INTEGER);
BEGIN
  x[i] := r.RND (256) - 128;
  y[i] := r.RND (150) - 75;
  z[i] := 255;
END MakePoint;



BEGIN

  ns.width    := g.gfx.normalDisplayColumns DIV 2;
  ns.height   := -1;
  ns.depth    := 3;
  ns.blockPen := 1;
  ns.type     := I.customScreen;
  screen := I.OpenScreen(ns);
  IF screen=NIL THEN HALT(0) END;

  nw.width     := screen.width;
  nw.height    := screen.height;
  nw.idcmpFlags:= LONGSET{I.mouseButtons};
  nw.screen    := screen;
  nw.type      := I.customScreen;
  window       := I.OpenWindow(nw);
  IF window=NIL THEN HALT(0) END;

  rp:=window.rPort;
  vp:=SYSTEM.ADR(screen.viewPort);

  g.SetRGB4(vp,0,0,0,0); g.SetRast(rp,0);
  xls:=1;
  i := 1;
  REPEAT
    g.SetRGB4 (vp, i, xls, xls, xls);
    INC (xls, 2);
    INC(i);
  UNTIL i>7;

  i := 0;
  REPEAT MakePoint(i); INC(i) UNTIL i>=nStars;
  REPEAT
    i := 0;
    REPEAT
      DEC (z[i], inc);
      IF z[i]<=0 THEN  MakePoint (i); END;
      fz := z[i];
      xls := x[i] * Magic DIV fz + (screen.width  DIV 2);
      ys  := y[i] * Magic DIV fz + (screen.height DIV 2);
      g.SetAPen(rp, 0);
      IF g.WritePixel(rp, xlo[i], yo[i]) THEN END;
      IF (xls<0) OR (xls>screen.width) OR (ys<0) OR (ys>screen.height) THEN
        MakePoint(i);
      ELSE
        g.SetAPen(rp, 256 - ASH(fz, -5));
        IF g.WritePixel(rp, xls, ys) THEN END;
        xlo[i] := xls; yo[i] := ys;
      END;
      INC(i);
    UNTIL i>=nStars;
    Msg := e.GetMsg(window^.userPort);
    IF Msg#NIL THEN e.ReplyMsg(Msg) END
  UNTIL Msg#NIL

CLOSE

  IF window#NIL THEN I.CloseWindow(window) END;
  IF screen#NIL THEN I.CloseScreen(screen) END;

END Sterne.
