Module:MissionLister/Modifier

From Terra Invicta Official Wiki

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

---
---Reads the data subpage and presents it as a row of a wiki table.
---Table format is Name, Condition(s), Value
---
---Note these modifier descriptions are HANDWRITTEN. There is no convenient JSON or EN file to refer to.  
---
---@module ModifierLister
local ModifierLister = {}

--region Dependencies
--local IconModule = require('Module:Icon')
local TVModule = require('Module:TV')

local ModifierData = mw.loadData('Module:MissionLister/Modifier/data')
local MissionData = mw.loadData('Module:CSVReader/Mission')

local StringReplaceModule = require('Module:StringReplace')
local sreplace = StringReplaceModule.replace
local slen = string.len
local sfind = string.find
local ssub = string.sub
--endregion

--region Private constants
--endregion



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

--region Private methods


--endregion

--region Public methods

---#param frame, which contains:
---- args[1]: The data name of the modifier.
---- args[2] and args[3]: Any additional values the modifier has.
---@return wiki row for the Modifier
function ModifierLister.ListModifier(frame)
	local modifierDataName = frame.args[1]
	local modifierValueA = frame.args[2]
	local modifierValueB = frame.args[3]
	
	if not modifierDataName then
		return 'ERROR: No modifier name specified for [[Module:MissionLister/Modifier|Modifier Lister Module]]'
	end
	modifierDataName = mw.text.trim(modifierDataName)
	if not ModifierData[modifierDataName] then
		return 'ERROR: Unknown modifier type ' .. modifierDataName .. ' for [[Module:MissionLister/Modifier|Modifier Lister Module]]'
	end
	
	local returnString = '\n|-\n' .. ModifierData[modifierDataName] .. '\n|-'
	if modifierValueA and modifierValueA ~= '' then
		returnString = sreplace(returnString, '{A}', modifierValueA)
	end
	if modifierValueB and modifierValueB ~= '' then
		returnString = sreplace(returnString, '{B}', modifierValueB)
	end
	return returnString
end

---@return wiki rows for all Modifiers
function ModifierLister.ListAllModifiers()
	local returnString = ''
	for rowID, row in pairs(ModifierData) do
		returnString = returnString .. '\n|-'
		returnString = returnString .. '\n' .. row
	end
	return returnString
end

---#param frame, which contains:
---- args[1]: The data name of the mission to show modifiers for.
---- args[2]: Whether to show attack or defense modifiers. true = Attack
---@return wiki rows for all attack or defense modifiers for one mission
function ModifierLister.ListModifiersForMission(frame)
	local missionDataName = frame.args[1]
	local showAttack = frame.args[2]
	if not missionDataName or missionDataName == '' then
		return "No Mission Specified"
	end
	missionDataName = mw.text.trim(missionDataName)
	if not MissionData[missionDataName] then
		return "ERROR: Unknown Mission Data Name " .. missionDataName
	end
	
	local returnString = ''
	local entryprefix = nil
	if showAttack == 'true' then
		entryprefix = 'resolutionMethod/attackingModifiers/'
	else
		entryprefix = 'resolutionMethod/defendingModifiers/'
	end
	for i = 0, 15 do
		local modifierDataName =  MissionData[missionDataName][entryprefix .. i .. '/$type']
		if not modifierDataName or modifierDataName == '' then
			-- No more modifiers, so break.
			break
		end
		local modifierValueA = nil
		if showAttack == 'true' then
			modifierValueA = MissionData[missionDataName][entryprefix .. i .. '/attackerAttribute']
		else 
			modifierValueA = MissionData[missionDataName][entryprefix .. i .. '/defenderAttribute']
		end
		if not modifierValueA or modifierValueA == '' then
			modifierValueA = MissionData[missionDataName][entryprefix .. i .. '/flatModifier']
		else
			modifierValueA = TVModule.TV({args={modifierValueA}})
		end
		returnString = returnString .. ModifierLister.ListModifier({args={modifierDataName,modifierValueA}})
	end
	
	return returnString
end

--endregion

return ModifierLister