allow to toggle between successful and unsuccessful action in edit options menu

This commit is contained in:
Sokomine 2021-06-29 23:21:48 +02:00
parent 61bd16f3f2
commit a43cef9290
2 changed files with 81 additions and 29 deletions

View File

@ -19,6 +19,18 @@ yl_speak_up.input_edit_option_dialog = function(player, formname, fields)
local n_dialog = dialog.n_dialogs[d_id]
local d_option = n_dialog.d_options[o_id]
if(fields.button_show_if_action_failed) then
yl_speak_up.show_fs(player, "edit_option_dialog",
{n_id = n_id, d_id = d_id, o_id = o_id,
caller="show_if_action_failed"})
return
elseif(fields.button_show_if_action_succeeded) then
yl_speak_up.show_fs(player, "edit_option_dialog",
{n_id = n_id, d_id = d_id, o_id = o_id,
caller="show_if_action_succeeded"})
return
end
-- this meny is specific to an option for a dialog; if no dialog is selected, we really
-- can't know what to do
if(not(o_id) and d_id) then
@ -105,7 +117,7 @@ end
-- edit options (not via staff but via the "I am your owner" dialog)
yl_speak_up.get_fs_edit_option_dialog = function(player, n_id, d_id, o_id)
yl_speak_up.get_fs_edit_option_dialog = function(player, n_id, d_id, o_id, caller)
-- n_id, d_id and o_id have already been checked when this function is called
local pname = player:get_player_name()
local dialog = yl_speak_up.speak_to[pname].dialog
@ -151,6 +163,7 @@ yl_speak_up.get_fs_edit_option_dialog = function(player, n_id, d_id, o_id)
local list_of_actions = ""
local actions = d_option.actions
local count_actions = 0
local action_data = nil
if(actions) then
local sorted_key_list = yl_speak_up.sort_keys(actions)
for i, k in ipairs(sorted_key_list) do
@ -161,6 +174,7 @@ yl_speak_up.get_fs_edit_option_dialog = function(player, n_id, d_id, o_id)
minetest.formspec_escape(
yl_speak_up.show_action(v))..","
count_actions = count_actions + 1
action_data = v
end
end
if(count_actions < yl_speak_up.max_actions) then
@ -278,6 +292,65 @@ yl_speak_up.get_fs_edit_option_dialog = function(player, n_id, d_id, o_id)
button_add = ""
end
local action_text = "label[0.2,12.1;"..
"If the player completed the above action successfully, "..
"apply the following (Ef)fects:]"..
"button[17.0,11.7;4.0,0.7;button_show_if_action_failed;Show if it failed]"..
"tooltip[button_show_if_action_failed;Click here to see what will happen "..
"if the player\nfailed to execute the action successfully.]"
if(count_actions == 0) then
action_text = "label[0.2,12.1;"..
"There is no (A)ction defined. Directly apply the following (Ef)fects:]"
end
if(caller == "show_if_action_failed") then
action_text = "label[0.2,12.1;"..
"If the player *failed* to complete the above action correctly,]"..
"button[17.0,11.7;4.0,0.7;button_show_if_action_succeeded;Show if successful]"..
"tooltip[button_show_if_action_succeeded;Click here to see what will happen "..
"if the player\nexecuted the action successfully.]"
if(action_data and action_data.a_on_failure
and dialog.n_dialogs and dialog.n_dialogs[ action_data.a_on_failure]) then
action_text = action_text..
-- ..and what the NPC will reply to that answer
"label[0.2,15.1;..the NPC will react to this failed action with the "..
"following dialog \""..tostring(action_data.a_on_failure).."\":]"..
"hypertext[1.2,15.5;19.6,2.5;d_text_next;<global background=#776666>"..
"<normal>"..minetest.formspec_escape(tostring(
dialog.n_dialogs[ action_data.a_on_failure ].d_text))..
"\n</normal>]"..
"tooltip[1.2,16.8;21.0,2.5;This is what the NPC will say next when "..
"the player has failed to complete the action.]"
else
action_text = action_text..
"label[0.2,15.1;..go back to the initial dialog.]"
end
else
action_text = action_text..
-- list of effects
"tablecolumns[text;color,span=1;text;text]"..
"table[1.2,12.4;19.6,2.0;table_of_effects;"..
list_of_effects..";0]"..
"tooltip[1.2,12.4;19.6,2.0;"..
"*All* (Ef)fects are executed after the action (if there is\n"..
"one defined in this option) has been completed successfully\n"..
"by the player. If there is no action defined, then the\n"..
"(Ef)fects will always be executed when this option here is\n"..
"selected.\n"..
"Please click on an (Ef)fect in order to edit or delete it!]"..
-- allow to change the target dialog via a dropdown menu
"dropdown[12.5,14.7;7.5,0.7;d_id_"..minetest.formspec_escape(o_id)..";"..
dialog_list..";"..dialog_selected..",]"..
"tooltip[12.5,14.7;7.5,0.7;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]"..
-- ..and what the NPC will reply to that answer
"label[0.2,15.1;The NPC will react to this answer with the following dialog:]"..
"hypertext[1.2,15.5;19.6,2.5;d_text_next;<global background=#777766><normal>"..
minetest.formspec_escape(next_text) .. "\n</normal>]"..
"tooltip[1.2,16.8;21.0,2.5;This is what the NPC will say next when the player has "..
"selected this answer here.]"
end
-- build up the formspec
local formspec = ""..
"formspec_version[3]"..
@ -293,8 +366,8 @@ yl_speak_up.get_fs_edit_option_dialog = function(player, n_id, d_id, o_id)
-- the text the NPC says
"label[0.2,0.6;NPC says "..
minetest.formspec_escape("[dialog \""..tostring(d_id).."\"]:").."]"..
"hypertext[1.2,1.2;19.6,2.5;d_text;<global background=#777766><normal><normal>"..
minetest.formspec_escape(n_dialog.d_text) .. "\n</normal></global>]"..
"hypertext[1.2,1.2;19.6,2.5;d_text;<global background=#777766><normal>"..
minetest.formspec_escape(n_dialog.d_text) .. "\n</normal>]"..
"tooltip[1.2,1.2;19.6,3.0;This is what the NPC says to the player.]"..
-- list the preconditions
"label[0.2,4.2;If all of the following pre(C)onditions are fulfilled:]"..
@ -332,31 +405,9 @@ yl_speak_up.get_fs_edit_option_dialog = function(player, n_id, d_id, o_id)
"tablecolumns[text;color,span=1;text;text]"..
"table[1.2,10.9;19.6,0.7;table_of_actions;"..
list_of_actions..";0]"..
-- list of effects
"label[0.2,12.1;If the player completed the above action successfully, "..
"apply the following (Ef)fects:]"..
"tablecolumns[text;color,span=1;text;text]"..
"table[1.2,12.4;19.6,2.0;table_of_effects;"..
list_of_effects..";0]"..
"tooltip[1.2,12.4;19.6,2.0;"..
"*All* (Ef)fects are executed after the action (if there is\n"..
"one defined in this option) has been completed successfully\n"..
"by the player. If there is no action defined, then the\n"..
"(Ef)fects will always be executed when this option here is\n"..
"selected.\n"..
"Please click on an (Ef)fect in order to edit or delete it!]"..
-- allow to change the target dialog via a dropdown menu
"dropdown[13.3,14.7;7.5,0.7;d_id_"..minetest.formspec_escape(o_id)..";"..
dialog_list..";"..dialog_selected..",]"..
"tooltip[13.3,14.7;7.5,0.7;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]"..
-- ..and what the NPC will reply to that answer
"label[0.2,15.1;The NPC will react to this answer with the following dialog:]"..
"hypertext[1.2,15.5;19.6,2.5;d_text_next;<global background=#777766><normal>"..
minetest.formspec_escape(next_text) .. "\n</normal></global>]"..
"tooltip[1.2,16.8;21.0,2.5;This is what the NPC will say next when the player has "..
"selected this answer here.]"..
-- list effects and target dialog for successful - and target dialog for unsuccessful
-- actions (including a toggle button)
action_text..
-- button: delete
"button[0.2,18.7;2.0,0.9;del_option;Delete]"..
"tooltip[del_option;Delete this option/answer.]"..

View File

@ -203,7 +203,8 @@ yl_speak_up.show_fs = function(player, fs_name, param)
end
yl_speak_up.speak_to[pname].o_id = param.o_id
minetest.show_formspec(pname, "yl_speak_up:edit_option_dialog",
yl_speak_up.get_fs_edit_option_dialog(player, param.n_id, param.d_id, param.o_id))
yl_speak_up.get_fs_edit_option_dialog(player, param.n_id, param.d_id, param.o_id,
param.caller))
elseif(fs_name == "talk") then
if(not(param)) then