From a8b92a754faf3aedcb17c0c00b3203639bd9a64d Mon Sep 17 00:00:00 2001 From: Sokomine Date: Thu, 29 Feb 2024 16:10:58 +0100 Subject: [PATCH] options can now be marked as Done when having been visited once --- editor/edit_mode_apply_changes.lua | 23 ++++++++++++++++++++++- editor/fs/fs_edit_options_dialog.lua | 14 ++++++++++++++ editor/fs/fs_talkdialog_edit_mode.lua | 11 +++++++++-- fs/fs_talkdialog.lua | 8 +++++++- 4 files changed, 52 insertions(+), 4 deletions(-) diff --git a/editor/edit_mode_apply_changes.lua b/editor/edit_mode_apply_changes.lua index eb3ea42..e27f40f 100644 --- a/editor/edit_mode_apply_changes.lua +++ b/editor/edit_mode_apply_changes.lua @@ -386,6 +386,27 @@ yl_speak_up.edit_mode_apply_changes = function(pname, fields) d_option.o_text_when_prerequisites_not_met = fields.option_text_not_met end + -- toggle visit often/only *once* + if(d_option and fields.option_visits and fields.option_visits ~= "") then + local old_visit_mode = "often" + if(d_option.o_visit_only_once and d_option.o_visit_only_once == 1) then + old_visit_mode = "*once*" + end + if(fields.option_visits ~= old_visit_mode) then + if(fields.option_visits == "often") then + d_option.o_visit_only_once = 0 + table.insert(yl_speak_up.npc_was_changed[ n_id ], + "Dialog "..d_id..": Option "..tostring(o_id).. + " can now be visited often/unlimited (default).") + elseif(fields.option_visits == "*once*") then + d_option.o_visit_only_once = 1 + table.insert(yl_speak_up.npc_was_changed[ n_id ], + "Dialog "..d_id..": Option "..tostring(o_id).. + " can now be visited only *once* per talk.") + end + end + end + -- toggle autoselection/autoclick of an option if(d_option and fields.option_autoanswer and fields.option_autoanswer ~= "") then local old_answer_mode = "by clicking on it" @@ -394,7 +415,7 @@ yl_speak_up.edit_mode_apply_changes = function(pname, fields) elseif(d_option.o_autoanswer and d_option.o_autoanswer == 1) then old_answer_mode = "automaticly" end - if(fields.otpion_autoanswer ~= old_answer_mode) then + if(fields.option_autoanswer ~= old_answer_mode) then local new_answer_mode = "" if(fields.option_autoanswer == "by clicking on it") then d_option.o_autoanswer = nil diff --git a/editor/fs/fs_edit_options_dialog.lua b/editor/fs/fs_edit_options_dialog.lua index b36e186..5d253c6 100644 --- a/editor/fs/fs_edit_options_dialog.lua +++ b/editor/fs/fs_edit_options_dialog.lua @@ -271,11 +271,25 @@ yl_speak_up.get_fs_edit_option_dialog = function(player, n_id, d_id, o_id, calle answer_mode = 2 end + -- show an option only once + local visit_only_once = 0 + if(d_option.o_visit_only_once and d_option.o_visit_only_once == 1) then + visit_only_once = 1 + end + local answer_text = -- answer of the player (the actual option) "container[0.0,8.3]".. "label[0.2,0.0;..the player may answer with this text".. minetest.formspec_escape(" [dialog option \""..tostring(o_id).."\"]:").."]".. + "dropdown[13.3,-0.4;2.5,0.7;option_visits;".. + "often,*once*;"..tostring(visit_only_once + 1)..";]".. + "tooltip[option_visits;\"often\" allows to select this option whenever the\n".. + "\tpreconditions are fulfilled.\n".. + "\"*once*\" greys out the option after it has been selected\n".. + "\tone time successfully.\n".. + "Useful for visually marking options as read for the player.\n".. + "Talking to the NPC anew resets this option and it can be selected again.]".. "dropdown[16.0,-0.4;5.3,0.7;option_autoanswer;".. "by clicking on it,automaticly,randomly;"..tostring(answer_mode+1)..";]" -- (automaticly *by fulfilling the prerequirements*) diff --git a/editor/fs/fs_talkdialog_edit_mode.lua b/editor/fs/fs_talkdialog_edit_mode.lua index b6907b6..508c102 100644 --- a/editor/fs/fs_talkdialog_edit_mode.lua +++ b/editor/fs/fs_talkdialog_edit_mode.lua @@ -451,11 +451,18 @@ yl_speak_up.get_fs_talkdialog_line = function( end -- 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! + local arrow = "->" + local only_once = "" + if(sb_v.o_visit_only_once and sb_v.o_visit_only_once == 1) then + arrow = "*" + only_once = "\nNote: This option can be selected only *once* per talk!" + end yl_speak_up.add_formspec_element_with_tooltip_if(formspec, "button", tostring(9.6+offset)..","..h..";1,0.9", "button_" .. oid, - "->", + arrow, "Go to target dialog "..minetest.formspec_escape(target_dialog or "").. - " that will be shown when this option ("..oid..") is selected.", + " that will be shown when this option ("..oid..") is selected.".. + only_once, (target_dialog)) -- allow to set a new target dialog diff --git a/fs/fs_talkdialog.lua b/fs/fs_talkdialog.lua index 5ac3c3e..ffa3c06 100644 --- a/fs/fs_talkdialog.lua +++ b/fs/fs_talkdialog.lua @@ -224,7 +224,13 @@ yl_speak_up.get_fs_talkdialog_line = function( sb_v.o_text_when_prerequisites_not_met, dialog, pname)) end if(t or t_alt) then - -- if(t) then t = "Visits: "..tostring(sb_v.visits or 0).." "..tostring(t) end + -- some options can be visited only once; talking to the NPC anew resets that + -- (not stored persistently) + if(t and sb_v.visits and sb_v.visits > 0 + and sb_v.o_visit_only_once and sb_v.o_visit_only_once == 1) then + t_alt = minetest.formspec_escape("[Done] ")..t + t = nil + end -- actually show the button h = yl_speak_up.add_edit_button_fs_talkdialog(formspec, h, "button_" .. oid,