(*******************************

     VSprite-Demonstration
     last update 26/06/87
von Joerg Koch und Frank Kremser
   (c) Markt & Technik 1987

Modula-2 Version by
Fridtjof Siebert / AMOK
Nobileweg 67
D-7000-Stuttgart-40
Tel: (0)711/822509

********************************

Diese Demonstration verwendet 12 VSprites, wovon eines quer über
den Bildschirm bewegt wird

********************)

MODULE VSpriteDemo;

FROM SYSTEM IMPORT ADR;

FROM Exec IMPORT AllocMem,FreeMem,MemReqSet,MemReqs;
FROM Dos IMPORT Delay;
FROM Intuition IMPORT ScreenPtr,customScreen,ViewAddress,NewScreen,
       OpenScreen,CloseScreen,AllocRemember,RememberPtr,FreeRemember;
FROM Graphics IMPORT RastPortPtr,VSprite,VSpriteFlags,VSpriteFlagSet,
       ViewModes,ViewModeSet,InitGels,AddVSprite,RemVSprite,GelsInfo,
       CollTable,SortGList,DrawGList,MrgCop,LoadView,WaitBOVP;

VAR
  ns: NewScreen;
  screen: ScreenPtr;
  rp: RastPortPtr;

  VS1,VS2: VSprite;
  spritecolors: ARRAY[1..12] OF ARRAY[0..2] OF CARDINAL; (* Spritefarbe *)
  sprite: ARRAY[1..12] OF VSprite;
  gels: GelsInfo;
  data: POINTER TO ARRAY[0..13] OF LONGCARD;

  warte: LONGINT;
  i: CARDINAL;

  Rememory: RememberPtr;

PROCEDURE SetCols(Num,r,g,b: CARDINAL);

BEGIN
  spritecolors[Num][0] := r;
  spritecolors[Num][1] := g;
  spritecolors[Num][2] := b;
END SetCols;

PROCEDURE SetVSpr(Num: CARDINAL; xx,yy:INTEGER);

BEGIN
  WITH sprite[Num] DO
    nextVSprite := NIL;
    prevVSprite := NIL;
    drawPath    := NIL;
    clearPath   := NIL;
    oldY        := 0;
    oldX        := 0;
    flags := VSpriteFlagSet{vsprite};
    x := xx;
    y := yy;
    height := 14;
    width := 14;
    depth := 0;
    meMask := {};
    hitMask := {};
    imageData := data;
    borderLine := NIL;
    collMask := NIL;
    sprColors:= ADR(spritecolors[Num][0]);
    vsBob := NIL;
    planePick := 0;
    planeOnOff := 0;
  END;
END SetVSpr;

BEGIN
SetCols( 1, 0000H, 0888H, 0FFFH ); (* Spritefarben *)
SetCols( 2, 0900H, 0800H, 0F00H );
SetCols( 3, 0090H, 0040H, 00F0H );
SetCols( 4, 0009H, 0383H, 0FF0H );
SetCols( 5, 0000H, 0888H, 0F8FH );
SetCols( 6, 0000H, 0768H, 07F0H );
SetCols( 7, 0000H, 0848H, 0F0FH );
SetCols( 8, 0000H, 0505H, 045FH );
SetCols( 9, 0000H, 0800H, 006FH );
SetCols(10, 0000H, 0808H, 0F30H );
SetCols(11, 0000H, 0089H, 00F8H );
SetCols(12, 0000H, 0208H, 03F4H );

data := AllocRemember(Rememory,SIZE(data^),MemReqSet{chip,memClear});
data^[ 0] := 00FC00FC0H;
data^[ 1] := 03FF03030H;
data^[ 2] := 07FF84008H;
data^[ 3] := 07FF84008H;
data^[ 4] := 0F33C8CC4H;
data^[ 5] := 0FFFC8004H;
data^[ 6] := 0FFFC8004H;
data^[ 7] := 0FCFC8304H;
data^[ 8] := 0FFFC8004H;
data^[ 9] := 0FFFC9024H;
data^[10] := 07FF84848H;
data^[11] := 07FF84788H;
data^[12] := 03FF03030H;
data^[13] := 00FC00FC0H;

SetVSpr(1,50,50);
SetVSpr(2,100,100);
SetVSpr(3,150,150);
SetVSpr(4,200,100);
SetVSpr(5,10,20);
SetVSpr(6,300,30);
SetVSpr(7,160,190);
SetVSpr(8,70,80);
SetVSpr(9,300,200);
SetVSpr(10,10,230);
SetVSpr(11,160,50);
SetVSpr(12,240,150);

WITH ns DO
  leftEdge := 0;
  topEdge := 0;
  width := 320;
  height := 256;
  depth := 2;
  detailPen := 0;
  blockPen := 1;
  viewModes := ViewModeSet{};
  type := customScreen;
  font := NIL;
  defaultTitle := NIL;
  gadgets := NIL;
  customBitMap := NIL;
END;

  (* Screen öffnen *)
  screen := OpenScreen(ns);
  IF screen=NIL THEN HALT END;

  rp := ADR(screen^.rastPort);

  gels.sprRsrvd := -1;                (* GelsInfo deklarieren *)
  gels.nextLine := AllocRemember(Rememory,16,MemReqSet{public,memClear});
  gels.lastColor := AllocRemember(Rememory,32,MemReqSet{public,memClear});
  gels.collHandler := AllocRemember(Rememory,SIZE(CollTable),MemReqSet{public,memClear});
  gels.leftmost := 0;
  gels.rightmost := 319;
  gels.topmost := 0;
  gels.bottommost := 255;

  rp^.gelsInfo := ADR(gels);

  (* Gels initialisieren *)
  InitGels(ADR(VS1),ADR(VS2),ADR(gels));

  FOR i:=1 TO 12 DO
    AddVSprite(ADR(sprite[i]),rp);
  END;

  FOR warte := 0 TO 229 DO
  WaitBOVP(ADR(screen^.viewPort));
    sprite[3].x := warte;             (* ein Sprite bewegen *)
    sprite[3].y := warte;

    SortGList(rp);                    (* VSprites neu sortieren *)
    DrawGList(rp,ADR(screen^.viewPort));

    MrgCop(ViewAddress());            (* in Copper-Liste eintragen *)
    LoadView(ViewAddress());          (* und darstellen. *)
  END;

  Delay(50);

  FOR i:= 1 TO 12 DO
    RemVSprite(ADR(sprite[i]));       (* Sprites löschen *)
  END;

  CloseScreen(screen);                (* Screen schliessen *)
  FreeRemember(Rememory,TRUE);

END VSpriteDemo.
