REM RERECREATING A CLASSIC VECTORBALL DEMO
REM
REM 0.5X
REM
REM DONE BY TODDL

REM MISSING CONSTANTS
TRUE = -1
FALSE = 0

RANDOMIZE TIMER

DIM GLOBAL STARX(127)

FOR I=0 TO 127
 STARX(I)= RND*256
NEXT I
BG 1
BG FILL 0,0 TO 0,15 CHAR 1
BG 0

ON RASTER CALL RASTERFX


REM GOSUB MP_INIT

DATA 63, 42, 21
DATA 48, 32, 16
DATA 12, 8, 4
DATA 3, 2, 1
DATA 60, 40, 20

RESTORE PALETTEDATA
FOR I = 0 TO 4
  READ C1,C2,C3
  PALETTE I,0,C1,C2,C3
NEXT I

DIM STARS(15, 4)
IDXX = 0
IDXY = 1
IDXS1 = 2
IDXS2 = 3
IDXC = 4

FOR SI = 0 TO 15
  GOSUB INITSTAR
NEXT SI

PALETTE 7, 0, 21, 42, 63


GOSUB READPALETTESCROLL




STINDEX = 0
SCINDEX = 0
ST$ = "LOWRES VECTORBALLS - DONE BY TODDL IN 2016! GREETINGS TO TIMO, YAIRKASS, MITCHY BARNS, MOACO, JACX, 8BITTEN, FEDDEN00, JELLYPELLZ, D0NL, DONOVAN, CHRISM AND ALL OTHER LOWRES CODERS!"

MAXBALLS = 200
DIM BALLS(MAXBALLS - 1, 3)
DIM BALLSORIG(MAXBALLS - 1, 3)
DIM BALLSPROJ(MAXBALLS - 1, 3)
IDXX = 0
IDXY = 1
IDXZ = 2
IDXT = 3
IDXIDX = 0
IDXDEPTH = 1
GOSUB QUICKSORTINIT

BARTOP = 105 




MAINLOOP:

REM RESTORE OVERUNDER
GOSUB READDATA

FOR I = 0 TO 63
  SPRITE OFF I
NEXT I

RTX = 0
RTY = 0
RTZ = 0

MVXD = 0
MVYD = 0
MVZD = 0
OBJROT = 0

DST = 100
VD = 128

OBJTIMER = 0

REM ON RASTER GOSUB DISPLAYSTAR

TOUCHSCREEN

DO
  REM CLS
  
  IF OBJTIMER < 100 THEN
    OBJYOFFSET = -(100 - OBJTIMER) 
  END IF
  IF OBJTIMER >= 500 THEN
    OBJYOFFSET = (OBJTIMER - 500) 
  END IF
  OBJTIMER = OBJTIMER + 1
  
  REM TEXT 0,0,OBJTIMER
  REM COLOR 10
  REM BAR 0, BARTOP TO 127, 127
  REM COLOR 11
  REM BAR 0, BARTOP - 1 TO 127, BARTOP - 2
  REM COLOR 12
  REM LINE 0, BARTOP - 3 TO 127, BARTOP - 3
  
  
  REM LAYER 1
  REM CLS
  REM ZMIN = 999
  REM ZMAX = -999
  RTX = RTX + RTXADD
  RTY = RTY + RTYADD
  RTZ = RTZ + RTZADD
  
  MVX = SIN(MVXD) * MVSCX
  MVY = SIN(MVYD) * MVSCY
  MVZ = SIN(MVZD) * MVSCZ
  MVXD = MVXD + MVXDADD
  MVYD = MVYD + MVYDADD
  MVZD = MVZD + MVZDADD

  IF NAME$ = "SPIRAL" THEN
    FLAP = FLAP + 0.25 / 5
    FOR I = 0 TO NOOFBALLS - 1
      BALLS(I, IDXX) = BALLSORIG(I, IDXX) * (1 + (SIN(FLAP) / 2))
      BALLS(I, IDXY) = BALLSORIG(I, IDXY)
      BALLS(I, IDXZ) = BALLSORIG(I, IDXZ)
    NEXT I
  END IF  
  IF NAME$ = "FLAPPER" THEN
    FLAP = FLAP + 0.2 / 5
    FOR I = 0 TO NOOFBALLS - 1
      BALLS(I, IDXX) = BALLSORIG(I, IDXX) + COS(FLAP) * (BALLS(I, IDXT) - 1) / 2
      BALLS(I, IDXY) = BALLSORIG(I, IDXY)
      BALLS(I, IDXZ) = BALLSORIG(I, IDXZ)
    NEXT I
  END IF
  IF NAME$ = "FLAPPER2" THEN
    FLAP = FLAP + 0.05
    FOR I = 0 TO NOOFBALLS - 1
      BALLS(I, IDXX) = BALLSORIG(I, IDXX) + COS(FLAP) * (BALLS(I, IDXT) - 1)
      BALLS(I, IDXY) = BALLSORIG(I, IDXY) * ABS(SIN(FLAP)) 
      BALLS(I, IDXZ) = BALLSORIG(I, IDXZ) * ABS(SIN(FLAP))
    NEXT I
  END IF
  IF NAME$ = "FLAG" THEN
    IWAVE = IWAVE + 0.2
    FOR I = 0 TO NOOFBALLS - 1
      BALLS(I, IDXX) = BALLSORIG(I, IDXX) 
      BALLS(I, IDXY) = BALLSORIG(I, IDXY)
      BALLS(I, IDXZ) = SIN(I / 8 + IWAVE) * 1.5
      REM BALLSORIG(I, IDXZ) + SIN(IWAVE + INT(I / 6) / 10)
    NEXT I
  END IF
  IF NAME$ = "OVERUNDER" THEN
    FLAP = FLAP + 0.05
    FOR I = 0 TO 8
      BALLS(I, IDXX) = BALLSORIG(I, IDXX)
      BALLS(I, IDXY) = BALLSORIG(I, IDXY)
      BALLS(I, IDXZ) = BALLSORIG(I, IDXZ)
    NEXT I
    FOR I = 9 TO 20
      BALLS(I, IDXX) = BALLSORIG(I, IDXX) + SIN(FLAP) * 4
      BALLS(I, IDXY) = BALLSORIG(I, IDXY) * ABS(SIN(FLAP))
      BALLS(I, IDXZ) = BALLSORIG(I, IDXZ) * ABS(SIN(FLAP))
    NEXT I
    FOR I = 21 TO 32
      BALLS(I, IDXX) = BALLSORIG(I, IDXX) + SIN(FLAP + PI) * 4
      BALLS(I, IDXY) = BALLSORIG(I, IDXY) * ABS(COS(FLAP))
      BALLS(I, IDXZ) = BALLSORIG(I, IDXZ) * ABS(COS(FLAP))
    NEXT I
  END IF
  
  FOR I = 0 TO NOOFBALLS - 1
  
    IF OBJROTAXIS = 0 THEN
      OBJROT = OBJROT + OBJROTVAL
      X = BALLS(I, IDXX) * SC
      Y = (BALLS(I, IDXY) * COS(OBJROT) - BALLS(I, IDXZ) * SIN(OBJROT)) * SC
      Z = (BALLS(I, IDXY) * SIN(OBJROT) + BALLS(I, IDXZ) * COS(OBJROT)) * SC
    ELSE
      X = BALLS(I, IDXX) * SC
      Y = BALLS(I, IDXY) * SC
      Z = BALLS(I, IDXZ) * SC
    END IF

    IF RTY <> 0 THEN
    
      IX = X
      IY = Y
      IZ = Z
    
      X = IX * COS(RTY) - IZ * SIN(RTY) 
      Y = IY
      Z = IX * SIN(RTY) + IZ * COS(RTY)
      
    END IF

    IF RTX <> 0 THEN
      IX = X
      IY = Y
      IZ = Z
    
      X = IX
      Y = IY * COS(RTX) - IZ * SIN(RTX)
      Z = IY * SIN(RTX) + IZ * COS(RTX)
    END IF
    
    IF RTZ <> 0 THEN
      IX = X
      IY = Y
      IZ = Z
    
      X = IX * COS(RTZ) - IY * SIN(RTZ)
      Y = IX * SIN(RTZ) + IY * COS(RTZ)
      Z = IZ
    END IF
    
    X = X + MVX
    Y = Y + MVY + OBJYOFFSET
    Z = Z + DST + MVZ
    
    REM IF Z < ZMIN THEN ZMIN = Z
    REM IF Z > ZMAX THEN ZMAX = Z
    
    BALLSPROJ(I, IDXX) = MIN(INT(58 + 16 + X * VD / Z), 190 + 32)
    BALLSPROJ(I, IDXY) = MIN(INT(58 + Y * VD / Z) + 32, 148 + 32)
    BALLSPROJ(I, IDXZ) = Z
  NEXT I
  
  FOR I = 0 TO NOOFBALLS - 1
    QSARRAY(I, IDXIDX) = I
    QSARRAY(I, IDXDEPTH) = -BALLSPROJ(I, IDXZ)
  NEXT I
  QSELEMENTS = NOOFBALLS
  GOSUB QUICKSORT
  
  FOR J = 0 TO NOOFBALLS - 1
    JJ = 63 - J
    I = QSARRAY(J, IDXIDX)
    T = BALLS(I, IDXT)
    SPRITE JJ, BALLSPROJ(I, IDXX), BALLSPROJ(I, IDXY), 16
    SPRITE.A JJ,(T MOD 5,0,0,0,1)
    REM PUT BLOCK T, BALLSPROJ(I, IDXX) + 10, BALLSPROJ(I, IDXY), 1
  NEXT J
  
  REM DISABLED
  REM LAYER 2
  REM COLOR 0
  REM BAR 0, BARTOP TO 127, BARTOP + 4
  REM COLOR 10
  REM BAR 0, BARTOP + 5 TO 127, 127
  REM END DISABLED
  
  REM FOR B = 0 TO (127 - BARTOP)  
  REM IF SIN(WW + B / 2) < -0 THEN
  REM COLOR 11
  REM LINE 0, BARTOP + B TO 147, BARTOP + B
  REM END IF
  REM NEXT B 
  WW = WW + 0.2
  FOR B = 0 TO (127 - BARTOP)
    REM B1 = BARTOP - 1 - B * (2 + SIN(B / 20 + WW)) * 0.7
    B1 = BARTOP - 1 - B * 2
    REM LAYER 1

    REM DISABLED
    REM GET MAX(10 + SIN(WW + B / 2) * 3, 0), B1 TO MIN(137 + SIN(WW + B / 2) * 3, 137), B1
    REM GET 10, B1 TO 137, B1
    REM LAYER 2
    REM PUT 0, BARTOP + B, 0
    REM DISABLED END
  NEXT B
  REM LAYER 1
  
  IF TAP AND OBJTIMER < 500 THEN
    OBJTIMER = 500
  END IF
  
  REM ON VBL GOSUB MOVESTARS
  
  WAIT VBL
  
  REM DISABLED
  REM LAYER 3
  REM LAYER OFFSET 3, 0, 5.5 * SIN(SCINDEX /2)
  REM COLOR 1
  REM FONT 3
  FOR I = 0 TO 13
    REM PALETTE I + 1, SCPAL((I + SCINDEX) MOD 14)
  NEXT I 
  REM SCROLL 0, 6 TO 137, 13, -4, 0 CLEAR
  IF STINDEX MOD 8 = 0 THEN
    REM TEXT 128, 6, MID$(ST$, STINDEX / 8 + 1, 1)
    FOR SX = 0 TO 7
      FOR SY = 0 TO 7
        REM IF POINT(SX + 128, SY + 6) <> 0 THEN
          REM C = (STINDEX + (SY) + SX) MOD 14 + 1
          REM C = (STINDEX + (SY/4)) MOD 14 + 1
          C = (SY + INT(SCINDEX / 2)) MOD 14 + 1
          REM C = ((SY)) MOD 14 + 1
          REM COLOR C
          REM PLOT SX + 128, SY + 6
        REM END IF
      NEXT SY
    NEXT SX
  END IF
  STINDEX = STINDEX + 4
  SCINDEX = SCINDEX + 1
  IF INT(STINDEX / 8) > LEN(ST$) THEN STINDEX = 0
  
  IF OBJTIMER >= 600 THEN GOTO MAINLOOP
  
