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()


