From 48a652b6bc14f688d6a926f2b7618aa586b6d432 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 4 Mar 2022 22:23:07 +0100 Subject: [PATCH] Display number of found treasures in GUI --- mods/lzr_gui/init.lua | 64 ++++++++++++++++++++++++++++++++++++++ mods/lzr_laser/physics.lua | 7 ++++- mods/lzr_levels/init.lua | 30 +++++++++++++++--- mods/lzr_menu/init.lua | 2 +- mods/lzr_treasure/init.lua | 1 + 5 files changed, 98 insertions(+), 6 deletions(-) diff --git a/mods/lzr_gui/init.lua b/mods/lzr_gui/init.lua index 338f6e7..ad04166 100644 --- a/mods/lzr_gui/init.lua +++ b/mods/lzr_gui/init.lua @@ -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) diff --git a/mods/lzr_laser/physics.lua b/mods/lzr_laser/physics.lua index 7bec696..54f991b 100644 --- a/mods/lzr_laser/physics.lua +++ b/mods/lzr_laser/physics.lua @@ -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() diff --git a/mods/lzr_levels/init.lua b/mods/lzr_levels/init.lua index 17f1d5c..d8dadf7 100644 --- a/mods/lzr_levels/init.lua +++ b/mods/lzr_levels/init.lua @@ -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 = "", diff --git a/mods/lzr_menu/init.lua b/mods/lzr_menu/init.lua index c3b2647..b965a11 100644 --- a/mods/lzr_menu/init.lua +++ b/mods/lzr_menu/init.lua @@ -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) diff --git a/mods/lzr_treasure/init.lua b/mods/lzr_treasure/init.lua index 1bc4a4a..2fe569d 100644 --- a/mods/lzr_treasure/init.lua +++ b/mods/lzr_treasure/init.lua @@ -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,