Documentation for this module may be created at Module:Acquisition/dev/doc
--- '''Acquisition''' builds the acquisition table for Warframes, Weapons,
-- and Arcanes.
--
-- Acquisition can be invoked directly (`{{#invoke:Acquisition|buildTable|...}}`)
-- or invoked from a template (`{{Acquisition|...}}`)
--
-- On this Wiki, Acquisition is used in:
-- * [[Template:Acquisition]]
--
-- @module acquisition
-- @alias p
-- @author [[User:FINNER|FINNER]]
-- @image AcquisitionPic.PNG
-- @require [[Module:Acquisition/data]]
-- @require [[Module:Icon]]
-- @require [[Module:Math]]
-- @require [[Module:String]]
-- @require [[Module:Lua]]
-- @require [[w:c:dev:Module:Entrypoint|Module:Entrypoint]]
-- @require [[w:c:dev:Module:User error|Module:User error]]
-- @release stable
-- <nowiki>
local p = {};
-- Module dependencies -------------------------------------------------------
local Data = mw.loadData([[Module:Acquisition/data]]);
local Icon = require([[Module:Icon]]);
local Math = require([[Module:Math]]);
local String = require([[Module:String]]);
local Lua = require([[Module:Lua]]);
local Entry = require('Dev:Entrypoint');
local Error = require('Dev:User error');
-- Local functions ------------------------------------------------------------
--- Builds wikitable showcasing drop rates of items and their parts and the expected
-- number of runs to get them.
-- @function buildItemTable
-- @param {string} itemName
-- @returns {string} Resultant wikitext of wikitable
local function buildItemTable(itemName)
local itemData = Data[itemName];
if itemData == nil or itemName == nil then
return Error('Item "'..itemName..'" not found or may have an error in [[Module:Acquisition/data]][[Category:Broken Acquisition]]')
end
local result = { '{| style="width: 100%;" class="article-table" cellspacing="1" cellpadding="1" border="0" align="left"' };
table.insert(result, [[|-
! style="width: 27.5%;" | Source
! style="text-align:center" | Chance
! style="text-align:center" | Expected
! style="text-align:center" | Nearly Guaranteed
|-]]);
for i, v in ipairs(itemData) do
local partCount = 0;
local dropChances = {};
local dropParts = {};
for j, w in ipairs(v) do
partCount = partCount + 1;
dropChances[partCount] = w.Chance;
dropParts[partCount] = w.Mission or w.Part;
end
for j = 1, partCount do
local part = dropParts[j];
for k = 1, partCount do
if dropParts[k] == part and k ~= j then
dropChances[j] = dropChances[j] + dropChances[k];
dropChances[k] = 0;
dropParts[k] = nil;
end
end
end
for j, w in ipairs(v) do
-- Use Mission for items like Forma else use Part for items that
-- are crafted from multiple parts that rewarded from drop table(s)
table.insert(result, '| '..(w.Mission or w.Part)..((w.Desc ~= nil and w.Desc ~= '') and '<br />('..w.Desc..')' or ''));
table.insert(result, '| style="text-align:center" | '..Math.round(w.Chance, 0.001, true, false)..'%');
if j == 1 then
local unit = '';
if w.Unit ~= nil and w.Unit ~= '' then
unit = w.Unit;
end
table.insert(result, '| rowspan='..partCount..' style="text-align:center" | '..Math.ex(dropChances)..' '..unit);
table.insert(result, '| rowspan='..partCount..' style="text-align:center" | '..Math.ng(dropChances)..' '..unit);
end
table.insert(result, '|-');
end
end
table.insert(result, '|}');
return table.concat(result, '\n');
end
-- Member functions ----------------------------------------------------------
--- Builds the acquisition table
-- @function p.buildTable
-- @param {table} frame The item name and if it's prime, or if it's a forma
-- @return {string} HTML table
function p.buildTable(...)
local args = Lua.getArgs({...});
if args["Forma"] == nil or args["Forma"] == '' then
if args["Prime"] == nil or args["Prime"] == '' then
return buildItemTable(args["Name"]);
end
elseif string.upper(args["Forma"]) == "MISSIONS" then
return buildItemTable('Forma Blueprint');
else
return buildItemTable('Forma');
end
end
p.__main = Entry(p);
return p;