Display number of found treasures in GUI
parent
5857a1673d
commit
48a652b6bc
|
@ -5,6 +5,59 @@ lzr_gui = {}
|
||||||
|
|
||||||
local hud_ids = {}
|
local hud_ids = {}
|
||||||
|
|
||||||
|
lzr_gui.hide_treasure_status = function(player)
|
||||||
|
local name = player:get_player_name()
|
||||||
|
if hud_ids[name].treasures_img then
|
||||||
|
player:hud_remove(hud_ids[name].treasures_img)
|
||||||
|
hud_ids[name].treasures_img = nil
|
||||||
|
end
|
||||||
|
if hud_ids[name].treasures_cnt then
|
||||||
|
player:hud_remove(hud_ids[name].treasures_cnt)
|
||||||
|
hud_ids[name].treasures_cnt = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
lzr_gui.update_treasure_status = function(player, treasures, total_treasures)
|
||||||
|
local name = player:get_player_name()
|
||||||
|
if not hud_ids[name].treasures_img then
|
||||||
|
local id = player:hud_add({
|
||||||
|
hud_elem_type = "image",
|
||||||
|
position = { x = 1, y = 1 },
|
||||||
|
name = "treasure_img",
|
||||||
|
text = "lzr_treasure_gold_block.png",
|
||||||
|
alignment = { x = -1, y = -1 },
|
||||||
|
offset = { x = -10, y = -20 },
|
||||||
|
scale = { x = 3, y = 3 },
|
||||||
|
size = { x = 3, y = 3 },
|
||||||
|
z_index = 0,
|
||||||
|
})
|
||||||
|
hud_ids[name].treasures_img = id
|
||||||
|
end
|
||||||
|
local treasure_text = S("@1 / @2", treasures, total_treasures)
|
||||||
|
local color = 0xFFFFFFFF
|
||||||
|
if treasures >= total_treasures then
|
||||||
|
color = 0xFF00FF00
|
||||||
|
end
|
||||||
|
if not hud_ids[name].treasures_cnt then
|
||||||
|
local id = player:hud_add({
|
||||||
|
hud_elem_type = "text",
|
||||||
|
position = { x = 1, y = 1 },
|
||||||
|
name = "treasure_cnt",
|
||||||
|
text = treasure_text,
|
||||||
|
number = color,
|
||||||
|
alignment = { x = -1, y = -1 },
|
||||||
|
offset = { x = -70, y = -20 },
|
||||||
|
scale = { x = 100, y = 100 },
|
||||||
|
size = { x = 3, y = 3 },
|
||||||
|
z_index = 0,
|
||||||
|
})
|
||||||
|
hud_ids[name].treasures_cnt = id
|
||||||
|
else
|
||||||
|
player:hud_change(hud_ids[name].treasures_cnt, "text", treasure_text)
|
||||||
|
player:hud_change(hud_ids[name].treasures_cnt, "number", color)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
lzr_gui.set_play_gui = function(player)
|
lzr_gui.set_play_gui = function(player)
|
||||||
player:hud_set_hotbar_itemcount(3)
|
player:hud_set_hotbar_itemcount(3)
|
||||||
player:hud_set_hotbar_image("lzr_gui_hotbar_3.png")
|
player:hud_set_hotbar_image("lzr_gui_hotbar_3.png")
|
||||||
|
@ -31,6 +84,17 @@ lzr_gui.set_editor_gui = function(player)
|
||||||
})
|
})
|
||||||
local name = player:get_player_name()
|
local name = player:get_player_name()
|
||||||
hud_ids[name].editor_mode = id
|
hud_ids[name].editor_mode = id
|
||||||
|
lzr_gui.hide_treasure_status(player)
|
||||||
|
end
|
||||||
|
lzr_gui.set_menu_gui = function(player)
|
||||||
|
player:hud_set_hotbar_itemcount(3)
|
||||||
|
player:hud_set_hotbar_image("lzr_gui_hotbar_3.png")
|
||||||
|
local name = player:get_player_name()
|
||||||
|
if hud_ids[name].editor_mode then
|
||||||
|
player:hud_remove(hud_ids[name].editor_mode)
|
||||||
|
hud_ids[name].editor_mode = nil
|
||||||
|
end
|
||||||
|
lzr_gui.hide_treasure_status(player)
|
||||||
end
|
end
|
||||||
|
|
||||||
minetest.register_on_joinplayer(function(player)
|
minetest.register_on_joinplayer(function(player)
|
||||||
|
|
|
@ -231,12 +231,17 @@ function lzr_laser.check_detectors_in_area(pos1, pos2)
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Return true if there are no unopened treasures remaining
|
-- Returns true if there are no unclaimed treasures remaining
|
||||||
function lzr_laser.check_treasures_in_area(pos1, pos2)
|
function lzr_laser.check_treasures_in_area(pos1, pos2)
|
||||||
local closed_chests = minetest.find_nodes_in_area(pos1, pos2, {"group:chest_closed"})
|
local closed_chests = minetest.find_nodes_in_area(pos1, pos2, {"group:chest_closed"})
|
||||||
return #closed_chests > 0
|
return #closed_chests > 0
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Returns the number of treasures found in current level
|
||||||
|
function lzr_laser.count_found_treasures(pos1, pos2)
|
||||||
|
return #minetest.find_nodes_in_area(pos1, pos2, {"group:chest_open"})
|
||||||
|
end
|
||||||
|
|
||||||
-- Returns true if player has no detectors in inventory
|
-- Returns true if player has no detectors in inventory
|
||||||
function lzr_laser.check_inventory_detectors(player, detector_placed)
|
function lzr_laser.check_inventory_detectors(player, detector_placed)
|
||||||
local inv = player:get_inventory()
|
local inv = player:get_inventory()
|
||||||
|
|
|
@ -25,6 +25,12 @@ local set_level_size = function(new_size)
|
||||||
minetest.log("verbose", "[lzr_levels] Level size set to: "..minetest.pos_to_string(new_size))
|
minetest.log("verbose", "[lzr_levels] Level size set to: "..minetest.pos_to_string(new_size))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local get_max_treasures = function()
|
||||||
|
if current_level then
|
||||||
|
return level_data[current_level].treasures
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
-- Mod storage for game progress
|
-- Mod storage for game progress
|
||||||
local mod_storage = minetest.get_mod_storage()
|
local mod_storage = minetest.get_mod_storage()
|
||||||
|
|
||||||
|
@ -65,14 +71,19 @@ local analyze_levels = function()
|
||||||
local schem = minetest.read_schematic(filepath, {write_yslice_prob="none"})
|
local schem = minetest.read_schematic(filepath, {write_yslice_prob="none"})
|
||||||
assert(schem, "Could not load level file: "..filename)
|
assert(schem, "Could not load level file: "..filename)
|
||||||
level_data[l].contains_rotatable_block = false
|
level_data[l].contains_rotatable_block = false
|
||||||
|
level_data[l].treasures = 0
|
||||||
level_data[l].size = schem.size
|
level_data[l].size = schem.size
|
||||||
local size = level_data[l].size
|
local size = level_data[l].size
|
||||||
for d=1, #schem.data do
|
for d=1, #schem.data do
|
||||||
local nodename = schem.data[d].name
|
local nodename = schem.data[d].name
|
||||||
local is_rotatable = minetest.get_item_group(nodename, "rotatable") == 1
|
local is_rotatable = minetest.get_item_group(nodename, "rotatable") == 1
|
||||||
|
local treasure = minetest.get_item_group(nodename, "chest_closed") > 0
|
||||||
if is_rotatable then
|
if is_rotatable then
|
||||||
level_data[l].contains_rotatable_block = true
|
level_data[l].contains_rotatable_block = true
|
||||||
end
|
end
|
||||||
|
if treasure then
|
||||||
|
level_data[l].treasures = level_data[l].treasures + 1
|
||||||
|
end
|
||||||
if nodename == "lzr_teleporter:teleporter_off" then
|
if nodename == "lzr_teleporter:teleporter_off" then
|
||||||
local start = flat_index_to_pos(d, size)
|
local start = flat_index_to_pos(d, size)
|
||||||
start = vector.add(start, vector.new(0, 0.5, 0))
|
start = vector.add(start, vector.new(0, 0.5, 0))
|
||||||
|
@ -155,10 +166,14 @@ local emerge_callback = function(blockpos, action, calls_remaining, param)
|
||||||
player:set_look_horizontal(param.yaw)
|
player:set_look_horizontal(param.yaw)
|
||||||
player:set_look_vertical(0)
|
player:set_look_vertical(0)
|
||||||
end
|
end
|
||||||
end
|
local gs = lzr_gamestate.get_state()
|
||||||
if param.level then
|
if gs == lzr_gamestate.LEVEL then
|
||||||
lzr_messages.show_message(player, lzr_levels.get_level_name(param.level), 3)
|
lzr_gui.update_treasure_status(player, 0, get_max_treasures())
|
||||||
minetest.sound_play({name = "lzr_levels_level_enter", gain = 1}, {to_player=player:get_player_name()}, true)
|
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
|
||||||
end
|
end
|
||||||
minetest.log("action", "[lzr_levels] Room emerge callback done")
|
minetest.log("action", "[lzr_levels] Room emerge callback done")
|
||||||
end
|
end
|
||||||
|
@ -380,6 +395,13 @@ function lzr_levels.restart_level()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- To be called when a treasure has been found (only in game mode LEVEL!)
|
||||||
|
function lzr_levels.found_treasure()
|
||||||
|
local treasures = lzr_laser.count_found_treasures(lzr_globals.PLAYFIELD_START, lzr_globals.PLAYFIELD_END)
|
||||||
|
local player = get_singleplayer()
|
||||||
|
lzr_gui.update_treasure_status(player, treasures, get_max_treasures())
|
||||||
|
end
|
||||||
|
|
||||||
minetest.register_chatcommand("restart", {
|
minetest.register_chatcommand("restart", {
|
||||||
privs = {},
|
privs = {},
|
||||||
params = "",
|
params = "",
|
||||||
|
|
|
@ -68,7 +68,7 @@ lzr_gamestate.register_on_enter_state(function(state)
|
||||||
if state == lzr_gamestate.MENU then
|
if state == lzr_gamestate.MENU then
|
||||||
local player = minetest.get_player_by_name("singleplayer")
|
local player = minetest.get_player_by_name("singleplayer")
|
||||||
lzr_player.set_play_inventory(player)
|
lzr_player.set_play_inventory(player)
|
||||||
lzr_gui.set_play_gui(player)
|
lzr_gui.set_menu_gui(player)
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
|
|
@ -31,6 +31,7 @@ local register_chest = function(id, def)
|
||||||
minetest.log("action", "[lzr_treasure] "..puncher:get_player_name().." opens "..node.name.." at "..minetest.pos_to_string(pos))
|
minetest.log("action", "[lzr_treasure] "..puncher:get_player_name().." opens "..node.name.." at "..minetest.pos_to_string(pos))
|
||||||
minetest.set_node(pos, {name="lzr_treasure:chest_"..id.."_open_"..treasure_id, param2=node.param2})
|
minetest.set_node(pos, {name="lzr_treasure:chest_"..id.."_open_"..treasure_id, param2=node.param2})
|
||||||
minetest.sound_play({name=sound_open, gain=0.5}, {pos=pos}, true)
|
minetest.sound_play({name=sound_open, gain=0.5}, {pos=pos}, true)
|
||||||
|
lzr_levels.found_treasure()
|
||||||
local timer = minetest.get_node_timer(pos)
|
local timer = minetest.get_node_timer(pos)
|
||||||
timer:start(1)
|
timer:start(1)
|
||||||
end,
|
end,
|
||||||
|
|
Loading…
Reference in New Issue