Module:ObjectiveLister/Prereqs

From Terra Invicta Official Wiki

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

---
---Reads the Objective data files and computes a table of prereqs

--region Dependencies
local ObjectiveData = mw.loadData('Module:CSVReader/Objective')
--endregion

--region Private constants
--endregion

--region Private member variables
local prereqTable = {}
local doneObjectives = {}
--endregion

--region Private methods
function fillPrereqs(ObjectiveID)
	if doneObjectives[ObjectiveID] then
		-- This means this function has previously already filled the prereqs for this Objective.
		-- Nothing further needs to be done.
		return true
	elseif prereqTable[ObjectiveID] then 
		-- This means this function previously considered this Objective, yet did not fill the prereqs for it. 
		-- This is impossible without a loop in the Objective tree.
		mw.log("Attempt to build Objective tree found a loop.")
		return false
	end	
	
	prereqTable[ObjectiveID] = {}
	for i = 0, 5 do
		local prereq = ObjectiveData[ObjectiveID]['unlockingObjectiveNames/' .. i]
		if prereq and prereq ~= '' and prereq ~= 0 then
			-- Add this direct prereq as a prereq for ObjectiveID.
			prereqTable[ObjectiveID][prereq] = true
			-- Fill the prereqs for this direct prereq.
			if not fillPrereqs(prereq) then
				return false
			end
			-- Add every prereq of this direct prereq as a prereq for ObjectiveID.
			for rowID, b in pairs(prereqTable[prereq]) do
				prereqTable[ObjectiveID][rowID] = true
			end
		end
	end
	doneObjectives[ObjectiveID] = true
	return true
end

function getPrereqTable()
	for rowID, row in pairs(ObjectiveData) do
		if not fillPrereqs(rowID) then
			return {} -- Abort
		end
	end
	return prereqTable
end

--endregion

--region Public methods
--endregion

return getPrereqTable()