WARFRAME Wiki
Advertisement
WARFRAME Wiki


Warframes retrieves and stores Warframe data of WARFRAME.

On this Wiki, Warframes is used in:

Usage

Direct Invocation

{{#invoke:Warframes|function|input1|input2|...}}

Module

local Warframe = require('Module:Warframes')

local function func(input)
    return Warframe.getWarframe(input)
end

Product Backlog

Name Type Status Priority Assignee Description Date Issued Last Update
Remove the need for Portrait key Refactor/Dev/Edit New Low
  • Keep only one key related to Warframe images (e.g. Image) and have it set to the name of the image file of the full portrait Warframe.
  • Remove Portrait key.
  • Use CSS to crop full portrait image to around 50% of the height from the top in order to use in Template:WarframeNavVisual.
    • This is done instead of saving a separate file that already crops the image to a half-body portrait.
06:46, 6 December 2021 (UTC)

Documentation

Package items

warframes._getWarframes(validateFunction, ignoreSpecialWarframes, useConclaveData) (function)
Returns a subset of Warframe entries as stored in /data or /Conclave/data.
Parameters:
  • validateFunction Function to filter data by that returns a boolean value (function)
  • ignoreSpecialWarframes If true, ignores special Warframes like Sevagoth's Shadow or Excalibur Umbra Prime (boolean; optional)
  • useConclaveData If true, uses /Conclave/data, otherwise uses /data (boolean; optional)
Returns: List of Warframe entries (table)
warframes._getConclaveWarframes(validateFunction) (function)
Same as p. _getWarframes, but uses /Conclave/data.
Parameter: validateFunction Function to filter data by that returns a boolean value (function)
Returns: List of Warframe entries (table)
warframes._linkList(wfs, doTooltip) (function)
Lists each warframe as Tooltip(frame). .' ('..Tooltip(frame..' Prime')..')' or ''..frame..' ('..frame..' Prime)'
Parameters:
  • wfs List of Warframes entries as seen in /data (table)
  • doTooltip If true, Warframe names will have tooltips, otherwise they will be normal article links (boolean)
Returns: Resultant list of formatted Warframe name strings (table)
warframes.nav(frame) (function)
Builds a wikitable row to list all Warframes as used on Template:WarframeNav
Parameter: frame Frame object (table)
Returns: Resultant wikitext of wikitable row (string)
warframes.buildWarframeVisualNav(frame) (function)
Builds visual navigation bar for Warframes as seen on Template:WarframeNavVisual.
Parameter: frame Frame object (table)
Returns: Resultant wikitext of navigation bar (string)
warframes.getWarframeComparisonTable(frame) (function)
Builds a Warframe comparison wikitable of rank 0 stats as seen on Warframes Comparison/Stats.
Parameter: frame Frame object (table)
Returns: Resultant wikitext of wikitable (string)
warframes.getWarframeRank30ComparisonTable(frame) (function)
Builds a Warframe comparison wikitable of rank 30 stats as seen on Warframes Comparison/Stats.
Parameter: frame Frame object (table)
Returns: Resultant wikitext of wikitable (string)
warframes.getConclaveWarframeComparisonTable(frame) (function)
Builds a Warframe comparison wikitable of rank 0 PvP stats.
Parameter: frame Frame object (table)
Returns: Resultant wikitext of wikitable (string)
warframes.getConclaveWarframeRank30ComparisonTable(frame) (function)
Builds a Warframe comparison wikitable of rank 30 PvP stats.
Parameter: frame Frame object (table)
Returns: Resultant wikitext of wikitable (string)
warframes.getArmorChart() (function)
Returns a wikitable of all armor values of Warframes as seen on Armor#Warframe Armor and Effective Health.
Returns: Wikitext of resultant wikitable (string)
warframes.getWarframeCount(frame) (function)
Gets the total count of Warframes in the game. Used on Warframes#Overview
Parameter: frame Frame object (table)
Returns: Number of Warframes in the game, including variants (number)
warframes.getMasteryShortList(frame) (function)
Returns a list of Warframes that have a particular Mastery Rank unlock as seen on Mastery Rank#Mastery Rank Benefits.
Parameter: frame Frame object with the first argument being the Mastery Rank to filter by (table)
Returns: List of Warframes separated by ' • ' (string)
warframes.getConclaveList() (function)
Returns a list of Warframes that are playable in Conclave. Used on PvP#Limitations
Returns: Wikitext of bulleted list of Warframes (string)
warframes.getReleaseDateTable(frame) (function)
Builds a wikitable of the release dates of each Warframe as seen on Warframes Comparison/Release Dates
Parameter: frame (table)
Returns: Wikitext of wikitable (string)
warframes.getSprintList(frame) (function)
Returns a wikitable of all sprint speed values of Warframes as seen on Sprint Speed.
Parameter: frame Frame object (table)
Returns: Wikitext of resultant wikitable (string)
warframes.getEnergyTable(frame) (function)
Builds a wikitable for all Warframe's energy capacity. For use on Energy Capacity article.
Parameter: frame Frame object (table)
Returns: Wikitext of resultant wikitable (string)
warframes.getRankUpExceptionTable(frame) (function)
Returns a wikitable of Rank-Up Exceptions of Warframes as seen on Warframes.
Parameter: frame Frame object (table)
Returns: Wikitext of resultant wikitable (string)

Created with Docbunto

See Also

Code


---	'''Warframes''' retrieves and stores [[Warframes|Warframe]] data of [[WARFRAME]].<br/>
--	
--	On this Wiki, Warframes is used in:
--	* {{t|WarframeNavVisual}}
--	
--	@module		warframes
--	@alias		p
--	@attribution	[[User:Cephalon Scientia|Cephalon Scientia]]
--	@attribution	[[User:Gigamicro|gigamicro]]
--	@attribution	[[User:FINNER|FINNER]]
--	@attribution	[[User:Flaicher|Flaicher]]
--	@attribution	[[User:Falterfire|Falterfire]]
--	@attribution	[[User:Synthtech|Synthtech]]
--	@image		IconWarframe.png
--	@require	[[Module:Warframes/data]]
--	@require	[[Module:Warframes/Conclave/data]]
--	@require	[[Module:Version]]
--	@require	[[Module:Polarity]]
--	@require	[[Module:Table]]
--	@require	[[Module:Tooltips]]
--	@require	[[Module:StatObject]]
--	@release	stable
--	<nowiki>

local p = {}

local delayRequire = require([[Module:Shared]]).delayRequire
local WarframeData = delayRequire([[Module:Warframes/data]], true)
local ConclaveData = delayRequire([[Module:Warframes/Conclave/data]], true)
local Version = delayRequire([[Module:Version]])--getVersionLink, _getVersionDate
local Polarity = delayRequire([[Module:Polarity]])--_pols, _polarity
local Table = delayRequire([[Module:Table]])--skpairs
local Tooltip = require([[Module:Tooltips]])('Warframes')('icontext')
local StatObject = require([[Module:StatObject]])
table.unpack = table.unpack or unpack

p.__StatObject = StatObject
p._statRead = StatObject.statRead
p._statFormat = StatObject.statFormat
StatObject.default = {
-- Abilities={{}},
Armor = 0,
ArmorRank30 = function(wf)
	return wf.ArmorRank30 or p._statRead(wf, 'Armor')
end,
ArmorReduct = function(wf)
	return (p._statRead(wf, 'Armor') + 300) / 300
end,
ArmorReductRank30 = function(wf)
	return (p._statRead(wf, 'ArmorRank30') + 300) / 300
end,
AuraPolarity = { 'None', StatObject.meta.passes(Polarity._polarity) },
BaseName = function(wf)
	-- TODO: This will break the moment database localization is implemented since in other languages the variant name is not always after the base name
	local name = p._statRead(wf, 'Name')
	return (name:match('%S+'))
end,
CodeName = function(wf)
	-- Extracting code name from InternalName (not localized so can treat as enum)
	return wf.InternalName:match('^/Lotus/Powersuits/([^/]+)')
end,
Conclave = false,
EffectiveHealth = function(wf)
	local ehp = p._statRead(wf, 'Health') * p._statRead(wf, 'ArmorReduct') + p._statRead(wf, 'Shield') / (1 - 0.5)
	return StatObject.pucacheIn(wf, 'EffectiveHealth', ehp - ehp % 0.01)
end,
EffectiveHealthRank30 = function(wf)
	local ehp = p._statRead(wf, 'HealthRank30') * p._statRead(wf, 'ArmorReductRank30') + p._statRead(wf, 'ShieldRank30') / (1 - 0.5)
	return StatObject.pucacheIn(wf, 'EffectiveHealthRank30', ehp - ehp % 0.01)
end,
EffectiveHealthWithOvershields = function(wf)
	return p._statRead(wf, 'EffectiveHealth') + (p._statRead(wf, 'Overshield') / (1 - 0.5))
end,
EffectiveHealthWithOvershieldsRank30 = function(wf)
	return p._statRead(wf, 'EffectiveHealthRank30') + (p._statRead(wf, 'Overshield') / (1 - 0.5))
end,
Energy = 1,
EnergyRank30 = function(wf)
	return wf.EnergyRank30 or p._statRead(wf, 'Energy') + 50
end,
ExilusPolarity = { 'None', StatObject.meta.passes(Polarity._polarity) },
Gender = StatObject.meta.gets('Sex'),
Health = 10,
HealthRank30 = function(wf)
	return wf.HealthRank30 or p._statRead(wf, 'Health') + 100
end,
Image = { 'Panel.png', '[[File:%s|link=]]' },
InitialEnergy = 0,
Introduced = { 'U999.0.0', StatObject.meta.passes(Version.getVersionLink) },
IsPrime = function(wf) return (wf.InternalName:find('Prime')) and true or false end,
IsUmbra = function(wf) return (wf.InternalName:find('Umbra')) and true or false end,
Mastery = { 0, '[[File:MasteryAffinity64.png|class=icon]]%s' },
Name = '',
Overshield = function(wf)
	-- Not sure about overshield values for Operators
	if (wf.Shield == 0) then
		return 0
	end
	if (wf.InternalName == '/Lotus/Powersuits/Priest/Priest' or
			wf.InternalName == '/Lotus/Powersuits/Harrow/HarrowPrime') then
		return 2400
	end
	return 1200
end,
Polarities = { nil, StatObject.meta.passes(Polarity._pols) },
Portrait = { 'Panel.png', '[[File:%s|link=]]' },
Progenitor = 'True',
ReleaseDate = function(wf) return Version._getVersionDate(p._statRead(wf, 'Introduced')) end,
Sex = 'Androgyne',
Shield = 0,
ShieldRank30 = function(wf)
	return wf.ShieldRank30 or p._statRead(wf, 'Shield') + 100
end,
Sprint = 1,
Subsumed = {''--[[,StatObject.meta.passes(Tooltips'Abilities''icontext')]]},
-- Themes='',
Variant = function(wf)
	-- Treat variant strings as enums for development
	-- Ignoring edge case for Excalibur Umbra Prime, would consider that as Prime first over Umbra
	if p._statRead(wf, 'IsPrime') then
		return 'Prime'
	elseif p._statRead(wf, 'IsUmbra') then
		return 'Umbra'
	end
	return 'Base'
end,
Vaulted = { false, function(self, v) return v and 'Vaulted' or 'Unvaulted' end },
}

local function getValue(wf, key, formatted)
	if wf == nil then
		return nil
	end
	return (formatted and p._statFormat or p._statRead)(wf, key)
end

---	Returns a subset of Warframe entries as stored in <code>/data</code> or <code>/Conclave/data</code>.
--	@function		p._getWarframes
--	@param			{function} validateFunction Function to filter data by that returns a boolean value
--	@param[opt]		{boolean} ignoreSpecialWarframes If true, ignores special Warframes like Sevagoth's Shadow or Excalibur Umbra Prime
--	@param[opt]		{boolean} useConclaveData If true, uses <code>/Conclave/data</code>, otherwise uses <code>/data</code>
--	@return			{table} List of Warframe entries
function p._getWarframes(validateFunction, useIgnore, useConclaveData)
	return StatObject.getObjects(
		(useConclaveData and ConclaveData or WarframeData)["Warframes"],
		useIgnore and function(wf) return not wf._IgnoreEntry and validateFunction(wf) end or validateFunction,
		false)
end

---	Same as p._getWarframes, but uses <code>/Conclave/data</code>.
--	@function		p._getConclaveWarframes
--	@param			{function} validateFunction Function to filter data by that returns a boolean value
--	@return			{table} List of Warframe entries
function p._getConclaveWarframes(validateFunction, useIgnore)
	return p._getWarframes(validateFunction, useIgnore, true)
end

--- Variant adapter for shortLinkList
local function variantOf(wf)
	local full, var, base = wf.Name, getValue(wf, 'Variant')
	-- base = full:sub(1,-7)
	base = full:match('^%S+')	--assuming all wf's are x y in all languages
	-- mw.log('I think '..full..' is a '..var..' version of '..base)
	return var, base, full
end

---	Lists each warframe as Tooltip(frame)..' ('..Tooltip(frame..' Prime')..')' or '[['..frame..']] ([['..frame..' Prime]])'
--	@function		p._linkList
--	@param			{table} wfs List of Warframes entries as seen in <code>/data</code>
--	@param			{boolean} doTooltip If true, Warframe names will have tooltips, otherwise 
--							  they will be normal article links
--	@return			{table} Resultant list of formatted Warframe name strings
function p._linkList(wfs, tooltip)
	return StatObject.shortLinkList(wfs, variantOf, tooltip and 'Warframes')
end

---	Builds a wikitable row to list all Warframes as used on [[Template:WarframeNav]]
--	@function		p.nav
--	@param			{table} frame Frame object
--	@return			{string} Resultant wikitext of wikitable row
function p.nav(frame)
	local doPrime, doUmbra = (frame.args.prime or 'y') == 'y', (frame.args.umbra or 'y') == 'y'
	return table.concat(p._linkList(
		p._getWarframes(
			function(wf)
				return (doPrime or not getValue(wf, 'IsPrime')) and (doUmbra or not getValue(wf, 'IsUmbra'))
			end,
			true
		),
		true
	), ' • ')
end

--- Builds visual navigation bar for Warframes as seen on [[Template:WarframeNavVisual]].
--	@function		p.buildWarframeVisualNav
--	@param			{table} frame Frame object
--	@return			{string} Resultant wikitext of navigation bar
function p.navVisual(frame)
	local conclave = frame.args['conclave']
	conclave = conclave and conclave ~= '' or false

	local wfs, prime = {}, {}
	for k, wf in StatObject.objIter(WarframeData.Warframes, conclave and function(wf) return wf.Conclave end or nil) do
		local v, b, f = variantOf(wf)
		if v ~= 'Base' then
			prime[b] = wf
			-- prime[select(2,variantOf(wf))]=wf
		else
			table.insert(wfs,wf)
		end
	end

	table.sort(wfs, function(a, b) return a.Name < b.Name end)
	
	local ret = { '<div class="flex-container">' }
	for _, wf in ipairs(wfs) do
		local primeWF = prime[wf.Name]
		local link = conclave and 'Conclave:'..wf.Link or wf.Link
		table.insert(ret, (
			'<div class="WarframeNavBox">'..
				'<div class="WarframeNavBoxIcon">%s</div>'..
				'<div%s>[[File:%s|64px|link=%s]]</div>'..
				'<span class="WarframeNavBoxText">[[%s|<span style="color:%s;">%s</span>]]</span>'..
				(primeWF and '<div class="WarframeNavBoxImage2">[[File:%s|64px|link=%s]]</div>' or '')..
			'</div>'
		):format(
			primeWF and '⭐' or '',
			primeWF and ' class="WarframeNavBoxImage"' or '', wf.Portrait, link,
			link, primeWF and 'gold' or 'white', wf.Name,
			primeWF and primeWF.Portrait, link
		))
	end
	table.insert(ret, '</div>')

	return table.concat(ret)
end
p.buildWarframeVisualNav = p.navVisual

local function getWarframeComparisonRow(warframeEntry, useRank30)
	if (useRank30 == nil) then
		useRank30 = false
	end
	local addOn = (useRank30) and "Rank30" or ""
	local styleString = ""--"border: 1px solid lightgray;"
	local td = '|| style = "'..styleString..'" |'
	
	local result = { ('\n|-\n| style = "%s"|[[%s]]'):format(styleString, warframeEntry.Name) }
	
	local attributes = {
		"Health"..addOn,
		"Shield"..addOn,
		"Overshield",
		"Armor"..addOn,
		"EffectiveHealth"..addOn,
		"EffectiveHealthWithOvershields"..addOn,
		"Energy"..addOn,
		"InitialEnergy",
		"Sprint"
	}
	
	for _, attribute in ipairs(attributes) do
		table.insert(result, td..tostring(getValue(warframeEntry, attribute, false)))
	end
	return table.concat(result, '')
end

local function getWarframeComparisonTable(Warframes, useRank30)
	local styleString = "border: 1px solid black;border-collapse: collapse;"
	local tHeader = ([=[{| cellpadding="1" cellspacing="0" data-sort-type="number" class="listtable sortable" style="font-size:11px;"
! data-sort-type="string" style="%s"|Name
! style="%s"|[[Attributes#Health|Health]]
! style="%s"|[[Attributes#Shields|Shields]]
! style="%s"|Max [[Overshields]]
! style="%s"|[[Attributes#Armor|Armor]]
! style="%s"|Effective Health
! style="%s"|Effective Health w/<br />Max Overshields
! style="%s"|[[Attributes#Energy|Energy]] Capacity
! style="%s"|[[Attributes#Energy|Energy]] At Spawn
! style="%s"|[[Maneuvers#Sprinting|Sprint]]]=]):gsub("%%s", styleString)

	local tRows = ""
	for i, wframe in Table.skpairs(Warframes) do
		if (not wframe._IgnoreEntry) then
			local rowStr = getWarframeComparisonRow(wframe, useRank30)
			tRows = tRows..rowStr
		end
	end

	return tHeader..tRows.."\n|}[[Category:Automatic Comparison Table]]"
end

---	Builds a Warframe comparison wikitable of rank 0 stats as seen on [[Warframes Comparison/Stats]].
--	@function		p.getWarframeComparisonTable
--	@param			{table} frame Frame object
--	@return			{string} Resultant wikitext of wikitable
function p.getWarframeComparisonTable(frame)
	return getWarframeComparisonTable(WarframeData["Warframes"])
end

---	Builds a Warframe comparison wikitable of rank 30 stats as seen on [[Warframes Comparison/Stats]].
--	@function		p.getWarframeRank30ComparisonTable
--	@param			{table} frame Frame object
--	@return			{string} Resultant wikitext of wikitable
function p.getWarframeRank30ComparisonTable(frame)
	return getWarframeComparisonTable(WarframeData["Warframes"], true)
end

---	Builds a Warframe comparison wikitable of rank 0 PvP stats.
--	@function		p.getConclaveWarframeComparisonTable
--	@param			{table} frame Frame object
--	@return			{string} Resultant wikitext of wikitable
function p.getConclaveWarframeComparisonTable(frame)
	return getWarframeComparisonTable(ConclaveData["Warframes"])
end

---	Builds a Warframe comparison wikitable of rank 30 PvP stats.
--	@function		p.getConclaveWarframeRank30ComparisonTable
--	@param			{table} frame Frame object
--	@return			{string} Resultant wikitext of wikitable
function p.getConclaveWarframeRank30ComparisonTable(frame)
	return getWarframeComparisonTable(ConclaveData["Warframes"], true)
end

---	Returns a wikitable of all armor values of Warframes as seen on [[Armor#Warframe Armor and Effective Health]].
--	@function		p.getArmorChart
--	@return			{string} Wikitext of resultant wikitable
function p.getArmorChart()
	--bucket armor values
	local t = {}
	for _, wf in Table.skpairs(WarframeData["Warframes"]) do
		if wf.Armor then
			local link = Tooltip(wf.Name)
			if wf.ArmorRank30 then
				t[wf.ArmorRank30] = t[wf.ArmorRank30] or {}
				table.insert(t[wf.ArmorRank30], link..' (Max Rank)')
				link=link..' (Unranked)'
			end
			t[wf.Armor] = t[wf.Armor] or {}
			table.insert(t[wf.Armor], link)
		end
	end

	--sort
	local keys = {}
	for armor, _ in pairs(t) do
		table.insert(keys, armor)
	end
	table.sort(keys)

	--format
	--ascending buckets of 10% each
	local colors={
		'E4BAD2','C4ADCF','9ECFF6','98E5DA','D0F7BD',
		'FFFFB3','FFC7A3','F9AD81','FF8878','F26C4F',
	}
	local content = {}
	for _, armor in ipairs(keys) do
		local DR = (100 * armor / (armor + 300)) -- as percent
		local interval = '|style="background-color:#'..colors[math.floor(DR/10)+1]..'; border-top: 1px dotted black;"|'
		wfs = t[armor]
		table.insert(content,
			interval..armor..'|'..
			interval..math.floor(DR+.5)..'%|'..
			interval.. .1*math.floor(.5+(1000/(100-DR)))..'x|'..
			interval..table.concat(wfs, ', ')
		)
	end

	return [[
{| class="armortable sortable" cellpadding="3" width="100%" style="line-height:90%; font-size:90%; border-collapse:collapse; text-align:center;"'
|- style="background-color:lightgray;"
! width="10%" style="line-height:100%;" | Armor
! width="10%" style="line-height:100%;" | Damage Reduction
! width="10%" style="line-height:100%;" | EHP
! width="70%" style="line-height:100%;" | Warframe(s)
|-
]]..table.concat(content, '\n|-\n')..'\n|}'
end

---	Gets the total count of Warframes in the game. Used on [[Warframes#Overview]]
--	@function		p.getWarframeCount
--	@param			{table} frame Frame object
--	@return			{number} Number of Warframes in the game, including variants
function p.getWarframeCount(frame)
	local count = 0
	for _, wfEntry in pairs(WarframeData["Warframes"]) do
		if not wfEntry._IgnoreEntry then
			count = count + 1
		end
	end
	return count
end

---	Returns a list of Warframes that have a particular Mastery Rank unlock as seen on
--	[[Mastery Rank#Mastery Rank Benefits]].
--	@function		p.getMasteryShortList
--	@param			{table} frame Frame object with the first argument being the Mastery Rank to filter by
--	@return			{string} List of Warframes separated by ' • '
function p.getMasteryShortList(frame)
	local masteryRank = tonumber(frame.args[1])
	return table.concat(p._linkList(p._getWarframes(function(wf)
		return (wf.Mastery or 0) == masteryRank
	end, true), true), " • ")
end

---	Returns a list of Warframes that are playable in [[Conclave]].
--	Used on [[PvP#Limitations]]
--	@function		p.getConclaveList
--	@return			{string} Wikitext of bulleted list of Warframes
function p.getConclaveList()
	return "*"..table.concat(p._linkList(p._getWarframes(function(wf) return true end, false, true), true), "\n*")
end

--- Builds a wikitable of the release dates of each Warframe as seen on
--	[[Warframes Comparison/Release Dates]]
--	@function			p.getReleaseDateTable
--	@param				{table} frame
--	@return				{string} Wikitext of wikitable
function p.getReleaseDateTable(frame)
	local category = string.lower(frame.args and frame.args[1] or frame)

	local validator = ({
		original = function(wf) return not getValue(wf, 'IsPrime') and not wf._IgnoreEntry end,
		prime = function(wf) return getValue(wf, 'IsPrime') and not wf._IgnoreEntry end,
		female = function(wf) return (wf.Sex == "Female" or wf.Sex == "Androgynous") and not wf._IgnoreEntry end,
		male  = function(wf) return (wf.Sex == "Male" or wf.Sex == "Androgynous") and not wf._IgnoreEntry end,
	})[category] or function(wf) return not wf._IgnoreEntry end

	local result = {[[
{| class="listtable sortable" style="width:100%; white-space:nowrap;" align="center"'
|-
! data-sort-type="text" | Warframe Name
! data-sort-type="text" | Sex
! data-sort-type="isoDate" | Release Date <small>(<i>yyyy-mm-dd</i>)</small>
! data-sort-type="text" | Update Version
]]..(category=='prime' and '! data-sort-type="text" | Vaulted' or '')}

	for name, warframe in StatObject.objIter(WarframeData.Warframes, validator) do
		table.insert(result, ('|-\n| [[%s]] || %s || %s || data-sort-value="%s" | %s%s'):format(
			warframe.Name,
			getValue(warframe, 'Sex'),
			getValue(warframe, 'ReleaseDate'),
			p._statRead(warframe, 'Introduced'),
			p._statFormat(warframe, 'Introduced'),
			category == 'prime' and ' || '..p._statFormat(warframe, 'Vaulted') or '',
		nil))
	end

	table.insert(result, '|}')
	return table.concat(result, '\n')
end

---	Returns a wikitable of all sprint speed values of Warframes as seen on [[Sprint Speed]].
--	@function		p.getSprintList
--	@param			{table} frame Frame object
--	@return			{string} Wikitext of resultant wikitable
function p.getSprintList(frame)
	--bucket sprint speeds
	local t = {}
	for _, wf in Table.skpairs(WarframeData["Warframes"]) do
		if wf.Sprint and not wf._IgnoreEntry then
			t[wf.Sprint] = t[wf.Sprint] or {}
			table.insert(t[wf.Sprint], Tooltip(wf.Name))
		end
	end

	--sort
	local keys = {}
	for speed, _ in pairs(t) do
		table.insert(keys, speed)
	end
	table.sort(keys)

	--format
	local sprintTable = {[[
{| class="wikitable sortable" style="border:1px solid black; width:100%; border-collapse:collapse; text-align:center;"
|-
! style="white-space:nowrap; width:20%;" data-sort-type="number" | Sprint Speed !! Warframes]]}
	for _, speed in ipairs(keys) do
		wfs = t[speed]
		table.insert(sprintTable, '|-\n|'..speed..'||'..table.concat(wfs, ', '))
	end
	table.insert(sprintTable, '|}')
	return table.concat(sprintTable, '\n')
end

---	Builds a wikitable for all Warframe's energy capacity.
--	For use on [[Energy Capacity]] article.
--	@function		p.getEnergyTable
--	@param			{table} frame Frame object
--	@return			{string} Wikitext of resultant wikitable
function p.getEnergyTable(frame)
	local result = { [=[
{| class="wikitable sortable"
|-
! Warframe
! Starting Energy<br />(energy on spawn)
! Rank 0 Energy Capacity<br />(base capacity)
! Rank 30 Energy Capacity<br />(after ranking bonus applied)
|-]=]
	}
	
	for k, wfEntry in Table.skpairs(WarframeData.Warframes) do
		if (not wfEntry._IgnoreEntry) then
			table.insert(result, ('|-\n| %s || %s || %s || %s'):format(
				Tooltip(k, wfEntry),
				wfEntry.InitialEnergy,
				wfEntry.Energy,
				wfEntry.EnergyRank30 and wfEntry.EnergyRank30 or wfEntry.Energy + 50
			) )
		end
	end
	table.insert(result, '|}')
	
	return table.concat(result, '\n')
end

---	Returns a wikitable of Rank-Up Exceptions of Warframes as seen on [[Warframes]].
--	@function		p.getRankUpExceptionTable
--	@param			{table} frame Frame object
--	@return			{string} Wikitext of resultant wikitable
function p.getRankUpExceptionTable(frame)
	local result = { [=[
{| class="emodtable"
! Warframe
! Health
! Shield
! Armor
! Energy
|-]=]
	}
	
	local health, shield, armor, energy
	for _, wf in Table.skpairs(WarframeData.Warframes) do
		health = (wf.HealthRank30 or wf.Health + 100) - wf.Health
		shield = (wf.ShieldRank30 or wf.Shield + 100) - wf.Shield
		armor  = (wf.ArmorRank30 or wf.Armor) - wf.Armor
		energy = (wf.EnergyRank30 or wf.Energy + 50) - wf.Energy
		if (health ~= 100 or shield ~= 100 or armor ~= 0 or energy ~= 50) then
			table.insert(result, ('|-\n| %s || %s || %s || %s || %s'):format(
				Tooltip(wf.Name),
				health == 100 and '<i><span style="color: gray;">'..health..'</span></i>' or '<b>'..health..'</b>',
				shield == 100 and '<i><span style="color: gray;">'..shield..'</span></i>' or '<b>'..shield..'</b>',
				armor  == 0 and '<i><span style="color: gray;">'..armor..'</span></i>' or '<b>'..armor..'</b>',
				energy == 50 and '<i><span style="color: gray;">'..energy..'</span></i>' or '<b>'..energy..'</b>'
			) )
		end
	end
	table.insert(result, '|}')
	
	return table.concat(result, '\n')
end

return p
Advertisement