quests/formspecs.lua

354 lines
13 KiB
Lua

-- Boilerplate to support localized strings if intllib mod is installed.
local S = minetest.get_translator("quests")
-- construct the questlog
function quests.create_formspec(playername, tab, integrated)
local queststringlist = {}
local questlist = {}
quests.formspec_lists[playername] = quests.formspec_lists[playername] or {
id = 1
}
quests.formspec_lists[playername].list = {}
tab = tab or quests.formspec_lists[playername].tab or "1"
if tab == "1" then
questlist = quests.active_quests[playername] or {}
elseif tab == "2" then
questlist = quests.successfull_quests[playername] or {}
elseif tab == "3" then
questlist = quests.failed_quests[playername] or {}
end
quests.formspec_lists[playername].tab = tab
local quest_count = 0
for questname,questspecs in quests.sorted_pairs(questlist) do
if not questspecs.finished then
local quest = quests.registered_quests[questname]
if quest then -- Quest might have been deleted
local queststring = quest.title
if questspecs.count then
if questspecs.count > 1 then
queststring = queststring .. " - " .. questspecs.count
end
local restart_remaining = quests.quest_restarting_in(playername, questname)
if restart_remaining ~= nil then
queststring = queststring .. " (" .. S("restarts in %ds"):format(restart_remaining) .. ")"
end
elseif not questspecs.count and quest.max ~= 1 then
if quest.simple then
queststring = queststring .. " (" .. quests.round(questspecs.value, 2) .. "/" .. quest.max .. ")"
else
local active_tasks, active_completed = quests.get_active_tasks_stats(playername, questname)
if active_tasks and active_completed then
queststring = queststring .. " (" .. S("%d/%d tasks done"):format(active_completed, active_tasks) .. ")"
else
-- Kind of an error
queststring = queststring .. " (...)"
end
end
end
table.insert(queststringlist, queststring)
table.insert(quests.formspec_lists[playername].list, questname)
quest_count = quest_count + 1
end
end
end
if quest_count ~= 0 and quests.formspec_lists[playername].id > quest_count then
quests.formspec_lists[playername].id = quest_count
end
local formspec = ""
if not integrated then
formspec = formspec .. "size[7,9]"
end
formspec = formspec .. "tabheader[0,0;quests_header;" .. S("Open quests") .. "," .. S("Finished quests") .. "," .. S("Failed quests") .. ";" .. tab .. "]"
if quest_count == 0 then
formspec = formspec .. "label[0.25,0.25;" .. S("There are no quests in this category.") .. "]"
else
formspec = formspec .. "textlist[0.25,0.25;6.5,6;quests_questlist;"..table.concat(queststringlist, ",") .. ";" .. tostring(quests.formspec_lists[playername].id) .. ";false]"
end
if quests.formspec_lists[playername].tab == "1" then
local hud_display = "true"
if quests.formspec_lists[playername].id then
local questname = quests.formspec_lists[playername].list[quests.formspec_lists[playername].id]
if not quests.get_quest_hud_visibility(playername, questname) then
hud_display = "false"
end
end
formspec = formspec .."button[0.25,7.1;3,.7;quests_abort;" .. S("Abort quest") .. "]" ..
"checkbox[.25,6.2;quests_show_quest_in_hud;" .. S("Show in HUD") .. ";" .. hud_display .. "]"
end
formspec = formspec .. "button[3.75,7.1;3,.7;quests_config;" .. S("Configure") .. "]"..
"button[.25,8;3,.7;quests_info;" .. S("Info") .. "]"..
"button_exit[3.75,8;3,.7;quests_exit;" .. S("Exit") .. "]"
return formspec
end
-- construct the configuration
function quests.create_config(playername, integrated)
local formspec = ""
if (not integrated) then
formspec = formspec .. "size[7,3]"
end
formspec = formspec .. "checkbox[.25,.25;quests_config_enable;" .. S("Enable HUD") .. ";"
if(quests.hud[playername] ~= nil and quests.hud[playername].list ~= nil) then
formspec = formspec .. "true"
else
formspec = formspec .. "false"
end
formspec = formspec .. "]checkbox[.25,.75;quests_config_autohide;" .. S("Autohide HUD") .. ";"
if(quests.hud[playername] ~= nil and quests.hud[playername].autohide) then
formspec = formspec .. "true"
else
formspec = formspec .. "false"
end
formspec = formspec .. "]checkbox[.25,1.25;quests_config_central_message;" .. S("Central messages") .. ";"
if(quests.hud[playername] ~= nil and quests.hud[playername].central_message_enabled) then
formspec = formspec .. "true"
else
formspec = formspec .. "false"
end
formspec = formspec .. "]" ..
"button[.25,2.25;3,.7;quests_config_return;" .. S("Return") .. "]"
return formspec
end
-- construct the info formspec
function quests.create_info(playername, questname, taskid, integrated)
local formspec = ""
if not integrated then
formspec = formspec .. "size[7.5,9]"
end
if questname then
local restart_remaining = quests.quest_restarting_in(playername, questname)
local quest = quests.registered_quests[questname]
formspec = formspec .. "image[0,0;0.8,0.8;" .. quest.icon .. "]"
if restart_remaining ~= nil then
formspec = formspec .. "label[0.8,0;" .. quest.title .. "]" ..
"label[0.8,0.3;" .. S("%ds seconds remaining"):format(restart_remaining) .. "]"
else
formspec = formspec .. "label[0.8,0.1;" .. quest.title .. "]"
end
if quest.simple then
formspec = formspec .. "textarea[.4,1;7.2,7;;;" .. minetest.formspec_escape(quest.description) .. "]"
else
quests.formspec_lists[playername].taskid = nil
local taskidlist = {}
local taskstringlist = {}
for taskname, task in pairs(quest.tasks) do
local plr_task = nil
if quests.active_quests[playername] and quests.active_quests[playername][questname] then
plr_task = quests.active_quests[playername][questname][taskname]
end
if not plr_task or (plr_task and plr_task.visible) then
-- not plr_task => quest is finished, display all tasks
table.insert(taskidlist, taskname)
local color = ""
local suffix = ""
if plr_task then
if plr_task.finished then
color = "#00BB00"
end
if plr_task.disabled then
color = "#AAAAAA"
end
suffix = " - " .. quests.round(plr_task.value, 2) .. "/" .. task.max
end
table.insert(taskstringlist, color .. task.title .. suffix)
end
end
local task = false
if taskid ~= nil then
task = quest.tasks[taskidlist[taskid]]
end
task = task or {title=S("No task selected"), description=""}
formspec = formspec .. "textarea[.4,1;7.2,2;_;;" .. minetest.formspec_escape(quest.description) .. "]" ..
"textlist[0.1,2.9;7,2;quest_info_tasklist;" .. table.concat(taskstringlist, ",") .. "]" ..
"label[0.8,5.2;" .. task.title .. "]" ..
"textarea[.4,6;7.2,2;__;;" .. minetest.formspec_escape(task.description) .. "]"
if task.icon then
formspec = formspec .. "image[0,5.1;0.8,0.8;" .. task.icon .. "]"
end
end
if quests.formspec_lists[playername].tab == "1" then
formspec = formspec .. "button[3.6,8;3,.7;quests_info_abort;" .. S("Abort quest") .. "]"
end
else
formspec = formspec .. "label[0.8,0.1;" .. S("No quest specified.") .. "]"
end
formspec = formspec .. "button[.4,8;3,.7;quests_info_return;" .. S("Return") .. "]"
return formspec
end
-- show the player playername his/her questlog
function quests.show_formspec(playername)
minetest.show_formspec(playername, "quests:questlog", quests.create_formspec(playername))
end
-- chatcommand to see a full list of quests:
minetest.register_chatcommand("quests", {
params = "",
description = S("Show all open quests"),
func = function(name, param)
minetest.show_formspec(name, "quests:questlog", quests.create_formspec(name))
return true
end
})
-- Handle the return fields of the questlog
minetest.register_on_player_receive_fields(function(player, formname, fields)
if player == nil then
return
end
local playername = player:get_player_name()
if playername == "" then
return
end
-- questlog
if fields.quests_header then
if formname == "quests:questlog" then
minetest.show_formspec(playername, "quests:questlog", quests.create_formspec(playername, fields.quests_header))
else
if fields.quests_header == "1" then
unified_inventory.set_inventory_formspec(player, "quests")
elseif fields.quests_header == "2" then
unified_inventory.set_inventory_formspec(player, "quests_successfull")
return
else
unified_inventory.set_inventory_formspec(player, "quests_failed")
return
end
end
return
end
if fields.quests_questlist then
local event = minetest.explode_textlist_event(fields.quests_questlist)
if event.type == "CHG" then
quests.formspec_lists[playername].id = event.index
if formname == "quests:questlog" then
minetest.show_formspec(playername, "quests:questlog", quests.create_formspec(playername))
else
unified_inventory.set_inventory_formspec(player, "quests")
end
end
end
if fields.quests_abort then
if quests.formspec_lists[playername].id == nil then
return
end
quests.abort_quest(playername, quests.formspec_lists[playername].list[quests.formspec_lists[playername].id])
if formname == "quests:questlog" then
minetest.show_formspec(playername, "quests:questlog", quests.create_formspec(playername))
else
unified_inventory.set_inventory_formspec(player, "quests")
end
end
if fields.quests_config then
if formname == "quests:questlog" then
minetest.show_formspec(playername, "quests:config", quests.create_config(playername))
else
unified_inventory.set_inventory_formspec(player, "quests_config")
end
end
if fields.quests_info then
if formname == "quests:questlog" then
minetest.show_formspec(playername, "quests:info", quests.create_info(playername, quests.formspec_lists[playername].list[quests.formspec_lists[playername].id], nil, false))
else
unified_inventory.set_inventory_formspec(player, "quests_info")
end
end
if fields.quests_show_quest_in_hud ~= nil then
local questname = quests.formspec_lists[playername].list[quests.formspec_lists[playername].id]
if questname then
quests.set_quest_hud_visibility(playername, questname, fields.quests_show_quest_in_hud == "true")
if formname == "quests:questlog" then
minetest.show_formspec(playername, "quests:questlog", quests.create_formspec(playername))
else
unified_inventory.set_inventory_formspec(player, "quests")
end
end
end
-- config
if (fields["quests_config_enable"]) then
quests.hud[playername].autohide = false
if (fields["quests_config_enable"] == "true") then
quests.show_hud(playername)
else
quests.hide_hud(playername)
end
if (formname == "quests:config") then
minetest.show_formspec(playername, "quests:config", quests.create_config(playername))
else
unified_inventory.set_inventory_formspec(player, "quests_config")
end
end
if (fields["quests_config_autohide"]) then
if (fields["quests_config_autohide"] == "true") then
quests.hud[playername].autohide = true
quests.update_hud(playername)
else
quests.hud[playername].autohide = false
end
if (formname == "quests:config") then
minetest.show_formspec(playername, "quests:config", quests.create_config(playername))
else
unified_inventory.set_inventory_formspec(player, "quests_config")
end
end
if (fields["quests_config_central_message"]) then
if (fields["quests_config_central_message"] == "true") then
quests.hud[playername].central_message_enabled = true
else
quests.hud[playername].central_message_enabled = false
end
if (formname == "quests:config") then
minetest.show_formspec(playername, "quests:config", quests.create_config(playername))
else
unified_inventory.set_inventory_formspec(player, "quests_config")
end
end
if (fields["quests_config_return"]) then
if (formname == "quests:config") then
minetest.show_formspec(playername, "quests:questlog", quests.create_formspec(playername))
else
unified_inventory.set_inventory_formspec(player, "quests")
end
end
-- info
if fields.quest_info_tasklist then
local event = minetest.explode_textlist_event(fields.quest_info_tasklist)
if event.type == "CHG" then
if formname == "quests:info" then
minetest.show_formspec(playername, "quests:info", quests.create_info(playername, quests.formspec_lists[playername].list[quests.formspec_lists[playername].id], event.index, false))
else
quests.formspec_lists[playername].taskid = event.index
unified_inventory.set_inventory_formspec(player, "quests_info")
end
end
end
if fields.quests_info_abort then
if quests.formspec_lists[playername].id == nil then
return
end
quests.abort_quest(playername, quests.formspec_lists[playername].list[quests.formspec_lists[playername].id])
if formname == "quests:info" then
minetest.show_formspec(playername, "quests:questlog", quests.create_formspec(playername))
else
unified_inventory.set_inventory_formspec(player, "quests")
end
end
if fields.quests_info_return then
if formname == "quests:info" then
minetest.show_formspec(playername, "quests:questlog", quests.create_formspec(playername))
else
unified_inventory.set_inventory_formspec(player, "quests")
end
end
end)