{-------------------------- SCHNIPP -----------------------------}

{STARSCROLL.PAS geaenderte Fassung  }

{$A+,B-,D-,E-,F+,I+,L-,N-,O-,R-,S-,V-}
{$M 64000,0,655360}

USES crt,graph,BGIDriv;                 {ich binde die Treiber ein}

CONST MaxStars=500;                     {auf meinem 386-25er muss ich in
                                        der geaenderten Fassung schon 500
                                        Sterne eintragen, damit es nur noch
                                        ein wenig schneller ist als die alte
                                        Fassung mit 100 Sternen ;-)}

TYPE Punkt=ARRAY[1..3] OF INTEGER;     {Siehe ganz unten Move()}

VAR
   gd,gm,mpx,mpy,scal,a,b,e:integer;
   Stars1,Stars:ARRAY[1..MaxStars] OF Punkt;

   mx,my,m2x,m2y,sop,                   {siehe Init}
   act:INTEGER;

PROCEDURE dpunkt( x,y,z, Col:integer);
VAR n:INTEGER;
  BEGIN
   n:=z+e;

   {n=Nenner, nur einmal berechnen, geht schneller}

   PutPixel(mpx+ (scal*x div n),mpy+ (scal*y div n),col);

                 {hier nur integer-operationen}
  END;

PROCEDURE dline( x1,y1,z1,x2,y2,z2:integer);
VAR n1,n2:INTEGER;
  BEGIN
   n1:=z1+e;n2:=z2+e;  {n1=Nenner fuer 1.Punkt, n2=Nenner fuer 2.Punkt}

   Line(mpx+(scal*(x1 div n1)),mpy+(scal*(y1 div n1)),
        mpx+(scal*(x2 div n2)),mpy+(scal*(y2 div n2)));

      {Nix mit Round(xxx / nX), dauert zu lange: Integer ->Real ->Integer}
  END;

PROCEDURE Init;
begin
 act:=1;
 e:=1;
 scal := 2;

 mx:=getmaxx;     {damit man es auch in EgaLo oder anderen GModes}
 m2x:=mx shr 1;   {betreiben kann, alle Werte abhaengig von MaximalX und}
 my:=getmaxy;     {MaximalY}
 m2y:=my shr 1;
 mpx:=m2x;
 mpy:=m2y-(mpy shr 1);

 sop:=sizeof(punkt);  {Schreibt sich leichter :-) }
end;

BEGIN
  Randomize;
  gd:=ega;
  gm:=egahi;

  if RegisterBGIdriver(@EgaVgaDriverProc) < 0 then halt(255);

  InitGraph(gd,gm,'');  {oder InitGraph(gd,gm,'PathToDriver');}
  Init;
  FOR a:=0 TO 15 DO  SetRGBPalette(a,a*3,a*3,a*3);
  FOR a:=1 TO MaxStars DO
    BEGIN
      Stars[a,1]:=Random(mx)-m2x;
      Stars[a,2]:=Random(my)-m2y;
      Stars[a,3]:=Random(30)+1;
    END;

  Move(Stars,Stars1,SoP*MaxStars);      {man sollte Stars1 initialisieren}
                                        {wenn man es benutzt}
  SetColor(15);
  SetVisualPage(act);

  {AB hier kommt es auf Geschwindigkeit an}

  REPEAT
            {IF act=0 THEN act:=1 ELSE act:=0; dauert zu lange, deshalb:}
            {wenn (act)=1 -> act:=1-(1) = 0  wenn (act)=0 -> act:=1-(0)=1}
    act:=1-act;

    SetActivePage(act);
    FOR a:= 1 TO MaxStars DO
    BEGIN
      Stars[a,3]:=Stars[a,3]-1;
      IF stars[a,3]= 0 THEN
      BEGIN
        Stars[a,1]:=Random(mx)-m2x;
        Stars[a,2]:=Random(my)-m2y;
        Stars[a,3]:=30;
      END;
      dpunkt(Stars[a,1],Stars[a,2],Stars[a,3],15-(stars[a,3] shr 1));

                        {round(xxx/2) dauert zu lange {shr 1 = div 2 }
    END;
    SetVisualPage(act);

    act:=1-act;   {s.o.}

    SetActivePage(act);
    FOR a:=1 TO MaxStars DO
    BEGIN
      dpunkt(Stars1[a,1],Stars1[a,2],Stars1[a,3],0);

      {Wenn man Stars1 nicht initialisierst kommt es schon mal vor, dass
       man einen Division by Zero Error beim ersten beim 1. Aufruf erhaelt}

      move(stars[a],stars1[a],sop);

      {nicht einzeln uebertragen, Move ist schneller, deshalb auch Type Punkt}

    END;

    act:=1-act; {s.o.}

  UNTIL KeyPressed;

  closegraph;          {Nicht vergessen !!!! ;-) }
END.

{------------------------- SCHNAPP --------------------------------------}

