1
0
mirror of https://github.com/Refactorio/RedMew.git synced 2024-12-12 10:04:40 +02:00
RedMew/map_gen/shared/global_builders.lua
2018-11-27 17:08:26 -05:00

87 lines
1.9 KiB
Lua

local Token = require 'utils.token'
local Builders = {}
function Builders.unpack(shape)
local token = Token.register_global(shape)
return function(x, y, world)
local data = Token.get_global(token)
local func = Token.get(data.token)
return func(x, y, world, data)
end
end
function Builders.pack(shape)
return {
token = Token.register(shape)
}
end
function Builders.run(x, y, world, shape)
local func = Token.get(shape.token)
return func(x, y, world, shape)
end
local tile_token =
Token.register(
function(_, _, _, args)
return args.tile
end
)
function Builders.tile(tile)
return {
token = tile_token,
tile = tile
}
end
local grid_pattern_endless_token =
Token.register(
function(x, y, world, args)
local y2 = ((y + args.half_height) % args.height) - args.half_height
local row_i = math.floor(y / args.height + 0.5) + 1
local x2 = ((x + args.half_width) % args.width) - args.half_width
local col_i = math.floor(x / args.width + 0.5) + 1
local row = args.pattern[row_i]
if not row then
row = {}
args.pattern[row_i] = row
end
local shape = row[col_i]
if not shape then
local func = Token.get(args.pattern_func)
shape = func(col_i, row_i)
row[col_i] = shape
end
return Builders.run(x2, y2, world, shape)
end
)
function Builders.grid_pattern_endless(pattern, width, height, pattern_func)
local half_width = width / 2
local half_height = height / 2
if type(pattern_func) ~= 'number' then
pattern_func = Token.register(pattern_func)
end
return {
pattern = pattern,
width = width,
height = height,
half_width = half_width,
half_height = half_height,
pattern_func = pattern_func,
token = grid_pattern_endless_token
}
end
return Builders