allow to click on start/end/unconnected steps in list

This commit is contained in:
Sokomine 2023-09-24 23:05:38 +02:00
parent d267560d2a
commit c3d97233dd
2 changed files with 85 additions and 66 deletions

View File

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

View File

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