From 5b49bfbccd816d24af3f27e5cce930787b6985e5 Mon Sep 17 00:00:00 2001 From: Sokomine Date: Sun, 9 Jan 2022 02:04:10 +0100 Subject: [PATCH] made edit dialog work in formspec versions < 3 as far as possible --- fs_talkdialog.lua | 57 +++++++++++++++++++++++++++++++++-------------- 1 file changed, 40 insertions(+), 17 deletions(-) diff --git a/fs_talkdialog.lua b/fs_talkdialog.lua index e2fe706..73a60a5 100644 --- a/fs_talkdialog.lua +++ b/fs_talkdialog.lua @@ -276,6 +276,24 @@ yl_speak_up.input_talk = function(player, formname, fields) end +-- older formspecs (before v3) do not offer a scroll container and have to scroll manually; +-- we maintain a player-name-based counter in order to see if this line ought to be shown +yl_speak_up.old_fs_version_show_line = function(pname) + -- the player is using a new enough version for scroll_container to work + if(not(pname)) then + return true + end + local max_number_of_buttons = yl_speak_up.max_number_of_buttons + local start_index = yl_speak_up.speak_to[pname].option_index + local counter = yl_speak_up.speak_to[pname].counter + yl_speak_up.speak_to[pname].counter = counter + 1 + if counter < start_index or counter >= start_index + max_number_of_buttons then + return false + end + return true +end + + -- show an edit option in the main menu of the NPC; -- helper function for yl_speak_up.fs_talkdialog(..) yl_speak_up.add_edit_button_fs_talkdialog = function(formspec, h, button_name, tooltip, label, @@ -289,11 +307,7 @@ yl_speak_up.add_edit_button_fs_talkdialog = function(formspec, h, button_name, t local label_start_pos = "0.7" -- older formspecs (before v4) do not offer a scroll container and have to scroll manually if(pname) then - local max_number_of_buttons = yl_speak_up.max_number_of_buttons - local start_index = yl_speak_up.speak_to[pname].option_index - local counter = yl_speak_up.speak_to[pname].counter - yl_speak_up.speak_to[pname].counter = counter + 1 - if counter < start_index or counter >= start_index + max_number_of_buttons then + if(not(yl_speak_up.old_fs_version_show_line(pname))) then return h end -- there has to be more room for the up and down arrows @@ -657,11 +671,17 @@ yl_speak_up.get_fs_talkdialog = function(player, n_id, d_id, alternate_text, rec for _, sb_v in pairs(sorted_buttons) do local oid = minetest.formspec_escape(sb_v.o_id) -- in edit_mode: show all options - if edit_mode then - h = h + 1 + if(edit_mode and yl_speak_up.old_fs_version_show_line(pname_for_old_fs)) then + local offset = 0.0 + local field_length = 44.4 + if(pname_for_old_fs) then + offset = 0.7 + field_length = 42.4 + end + h = h + 1 -- add a button "o_:" that leads to an edit formspec for this option yl_speak_up.add_formspec_element_with_tooltip_if(formspec, - "button", "2.3," .. h .. ";2,0.9", "edit_option_" .. oid, + "button", tostring(2.3+offset).."," .. h .. ";2,0.9", "edit_option_" .. oid, oid, "Edit target dialog, pre(C)onditions and (Ef)fects for option "..oid..".", true) @@ -683,16 +703,17 @@ yl_speak_up.get_fs_talkdialog = function(player, n_id, d_id, alternate_text, rec -- add a button "-> d_" that leads to the target dialog (if one is set) -- selecting an option this way MUST NOT execute the pre(C)onditions or (Ef)fects! yl_speak_up.add_formspec_element_with_tooltip_if(formspec, - "button", "9.0," .. h .. ";1,0.9", "button_" .. oid, + "button", tostring(9.0+offset).."," .. h .. ";1,0.9", "button_" .. oid, "->", - "Go to target dialog "..minetest.formspec_escape(target_dialog).. + "Go to target dialog "..minetest.formspec_escape(target_dialog or "").. " that will be shown when this option ("..oid..") is selected.", (target_dialog)) -- allow to set a new target dialog - table.insert(formspec, "dropdown[4.4,"..h..";4.7,1;d_id_"..oid..";".. + table.insert(formspec, "dropdown["..tostring(4.4+offset)..","..h..";4.7,1;d_id_".. + oid..";".. dialog_list..";".. - minetest.formspec_escape(d_id_to_dropdown_index[target_dialog] or "0")..",]") + minetest.formspec_escape(d_id_to_dropdown_index[(target_dialog or "?")] or "0")..",]") -- add a tooltip "Change target dialog" table.insert(formspec, "tooltip[4.4,"..h..";4.7,1;".. "Change target dialog for option "..oid..".;#FFFFFF;#000000]") @@ -700,13 +721,13 @@ yl_speak_up.get_fs_talkdialog = function(player, n_id, d_id, alternate_text, rec -- are there any prerequirements? local prereq = active_dialog.d_options[sb_v.o_id].o_prerequisites yl_speak_up.add_formspec_element_with_tooltip_if(formspec, - "button", "0.5," .. h .. ";0.5,0.9", "conditions_"..oid, + "button", tostring(0.5+offset).."," .. h .. ";0.5,0.9", "conditions_"..oid, "C", "There are pre(C)onditions required for showing this option. Display them.", (prereq and next(prereq))) yl_speak_up.add_formspec_element_with_tooltip_if(formspec, - "button", "1.6," .. h .. ";0.6,0.9", "effects_"..oid, + "button", tostring(1.6+offset).."," .. h .. ";0.6,0.9", "effects_"..oid, "Ef", "There are further (Ef)fects (apart from switching\n".. "to a new dialog) set for this option. Display them.", @@ -715,7 +736,7 @@ yl_speak_up.get_fs_talkdialog = function(player, n_id, d_id, alternate_text, rec -- are there any actions defined? local actions = active_dialog.d_options[sb_v.o_id].actions yl_speak_up.add_formspec_element_with_tooltip_if(formspec, - "button", "1.1," .. h .. ";0.5,0.9", "actions_"..oid, + "button", tostring(1.1+offset).."," .. h .. ";0.5,0.9", "actions_"..oid, "A", "There is an (A)ction (i.e. a trade) that will happen\n".. "when switching to a new dialog. Display actions and\n".. @@ -724,13 +745,15 @@ yl_speak_up.get_fs_talkdialog = function(player, n_id, d_id, alternate_text, rec -- show the actual text for the option yl_speak_up.add_formspec_element_with_tooltip_if(formspec, - "field", "9.9," .. h .. ";44.4,0.9", "text_option_" .. oid, + "field", tostring(9.9+offset).."," .. h .. ";".. + tostring(field_length)..",0.9", + "text_option_" .. oid, ";"..minetest.formspec_escape(sb_v.o_text_when_prerequisites_met), "Edit the text that is displayed on button "..oid..".", true) -- normal mode: show an option if the prerequirements (if any are defined) are met - else + elseif(not(edit_mode)) then local t = "- no text given -" local t_alt = nil -- the preconditions are fulfilled; showe the option