diff --git a/fs_manage_quest_steps.lua b/fs_manage_quest_steps.lua index 02931d8..6791eaf 100644 --- a/fs_manage_quest_steps.lua +++ b/fs_manage_quest_steps.lua @@ -171,79 +171,98 @@ yl_speak_up.input_fs_manage_quest_steps = function(player, formname, fields) -- TODO: check if the player is allowed to access that quest local pname = player:get_player_name() - if(fields and fields.back) then + if(not(fields) or (fields and fields.back)) then yl_speak_up.show_fs(player, "manage_quests") return end local res = yl_speak_up.player_is_working_on_quest(player) - if(not(res.error_msg) and res.current_step) then + if(res.error_msg) then + yl_speak_up.show_fs(player, "msg", { + input_to = formname, + formspec = yl_speak_up.get_fs_quest_edit_error(error_msg, "back_from_error_msg") + }) + return + end + local step_data = res.step_data or {} + + -- which quest step to show next? (if any) + local show_step = "" + -- was a quest step selected from the start/end/unconnected lists? + local list = {} + local field_name = "" + if( fields.select_from_start_steps and fields.select_from_start_steps ~= "") then + -- selected a start quest step + list = yl_speak_up.quest_step_get_start_end_unconnected_lists(step_data).start_steps + field_name = "select_from_start_steps" + elseif(fields.select_from_end_steps and fields.select_from_end_steps ~= "") then + -- selected an end quest step + list = yl_speak_up.quest_step_get_start_end_unconnected_lists(step_data).end_steps + field_name = "select_from_end_steps" + elseif(fields.select_from_unconnected_steps and fields.select_from_unconnected_steps ~= "") then + -- selected an unconnected/unused quest step + list = yl_speak_up.quest_step_get_start_end_unconnected_lists(step_data).unconnected_steps + field_name = "select_from_unconnected_steps" + elseif(res.current_step and fields.one_step_required) then + list = step_data[res.current_step].one_step_required + field_name = "one_step_required" + elseif(res.current_step and fields.all_steps_required) then + list = step_data[res.current_step].all_steps_required + field_name = "all_steps_required" + elseif(res.current_step and fields.next_steps_show) then + list = yl_speak_up.quest_step_required_for(step_data, res.current_step) + field_name = "next_steps_show" + -- show prev logical step + elseif(fields.show_prev_step) then + if( #step_data[res.current_step].one_step_required > 0) then + show_step = step_data[res.current_step].one_step_required[1] + elseif(#step_data[res.current_step].all_steps_required > 0) then + show_step = step_data[res.current_step].all_steps_required[1] + end + -- show next logical step + elseif(fields.show_next_step) then + local list = yl_speak_up.quest_step_required_for(res.step_data, res.current_step) + if(list and #list > 0) then + show_step = list[1] + end + end + + if(list and field_name) then + local selected = minetest.explode_table_event(fields[field_name]) + -- these tables don't use header + if(selected and selected.row and selected.row > 0 and selected.row <= #list) then + show_step = list[selected.row] + end + end + -- actually show the selected quest step + if(show_step and show_step ~= "") then + yl_speak_up.speak_to[pname].quest_step = show_step + yl_speak_up.show_fs(player, "manage_quest_steps", show_step) + return + end + + + if(res.current_step) then -- forward input from that formspec... if((yl_speak_up.speak_to[res.pname].quest_step_mode == "embedded_select") and (fields.add_from_available or (fields.add_step and fields.add_quest_step))) then return yl_speak_up.input_fs_add_quest_steps(player, "yl_speak_up:add_quest_steps", fields) end - local selected_from = nil - local list = {} - if( fields and fields.one_step_required) then - selected_from = fields.one_step_required - list = res.step_data[res.current_step].one_step_required - elseif(fields and fields.all_steps_required) then - selected_from = fields.all_steps_required - list = res.step_data[res.current_step].all_steps_required - elseif(fields and fields.next_steps_show) then - selected_from = fields.next_steps_show - list = yl_speak_up.quest_step_required_for(res.step_data, res.current_step) - end - if(selected_from) then - local selected = minetest.explode_table_event(selected_from) - if(selected and selected.row and selected.row > 0 and selected.row <= #list) then - -- show the selected quest step - yl_speak_up.speak_to[pname].quest_step = list[selected.row] - yl_speak_up.show_fs(player, "manage_quest_steps", list[selected.row]) - return - end - end - -- show prev logical step - if(fields and fields.show_prev_step) then - if(#res.step_data[res.current_step].one_step_required > 0) then - yl_speak_up.show_fs(player, "manage_quest_steps", - res.step_data[res.current_step].one_step_required[1]) - return - elseif(#res.step_data[res.current_step].all_steps_required > 0) then - yl_speak_up.show_fs(player, "manage_quest_steps", - res.step_data[res.current_step].all_steps_required[1]) - return - end - -- show next logical step - elseif(fields and fields.show_next_step) then - local list = yl_speak_up.quest_step_required_for(res.step_data, res.current_step) - if(list and #list > 0) then - yl_speak_up.show_fs(player, "manage_quest_steps", list[1]) - return - end + end + + local modes = {"add_to_one_needed", "add_to_all_needed", + "insert_after_prev_step", "insert_before_next_step"} + for i, mode in ipairs(modes) do + if(fields[mode] and fields[mode] ~= "") then + -- let that function sort out what to do; + -- yl_speak_up.speak_to[pname].q_id and yl_speak_up.speak_to[pname].quest_step + -- ought to be set to the current quest and step by now + yl_speak_up.speak_to[pname].quest_step_mode = mode + yl_speak_up.show_fs(player, "add_quest_steps") + return end end - if(fields - and (fields.add_to_one_needed or fields.add_to_all_needed - or fields.insert_after_prev_step or fields.insert_before_next_step)) then - -- let that function sort out what to do; - -- yl_speak_up.speak_to[pname].q_id and yl_speak_up.speak_to[pname].quest_step - -- ought to be set to the current quest and step by now - if(fields.add_to_one_needed) then - yl_speak_up.speak_to[pname].quest_step_mode = "add_to_one_needed" - elseif(fields.add_to_all_needed) then - yl_speak_up.speak_to[pname].quest_step_mode = "add_to_all_needed" - elseif(fields.insert_after_prev_step) then - yl_speak_up.speak_to[pname].quest_step_mode = "insert_after_prev_step" - elseif(fields.insert_before_next_step) then - yl_speak_up.speak_to[pname].quest_step_mode = "insert_before_next_step" - else - yl_speak_up.speak_to[pname].quest_step_mode = nil - end - yl_speak_up.show_fs(player, "add_quest_steps") - return - end + local quest_step_list = yl_speak_up.get_sorted_quest_step_list(pname) local res = yl_speak_up.input_fs_manage_general(player, formname, fields, -- what_is_the_list_about, min_length, max_length, function_add_new_entry, @@ -304,20 +323,20 @@ yl_speak_up.get_fs_manage_quest_steps = function(player, param) table.insert(formspec, "container_end[]") local lists = yl_speak_up.quest_step_get_start_end_unconnected_lists(step_data) yl_speak_up.get_fs_show_list_in_box(formspec, - "Start steps:", "TODO_select_from_start_steps", lists.start_steps, + "Start steps:", "select_from_start_steps", lists.start_steps, "0.1", "2.7", "5.6", "4.3", 0, nil, "#AAFFAA", "The quest begins with this (or one of these) steps.\n".. "You need at least one start step.", nil) yl_speak_up.get_fs_show_list_in_box(formspec, - "Unconnected steps:", "TODO_select_from_unconnected_steps", lists.unconnected_steps, + "Unconnected steps:", "select_from_unconnected_steps", lists.unconnected_steps, "0.1", "7.0", "5.6", "4.3", 0, nil, "#FFAAAA", "These steps are not used yet. They are not required\n".. - "by any other steps and do not require steps either.\n".. + "by any other step and do not require steps either.\n".. "Please decide what to do with them!", nil) yl_speak_up.get_fs_show_list_in_box(formspec, - "Quest ends with steps:", "TODO_select_from_end_steps", lists.end_steps, + "Quest ends with steps:", "select_from_end_steps", lists.end_steps, "24", "2.7", "5.6", "8.5", "0.1", nil, "#AAFFAA", "This quest ends with these steps. They are not required\n".. "by any other steps and have no successor.\n".. diff --git a/fs_manage_quests.lua b/fs_manage_quests.lua index f2a86bc..b22d145 100644 --- a/fs_manage_quests.lua +++ b/fs_manage_quests.lua @@ -74,7 +74,7 @@ yl_speak_up.get_fs_manage_quests = function(player, param) "depend on and influence other quests.\n".. "Progress for each player is stored in a variable. The name of ".. "that variable cannot be changed after creation.]") - if(true) then return formspec[1] end -- TODO: temporally disabled for YL +-- if(true) then return formspec[1] end -- TODO: temporally disabled for YL local selected = yl_speak_up.get_fs_manage_general(player, param, formspec, quest_list, "Create quest",