Module:EffectLister/DescriptionBuilder

From Terra Invicta Official Wiki

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

-- This module builds a full description for an effect
-- Other modules should use this to describe effects consistently.

local p = {}

local IconModule = require('Module:Icon')
local EffectData = mw.loadData('Module:CSVReader/Effect')
local TraitData = mw.loadData('Module:CSVReader/Trait')

local EffectNames = mw.loadData('Module:ENReader/Effect')
local NarrativeEventNames = mw.loadData('Module:ENReader/NarrativeEvent')
local TraitNames = mw.loadData('Module:ENReader/Trait')
local RegionNames = mw.loadData('Module:ENReader/Region')
local MapRegionToRegion = mw.loadData('Module:RegionLister/MapRegions')

local sfind = string.find
local ssub = string.sub
local tinsert = table.insert
local tconcat = table.concat

-- Replaces ONE instance of the stringToReplace with replacementString in the fullString
local sreplace = function(fullString, stringToReplace, replacementString)
	local si, ei = sfind(fullString, stringToReplace, 1, true)
	if not si then
		return fullString
	end
	local prefix = ssub(fullString,1,si - 1)
	local suffix = ssub(fullString,ei+1)
	return prefix .. replacementString .. suffix
end

function p.buildDescription( frame )
	-- Read parameters
	--- [1] is Effect data name (mandatory)
	--- 
	local effectID = frame.args[1]
	if not effectID or not EffectData[effectID] then
		return 'No such Effect'	
	end
	local effectString = EffectNames['TIEffectTemplate.description.' .. effectID] or 'ERROR: No Description'
	if ssub(effectString,1,1) == '-' then
		effectString = ssub(effectString, 2)
	end
	local evalue = {}
	evalue[0] = EffectData[effectID]['value'] or 0
	evalue[1] = frame.args['primaryDisplay'] or 'Primary Target'
	evalue[2] = frame.args['secondaryDisplay'] or 'Secondary Target'
	evalue[3] = tostring((tonumber(EffectData[effectID]['value'] or 0) or 0) * 100) .. '%'
	evalue[4] = tostring(100 - (tonumber(EffectData[effectID]['value'] or 0) or 0) * 100) .. '%'
	evalue[5] = frame.args['inPrimaryNationDisplay'] or "in Primary Target's Nation"
	evalue[6] = frame.args['inSecondaryNationDisplay'] or "in Secondary Target's Nation"
	evalue[7] = EffectData[effectID]['duration_months'] or 0
	evalue[8] = tostring((tonumber(EffectData[effectID]['value'] or 0) or 0) * 100 - 100) .. '%'
	evalue[9] = frame.args['primaryNationDisplay'] or "Primary Target's Nation"
	evalue[10] = frame.args['primaryRegionDisplay'] or "Primary Target's Region"
	evalue[11] = frame.args['secondaryNationDisplay'] or "Secondary Target's Nation"
	evalue[12] = frame.args['secondaryRegionDisplay'] or "Secondary Target's Region"
	
	evalue[13] = EffectData[effectID]['strValue'] or 'ERROR'
	if MapRegionToRegion[evalue[13]] then
		evalue[13] = (RegionNames['TIRegionTemplate.displayName.' .. MapRegionToRegion[evalue[13]]] or 'Error: Region Not Found')
	end
	evalue[13] = NarrativeEventNames['TINarrativeEventTemplate.displayName.' .. evalue[13]] or evalue[13]
	evalue[13] = TraitNames['TITraitTemplate.displayName.' .. evalue[13]] or evalue[13]
	
	evalue[14] = frame.args['primaryFactionDisplay'] or "Primary Target's Faction"
	evalue[15] = frame.args['secondaryFactionDisplay'] or "Secondary Target's Faction"
	
	local traitList = {}
	for rowID, row in pairs(TraitData) do
		if row['grouping'] == evalue[0] then
			tinsert(traitList,TraitNames['TITraitTemplate.displayName.' .. rowID] or rowID)
		end
	end
	evalue[16] = tconcat(traitList, ', ')
	evalue[17] = 'Trait from Group ' .. evalue[0]
	evalue[18] = tostring(100 / (tonumber(EffectData[effectID]['value'] or 1) or 1) - 100) .. '%'
	evalue[19] = (tonumber(EffectData[effectID]['value'] or 0) or 0) * -1
	evalue[20] = EffectData[effectID]['strValue'] or 'ERROR' -- Councilor Attribute
	evalue[21] = evalue[14]
	evalue[22] = evalue[15]
	evalue[23] = evalue[0] .. ' (Pop Scaled)' -- By Primary Nation
	evalue[24] = evalue[0] .. ' (Pop Scaled)' -- By Secondary Nation
	evalue[25] = sreplace(tostring((tonumber(EffectData[effectID]['value'] or 0) or 0) * 100) .. '%', '-', '') -- Absolute value as %
	evalue[26] = 'Executive Nations for Primary Target'
	
	for i = 0, 26 do
		effectString = sreplace(effectString, '{' .. i .. '}', evalue[i])
		effectString = sreplace(effectString, '{' .. i .. '}', evalue[i])
	end
	effectString = sreplace(effectString, '<color=#FFFFFFFF><sprite name="water"></color>', IconModule.Icon({args={'water'}}))
	effectString = sreplace(effectString, '<color=#FFFFFFFF><sprite name="volatiles"></color>', IconModule.Icon({args={'volatiles'}}))
	effectString = sreplace(effectString, '<color=#FFFFFFFF><sprite name="metal"></color>', IconModule.Icon({args={'metals'}}))
	effectString = sreplace(effectString, '<color=#FFFFFFFF><sprite name="metal_noble"></color>', IconModule.Icon({args={'nobles'}}))
	effectString = sreplace(effectString, '<color=#FFFFFFFF><sprite name="radioactive"></color>', IconModule.Icon({args={'fissiles'}}))
	effectString = sreplace(effectString, '<color=#FFFFFFFF><sprite name="mission_control"></color>', IconModule.Icon({args={'mc'}}))
	
	return effectString
end

return p