Fix editor level loading not setting level size var

master
Wuzzy 2022-03-02 22:04:21 +01:00
parent a53110033c
commit dc0d1e3184
2 changed files with 60 additions and 34 deletions

View File

@ -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

View File

@ -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