Challenge: 
Winner?: 
No
Code Snippet: 
` Fireworks

` Dave Mayes

` Setup max fireworks
NumFireworks = 719
` Set number of sparks per firework
NumSparks = 99

` Number of modes
Modes = 11

` set firework mode
FireMode = rnd(Modes)

` Set resolution
set display mode 640,480,32
hide mouse

` Set max frame rate
sync rate 0
sync on

` firework data type
type tfirework
    state as integer
    x as float
    y as float
    xspeed as float
    yspeed as float
    burst as dword
endtype

`spark data type
type tspark
    x as float
    y as float
    xspeed as float
    yspeed as float
    life as float
endtype

` firework array
dim firework(NumFireworks) as tfirework
` spark array
dim spark(NumSparks,NumFireworks) as tspark

` Gravity value (nss)
gravity = 1
` Launch counter
Launch = 500
` Setup Offset
Offset = 0
` Mouse Click Test
HitMouse = 0

` setup initial fitework state (Dead)
for f = 0 to NumFireworks
    firework(f).state = 2
next f


`Main Loop
repeat

`   Clear screen for every other mode
    if (FireMode and 1) = 0 then   cls

`   lock display memory for extra speed
    lock pixels

`   Loop through the lanched fireworks
    for f = 0 to int(Launch / 25)

`       read firework status
        fs = firework(f).state

`       decide what to do
        if fs = 0 then gosub shoot
        if fs = 1 then gosub shower
        if fs = 2 then gosub newfirework

`   Update Offset
    inc Offset

`   on to the next firework
    next f

`   get frame rate
    fr = screen fps()

`   increase launched counter to max if frame rate still high enough
    if fr > 30 and Launch < NumFireworks * 25 then inc Launch

`   release display memory
    unlock pixels

`   display stats
    nf$ = "Number of fireworks " + str$(1 + int(Launch / 25))
    ns$ = "Number of sparks " + str$((1 + int(Launch / 25)) * (1 + NumSparks))
    fp$ = "Frames Per Second " + str$(fr)
    text 0,0,nf$
    text 0,10,ns$
    text 0,20,fp$

`   show frame
    sync

`   Check for left mouse button
    if MouseClick() = 1 and HitMouse = 0 and FireMode >0
        dec FireMode
        HitMouse = 1
    endif

`   Check for right mouse button
    if MouseClick() = 2 and HitMouse = 0 and FireMode < Modes
        inc FireMode
        hitMouse = 1
    endif

`   Check for no mouse buttons
    if MouseClick() = 0 then HitMouse = 0

` end of main loop
until spacekey()
end

` shoot firework into air
shoot:

` adjust position and add gravity
firework(f).x = firework(f).x + firework(f).xspeed * 0.99
firework(f).y = firework(f).y + firework(f).yspeed
firework(f).yspeed = firework(f).yspeed + gravity

` change state if not moving up the screen
if firework(f).yspeed > 0
    firework(f).state = 1
endif

` get updates co-ordinates
x# = firework(f).x
y# = firework(f).y

` get firework colour
r = rgbr(firework(f).burst)
g = rgbg(firework(f).burst)
b = rgbb(firework(f).burst)

` loop through each spark
for s = 0 to NumSparks

`   scale spark colour down to a third of normal
    sl# = spark(s,f).life / 300.0

`   draw spark
    dot x# + spark(s,f).xspeed,y# + spark(s,f).yspeed,rgb(r * sl#, g * sl#, b * sl#)
next sl

return

` display shower
shower:

` get co-ordinates
x# = firework(f).x
y# = firework(f).y

` get firework colour
r = rgbr(firework(f).burst)
g = rgbg(firework(f).burst)
b = rgbb(firework(f).burst)

` reset life counter
life = 0

` loop through each spark
for s = 0 to NumSparks

`   decrease spark life counter if more than zero
    if spark(s,f).life > 0
        dec spark(s,f).life
    endif

`   get spark life as percentage
    sl# = spark(s,f).life / 100.0

`   work on aprks that are alive and in the air
    if sl# > 0 and spark(s,f).y < screen height()

`       Increase life counter
        inc life

`       update spark position
        spark(s,f).x = spark(s,f).x + spark(s,f).xspeed
        spark(s,f).y = spark(s,f).y + spark(s,f).yspeed

`       adjust spark speed
        spark(s,f).xspeed = spark(s,f).xspeed * 0.99
        spark(s,f).yspeed = spark(s,f).yspeed + (gravity / 20.0)

`       draw spark
        dot x# + spark(s,f).x,y# + spark(s,f).y,rgb(r * sl#, g * sl#, b * sl#)
    endif

next s

` change state for dead fireworks
if life = 0
    firework(f).state = 2
endif

return

` create / recycle a firework
newfirework:

CurrentMode = FireMode
if CurrentMode > Modes - 2 then CurrentMode = rnd(Modes - 1)

if CurrentMode < 2
`   Mouse controlled
    firework(f).state = 1
    firework(f).x = mousex()
    firework(f).y = mousey()
endif

if CurrentMode = 2 or CurrentMode = 3
`   Set position to bottom center of screen
    firework(f).state = 0
    firework(f).x = screen width() / 2: `rnd(screen width())
    firework(f).y = screen height() - 1
endif

if CurrentMode = 4 or CurrentMode = 5
`   Cirlce Mode
    firework(f).state = 1
    firework(f).x = (screen width() / 2) + cos(offset * 0.05) * (screen height() / 4)
    firework(f).y = (screen height() / 2) + sin(offset * 0.05) * (screen height() / 4)
endif

if CurrentMode = 6 or CurrentMode = 7
`   Cirlce Mode
    firework(f).state = 1
    firework(f).x = (screen width() / 2) + cos(offset * 0.09) * (screen height() / 4)
    firework(f).y = (screen height() / 2) + sin(offset * 0.05) * (screen height() / 4)
endif

if CurrentMode = 8 or CurrentMode = 9
`   Cirlce Mode
    firework(f).state = 1
    firework(f).x = (screen width() / 2) + cos(offset * 0.05) * (screen height() / 4)
    firework(f).y = (screen height() / 2) + sin(offset * 0.09) * (screen height() / 4)
endif


` choose randon speeds for direction variables
firework(f).xspeed = (rnd(101) - 50)/5.0
firework(f).yspeed = -23 + (rnd(101) - 50)/15.0

` pick a colour, any colour
firework(f).burst = rgb(rnd(255),rnd(255),rnd(255))

` loop through each spark
for s = 0 to NumSparks

`   reset spark offset
    spark(s,f).x = 0
    spark(s,f).y = 0

`   choose random speed for directions
    a = rnd(359)
    r# = rnd(200) / 100.0 + .02
    spark(s,f).xspeed = cos(a) * r#
    spark(s,f).yspeed = sin(a) * r# - 1

`   set life between 80 and 100 percent
    spark(s,f).life = 100 - rnd(20)

next s
return