Microsoft Small Basic

Program Listing: JQK179
'left click to add particles
'right click to move the particles right
'Made by Sam Guard, with help from LitDev
'KQR030
GraphicsWindow.Width = 400
GraphicsWindow.Height = 400
GraphicsWindow.Top = 10
l = 0
air = 1.1
grav = 0.1
dmp = 5
cdmp = 1
range = 40
diff = 10
close = 1
speed = 10
n = 2
size = 30
n2 = 1.5
sl = 1.1
jk = 10000
Sub sp
For spawn = 1 To 6
For spawn2 = 1 To 6
am = am + 1
x[am] = GraphicsWindow.MouseX-90+(30*spawn)
y[am] = GraphicsWindow.MouseY-90+(30*spawn2)
fx[am] = 0
fy[am] = 0
p[am] = Shapes.AddEllipse(size,size)
EndFor
EndFor
EndSub

'LitDev__________________________
While 1=1
start = Clock.ElapsedMilliseconds

update()

delay = 80 - (Clock.ElapsedMilliseconds-start)
If (delay > 0) Then
Program.Delay(delay)
EndIf
EndWhile
'LitDev__________________________

Sub update
If Mouse.IsLeftButtonDown Then
sp()
EndIf
If Mouse.IsRightButtonDown Then
rmouse()
EndIf
For d = 1 To 2
For it = 1 To 2
draw()
box()
EndFor
iter()
EndFor
col()
EndSub

Sub draw
For i = 1 To am
Shapes.Move(p[i],x[i]-15,y[i]-15)
EndFor
EndSub

Sub iter
For i = 1 To am
x[i] = x[i] + fx[i] * speed
y[i] = y[i] + fy[i] * speed
EndFor
EndSub

Sub col
For i = 1 To am
fy[i] = fy[i] + grav
For c = i+1 To am
dif1 = x[i] - x[c]
dif2 = y[i] - y[c]
If dif1 < 0 Then
dif1 = -dif1
minx = 1
Else
minx = 0
EndIf
If dif2 < 0 Then
dif2 = -dif2
miny = 1
Else
miny = 0
EndIf
dst = Math.SquareRoot(Math.Power(dif1,2) + Math.Power(dif2,2))
If dst < range Then
If minx = 1 then
fx[i] = fx[i] - (dmp/dst)
fx[c] = fx[c] + (dmp/dst)
fx[i] = fx[i] / sl
Else
fx[i] = fx[i] + (dmp/dst)
fx[c] = fx[c] - (dmp/dst)
fx[i] = fx[i] / sl
EndIf
If miny = 1 then
fy[i] = fy[i] - (dmp/dst)
fy[c] = fy[c] + (dmp/dst)
fy[i] = fy[i] / sl
Else
fy[i] = fy[i] + (dmp/dst)
fy[c] = fy[c] - (dmp/dst)
fy[i] = fy[i] / sl
EndIf
EndIf
If dst > range+diff And dst < range+(diff*2) Then
If minx = 1 then
fx[i] = fx[i] + (cdmp/dst)
Else
fx[i] = fx[i] - (cdmp/dst)
EndIf
If miny = 1 then
fy[i] = fy[i] + (cdmp/dst)
Else
fy[i] = fy[i] - (cdmp/dst)
EndIf
EndIf
EndFor
EndFor
EndSub

Sub rmouse
For i = 1 To am
For m = 1 To am
dif1 = x[i] - GraphicsWindow.MouseX
dif2 = y[i] - GraphicsWindow.MouseY
If dif1 < 0 Then
dif1 = -dif1
minx = 1
Else
minx = 0
EndIf
If dif2 < 0 Then
dif2 = -dif2
miny = 1
Else
miny = 0
EndIf
If minx = 1 then
fx[i] = fx[i] + (dst/jk)
Else
fx[i] = fx[i] - (dst/jk)
EndIf
If miny = 1 then
fy[i] = fy[i] + (dst/jk)
Else
fy[i] = fy[i] - (dst/jk)
EndIf
EndFor


EndFor
EndSub

Sub box
For i = 1 To am
'_____________box_____________
fy[i] = fy[i]/air
if y[i] > 400 Then
If fy[i] > 0 Then
y[i] = 400
fy[i] = -fy[i]/4
Else
fx[i] = fx[i]/air
EndIf
Elseif y[i] < 0 and close = 1 Then
If fy[i] < 0 Then
y[i] = 0
fy[i] = -fy[i]/2
EndIf
EndIf
If x[i] < 0 Then
If fx[i] < 0 Then
x[i] = 0
fx[i] = -fx[i]/2
EndIf
ElseIf x[i] > 400 Then
If fx[i] > 0 Then
x[i] = 400
fx[i] = -fx[i]/2
EndIf
EndIf
EndFor
'_____________box_end_____________
EndSub