Build 5x5 grid.
do
local cols=5
local rows=5
local basevnum=501
local function getvnum( col, row)
return basevnum-1 + (row-1)*cols + col
end
local function setexflag( dir, flg)
if not(mob.room[dir]:flag(flg)) then
olc(dir.." "..flg)
end
end
for col=1,cols do
for row=1,rows do
mdo("redit create "..getvnum(col,row) )
end
end
for col=1,cols do
for row=1,rows do
local vnum=getvnum(col,row)
mdo("goto "..vnum)
if not(row==1) then -- do north stuff
olc("north dig "..getvnum(col,row-1))
setexflag( "north", "door")
setexflag( "north", "dormant")
end
if not(row==rows) then -- do south stuff
olc("south dig "..getvnum(col,row+1))
setexflag( "south", "door")
setexflag( "south", "dormant")
end
if not(col==1) then -- do west stuff
olc("west dig "..getvnum(col-1,row))
setexflag( "west", "door")
setexflag( "west", "dormant")
end
if not(col==cols) then -- do east stuff
olc("east dig "..getvnum(col+1,row))
setexflag( "east", "door")
setexflag( "east", "dormant")
end
end
end
end
Print map
do
local cols=5
local rows=5
local basevnum=501
local function getvnum( col, row)
return basevnum-1 + (row-1)*cols + col
end
local function setexflag( dir, flg)
if not(mob.room[dir]:flag(flg)) then
olc(dir.." "..flg)
end
end
local out={}
for row=1,rows do
local second={}
for col=1,cols do
table.insert(out, "#")
local room=getroom(getvnum(col,row))
if room.east then
table.insert(out, room.east:flag("dormant") and " " or "-")
end
if room.south then
table.insert(second, room.south:flag("dormant") and " " or "| ")
end
end
table.insert(out,"\n\r"..table.concat(second).."\n\r")
end
sendtochar(mob, table.concat(out))
end
Generate maze
do
local function revdir( dir )
if dir == "north" then return "south"
elseif dir == "south" then return "north"
elseif dir == "east" then return "west"
elseif dir == "west" then return "east"
end
end
--Randomized Prim's algorithm http://en.wikipedia.org/wiki/Maze_generation_algorithm
local walls={}
local maze={}
for k,v in pairs(getroom(501).exits) do
table.insert(walls, { dir=v, exit=getroom(501)[v]} )
end
while #walls>0 do
local wallind=randnum(1,#walls)
local wall=walls[wallind]
table.remove(walls, wallind)
if not maze[wall.exit.toroom] then
wall.exit:setflag("dormant", false)
wall.exit:setflag("door", false)
wall.exit.toroom[revdir(wall.dir)]:setflag("dormant", false)
wall.exit.toroom[revdir(wall.dir)]:setflag("door", false)
maze[wall.exit.toroom]=true
for k,v in pairs(wall.exit.toroom.exits) do
table.insert(walls, { dir=v, exit=wall.exit.toroom[v]} )
end
end
end
end