diff --git a/fs_add_quest_steps.lua b/fs_add_quest_steps.lua index 16aa6c7..31bdcc5 100644 --- a/fs_add_quest_steps.lua +++ b/fs_add_quest_steps.lua @@ -59,6 +59,28 @@ end --]] +-- helper function: find out if a quest step is required by other quest steps +yl_speak_up.quest_step_get_required_for_steps = function(step_data) + local required_for_steps = {} + for s, d in pairs(step_data) do + required_for_steps[s] = {} + end + for s, d in pairs(step_data) do + if(s and d and d.one_step_required and type(d.one_step_required) == "table") then + for i, s2 in ipairs(d.one_step_required) do + table.insert(required_for_steps[s2], s) + end + end + if(s and d and d.all_steps_required and type(d.all_steps_required) == "table") then + for i, s2 in ipairs(d.all_steps_required) do + table.insert(required_for_steps[s2], s) + end + end + end + return required_for_steps +end + + yl_speak_up.input_fs_add_quest_steps = function(player, formname, fields) local pname = player:get_player_name() @@ -103,9 +125,56 @@ yl_speak_up.input_fs_add_quest_steps = function(player, formname, fields) work_step = liste[selected.row - 1] end end - if(work_step) then --- minetest.chat_send_player("singleplayer","SELECTED: "..tostring(work_step)) -- TODO - return + + 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] + and step_data[work_step].one_step_required + and #step_data[work_step].one_step_required < 1 + and step_data[work_step].all_steps_required + and #step_data[work_step].all_steps_required < 1 + and #required_for_steps[work_step] < 1) then + -- this quest step is definitely suited +-- minetest.chat_send_player("singleplayer","SELECTED ok: "..tostring(work_step)) -- TODO + if(mode == "add_to_one_needed") then + if(not(yl_speak_up.quests[q_id].step_data[current_step].one_step_required)) then + yl_speak_up.quests[q_id].step_data[current_step].one_step_required = {} + end + table.insert(yl_speak_up.quests[q_id].step_data[current_step].one_step_required, work_step) + elseif(mode == "add_to_all_needed") then + if(not(yl_speak_up.quests[q_id].step_data[current_step].all_steps_required)) then + yl_speak_up.quests[q_id].step_data[current_step].all_steps_required = {} + end + table.insert(yl_speak_up.quests[q_id].step_data[current_step].all_steps_required, work_step) + elseif(mode == "insert_after_prev_step") then + elseif(mode == "insert_before_next_step") then + return + end + return yl_speak_up.show_fs(player, "add_quest_steps") end -- minetest.chat_send_player("singleplayer","FIELDS: "..minetest.serialize(fields)) @@ -173,23 +242,7 @@ yl_speak_up.get_fs_add_quest_steps = function(player, param) local step_data = quest.step_data -- find out if a quest step is required by other quest steps - local required_for_steps = {} - for s, d in pairs(step_data) do - required_for_steps[s] = {} - end - for s, d in pairs(step_data) do - if(s and d and d.one_step_required and type(d.one_step_required) == "table") then - for i, s2 in ipairs(d.one_step_required) do - table.insert(required_for_steps[s2], s) - end - end - if(s and d and d.all_steps_required and type(d.all_steps_required) == "table") then - for i, s2 in ipairs(d.all_steps_required) do - table.insert(required_for_steps[s2], s) - end - end - end - + local required_for_steps = yl_speak_up.quest_step_get_required_for_steps(step_data) local formspec = {} table.insert(formspec, "size[12.5,17.3]")