Michael Craft
By: a guest | Nov 10th, 2009 | Syntax:
Lua | Size: 2.06 KB | Hits: 122 | Expires: Never
-- Include Gmod dummy functions for testing
require('gmod')
-- Create the logic_case entities
for y=1, 20 do
for x=1, 30 do
--print('(' .. x .. ',' .. y .. ')')
local ent = ents.create('logic_case')
local kvtable = {
['Case01'] = x,
['Case02'] = y,
}
ent:SetKeyValues(kvtable)
end
end
-- Real Code Starts Here
function getNodeTable()
-- Count up total X and Y
local totalX = 0
local totalY = 0
local entities = ents.FindByClass('logic_case')
for k,v in ipairs(entities) do
local values = v:GetKeyValues()
for key, value in pairs(values) do
if key == 'Case01' then
if value > totalX then
totalX = value
end
elseif key == 'Case02' then
if value > totalY then
totalY = value
end
end
end
end
-- Init the node table
local nodeTable = {}
for i=1, totalX do
nodeTable[i] = {} -- create a new row
for j=1, totalY do
nodeTable[i][j] = 0
end
end
-- Populate the node table
for k,v in ipairs(entities) do
local values = v:GetKeyValues()
local x = 0
local y = 0
for key, value in pairs(values) do
if key == 'Case01' then
x = value
elseif key == 'Case02' then
y = value
end
end
nodeTable[x][y] = v
end
return nodeTable
end
function generateTerrain(nodeTable)
math.randomseed(os.time())
local heights = { (math.random(1, #nodeTable[#nodeTable]))-5 }
for i=2, #nodeTable do
local prev = heights[i-1]
local height = math.random(prev-3, prev+3)
if height > #nodeTable[#nodeTable] then
height = #nodeTable[#nodeTable]
elseif height < 1 then
height = 1
end
table.insert(heights, height)
end
for k,v in ipairs(heights) do -- iterate over X values (columns)
for i=1, v do -- iterate over Y values (rows)
nodeTable[k][i]:Spawn()
end
end
end
nodeTable = getNodeTable()
generateTerrain(nodeTable)
-- Visiualisaton code for testing
for y=20, 1, -1 do
for x=1, 30 do
if nodeTable[x][y].spawned then
io.write('X')
else
io.write('-')
end
end
io.write('\n')
end