LOOP


END



REM QUICKSORT FOR LOWRES CODER
REM
REM ORIGINAL C IMPLEMENTATION BY DAREL REX FINLEY
REM SEE HTTP://ALIENRYDERFLEX.COM/QUICKSORT/
REM
REM PORTED TO LOWRES CODER BY TODDL - TDREWES AT GMX DOT NET

REM QUICKSORTINIT
REM 
REM ONLY CALL THIS ONCE AT THE START OF YOUR PROGRAM
REM

QUICKSORTINIT:
  REM TWO HELPER ARRAYS
  DIM QSBEG(300), QSEND(300)
  REM THE ARRAY TO BE SORTED
  DIM QSARRAY(999, 1)
  FOR I = 0 TO 999
    FOR J = 0 TO 1
      QSARRAY(I,J)=0
    NEXT J
  NEXT I
RETURN

REM QUICKSORT
REM
REM SORT THE ARRAY QSARRAY WITH QSELEMENTS ENTRIES
REM
REM IN:
REM   QSARRAY()   - ARRAY TO BE SORTED
REM   QSELEMENTS  - NUMBER OF ELEMENTS
REM

QUICKSORT:
  QSI = 0
  QSBEG(0) = 0
  QSEND(0) = QSELEMENTS
  WHILE QSI >= 0
    QSL = QSBEG(QSI)
    QSR = QSEND(QSI) - 1
    IF QSL < QSR THEN
      QSPIV = QSARRAY(QSL, IDXDEPTH)
      WHILE QSL < QSR
        WHILE QSARRAY(QSR, IDXDEPTH) >= QSPIV AND QSL < QSR
          QSR = QSR - 1
        WEND
        IF QSL < QSR THEN
          SWAP QSARRAY(QSL, IDXIDX), QSARRAY(QSR, IDXIDX)
          SWAP QSARRAY(QSL, IDXDEPTH), QSARRAY(QSR, IDXDEPTH)
          QSL = QSL + 1
        END IF
        WHILE QSARRAY(QSL, IDXDEPTH) <= QSPIV AND QSL < QSR
          QSL = QSL + 1
        WEND
        IF QSL < QSR THEN
          SWAP QSARRAY(QSL, IDXIDX), QSARRAY(QSR, IDXIDX)
          SWAP QSARRAY(QSL, IDXDEPTH), QSARRAY(QSR, IDXDEPTH)
          QSR = QSR - 1
        END IF
      WEND 
      QSARRAY(QSL, IDXDEPTH) = QSPIV
      QSBEG(QSI + 1) = QSL + 1
      QSEND(QSI + 1) = QSEND(QSI)
      QSEND(QSI) = QSL
      QSI = QSI + 1
      IF QSEND(QSI) - QSBEG(QSI) > QSEND(QSI - 1) - QSBEG(QSI - 1) THEN
        SWAP QSBEG(QSI), QSBEG(QSI - 1)
        SWAP QSEND(QSI), QSEND(QSI - 1)
      END IF
    ELSE
      QSI = QSI - 1
    END IF
  WEND
