WARFRAME Wiki
Advertisement
WARFRAME Wiki


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>]] &nbsp; '..
				Icon._Clan('Shadow')..' [[Clan#Clan Tier Multiplier|<span title="Clan Tier Multiplier">x3</span>]] &nbsp; '..
				Icon._Clan('Storm')..' [[Clan#Clan Tier Multiplier|<span title="Clan Tier Multiplier">x10</span>]] &nbsp; '..
				Icon._Clan('Mountain')..' [[Clan#Clan Tier Multiplier|<span title="Clan Tier Multiplier">x30</span>]] &nbsp; '..
				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>]] &nbsp; '
			foundryTable = foundryTable..Icon._Clan('Shadow')..' [[Clan#Clan Tier Multiplier|<span title="Clan Tier Multiplier">x3</span>]] &nbsp; '
			foundryTable = foundryTable..Icon._Clan('Storm')..' [[Clan#Clan Tier Multiplier|<span title="Clan Tier Multiplier">x10</span>]] &nbsp; '
			foundryTable = foundryTable..Icon._Clan('Mountain')..' [[Clan#Clan Tier Multiplier|<span title="Clan Tier Multiplier">x30</span>]] &nbsp; '
			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
Advertisement