broguecavegeneration.lua
ROT=require 'src.rot' function love.load() f =ROT.Display(79,29) cl=ROT.Map.Cellular:new(f:getWidth(), f:getHeight()) cl:randomize(.55) cl:create(calbak) end function love.draw() f:draw() end wait=false id=2 largest=2 largestCount=0 function love.update() local start=os.clock() cl:randomize(.55) if wait then return end local cellStart=os.clock() for i=1,5 do cl:create(calbak) end for x=1,f:getWidth() do for y=1,f:getHeight() do if cl._map[x][y]==1 then local count=fillBlob(x,y,cl._map, id) if count>largestCount then largest=id largestCount=count end id=id+1 end end end writeMap() largest=2 id=2 largestCount=0 wait=true i=0 end function love.keypressed() wait=false end function writeMap() for x=1,f:getWidth() do for y=1,f:getHeight() do f:write(cl._map[x][y]==largest and '.' or '#', x, y) end end end function calbak(x, y, val) f:write(val==1 and '#' or '.', x, y) end function fillBlob(x,y,m,id) m[x][y]=id local todo={{x,y}} local dirs=ROT.DIRS.EIGHT local size=1 repeat local pos=table.remove(todo, 1) for i=1,#dirs do local rx=pos[1]+dirs[i][1] local ry=pos[2]+dirs[i][2] if rx<1 or rx>f:getWidth() or ry<1 or ry>f:getHeight() then elseif m[rx][ry]==1 then m[rx][ry]=id table.insert(todo,{ rx, ry }) size=size+1 end end until #todo==0 return size end