RETURN







READDATA:
  READ NAME$
  IF NAME$ = "END" THEN
    RESTORE STAR
    READ NAME$
  END IF
  READ SC
  READ OBJROTAXIS, OBJROTVAL
  READ RTXADD, RTYADD, RTZADD
  RTXADD = RTXADD / 2
  RTYADD = RTYADD / 2
  RTZADD = RTZADD / 2
  READ MVXDADD, MVYDADD, MVZDADD, MVSCX, MVSCY, MVSCZ
  READ OFFS
  IF NAME$ = "SPIRAL" THEN
    NOOFBALLS = 50
    FOR I = 0 TO NOOFBALLS - 1
      BALLSORIG(I, IDXZ) = SIN(I / 2) * 1.7
      BALLSORIG(I, IDXY) = COS(I / 2) * 1.7
      BALLSORIG(I, IDXX) = (I - (NOOFBALLS / 2)) / 5
      BALLS(I, IDXT) = 5 + I MOD 5
    NEXT I
  ELSE IF NAME$ = "FLAPPER" OR NAME$ = "FLAPPER2" THEN
    NOOFBALLS = 0
    BALLSORIG(NOOFBALLS, IDXX) = 0
    BALLSORIG(NOOFBALLS, IDXY) = 0
    BALLSORIG(NOOFBALLS, IDXZ) = 0
    BALLS(NOOFBALLS, IDXT) = 1
    NOOFBALLS = NOOFBALLS + 1
    FOR I = 0 TO 5
      RAD = PI * 2 / 6 * I
      BALLSORIG(NOOFBALLS, IDXX) = 0
      BALLSORIG(NOOFBALLS, IDXY) = SIN(RAD) * 1
      BALLSORIG(NOOFBALLS, IDXZ) = COS(RAD) * 1
      BALLS(NOOFBALLS, IDXT) = 2
      NOOFBALLS = NOOFBALLS + 1
    NEXT I
    FOR I = 0 TO 11
      RAD = PI * 2 / 12 * I
      BALLSORIG(NOOFBALLS, IDXX) = 0
      BALLSORIG(NOOFBALLS, IDXY) = SIN(RAD) * 1.8
      BALLSORIG(NOOFBALLS, IDXZ) = COS(RAD) * 1.8
      BALLS(NOOFBALLS, IDXT) = 3
      NOOFBALLS = NOOFBALLS + 1
    NEXT I
    FOR I = 0 TO 17
      RAD = PI * 2 / 18 * I
      BALLSORIG(NOOFBALLS, IDXX) = 0
      BALLSORIG(NOOFBALLS, IDXY) = SIN(RAD) * 2.6
      BALLSORIG(NOOFBALLS, IDXZ) = COS(RAD) * 2.6
      BALLS(NOOFBALLS, IDXT) = 4
      NOOFBALLS = NOOFBALLS + 1
    NEXT I
  ELSE IF NAME$ = "FLAG" THEN
    NOOFBALLS = 0
    FOR J = 0 TO 8
      FOR I = 0 TO 5
        IF I < 2 THEN 
          T = 8
        ELSE IF I >= 4 THEN 
          T = 6
        ELSE
          T = 5
        END IF
        BALLSORIG(NOOFBALLS, IDXX) = (J - 4.5) * 0.8
        BALLSORIG(NOOFBALLS, IDXY) = I - 2.5
        BALLSORIG(NOOFBALLS, IDXZ) = 0
        BALLS(NOOFBALLS, IDXT) = T
        NOOFBALLS = NOOFBALLS + 1
      NEXT I
    NEXT J
  ELSE IF NAME$ = "OVERUNDER" THEN
    NOOFBALLS = 0
    FOR I = 0 TO 8
      BALLSORIG(NOOFBALLS, IDXX) = I - 4
      BALLSORIG(NOOFBALLS, IDXY) = 0
      BALLSORIG(NOOFBALLS, IDXZ) = 0
      BALLS(NOOFBALLS, IDXT) = (I MOD 2) * 5
      NOOFBALLS = NOOFBALLS + 1
    NEXT I
    FOR I = 0 TO 11
      RAD = PI * 2 / 12 * I
      BALLSORIG(NOOFBALLS, IDXX) = 0
      BALLSORIG(NOOFBALLS, IDXY) = SIN(RAD) * 1.8
      BALLSORIG(NOOFBALLS, IDXZ) = COS(RAD) * 1.8
      BALLS(NOOFBALLS, IDXT) = I MOD 2 + 1
      NOOFBALLS = NOOFBALLS + 1
    NEXT I
    FOR I = 0 TO 11
      RAD = PI * 2 / 12 * I
      BALLSORIG(NOOFBALLS, IDXX) = 0
      BALLSORIG(NOOFBALLS, IDXY) = SIN(RAD) * 1.8
      BALLSORIG(NOOFBALLS, IDXZ) = COS(RAD) * 1.8
      BALLS(NOOFBALLS, IDXT) = I MOD 2 + 3
      NOOFBALLS = NOOFBALLS + 1
    NEXT I
  ELSE IF NAME$ = "LARGECUBE" THEN
    NOOFBALLS = 0
    FOR I = -1.5 TO 1.5
      FOR J = -1.5 TO 1.5
        FOR K = -1.5 TO 1.5
          T = 2 + I
          BALLS(NOOFBALLS, IDXX) = I
          BALLS(NOOFBALLS, IDXY) = J
          BALLS(NOOFBALLS, IDXZ) = K
          BALLS(NOOFBALLS, IDXT) = T
          NOOFBALLS = NOOFBALLS + 1
        NEXT K
      NEXT J
    NEXT I
  ELSE
    NOOFBALLS = 0
    DO
      READ T,X,Y,Z
      IF X = 999 THEN GOTO ENDLOOP
      BALLS(NOOFBALLS, IDXX) = X
      BALLS(NOOFBALLS, IDXY) = Y
      BALLS(NOOFBALLS, IDXZ) = Z
      BALLS(NOOFBALLS, IDXT) = T + OFFS
      NOOFBALLS = NOOFBALLS + 1
    LOOP
    ENDLOOP:
  END IF
