made edit dialog work in formspec versions < 3 as far as possible

This commit is contained in:
Sokomine 2022-01-09 02:04:10 +01:00
parent e950cdc1f0
commit 5b49bfbccd

View File

@ -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_<nr>:" 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_<nr>" 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