Module:Quest

Documentation for this module may be created at Module:Quest/doc

local p = {}
local utils = require("Module:Utils")
local data = mw.loadJsonData("Module:Data/quest.json")

function p.createInfobox(frame)
	local tempName = frame.args.name
	local name = ""
	if tempName == nil or tempName == "" then tempName = mw.title.getCurrentTitle().subpageText end
	-- check if title contains additional "tags" such as "The Bloodworks (quest)" and removes it
	if string.match(tempName,"%(quest%)") then 
		local i, _ = string.find(tempName," %(quest%)")
		name = string.sub(tempName,1,i-1)
	-- move title from soft reference to main reference, immutable.
	else
		name = tempName
	end
	-- end additions, Squatch
	local obj = data[name]
	local rewards = ""
	
	if obj.rewards ~= nil then
		if obj.rewards.guaranteedRewards ~= nil then
			for k, v in ipairs(obj.rewards.guaranteedRewards) do
				rewards = rewards .. frame:expandTemplate{title = 'Icon', args = {v.name, v.amount > 1 and v.amount or ""}} .. "<br>"
			end
		end
		
		if obj.rewards.lootRewards ~= nil then
			for k, v in ipairs(obj.rewards.lootRewards) do
				if v.type == "Inventory" then
					for k2, v2 in ipairs(v.items) do
						local amount = ""
						if type(v2.amount) == "table" then
							amount = v2.amount[1]
						else
							amount = v2.amount
						end
						rewards = rewards .. frame:expandTemplate{title = 'Icon', args = {v2.name, amount > 1 and amount or ""}} .. "<br>"
					end
				end
			end
		end
		
		if obj.rewards.fauxRewards ~= nil then
			for k, v in ipairs(obj.rewards.fauxRewards) do
				rewards = rewards .. v.name .. "<br>"
			end
		end
	end

	local str = {
		name = name,
		type = obj.type,
		subtype = obj.subtype,
		jobType = obj.jobType,
		questGiver = obj.questGiver,
		repeatable = (obj.type == "Side Story" and tostring(obj.repeatable) or ''),
		rewards = rewards,
		previous = frame.args.previous ~= nil and frame.args.previous or obj.previous,
		next = frame.args.next ~= nil and frame.args.next or obj.next
	}
	
	return frame:expandTemplate{title = 'Infobox quest', args = str}
end

function p.getDescription(frame)
	local tempName = frame.args.name
	local name = ""
	if tempName == nil or tempName == "" then tempName = mw.title.getCurrentTitle().subpageText end
	-- check if title contains additional "tags" such as "The Bloodworks (quest)" and removes it
	if string.match(tempName,"%(quest%)") then 
		local i, _ = string.find(tempName," %(quest%)")
		name = string.sub(tempName,1,i-1)
	-- move title from soft reference to main reference, immutable.
	else
		name = tempName
	end
	-- end additions, Squatch
	local obj = data[name]
	local str = ""

	if obj.startDescription ~= "" then
		str = str .. "=== Start ===\n"
		str = str .. obj.startDescription .. "\n"
	end
	if obj.activeDescription ~= "" then
		str = str .. "=== Active ===\n"
		str = str .. obj.activeDescription .. "\n"
	end
	if obj.successDescription ~= "" then
		str = str .. "=== Clear ===\n"
		str = str .. obj.successDescription .. "\n"
	end
	str = str:sub(1, -2)
	
	return str
end

function p.getPrerequisite(frame)
	local tempName = frame.args.name
	local name = ""
	if tempName == nil or tempName == "" then tempName = mw.title.getCurrentTitle().subpageText end
	-- check if title contains additional "tags" such as "The Bloodworks (quest)" and removes it
	if string.match(tempName,"%(quest%)") then 
		local i, _ = string.find(tempName," %(quest%)")
		name = string.sub(tempName,1,i-1)
	-- move title from soft reference to main reference, immutable.
	else
		name = tempName
	end
	-- end additions, Squatch
	local obj = data[name]
	local str = ""
	
	if utils.length(obj.prerequisite) == 1 then
		str = "Clear [[" .. obj.prerequisite[1] .. "]]."
	else
		for k, v in ipairs(obj.prerequisite) do
			str = str .. "* Clear [[" .. v .. "]]\n"
		end
		str = str:sub(1, -2)
	end
	
	if str == "" then
		str = "None."
	end
	
	return str
