local function write_header() io.write('#include \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)