removed yl_speak_up.save_changes_and_switch_to_other_dialog; handled now by show_fs.lua and the new fs_save_or_discard_or_back.lua
This commit is contained in:
parent
1b28dd6a07
commit
661caaff4e
123
fs_save_or_discard_or_back.lua
Normal file
123
fs_save_or_discard_or_back.lua
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
|
||||||
|
-- when the player is editing the NPC and has changed it without having
|
||||||
|
-- saved the changes yet: ask what shall be done (save? discard? back?)
|
||||||
|
yl_speak_up.input_save_or_discard_changes = function(player, formname, fields)
|
||||||
|
local pname = player:get_player_name()
|
||||||
|
-- if the player is not even talking to this particular npc
|
||||||
|
if(not(yl_speak_up.speak_to[pname])) then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local target_dialog = yl_speak_up.speak_to[pname].target_dialog
|
||||||
|
if(not(target_dialog)) then
|
||||||
|
target_dialog = ""
|
||||||
|
end
|
||||||
|
|
||||||
|
local edit_mode = (yl_speak_up.edit_mode[pname] == yl_speak_up.speak_to[pname].n_id)
|
||||||
|
local d_id = yl_speak_up.speak_to[pname].d_id
|
||||||
|
local n_id = yl_speak_up.speak_to[pname].n_id
|
||||||
|
local o_id = yl_speak_up.speak_to[pname].o_id
|
||||||
|
|
||||||
|
-- the player decided to go back and continue editing the current dialog
|
||||||
|
if(edit_mode and fields.back_to_dialog_changes) then
|
||||||
|
-- do NOT clear the list of changes; just show the old dialog again
|
||||||
|
yl_speak_up.show_fs(player, "show_last_fs", {})
|
||||||
|
return
|
||||||
|
|
||||||
|
-- save changes and continue on to the next dialog
|
||||||
|
elseif(edit_mode and fields.save_dialog_changes) then
|
||||||
|
-- actually save the dialog (the one the NPC currently has)
|
||||||
|
yl_speak_up.save_dialog(n_id, yl_speak_up.speak_to[pname].dialog)
|
||||||
|
-- log all the changes
|
||||||
|
for i, c in ipairs(yl_speak_up.npc_was_changed[ n_id ]) do
|
||||||
|
yl_speak_up.log_change(pname, n_id, c)
|
||||||
|
end
|
||||||
|
-- clear list of changes
|
||||||
|
yl_speak_up.npc_was_changed[ n_id ] = {}
|
||||||
|
|
||||||
|
-- discard changes and continue on to the next dialog
|
||||||
|
elseif(edit_mode and fields.discard_dialog_changes) then
|
||||||
|
-- the current dialog and the one we want to show next may both be new dialogs;
|
||||||
|
-- if we just reload the old state, they would both get lost
|
||||||
|
local target_dialog_data = yl_speak_up.speak_to[pname].dialog.n_dialogs[ target_dialog ]
|
||||||
|
-- actually restore the old state and discard the changes by loading the dialog anew
|
||||||
|
yl_speak_up.speak_to[pname].dialog = yl_speak_up.load_dialog(n_id)
|
||||||
|
-- clear list of changes
|
||||||
|
yl_speak_up.npc_was_changed[ n_id ] = {}
|
||||||
|
local dialog = yl_speak_up.speak_to[pname].dialog
|
||||||
|
-- do we have to save again after restoring current and target dialog?
|
||||||
|
local need_to_save = false
|
||||||
|
-- if the current dialog was a new one, it will be gone now - restore it
|
||||||
|
if(d_id and d_id ~= "" and not(dialog.n_dialogs[ d_id ])) then
|
||||||
|
-- we can't just restore the current dialog - after all the player wanted
|
||||||
|
-- to discard the changes; but we can recreate the current dialog so that it
|
||||||
|
-- is in the "new dialog" state again
|
||||||
|
local next_id = tonumber(string.sub( d_id, 3))
|
||||||
|
yl_speak_up.add_new_dialog(dialog, pname, next_id)
|
||||||
|
yl_speak_up.log_change(pname, n_id, "Saved new dialog "..tostring( d_id )..".")
|
||||||
|
need_to_save = true
|
||||||
|
end
|
||||||
|
if(target_dialog and target_dialog ~= "" and not(dialog.n_dialogs[ target_dialog ])) then
|
||||||
|
-- restore the new target dialog
|
||||||
|
dialog.n_dialogs[ target_dialog ] = target_dialog_data
|
||||||
|
yl_speak_up.log_change(pname, n_id, "Saved new dialog "..tostring( target_dialog )..".")
|
||||||
|
need_to_save = true
|
||||||
|
end
|
||||||
|
if(need_to_save) then
|
||||||
|
yl_speak_up.save_dialog(n_id, dialog)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- are there any changes which might be saved or discarded?
|
||||||
|
if(edit_mode
|
||||||
|
and yl_speak_up.npc_was_changed[ n_id ]
|
||||||
|
and #yl_speak_up.npc_was_changed[ n_id ] > 0) then
|
||||||
|
|
||||||
|
yl_speak_up.show_fs(player, "save_or_discard_changes", {})
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
yl_speak_up.show_fs(player, "proceed_after_save", {})
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
yl_speak_up.get_fs_save_or_discard_changes = function(player, param)
|
||||||
|
local pname = player:get_player_name()
|
||||||
|
local n_id = yl_speak_up.speak_to[pname].n_id
|
||||||
|
-- TODO
|
||||||
|
local target_name = "quit"
|
||||||
|
if(target_dialog and target_dialog ~= "") then
|
||||||
|
target_name = "go on to dialog "..minetest.formspec_escape(target_dialog)
|
||||||
|
if(target_dialog == "edit_option_dialog") then
|
||||||
|
target_name = "edit option \""..
|
||||||
|
minetest.formspec_escape(tostring(o_id)).."\" of dialog \""..
|
||||||
|
minetest.formspec_escape(tostring(d_id)).."\""
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
yl_speak_up.speak_to[pname].target_dialog = target_dialog
|
||||||
|
local d_id = yl_speak_up.speak_to[pname].d_id
|
||||||
|
-- reverse the order of the changes in the log so that newest are topmost
|
||||||
|
local text = ""
|
||||||
|
for i,t in ipairs(yl_speak_up.npc_was_changed[ n_id ]) do
|
||||||
|
text = minetest.formspec_escape(t).."\n"..text
|
||||||
|
end
|
||||||
|
-- build a formspec showing the changes to this dialog and ask for save
|
||||||
|
return "formspec_version[3]"..
|
||||||
|
"size[14,6.2]"..
|
||||||
|
"bgcolor[#00000000;false]"..
|
||||||
|
-- TODO: make this more flexible
|
||||||
|
"label[0.2,0.2;You are about to leave dialog "..minetest.formspec_escape(d_id)..
|
||||||
|
" and "..target_name..".]"..
|
||||||
|
"label[0.2,0.65;These changes have been applied to dialog "..
|
||||||
|
minetest.formspec_escape(d_id)..":]"..
|
||||||
|
"hypertext[0.2,1;13.5,4;list_of_changes;<normal>"..
|
||||||
|
minetest.formspec_escape(text) .. "\n</normal>".."]"..
|
||||||
|
"button[1.2,5.2;3,0.9;discard_dialog_changes;Discard changes]"..
|
||||||
|
"button[5.7,5.2;3,0.9;back_to_dialog_changes;Back]"..
|
||||||
|
"button[10.2,5.2;3,0.9;save_dialog_changes;Save changes]"..
|
||||||
|
"tooltip[save_dialog_changes;Save all changes to this dialog and "..target_name..".]"..
|
||||||
|
"tooltip[discard_dialog_changes;Undo all changes and "..target_name..".]"..
|
||||||
|
"tooltip[back_to_dialog_changes;Go back to dialog "..
|
||||||
|
minetest.formspec_escape(d_id).." and continue editing it.]"
|
||||||
|
end
|
179
functions.lua
179
functions.lua
@ -1722,154 +1722,6 @@ yl_speak_up.get_result_id_by_type = function(dialog, d_id, o_id, result_type)
|
|||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
-- this is always called when switching to a new dialog; but only in edit_mode does
|
|
||||||
-- it show a formspec asking for change/back/discard
|
|
||||||
yl_speak_up.save_changes_and_switch_to_other_dialog = function(player, fields, target_dialog)
|
|
||||||
local pname = player:get_player_name()
|
|
||||||
-- if the player is not even talking to this particular npc
|
|
||||||
if(not(yl_speak_up.speak_to[pname])) then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
if(not(target_dialog)) then
|
|
||||||
target_dialog = yl_speak_up.speak_to[pname].target_dialog
|
|
||||||
if(not(target_dialog)) then
|
|
||||||
target_dialog = ""
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local edit_mode = (yl_speak_up.edit_mode[pname] == yl_speak_up.speak_to[pname].n_id)
|
|
||||||
local d_id = yl_speak_up.speak_to[pname].d_id
|
|
||||||
local n_id = yl_speak_up.speak_to[pname].n_id
|
|
||||||
local o_id = yl_speak_up.speak_to[pname].o_id
|
|
||||||
|
|
||||||
-- the player decided to go back and continue editing the current dialog
|
|
||||||
if(edit_mode and fields.back_to_dialog_changes) then
|
|
||||||
-- do NOT clear the list of changes; just show the old dialog again
|
|
||||||
yl_speak_up.show_fs(player, "talk", {n_id = n_id, d_id = d_id})
|
|
||||||
return
|
|
||||||
|
|
||||||
-- save changes and continue on to the next dialog
|
|
||||||
elseif(edit_mode and fields.save_dialog_changes) then
|
|
||||||
-- actually save the dialog (the one the NPC currently has)
|
|
||||||
yl_speak_up.save_dialog(n_id, yl_speak_up.speak_to[pname].dialog)
|
|
||||||
-- log all the changes
|
|
||||||
for i, c in ipairs(yl_speak_up.npc_was_changed[ n_id ]) do
|
|
||||||
yl_speak_up.log_change(pname, n_id, c)
|
|
||||||
end
|
|
||||||
-- clear list of changes
|
|
||||||
yl_speak_up.npc_was_changed[ n_id ] = {}
|
|
||||||
|
|
||||||
-- discard changes and continue on to the next dialog
|
|
||||||
elseif(edit_mode and fields.discard_dialog_changes) then
|
|
||||||
-- the current dialog and the one we want to show next may both be new dialogs;
|
|
||||||
-- if we just reload the old state, they would both get lost
|
|
||||||
local target_dialog_data = yl_speak_up.speak_to[pname].dialog.n_dialogs[ target_dialog ]
|
|
||||||
-- actually restore the old state and discard the changes by loading the dialog anew
|
|
||||||
yl_speak_up.speak_to[pname].dialog = yl_speak_up.load_dialog(n_id)
|
|
||||||
-- clear list of changes
|
|
||||||
yl_speak_up.npc_was_changed[ n_id ] = {}
|
|
||||||
local dialog = yl_speak_up.speak_to[pname].dialog
|
|
||||||
-- do we have to save again after restoring current and target dialog?
|
|
||||||
local need_to_save = false
|
|
||||||
-- if the current dialog was a new one, it will be gone now - restore it
|
|
||||||
if(not(dialog.n_dialogs[ d_id ])) then
|
|
||||||
-- we can't just restore the current dialog - after all the player wanted
|
|
||||||
-- to discard the changes; but we can recreate the current dialog so that it
|
|
||||||
-- is in the "new dialog" state again
|
|
||||||
local next_id = tonumber(string.sub( d_id, 3))
|
|
||||||
yl_speak_up.add_new_dialog(dialog, pname, next_id)
|
|
||||||
yl_speak_up.log_change(pname, n_id, "Saved new dialog "..tostring( d_id )..".")
|
|
||||||
need_to_save = true
|
|
||||||
end
|
|
||||||
if(not(dialog.n_dialogs[ target_dialog ])) then
|
|
||||||
-- restore the new target dialog
|
|
||||||
dialog.n_dialogs[ target_dialog ] = target_dialog_data
|
|
||||||
yl_speak_up.log_change(pname, n_id, "Saved new dialog "..tostring( target_dialog )..".")
|
|
||||||
need_to_save = true
|
|
||||||
end
|
|
||||||
if(need_to_save) then
|
|
||||||
yl_speak_up.save_dialog(n_id, dialog)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- are there any changes which might be saved or discarded?
|
|
||||||
if(edit_mode
|
|
||||||
and yl_speak_up.npc_was_changed[ n_id ]
|
|
||||||
and #yl_speak_up.npc_was_changed[ n_id ] > 0) then
|
|
||||||
|
|
||||||
local target_name = "quit"
|
|
||||||
if(target_dialog and target_dialog ~= "") then
|
|
||||||
target_name = "go on to dialog "..minetest.formspec_escape(target_dialog)
|
|
||||||
if(target_dialog == "edit_option_dialog") then
|
|
||||||
target_name = "edit option \""..
|
|
||||||
minetest.formspec_escape(tostring(o_id)).."\" of dialog \""..
|
|
||||||
minetest.formspec_escape(tostring(d_id)).."\""
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
yl_speak_up.speak_to[pname].target_dialog = target_dialog
|
|
||||||
local d_id = yl_speak_up.speak_to[pname].d_id
|
|
||||||
-- reverse the order of the changes in the log so that newest are topmost
|
|
||||||
local text = ""
|
|
||||||
for i,t in ipairs(yl_speak_up.npc_was_changed[ n_id ]) do
|
|
||||||
text = minetest.formspec_escape(t).."\n"..text
|
|
||||||
end
|
|
||||||
-- build a formspec showing the changes to this dialog and ask for save
|
|
||||||
local formspec =
|
|
||||||
"formspec_version[3]"..
|
|
||||||
"size[14,6.2]"..
|
|
||||||
"bgcolor[#00000000;false]"..
|
|
||||||
"label[0.2,0.2;You are about to leave dialog "..minetest.formspec_escape(d_id)..
|
|
||||||
" and "..target_name..".]"..
|
|
||||||
"label[0.2,0.65;These changes have been applied to dialog "..
|
|
||||||
minetest.formspec_escape(d_id)..":]"..
|
|
||||||
"hypertext[0.2,1;13.5,4;list_of_changes;<normal>"..
|
|
||||||
minetest.formspec_escape(text) .. "\n</normal>".."]"..
|
|
||||||
"button[1.2,5.2;3,0.9;discard_dialog_changes;Discard changes]"..
|
|
||||||
"button[5.7,5.2;3,0.9;back_to_dialog_changes;Back]"..
|
|
||||||
"button[10.2,5.2;3,0.9;save_dialog_changes;Save changes]"..
|
|
||||||
"tooltip[save_dialog_changes;Save all changes to this dialog and "..target_name..".]"..
|
|
||||||
"tooltip[discard_dialog_changes;Undo all changes and "..target_name..".]"..
|
|
||||||
"tooltip[back_to_dialog_changes;Go back to dialog "..
|
|
||||||
minetest.formspec_escape(d_id).." and continue editing it.]"
|
|
||||||
-- actaully show the formspec to the player
|
|
||||||
yl_speak_up.show_fs(player, "msg", {input_to = "yl_speak_up:confirm_save",
|
|
||||||
formspec = formspec})
|
|
||||||
return
|
|
||||||
end
|
|
||||||
-- if there is nothing that needs to be saved or discarded: allow quit/exit
|
|
||||||
if fields.quit or fields.button_exit then
|
|
||||||
yl_speak_up.edit_mode[pname] = nil
|
|
||||||
-- Formspec was quit
|
|
||||||
yl_speak_up.speak_to[pname] = nil
|
|
||||||
return
|
|
||||||
end
|
|
||||||
-- end edit mode and start a new chat - but this time in normal mode
|
|
||||||
if not(target_dialog) or target_dialog == "" then
|
|
||||||
yl_speak_up.edit_mode[pname] = nil
|
|
||||||
target_dialog = nil
|
|
||||||
end
|
|
||||||
|
|
||||||
-- the trade list is not really a dialog...
|
|
||||||
if(target_dialog == "trade_list") then
|
|
||||||
yl_speak_up.speak_to[pname].target_dialog = nil
|
|
||||||
yl_speak_up.show_fs(player, "trade_list")
|
|
||||||
return
|
|
||||||
-- edit an option
|
|
||||||
elseif(target_dialog == "edit_option_dialog" and o_id and d_id) then
|
|
||||||
yl_speak_up.speak_to[pname].target_dialog = nil
|
|
||||||
yl_speak_up.show_fs(player, "edit_option_dialog",
|
|
||||||
{n_id = n_id, d_id = d_id, o_id = o_id, caller= "confirm_save"})
|
|
||||||
return
|
|
||||||
end
|
|
||||||
yl_speak_up.speak_to[pname].target_dialog = nil
|
|
||||||
-- move on to the target dialog
|
|
||||||
yl_speak_up.speak_to[pname].d_id = target_dialog
|
|
||||||
yl_speak_up.show_fs(player, "talk", {n_id = n_id, d_id = target_dialog})
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
-- helper function for sorting options/answers using options[o_id].o_sort
|
-- helper function for sorting options/answers using options[o_id].o_sort
|
||||||
-- (or dialogs by d_sort)
|
-- (or dialogs by d_sort)
|
||||||
yl_speak_up.get_sorted_options = function(options, sort_by)
|
yl_speak_up.get_sorted_options = function(options, sort_by)
|
||||||
@ -2279,14 +2131,6 @@ end
|
|||||||
-- end of yl_speak_up.edit_mode_apply_changes
|
-- end of yl_speak_up.edit_mode_apply_changes
|
||||||
|
|
||||||
|
|
||||||
yl_speak_up.input_confirm_save = function(player, formname, fields)
|
|
||||||
if formname ~= "yl_speak_up:confirm_save" then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
yl_speak_up.save_changes_and_switch_to_other_dialog(player, fields, fields.goto_target_dialog)
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
-- identify multiple results that lead to target dialogs
|
-- identify multiple results that lead to target dialogs
|
||||||
yl_speak_up.check_for_disambigous_results = function(n_id, pname)
|
yl_speak_up.check_for_disambigous_results = function(n_id, pname)
|
||||||
@ -2398,13 +2242,13 @@ yl_speak_up.input_talk = function(player, formname, fields)
|
|||||||
-- end edit mode (does not require the priv; will only switch back to normal behaviour)
|
-- end edit mode (does not require the priv; will only switch back to normal behaviour)
|
||||||
elseif fields.button_end_edit_mode then
|
elseif fields.button_end_edit_mode then
|
||||||
-- if there are any changes done: ask first and don't end edit mode yet
|
-- if there are any changes done: ask first and don't end edit mode yet
|
||||||
yl_speak_up.save_changes_and_switch_to_other_dialog(player, fields, nil)
|
yl_speak_up.show_fs(player, "quit", nil)
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
if fields.quit or fields.button_exit then
|
if fields.quit or fields.button_exit then
|
||||||
-- if there are any changes done: ask first and don't quit yet
|
-- if there are any changes done: ask first and don't quit yet
|
||||||
yl_speak_up.save_changes_and_switch_to_other_dialog(player, fields, nil)
|
yl_speak_up.show_fs(player, "quit", nil)
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -2429,11 +2273,7 @@ yl_speak_up.input_talk = function(player, formname, fields)
|
|||||||
|
|
||||||
-- the player wants to see the trade list
|
-- the player wants to see the trade list
|
||||||
if(fields.show_trade_list) then
|
if(fields.show_trade_list) then
|
||||||
if(edit_mode) then
|
yl_speak_up.show_fs(player, "trade_list", nil)
|
||||||
yl_speak_up.save_changes_and_switch_to_other_dialog(player, fields, "trade_list")
|
|
||||||
return
|
|
||||||
end
|
|
||||||
yl_speak_up.show_fs(player, "trade_list")
|
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -2497,8 +2337,9 @@ yl_speak_up.input_talk = function(player, formname, fields)
|
|||||||
-- store which option we want to edit
|
-- store which option we want to edit
|
||||||
yl_speak_up.speak_to[pname].o_id = o_id
|
yl_speak_up.speak_to[pname].o_id = o_id
|
||||||
-- if something was changed: ask for confirmation
|
-- if something was changed: ask for confirmation
|
||||||
yl_speak_up.save_changes_and_switch_to_other_dialog(
|
yl_speak_up.show_fs(player, "edit_option_dialog",
|
||||||
player, fields, "edit_option_dialog")
|
{n_id = yl_speak_up.speak_to[pname].n_id,
|
||||||
|
d_id = d_id, o_id = o_id, caller="button"})
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -2534,13 +2375,7 @@ yl_speak_up.input_talk = function(player, formname, fields)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
-- if there are any changes done: ask first and don't switch to the new dialog yet
|
yl_speak_up.show_fs(player, "talk", {n_id = n_id, d_id = show_dialog})
|
||||||
if(show_dialog ~= d_id) then
|
|
||||||
yl_speak_up.save_changes_and_switch_to_other_dialog(player, fields, show_dialog)
|
|
||||||
-- show the same dialog again
|
|
||||||
else
|
|
||||||
yl_speak_up.show_fs(player, "talk", {n_id = n_id, d_id = d_id})
|
|
||||||
end
|
|
||||||
-- no option was selected - so we need to end this here
|
-- no option was selected - so we need to end this here
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
2
init.lua
2
init.lua
@ -19,6 +19,8 @@ dofile(modpath .. "config.lua")
|
|||||||
dofile(modpath .. "privs.lua")
|
dofile(modpath .. "privs.lua")
|
||||||
-- handle on_player_receive_fields and showing of formspecs
|
-- handle on_player_receive_fields and showing of formspecs
|
||||||
dofile(modpath .. "show_fs.lua")
|
dofile(modpath .. "show_fs.lua")
|
||||||
|
-- ask if the player wants to save, discard or go back in edit mode
|
||||||
|
dofile(modpath .. "fs_save_or_discard_or_back.lua")
|
||||||
-- common functions for editing preconditions and effects
|
-- common functions for editing preconditions and effects
|
||||||
dofile(modpath .. "fs_edit_general.lua")
|
dofile(modpath .. "fs_edit_general.lua")
|
||||||
-- edit preconditions (can be reached through edit options dialog)
|
-- edit preconditions (can be reached through edit options dialog)
|
||||||
|
89
show_fs.lua
89
show_fs.lua
@ -8,8 +8,9 @@ minetest.register_on_player_receive_fields( function(player, formname, fields)
|
|||||||
elseif formname == "yl_speak_up:setdialog" then
|
elseif formname == "yl_speak_up:setdialog" then
|
||||||
yl_speak_up.input_setdialog(player, formname, fields)
|
yl_speak_up.input_setdialog(player, formname, fields)
|
||||||
return true
|
return true
|
||||||
elseif formname == "yl_speak_up:confirm_save" then
|
-- handled in fs_save_or_discard_or_back.lua
|
||||||
yl_speak_up.input_confirm_save(player, formname, fields)
|
elseif formname == "yl_speak_up:save_or_discard_changes" then
|
||||||
|
yl_speak_up.input_save_or_discard_changes(player, formname, fields)
|
||||||
return true
|
return true
|
||||||
-- handled in fs_edit_options_dialog.lua
|
-- handled in fs_edit_options_dialog.lua
|
||||||
elseif formname == "yl_speak_up:edit_option_dialog" then
|
elseif formname == "yl_speak_up:edit_option_dialog" then
|
||||||
@ -82,6 +83,84 @@ yl_speak_up.show_fs = function(player, fs_name, param)
|
|||||||
end
|
end
|
||||||
local pname = player:get_player_name()
|
local pname = player:get_player_name()
|
||||||
|
|
||||||
|
local last_fs = yl_speak_up.speak_to[pname].last_fs
|
||||||
|
-- show the save or discard changes dialog
|
||||||
|
if(fs_name and fs_name == "save_or_discard_changes") then
|
||||||
|
minetest.show_formspec(pname, "yl_speak_up:save_or_discard_changes",
|
||||||
|
yl_speak_up.get_fs_save_or_discard_changes(player, param))
|
||||||
|
return
|
||||||
|
|
||||||
|
-- the player either saved or discarded; we may proceed now
|
||||||
|
elseif(fs_name and fs_name == "proceed_after_save") then
|
||||||
|
fs_name = yl_speak_up.speak_to[pname].next_fs
|
||||||
|
param = yl_speak_up.speak_to[pname].next_fs_param
|
||||||
|
yl_speak_up.speak_to[pname].next_fs = nil
|
||||||
|
yl_speak_up.speak_to[pname].next_fs_param = nil
|
||||||
|
yl_speak_up.speak_to[pname].last_fs = fs_name
|
||||||
|
yl_speak_up.speak_to[pname].last_fs_param = param
|
||||||
|
|
||||||
|
-- the player clicked on "back" in the above dialog
|
||||||
|
elseif(fs_name and fs_name == "show_last_fs") then
|
||||||
|
-- call the last formspec again - and with the same parameters
|
||||||
|
fs_name = yl_speak_up.speak_to[pname].last_fs
|
||||||
|
param = yl_speak_up.speak_to[pname].last_fs_param
|
||||||
|
|
||||||
|
-- do we need to check if there is something that needs saving?
|
||||||
|
elseif(fs_name
|
||||||
|
-- msg is just a loop for displaying (mostly error) messages
|
||||||
|
and fs_name ~= "msg"
|
||||||
|
-- is the player editing the NPC? that is: might there be any changes?
|
||||||
|
and (yl_speak_up.edit_mode[pname] == yl_speak_up.speak_to[pname].n_id)) then
|
||||||
|
local last_fs = yl_speak_up.speak_to[pname].last_fs
|
||||||
|
local d_id = yl_speak_up.speak_to[pname].d_id
|
||||||
|
local o_id = yl_speak_up.speak_to[pname].o_id
|
||||||
|
-- only these two formspecs need to ask specificly if the data ought to be saved
|
||||||
|
if(last_fs == "talk" or last_fs == "edit_option_dialog" or fs_name == "quit") then
|
||||||
|
local last_param = yl_speak_up.speak_to[pname].last_fs_param
|
||||||
|
local show_save_fs = false
|
||||||
|
if(not(param)) then
|
||||||
|
param = {}
|
||||||
|
end
|
||||||
|
-- set the target dialog
|
||||||
|
yl_speak_up.speak_to[pname].target_dialog = param.d_id
|
||||||
|
-- if we are switching from one dialog to another: is it the same?
|
||||||
|
if(last_fs == "talk" and fs_name == last_fs
|
||||||
|
and param and param.d_id and param.d_id ~= d_id) then
|
||||||
|
-- diffrent parameters: save (if needed)
|
||||||
|
show_save_fs = true
|
||||||
|
-- leaving a dialog: save!
|
||||||
|
elseif(last_fs == "talk" and fs_name ~= last_fs) then
|
||||||
|
show_save_fs = true
|
||||||
|
-- clicking on "save" in an edit option dialog: save!
|
||||||
|
elseif(last_fs == "edit_option_dialog" and fs_name == last_fs
|
||||||
|
and param and param.caller and param.caller == "save_option") then
|
||||||
|
show_save_fs = true
|
||||||
|
-- leaving editing an option: save!
|
||||||
|
elseif(last_fs == "edit_option_dialog" and fs_name ~= last_fs) then
|
||||||
|
show_save_fs = true
|
||||||
|
-- quitting: save!
|
||||||
|
elseif(fs_name == "quit") then
|
||||||
|
yl_speak_up.speak_to[pname].target_dialog = nil
|
||||||
|
show_save_fs = true
|
||||||
|
end
|
||||||
|
-- show the save or discard dialog
|
||||||
|
if(show_save_fs) then
|
||||||
|
yl_speak_up.speak_to[pname].next_fs = fs_name
|
||||||
|
yl_speak_up.speak_to[pname].next_fs_param = param
|
||||||
|
-- check first if it's necessary to ask for save or discard
|
||||||
|
yl_speak_up.input_save_or_discard_changes(player, "", {})
|
||||||
|
return
|
||||||
|
end
|
||||||
|
end
|
||||||
|
-- store the new formspec
|
||||||
|
yl_speak_up.speak_to[pname].last_fs = fs_name
|
||||||
|
-- and its parameter
|
||||||
|
yl_speak_up.speak_to[pname].last_fs_param = param
|
||||||
|
elseif(fs_name == "quit") then
|
||||||
|
-- player wanted to quit
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
-- this is here mostly to fascilitate debugging - so that really all calls to
|
-- this is here mostly to fascilitate debugging - so that really all calls to
|
||||||
-- minetest.show_formspec are routed through here
|
-- minetest.show_formspec are routed through here
|
||||||
if(fs_name == "msg") then
|
if(fs_name == "msg") then
|
||||||
@ -91,6 +170,9 @@ yl_speak_up.show_fs = function(player, fs_name, param)
|
|||||||
minetest.show_formspec(pname, param.input_to, param.formspec)
|
minetest.show_formspec(pname, param.input_to, param.formspec)
|
||||||
|
|
||||||
|
|
||||||
|
elseif(fs_name == "quit") then
|
||||||
|
return
|
||||||
|
|
||||||
-- staff-based editing
|
-- staff-based editing
|
||||||
elseif(fs_name == "optiondialog") then
|
elseif(fs_name == "optiondialog") then
|
||||||
if(not(param)) then
|
if(not(param)) then
|
||||||
@ -106,13 +188,12 @@ yl_speak_up.show_fs = function(player, fs_name, param)
|
|||||||
minetest.show_formspec(pname, "yl_speak_up:setdialog",
|
minetest.show_formspec(pname, "yl_speak_up:setdialog",
|
||||||
yl_speak_up.get_fs_setdialog(player, param.n_id, param.d_id))
|
yl_speak_up.get_fs_setdialog(player, param.n_id, param.d_id))
|
||||||
|
|
||||||
-- "confirm_save" does not have its own option here; doesn't have a get_fs_-function either
|
|
||||||
|
|
||||||
elseif(fs_name == "edit_option_dialog") then
|
elseif(fs_name == "edit_option_dialog") then
|
||||||
-- the optional "caller" parameter can be used for debugging
|
-- the optional "caller" parameter can be used for debugging
|
||||||
if(not(param)) then
|
if(not(param)) then
|
||||||
param = {}
|
param = {}
|
||||||
end
|
end
|
||||||
|
yl_speak_up.speak_to[pname].o_id = param.o_id
|
||||||
minetest.show_formspec(pname, "yl_speak_up:edit_option_dialog",
|
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))
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user