Module:ClaimLister

From Terra Invicta Official Wiki

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

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

--region Dependencies
local IconModule = require('Module:Icon')
local RegionData = mw.loadData('Module:CSVReader/Region')
local NationData = mw.loadData('Module:CSVReader/Nation')
local ClaimData = mw.loadData('Module:CSVReader/Claim')

local RegionNameBuilder = require('Module:RegionLister/NameBuilder')
local NationNames = mw.loadData('Module:ENReader/Nation')
local ProjectNameBuilder = require('Module:ProjectLister/NameBuilder')
--endregion

--region Private constants
local floor = math.floor
local ssub = string.sub
local tinsert = table.insert
local tconcat = table.concat
--endregion

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

--region Private methods
--none
--endregion

--region Public methods
function ClaimLister.ListPresentNations()
	return ClaimLister.ListNations('2022')
end

function ClaimLister.List2026Nations()
	return ClaimLister.ListNations('2026')
end

function ClaimLister.ListFutureNations()
	return ClaimLister.ListNations('2070')
end

function ClaimLister.ListPresentRegions()
	return ClaimLister.ListRegions('2022')
end

function ClaimLister.List2026Regions()
	return ClaimLister.ListRegions('2026')
end

function ClaimLister.ListFutureRegions()
	return ClaimLister.ListRegions('2070')
end

---@param campaignYear The start year of the campaign to show nations for. Defaults to 2022 if not specified
---@return table
function ClaimLister.ListNations(campaignYear)
	if not campaignYear then
		campaignYear = '2022'
	end
	
	local returnString = '{| class="wikitable sortable mw-collapsible" style="text-align: center;"'
	returnString = returnString .. '\n|-'
	returnString = returnString .. '\n! Nation<br>Alternate Name'
	returnString = returnString .. '\n! Initially Owned' 
	returnString = returnString .. '\n! Initially Claimed'
	returnString = returnString .. '\n! Researchable Claims'
	
	returnString = returnString .. '\n|-'
	
	for rowID, row in pairs(NationData) do
		if ((string.sub(rowID,1,4) == campaignYear) or (campaignYear == '2022' and string.sub(rowID,1,2) ~= '20')) and rowID ~= 'ALN' then
			
			local initiallyOwned = {}
			local initiallyClaimed = {}
			local researchableClaims = {}
			local claimList = ClaimData[1][rowID]
			if claimList then
				for i, regionID in ipairs(claimList) do
					local regionString = ''
					if RegionData[regionID] then
						regionString = RegionNameBuilder.buildName({args={regionID, rowID}})
					else
						regionString = 'Error: Unknown Region: ' .. regionID
					end
					local projectID = ClaimData[3][rowID][regionID]['projectUnlockName'] or ''
					local projectName = ProjectNameBuilder.buildName({args={projectID}})
					if ClaimData[3][rowID][regionID]['initialOwner'] == 'true' then
						tinsert(initiallyOwned, regionString)
					elseif (projectID == '' or projectID == 'Project_AlienMasterProject') then
						tinsert(initiallyClaimed, regionString)
					elseif not researchableClaims[projectName] then
						researchableClaims[projectName] = {regionString}
					else
						tinsert(researchableClaims[projectName], regionString)
					end
				end
			end
			
			local unionFlag = ''
			if row['unionFlagResource'] and  row['unionFlagResource'] ~= '' then
				unionFlag = IconModule.Icon({args={ssub(rowID,-3) .. 'U',size='25px'}})
			end
			returnString = returnString .. '\n|' .. IconModule.Icon({args={ssub(rowID,-3),size='25px'}}) ..  '[[' .. ssub(rowID,-3) .. '|' .. (NationNames['TINationTemplate.displayName.' .. ssub(rowID,-3)] or rowID) .. ']]<br>' .. unionFlag .. (NationNames['TINationTemplate.unionDisplayName.' .. ssub(rowID,-3)] or '')
			
			returnString = returnString .. '\n| ' .. tconcat(initiallyOwned,' ● ')
			
			returnString = returnString .. '\n| ' .. tconcat(initiallyClaimed,' ● ')
			
			returnString = returnString .. '\n| '
			local subtableMade = false
			for p, c in pairs(researchableClaims) do
				if not subtableMade then
					returnString = returnString .. '\n {| class="wikitable" style="text-align: center;"'
					returnString = returnString .. '\n|-'
					returnString = returnString .. '\n! Project'
					returnString = returnString .. '\n! Claims' 
					returnString = returnString .. '\n|-'
					subtableMade = true
				end
				returnString = returnString .. '\n|' .. p
				returnString = returnString .. '\n|' .. tconcat(c,' ● ')
				returnString = returnString .. '\n|-'
			end
			if subtableMade then
				returnString = returnString .. '\n|}'
			end
	    	returnString = returnString .. '\n|-'
	    end
	end
	returnString = returnString .. '\n|}'
	return returnString