RETURN




SETPALETTE:
  RESTORE PALETTEDATA
  REM DIM PALCOLORS(4, 2)
  FOR I = 0 TO 4
    FOR J = 0 TO 2
      REM READ PALCOLORS(I, J)
      READ PC
      REM PALETTE I * 3 + J + 1, PC
    NEXT J
  NEXT I
RETURN

READPALETTESCROLL:
  DIM SCPAL(13)
  RESTORE PALETTEDATASCROLL
  FOR I = 0 TO 13
    READ SCPAL(I)
  NEXT I
RETURN


PALETTEDATA:
DATA 63, 42, 21
DATA 48, 32, 16
DATA 12, 8, 4
DATA 3, 2, 1
DATA 60, 40, 20

PALETTEDATASCROLL:
DATA 48, 50, 51, 35, 19, 3, 7, 11, 14, 12, 44, 60, 56, 52

STAR:
REM EXTRA
DATA "STAR"
REM SC
DATA 9
DATA -1, 0
REM RTXADD, RTYADD, RTZADD
DATA 0.13, 0.08, 0
REM MVXDADD, MVYDADD, MVZDADD
DATA 0.05, 0.03, 0.02, 20, 20, 10
REM OFFS
DATA 0
REM BALLS
DATA 1,-3,0,0
DATA 1,-2,0,0
DATA 1,-1,0,0
DATA 0,0,0,0
DATA 1,1,0,0
DATA 1,2,0,0
DATA 1,3,0,0
DATA 2,0,-3,0
DATA 2,0,-2,0
DATA 2,0,-1,0
DATA 2,0,1,0
DATA 2,0,2,0
DATA 2,0,3,0
DATA 3,0,0,-3
DATA 3,0,0,-2
DATA 3,0,0,-1
DATA 3,0,0,1
DATA 3,0,0,2
DATA 3,0,0,3
DATA 999,999,999,999

