quest steps are clickable from quest overview page

This commit is contained in:
Sokomine 2023-09-25 05:22:38 +02:00
parent b621fe7b12
commit 3f9da138e0
2 changed files with 55 additions and 18 deletions

View File

@ -24,6 +24,11 @@ yl_speak_up.player_is_working_on_quest = function(player)
-- TODO: check if the player has access to that data
t.step_data = yl_speak_up.quests[t.q_id].step_data
t.current_step = yl_speak_up.speak_to[t.pname].quest_step
-- check here if the step exists
if(t.current_step and not(t.step_data[t.current_step])) then
yl_speak_up.speak_to[t.pname].quest_step = nil
t.current_step = nil
end
-- t contains pname, q_id, quest, step_data and current_step - or error_msg
return t
end
@ -166,22 +171,21 @@ yl_speak_up.input_fs_manage_quest_steps_check_fields = function(player, formname
end
-- makes use of yl_speak_up.input_fs_manage_general and is thus pretty short
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(not(fields) or (fields and fields.back)) then
yl_speak_up.show_fs(player, "manage_quests")
return
-- some lists are offered in diffrent formspecs for selection;
-- this function will display the right quest step if possible
-- res needs to be yl_speak_up.player_is_working_on_quest(player)
yl_speak_up.input_routing_show_a_quest_step = function(player, formname, fields, back_field_name, res)
if(not(player) or not(fields) or (fields and fields.back) or not(res)) then
return false
end
local res = yl_speak_up.player_is_working_on_quest(player)
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")
formspec = yl_speak_up.get_fs_quest_edit_error(error_msg, back_field_name)
})
return
return true
end
local step_data = res.step_data or {}
@ -203,24 +207,24 @@ yl_speak_up.input_fs_manage_quest_steps = function(player, formname, fields)
-- 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
elseif(res.current_step and step_data[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
elseif(res.current_step and step_data[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
elseif(res.current_step and step_data[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"
elseif(fields.add_from_available) then
-- selected a quest step from the list of available steps offered
list = yl_speak_up.speak_to[pname].available_quest_steps or {}
list = yl_speak_up.speak_to[res.pname].available_quest_steps or {}
field_name = "add_from_available"
-- this table has a header
row_offset = 1
-- show prev logical step
elseif(fields.show_prev_step) then
elseif(fields.show_prev_step and res.current_step and step_data[res.current_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
@ -243,18 +247,35 @@ yl_speak_up.input_fs_manage_quest_steps = function(player, formname, fields)
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.speak_to[res.pname].quest_step = show_step
yl_speak_up.show_fs(player, "manage_quest_steps", show_step)
return
return true
-- show the entire list
elseif(fields.show_step_list) then
yl_speak_up.speak_to[res.pname].tmp_index_general = -1
yl_speak_up.speak_to[pname].quest_step = nil
yl_speak_up.speak_to[res.pname].quest_step = nil
yl_speak_up.show_fs(player, "manage_quest_steps", nil)
return
return true
end
return false
end
-- makes use of yl_speak_up.input_fs_manage_general and is thus pretty short
yl_speak_up.input_fs_manage_quest_steps = function(player, formname, fields)
local pname = player:get_player_name()
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)
-- show a particular quest step?
if(yl_speak_up.input_routing_show_a_quest_step(player, formname, fields, "back_from_error_msg", res)) then
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")

View File

@ -49,6 +49,15 @@ yl_speak_up.input_fs_manage_quests = function(player, formname, fields)
yl_speak_up.show_fs(player, "manage_quest_steps")
return
end
-- show a particular quest step from the start/unconnected/end list?
local res = yl_speak_up.player_is_working_on_quest(player)
if(yl_speak_up.speak_to[pname]
and yl_speak_up.speak_to[pname].q_id
and yl_speak_up.input_routing_show_a_quest_step(player, formname, fields, "back", res)) then
return
end
local quest_list = yl_speak_up.get_sorted_quest_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,
@ -98,6 +107,13 @@ yl_speak_up.get_fs_manage_quests = function(player, param)
quest = data
end
end
-- which quest is the player working on? that's important for showing quest steps
if(not(yl_speak_up.speak_to[pname])) then
yl_speak_up.speak_to[pname] = {}
end
yl_speak_up.speak_to[pname].q_id = quest.id
local quest_state_selected = table.indexof({"created","testing","open","official"}, quest.state)
if(quest_state_selected == -1) then
quest_state_selected = 1