Module:ProjectLister/Single

From Terra Invicta Official Wiki

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

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

--region Dependencies
local IconModule = require('Module:Icon')
local TVModule = require('Module:TV')
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 ObjectiveNames = mw.loadData('Module:ENReader/Objective')

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

local HabModuleLister = require('Module:HabModuleLister')
local OrgLister = require('Module:OrgLister')

local BatteryNames = mw.loadData('Module:ENReader/Battery')
local DriveNames = mw.loadData('Module:ENReader/Drive')
local GunNames = mw.loadData('Module:ENReader/Gun')
local HeatSinkNames = mw.loadData('Module:ENReader/HeatSink')
local LaserWeaponNames = mw.loadData('Module:ENReader/LaserWeapon')
local MagneticGunNames = mw.loadData('Module:ENReader/MagneticGun')
local MissileNames = mw.loadData('Module:ENReader/Missile')
local NationNames = mw.loadData('Module:ENReader/Nation')
local ParticleWeaponNames = mw.loadData('Module:ENReader/ParticleWeapon')
local PlasmaWeaponNames = mw.loadData('Module:ENReader/PlasmaWeapon')
local PowerPlantNames = mw.loadData('Module:ENReader/PowerPlant')
local RadiatorNames = mw.loadData('Module:ENReader/Radiator')
local RegionNames = mw.loadData('Module:ENReader/Region')
local ShipArmorNames = mw.loadData('Module:ENReader/ShipArmor')
local ShipHullNames = mw.loadData('Module:ENReader/ShipHull')
local UtilityModuleNames = mw.loadData('Module:ENReader/UtilityModule')

local BatteryProjects = mw.loadData('Module:BatteryLister/Projects')
local ClaimProjects = mw.loadData('Module:ClaimLister/Projects')
local DriveProjects = mw.loadData('Module:DriveLister/Projects')
local GunProjects = mw.loadData('Module:GunLister/Projects')
local HabModuleProjects = mw.loadData('Module:HabModuleLister/Projects')
local HeatSinkProjects = mw.loadData('Module:HeatSinkLister/Projects')
local LaserWeaponProjects = mw.loadData('Module:LaserWeaponLister/Projects')
local MagneticGunProjects = mw.loadData('Module:MagneticGunLister/Projects')
local MissileProjects = mw.loadData('Module:MissileLister/Projects')
local ParticleWeaponProjects = mw.loadData('Module:ParticleWeaponLister/Projects')
local PlasmaWeaponProjects = mw.loadData('Module:PlasmaWeaponLister/Projects')
local PowerPlantProjects = mw.loadData('Module:PowerPlantLister/Projects')
local RadiatorProjects = mw.loadData('Module:RadiatorLister/Projects')
local ShipArmorProjects = mw.loadData('Module:ShipArmorLister/Projects')
local ShipHullProjects = mw.loadData('Module:ShipHullLister/Projects')
local UtilityModuleProjects = mw.loadData('Module:UtilityModuleLister/Projects')

local EffectDescriptionBuilder = require('Module:EffectLister/DescriptionBuilder')
--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

