From a9259ed3ba5cee3c4ac1644a99f0edb6d8a4a56e Mon Sep 17 00:00:00 2001 From: Sokomine Date: Thu, 29 Apr 2021 15:17:31 +0200 Subject: [PATCH] made dialog selection dropdown menu and prev/next dialog buttons work --- functions.lua | 48 +++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 39 insertions(+), 9 deletions(-) diff --git a/functions.lua b/functions.lua index 4487781..30b399c 100644 --- a/functions.lua +++ b/functions.lua @@ -1001,6 +1001,7 @@ local function get_fs_talkdialog(player, n_id, d_id) -- TODO: make name and description likewise editable? if(edit_mode) then + -- TODO: sort by name? -- build the list of available dialogs for the dropdown list(s) -- if there are dialogs defined if(dialog and dialog.n_dialogs) then @@ -1022,15 +1023,18 @@ local function get_fs_talkdialog(player, n_id, d_id) -- this is just an alternate way of walking through the dialogs for k,v in pairs(d_id_to_dropdown_index) do if( v == i-1) then - table.insert(formspec, "button[8.5,4.0;2,0.9;dialog_"..k..";<]") + table.insert(formspec, "button[8.5,4.0;2,0.9;prev_dialog_"..k..";<]") -- add a tooltip - table.insert(formspec, "tooltip[dialog_" .. k .. ";Go to previous dialog "..k..".]") + table.insert(formspec, "tooltip[prev_dialog_" .. k .. ";Go to previous dialog "..k..".]") elseif(v == i+1) then - table.insert(formspec, "button[11,4.0;2,0.9;dialog_"..k..";>]") + table.insert(formspec, "button[11,4.0;2,0.9;next_dialog_"..k..";>]") -- add a tooltip - table.insert(formspec, "tooltip[dialog_" .. k .. ";Go to next dialog "..k..".]") + table.insert(formspec, "tooltip[next_dialog_" .. k .. ";Go to next dialog "..k..".]") end end + -- add a "+" button for creating a new dialog + table.insert(formspec, "button[13.9,4.0;1,0.9;show_new_dialog;+]") + table.insert(formspec, "tooltip[show_new_dialog;Create a new dialog.]") table.insert(formspec, "textarea[0.2,5;19.6,17.8;d_text;;") @@ -1685,7 +1689,7 @@ minetest.register_on_player_receive_fields( -- TODO: this continues where the last chat was and does not start from the beginning minetest.show_formspec(pname, "yl_speak_up:talk", get_fs_talkdialog(player, yl_speak_up.speak_to[pname].n_id)) return - end + end if fields.quit or fields.button_exit then -- Formspec was quit @@ -1730,13 +1734,13 @@ minetest.register_on_player_receive_fields( end end - if o == "" then - return - end - -- Is the player working on this particular npc? local edit_mode = (yl_speak_up.edit_mode[pname] == yl_speak_up.speak_to[pname].n_id) + if not(edit_mode) and o == "" then + return + end + -- Let's check if the button was among the "allowed buttons". Only those may be executed if not(edit_mode) and (yl_speak_up.speak_to[pname].allowed and yl_speak_up.speak_to[pname].allowed[o] == false) then return @@ -1748,6 +1752,32 @@ minetest.register_on_player_receive_fields( local dialog = yl_speak_up.speak_to[pname].dialog + -- in edit mode: another dialog was selected + if ( o == "" and edit_mode) then + -- if nothing better can be found: keep the old dialog + local show_dialog = d_id + -- "New dialog" button or option from dropdown menu was selected + if(fields.show_new_dialog or fields.d_id and fields.d_id == yl_speak_up.text_new_option_id) then + -- TODO + -- dropdown menu was used; provided the dialog exists (and it's not the "New dialog" option) + elseif(fields.d_id and fields.d_id ~= show_dialog and dialog.n_dialogs[fields.d_id]) then + show_dialog = fields.d_id + -- in edit mode: prev_dialog_../next_dialog_.. was selected + else + for k,v in pairs(dialog.n_dialogs) do + if(fields["prev_dialog_"..k]) then + show_dialog = k + elseif(fields["next_dialog_"..k]) then + show_dialog = k + end + end + end + yl_speak_up.speak_to[pname].d_id = show_dialog + minetest.show_formspec(pname, "yl_speak_up:talk", get_fs_talkdialog(player, yl_speak_up.speak_to[pname].n_id, show_dialog)) + return + end + + local n_dialog = dialog.n_dialogs[d_id] local d_option = n_dialog.d_options[o]