Ok, this isnt going to be helpful at all, but I just mocked this up in the last 5 minutes, to give you an idea of just how fast you can make whatever you can think of once you learn the ins and outs of a language >>
setupGame()
createMapTexture()
createTornadoTexture()
createSkyTexture()
createMap()
createTornado()
createSky()
createDebris()
TYPE tornadoT
x#,z#
suckRadius#
scale#
maxScale#
turnSpeed#
ENDTYPE
GLOBAL tornado AS tornadoT
tornado.suckRadius# = 100
tornado.scale# = 100
tornado.maxScale# = 300
tornado.turnSpeed# = 0.5
DO
controlTornado()
storeData()
handleCamera()
collectDebris()
handleSkysphere()
SYNC
LOOP
FUNCTION setupGame()
SYNC ON:SYNC RATE 0:AUTOCAM OFF
POSITION CAMERA 0,600,-800
FOG ON
ENDFUNCTION
FUNCTION createMapTexture()
FOR x = 1 TO 64
FOR y = 1 TO 64
DOT x,y,RGB(150,150,RND(155))
NEXT y
NEXT x
GET IMAGE 2,1,1,64,64
ENDFUNCTION
FUNCTION createMap()
MAKE MATRIX 1,4000,4000,10,10
RANDOMIZE MATRIX 1,50
UPDATE MATRIX 1
PREPARE MATRIX TEXTURE 1,2,1,1
ENDFUNCTION
FUNCTION createTornadoTexture()
FOR x = 1 TO 64
FOR y = 1 TO 64
transparent = RND(1)
IF transparent
DOT x,y,RGB(000,000,000)
ELSE
DOT x,y,RGB(240,240,240)
ENDIF
NEXT y
NEXT x
GET IMAGE 1,1,1,64,64
ENDFUNCTION
FUNCTION createTornado()
MAKE OBJECT CONE 1,100
XROTATE OBJECT 1,180
SET OBJECT CULL 1,0
TEXTURE OBJECT 1,1
SET OBJECT TRANSPARENCY 1,1
FIX OBJECT PIVOT 1
POSITION OBJECT 1,2000,0,0
ENDFUNCTION
FUNCTION createSkyTexture()
FOR x = 1 TO 64
FOR y = 1 TO 64
DOT x,y,RGB(RND(155),255,255)
NEXT y
NEXT x
GET IMAGE 3,1,1,64,64
ENDFUNCTION
FUNCTION createSky()
MAKE OBJECT SPHERE 1000,4000
SCALE OBJECT 1000,-100,-100,-100
TEXTURE OBJECT 1000,3
SET OBJECT LIGHT 1000,0
ENDFUNCTION
FUNCTION createDebris()
FOR x = 2 TO 100
obj = RND(2)
IF obj = 0
MAKE OBJECT SPHERE x,10+RND(10)
ENDIF
IF obj = 1
MAKE OBJECT CUBE x,10+RND(10)
ENDIF
IF obj = 2
MAKE OBJECT CYLINDER x,10+RND(10)
ENDIF
SET OBJECT CULL x,0
ROTATE OBJECT x,RND(360),RND(360),RND(360)
x# = RND(4000)
z# = RND(4000)
y# = GET GROUND HEIGHT(1,x#,z#) + (OBJECT SIZE Y(x)/2)
POSITION OBJECT x,x#,y#,z#
NEXT x
ENDFUNCTION
FUNCTION handleSkysphere()
POSITION OBJECT 1000,tornado.x#,0,tornado.z#
TURN OBJECT RIGHT 1000,.01
ENDFUNCTION
FUNCTION controlTornado()
ROTATE LIMB 1,0,0,LIMB ANGLE Y(1,0)+tornado.turnSpeed#,0
MOVE OBJECT 1,(KEYSTATE(17)-KEYSTATE(31))*0.5
YROTATE OBJECT 1,OBJECT ANGLE Y(1)+((KEYSTATE(30)-KEYSTATE(32))*0.5)
POSITION OBJECT 1,OBJECT POSITION X(1),GET GROUND HEIGHT(1,OBJECT POSITION X(1),OBJECT POSITION Z(1))+((OBJECT SIZE Y(1)/2)*(tornado.scale#/100)),OBJECT POSITION Z(1)
ENDFUNCTION
FUNCTION storeData()
tornado.x# = OBJECT POSITION X(1)
tornado.z# = OBJECT POSITION Z(1)
ENDFUNCTION
FUNCTION handleCamera()
POSITION CAMERA tornado.x#,CAMERA POSITION Y(),tornado.z#
ROTATE CAMERA 0,OBJECT ANGLE Y(1)-45,0
MOVE CAMERA -600
POINT CAMERA tornado.x#,50,tornado.z#
ENDFUNCTION
FUNCTION collectDebris()
FOR x = 2 TO 100
IF OBJECT EXIST(x)
distance# = SQRT( ((OBJECT POSITION X(x)-tornado.x#)^2)+((OBJECT POSITION Z(x)-tornado.z#)^2) )
IF distance# <= (tornado.suckRadius# * 2) * (tornado.scale#/100) AND distance# >= (tornado.suckRadius# /2) * (tornado.scale#/100)
POINT OBJECT x,tornado.x#,50,tornado.z#
MOVE OBJECT x,3
MOVE OBJECT LEFT x,2
IF distance# <= tornado.suckRadius# * (tornado.scale#/100)
IF tornado.scale# < tornado.maxScale#
INC tornado.scale#,10
INC tornado.turnSpeed#,0.1
ENDIF
SCALE OBJECT 1,tornado.scale#,tornado.scale#,tornado.scale#
DELETE OBJECT x
ENDIF
ENDIF
ENDIF
NEXT x
ENDFUNCTION
I dont recommend trying to learn from it, its very badly programmed, but if I spent 5 minutes on that, imagine what you could do in 5 weeks.