end

function p.getObjectives(frame)
	local tempName = frame.args.name
	local name = ""
	if tempName == nil or tempName == "" then tempName = mw.title.getCurrentTitle().subpageText end
	-- check if title contains additional "tags" such as "The Bloodworks (quest)" and removes it
	if string.match(tempName,"%(quest%)") then 
		local i, _ = string.find(tempName," %(quest%)")
		name = string.sub(tempName,1,i-1)
	-- move title from soft reference to main reference, immutable.
	else
		name = tempName
	end
	-- end additions, Squatch
	local obj = data[name]
	local str = ""
	
	local phaseCount = 1
	for k, v in ipairs(obj.phases) do
		str = str .. "* Phase " .. phaseCount .. "\n"
		phaseCount = phaseCount + 1
		
		for k2, v2 in ipairs(v.objectives) do
			str = str .. "** " .. v2.text
			if v2.location ~= nil then
				str = str .. "<br>" .. "''[[" .. v2.location .. "]]''" .. "</i>"
			end
			str = str .. "\n"
		end
	end
	str = str:sub(1, -2)
	
	return str
end

function p.createDialogue(frame)
	local tempName = frame.args.name
	local name = ""
	if tempName == nil or tempName == "" then tempName = mw.title.getCurrentTitle().subpageText end
	-- check if title contains additional "tags" such as "The Bloodworks (quest)" and removes it
	if string.match(tempName,"%(quest%)") then 
		local i, _ = string.find(tempName," %(quest%)")
		name = string.sub(tempName,1,i-1)
	-- move title from soft reference to main reference, immutable.
	else
		name = tempName
	end
	-- end additions, Squatch
	local obj = data[name]
	local str = ""
	local start = true
	
	if utils.length(obj.onStartDialogue) ~= 0 then
		start = false
		str = str .. "<div class='text-center'>Start Quest</div>"
		str = str .. p.createDialogueBox(obj.onStartDialogue)
	end
	
	local currentPhase = 0
	for k, v in ipairs(obj.phases) do
		if v.phaseDialogue ~= nil or v.phaseQuip ~= nil then
			start = false
			if start == false then str = str .. "<hr>" end
			local phase = currentPhase == 0 and "Start Quest" or "Clear Phase " .. currentPhase
			str = str .. "<div class='text-center'>".. phase .."</div>"
			str = str .. p.createDialogueBox(v.phaseQuip)
			str = str .. p.createDialogueBox(v.phaseDialogue)
		end
		currentPhase = currentPhase + 1
	end
	
	if utils.length(obj.onSuccessDialogue) ~= 0 then
		if start == false then str = str .. "<hr>" end
		str = str .. "<div class='text-center'>Clear Quest</div>"
		str = str .. p.createDialogueBox(obj.onSuccessDialogue)
	end
	
	if #str == 0 then
		str = "This quest has no dialogue."
	end
	
	return str
end

function p.createDialogueBox(t)
	local str = ""
	
	if t ~= nil then
		local args = {align = "", name = "", text = ""}
		local currentName = ""
		local frame = mw.getCurrentFrame()
		
		for k, v in ipairs(t) do
			if currentName ~= v.name then
				if currentName ~= "" then str = str .. frame:expandTemplate{title = 'Dialogue', args = args} end
				currentName = v.name
				args = {
					name = v.name,
					text = v.text
				}
				if v.name == "Player" then args.align = "right" end
			else
				args = {
					name = v.name,
					text = args.text .. "\n\n" .. v.text
				}
				if v.name == "Player" then args.align = "right" end
			end
		end
		
		str = str .. frame:expandTemplate{title = 'Dialogue', args = args}
	end
	
	return str
end

return p
Cookies help us deliver our services. By using our services, you agree to our use of cookies.