TODDL:
DATA "TODDL"
REM SC
DATA 6
DATA -1, 0
REM RTXADD, RTYADD, RTZADD
DATA 0.13, 0.08, 0
REM MVXDADD, MVYDADD, MVZDADD
DATA 0.05, 0.03, 0.02, 10, 10, 10
REM 9876543210123456789
REM XXX  X  XX  XX  X
REM  X  X X X X X X X
REM  X  X X X X X X X
REM  X  X X X X X X X
REM  X   X  XX  XX  XXX
REM OFFS
DATA 5

REM BALLS
DATA 1,-8,-2,0
DATA 1,-7,-2,0
DATA 1,-6,-2,0
DATA 1,-7,-1,0
DATA 1,-7,0,0
DATA 1,-7,1,0
DATA 1,-7,2,0

DATA 4,-3.5,-2,0
DATA 4,-4.5,-1,0
DATA 4,-2.5,-1,0
DATA 4,-4.5,0,0
DATA 4,-2.5,0,0
DATA 4,-4.5,1,0
DATA 4,-2.5,1,0
DATA 4,-3.5,2,0

DATA 2,-1,-2,0
DATA 2,0,-2,0
DATA 2,-1,-1,0
DATA 2,1,-1,0
DATA 2,-1,0,0
DATA 2,1,0,0
DATA 2,-1,1,0
DATA 2,1,1,0
DATA 2,-1,2,0
DATA 2,0,2,0