---@param frame a set of arguments that includes:
----frame.args[1] the dataName of the project
----frame.args['notes'] any additional notes the output table should contain
---@return wiki table of details for that project
function ProjectLister.SingleProjectTable(frame)
	local ProjectID = frame.args[1]
    local ProjectNotes = frame.args['notes'] or ''
    
	local returnString = '{| class="wikitable" style="width: 100%;text-align:center;"'
	returnString = returnString .. '\n|-'
	returnString = returnString .. '\n! colspan=4 | <big><big><big>' .. (ProjectNames['TIProjectTemplate.displayName.' .. ProjectID] or ProjectID) .. '</big></big></big><br>' .. IconModule.Icon({args={ScienceCategories[ProjectData[ProjectID]['techCategory']], size='120px'}})
	returnString = returnString .. '\n|-'
	returnString = returnString .. '\n! colspan=4 | ' .. TVModule.TV({args={'research', ProjectData[ProjectID]['researchCost']}})
	returnString = returnString .. '\n|-'
	returnString = returnString .. '\n! colspan=4 | Summary'
	returnString = returnString .. '\n|-'
	returnString = returnString .. '\n| colspan=4 | ' .. (ProjectNames['TIProjectTemplate.summary.' .. ProjectID] or 'Error: Missing Summary')
	returnString = returnString .. '\n|-'
	if ProjectNames['TIProjectTemplate.description.' .. ProjectID] then
		returnString = returnString .. '\n! colspan=4 | Description'
		returnString = returnString .. '\n|-'
		returnString = returnString .. '\n| colspan=4 | ' .. ProjectNames['TIProjectTemplate.description.' .. ProjectID]
		returnString = returnString .. '\n|-'
	end
	
	if ProjectData[ProjectID]['repeatable'] and ProjectData[ProjectID]['repeatable'] == 'true' then
		returnString = returnString .. '\n! <big>Repeatable Project</big>'
		returnString = returnString .. '\n| colspan=3 | Can be researched an unlimited number of times, but research cost is multiplied by (1 + number of times researched).'
		returnString = returnString .. '\n|-'
	end
	
	if ProjectData[ProjectID]['oneTimeGlobally'] and ProjectData[ProjectID]['oneTimeGlobally'] == 'true' then
		returnString = returnString .. '\n! <big>Global Project</big>'
		returnString = returnString .. '\n| colspan=3 | Can be researched by only one faction. As soon as a faction researches this project, it is removed from all factions. Global projects usually give a global bonus (such as nation claims) that all factions can potentially benefit from, but may also have smaller bonuses that are only given to the faction that researches the project.'
		returnString = returnString .. '\n|-'
	end
	
	returnString = returnString .. '\n! rowspan=2| Base Unlock Chance'
	returnString = returnString .. '\n! colspan=3| Monthly Available Chance'
	returnString = returnString .. '\n|-'
	returnString = returnString .. '\n! Initial'
	returnString = returnString .. '\n! Monthly Increase'
	returnString = returnString .. '\n! Maximum'
	returnString = returnString .. '\n|-'
	returnString = returnString .. '\n| style="width:25%;" | ' .. ProjectData[ProjectID]['factionAvailableChance'] .. '%'
	returnString = returnString .. '\n| style="width:25%;" | ' .. ProjectData[ProjectID]['initialUnlockChance'] .. '%'
	returnString = returnString .. '\n| style="width:25%;" | ' .. ProjectData[ProjectID]['deltaUnlockChance'] .. '%'
	returnString = returnString .. '\n| style="width:25%;" | ' .. ProjectData[ProjectID]['maxUnlockChance'] .. '%'
	returnString = returnString .. '\n|-'
	
	returnString = returnString .. '\n! Available to Faction(s): '
	if not ProjectData[ProjectID]['factionPrereq/0'] or ProjectData[ProjectID]['factionPrereq/0'] == '' then
		returnString = returnString .. '\n| colspan=3 | All'
	else
		local councils = {}
		for i = 0, 5 do
			local freq = ProjectData[ProjectID]['factionPrereq/' .. i]
			if freq and freq ~= '' and freq ~= 0 then
				insert(councils, IconModule.Icon({args={CouncilIcons[freq]}}))
			end
		end
		returnString = returnString .. '\n| colspan=3 | ' .. concat(councils, '')
	end
	returnString = returnString .. '\n|-'
	
	returnString = returnString .. '\n! Guaranteed for Faction: '	
	local falways = ProjectData[ProjectID]['factionAlways']
	if not falways or falways == '' then
		returnString = returnString .. '\n| colspan=3 | '
	elseif falways == 'Random' then
		returnString = returnString .. '\n| colspan=3 | Random' 
	else
		returnString = returnString .. '\n| colspan=3 | ' .. IconModule.Icon({args={CouncilIcons[falways]}})
	end
	returnString = returnString .. '\n|-'	
	
	returnString = returnString .. '\n| colspan=4 | \n{| class="wikitable sortable mw-collapsible" style="width: 100%;text-align:center;"'
	returnString = returnString .. '\n|+ Full List of Prerequisites.'
	returnString = returnString .. '\n|-'
	returnString = returnString .. '\n! Name'
	returnString = returnString .. '\n! Type'
	returnString = returnString .. '\n! Cost'
	returnString = returnString .. '\n|-'
	for prereqID, _ in pairs(ProjectPrereqs[ProjectID]) do
		if string.sub(prereqID,1,7) == 'Project' then
			local prereqIDChance = ProjectData[prereqID]['factionAvailableChance']
			returnString = returnString .. '\n| (' .. prereqIDChance .. '%) [[' .. prereqID .. '|' .. (ProjectNames['TIProjectTemplate.displayName.' .. prereqID] or prereqID) .. ']]'
			returnString = returnString .. '\n| ' .. IconModule.Icon({args={ScienceCategories[ProjectData[prereqID]['techCategory']]}}) .. IconModule.Icon({args={'projects'}})
			returnString = returnString .. '\n| ' .. ProjectData[prereqID]['researchCost']
			returnString = returnString .. '\n|-'
		else
			returnString = returnString .. '\n| [[' .. prereqID .. '|' .. (TechNames['TITechTemplate.displayName.' .. prereqID] or prereqID) .. ']]'
			returnString = returnString .. '\n| ' .. IconModule.Icon({args={ScienceCategories[TechData[prereqID]['techCategory']]}})
			returnString = returnString .. '\n| ' .. TechData[prereqID]['researchCost']
			returnString = returnString .. '\n|-'
		end
	end
	returnString = returnString .. '\n|}'
	returnString = returnString .. '\n|-'
	
	local prereq0 = ProjectData[ProjectID]['prereqs/0']
	local altprereq = ProjectData[ProjectID]['altPrereq0']
	if altprereq and altprereq ~= '' then
		if string.sub(prereq0,1,7) == 'Project' then
			prereq0 = '[[' .. prereq0 .. '|' .. (ProjectNames['TIProjectTemplate.displayName.' .. prereq0] or prereq0) .. ']]'
		else
			prereq0 = '[[' .. prereq0 .. '|' .. TechNames['TITechTemplate.displayName.' .. prereq0] .. ']]'
		end
		if string.sub(altprereq,1,7) == 'Project' then
			altprereq = '[[' .. altprereq .. '|' .. (ProjectNames['TIProjectTemplate.displayName.' .. altprereq] or altprereq) .. ']]'
		else
			altprereq = '[[' .. altprereq .. '|' .. TechNames['TITechTemplate.displayName.' .. altprereq] .. ']]'
		end
		returnString = returnString .. '\n! Alt Prereq: ||  colspan=3 | Replace ' .. prereq0 .. '<br>With ' .. altprereq
		returnString = returnString .. '\n|-'
	end	
	
	local requiredObjectiveName = ProjectData[ProjectID]['requiredObjectiveName']
	local altRequiredObjectiveName = ProjectData[ProjectID]['altRequiredObjectiveName']
	if requiredObjectiveName and requiredObjectiveName ~= '' then
		returnString = returnString .. '\n! colspan=4 | Required Objective (only one needed)'
		returnString = returnString .. '\n|-'
		
		returnString = returnString .. '\n! ' .. IconModule.Icon({args={'destroy'}})
		returnString = returnString .. '\n| colspan=3 | ' 
		if ObjectiveNames['TIObjectiveTemplate.displayName.' .. requiredObjectiveName .. '.DestroyCouncil'] then
			returnString = returnString .. '[[' .. requiredObjectiveName .. '|' .. ObjectiveNames['TIObjectiveTemplate.displayName.' .. requiredObjectiveName .. '.DestroyCouncil'] .. ']]'
		end
		if altRequiredObjectiveName and altRequiredObjectiveName ~= '' and ObjectiveNames['TIObjectiveTemplate.displayName.' .. altRequiredObjectiveName .. '.DestroyCouncil'] then
			if ObjectiveNames['TIObjectiveTemplate.displayName.' .. requiredObjectiveName .. '.DestroyCouncil'] then
				returnString = returnString .. ' • '
			end
			returnString = returnString .. '[[' .. altRequiredObjectiveName .. '|' .. ObjectiveNames['TIObjectiveTemplate.displayName.' .. altRequiredObjectiveName .. '.DestroyCouncil'] .. ']]'
		end
		returnString = returnString .. '\n|-'
		
		returnString = returnString .. '\n! ' .. IconModule.Icon({args={'resist'}})
		returnString = returnString .. '\n| colspan=3 | ' 
		if ObjectiveNames['TIObjectiveTemplate.displayName.' .. requiredObjectiveName .. '.ResistCouncil'] then
			returnString = returnString .. '[[' .. requiredObjectiveName .. '|' .. ObjectiveNames['TIObjectiveTemplate.displayName.' .. requiredObjectiveName .. '.ResistCouncil'] .. ']]'
		end
		if altRequiredObjectiveName and altRequiredObjectiveName ~= '' and ObjectiveNames['TIObjectiveTemplate.displayName.' .. altRequiredObjectiveName .. '.ResistCouncil'] then
			if ObjectiveNames['TIObjectiveTemplate.displayName.' .. requiredObjectiveName .. '.ResistCouncil'] then
				returnString = returnString .. ' • '
			end
			returnString = returnString .. '[[' .. altRequiredObjectiveName .. '|' .. ObjectiveNames['TIObjectiveTemplate.displayName.' .. altRequiredObjectiveName .. '.ResistCouncil'] .. ']]'
		end
		returnString = returnString .. '\n|-'
		
		returnString = returnString .. '\n! ' .. IconModule.Icon({args={'escape'}})
		returnString = returnString .. '\n| colspan=3 | ' 
		if ObjectiveNames['TIObjectiveTemplate.displayName.' .. requiredObjectiveName .. '.EscapeCouncil'] then
			returnString = returnString .. '[[' .. requiredObjectiveName .. '|' .. ObjectiveNames['TIObjectiveTemplate.displayName.' .. requiredObjectiveName .. '.EscapeCouncil'] .. ']]'
		end
		if altRequiredObjectiveName and altRequiredObjectiveName ~= '' and ObjectiveNames['TIObjectiveTemplate.displayName.' .. altRequiredObjectiveName .. '.EscapeCouncil'] then
			if ObjectiveNames['TIObjectiveTemplate.displayName.' .. requiredObjectiveName .. '.EscapeCouncil'] then
				returnString = returnString .. ' • '
			end
			returnString = returnString .. '[[' .. altRequiredObjectiveName .. '|' .. ObjectiveNames['TIObjectiveTemplate.displayName.' .. altRequiredObjectiveName .. '.EscapeCouncil'] .. ']]'
		end
		returnString = returnString .. '\n|-'
		
		returnString = returnString .. '\n! ' .. IconModule.Icon({args={'exploit'}})
		returnString = returnString .. '\n| colspan=3 | ' 
		if ObjectiveNames['TIObjectiveTemplate.displayName.' .. requiredObjectiveName .. '.ExploitCouncil'] then
			returnString = returnString .. '[[' .. requiredObjectiveName .. '|' .. ObjectiveNames['TIObjectiveTemplate.displayName.' .. requiredObjectiveName .. '.ExploitCouncil'] .. ']]'
		end
		if altRequiredObjectiveName and altRequiredObjectiveName ~= '' and ObjectiveNames['TIObjectiveTemplate.displayName.' .. altRequiredObjectiveName .. '.ExploitCouncil'] then
			if ObjectiveNames['TIObjectiveTemplate.displayName.' .. requiredObjectiveName .. '.ExploitCouncil'] then
				returnString = returnString .. ' • '
			end
			returnString = returnString .. '[[' .. altRequiredObjectiveName .. '|' .. ObjectiveNames['TIObjectiveTemplate.displayName.' .. altRequiredObjectiveName .. '.ExploitCouncil'] .. ']]'
		end
		returnString = returnString .. '\n|-'
		
		returnString = returnString .. '\n! ' .. IconModule.Icon({args={'cooperate'}})
		returnString = returnString .. '\n| colspan=3 | ' 
		if ObjectiveNames['TIObjectiveTemplate.displayName.' .. requiredObjectiveName .. '.CooperateCouncil'] then
			returnString = returnString .. '[[' .. requiredObjectiveName .. '|' .. ObjectiveNames['TIObjectiveTemplate.displayName.' .. requiredObjectiveName .. '.CooperateCouncil'] .. ']]'
		end
		if altRequiredObjectiveName and altRequiredObjectiveName ~= '' and ObjectiveNames['TIObjectiveTemplate.displayName.' .. altRequiredObjectiveName .. '.CooperateCouncil'] then
			if ObjectiveNames['TIObjectiveTemplate.displayName.' .. requiredObjectiveName .. '.CooperateCouncil'] then
				returnString = returnString .. ' • '
			end
			returnString = returnString .. '[[' .. altRequiredObjectiveName .. '|' .. ObjectiveNames['TIObjectiveTemplate.displayName.' .. altRequiredObjectiveName .. '.CooperateCouncil'] .. ']]'
		end
		returnString = returnString .. '\n|-'
		
		returnString = returnString .. '\n! ' .. IconModule.Icon({args={'appease'}})
		returnString = returnString .. '\n| colspan=3 | ' 
		if ObjectiveNames['TIObjectiveTemplate.displayName.' .. requiredObjectiveName .. '.AppeaseCouncil'] then
			returnString = returnString .. '[[' .. requiredObjectiveName .. '|' .. ObjectiveNames['TIObjectiveTemplate.displayName.' .. requiredObjectiveName .. '.AppeaseCouncil'] .. ']]'
		end
		if altRequiredObjectiveName and altRequiredObjectiveName ~= '' and ObjectiveNames['TIObjectiveTemplate.displayName.' .. altRequiredObjectiveName .. '.AppeaseCouncil'] then
			if ObjectiveNames['TIObjectiveTemplate.displayName.' .. requiredObjectiveName .. '.AppeaseCouncil'] then
				returnString = returnString .. ' • '
			end
			returnString = returnString .. '[[' .. altRequiredObjectiveName .. '|' .. ObjectiveNames['TIObjectiveTemplate.displayName.' .. altRequiredObjectiveName .. '.AppeaseCouncil'] .. ']]'
		end
		returnString = returnString .. '\n|-'
		
		returnString = returnString .. '\n! ' .. IconModule.Icon({args={'submit'}})
		returnString = returnString .. '\n| colspan=3 | ' 
		if ObjectiveNames['TIObjectiveTemplate.displayName.' .. requiredObjectiveName .. '.SubmitCouncil'] then
			returnString = returnString .. '[[' .. requiredObjectiveName .. '|' .. ObjectiveNames['TIObjectiveTemplate.displayName.' .. requiredObjectiveName .. '.SubmitCouncil'] .. ']]'
		end
		if altRequiredObjectiveName and altRequiredObjectiveName ~= '' and ObjectiveNames['TIObjectiveTemplate.displayName.' .. altRequiredObjectiveName .. '.SubmitCouncil'] then
			if ObjectiveNames['TIObjectiveTemplate.displayName.' .. requiredObjectiveName .. '.SubmitCouncil'] then
				returnString = returnString .. ' • '
			end
			returnString = returnString .. '[[' .. altRequiredObjectiveName .. '|' .. ObjectiveNames['TIObjectiveTemplate.displayName.' .. altRequiredObjectiveName .. '.SubmitCouncil'] .. ']]'
		end
		returnString = returnString .. '\n|-'
	end
	
	local requiredMilestone = ProjectData[ProjectID]['requiredMilestone']
	if requiredMilestone and requiredMilestone ~= '' then
		returnString = returnString .. '\n! colspan=4 | Required Milestone'
		returnString = returnString .. '\n|-'
		returnString = returnString .. '\n| colspan=4 | ' .. (ObjectiveNames['TIObjectiveTemplate.MilestoneFulfilled.' .. requiredMilestone] or requiredMilestone)
		returnString = returnString .. '\n|-'
	end
	
	returnString = returnString .. '\n! colspan=4 | <big>Total ' .. TVModule.TV({args={'research'}}) .. ' Cost</big><br>(Including itself)<br>(Does not consider Alt Prereqs)' 
	returnString = returnString .. '\n|-'
	returnString = returnString .. '\n!' .. 'Category'
	returnString = returnString .. '\n!' .. 'From Projects'
	returnString = returnString .. '\n!' .. 'From Techs'
	returnString = returnString .. '\n!' .. 'Category Subtotal'
	returnString = returnString .. '\n|-'
	returnString = returnString .. '\n!' .. IconModule.Icon({args={'energy'}})
	returnString = returnString .. '\n|' .. ProjectCosts[ProjectID]['energyProject']
	returnString = returnString .. '\n|' .. ProjectCosts[ProjectID]['energyTech']
	returnString = returnString .. '\n|' .. ProjectCosts[ProjectID]['energyTotal']
	returnString = returnString .. '\n|-'
	returnString = returnString .. '\n!' .. IconModule.Icon({args={'information'}})
	returnString = returnString .. '\n|' .. ProjectCosts[ProjectID]['informationProject']
	returnString = returnString .. '\n|' .. ProjectCosts[ProjectID]['informationTech']
	returnString = returnString .. '\n|' .. ProjectCosts[ProjectID]['informationTotal']
	returnString = returnString .. '\n|-'
	returnString = returnString .. '\n!' .. IconModule.Icon({args={'life'}})
	returnString = returnString .. '\n|' .. ProjectCosts[ProjectID]['lifeProject']
	returnString = returnString .. '\n|' .. ProjectCosts[ProjectID]['lifeTech']
	returnString = returnString .. '\n|' .. ProjectCosts[ProjectID]['lifeTotal']
	returnString = returnString .. '\n|-'
	returnString = returnString .. '\n!' .. IconModule.Icon({args={'material'}})
	returnString = returnString .. '\n|' .. ProjectCosts[ProjectID]['materialProject']
	returnString = returnString .. '\n|' .. ProjectCosts[ProjectID]['materialTech']
	returnString = returnString .. '\n|' .. ProjectCosts[ProjectID]['materialTotal']
	returnString = returnString .. '\n|-'
	returnString = returnString .. '\n!' .. IconModule.Icon({args={'military'}})
	returnString = returnString .. '\n|' .. ProjectCosts[ProjectID]['militaryProject']
	returnString = returnString .. '\n|' .. ProjectCosts[ProjectID]['militaryTech']
	returnString = returnString .. '\n|' .. ProjectCosts[ProjectID]['militaryTotal']
	returnString = returnString .. '\n|-'
	returnString = returnString .. '\n!' .. IconModule.Icon({args={'social'}})
	returnString = returnString .. '\n|' .. ProjectCosts[ProjectID]['socialProject']
	returnString = returnString .. '\n|' .. ProjectCosts[ProjectID]['socialTech']
	returnString = returnString .. '\n|' .. ProjectCosts[ProjectID]['socialTotal']
	returnString = returnString .. '\n|-'
	returnString = returnString .. '\n!' .. IconModule.Icon({args={'space'}})
	returnString = returnString .. '\n|' .. ProjectCosts[ProjectID]['spaceProject']
	returnString = returnString .. '\n|' .. ProjectCosts[ProjectID]['spaceTech']
	returnString = returnString .. '\n|' .. ProjectCosts[ProjectID]['spaceTotal']
	returnString = returnString .. '\n|-'
	returnString = returnString .. '\n!' .. IconModule.Icon({args={'xenology'}})
	returnString = returnString .. '\n|' .. ProjectCosts[ProjectID]['xenologyProject']
	returnString = returnString .. '\n|' 
	returnString = returnString .. '\n|' .. ProjectCosts[ProjectID]['xenologyTotal']
	returnString = returnString .. '\n|-'
	returnString = returnString .. '\n! Total'
	returnString = returnString .. '\n|' .. ProjectCosts[ProjectID]['totalProject']
	returnString = returnString .. '\n|' .. ProjectCosts[ProjectID]['totalTech']
	returnString = returnString .. '\n|' .. ProjectCosts[ProjectID]['total']
	returnString = returnString .. '\n|-'
	
	if ProjectProjects[ProjectID] then
		returnString = returnString .. '\n! colspan=4 | Direct Prerequisite For Projects:'
		returnString = returnString .. '\n|-'
		local projectprojects = {}
		for projectprojectID, _ in pairs(ProjectProjects[ProjectID]) do
			insert(projectprojects, '[[' .. projectprojectID .. '|' .. (ProjectNames['TIProjectTemplate.displayName.' .. projectprojectID] or projectprojectID) .. ']]')
		end
		returnString = returnString .. '\n| colspan=4 | ' .. concat(projectprojects, ' • ')
		returnString = returnString .. '\n|-'
	end
	
	returnString = returnString .. '\n! colspan=4| <big>Effects</big>'
	returnString = returnString .. '\n|-'
		
	if ProjectData[ProjectID]['effects/0'] and ProjectData[ProjectID]['effects/0'] ~= '' and ProjectData[ProjectID]['effects/0'] ~= 0 then
		for i = 0, 3 do
			local peffect = ProjectData[ProjectID]['effects/' .. i]
			if peffect and peffect ~= '' and peffect ~= 0 then
				effectDescription = EffectDescriptionBuilder.buildDescription({args={peffect,primaryDisplay='Researching Faction'}})
				if effectDescription and effectDescription ~= '' and effectDescription ~= 'ERROR: No Description' then
					returnString = returnString .. '\n| colspan=4| ' .. effectDescription
				else
					returnString = returnString .. '\n| colspan=4| ' .. peffect
				end
				returnString = returnString .. '\n|-'
			end
		end
	end
	
	local projectOrg = ProjectData[ProjectID]['orgGranted']
	if projectOrg and projectOrg ~= '' and projectOrg ~= 0 then
		returnString = returnString .. '\n! colspan=4 | Creates [[Orgs|Org]]: \n|-'
		returnString = returnString .. '\n| colspan=4 | \n' .. OrgLister.ListRestrictedOrgs({args = {'Match,dataName,' .. projectOrg}})
		returnString = returnString .. '\n|-'
	end
	
	local projectResourceType = ProjectData[ProjectID]['resourcesGranted/0/resource']
	if projectResourceType and projectResourceType ~= '' and projectResourceType ~= 0 then
		returnString = returnString .. '\n! Gives [[Resources|Resource]]:'
		returnString = returnString .. '\n| colspan=3 | ' .. TVModule.TV({args={projectResourceType, ProjectData[ProjectID]['resourcesGranted/0/value'], 'true'}})
		returnString = returnString .. '\n|-'
	end
	
	local unlockItems = BatteryProjects[ProjectID]
	local uitems = {}
	if unlockItems and unlockItems ~= {} then
		returnString = returnString .. '\n! Unlocks [[Spaceships#Battery|Batteries]]:'
		for unlock, _ in pairs(unlockItems) do
			insert(uitems, BatteryNames['TIBatteryTemplate.displayName.' .. unlock] or unlock)
		end
		returnString = returnString .. '\n| colspan=3 | ' .. concat(uitems, ' • ')
		returnString = returnString .. '\n|-'
	end
	
	unlockItems = ClaimProjects[ProjectID]
	uitems = {}
	if unlockItems and unlockItems ~= {} then
		returnString = returnString .. '\n! Unlocks [[Foreign_Relations#Claims|Claim(s)]]:'
		for unlock, _ in pairs(unlockItems) do
			insert(uitems, '[[' .. BilateralData[unlock]['nation1'] .. '|' .. (NationNames['TINationTemplate.displayName.' .. BilateralData[unlock]['nation1']] or BilateralData[unlock]['nation1']) .. ']] gains a claim on ' .. (RegionNames['TIRegionTemplate.displayName.' .. BilateralData[unlock]['region1']] or BilateralData[unlock]['region1']))
		end
		returnString = returnString .. '\n| colspan=3 | ' .. concat(uitems, ' • ')
		returnString = returnString .. '\n|-'
	end
	
	unlockItems = DriveProjects[ProjectID]
	uitems = {}
	if unlockItems and unlockItems ~= {} then
		returnString = returnString .. '\n! Unlocks [[Spaceships#Drive|Drive(s)]]:'
		for unlock, _ in pairs(unlockItems) do
			insert(uitems, DriveNames['TIDriveTemplate.displayName.' .. unlock] or unlock)
		end
		returnString = returnString .. '\n| colspan=3 | ' .. concat(uitems, ' • ')
		returnString = returnString .. '\n|-'
	end
	
	unlockItems = GunProjects[ProjectID]
	uitems = {}
	if unlockItems and unlockItems ~= {} then
		returnString = returnString .. '\n! Unlocks [[Spaceships#Guns|Naval Gun(s)]]:'
		for unlock, _ in pairs(unlockItems) do
			insert(uitems, GunNames['TIGunTemplate.displayName.' .. unlock] or unlock)
		end
		returnString = returnString .. '\n| colspan=3 | ' .. concat(uitems, ' • ')
		returnString = returnString .. '\n|-'
	end
	
	unlockItems = HabModuleProjects[ProjectID]
	uitems = {}
	if unlockItems and unlockItems ~= {} then
		returnString = returnString .. '\n! colspan=4 | Unlocks [[Habs|Hab Module(s)]]: \n|-'
		for unlock, _ in pairs(unlockItems) do
			insert(uitems, unlock)
		end
		returnString = returnString .. '\n| colspan=4 | \n' .. HabModuleLister.ListHabModules({'Match Any,dataName,' .. concat(uitems, ',')}) 
		returnString = returnString .. '\n|-'
	end
	
	unlockItems = HeatSinkProjects[ProjectID]
	uitems = {}
	if unlockItems and unlockItems ~= {} then
		returnString = returnString .. '\n! Unlocks [[Spaceships#Heat Sink|Heat Sink(s)]]:'
		for unlock, _ in pairs(unlockItems) do
			insert(uitems, HeatSinkNames['TIHeatSinkTemplate.displayName.' .. unlock] or unlock)
		end
		returnString = returnString .. '\n| colspan=3 | ' .. concat(uitems, ' • ')
		returnString = returnString .. '\n|-'
	end
	
	unlockItems = LaserWeaponProjects[ProjectID]
	uitems = {}
	if unlockItems and unlockItems ~= {} then
		returnString = returnString .. '\n! Unlocks [[Spaceships#Lasers|Laser(s)]]:'
		for unlock, _ in pairs(unlockItems) do
			insert(uitems, LaserWeaponNames['TILaserWeaponTemplate.displayName.' .. unlock] or unlock)
		end
		returnString = returnString .. '\n| colspan=3 | ' .. concat(uitems, ' • ')
		returnString = returnString .. '\n|-'
	end

	unlockItems = MagneticGunProjects[ProjectID]
	uitems = {}
	if unlockItems and unlockItems ~= {} then
		returnString = returnString .. '\n! Unlocks [[Spaceships#Magnetic Weapons|Magnetic Gun(s)]]:'
		for unlock, _ in pairs(unlockItems) do
			insert(uitems, MagneticGunNames['TIMagneticGunTemplate.displayName.' .. unlock] or unlock)
		end
		returnString = returnString .. '\n| colspan=3 | ' .. concat(uitems, ' • ')
		returnString = returnString .. '\n|-'
	end
	
	unlockItems = MissileProjects[ProjectID]
	uitems = {}
	if unlockItems and unlockItems ~= {} then
		returnString = returnString .. '\n! Unlocks [[Spaceships#Missiles|Missile(s)]]:'
		for unlock, _ in pairs(unlockItems) do
			insert(uitems, MissileNames['TIMissileTemplate.displayName.' .. unlock] or unlock)
		end
		returnString = returnString .. '\n| colspan=3 | ' .. concat(uitems, ' • ')
		returnString = returnString .. '\n|-'
	end

	unlockItems = ParticleWeaponProjects[ProjectID]
	uitems = {}
	if unlockItems and unlockItems ~= {} then
		returnString = returnString .. '\n! Unlocks [[Spaceships#Particle Weapons|Particle Weapon(s)]]:'
		for unlock, _ in pairs(unlockItems) do
			insert(uitems, ParticleWeaponNames['TIParticleWeaponTemplate.displayName.' .. unlock] or unlock)
		end
		returnString = returnString .. '\n| colspan=3 | ' .. concat(uitems, ' • ')
		returnString = returnString .. '\n|-'
	end
	
	unlockItems = PlasmaWeaponProjects[ProjectID]
	uitems = {}
	if unlockItems and unlockItems ~= {} then
		returnString = returnString .. '\n! Unlocks [[Spaceships#Plasma Weapons|Plasma Weapon(s)]]:'
		for unlock, _ in pairs(unlockItems) do
			insert(uitems, PlasmaWeaponNames['TIPlasmaWeaponTemplate.displayName.' .. unlock] or unlock)
		end
		returnString = returnString .. '\n| colspan=3 | ' .. concat(uitems, ' • ')
		returnString = returnString .. '\n|-'
	end
	
	unlockItems = PowerPlantProjects[ProjectID]
	uitems = {}
	if unlockItems and unlockItems ~= {} then
		returnString = returnString .. '\n! Unlocks [[Spaceships#Power Plant|Power Plant(s)]]:'
		for unlock, _ in pairs(unlockItems) do
			insert(uitems, PowerPlantNames['TIPowerPlantTemplate.displayName.' .. unlock] or unlock)
		end
		returnString = returnString .. '\n| colspan=3 | ' .. concat(uitems, ' • ')
		returnString = returnString .. '\n|-'
	end	
	
	unlockItems = RadiatorProjects[ProjectID]
	uitems = {}
	if unlockItems and unlockItems ~= {} then
		returnString = returnString .. '\n! Unlocks [[Spaceships#Radiator|Radiator(s)]]:'
		for unlock, _ in pairs(unlockItems) do
			insert(uitems, RadiatorNames['TIRadiatorTemplate.displayName.' .. unlock] or unlock)
		end
		returnString = returnString .. '\n| colspan=3 | ' .. concat(uitems, ' • ')
		returnString = returnString .. '\n|-'
	end	
	
	unlockItems = ShipArmorProjects[ProjectID]
	uitems = {}
	if unlockItems and unlockItems ~= {} then
		returnString = returnString .. '\n! Unlocks [[Spaceships#Armor|Ship Armor(s)]]:'
		for unlock, _ in pairs(unlockItems) do
			insert(uitems, ShipArmorNames['TIShipArmorTemplate.displayName.' .. unlock] or unlock)
		end
		returnString = returnString .. '\n| colspan=3 | ' .. concat(uitems, ' • ')
		returnString = returnString .. '\n|-'
	end	
	
	unlockItems = ShipHullProjects[ProjectID]
	uitems = {}
	if unlockItems and unlockItems ~= {} then
		returnString = returnString .. '\n! Unlocks [[Spaceships#Hull|Ship Hull(s)]]:'
		for unlock, _ in pairs(unlockItems) do
			insert(uitems, ShipHullNames['TIShipHullTemplate.displayName.' .. unlock] or unlock)
		end
		returnString = returnString .. '\n| colspan=3 | ' .. concat(uitems, ' • ')
		returnString = returnString .. '\n|-'
	end	
	
	unlockItems = UtilityModuleProjects[ProjectID]
	uitems = {}
	if unlockItems and unlockItems ~= {} then
		returnString = returnString .. '\n! Unlocks [[Spaceships#Utility Modules|Utility Modules]]:'
		for unlock, _ in pairs(unlockItems) do
			insert(uitems, UtilityModuleNames['TIUtilityModuleTemplate.displayName.' .. unlock] or unlock)
		end
		returnString = returnString .. '\n| colspan=3 | ' .. concat(uitems, ' • ')
		returnString = returnString .. '\n|-'
	end	
	
	returnString = returnString .. '\n! colspan=4 | Notes'
	returnString = returnString .. '\n|-'
	returnString = returnString .. '\n| colspan=4 | ' .. ProjectNotes
	returnString = returnString .. '\n|-'
	returnString = returnString .. '\n! colspan=4 | Data Sources'
	returnString = returnString .. '\n|-'
	returnString = returnString .. '\n| colspan=4 | [[TIProjectTemplate_CSV]] • [[TIProjectTemplate_EN]] • [[TITechTemplate_CSV]] • [[TITechTemplate_EN]] • [[TIBatteryTemplate_CSV]] • [[TIBatteryTemplate_EN]] • [[TIBilateralTemplate_CSV]] • [[TIDriveTemplate_CSV]] • [[TIDriveTemplate_EN]] • [[TIGunTemplate_CSV]] • [[TIGunTemplate_EN]] • [[TIHabModuleTemplate_CSV]] • [[TIHabModuleTemplate_EN]] • [[TIHeatSinkTemplate_CSV]] • [[TIHeatSinkTemplate_EN]] • [[TILaserWeaponTemplate_CSV]] • [[TILaserWeaponTemplate_EN]] • [[TIMagneticGunTemplate_CSV]] • [[TIMagneticGunTemplate_EN]] • [[TIMissileTemplate_CSV]] • [[TIMissileTemplate_EN]] • [[TINationTemplate_EN]] • [[TIOrgTemplate_CSV]] • [[TIOrgTemplate_EN]] • [[TIParticleWeaponTemplate_CSV]] • [[TIParticleWeaponTemplate_EN]] • [[TIPlasmaWeaponTemplate_CSV]] • [[TIPlasmaWeaponTemplate_EN]] • [[TIPowerPlantTemplate_CSV]] • [[TIPowerPlantTemplate_EN]] • [[TIRadiatorTemplate_CSV]] • [[TIRadiatorTemplate_EN]] • [[TIRegionTemplate_EN]] • [[TIShipArmorTemplate_CSV]] • [[TIShipArmorTemplate_EN]] • [[TIShipHullTemplate_CSV]] • [[TIShipHullTemplate_EN]] • [[TIUtilityModuleTemplate_CSV]] • [[TIUtilityModuleTemplate_EN]]'
	returnString = returnString .. '\n|-'
	returnString = returnString .. '\n! colspan=4 | Related Pages'
	returnString = returnString .. '\n|-'
	returnString = returnString .. '\n| colspan=4 | [[Tech List]] • [[Project List]] • [[Technology]]'
	returnString = returnString .. '\n|-'
	
	returnString = returnString .. '\n|}'

	return returnString
end

--endregion

return ProjectLister