From a7d9ab5eb237d0f2147972dccbdfa958a72282bb Mon Sep 17 00:00:00 2001 From: Sokomine Date: Wed, 5 May 2021 20:42:35 +0200 Subject: [PATCH] support changes to o_sort --- functions.lua | 40 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/functions.lua b/functions.lua index 1e54629..7cfba62 100644 --- a/functions.lua +++ b/functions.lua @@ -2123,6 +2123,44 @@ yl_speak_up.edit_mode_apply_changes = function(pname, fields) return result end + -- ignore entries to o_sort if they are not a number + if(fields[ "edit_option_o_sort"] + and tonumber(fields[ "edit_option_o_sort"]) + and fields.o_id and dialog.n_dialogs[d_id].d_options[fields.o_id]) then + local o_id = fields.o_id + local new_nr = tonumber(fields[ "edit_option_o_sort"]) + local old_nr = tonumber(dialog.n_dialogs[d_id].d_options[o_id].o_sort) + -- if the nr is -1 (do not show) then we are done already: nothing to do + if(old_nr == new_nr) then + -- -1: do not list as option/answer (but still store and keep it) + elseif(new_nr == -1 and old_nr ~= -1) then + dialog.n_dialogs[d_id].d_options[o_id].o_sort = "-1" + table.insert(yl_speak_up.npc_was_changed[ n_id ], + "Dialog "..d_id..": Option "..tostring(o_id).." was set to -1 (do not list).") + else + -- get the old sorted list + local sorted_list = yl_speak_up.get_sorted_options(dialog.n_dialogs[d_id].d_options) + -- negative numbers are not shown + local entries_shown_list = {} + for i, o in ipairs(sorted_list) do + local n = tonumber(dialog.n_dialogs[d_id].d_options[o].o_sort) + if(n and n > 0 and o ~= o_id) then + table.insert(entries_shown_list, o) + end + end + -- insert the entry at the new position and let lua do the job + table.insert(entries_shown_list, new_nr, o_id) + -- take the indices from that new list as new sort values and store them; + -- this has the side effect that duplicate entries get sorted out as well + for i, o in ipairs(entries_shown_list) do + dialog.n_dialogs[d_id].d_options[o].o_sort = tostring(i) + end + -- store that there was a cahnge + table.insert(yl_speak_up.npc_was_changed[ n_id ], + "Dialog "..d_id..": Option "..tostring(o_id).." was moved to position ".. + tostring(new_nr)..".") + end + end -- changes to options are not possible if there are none if(dialog.n_dialogs[ d_id ].d_options) then @@ -2302,8 +2340,6 @@ minetest.register_on_player_receive_fields( return end - -- TODO: allow change of o_sort, make button delete work, (add button save?) - -- handles changes to o_text_when_prerequisites_met, target dialog, adding of a new dialog local result = yl_speak_up.edit_mode_apply_changes(pname, fields) -- if a new option was added or the target dialog of this one changed, display the right new option