Display number of found treasures in GUI
parent
5857a1673d
commit
48a652b6bc
|
@ -5,6 +5,59 @@ lzr_gui = {}
|
|||
|
||||
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)
|
||||
player:hud_set_hotbar_itemcount(3)
|
||||
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()
|
||||
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
|
||||
|
||||
minetest.register_on_joinplayer(function(player)
|
||||
|
|
|
@ -231,12 +231,17 @@ function lzr_laser.check_detectors_in_area(pos1, pos2)
|
|||
return true
|
||||
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)
|
||||
local closed_chests = minetest.find_nodes_in_area(pos1, pos2, {"group:chest_closed"})
|
||||
return #closed_chests > 0
|
||||
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
|
||||
function lzr_laser.check_inventory_detectors(player, detector_placed)
|
||||
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))
|
||||
end
|
||||
|
||||
local get_max_treasures = function()
|
||||
if current_level then
|
||||
return level_data[current_level].treasures
|
||||
end
|
||||
end
|
||||
|
||||
-- Mod storage for game progress
|
||||
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"})
|
||||
assert(schem, "Could not load level file: "..filename)
|
||||
level_data[l].contains_rotatable_block = false
|
||||
level_data[l].treasures = 0
|
||||
level_data[l].size = schem.size
|
||||
local size = level_data[l].size
|
||||
for d=1, #schem.data do
|
||||
local nodename = schem.data[d].name
|
||||
local is_rotatable = minetest.get_item_group(nodename, "rotatable") == 1
|
||||
local treasure = minetest.get_item_group(nodename, "chest_closed") > 0
|
||||
if is_rotatable then
|
||||
level_data[l].contains_rotatable_block = true
|
||||
end
|
||||
if treasure then
|
||||
level_data[l].treasures = level_data[l].treasures + 1
|
||||
end
|
||||
if nodename == "lzr_teleporter:teleporter_off" then
|
||||
local start = flat_index_to_pos(d, size)
|
||||
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_vertical(0)
|
||||
end
|
||||
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)
|
||||
local gs = lzr_gamestate.get_state()
|
||||
if gs == lzr_gamestate.LEVEL then
|
||||
lzr_gui.update_treasure_status(player, 0, get_max_treasures())
|
||||
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
|
||||
minetest.log("action", "[lzr_levels] Room emerge callback done")
|
||||
end
|
||||
|
@ -380,6 +395,13 @@ function lzr_levels.restart_level()
|
|||
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", {
|
||||
privs = {},
|
||||
params = "",
|
||||
|
|
|
@ -68,7 +68,7 @@ lzr_gamestate.register_on_enter_state(function(state)
|
|||
if state == lzr_gamestate.MENU then
|
||||
local player = minetest.get_player_by_name("singleplayer")
|
||||
lzr_player.set_play_inventory(player)
|
||||
lzr_gui.set_play_gui(player)
|
||||
lzr_gui.set_menu_gui(player)
|
||||
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.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)
|
||||
lzr_levels.found_treasure()
|
||||
local timer = minetest.get_node_timer(pos)
|
||||
timer:start(1)
|
||||
end,
|
||||
|
|
Loading…
Reference in New Issue