Module:ProjectLister/Faction

From Terra Invicta Official Wiki

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

---
---Reads the Project data files and presents them in readable formats, with additional calculated statistics, for a specific faction
---
---@module ProjectLister
local ProjectLister = {}

--region Dependencies
local IconModule = require('Module:Icon')
local ProjectData = mw.loadData('Module:CSVReader/Project')
local TechData = mw.loadData('Module:CSVReader/Tech')
local BilateralData = mw.loadData('Module:CSVReader/Bilateral')

local ProjectNames = mw.loadData('Module:ENReader/Project')
local TechNames = mw.loadData('Module:ENReader/Tech')

local ProjectPrereqs = mw.loadData('Module:ProjectLister/Prereqs')
local ProjectCosts = mw.loadData('Module:ProjectLister/Costs')
local ProjectProjects = mw.loadData('Module:ProjectLister/Projects')

--endregion

--region Private constants
local insert = table.insert
local concat = table.concat
local floor = math.floor
local sfind = string.find
local ssub = string.sub
local ScienceCategories = {
	Energy = 'energy',
	InformationScience='information',
	LifeScience='life',
	Materials='material',
	MilitaryScience='military',
	SocialScience='social',
	SpaceScience='space',
	Xenology='xenology'
}
local CouncilIcons = {
	DestroyCouncil='destroy',
	ResistCouncil='resist',
	EscapeCouncil='escape',
	ExploitCouncil='exploit',
	CooperateCouncil='cooperate',
	AppeaseCouncil='appease',
	SubmitCouncil='submit',
	AlienCouncil='alien'
}
--endregion



--region Private member variables
--none
--endregion

--region Private methods
--endregion

--region Public methods
function ProjectLister.ListDestroyProjects()
	return ProjectLister.ListFactionProjects('DestroyCouncil')
end
function ProjectLister.ListResistProjects()
	return ProjectLister.ListFactionProjects('ResistCouncil')
end
function ProjectLister.ListEscapeProjects()
	return ProjectLister.ListFactionProjects('EscapeCouncil')
end
function ProjectLister.ListExploitProjects()
	return ProjectLister.ListFactionProjects('ExploitCouncil')
end
function ProjectLister.ListCooperateProjects()
	return ProjectLister.ListFactionProjects('CooperateCouncil')
end
function ProjectLister.ListAppeaseProjects()
	return ProjectLister.ListFactionProjects('AppeaseCouncil')
end
function ProjectLister.ListSubmitProjects()
	return ProjectLister.ListFactionProjects('SubmitCouncil')
end

---@param faction string indicating which faction to show projects for. 
---Use the ideology + 'Council', e.g. Humanity first = DestroyCouncil
---@return wiki table of Projects
function ProjectLister.ListFactionProjects(faction)
	local returnString = '{| class="wikitable sortable mw-collapsible" style="text-align: center;"'
	returnString = returnString .. '\n|-'
	returnString = returnString .. '\n! Project'
	returnString = returnString .. '\n! Type'
	returnString = returnString .. '\n! Research<br>Cost'
	returnString = returnString .. '\n! Full<br>Cost'
	returnString = returnString .. '\n! Base Unlock Chance'
	returnString = returnString .. '\n! Available To:'
	returnString = returnString .. '\n! Guaranteed Unlock for:'
	returnString = returnString .. '\n|-'
	
	for rowID, row in pairs(ProjectData) do
		if (not row['disable'] or row['disable'] ~= 'true') and row['factionPrereq/0'] ~= 'AlienCouncil' and (row['factionPrereq/0'] == faction or row['factionPrereq/1'] == faction or row['factionPrereq/2'] == faction or row['factionPrereq/3'] == faction or row['factionPrereq/4'] == faction or row['factionPrereq/5'] == faction or row['factionAlways'] == faction) then
			returnString = returnString .. '\n| [[' .. rowID .. '|' .. (ProjectNames['TIProjectTemplate.displayName.' .. rowID] or rowID) .. ']]'
			returnString = returnString .. '\n| ' .. IconModule.Icon({args={ScienceCategories[row['techCategory']]}})
			returnString = returnString .. '\n| ' .. row['researchCost']
			returnString = returnString .. '\n| ' .. tostring(ProjectCosts[rowID]['total'])
			returnString = returnString .. '\n| ' .. row['factionAvailableChance'] .. '%'
			
			if not row['factionPrereq/0'] or row['factionPrereq/0'] == '' then
				returnString = returnString .. '\n| All'
			else
				local councils = {}
				for i = 0, 5 do
					local freq = row['factionPrereq/' .. i]
					if freq and freq ~= '' and freq ~= 0 then
						insert(councils, IconModule.Icon({args={CouncilIcons[freq]}}))
					end
				end
				returnString = returnString .. '\n| ' .. concat(councils, '')
			end
			
			local falways = row['factionAlways']
			if not falways or falways == '' then
				returnString = returnString .. '\n| '
			elseif falways == 'Random' then
				returnString = returnString .. '\n| Random' 
			else
				returnString = returnString .. '\n| ' .. IconModule.Icon({args={CouncilIcons[falways]}})
			end
			
			returnString = returnString .. '\n|-'
		end
	end
	returnString = returnString .. '\n|}'
	
	return returnString
end

--endregion

return ProjectLister