DECLARE SUB startup ()
DECLARE SUB mainrocket ()
DECLARE SUB minirockets ()
DECLARE SUB restart ()
DECLARE SUB drawcity ()

DIM SHARED x(50), y(50)
DIM SHARED xmom(50), ymom(50)
DIM SHARED x, y
DIM SHARED xmom, ymom
DIM SHARED redbits, reddelay
DIM SHARED wibble

startup
restart
drawcity

DO: key$ = INKEY$
   
  mainrocket
  minirockets
  restart
  drawcity

LOOP UNTIL key$ <> ""

SUB drawcity

z = 256
PALETTE 238, 5 + z * (5 + (z * 5))
PALETTE 239, 5 * z * z
PALETTE 240, 40 + z * (40 + (z * 40))
PALETTE 241, 30 + z * 30
PAINT (0, 0), 239
 
FOR m = 1 TO 50
  IF wibble = 0 THEN PSET (RND * 320, RND * 40 + RND * 40 + RND * 40 + RND * 40 + RND * 10 + RND * 10 + RND * 10 + RND * 10 + RND * 10 + RND * 10 - 40), 240
NEXT m
FOR m = 1 TO 50
  IF wibble = 0 THEN PSET (RND * 320, RND * 40 + RND * 40 + RND * 40 + RND * 40 - 40), 240
NEXT m
wibble = 1

CIRCLE (50, 30), 20, 240, .5, 4
CIRCLE (55, 35), 20, 240, .8, 3.5
PAINT (31, 30), 240
PSET (65, 20), 240
PSET (64, 19), 240
PSET (63, 19), 240

LINE (0, 190)-(10, 180), 238
LINE (10, 180)-(20, 190), 238
LINE (20, 190)-(40, 190), 238
LINE (40, 190)-(40, 200), 238
LINE (60, 200)-(60, 190), 238
LINE (60, 190)-(70, 180), 238
LINE (70, 180)-(80, 190), 238
LINE (80, 190)-(80, 200), 238
PAINT (1, 199), 238
PAINT (70, 199), 238
PSET (5, 190), 241: PSET (6, 190), 241: PSET (14, 190), 241: PSET (15, 190), 241
PSET (5, 195), 241: PSET (6, 195), 241: PSET (14, 195), 241: PSET (15, 195), 241
LINE (100, 200)-(100, 190), 238
LINE (100, 190)-(110, 180), 238
LINE (110, 180)-(120, 190), 238
LINE (120, 190)-(140, 190), 238
LINE (135, 190)-(145, 180), 238
LINE (145, 180)-(155, 190), 238
LINE (155, 190)-(155, 200), 238
PAINT (101, 199), 238
PAINT (150, 199), 238
PSET (105, 190), 241: PSET (106, 190), 241: PSET (150, 195), 241: PSET (151, 195), 241
LINE (200, 200)-(200, 190), 238
LINE (200, 190)-(210, 180), 238
LINE (210, 180)-(220, 190), 238
LINE (220, 190)-(240, 190), 238
LINE (240, 190)-(240, 200), 238
LINE (260, 200)-(260, 190), 238
LINE (260, 190)-(270, 180), 238
LINE (270, 180)-(280, 190), 238
LINE (280, 190)-(280, 200), 238
PAINT (201, 199), 238
PAINT (270, 199), 238
PSET (205, 190), 241: PSET (206, 190), 241: PSET (214, 190), 241: PSET (215, 190), 241
PSET (265, 190), 241: PSET (266, 190), 241: PSET (274, 195), 241: PSET (275, 195), 241

END SUB

SUB mainrocket
 
  pal = 256
  FOR time = 1 TO 35 + (10 * RND)
    FOR dl = 1 TO 0: NEXT dl
    PSET (x, y), colour
    x = x + xmom
    y = y + ymom
    ymom = (ymom + .2) / 1.01
    xmom = xmom / 1.01
    colour = POINT(x, y)
    PSET (x, y), 250
    IF time < 30 THEN SOUND (600 - time * 4), (800 - time * 4) / 500
    bri& = 63 - time * 2
    IF bri& < 0 THEN bri& = 0
    PALETTE 250, bri& + (pal * bri&) + (pal * pal * bri&)
  NEXT time
 
  PSET (x, y), 0

END SUB

