/* GMS-example
 * Name: MultiLine.e
 * Type: Blitter example (based on Bounceline.e/c)
 * Version: 1.0
 * Author: G. W. Thomassen (0000272e@lts.mil.no)
 */

MODULE 'gms/dpkernel','gms/dpkernel/dpkernel','gms/graphics/pictures',
       'gms/screens','gms/system/register','gms/system/modules','gms/graphics/pictures',
       'gms/graphics/screens','gms/graphics/blitter','gms/blitter'

ENUM NONE,ERR_LIB,ERR_SCR,ERR_SMOD,ERR_BMOD,ERR_JOY

PROC main() HANDLE
  DEF scr=NIL:PTR TO screen,
      scrmodule=NIL:PTR TO module,
      bltmodule=NIL:PTR TO module,
      sx,sy,ex,ey,state,up=0,
      dsx,dsy,dex,dey,col,count=0

  DEF colours[10]:ARRAY OF LONG

  colours := [ $00ff0000, $0000ff00, $000000ff, $00ff00ff, $0000ff77,
               $00ffff00, $004488aa, $0000ffff, $00999999, $00ffffff ]:LONG


  IF (dpkbase:=OpenLibrary('GMS:libs/dpkernel.library',0))=NIL THEN Raise(ERR_LIB)

  IF (bltmodule:=Init([TAGS_MODULE,NIL,     ->blitter-module
      MODA_NUMBER,    MOD_BLITTER,
      MODA_TABLETYPE, JMP_AMIGAE,
      TAGEND], NIL))=NIL THEN Raise(ERR_BMOD)
      bltbase := bltmodule.modbase

  IF (scrmodule:=Init([TAGS_MODULE,NIL,       ->screen-module
      MODA_NUMBER,    MOD_SCREENS,
      MODA_TABLETYPE, JMP_AMIGAE,
      TAGEND], NIL))=NIL THEN Raise(ERR_SMOD)
      scrbase:=scrmodule.modbase

  col := colours[SlowRandom(10)] -> Set the first colour (+$010101 to
                                 ->   prevent black colour)

  IF (scr:=Init([TAGS_SCREEN, NIL,
       GSA_ScrMode, SM_HIRES + SM_LACED,
       GSA_Width,   640,
       GSA_Height,  512,
       GSA_Attrib,  SCR_DBLBUFFER,   -> Two frames (Doublebuffering)
         GSA_BitmapTags, NIL,
         BMA_Palette,    [PALETTE_ARRAY,2,$000000,$000000],
         TAGEND,NIL,
       TAGEND],NIL))=NIL THEN Raise(ERR_SCR)

  -> Calculate start values..
  sx:=SlowRandom(scr.width);  dsx:=-1
  sy:=SlowRandom(scr.height); dsy:=2
  ex:=SlowRandom(scr.width);  dex:=3
  ey:=SlowRandom(scr.height); dey:=1

  -> Display the screen
  Show(scr)

  REPEAT
    -> Calculate new values
    sx:=sx+dsx
    sy:=sy+dsy
    ex:=ex+dex
    ey:=ey+dey

    -> Check if screen limits are exceeded
    IF sx<0; sx:=0; dsx:=-dsx; ENDIF
    IF sy<0; sy:=0; dsy:=-dsy; ENDIF
    IF ex<0; ex:=0; dex:=-dex; ENDIF
    IF ey<0; ey:=0; dey:=-dey; ENDIF

    IF (sx>(scr.width))
      sx:=scr.width-2
      dsx:=-dsx
    ENDIF
    IF (sy>(scr.height))
      sy:=scr.height-2
      dsy:=-dsy
    ENDIF
    IF (ex>(scr.width))
      ex:=scr.width-2
      dex:=-dex
    ENDIF
    IF (ey>(scr.height))
      ey:=scr.height-2
      dey:=-dey
    ENDIF

    -> Colour fading
    IF up=0 THEN state := PaletteToColour(scr,state,3,1,1,scr.bitmap.palette+8,col)
    IF up=2 THEN state := ColourMorph(scr,state,1,1,1,col,$000000)

    -> Set up new color when the last was reached..
    IF state=NIL
      IF up=0
        up:=1
      ELSEIF up=1
        INC count
        IF count>700
          count:=0
          up:=2
        ENDIF
      ELSE
        -> Clear both frames and set up a new colour value
        Clear(scr.bitmap); WaitAVBL()
        SwapBuffers(scr); WaitAVBL()
        Clear(scr.bitmap)
        col:=colours[SlowRandom(10)]
        up:=0
      ENDIF
    ENDIF
    -> Draw the line and put the frame in front.
   DrawLine(scr.bitmap,sx,sy,ex,ey,1,$FFFFFFFF)
    WaitAVBL()
    SwapBuffers(scr)
  UNTIL Mouse()=1       -> You should use the Joy-module instead.

  -> No error..
  Raise(NONE)

EXCEPT DO

  -> Close down everything
  IF scr THEN Free(scr)
  IF scrmodule THEN Free(scrmodule)
  IF bltmodule THEN Free(bltmodule)
  CloseDPK()

  -> Report errors..
  SELECT exception
  CASE ERR_LIB; WriteF('Couldn\at open "dpkernel.library"\n')
  CASE ERR_SMOD; WriteF('Couldn\at initialize screen-module\n')
  CASE ERR_SCR; WriteF('Couldn\at open screen\n')
  CASE ERR_BMOD; WriteF('Couldn\at initialize blitter-module\n')
  ENDSELECT

  -> End with the return code 0, a good way to end programs..
  CleanUp(0)
ENDPROC