DATA 3,2.5,-2,0
DATA 3,3.5,-2,0
DATA 3,2.5,-1,0
DATA 3,4.5,-1,0
DATA 3,2.5,0,0
DATA 3,4.5,0,0
DATA 3,2.5,1,0
DATA 3,4.5,1,0
DATA 3,2.5,2,0
DATA 3,3.5,2,0

DATA 0,6,-2,0
DATA 0,6,-1,0
DATA 0,6,0,0
DATA 0,6,1,0
DATA 0,6,2,0
DATA 0,7,2,0
DATA 0,8,2,0

DATA 999,999,999,999

CUBE:
DATA "CUBE"
REM SC
DATA 9
REM OBJROTASIS, OBJROTVAL
DATA -1, 0
REM RTXADD, RTYADD, RTZADD
DATA 0.13, 0.08, 0
REM MVXDADD, MVYDADD, MVZDADD
DATA 0.05, 0.03, 0.02, 30, 20, 10
REM OFFS
DATA 0
REM BALLS
DATA 1,-1,-1,-1
DATA 1,-1,-1,0
DATA 1,-1,-1,1
DATA 1,-1,0,-1
DATA 1,-1,0,0
DATA 1,-1,0,1
DATA 1,-1,1,-1
DATA 1,-1,1,0
DATA 1,-1,1,1
DATA 2,0,-1,-1
DATA 2,0,-1,0
DATA 2,0,-1,1
DATA 2,0,0,-1
DATA 4,0,0,0
DATA 2,0,0,1
DATA 2,0,1,-1
DATA 2,0,1,0
DATA 2,0,1,1
DATA 3,1,-1,-1
DATA 3,1,-1,0
DATA 3,1,-1,1
DATA 3,1,0,-1
DATA 3,1,0,0
DATA 3,1,0,1
DATA 3,1,1,-1
DATA 3,1,1,0
DATA 3,1,1,1
DATA 999,999,999,999

SPIRAL:
DATA "SPIRAL"
REM SC
DATA 6
REM OBJROTASIS, OBJROTVAL
DATA 0, 0.005
REM RTXADD, RTYADD, RTZADD
DATA 0.0,0.03,0.02
REM MVXDADD, MVYDADD, MVZDADD
DATA 0.00, 0.00, 0.00, 10, 10, 10
REM OFFS
DATA 0

FLAPPER:
DATA "FLAPPER"
REM SC
DATA 9
REM OBJROTASIS, OBJROTVAL
DATA 0, 0.005
REM RTXADD, RTYADD, RTZADD
DATA 0.00, 0.02, 0.03
REM MVXDADD, MVYDADD, MVZDADD
DATA 0.05, 0.15, 0.014, 20, 20, 10
REM OFFS
DATA 0

LARGECUBE:
DATA "LARGECUBE"
REM SC
DATA 9
REM OBJROTASIS, OBJROTVAL
DATA -1, 0
REM RTXADD, RTYADD, RTZADD
DATA 0.13, 0.08, 0
REM MVXDADD, MVYDADD, MVZDADD
DATA 0.05, 0.03, 0.02, 10, 30, 10
REM OFFS
DATA 0

