added way to add npcs as potential contributors to quests

This commit is contained in:
Sokomine 2023-09-30 11:34:30 +02:00
parent b82a985ca1
commit a3c1c5ccfd

View File

@ -85,57 +85,74 @@ yl_speak_up.input_fs_add_quest_steps = function(player, formname, fields)
if(not(fields) or not(player)) then
return
end
local res1 = yl_speak_up.player_is_working_on_quest(player)
if(res1.error_msg) then
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 = "yl_speak_up:add_quest_steps",
formspec = yl_speak_up.get_fs_quest_edit_error(res1.error_msg, "back")})
formspec = yl_speak_up.get_fs_quest_edit_error(res.error_msg, "back")})
return
end
local pname = res1.pname
local q_id = res1.q_id
local current_step = res1.current_step
local step_data = res1.step_data
local pname = res.pname
local q_id = res.q_id
local current_step = res.current_step
local step_data = res.step_data
local quest = res.quest
if(fields.back_from_error_msg) then
yl_speak_up.show_fs(player, "add_quest_steps")
return
end
if(fields.back) then
yl_speak_up.show_fs(player, "manage_quest_steps", current_step)
return
end
local mode = yl_speak_up.speak_to[pname].quest_step_mode
if(fields.back) then
-- go back to quest overview
if(mode and mode == "manage_quest_npcs") then
return yl_speak_up.show_fs(player, "manage_quests")
end
return yl_speak_up.show_fs(player, "manage_quest_steps", current_step)
end
-- has a quest step be selected?
local work_step = nil
if(fields.add_step and fields.add_quest_step) then
if(fields.add_element and fields.add_element_name) then
-- create a new quest step
local new_step = fields.add_quest_step:trim()
local new_step = fields.add_element_name:trim()
-- a new one shall be created
local res = yl_speak_up.quest_step_add_quest_step(pname, q_id, new_step)
if(res ~= "OK") then
local res2 = yl_speak_up.quest_step_add_quest_step(pname, q_id, new_step)
if(res2 ~= "OK") then
yl_speak_up.show_fs(player, "msg", {
input_to = "yl_speak_up:add_quest_steps",
formspec = "size[9,2]"..
"label[0.2,0.0;Error:\n"..
minetest.formspec_escape(minetest.wrap_text(res,80)).."]"..
minetest.formspec_escape(minetest.wrap_text(res2,80)).."]"..
"button[1.5,1.5;2,0.9;back_from_error_msg;Back]"})
return res
return res2
end
-- 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 yl_speak_up.speak_to[pname].available_quest_steps) then
and yl_speak_up.speak_to[pname].list_available) then
-- selected a quest step from the list of available steps offered
local liste = yl_speak_up.speak_to[pname].available_quest_steps
local liste = yl_speak_up.speak_to[pname].list_available
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.add_to_npc_list
and yl_speak_up.speak_to[pname].list_available) then
-- selected an NPC from the list of available NPC offered
local liste = yl_speak_up.speak_to[pname].list_available
local selected = minetest.explode_table_event(fields.add_to_npc_list)
if(selected and selected.row and selected.row > 1 and selected.row <= #liste + 1) then
local npc_id = liste[selected.row - 1]
if(table.indexof(res.quest.npcs or {}, npc_id) == -1) then
table.insert(yl_speak_up.quests[q_id].npcs, npc_id)
yl_speak_up.save_quest(q_id)
end
end
return yl_speak_up.show_fs(player, "add_quest_steps")
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)
@ -155,6 +172,17 @@ yl_speak_up.input_fs_add_quest_steps = function(player, formname, fields)
end
yl_speak_up.save_quest(q_id)
return yl_speak_up.show_fs(player, "add_quest_steps")
elseif(fields.delete_from_npc_list) then
-- remove an NPC from the list of contributors
-- TODO: check if it *can* be removed
local selected = minetest.explode_table_event(fields.delete_from_npc_list)
local liste = (res.quest.npcs or {})
if(selected and selected.row and selected.row > 1 and selected.row <= #liste + 1) then
table.remove(yl_speak_up.quests[q_id].npcs, selected.row - 1)
end
yl_speak_up.save_quest(q_id)
return yl_speak_up.show_fs(player, "add_quest_steps")
end
if(mode == "embedded_select") then
@ -276,6 +304,82 @@ yl_speak_up.quest_step_list_show_table = function(formspec, table_specs, liste,
end
-- returns list of NPCs that pname can edit and that are not yet part of quest_npc_list
yl_speak_up.quest_get_npc_candidate_list = function(pname, quest_npc_liste)
-- build a list of candidates
local npc_list = {}
for k, v in pairs(yl_speak_up.npc_list) do
-- only NPC that are not already added
if(table.indexof(quest_npc_liste or {}, k) == -1
-- and only those that the player can edit
and (v.owner == pname or (v.may_edit and v.may_edit[pname]))) then
table.insert(npc_list, k)
end
end
table.sort(npc_list)
return npc_list
end
-- lists npc that are either already added or could be added
yl_speak_up.quest_npc_show_table = function(formspec, table_specs, liste, step_data)
local grey_if_zero = function(fs, n)
if(n and n == 0) then
table.insert(fs, "#444444")
else
table.insert(fs, "#FFFFFF")
end
table.insert(fs, minetest.formspec_escape(n))
end
table.insert(formspec, "tablecolumns["..
"color;text,align=right;".. -- used in this many quest steps
"color;text,align=left;".. -- n_id
"color;text,align=left;".. -- owner
"color;text,align=left".. -- name of NPC
"]table[")
table.insert(formspec, table_specs)
table.insert(formspec,"#FFFFFF,Used:,#FFFFFF,n_id:,#FFFFFF,Name")
table.insert(formspec, minetest.formspec_escape(","))
table.insert(formspec, " description:,#FFFFFF,Owner:,")
local tmp = {}
for i, n_id in ipairs(liste or {}) do
-- find out in how many quest steps this NPC is used
local used = 0
for s, d in pairs(step_data) do
for loc_id, loc in pairs(d.where or {}) do
if(loc and loc.n_id and loc.n_id == "n_"..n_id) then
used = used + 1
end
end
end
grey_if_zero(tmp, used)
-- the n_id of the NPC
table.insert(tmp, "#AAFFAA")
table.insert(tmp, "n_"..minetest.formspec_escape(n_id))
-- get information from the NPC list (see fs_npc_list.lua)
local owner = "- ? -"
local name = "- ? -"
if(yl_speak_up.npc_list[n_id]) then
local npc = yl_speak_up.npc_list[n_id]
owner = npc.owner
name = (npc.name or name)
if(npc.desc and npc.desc ~= "") then
name = name..', '..(npc.desc or "")
end
end
-- name and description of the NPC
table.insert(tmp, "#AAFFAA")
table.insert(tmp, minetest.formspec_escape(name))
-- owner of the NPC
table.insert(tmp, "#AAFFAA")
table.insert(tmp, minetest.formspec_escape(owner))
end
table.insert(formspec, table.concat(tmp, ","))
table.insert(formspec, ";]")
end
-- param is unused
yl_speak_up.get_fs_add_quest_steps = function(player, param)
local res = yl_speak_up.player_is_working_on_quest(player)
@ -283,7 +387,8 @@ yl_speak_up.get_fs_add_quest_steps = function(player, param)
return yl_speak_up.get_fs_quest_edit_error(res.error_msg, "back")
end
local pname = res.pname
local step_data = res.step_data
local step_data = res.step_data or {}
-- find out if a quest step is required by other quest steps
local required_for_steps = yl_speak_up.quest_step_get_required_for_steps(step_data)
@ -295,10 +400,18 @@ yl_speak_up.get_fs_add_quest_steps = function(player, param)
this_step_data = step_data[current_step]
end
local mode = ""
if(pname and yl_speak_up.speak_to[pname] and yl_speak_up.speak_to[pname].quest_step_mode) then
if(param) then
mode = param
yl_speak_up.speak_to[pname].quest_step_mode = param
elseif(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 add_what = "Add a new quest step named:"
if(mode == "manage_quest_npcs") then
add_what = "Add the NPC with n_<id>:"
end
local formspec = {}
if(mode and mode == "embedded_select") then
table.insert(formspec, "size[30,12]container[6,0;18.5,12]")
@ -306,6 +419,7 @@ yl_speak_up.get_fs_add_quest_steps = function(player, param)
else
table.insert(formspec, "size[18.5,17.3]")
end
-- add back button
table.insert(formspec, "button[8,0;2,0.7;back;Back]")
-- show which quest we're working at
@ -319,9 +433,11 @@ yl_speak_up.get_fs_add_quest_steps = function(player, param)
table.insert(formspec, "]")
-- add new quest step
table.insert(formspec, "label[0.2,2.2;Add a new quest step named:]")
table.insert(formspec, "button[16.1,2.4;1.2,0.7;add_step;Add]")
table.insert(formspec, "field[1.0,2.4;15,0.7;add_quest_step;;]")
table.insert(formspec, "label[0.2,2.2;")
table.insert(formspec, add_what)
table.insert(formspec, "]")
table.insert(formspec, "button[16.1,2.4;1.2,0.7;add_element;Add]")
table.insert(formspec, "field[1.0,2.4;15,0.7;add_element_name;;]")
local y_pos = 3.3
if(current_step and mode == "insert_after_prev_step") then
@ -380,6 +496,27 @@ yl_speak_up.get_fs_add_quest_steps = function(player, param)
step_data, required_for_steps)
table.insert(formspec, "label[0.2,7.5;(Click on an entry to delete it from the list above.)]")
y_pos = 8.3
-- which NPC may contribute to the quest?
elseif(mode == "manage_quest_npcs") then
table.insert(formspec, "container[0,3.3;18,6]")
table.insert(formspec, "label[0.2,0;so that the NPC "..
minetest.colorize("#9999FF", "may contribute")..
" to the quest like these NPC:]")
yl_speak_up.quest_npc_show_table(formspec,
"0.2,0.2;17.0,3.0;delete_from_npc_list;",
res.quest.npcs or {},
step_data)
table.insert(formspec, "label[0.2,3.4;(Click on an entry to delete it from the list above.)]")
local available_npcs = yl_speak_up.quest_get_npc_candidate_list(pname, res.quest.npcs or {})
yl_speak_up.speak_to[pname].list_available = available_npcs
table.insert(formspec, "label[0.2,4.4;or select an NPC from the list below:]")
yl_speak_up.quest_npc_show_table(formspec,
"0.2,4.6;17.0,6.0;add_to_npc_list;",
available_npcs or {}, step_data)
table.insert(formspec, "label[0.2,10.8;Used: Shows in how many quest steps this NPC is used.]")
table.insert(formspec, "container_end[]")
y_pos = 4.2
return table.concat(formspec, "")
end
-- some quest steps may not be available/may not make sense
@ -408,7 +545,7 @@ yl_speak_up.get_fs_add_quest_steps = function(player, param)
end
end
table.sort(available_steps)
yl_speak_up.speak_to[pname].available_quest_steps = available_steps
yl_speak_up.speak_to[pname].list_available = available_steps
table.insert(formspec, "container[0,")
table.insert(formspec, tostring(y_pos))