SUB minirockets

  FOR m = 1 TO redbits
    x(m) = x
    y(m) = y
  NEXT m
 
  colour = INT(RND * 4) * 31
  colour2 = INT(RND * 4) * 31
  work = INT(RND * 4) + 1
  SOUND 50, 1
  SELECT CASE 1    'or change select case 1 with select case work
 
  CASE 1   'normal
  z = 256
  FOR time = 1 TO reddelay
    FOR m = 1 TO redbits
      IF POINT(x(m), y(m)) = colour + time - 1 THEN PSET (x(m), y(m)), 239
      x(m) = x(m) + xmom(m)
      y(m) = y(m) + ymom(m)
      ymom(m) = (ymom(m) + .2 + (RND - .5) / 10) / 1.01
      xmom(m) = (xmom(m) / 1.01) + (RND - .5) / 10
      IF time <> reddelay AND POINT(x(m), y(m)) = 239 THEN PSET (x(m), y(m)), colour + time
   
    NEXT m
  bright = INT((31 - time) / 2 + 5)
  PALETTE 238, bright + (z * (bright + (bright * z)))
  PALETTE 239, INT(bright / 2) * z * z
  NEXT time

  CASE 2   'explode
  z = 256
  FOR m = 1 TO redbits
    ymom(m) = ymom(m) + ymom
    xmom(m) = xmom(m) + xmom
  NEXT m
  FOR time = 1 TO reddelay
    FOR m = 1 TO redbits
      IF POINT(x(m), y(m)) = colour + time - 1 THEN PSET (x(m), y(m)), 239
      x(m) = x(m) + xmom(m)
      y(m) = y(m) + ymom(m)
      ymom(m) = (ymom(m) + .2 + (RND - .5) / 10) / 1.01
      xmom(m) = (xmom(m) / 1.01) + (RND - .5) / 10
      IF time <> reddelay AND POINT(x(m), y(m)) = 239 THEN PSET (x(m), y(m)), colour + time
    NEXT m
  bright = INT((31 - time) / 2 + 5)
  PALETTE 238, bright + (z * (bright + (bright * z)))
  PALETTE 239, INT(bright / 2) * z * z
  NEXT time

  CASE 3   'multicoloured
  z = 256
  FOR time = 1 TO reddelay
    FOR m = 1 TO redbits
      IF POINT(x(m), y(m)) = colour + time - 1 OR POINT(x(m), y(m)) = colour2 + time - 1 THEN PSET (x(m), y(m)), 239
      x(m) = x(m) + xmom(m)
      y(m) = y(m) + ymom(m)
      ymom(m) = (ymom(m) + .2 + (RND - .5) / 10) / 1.01
      xmom(m) = (xmom(m) / 1.01) + (RND - .5) / 10
      IF time <> reddelay AND POINT(x(m), y(m)) = 239 AND m > 10 THEN PSET (x(m), y(m)), colour + time
      IF time <> reddelay AND POINT(x(m), y(m)) = 239 AND m <= 10 THEN PSET (x(m), y(m)), colour2 + time
    NEXT m
  bright = INT((31 - time) / 2 + 5)
  PALETTE 238, bright + (z * (bright + (bright * z)))
  PALETTE 239, INT(bright / 2) * z * z
  NEXT time

  CASE 4   'drop
  z = 256
  FOR m = 1 TO redbits
    xmom(m) = xmom(m) / 4
  NEXT m
  FOR time = 1 TO reddelay
    FOR m = 1 TO redbits
      IF POINT(x(m), y(m)) = colour + time - 1 THEN PSET (x(m), y(m)), 239
      x(m) = x(m) + xmom(m)
      y(m) = y(m) + ymom(m)
      ymom(m) = (ymom(m) + .2 + (RND - .5) / 10) / 1.01
      xmom(m) = (xmom(m) / 1.01) + (RND - .5) / 10
      IF time <> reddelay AND POINT(x(m), y(m)) = 239 THEN PSET (x(m), y(m)), colour + time
    NEXT m
  bright = INT((31 - time) / 2 + 5)
  PALETTE 238, bright + (z * (bright + (bright * z)))
  PALETTE 239, INT(bright / 2) * z * z
  NEXT time

  END SELECT

END SUB

SUB restart
 
  x = 160
  y = 200
  xmom = (4 * RND) - 2
  ymom = -6.5 - (2 * RND)
 
  FOR m = 1 TO redbits
    xmom(m) = 1 * COS(m)
    ymom(m) = 1 * SIN(m)
  NEXT m

END SUB

SUB startup

  RANDOMIZE TIMER
  SCREEN 13        '320x200
  x = 160: y = 200
  xmom = (4 * RND) - 2
  ymom = -6.5 - (4 * RND)
  redbits = 20
  reddelay = 31
  z = 256

  FOR m = 1 TO reddelay
    PALETTE m, 63 - (m * 2)
  NEXT m
 
  FOR m = 1 TO reddelay
    PALETTE m + 31, z * (63 - (m * 2))
  NEXT m
 
  FOR m = 1 TO reddelay
    PALETTE m + 62, z * z * (63 - (m * 2))
  NEXT m
 
  FOR m = 1 TO reddelay
    PALETTE m + 93, 63 - (m * 2) + (z * (63 - (m * 2)))
  NEXT m

END SUB