allow to remove quest steps from the lists of requirements

This commit is contained in:
Sokomine 2023-09-19 19:47:00 +02:00
parent d9208a1365
commit 0204f38a46

View File

@ -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