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


