diff --git a/mods/lzr_editor/init.lua b/mods/lzr_editor/init.lua index 65cc9ec..81cde7b 100644 --- a/mods/lzr_editor/init.lua +++ b/mods/lzr_editor/init.lua @@ -51,7 +51,7 @@ minetest.register_chatcommand("editor_size", { return false, S("Too small!") end lzr_levels.clear_playfield(size) - lzr_levels.build_room(lzr_globals.LEVEL_POS, size) + lzr_levels.build_room({pos=lzr_globals.LEVEL_POS, size=size}) return true end, }) @@ -118,10 +118,9 @@ minetest.register_chatcommand("editor_load", { return false, S("Level file does not exist!") end local filename = minetest.get_worldpath().."/levels/"..level_name..".mts" - local schem = minetest.read_schematic(filename, {}) + local schem = minetest.read_schematic(filename, {write_yslice_prob="none"}) if schem then - lzr_levels.build_room(lzr_globals.LEVEL_POS, schem.size) - minetest.place_schematic(lzr_globals.LEVEL_POS, schem, "0", {}, true, {}) + lzr_levels.prepare_and_build_custom_level(schem) minetest.log("action", "[lzr_editor] Level loaded from "..filename) return true, S("Level loaded.") else diff --git a/mods/lzr_levels/init.lua b/mods/lzr_levels/init.lua index ed95df8..3f07d5c 100644 --- a/mods/lzr_levels/init.lua +++ b/mods/lzr_levels/init.lua @@ -13,14 +13,14 @@ local current_level = nil local level_data = {} lzr_levels.LAST_LEVEL = 0 -local level_size = table.copy(lzr_globals.DEFAULT_LEVEL_SIZE) +local level_size = vector.copy(lzr_globals.DEFAULT_LEVEL_SIZE) lzr_levels.get_level_size = function() return level_size end local set_level_size = function(new_size) - level_size = new_size + level_size = vector.copy(new_size) minetest.log("verbose", "[lzr_levels] Level size set to: "..minetest.pos_to_string(new_size)) end @@ -41,7 +41,7 @@ local analyze_levels = function() local level_list_path = minetest.get_modpath("lzr_levels").."/data/level_data.csv" local level_list_file = io.open(level_list_path, "r") assert(level_list_file, "Could not load level_data.csv") - + for line in level_list_file:lines() do local matches = string.split(line, ",") assert(matches ~= nil, "Malformed level_data.csv") @@ -75,7 +75,8 @@ local analyze_levels = function() end end -local build_room = function(param) +-- Set the basic nodes of the room +local set_room_nodes = function(param) local pos = param.pos local psize = param.size local posses_border = {} @@ -120,32 +121,41 @@ local emerge_callback = function(blockpos, action, calls_remaining, param) minetest.log("error", "[lzr_levels] Room emerging cancelled.") elseif calls_remaining == 0 and (action == minetest.EMERGE_GENERATED or action == minetest.EMERGE_FROM_DISK or action == minetest.EMERGE_FROM_MEMORY) then lzr_levels.clear_playfield(param.size) - build_room(param) + set_room_nodes(param) + local level_ok = false if param.level then - local level_ok = lzr_levels.build_level(param.level) - if not level_ok then - minetest.log("error", "[lzr_levels] Room emerge callback done with error") - else - local player = get_singleplayer() - if player then - if param.spawn_pos then - player:set_pos(param.spawn_pos) - end - if param.yaw then - player:set_look_horizontal(param.yaw) - player:set_look_vertical(0) - end - lzr_messages.show_message(player, lzr_levels.get_level_name(param.level), 3) - minetest.sound_play({name = "lzr_levels_level_enter", gain = 1}, {to_player=player:get_player_name()}, true) + level_ok = lzr_levels.build_level(param.level) + elseif param.schematic then + level_ok = lzr_levels.build_level_raw(param.schematic) + else + minetest.log("action", "[lzr_levels] Empty room emerge callback done") + return + end + + if not level_ok then + minetest.log("error", "[lzr_levels] Room emerge callback done with error") + else + local player = get_singleplayer() + if player then + if param.spawn_pos then + player:set_pos(param.spawn_pos) + end + if param.yaw then + player:set_look_horizontal(param.yaw) + player:set_look_vertical(0) end - minetest.log("action", "[lzr_levels] Room emerge callback done") end + if param.level then + lzr_messages.show_message(player, lzr_levels.get_level_name(param.level), 3) + minetest.sound_play({name = "lzr_levels_level_enter", gain = 1}, {to_player=player:get_player_name()}, true) + end + minetest.log("action", "[lzr_levels] Room emerge callback done") end end end -local prepare_room = function(pos, size, level, spawn_pos, yaw) - minetest.emerge_area(pos, vector.add(pos, size), emerge_callback, {pos=pos, size=size, level=level, spawn_pos=spawn_pos, yaw=yaw}) +local prepare_room = function(room_data) + minetest.emerge_area(room_data.pos, vector.add(room_data.pos, room_data.size), emerge_callback, room_data) end function lzr_levels.clear_playfield(room_size) @@ -169,17 +179,28 @@ function lzr_levels.clear_playfield(room_size) minetest.bulk_set_node(posses_air, {name="air"}) end -function lzr_levels.build_room(pos, size, level, spawn_pos, yaw) - prepare_room(pos, size, level, spawn_pos, yaw) +-- room_data: +-- - pos: Room pos +-- - size: Room size vector +-- - spawn_pos: Relative player spawn position (optional) +-- - yaw: Initial player yaw (optional) +-- Either one of these (or none of them for empty room): +-- - level: level ID (for builtin level) +-- - schematic: Path to schematic +function lzr_levels.build_room(room_data) + prepare_room(room_data) end function lzr_levels.prepare_and_build_level(level, spawn_pos, yaw) - lzr_levels.build_room(lzr_globals.LEVEL_POS, level_data[level].size, level, spawn_pos, yaw) + lzr_levels.build_room({pos=lzr_globals.LEVEL_POS, size=level_data[level].size, level=level, spawn_pos=spawn_pos, yaw=yaw}) end -function lzr_levels.build_level(level) - local filepath = minetest.get_modpath("lzr_levels").."/schematics/"..level_data[level].filename - local schem = minetest.place_schematic(lzr_globals.LEVEL_POS, filepath, "0", {}, true, "") +function lzr_levels.prepare_and_build_custom_level(schematic, spawn_pos, yaw) + lzr_levels.build_room({pos=lzr_globals.LEVEL_POS, size=schematic.size, schematic=schematic, spawn_pos=spawn_pos, yaw=yaw}) +end + +function lzr_levels.build_level_raw(schematic_specifier) + local schem = minetest.place_schematic(lzr_globals.LEVEL_POS, schematic_specifier, "0", {}, true, "") if schem then -- Propagate lasers and check for insta-win lzr_laser.full_laser_update(lzr_globals.PLAYFIELD_START, lzr_globals.PLAYFIELD_END) @@ -188,11 +209,17 @@ function lzr_levels.build_level(level) lzr_levels.level_complete() end else - minetest.log("error", "[lzr_levels] lzr_levels.build_level failed to build level") + minetest.log("error", "[lzr_levels] lzr_levels.build_level_raw failed to build level") end return schem end +function lzr_levels.build_level(level) + local filepath = minetest.get_modpath("lzr_levels").."/schematics/"..level_data[level].filename + local schem = lzr_levels.build_level_raw(filepath) + return schem +end + local function clear_inventory(player) local inv = player:get_inventory() for i=1,inv:get_size("main") do