diff --git a/fs_add_quest_steps.lua b/fs_add_quest_steps.lua index 31bdcc5..6de3143 100644 --- a/fs_add_quest_steps.lua +++ b/fs_add_quest_steps.lua @@ -84,24 +84,43 @@ end yl_speak_up.input_fs_add_quest_steps = function(player, formname, fields) local pname = player:get_player_name() - if(not(pname) or not(yl_speak_up.speak_to[pname])) then + if(not(fields) or not(pname) or not(yl_speak_up.speak_to[pname])) then return end - if(fields and fields.back_from_error_msg) then + if(fields.back_from_error_msg) then yl_speak_up.show_fs(player, "add_quest_steps") return end - if(fields and fields.back) then + if(fields.back) then if(yl_speak_up.speak_to[pname].quest_step) then yl_speak_up.show_fs(player, "manage_quest_steps", yl_speak_up.speak_to[pname].quest_step) return end end + local q_id = yl_speak_up.speak_to[pname].q_id + -- TODO: check if the player can access that quest + if(not(q_id)) then + return yl_speak_up.show_fs(player, "manage_quests") + end + local quest = yl_speak_up.quests[q_id] + if(not(quest)) then + return yl_speak_up.show_fs(player, "manage_quests") + end + local step_data = quest.step_data + if(not(step_data)) then + yl_speak_up.quests[q_id].step_data = {} + end + -- other values needed later on + local current_step = yl_speak_up.speak_to[pname].quest_step + local mode = "" + if(pname and yl_speak_up.speak_to[pname] and yl_speak_up.speak_to[pname].quest_step_mode) then + mode = yl_speak_up.speak_to[pname].quest_step_mode + end -- has a quest step be selected? local work_step = nil - if(fields and fields.add_step and fields.add_quest_step) then - local q_id = yl_speak_up.speak_to[pname].q_id + if(fields.add_step and fields.add_quest_step) then + -- create a new quest step local new_step = fields.add_quest_step:trim() -- a new one shall be created local res = yl_speak_up.quest_step_add_quest_step(pname, q_id, new_step) @@ -117,39 +136,40 @@ yl_speak_up.input_fs_add_quest_steps = function(player, formname, fields) -- this will also be set if the quest step exists already; this is fine so far work_step = new_step - elseif(fields.add_from_available and pname and yl_speak_up.speak_to[pname] + elseif(fields.add_from_available and yl_speak_up.speak_to[pname].available_quest_steps) then + -- selected a quest step from the list of available steps offered local liste = yl_speak_up.speak_to[pname].available_quest_steps local selected = minetest.explode_table_event(fields.add_from_available) if(selected and selected.row and selected.row > 1 and selected.row <= #liste + 1) then work_step = liste[selected.row - 1] end + + elseif(fields.delete_from_one_step_required and current_step and step_data[current_step]) then + -- remove a quest step from the list (from one step required) + local selected = minetest.explode_table_event(fields.delete_from_one_step_required) + local liste = (step_data[current_step].one_step_required or {}) + if(selected and selected.row and selected.row > 1 and selected.row <= #liste + 1) then + table.remove(yl_speak_up.quests[q_id].step_data[current_step].one_step_required, selected.row-1) + end + return yl_speak_up.show_fs(player, "add_quest_steps") + + elseif(fields.delete_from_all_steps_required and current_step and step_data[current_step]) then + -- remove a quest step from the lists (from all steps required) + local selected = minetest.explode_table_event(fields.delete_from_all_steps_required) + local liste = (step_data[current_step].all_steps_required or {}) + if(selected and selected.row and selected.row > 1 and selected.row <= #liste + 1) then + table.remove(yl_speak_up.quests[q_id].step_data[current_step].all_steps_required, selected.row-1) + end + return yl_speak_up.show_fs(player, "add_quest_steps") end if(not(work_step)) then return -- TODO end - local q_id = yl_speak_up.speak_to[pname].q_id - -- TODO: check if the player can access that quest - if(not(q_id)) then - return yl_speak_up.show_fs(player, "manage_quests") - end - local quest = yl_speak_up.quests[q_id] - if(not(quest)) then - return yl_speak_up.show_fs(player, "manage_quests") - end - local step_data = quest.step_data - if(not(step_data)) then - return yl_speak_up.show_fs(player, "manage_quests") - end - local current_step = yl_speak_up.speak_to[pname].quest_step if(not(current_step) or not(step_data[current_step])) then return yl_speak_up.show_fs(player, "manage_quests") end - local mode = "" - if(pname and yl_speak_up.speak_to[pname] and yl_speak_up.speak_to[pname].quest_step_mode) then - mode = yl_speak_up.speak_to[pname].quest_step_mode - end local required_for_steps = yl_speak_up.quest_step_get_required_for_steps(step_data) if(step_data[work_step] @@ -332,13 +352,31 @@ yl_speak_up.get_fs_add_quest_steps = function(player, param) y_pos = 8.3 end - -- TODO: temporary! + -- some quest steps may not be available/may not make sense + local not_available = {} + if(current_step and step_data[current_step]) then + -- steps that are already required + for i, s in ipairs(step_data[current_step].one_step_required or {}) do + not_available[s] = true + end + for i, s in ipairs(step_data[current_step].all_steps_required or {}) do + not_available[s] = true + end + -- steps that directly require this quest step here + for i, s in ipairs(required_for_steps[current_step] or {}) do + not_available[s] = true + end + end + -- build a list of candidates local available_steps = {} for k, v in pairs(step_data) do - table.insert(available_steps, k) + if(not(not_available[k])) then + table.insert(available_steps, k) + end end table.sort(available_steps) yl_speak_up.speak_to[pname].available_quest_steps = available_steps + table.insert(formspec, "label[0.2,") table.insert(formspec, tostring(y_pos)) table.insert(formspec, ";or select an existing quest step from the list below:]") @@ -353,6 +391,5 @@ yl_speak_up.get_fs_add_quest_steps = function(player, param) "\t(A) that (a)ll need to be achieved for this quest step\n".. "\t(U) that require/(u)se this quest step in some form]") - -- TODO: write before which quest step we want to insert (if that is what is selected) return table.concat(formspec, "") end