Display number of found treasures in GUI

master
Wuzzy 2022-03-04 22:23:07 +01:00
parent 5857a1673d
commit 48a652b6bc
5 changed files with 98 additions and 6 deletions

View File

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

View File

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

View File

@ -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 = "",

View File

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

View File

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