No, I installed MSN Messenger and two days later reinstalled my system from a virus that mysteriously hit at the same time... It's never going back on my system again, period!

Here's the one I wrote today to fractally generate a 10 level dungeon.

It stores the dungeon in the variable dungeon(dungeonLevel,xPosition,zPosition) in the format:

0 = null space

1 = floor

2 = wall

3/4 = stairs

sync on
`* Dungeon Creation
dim maxNodes()
dim dungeonSize()
dim dungeonExits() : rem Maximum exits per node
dim dungeonLevels()
dim dungeon(10,1000,1000)
dim node(1000,4) : maxNodes()=1000
`* Dungeon Creation
dungeonLevels()=10
dungeonExits()=6 : Rem Make this higher to create larger and busier dungeons and smaller for the inverse
dungeonSize()=15 : Rem This will start stripping off nodes after a number of passes, larger numbers make bigger dungeons.
showDungeonBeingMade=1 : rem Set this to 1 to see the dungeon get made (SLOW!), setting it to 4 or 8 will update less frequently. 0 turns it off completely
text 20,20,"Generating" : sync
makeDungeon(showDungeonBeingMade)
showAllDungeonLevels()
undim node(1000,4)
function showAllDungeonLevels
sync
for level=1 to 10
cls 0
showDungeon(level)
ink rgb(128,128,128),0
text 20,screen height()-40,"LEVEL: "+str$(level)
sync
next level
endfunction
function showDungeon(level)
mx=screen width()
if mx>1000 then mx=1000
mz=screen height()
if mz>1000 then mz=1000
for sl=level+3 to level step -1
if sl=level then i#=1
if sl=level+1 then i#=.7
if sl=level+2 then i#=.4
if sl=level+3 then i#=.1
if sl<=dungeonLevels()
for x=1 to mx
for z=1 to mz
if dungeon(sl,x,z)=1 then ink rgb(64*i#,0,0),0 : dot x,z
if dungeon(sl,x,z)=2 then ink rgb(64*i#,64*i#,0),0 : dot x,z
if dungeon(sl,x,z)=3 then ink rgb(0,255*i#,0),0 : dot x,z
if dungeon(sl,x,z)=4 then ink rgb(0,255*i#,255*i#),0 : dot x,z
next z
next x
endIf
next sl
endfunction
function makeDungeon(showMake)
randomize 0
node(1,1)=500
node(1,2)=500
node(1,3)=5
node(1,4)=1
node(2,1)=500
node(2,2)=501
node(2,3)=7
node(2,4)=1
node(3,1)=501
node(3,2)=500
node(3,3)=6
node(3,4)=1
node(4,1)=499
node(4,2)=500
node(4,3)=8
node(4,4)=1
showGeneration=0
for level=1 to dungeonLevels()
passes=0
repeat
passes=passes+1
set cursor 20,40
nodes=0
Onodes=0
for n=maxNodes() to 1 step -1
if node(n,3)>0
chnc=rnd(passes)
chnc=chnc*(1+(node(n,4)-level))
if chnc<=dungeonSize()
if node(n,4)=level
nodes=nodes+1
else
Onodes=Onodes+1
endIf
makeNode(n)
else
node(n,3)=0
endIf
endIf
next n
if showMake>0
inc showGeneration
if showGeneration=showMake
showGeneration=0
cls 0
ink rgb(128,128,128),0 : text 20,20,"Generating dungeon level "+str$(level)+". Nodes: "+str$(nodes)+", lower nodes: "+str$(Onodes)+", total nodes: "+str$(nodes+Onodes)
makeWalls(level)
showDungeon(level)
clearWalls(level)
sync
endIf
endIf
until nodes=0
if level<dungeonLevels()
repeat
x=rnd(1000)
z=rnd(1000)
until dungeon(level,x,z)=1
dungeon(level,x,z)=3
newNode(x,z,9,level+1)
endIf
if level=2 then dungeonExits()=dungeonExits()+1
if level=3 then dungeonExits()=dungeonExits()+1
if level=4 then dungeonExits()=dungeonExits()+1
if level=5 then dungeonExits()=dungeonExits()+1
if level=6 then dungeonExits()=dungeonExits()-1
if level=7 then dungeonExits()=dungeonExits()-2 : if dungeonExits()<5 then dungeonExits()=5
if level=8 then dungeonExits()=dungeonExits()-2 : if dungeonExits()<3 then dungeonExits()=3
if level=9 then dungeonExits()=dungeonExits()-1 : if dungeonExits()<2 then dungeonExits()=2
dungeonSize()=dungeonSize()+(10-(level*2))
makeWalls(level)
next level
endfunction
function makeWalls(level)
for x=1 to 1000
for z=1 to 1000
if dungeon(level,x,z)=0
if dungeon(level,x-1,z)=1 or dungeon(level,x+1,z)=1 or dungeon(level,x,z-1)=1 or dungeon(level,x,z+1)=1
dungeon(level,x,z)=2
endIf
if dungeon(level,x-1,z-1)=1 or dungeon(level,x-1,z+1)=1 or dungeon(level,x+1,z-1)=1 or dungeon(level,x+1,z+1)=1
dungeon(level,x,z)=2
endIf
endIf
next z
next x
endfunction
function clearWalls(level)
for x=1 to 1000
for z=1 to 1000
if dungeon(level,x,z)=2 then dungeon(level,x,z)=0
next z
next x
endfunction
function makeNode(n)
level=node(n,4)
forward=3+(rnd(8)*2)
side=3+(rnd(4)*2)
if node(n,3)=9
l=side : r=side : u=side : d=side
endIf
if node(n,3)=1
l=side
r=side
u=forward
d=0
else
if node(n,3)=2
l=0
r=forward
u=side
d=side
else
if node(n,3)=3
l=side
r=side
u=0
d=forward
else
if node(n,3)=4
l=forward
r=0
u=side
d=side
else
l=forward : r=forward
u=forward : d=forward
if node(n,3)=5
l=0 : r=0 : d=0
else
if node(n,3)=6
l=0 : u=0 : d=0
else
if node(n,3)=7
l=0 : r=0 : u=0
else
r=0 : u=0 : d=0
endIf
endIf
endIf
endIf
endIf
endIf
endIf
sl=l-1 : sr=r-1 : su=u-1 : sd=d-1
if sl<0 then sl=0
if sr<0 then sr=0
if su<0 then su=0
if sd<0 then sd=0
safe=0
for areaX=node(n,1)-sl to node(n,1)+sr
for areaZ=node(n,2)-su to node(n,2)+sd
if areaX>2 and areaX<999 and areaZ>2 and areaZ<999
if dungeon(level,areaX,areaZ)=1
safe=1
endIf
else
safe=1
endIf
next areaZ
next areaX
if safe=0
`* Floor
for areaX=node(n,1)-l to node(n,1)+r
for areaZ=node(n,2)-u to node(n,2)+d
if dungeon(level,areaX,areaZ)=0 then dungeon(level,areaX,areaZ)=1
next areaZ
next areaX
`* Stairs Up
if node(n,3)=9
dungeon(level,node(n,1),node(n,2))=4
node(n,3)=5+rnd(3)
endIf
`* Corridor Ends
if node(n,3)=5 then newNode(node(n,1),node(n,2)-(u+1),1,level)
if node(n,3)=6 then newNode(node(n,1)+r+1,node(n,2),2,level)
if node(n,3)=7 then newNode(node(n,1),node(n,2)+d+1,3,level)
if node(n,3)=8 then newNode(node(n,1)-(l+1),node(n,2),4,level)
`* New Nodes
e=rnd(dungeonExits())
if e=0
stairs=rnd(dungeonSize()*1.5)
if stairs=0
if level<dungeonLevels()
dungeon(level,node(n,1),node(n,2))=3
newNode(node(n,1),node(n,2),9,level+1)
endIf
endIf
endIf
for doors=1 to e
direction=rnd(3)
if direction=0 then newNode(node(n,1),node(n,2)-(u+1),1,level)
if direction=1 then newNode(node(n,1)+r+1,node(n,2),2,level)
if direction=2 then newNode(node(n,1),node(n,2)+d+1,3,level)
if direction=3 then newNode(node(n,1)-(l+1),node(n,2),4,level)
next doors
endIf
node(n,3)=0
endfunction
function newNode(x,z,d,level)
found=maxNodes()+1
for empty=maxNodes() to 1 step -1
if node(empty,3)=0 then found=empty
next empty
if found<=maxNodes()
node(found,1)=x
node(found,2)=z
room=rnd(1) : room=room*4
node(found,3)=room+d
node(found,4)=level
if d=9 then node(found,3)=9
endIf
endfunction

Now all you gotta do is work out how to texture it!

Pneumatic Dryll, Outrageous epic cleric of EQ/Xev

God made the world in 7 days, but we're still waiting for the patch.