1
0
mirror of https://github.com/XeonSquared/OC-Copper.git synced 2024-09-19 01:38:47 +10:00
OC-Copper/gennet.lua
gamemanj aabbb554c6 Remove the fragmentation part of the reliablility layer
In practice it is unlikely that data that's too big for the reliability layer won't need splitting
 anyway by the application at some point, and the libraries are already too open to OOM DoS.
2017-03-18 15:31:25 +00:00

92 lines
1.9 KiB
Lua

-- I, 20kdc, release this into the public domain.
-- No warranty is provided, implied or otherwise.
-- Generate connected network where all nodes are connected.
-- Saves graph to "netref.dot", outputs lua tables to stdout.
local nodes = {}
local wordsA = {
"changing",
"ponderous",
"intriguing",
"bright",
"solitudial",
"nuanced",
"confused",
"confuzzled",
"inspiring",
"dark",
}
local wordsB = {
"fontaine",
"marple",
"poirot",
"pinkie",
"sparks",
"twi",
"edgar",
"edith",
"author",
"entity",
}
for i = 1, #wordsA do
for j = 1, #wordsB do
table.insert(nodes, wordsA[i] .. "_" .. wordsB[j])
end
end
local connections = {}
for i = 1, #nodes do
connections[i] = {}
connections[i][i] = true
end
-- Recursive algorithm.
-- It will always come to the right answer, though.
-- (But definitely wouldn't ever return the fastest route.)
local function canRoute(i, j, avoid)
if i == j then return true end
if avoid[i] then return false end
avoid[i] = true
for p = 1, #nodes do
if connections[i][p] then
if canRoute(p, j, avoid) then
return true
end
end
end
return false
end
local function ensureRoute(i, j)
while not canRoute(i, j, {}) do
local a, b = math.random(#nodes), math.random(#nodes)
connections[a][b] = true
connections[b][a] = true
end
end
print("return function (declare, connect)")
for i = 1, #nodes do
-- Perform declaration here so next pass can do connections
print(" declare(\"" .. nodes[i] .. "\")")
for j = i + 1, #nodes do
ensureRoute(i, j)
end
end
local dot = io.open("netref.dot", "w")
dot:write("graph \"Test Network Reference Graph\" {\n")
-- Notably this is a destructive process (to prevent backwards links)
for i = 1, #nodes do
for p = 1, #nodes do
if (p ~= i) and connections[i][p] then
print(" connect(" .. i .. ", " .. p .. ")")
dot:write(" " .. nodes[i] .. " -- " .. nodes[p] .. ";\n")
connections[p][i] = false
end
end
end
dot:write("}")
dot:close()
print("end")