ok, i made the dust, but i am not 100% sure what you mean how 2 do it wiht the roof etc...i can make that there fly around some smaller object at the begin...thats easy

Download new

Code:

bmap tornado_bmap = <sprite.tga>;
bmap small_bmap = <particle.tga>;

function tornado_particles;
function small_particle;

function tornado_sprite()
{
var distance;
var distance_add;
var max_alpha = 40;
my.facing = on;
my.transparent=on;
my.alpha=0;
my.passable = on;
my.unlit=on;
my.light=on;
my.red=70;
my.green=50;
my.blue=30;
while(my.skill3 == 0)
{
wait(1);
}
distance_add=random(0.7);
while(1)
{
distance + = distance_add*time;
my.skill2 + = my.skill1 * time;
you = ptr_for_handle(my.skill3);

if(abs(my.z-your.z)>1000)
{
my.alpha-=0.5*time;
if(my.alpha < 0){wait(1);ent_remove(me);return;}
}
else
{
my.alpha = min(my.alpha+time,max_alpha);
}
my.x = sin(my.skill2)*distance + you.x+20*sin(my.z+your.pan);
my.y = cos(my.skill2)*distance + you.y+20*sin(my.z+your.pan);
my.z += random(5)*time;
if(total_ticks%5<1)//all 5 ticks
{
my.scale_x += 0.002;
my.scale_y += 0.002;
}
if(random(40)>39.9)
{
effect(tornado_particles,2,my.x,nullvector);
}
my.roll + = my.skill1*time;
wait(1);
}
}

function move_tornado
{
var position[3];
var new_pos[3];
new_pos.x=random(5)-2.5;
new_pos.y=random(5)-2.5;
while(1)
{
if(random(10)>9.9)//new dir
{
new_pos.x=random(5)-2.5;
new_pos.y=random(5)-2.5;
}
position.x += (new_pos.x-position.x)*0.1*time;
position.y += (new_pos.y-position.y)*0.1*time;
my.x += position.x*time;
my.y += position.y*time;
my.pan+=5*time;
wait(1);
}
}

function tornado_paritcle_func
{
if(my.skill_a==1)
{
my.alpha+=time;
if(my.alpha>5)
{
my.skill_a=0;
}
}
else
{
my.alpha-=time;
}
my.size += 20*time;
my.x = your.x - 10*sin(total_ticks);
my.y = your.y - 10*cos(total_ticks);
effect(small_particle,1,vector(my.x+50-random(100),my.y+50-random(100),my.z+50-random(100)),vector(0,0,-0.125));
if(my.alpha<0)
{
my.lifespan=0;
}
}


function tornado_particles
{
my.bmap = tornado_bmap;
my.function=tornado_paritcle_func;
my.transparent=on;
my.size = 200;
my.alpha=0;
my.skill_a=1;
my.red=20;
my.green=10;
my.blue=5;
}

function small_particle_func
{
my.alpha-=time;
my.x = your.x +50-random(100);
my.y = your.y +50-random(100);
if(my.alpha<0)
{
my.lifespan=0;
}
}

function small_particle
{
my.size=0.5;
my.function = small_particle_func;
my.red=20;
my.green=10;
my.blue=0;
my.bmap = small_bmap;
my.streak=on;
my.move=on;
my.transparent = on;
}

function dust_func
{
my.alpha-=time;
my.size+=time;
if(my.alpha<0)
{
my.lifespan=0;
}
}

function dust
{
my.size = 50;
my.function = dust_func;
my.bmap = tornado_bmap;
my.vel_x = 4-random(8);
my.vel_y = 4-random(8);
my.vel_z = random(1);
my.move = on;
my.transparent = on;
my.alpha=40;
my.red=40;
my.green=25;
my.blue=12.5;
}

action tornado()
{
my.passable = on;
my.invisible = on;
//move_me here^^
move_tornado();
while(1)
{

you = ent_create("sprite.tga",my.x,tornado_sprite);
you.skill1 = random(10)+2;
you.skill2 = random(360);
you.scale_x = 0.125;
you.scale_y = you.scale_x;
you.skill3 = handle(my);
effect(dust,1,my.x,nullvector);
wait(-random(0.2));
}
}

function main
{
fps_max=75;
level_load("tornado.wmb");
wait(3);
randomize();
while(1)
{
camera.pan -= mouse_force.x;
camera.tilt += mouse_force.y;
temp.x = (key_w-key_s+mickey.z/10)*15*time;
temp.y = (key_a-key_d)*15*time;
temp.z = 0;
vec_rotate(temp,camera.pan);
vec_add(camera.x,temp);
wait(1);
}
}