end


---@param campaignYear The start year of the campaign to show regions for. Defaults to 2022 if not specified
---@return table
function ClaimLister.ListRegions(campaignYear)
	if not campaignYear then
		campaignYear = '2022'
	end
	
	local returnString = '{| class="wikitable sortable mw-collapsible" style="text-align: center;"'
	returnString = returnString .. '\n|-'
	returnString = returnString .. '\n! Region'
	returnString = returnString .. '\n! Claim Type' 
	returnString = returnString .. '\n! Nation'
	returnString = returnString .. '\n! Hostile?'
	returnString = returnString .. '\n|-'
	
	for rowID, row in pairs(RegionData) do
		if ((string.sub(rowID,1,4) == campaignYear) or (campaignYear == '2022' and string.sub(rowID,1,2) ~= '20')) then
			
			local claimString = ''
			local claimCount = 0
			local claimList = ClaimData[2][rowID]
			if claimList then
				for i, nationID in ipairs(claimList) do
					local nationString = ''
					if NationData[nationID] and nationID ~= 'ALN' then
						claimCount = claimCount + 1
						nationString = NationNames['TINationTemplate.displayName.' .. nationID] or NationNames['TINationTemplate.displayName.' .. ssub(nationID,6)] or nationID
						nationString = '[[' .. ssub(nationID,-3) .. '|' .. nationString .. ']]'
						if ClaimData[3][nationID][rowID]['capitalClaim'] == 'true' then
							nationString = nationString .. IconModule.Icon({args={'capital', bgcolor='DarkSlateGray'}})
						end
						if ClaimData[3][nationID][rowID]['initialColony'] == 'true' then
							nationString = nationString .. IconModule.Icon({args={'colony', bgcolor='DarkSlateGray'}})
						end
						local projectID = ClaimData[3][nationID][rowID]['projectUnlockName'] or ''
						local projectName = ProjectNameBuilder.buildName({args={projectID}})
						if ClaimData[3][nationID][rowID]['initialOwner'] == 'true' then
							claimString = claimString .. '\n| Initial Owner'
						elseif (projectID == '' or projectID == 'Project_AlienMasterProject') then
							claimString = claimString .. '\n| Initial Claim'
						else
							claimString = claimString .. '\n|' .. projectName
						end
						claimString = claimString .. '\n|' .. nationString
						claimString = claimString .. '\n| ' 
						if ClaimData[3][nationID][rowID]['hostileClaim'] == 'true' then
							claimString = claimString .. 'style="color:red;" | Yes'
						end
						claimString = claimString .. '\n|-'
					end
				end
			end
			if claimCount == 0 then
				claimCount = 1
				claimString = '\n|Strangely, no nation claims this region!\n|-'
			end
			
			returnString = returnString .. '\n| rowspan = ' .. tostring(claimCount) .. ' | ' .. RegionNameBuilder.buildName({args={rowID}})
	
			returnString = returnString .. claimString
	    end
	end
	returnString = returnString .. '\n|}'
	return returnString
end

--endregion

return ClaimLister