Cost is a module for constructing manufacturing requirements wikitables.
On this Wiki, Cost is used in:
Usage
Direct Invocation
{{#invoke:Cost|function|input1|input2|...}}
Documentation
Package items
cost.buildWeaponCostBox(frame)
(function)- Builds weapon manufacturing requirements table.
- Parameter:
frame
(table) - Returns: Resultant table in wikitext (string)
cost.buildWarframeCostBox(frame)
(function)- Builds Warframe manufacturing requirements table.
- Parameter:
frame
(table) - Returns: Resultant table in wikitext (string)
cost.getResourceCostRows(frame)
(function)- Builds a table row of total costs for a specified resource across all weapons.
- Parameter:
frame
(table) - Returns: Resultant table in wikitext (string)
- Created with Docbunto
See Also
Code
--- '''Cost''' is a module for constructing manufacturing requirements wikitables.<br />
--
-- On this Wiki, Cost is used in:
-- * [[Template:BuildAutomatic]]
--
-- @module cost
-- @alias p
-- @author [[User:Falterfire|Falterfire]]
-- @attribution [[User:Synthtech|Synthtech]]
-- @image IconBuild.png
-- @require [[Module:Weapons]]
-- @require [[Module:Warframes/data]]
-- @require [[Module:Tooltips]]
-- @require [[Module:Icon]]
-- @require [[Module:Table]]
-- @require [[Module:String]]
-- @require [[Module:Math]]
-- @require [[Module:Research/data]]
-- @release stable
-- <nowiki>
local p = {}
local WeaponModule = require('Module:Weapons')
local WarframeData = require('Module:Warframes/data')['Warframes']
local Tooltip = require('Module:Tooltips')
local Icon = require('Module:Icon')
local Table = require('Module:Table')
local String = require('Module:String')
local Math = require('Module:Math')
local ResearchData = mw.loadData('Module:Research/data')
function p.getLabLink(factionName)
if(ResearchData["Labs"][factionName] == nil) then
return "[[Research]]"
else
local labName = ResearchData["Labs"][factionName].Name
return "[[Research#"..labName.."|"..labName.." Research]]"
end
end
function p.getResearch(itemName)
return ResearchData["Research"][itemName]
end
local function buildItemText(Item)
if(Item == nil) then
return " "
end
local itemText
local name
local link
local count = Math.formatnum(Item.Count)
if(Item.Type == "WarframePart") then
local split = String.split(Item.Name)
link = split[1]
name = split[2]
else
name = Item.Name
end
if(Item.Type == "Resource" or Item.Type == nil) then
itemText = Tooltip.getImage(name, 'Resources').."<br/>"
elseif(Item.Type == "Item") then
itemText = Icon._Item(name, nil, 'x32').."<br/>"
elseif(Item.Type == "PrimePart") then
itemText = Icon._Item("Prime "..name, nil, 'x32').."<br/>"
elseif(Item.Type == "WarframePart") then
itemText = Icon._Item(name, nil, 'x32').."<br/>"
elseif(Item.Type == "Weapon") then
local itemWeapon = WeaponModule._getWeapon(name)
itemText = '[[File:'..itemWeapon.Image..'|36px|link='..itemWeapon.Name..']]<br/>'
end
if(Item.Type == "WarframePart") then
itemText = itemText..'[['..link..'|'..Item.Name..']]'
else
itemText = itemText..count
end
return itemText
end
--- Builds weapon manufacturing requirements table.
-- @function p.buildWeaponCostBox
-- @param {table} frame
-- @return {string} Resultant table in wikitext
function p.buildWeaponCostBox(frame)
local WeaponName = frame.args ~= nil and frame.args[1] or frame
local Weapon = WeaponModule._getWeapon(WeaponName)
assert(Weapon ~= nil, "p.buildWeaponCostBox(frame): "..WeaponName.." not found")
assert(Weapon.Cost ~= nil, "p.buildWeaponCostBox(frame): "..WeaponName.." does not have Cost data")
local rowStart = '\n| rowspan="2" style="height:50px; width:50px;" |'
local smallPart = '\n| style="text-align:left; padding:0em 0.25em;" |'
local lowRow = '\n| colspan="3" |<small>'
if(Weapon.Cost.Parts ~= nil) then
local tHead = '{| class="foundrytable" style="float:left;margin:auto"'..
'\n!colspan=6|[[Foundry|Manufacturing]] Requirements\n|-'
local result = {}
table.insert(result, tHead)
table.insert(result, rowStart)
--Adding Credit costs
if(Weapon.Cost.Credits ~= nil) then
table.insert(result, Icon._Item("Credits").."<br/>"..Math.formatnum(Weapon.Cost.Credits))
else
table.insert(result, 'N/A')
end
--Adding part costs
for i=1, 4 do
table.insert(result, rowStart..buildItemText(Weapon.Cost.Parts[i]))
end
--Adding the time, market, and rush cost
table.insert(result, smallPart)
if(Weapon.Cost.Time ~= nil) then
table.insert(result, "Time: "..Weapon.Cost.Time.." hrs")
else
table.insert(result, 'N/A')
end
table.insert(result, '\n|-'..smallPart)
if(Weapon.Cost.Rush ~= nil) then
table.insert(result, 'Rush: '..Icon._Item("Platinum",nil, 20)..' '..Weapon.Cost.Rush)
else
table.insert(result, 'N/A')
end
table.insert(result, '\n|-'..lowRow..Icon._Item("Market", "text", 22)..' Price: '..Icon._Item("Platinum", nil, 20)..' ')
if(Weapon.Cost.MarketCost ~= nil) then
table.insert(result, Weapon.Cost.MarketCost)
else
table.insert(result, "N/A")
end
table.insert(result, '</small>'..lowRow..Icon._Item("Blueprint", "text", 22)..' Price:')
if(Weapon.Cost.BPCost ~= nil) then
table.insert(result, Icon._Item("Credits", nil, 22))
table.insert(result, Math.formatnum(Weapon.Cost.BPCost))
--This is for Heliocor and Simulor
elseif(Weapon.Cost.BPStanding ~= nil) then
table.insert(result, Icon._Item("Standing", nil, 20))
table.insert(result, Math.formatnum(Weapon.Cost.BPStanding))
else
table.insert(result, "N/A")
end
table.insert(result, '</small>')
-- Add weapon part component costs if needed
for _, part in pairs(Weapon.Cost.Parts) do
if(part.Cost ~= nil) then
table.insert(result, '\n|-')
table.insert(result, '\n|colspan=6|'..part.Name)
if(part.Cost.BPStanding ~= nil) then
table.insert(result, ' • '..Icon._Item("Standing").." "..Math.formatnum(part.Cost.BPStanding))
end
table.insert(result, '\n|-'..rowStart)
--Adding Credit costs
if(part.Cost.Credits ~= nil) then
table.insert(result, Icon._Item("Credits").."<br/>"..Math.formatnum(part.Cost.Credits))
else
table.insert(result, 'N/A')
end
--Adding part costs
for i=1, 4 do
table.insert(result, rowStart..buildItemText(part.Cost.Parts[i]))
end
--Adding the time, market, and rush cost
table.insert(result, smallPart)
if(part.Cost.Time ~= nil) then
table.insert(result, "Time: "..part.Cost.Time.." hrs")
else
table.insert(result, 'N/A')
end
table.insert(result, '\n|-'..smallPart)
if(part.Cost.Rush ~= nil) then
table.insert(result, 'Rush: '..Icon._Item("Platinum",nil, 20)..' '..part.Cost.Rush)
else
table.insert(result, 'N/A')
end
table.insert(result, '</small>')
end
end
--Adding Research costs if needed
local weapRes = p.getResearch(Weapon.Name)
if(weapRes) then
table.insert(result, '\n|-\n! colspan=6| '..p.getLabLink(weapRes.Lab))
if(weapRes.Affinity ~= nil) then
table.insert(result, ' '..Icon._Affinity("Clan").." "..Math.formatnum(weapRes.Affinity))
end
table.insert(result, '\n|-'..rowStart)
--Adding Credit costs
if(weapRes.Credits ~= nil) then
table.insert(result, Icon._Item("Credits").."<br/>"..Math.formatnum(weapRes.Credits))
else
table.insert(result, 'N/A')
end
--Adding part costs
for i=1, 4 do
table.insert(result, rowStart..buildItemText(weapRes.Resources[i]))
end
--Adding the time, market, and rush cost
table.insert(result, smallPart)
if(weapRes.Time ~= nil) then
table.insert(result, "Time: "..Math.formatnum(weapRes.Time).." hrs")
else
table.insert(result, 'N/A')
end
table.insert(result, '\n|-'..smallPart)
if(weapRes.Prereq ~= nil) then
table.insert(result, 'Prereq: [['..weapRes.Prereq..']]')
else
table.insert(result, 'Prereq: N/A')
end
--Adding notes about clan sizes
local clans = '\n|-\n| colspan = 6 |<small>'..
Icon._Clan('Ghost')..' [[Clan#Clan Tier Multiplier|<span title="Clan Tier Multiplier">x1</span>]] '..
Icon._Clan('Shadow')..' [[Clan#Clan Tier Multiplier|<span title="Clan Tier Multiplier">x3</span>]] '..
Icon._Clan('Storm')..' [[Clan#Clan Tier Multiplier|<span title="Clan Tier Multiplier">x10</span>]] '..
Icon._Clan('Mountain')..' [[Clan#Clan Tier Multiplier|<span title="Clan Tier Multiplier">x30</span>]] '..
Icon._Clan('Moon')..' [[Clan#Clan Tier Multiplier|<span title="Clan Tier Multiplier">x100</span>]]</small>'
table.insert(result, clans)
end
table.insert(result, '\n|}<div style="clear:left; margin:0; padding:0;"></div>[[Category:Automatic Cost Table]]')
return table.concat(result)
end
end
--- Builds Warframe manufacturing requirements table.
-- @function p.buildWarframeCostBox
-- @param {table} frame
-- @return {string} Resultant table in wikitext
function p.buildWarframeCostBox(frame)
local WFName = frame.args ~= nil and frame.args[1] or frame
local Warframe = WarframeData[WFName]
local wfParts = {[1] = "NeuroCost", [2] = "ChassisCost", [3] = "SystemCost"}
local wfPartsName = {["NeuroCost"] = "Neuroptics", ["ChassisCost"] = "Chassis", ["SystemCost"] = "Systems"}
if(Warframe == nil) then
return "ERROR: "..WFName.." not found"
elseif(Warframe.MainCost == nil) then
return "ERROR: "..WFName.." does not have Cost data"
end
local rowStart = '\n| rowspan="2" style="height:50px; width:50px;" |'
local smallPart = '\n| style="text-align:left; padding: 0em 0.25em;" |'
local lowRow = '\n| colspan="3" |<small>'
if(Warframe.MainCost.Parts ~= nil) then
local foundryTable = '{| class="foundrytable" style="float:left;margin:auto"'
foundryTable = foundryTable..'\n!colspan=6|[[Foundry|Manufacturing]] Requirements'
foundryTable = foundryTable..'\n|-'
foundryTable = foundryTable..rowStart
--Adding Credit costs
if(Warframe.MainCost.Credits ~= nil) then
foundryTable = foundryTable..Icon._Item("Credits").."<br/>"..Math.formatnum(Warframe.MainCost.Credits)
else
foundryTable = foundryTable..'N/A'
end
--Adding part costs
for i=1, 4 do
foundryTable = foundryTable..rowStart..buildItemText(Warframe.MainCost.Parts[i])
end
--Adding the time, market, and rush cost
foundryTable = foundryTable..smallPart
if(Warframe.MainCost.Time ~= nil) then
foundryTable = foundryTable.."Time: "..Warframe.MainCost.Time..(Warframe.MainCost.TimeUnit or " hrs")
else
foundryTable = foundryTable..'N/A'
end
foundryTable = foundryTable..'\n|-'..smallPart
if(Warframe.MainCost.Rush ~= nil) then
foundryTable = foundryTable..'Rush: '..Icon._Item("Platinum",nil, 20)..' '..Warframe.MainCost.Rush
else
foundryTable = foundryTable..'N/A'
end
foundryTable = foundryTable..'\n|-'..lowRow..Icon._Item("Market", "text", 22)..' Price: '..Icon._Item("Platinum", nil, 20)..' '
if(Warframe.MainCost.MarketCost ~= nil) then
foundryTable = foundryTable..Warframe.MainCost.MarketCost
else
foundryTable = foundryTable.."N/A"
end
foundryTable = foundryTable..'</small>'..lowRow..Icon._Item("Blueprint", "text", 22)..' Price:'
if(Warframe.MainCost.BPCost ~= nil) then
foundryTable = foundryTable..Icon._Item("Credits", nil, 22)
foundryTable = foundryTable..Math.formatnum(Warframe.MainCost.BPCost)
--This is for Baruuk
elseif
(Warframe.MainCost.BPStanding ~= nil) then
foundryTable = foundryTable..Icon._Item("Standing", nil, 20)
foundryTable = foundryTable..Math.formatnum(Warframe.MainCost.BPStanding)
else
foundryTable = foundryTable.."N/A"
end
foundryTable = foundryTable..'</small>'
-- Add Warframe part component costs
for _, partName in ipairs(wfParts) do
if(Warframe[partName] and Warframe[partName].Parts) then
foundryTable = foundryTable..'\n|-'
foundryTable = foundryTable..'\n|colspan=6|[[Warframe '..wfPartsName[partName]..'|'..wfPartsName[partName]..']]'
foundryTable = foundryTable..'\n|-'
foundryTable = foundryTable..rowStart
--Adding Credit costs
if(Warframe[partName].Credits ~= nil) then
foundryTable = foundryTable..Icon._Item("Credits").."<br/>"..Math.formatnum(Warframe[partName].Credits)
else
foundryTable = foundryTable..'N/A'
end
--Adding part costs
for i=1, 4 do
foundryTable = foundryTable..rowStart..buildItemText(Warframe[partName].Parts[i])
end
--Adding the time, market, and rush cost
foundryTable = foundryTable..smallPart
if(Warframe[partName].Time ~= nil) then
foundryTable = foundryTable.."Time: "..Warframe[partName].Time.." hrs"
else
foundryTable = foundryTable..'N/A'
end
foundryTable = foundryTable..'\n|-'..smallPart
if(Warframe[partName].Rush ~= nil) then
foundryTable = foundryTable..'Rush: '..Icon._Item("Platinum",nil, 20)..' '..Warframe[partName].Rush
else
foundryTable = foundryTable..'N/A'
end
foundryTable = foundryTable..'</small>'
end
end
--Adding Research costs if needed
local wfRes = p.getResearch(Warframe.Name)
if(wfRes) then
local resParts = {[1] = "Blueprint", [2] = "Neuroptics", [3] = "Chassis", [4] = "Systems"}
foundryTable = foundryTable..'\n|-\n| colspan=6| <div class="mw-collapsible mw-collapsed">'..p.getLabLink(wfRes.Lab)
foundryTable = foundryTable..'<div class="mw-collapsible-content">\n{| class="foundrytable" style="max-width:100%;"'
for _, partName in ipairs(resParts) do
local research
if (partName ~= "Blueprint") then
research = p.getResearch(Warframe.Name..' '..partName)
else
research = wfRes
end
if(research.Resources ~= nil) then
foundryTable = foundryTable..'\n|colspan=6|'..partName
if(research.Affinity ~= nil) then
foundryTable = foundryTable..' • '..Icon._Affinity("Clan").." "..Math.formatnum(research.Affinity)
end
foundryTable = foundryTable..'\n|-'..rowStart
--Adding Credit costs
if(research.Credits ~= nil) then
foundryTable = foundryTable..Icon._Item("Credits").."<br/>"..Math.formatnum(research.Credits)
else
foundryTable = foundryTable..'N/A'
end
--Adding part costs
for i=1, 4 do
foundryTable = foundryTable..rowStart..buildItemText(research.Resources[i])
end
--Adding the time, market, and rush cost
foundryTable = foundryTable..smallPart
if(research.Time ~= nil) then
foundryTable = foundryTable.."Time: "..Math.formatnum(research.Time).." hrs"
else
foundryTable = foundryTable..'N/A'
end
foundryTable = foundryTable..'\n|-'..smallPart
if(research.Prereq ~= nil) then
foundryTable = foundryTable..'Prereq: [['..research.Prereq..']]'
else
foundryTable = foundryTable..'Prereq: N/A'
end
foundryTable = foundryTable..'\n|-'
end
end
--Adding notes about clan sizes
foundryTable = foundryTable..'\n| colspan = 6 |<small>'
foundryTable = foundryTable..Icon._Clan('Ghost')..' [[Clan#Clan Tier Multiplier|<span title="Clan Tier Multiplier">x1</span>]] '
foundryTable = foundryTable..Icon._Clan('Shadow')..' [[Clan#Clan Tier Multiplier|<span title="Clan Tier Multiplier">x3</span>]] '
foundryTable = foundryTable..Icon._Clan('Storm')..' [[Clan#Clan Tier Multiplier|<span title="Clan Tier Multiplier">x10</span>]] '
foundryTable = foundryTable..Icon._Clan('Mountain')..' [[Clan#Clan Tier Multiplier|<span title="Clan Tier Multiplier">x30</span>]] '
foundryTable = foundryTable..Icon._Clan('Moon')..' [[Clan#Clan Tier Multiplier|<span title="Clan Tier Multiplier">x100</span>]]'
foundryTable = foundryTable..'</small>'
foundryTable = foundryTable..'\n|}</div></div>'
end
foundryTable = foundryTable..'\n|}<div style="clear:left; margin:0; padding:0;"></div>[[Category:Automatic Cost Table]]'
return foundryTable
end
end
--- Builds a table row of total costs for a specified resource across all weapons.
-- @function p.getResourceCostRows
-- @param {table} frame
-- @return {string} Resultant table in wikitext
function p.getResourceCostRows(frame)
local ResName = frame.args ~= nil and frame.args[1] or frame
local Weapons = WeaponModule._getWeapons(function() return true end)
local result = ""
for key, weap in Table.skpairs(Weapons) do
--Adding Research costs if needed
local resNum = 0
local mainNum = 0
if(weap.Cost ~= nil and weap.Cost.Parts ~= nil) then
for i, val in pairs(weap.Cost.Parts) do
if(val.Name == ResName) then
mainNum = val.Count
end
end
end
local weapRes = p.getResearch(weap.Name)
if(weapRes and weapRes.Resources ~= nil) then
for i, val in pairs(weapRes.Resources) do
if(val.Name == ResName) then
resNum = val.Count
end
end
end
if(resNum > 0 or mainNum > 0) then
result = result..'\n|-\n| [['..weap.Name..']] || '..weap.Type..' || '
if(mainNum > 0) then
result = result..Math.formatnum(mainNum)
end
if(resNum > 0) then
result = result..' ('..Math.formatnum(resNum)..')'
end
end
end
return result
end
return p