options can now be marked as Done when having been visited once

This commit is contained in:
Sokomine 2024-02-29 16:10:58 +01:00
parent 189165dd22
commit a8b92a754f
4 changed files with 52 additions and 4 deletions

View File

@ -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

View File

@ -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*)

View File

@ -451,11 +451,18 @@ yl_speak_up.get_fs_talkdialog_line = function(
end
-- 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!
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

View File

@ -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,