added first temporary storing of previous quest steps

This commit is contained in:
Sokomine 2023-09-19 05:23:16 +02:00
parent 35506731bd
commit d9208a1365

View File

@ -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]")