FLAPPER2:
DATA "FLAPPER2"
REM SC
DATA 9
REM OBJROTASIS, OBJROTVAL
DATA 0, 0.005
REM RTXADD, RTYADD, RTZADD
DATA 0.00, 0.02, 0.03
REM MVXDADD, MVYDADD, MVZDADD
DATA 0.05, 0.15, 0.14, 20, 20, 10
REM OFFS
DATA 0

FLAG:
DATA "FLAG"
REM SC
DATA 6
REM OBJROTASIS, OBJROTVAL
DATA -1, 0
REM RTXADD, RTYADD, RTZADD
DATA 0.00, 0.02, 0.03
REM MVXDADD, MVYDADD, MVZDADD
DATA 0.15, 0.1, 0.2, 10, 10, 10
REM OFFS
DATA 0

OVERUNDER:
DATA "OVERUNDER"
REM SC
DATA 9
REM OBJROTASIS, OBJROTVAL
DATA 0, 0.005
REM RTXADD, RTYADD, RTZADD
DATA 0.00, 0.05, 0.03
REM MVXDADD, MVYDADD, MVZDADD
DATA 0.15, 0.1, 0.05, 10, 10, 10
REM OFFS
DATA 0




DATA "END"



DISPLAYSTAR:
  IF RASTER MOD 16 <> 0 OR RASTER >= 128 THEN RETURN
  DSI = INT(RASTER / 8)
  MVY = DSI
  ATTR (7, 0, 0, 0, 0)
  BG FILL 0, MVY TO 0 + 19, MVY CHAR 0
  IF STARS(DSI, IDXX) >= 160 OR STARS(DSI, IDXX) < 0 THEN RETURN
  FOR I = 0 TO 15
    POKE $8000 + 64 * 16 + I, 0
  NEXT I
  FOR B = 0 TO 1
    IF STARS(DSI, IDXC) AND 2^B THEN 
      POKE $8000 + 64 * 16 + (RASTER MOD 8) * 2 + B * 8, 2^(7 - (STARS(DSI, IDXX) MOD 8))
    END IF
  NEXT B
  MVX = INT(STARS(DSI, IDXX) / 8)

  ATTR (7, 0, 0, 0, 0)
  CELL MVX, MVY, 64
RETURN



INITSTAR:
  IF STARS(SI, IDXS1) <> 0 THEN
    STARS(SI, IDXX) = INT(RND * 32) + 160
  ELSE
    STARS(SI, IDXX) = INT(RND * 160)
  END IF
  STARS(SI, IDXY) = INT(RND * 8)
  STARS(SI, IDXS1) = INT(RND * 4) + 1
  STARS(SI, IDXS2) = INT(RND * 2) + 1
  IF STARS(SI, IDXS2) = 1 THEN 
    STARS(SI, IDXC) = 3
  ELSE IF STARS(SI, IDXS1) < 3 THEN 
    STARS(SI, IDXC) = 1
  ELSE 
    STARS(SI, IDXC) = 2
  END IF
RETURN


MOVESTARS:
  FOR SI = 0 TO 15 STEP 2
    IF OBJTIMER MOD STARS(SI, IDXS2) = 0 THEN
      STARS(SI, IDXX) = STARS(SI, IDXX) - STARS(SI, IDXS1)
      IF STARS(SI, IDXX) < 0 THEN GOSUB INITSTAR
    END IF
  NEXT SI
RETURN

SUB FFF
FOR I=1 TO 11
 PALETTE 0,RND*64,,,
NEXT I
END SUB

SUB RASTERFX
 F=(RASTER MOD 8)/8+1
 D=((RASTER MOD 4)+1)
 SCROLL 1,TIMER*F/D+STARX(RASTER),0
END SUB

#2:MAIN CHARACTERS
00000000000000000000000000000000
80008080800080800080808000808080
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
0E205F3FBFBFBF3F0E3F6040C0C0C040
00804080A0A0A0800080C04060606040
5F200E0000000000603F0E0000000000
4080000000000000C080000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
5F200E0000000000603F0E0000000000
4080000000000000C080000000000000