So i wrote a 20 line wave simulator or something

its quite cool i think. its very similiar to the rope snippet i wrote earlier except that this is 3D
it requires D3D plugin for the 3d lines.
BUT you can still use it if you dont have it, just remove the 2 d3d_line3d commands and then remove the "hide object o(i,j) from the beginning. this maybe doesnt look that cool but it looks better than a error sign
sync on : sync rate 60 : a =80 : b =80: var# = 1
dim x#(a,b) : dim y#(a,b) : dim z#(a,b) dim v(a,b) : dim m#(a,b) : dim o(a,b)
for i = 1 to a : : for j = 1 to b : x#(i,j) = i*var# : y#(i,j) = j*var# : m#(i,j) = 5 : v(i,j) = createvector() : o(i,j) = find free object() : make object plane o(i,j),1,1 : hide object o(i,j) : NEXT : next
F1 = createvector() : F2 = createvector() : F3 = createvector() : F4 = createvector() : G = createvector()
basefriction# = 0.9991 : lineforce# = 0.1 : gravity# = -0.005 : color backdrop rgb(0,0,0)
do : if selected = 0 then zrotate camera wrapvalue(camera angle z()+mousemovex()) : xrotate camera wrapvalue(camera angle x()+mousemovey()) : if keystate(17) = 1 then move camera 1 : if keystate(31) = 1 then move camera -1
if mouseclick() = 0 then selected = 0
for i = 1 to a : x#(i,1) = i : y#(i,1) = 1 : z#(i,1) = 0 : next : for j = 1 to b : x#(1,j) = 1 : y#(1,j) = j : z#(1,j) = 0 : next : for i = 1 to a : x#(i,b) = i : y#(i,b) = b : z#(i,b) = 0 : next : for j = 1 to b : x#(a,j) = a : y#(a,j) = j : z#(a,j) = 0 : next : if spacekey() then friction# = 0 else friction# = basefriction#
for i = 2 to a-1 : for j = 2 to b-1 : set vector3 G,0,0,gravity#*m#(i,j): set vector3 F1,x#(i-1,j)-x#(i,j),y#(i-1,j)-y#(i,j),z#(i-1,j)-z#(i,j) : set vector3 F2,x#(i+1,j)-x#(i,j),y#(i+1,j)-y#(i,j),z#(i+1,j)-z#(i,j) :set vector3 F3,x#(i,j-1)-x#(i,j),y#(i,j-1)-y#(i,j),z#(i,j-1)-z#(i,j) : set vector3 F4,x#(i,j+1)-x#(i,j),y#(i,j+1)-y#(i,j),z#(i,j+1)-z#(i,j)
add vector3 F1,F1,F3 : add vector3 F1,F1,F2 : add vector3 F1,F1,F4 : add vector3 F1,F1,G : multiply vector3 F1,lineforce# : add vector3 v(i,j),v(i,j),F1 : multiply vector3 v(i,j),friction# : NEXT : next
maxz# = -1000 : minz# = 1000 : for i = 1 to a : for j = 1 to b : x#(i,j) = x#(i,j)+x vector3(v(i,j)) : y#(i,j) = y#(i,j)+y vector3(v(i,j)) : z#(i,j) = z#(i,j)+z vector3(v(i,j)) : maxz# = max(z#(i,j),maxz#) : minz# = min(minz#,z#(i,j)) : position object o(i,j),x#(i,j),y#(i,j),z#(i,j)
if selected = o(i,j) then z#(i,j) = z#(i,j)+mousemovey() : set vector3 v(i,j),0,0,0
if button(o(i,j)) = 2 and selected = 0 then selected = o(i,j) : m#(i,j) = 5
if button(o(i,j)) = 3 and selected = 0 then m#(i,j) = 100
NEXT : next : for i = 2 to a-1 : for j = 2 to b-1 : zv# = (3*(z#(i,j)-minz#))/(maxz#-minz#) : d3d_line3d x#(i,j),y#(i,j),z#(i,j),x#(i-1,j),y#(i-1,j),z#(i-1,j),rgb(20*zv#,70*zv#,200),1 : d3d_line3d x#(i,j),y#(i,j),z#(i,j),x#(i,j-1),y#(i,j-1),z#(i,j-1),rgb(20*zv#,70*zv#,200),1 : NEXT : next : sync : loop
function createvector() : num = find free vector() : null = make vector3(num) :
endfunction num
function button(obj) : if ((object screen x(obj)-mousex())^2+(object screen y(obj)-mousey())^2) < 200 then selected = mouseclick()+1
endfunction selected