jtmm2-levels/build_levels.lua

105 lines
2.8 KiB
Lua

local function write_header()
io.write('#include <gint/display.h>\n')
io.write('#include "conf.h"\n')
io.write('#include "level.h"\n')
io.write('#include "tiles.h"\n')
io.write('#include "vec.h"\n')
end
local function load_level(level_id)
local level = require("level_" .. level_id)
return level
end
local function write_layer(layer, level_id)
local data = layer.data
io.write("const Tile tiles_", level_id, "_", layer.name, "[] = {\n")
for _, v in ipairs(data) do
if v ~= 0 then
v = v - 1
end
io.write(v, ",")
end
io.write("};\n")
end
local function count_tile_layers(level)
local count = 0
for _, layer in ipairs(level.layers) do
if layer.type == "tilelayer" then
count = count + 1
end
end
return count
end
local function find_start_pos(level)
for _, layer in ipairs(level.layers) do
if layer.type == "objectgroup" then
for _, object in ipairs(layer.objects) do
if object.visible and object.type == "start_pos" then
return { x = object.x / level.tilewidth,
y = object.y / level.tileheight }
end
end
end
end
return { x = 1, y = 1 }
end
local function write_level(level, level_id)
solid_layer = 1
bg_color = level.backgroundcolor or { 255, 255, 255 }
for i, v in ipairs(bg_color) do
bg_color[i] = math.floor(v / 8)
end
-- write every layer
for i, layer in ipairs(level.layers) do
if layer.name == "solid" then
solid_layer = i
end
if layer.type == "tilelayer" then
write_layer(layer, level_id)
end
end
io.write("const Tile *layers_", level_id, "[] = {")
for i, layer in ipairs(level.layers) do
if layer.type == "tilelayer" then
io.write("tiles_", level_id, "_", layer.name, ",")
end
end
io.write("};\n")
-- create level struct
io.write("const Level level_", level_id, " = {\n")
io.write("\t.width = ", level.width, ",\n")
io.write("\t.height = ", level.height, ",\n")
local start_pos = find_start_pos(level)
io.write("\t.start_pos = { ", start_pos.x, " * TILE_SIZE, ",
start_pos.y, " * TILE_SIZE },\n")
io.write("\t#ifdef FXCG50\n")
io.write("\t.bg_color = C_RGB(", bg_color[1], ", ",
bg_color[2], ", ", bg_color[3], "),\n")
io.write("\t#else\n")
io.write("\t.bg_color = C_WHITE,\n")
io.write("\t#endif\n")
io.write("\t.layers = layers_", level_id, ",\n")
io.write("\t.layers_count = ", count_tile_layers(level), ",\n")
io.write("\t.solid_layer = ", solid_layer - 1, "\n")
io.write("};\n")
end
local function write_function(first_level, last_level)
io.write("void level_set(const Level **level, uint level_id) {\n")
io.write("\tswitch(level_id) {\n")
for i = first_level, last_level, 1 do
io.write("\t\tcase ", i, ": *level = &level_", i, "; break;\n")
end
io.write("\t}\n")
io.write("}\n")
end
write_header()
local level_id = 1
write_level(load_level(level_id), level_id)
write_function(1, 1)