From dd5ea7e38f233925b075979750446da95baf02d2 Mon Sep 17 00:00:00 2001 From: Sokomine Date: Sun, 6 Aug 2023 03:30:33 +0200 Subject: [PATCH] added quest_step_reached --- exec_actions.lua | 5 ++++- exec_apply_effects.lua | 22 +++++++++++++++++++++- fs_talkdialog.lua | 3 ++- fs_trade_list.lua | 3 ++- quest_api.lua | 9 +++++++++ 5 files changed, 38 insertions(+), 4 deletions(-) diff --git a/exec_actions.lua b/exec_actions.lua index 406843e..e2b2726 100644 --- a/exec_actions.lua +++ b/exec_actions.lua @@ -77,6 +77,7 @@ yl_speak_up.execute_next_action = function(player, a_id, result_of_a_id) local actions = {} local effects = {} local sorted_key_list = {} + local d_option = {} if(dialog and dialog.n_dialogs and dialog.n_dialogs[d_id] @@ -86,6 +87,8 @@ yl_speak_up.execute_next_action = function(player, a_id, result_of_a_id) actions = dialog.n_dialogs[d_id].d_options[o_id].actions -- needed later on when all actions are executed effects = dialog.n_dialogs[d_id].d_options[o_id].o_results + -- needed later for setting quest_step (optional) + d_option = dialog.n_dialogs[d_id].d_options[o_id] end if(actions) then -- sort the actions so that we can execute them always in the @@ -256,7 +259,7 @@ yl_speak_up.execute_next_action = function(player, a_id, result_of_a_id) yl_speak_up.debug_msg(player, n_id, o_id, "All actions have been executed successfully. ".. "Doing effects/results now.") -- execute all effects/results - local res = yl_speak_up.execute_all_relevant_effects(player, effects, o_id, true) + local res = yl_speak_up.execute_all_relevant_effects(player, effects, o_id, true, d_option) local target_dialog = res.next_dialog yl_speak_up.speak_to[pname].o_id = nil yl_speak_up.speak_to[pname].a_id = nil diff --git a/exec_apply_effects.lua b/exec_apply_effects.lua index bdbd421..afe52d7 100644 --- a/exec_apply_effects.lua +++ b/exec_apply_effects.lua @@ -44,11 +44,20 @@ end -- was encountered after an unsuccessful action *or* right after an -- effect that returned false. -- Note: In edit mode, effects will *not* be executed. -yl_speak_up.execute_all_relevant_effects = function(player, effects, o_id, action_was_successful) +yl_speak_up.execute_all_relevant_effects = function(player, effects, o_id, action_was_successful, d_option) local target_dialog = "" local pname = player:get_player_name() local n_id = yl_speak_up.speak_to[pname].n_id if(not(effects)) then + -- it may still be necessary to set the quest step + if(d_option and d_option.quest_id and d_option.quest_step) then + local d_id = yl_speak_up.speak_to[pname].d_id + yl_speak_up.debug_msg(player, n_id, o_id, "Setting quest step \"".. + tostring(d_option.quest_step).."\" in quest \"".. + tostring(d_option.quest_id).."\".") + yl_speak_up.quest_step_reached(player, d_option.quest_step, d_option.quest_id, + n_id, d_id, o_id) + end yl_speak_up.debug_msg(player, n_id, o_id, "No effects given.") -- no effects? Then...return to the start dialog return {next_dialog = "", alternate_text = nil} @@ -127,6 +136,7 @@ yl_speak_up.execute_all_relevant_effects = function(player, effects, o_id, actio yl_speak_up.debug_msg(player, n_id, o_id, "Aborted executing effects at ".. tostring(r.r_id)..". New target dialog: "..tostring(r.r_value)..".") -- we also stop execution here + -- any quest step is NOT set (because effects and/or action weren't successful) return {next_dialog = r.r_value, alternate_text = r.alternate_text} end last_result = res @@ -141,6 +151,16 @@ yl_speak_up.execute_all_relevant_effects = function(player, effects, o_id, actio target_dialog = "d_got_item" end end + + -- it may still be necessary to set the quest step + if(d_option and d_option.quest_id and d_option.quest_step) then + local d_id = yl_speak_up.speak_to[pname].d_id + yl_speak_up.debug_msg(player, n_id, o_id, "Setting quest step \"".. + tostring(d_option.quest_step).."\" in quest \"".. + tostring(d_option.quest_id).."\".") + yl_speak_up.quest_step_reached(player, d_option.quest_step, d_option.quest_id, + n_id, d_id, o_id) + end return {next_dialog = target_dialog, alternate_text = alternate_text} end diff --git a/fs_talkdialog.lua b/fs_talkdialog.lua index 598f9ff..3ad31ee 100644 --- a/fs_talkdialog.lua +++ b/fs_talkdialog.lua @@ -871,8 +871,9 @@ yl_speak_up.get_fs_talkdialog = function(player, n_id, d_id, alternate_text, rec -- no actions shall be executed local o_id = go_to_next_dialog local effects = active_dialog.d_options[o_id].o_results + local d_option = active_dialog.d_options[o_id] -- execute all effects/results - local res = yl_speak_up.execute_all_relevant_effects(player, effects, o_id, true) + local res = yl_speak_up.execute_all_relevant_effects(player, effects, o_id, true, d_option) local target_dialog = res.next_dialog yl_speak_up.speak_to[pname].o_id = nil yl_speak_up.speak_to[pname].a_id = nil diff --git a/fs_trade_list.lua b/fs_trade_list.lua index 91854ae..f4566d2 100644 --- a/fs_trade_list.lua +++ b/fs_trade_list.lua @@ -130,10 +130,11 @@ yl_speak_up.get_fs_trade_list = function(player, show_dialog_option_trades) local do_o_id = yl_speak_up.eval_trade_list_preconditions(player) if(do_o_id) then local effects = dialog.n_dialogs["d_trade"].d_options[do_o_id].o_results + local d_option = dialog.n_dialogs["d_trade"].d_options[do_o_id] -- the return value is of no intrest here - we won't be showing another dialog, -- and alternate_text isn't relevant either; we just do the effects and then show -- the trade list - local res = yl_speak_up.execute_all_relevant_effects(player, effects, do_o_id, true) + local res = yl_speak_up.execute_all_relevant_effects(player, effects, do_o_id, true, d_option) end if(not(yl_speak_up.may_edit_npc(player, n_id))) then diff --git a/quest_api.lua b/quest_api.lua index 3b157aa..f6f2653 100644 --- a/quest_api.lua +++ b/quest_api.lua @@ -757,3 +757,12 @@ yl_speak_up.quest_step_possible = function(player, quest_step, quest_id, n_id, d -- minetest.chat_send_player("singleplayer", "TESTING quest step "..tostring(quest_step).." for quest "..tostring(quest_id)) return true end + + +-- sets quest_step in quest_id for player as achieved +-- called for example by yl_speak_up.execute_all_relevant_effects if the action was +yl_speak_up.quest_step_reached = function(player, quest_step, quest_id, n_id, d_id, o_id) + -- TODO: check again if it's possible? we don't want to step back in the quest_step chain + -- TODO: actually store the quest progress +-- minetest.chat_send_player("singleplayer", "SETTING quest step "..tostring(quest_step).." for quest "..tostring(quest_id)) +end