From dd1dee0fdce451a9a5cc8c0b9aca58e5d92cb2bd Mon Sep 17 00:00:00 2001 From: Sokomine Date: Tue, 4 May 2021 14:40:21 +0200 Subject: [PATCH] let yl_speak_up.edit_mode_apply_changes handle all changes done by either dialog or option edit menu --- functions.lua | 44 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 37 insertions(+), 7 deletions(-) diff --git a/functions.lua b/functions.lua index 7773edd..d3c0868 100644 --- a/functions.lua +++ b/functions.lua @@ -992,7 +992,7 @@ local function get_fs_edit_option_dialog(player, n_id, d_id, o_id) -- answer of the player (the actual option) "label[0.2,6.8;..the player may answer with this text:]".. "label[1.2,7.6;A:]".. - "field[1.7,7.1;19.1,0.9;option_text_met;;".. + "field[1.7,7.1;19.1,0.9;text_option_"..minetest.formspec_escape(o_id)..";;".. minetest.formspec_escape(d_option.o_text_when_prerequisites_met).."]".. "tooltip[option_text_met;This is the answer the player may choose if the ".. "preconditions are all fulfilled.]".. @@ -1022,7 +1022,8 @@ local function get_fs_edit_option_dialog(player, n_id, d_id, o_id) "tooltip[1.2,14.2;19.6,2.5;This is what the NPC will say next when the player has ".. "selected this answer here.]".. -- allow to change the target dialog via a dropdown menu - "dropdown[14.8,13.2;5,0.9;target_dialog;"..dialog_list..";"..dialog_selected..",]".. + "dropdown[14.8,13.2;5,0.9;d_id_"..minetest.formspec_escape(o_id)..";".. + dialog_list..";"..dialog_selected..",]".. "tooltip[14.8,13.2;5,0.9;Select the target dialog with which the NPC shall react ".. "to this answer. Currently, dialog "..minetest.formspec_escape(target_dialog).. " is beeing displayed.;#FFFFFF;#000000]".. @@ -1030,7 +1031,7 @@ local function get_fs_edit_option_dialog(player, n_id, d_id, o_id) "button[0.2,17;2.0,0.9;edit_option_delete;Delete]".. "tooltip[edit_option_delete;Delete this option/answer.]".. -- button: add new - "button[2.4,17;2.0,0.9;edit_option_add;Add]".. + "button[2.4,17;2.0,0.9;add_option;Add]".. "tooltip[edit_option_add;Add a new option/answer to this dialog.]".. -- button: prev/next button_prev.. @@ -1980,12 +1981,16 @@ yl_speak_up.save_changes_and_switch_to_other_dialog = function(player, fields, t end --- helper function for formspec "yl_speak_up:talk" when a parameter was changed in edit mode; +-- helper function for formspec "yl_speak_up:talk" *and* formspec "yl_speak_up:edit_option_dialog" +-- when a parameter was changed in edit mode; -- this is called when the player is in edit_mode (editing the NPC); -- the function checks if the player has changed any parameters -- Parameters: -- pname player name -- fields the fields returned from the formspec +-- Returns: +-- result table with information about what was added +-- (for now, only result.show_next_option is of intrest in the option edit menu) yl_speak_up.edit_mode_apply_changes = function(pname, fields) local n_id = yl_speak_up.edit_mode[pname] local d_id = yl_speak_up.speak_to[pname].d_id @@ -2002,7 +2007,11 @@ yl_speak_up.edit_mode_apply_changes = function(pname, fields) return end + -- new options etc. may be added; store these IDs so that we can switch to the right target + local result = {} + -- detect changes to d_text: text of the dialog (what the npc is saying) + -- (only happens in dialog edit menu) if(fields.d_text and dialog.n_dialogs[ d_id ].d_text ~= fields.d_text) then -- store that there have been changes to this npc table.insert(yl_speak_up.npc_was_changed[ n_id ], @@ -2034,6 +2043,8 @@ yl_speak_up.edit_mode_apply_changes = function(pname, fields) dialog.n_dialogs[d_id].d_options[future_o_id].o_sort = s table.insert(yl_speak_up.npc_was_changed[ n_id ], "Dialog "..d_id..": Added new option/answer "..future_o_id..".") + -- if this is selected in the options edit menu, we want to move straight on to the new option + result["show_next_option"] = future_o_id end -- changes to options are not possible if there are none @@ -2072,9 +2083,11 @@ yl_speak_up.edit_mode_apply_changes = function(pname, fields) " to "..tostring(fields[ "d_id_"..k])..".") -- actually change the target dialog vr.r_value = fields[ "d_id_"..k ] + -- in options edit menu: show this update + result["show_next_option"] = k end end - -- this might be the first option + -- this might be the first result elseif( fields["d_id_"..k ]) then -- this may also point to a new dialog if(fields[ "d_id_"..k ] == yl_speak_up.text_new_dialog_id) then @@ -2083,7 +2096,9 @@ yl_speak_up.edit_mode_apply_changes = function(pname, fields) end -- store that a new option has been added to this dialog table.insert(yl_speak_up.npc_was_changed[ n_id ], - "Dialog "..d_id..": The target dialog for option "..tostring(k).." was changed from -default- to "..tostring(fields[ "d_id_"..k])..".") + "Dialog "..d_id..": The target dialog for option ".. + tostring(k).." was changed from -default- to ".. + tostring(fields[ "d_id_"..k])..".") -- create a new result (first the id, then the actual result) local future_r_id = "r_" .. find_next_id(dialog.n_dialogs[d_id].d_options[k].o_results) @@ -2095,6 +2110,8 @@ yl_speak_up.edit_mode_apply_changes = function(pname, fields) r_id = future_r_id, r_type = "dialog", r_value = fields[ "d_id_"..k ]} + -- in options edit menu: show this update + result["show_next_option"] = k end end end @@ -2110,6 +2127,9 @@ yl_speak_up.edit_mode_apply_changes = function(pname, fields) fields["d_id"] = d_id fields["show_new_dialog"] = nil end + + -- currently only contains result["show_new_option"] (which is needed for options edit menu) + return result end -- end of yl_speak_up.edit_mode_apply_changes @@ -2157,6 +2177,7 @@ minetest.register_on_player_receive_fields( yl_speak_up.npc_was_changed[ n_id ] = {} end +--[[ -- change text when preconditions are met if(fields.option_text_met and d_option and d_option.o_text_when_prerequisites_met ~= fields.option_text_met) then @@ -2168,6 +2189,7 @@ minetest.register_on_player_receive_fields( -- actually change the text of the option d_option.o_text_when_prerequisites_met = fields.option_text_met end +--]] -- change alternate text when preconditions are not met if(fields.option_text_not_met and d_option @@ -2209,7 +2231,15 @@ minetest.register_on_player_receive_fields( end -- TODO: change of o_sort, change of target_dialog, button delete, buton add, (button save?) - --yl_speak_up.edit_mode_apply_changes(pname, fields) + + -- 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 + if(result and result["show_next_option"]) then + print("SHOWING "..tostring(result["show_next_option"])) -- TODO + minetest.show_formspec(pname, "yl_speak_up:edit_option_dialog", get_fs_edit_option_dialog(player, n_id, d_id, result["show_next_option"])) + return + end -- back to the main dialog window? if(fields.show_current_dialog or fields.quit or fields.button_exit or not(d_option)) then