forked from your-land-mirror/yl_speak_up
fixed bug with discarding new dialog
This commit is contained in:
parent
0184fe6337
commit
26e3655c10
@ -1980,8 +1980,13 @@ minetest.register_on_player_receive_fields(
|
|||||||
-- talk
|
-- talk
|
||||||
|
|
||||||
-- helper function
|
-- helper function
|
||||||
yl_speak_up.add_new_dialog = function(dialog, pname)
|
-- the option to override next_id and provide a value is needed when a new dialog was
|
||||||
local next_id = find_next_id(dialog.n_dialogs)
|
-- added, then edited, and then discarded; it's still needed after that, but has to
|
||||||
|
-- be reset to empty state (wasn't stored before)
|
||||||
|
yl_speak_up.add_new_dialog = function(dialog, pname, next_id)
|
||||||
|
if(not(next_id)) then
|
||||||
|
next_id = find_next_id(dialog.n_dialogs)
|
||||||
|
end
|
||||||
local future_d_id = "d_" .. next_id
|
local future_d_id = "d_" .. next_id
|
||||||
-- Initialize empty dialog
|
-- Initialize empty dialog
|
||||||
dialog.n_dialogs[future_d_id] = {
|
dialog.n_dialogs[future_d_id] = {
|
||||||
@ -2031,15 +2036,32 @@ yl_speak_up.save_changes_and_switch_to_other_dialog = function(player, fields, t
|
|||||||
|
|
||||||
-- discard changes and continue on to the next dialog
|
-- discard changes and continue on to the next dialog
|
||||||
elseif(edit_mode and fields.discard_dialog_changes) then
|
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
|
-- actually restore the old state and discard the changes by loading the dialog anew
|
||||||
yl_speak_up.speak_to[pname].dialog = load_dialog(n_id)
|
yl_speak_up.speak_to[pname].dialog = load_dialog(n_id)
|
||||||
-- clear list of changes
|
-- clear list of changes
|
||||||
yl_speak_up.npc_was_changed[ n_id ] = {}
|
yl_speak_up.npc_was_changed[ n_id ] = {}
|
||||||
-- it is possible that the target dialog was newly added - and just discarded;
|
|
||||||
-- in such a case stick to the old dialog
|
|
||||||
local dialog = yl_speak_up.speak_to[pname].dialog
|
local dialog = yl_speak_up.speak_to[pname].dialog
|
||||||
if(not(dialog[target_dialog])) then
|
-- do we have to save again after restoring current and target dialog?
|
||||||
target_dialog = yl_speak_up.speak_to[pname].d_id
|
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)
|
||||||
|
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
|
||||||
|
need_to_save = true
|
||||||
|
end
|
||||||
|
if(need_to_save) then
|
||||||
|
save_dialog(n_id, dialog)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -2326,7 +2348,7 @@ yl_speak_up.edit_mode_apply_changes = function(pname, fields)
|
|||||||
-- this may also point to a new dialog
|
-- this may also point to a new dialog
|
||||||
if(fields[ "d_id_"..k ] == yl_speak_up.text_new_dialog_id) then
|
if(fields[ "d_id_"..k ] == yl_speak_up.text_new_dialog_id) then
|
||||||
-- create a new dialog and show it as new target dialog - but do not display this dialog directly (the player may follow the -> button)
|
-- create a new dialog and show it as new target dialog - but do not display this dialog directly (the player may follow the -> button)
|
||||||
fields[ "d_id_"..k ] = yl_speak_up.add_new_dialog(dialog, pname)
|
fields[ "d_id_"..k ] = yl_speak_up.add_new_dialog(dialog, pname, nil)
|
||||||
end
|
end
|
||||||
-- store that there have been changes to this npc
|
-- store that there have been changes to this npc
|
||||||
table.insert(yl_speak_up.npc_was_changed[ n_id ],
|
table.insert(yl_speak_up.npc_was_changed[ n_id ],
|
||||||
@ -2345,7 +2367,7 @@ yl_speak_up.edit_mode_apply_changes = function(pname, fields)
|
|||||||
-- this may also point to a new dialog
|
-- this may also point to a new dialog
|
||||||
if(fields[ "d_id_"..k ] == yl_speak_up.text_new_dialog_id) then
|
if(fields[ "d_id_"..k ] == yl_speak_up.text_new_dialog_id) then
|
||||||
-- create a new dialog and show it as new target dialog - but do not display this dialog directly (the player may follow the -> button)
|
-- create a new dialog and show it as new target dialog - but do not display this dialog directly (the player may follow the -> button)
|
||||||
fields[ "d_id_"..k ] = yl_speak_up.add_new_dialog(dialog, pname)
|
fields[ "d_id_"..k ] = yl_speak_up.add_new_dialog(dialog, pname, nil)
|
||||||
end
|
end
|
||||||
-- store that a new option has been added to this dialog
|
-- store that a new option has been added to this dialog
|
||||||
table.insert(yl_speak_up.npc_was_changed[ n_id ],
|
table.insert(yl_speak_up.npc_was_changed[ n_id ],
|
||||||
@ -2375,7 +2397,7 @@ yl_speak_up.edit_mode_apply_changes = function(pname, fields)
|
|||||||
if(fields.show_new_dialog
|
if(fields.show_new_dialog
|
||||||
or(fields["d_id"] and fields["d_id"] == yl_speak_up.text_new_dialog_id)) then
|
or(fields["d_id"] and fields["d_id"] == yl_speak_up.text_new_dialog_id)) then
|
||||||
-- create the new dialog and make sure it gets shown
|
-- create the new dialog and make sure it gets shown
|
||||||
local d_id = yl_speak_up.add_new_dialog(dialog, pname)
|
local d_id = yl_speak_up.add_new_dialog(dialog, pname, nil)
|
||||||
-- actually show the new dialog
|
-- actually show the new dialog
|
||||||
fields["d_id"] = d_id
|
fields["d_id"] = d_id
|
||||||
fields["show_new_dialog"] = nil
|
fields["show_new_dialog"] = nil
|
||||||
@ -2698,7 +2720,7 @@ minetest.register_on_player_receive_fields(
|
|||||||
|
|
||||||
-- if in edit mode: detect if something was changed;
|
-- if in edit mode: detect if something was changed;
|
||||||
if(edit_mode or fields.button_edit_name_and_description) then
|
if(edit_mode or fields.button_edit_name_and_description) then
|
||||||
yl_speak_up.edit_mode_apply_changes(pname, fields)
|
result = yl_speak_up.edit_mode_apply_changes(pname, fields)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- the player wants to change name and description; show the formspec
|
-- the player wants to change name and description; show the formspec
|
||||||
@ -3580,6 +3602,5 @@ yl_speak_up.replace_vars_in_text = function(text, dialog, pname)
|
|||||||
text = string.gsub(text, "%$GOOD_DAY%$", "Good "..day_time_name)
|
text = string.gsub(text, "%$GOOD_DAY%$", "Good "..day_time_name)
|
||||||
text = string.gsub(text, "%$good_DAY%$", "good "..day_time_name)
|
text = string.gsub(text, "%$good_DAY%$", "good "..day_time_name)
|
||||||
|
|
||||||
minetest.chat_send_player("singleplayer","replaced text: "..tostring(text))
|
|
||||||
return text
|
return text
|
||||||
end
|
end
|
||||||
|
Loading…
Reference in New Issue
Block a user