Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- if not shell.run("ESGraphics") then
- shell.run("pastebin","get","kDm3zq5E","ESGraphics")
- shell.run("ESGraphics")
- end
- mapX=5
- mapY=5
- mapZ=5
- map={}
- drawz=1
- drawscale=10
- htime=0
- groups={}
- dim={}
- dims={}
- drawx=0
- drawy=0
- npower=10002
- GroupPower={}
- SumOfDimensions={}
- GroupSumPower=0
- maps={}
- TotalNumberOfBlocksInAllGroups=0
- failstep=0
- maxloop=0
- loop=0
- drawblocks=0
- test=0
- --bush
- bush={}
- start=1
- draw=true
- blocksmap={}
- function saveinblocksmap(x,y,z)
- blocksmap[#blocksmap+1]={x,y,z,map[x][y][z]}
- end
- function getblockmap(i)
- return blocksmap[i][1],blocksmap[i][2],blocksmap[i][3],blocksmap[i][4]
- end
- bush[1]= function(x,y,z)
- local radius=math.random(1,math.floor((mapX+mapY+mapZ)/3))
- for nx=-radius,radius do
- for ny=-radius,radius do
- for nz=-radius,radius do
- local x2=limit(x+nx,mapX)
- local y2=limit(y+ny,mapY)
- local z2=limit(z+nz,mapZ)
- --print(x2,y2,z2)
- if map[x2][y2][z2]==-1
- then map[x2][y2][z2]=-2 else
- map[x2][y2][z2]=-1 end
- end
- end
- end
- end
- bush[2]= function(x2,y,z)
- for x=1,mapX do
- if map[x][y][z]==-1
- then map[x][y][z]=-2 else
- map[x][y][z]=-1 end
- end
- end
- bush[3]= function(x,y2,z)
- for y=1,mapY do
- if map[x][y][z]==-1
- then map[x][y][z]=-2 else
- map[x][y][z]=-1 end
- end
- end
- bush[4]= function(x,y,z2)
- for z=1,mapZ do
- if map[x][y][z]==-1
- then map[x][y][z]=-2 else
- map[x][y][z]=-1 end
- end
- end
- bush[5]= function(x2,y2,z)
- for x=1,x2 do
- for y=1,y2 do
- if math.random(1,2)==1 then
- if map[x][y][z]==-1
- then map[x][y][z]=-2 else
- map[x][y][z]=-1 end
- end
- end
- end
- end
- bush[6]= function(x,y2,z2)
- for z=1,z2 do
- for y=1,y2 do
- if math.random(1,2)==1 then
- if map[x][y][z]==-1
- then map[x][y][z]=-2 else
- map[x][y][z]=-1 end
- end
- end
- end
- end
- bush[7]= function(x2,y,z2)
- for x=1,x2 do
- for z=1,z2 do
- if math.random(1,2)==1 then
- if map[x][y][z]==-1
- then map[x][y][z]=-2 else
- map[x][y][z]=-1 end
- end
- end
- end
- end
- bush[8]= function(x2,y2,z)
- x=math.random(1,mapX)
- y=math.random(1,mapY)
- map[x][y][z]=-2
- end
- function generatemap()
- local I=-1
- local O=-2
- map={
- {
- {I,O,I,I,I},
- {I,I,O,O,O},
- {I,O,I,I,I},
- {O,I,O,I,I},
- {I,I,I,I,I},
- },
- {
- {O,I,I,O,O},
- {O,O,O,I,I},
- {I,O,I,O,I},
- {I,O,O,I,O},
- {O,O,I,I,O},
- },
- {
- {I,I,O,I,I},
- {I,O,I,O,I},
- {O,I,I,I,O},
- {I,O,I,O,I},
- {I,I,O,I,I},
- },
- {
- {O,O,I,I,O},
- {I,O,O,O,O},
- {I,O,I,O,I},
- {O,O,O,O,I},
- {O,I,I,O,O},
- },
- {
- {I,I,I,O,I},
- {O,I,O,I,I},
- {I,O,I,O,I},
- {I,I,O,I,O},
- {I,O,I,I,I},
- }
- }
- for x=1,mapX do
- maps[x]={}
- for y=1,mapY do
- maps[x][y]={}
- for z=1,mapZ do
- maps[x][y][z]=O
- end end end
- for x=1,mapX do
- for y=1,mapY do
- for z=1,mapZ do
- maps[x][y][z]=map[x][y][z] end end end
- end
- generatemap()
- function resetall()
- drawblocks=TotalNumberOfBlocksInAllGroups
- TotalNumberOfBlocksInAllGroups=0
- SumOfDimensions=nil
- SumOfDimensions={}
- SizePower=0
- GroupPower=nil
- GroupPower={}
- GroupSumPower=0
- end
- function mima(mi,n,ma)
- local x=math.min(n,ma)
- local nx=math.max(mi,x)
- return nx
- end
- function resetmap()
- for I=1,#blocksmap do
- x,y,z,name=getblockmap(I)
- if map[x][y][z]==-2 then else map[x][y][z]=-1 end
- end
- groups=nil
- groups={}
- dim=nil
- dim={}
- dims=nil
- dims={}
- blocksmap=nil
- blocksmap={}
- end
- function limit(n,n1) -- 1=<n=<n1
- local x=math.min(n,n1)
- local nx=math.max(1,x)
- return nx
- end
- function updateall()
- loop=loop+1
- if loop==maxloop then else
- if loop==1 then else
- bush[math.random(1,#bush)](math.random(1,mapX),math.random(1,mapY),math.random(1,mapZ))
- end
- for x=1,mapX do
- for y=1,mapY do
- for z=1,mapZ do
- saveinblocksmap(x,y,z,map[x][y][z])
- end end end
- local fail=0
- for I=1,#blocksmap do
- x,y,z,name=getblockmap(I)
- if map[x][y][z]==-1 then
- groups[#groups+1]={}
- map[x][y][z]=#groups
- dim[#groups]={}
- dims[#groups]={}
- for i=1,(mapX+mapY+mapZ)/3 do
- for I2=1,#blocksmap do
- x2,y2,z2,name=getblockmap(I2)
- if map[x2][y2][z2]==#groups then
- reactorupdate(x2,y2,z2,-1,#groups) else fail=fail+1
- end
- end
- end
- end
- end
- if #groups>0 then
- dim[#dim]={}
- for i=1, #dim do
- for I2=1,#blocksmap do
- x,y,z,name=getblockmap(I2)
- if map[x][y][z]==i then dim[i][#dim[i]+1]={x,y,z}
- end
- end
- end
- end
- for i=1, #groups do
- for n=1, #dim[i] do
- if n==1 then
- minx=dim[i][n][1]
- maxx=dim[i][n][1]
- miny=dim[i][n][2]
- maxy=dim[i][n][2]
- minz=dim[i][n][3]
- maxz=dim[i][n][3]
- else
- minx=math.min (dim[i][n][1],minx)
- maxx=math.max (dim[i][n][1],maxx)
- miny=math.min (dim[i][n][2],miny)
- maxy=math.max (dim[i][n][2],maxy)
- minz=math.min (dim[i][n][3],minz)
- maxz=math.max (dim[i][n][3],maxz)
- end
- end
- dims[i]={maxx-(minx-1),maxy-(miny-1),maxz-(minz-1)}
- end
- for i=1, #groups do
- SumOfDimensions[i]=dims[i][1]+dims[i][2]+dims[i][3]
- SizePower = 2000000 / ( 1 + 1.000696^(-0.333*(SumOfDimensions[i]/3)^1.7)) - 1000000
- BlockPower = 25 * #dim[i]
- SizePower =math.min(SizePower,1000000 )
- GroupPower[i] = BlockPower + SizePower
- GroupSumPower=GroupSumPower+(SumOfDimensions[i]/3)^1.7
- TotalNumberOfBlocksInAllGroups = TotalNumberOfBlocksInAllGroups+#dim[i]
- end
- GroupSumSizePower = 2000000 / ( 1 + 1.000696^(-0.333 * GroupSumPower)) - 1000000
- BlockPower = 25 * TotalNumberOfBlocksInAllGroups
- TotalPower = math.floor(BlockPower + GroupSumSizePower)
- if npower<TotalPower then savemap() npower=TotalPower else loadmap()
- failstep=failstep+1 end
- resetall()
- end
- end
- function reactorupdate(x,y,z,d,d2)
- if map[x][y][z]==d then map[x][y][z]=d2 end
- if map[limit(x+1,mapX)][y][z]==d then map[limit(x+1,mapX)][y][z]=d2 end
- if map[limit(x-1,mapX)][y][z]==d then map[limit(x-1,mapX)][y][z]=d2 end
- if map[x][limit(y+1,mapY)][z]==d then map[x][limit(y+1,mapY)][z]=d2 end
- if map[x][limit(y-1,mapY)][z]==d then map[x][limit(y-1,mapY)][z]=d2 end
- if map[x][y][limit(z+1,mapZ)]==d then map[x][y][limit(z+1,mapZ)]=d2 end
- if map[x][y][limit(z-1,mapZ)]==d then map[x][y][limit(z-1,mapZ)]=d2 end
- end
- function savemap()
- for x=1,mapX do
- for y=1,mapY do
- for z=1,mapZ do
- maps[x][y][z]=map[x][y][z]
- end end
- end end
- function loadmap()
- for x=1,mapX do
- for y=1,mapY do
- for z=1,mapZ do
- map[x][y][z]=maps[x][y][z]
- end end
- end end
- function mimat(mi,n,ma)
- if n<mi or n>ma then return false else return true end
- end
- function update()
- math.randomseed(os.time()+math.random(-100000,1000000000))
- if start==1 then
- updateall() end
- end
- function draw()
- for z=1,mapZ do
- gh.rectangle("line",z*mapZ+z,2,mapX+1,mapY+1,8,8," " )
- for y=1,mapY do
- for x=1,mapX do
- if map[x][y][z]==-2 then else
- gh.point(x+mapZ*z+z,y+2,1,12,"#")
- end
- end
- end
- end
- gh.text(1,10,1,0,"fps:"..fps.update().." power:"..npower)
- gh.text(1,11,1,0,"loop:"..loop.." fail step:"..failstep.." good step:"..loop-failstep)
- resetmap()
- end
- while true do
- r.systemupdate()
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement