Module:ProjectLister/Prereqs

From Terra Invicta Official Wiki

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

---
---Reads the Project data files and computes a table of prereqs. 
---Note: Currently does NOT handle alt-prereqs!

--region Dependencies
local ProjectData = mw.loadData('Module:CSVReader/Project')
local TechPrereqs = mw.loadData('Module:TechLister/Prereqs')
--endregion

--region Private constants
--endregion

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

--region Private methods
function fillPrereqs(projectID)
	if doneProjects[projectID] then
		-- This means this function has previously already filled the prereqs for this project.
		-- Nothing further needs to be done.
		return true
	elseif prereqTable[projectID] then 
		-- This means this function previously considered this project, yet did not fill the prereqs for it. 
		-- This is impossible without a loop in the project tree.
		mw.log("Attempt to build Project tree found a loop.")
		return false
	end	
	
	prereqTable[projectID] = {}
	for i = 0, 4 do
		local prereq = ProjectData[projectID]['prereqs/' .. i]
		if prereq and prereq ~= '' and prereq ~= 0 then
			-- Add this direct prereq as a prereq for projectID.
			prereqTable[projectID][prereq] = true
			if string.sub(prereq,1,7) == 'Project' then
				-- 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 techID.
				for rowID, b in pairs(prereqTable[prereq]) do
					prereqTable[projectID][rowID] = true
				end
			else
				-- Prereqs for Techs already calculated.
				-- Add every prereq of this direct prereq as a prereq for techID.
				for rowID, b in pairs(TechPrereqs[prereq]) do
					prereqTable[projectID][rowID] = true
				end
			end
		end
	end
	doneProjects[projectID] = true
	return true
end

function getPrereqTable()
	for rowID, row in pairs(ProjectData) do
		if not row['disable'] or row['disable'] ~= 'true' then
			if not fillPrereqs(rowID) then
				return {} -- Abort
			end
		end
	end
	return prereqTable
end

--endregion

--region Public methods
--endregion

return getPrereqTable()