Module:ItemData: Difference between revisions
Appearance
reverted is_active to use false instead of nil Tag: Manual revert |
proper item_type output instead of codenames |
||
(26 intermediate revisions by 6 users not shown) | |||
Line 1: | Line 1: | ||
local p = {}; | local p = {}; | ||
local lang = require "Module:Lang" | |||
local util_module = require "Module:Utilities" | |||
local data = mw.loadJsonData("Data:ItemData.json") | local data = mw.loadJsonData("Data:ItemData.json") | ||
-- | ---------------------------------------- Utility functions | ||
function get_json_item(name) | |||
for | -- Returns the table of a specific item | ||
-- @function get_json_item | |||
-- @param {string} | |||
-- @return {table} | |||
local function get_json_item(name) | |||
for _, v in pairs(data) do | |||
if (v["Name"] == name) then | if (v["Name"] == name) then | ||
return v | return v | ||
Line 12: | Line 19: | ||
end | end | ||
--{{#invoke:ItemData|get_cost|ITEM_NAME}} | -- Returns an array of item tables that have the same properties | ||
-- @function get_similar_items | |||
-- @param {string} | |||
-- @return {array of tables} | |||
local function get_similar_items(property) | |||
local similarItems = {} | |||
for _, v in pairs(data) do | |||
if (v[property] ~= nil) then | |||
table.insert(similarItems, v) | |||
end | |||
end | |||
return similarItems | |||
end | |||
-- Adds commas delimiter to the thousands place | |||
local function Format(amount) | |||
local contentLanguage = mw.language.getContentLanguage() | |||
local formatted = amount | |||
if(type(formatted) ~= "number") then return "<span style=\"color:red;\">Cannot format non-number value.</span>" end | |||
return contentLanguage:formatNum(tonumber(formatted)) | |||
end | |||
--- Get cost of an item | |||
-- @function get_cost | |||
-- @param {string} | |||
-- @return {number} | |||
local function get_cost(item_name) | |||
local item = get_json_item(item_name) | |||
if(item == nil) then return "<span style=\"color:red;\">Item Not Found.</span>" end | |||
return tonumber(item["Cost"]) | |||
end | |||
--- Get type/slot/category of an item | |||
-- @function get_type | |||
-- @param {string} | |||
-- @return {string} | |||
--- Get type/slot/category of an item | |||
-- @function get_type | |||
-- @param {string} item_name | |||
-- @param {boolean} raw (optional) | |||
-- @return {string} | |||
local function get_type(item_name, raw) | |||
local item = get_json_item(item_name) | |||
if not item then | |||
return "<span style=\"color:red;\">Item Not Found.</span>" | |||
end | |||
local slot = item["Slot"] | |||
if not slot then return nil end | |||
local key_map = { | |||
Weapon = 'CitadelCategoryWeapon', | |||
Armor = 'CitadelCategoryArmor', | |||
Tech = 'CitadelCategoryTech' | |||
} | |||
local key = key_map[slot] | |||
if not key then return nil end | |||
if raw then | |||
return lang.get_string(key, "en") | |||
else | |||
return lang.get_string(key) | |||
end | |||
end | |||
---------------------------------------- Invocable functions | |||
--- {{#invoke:ItemData|get_cost|ITEM_NAME}} access point | |||
p.get_cost = function(frame) | p.get_cost = function(frame) | ||
local item_name = frame.args[1] | local item_name = frame.args[1] | ||
return Format(get_cost(item_name)) | |||
end | |||
return | -- Module access point | ||
function p._get_cost(a) | |||
a = tostring(a) or '0' | |||
return get_cost(a) | |||
end | end | ||
--{{#invoke:ItemData|get_type|ITEM_NAME}} | -- {{#invoke:ItemData|get_type|ITEM_NAME}} access point | ||
p.get_type = function(frame) | p.get_type = function(frame) | ||
local item_name = frame.args[1] | local item_name = frame.args[1] | ||
-- Accept 'raw' as string "true" (case sensitive) | |||
local raw = frame.args['raw'] == 'true' | |||
return get_type(item_name, raw) | |||
end | |||
-- Module access point | |||
function p._get_type(a) | |||
a = tostring(a) or "" | |||
return get_type(a) | |||
end | end | ||
Line 52: | Line 118: | ||
local item_name = frame.args[1] | local item_name = frame.args[1] | ||
local item = get_json_item(item_name) | local item = get_json_item(item_name) | ||
if(item == nil) then return "Item Not Found" end | if(item == nil) then return "<span style=\"color:red;\">Item Not Found.</span>" end | ||
if (item["Activation"] == "Passive") then | if (item["Activation"] == "Passive") then | ||
Line 64: | Line 130: | ||
--check Data:ItemData.json for properties | --check Data:ItemData.json for properties | ||
p.get_prop = function(frame) | p.get_prop = function(frame) | ||
local tableValues = {} | |||
local item_name = frame.args[1] | local item_name = frame.args[1] | ||
local property = frame.args[2] | local property = frame.args[2] | ||
local item = get_json_item(item_name) | local item = get_json_item(item_name) | ||
if(item == nil) then return "Item Not Found" end | if(item == nil) then return "<span style=\"color:red;\">Item Not Found.</span>" end | ||
if(type(item[property]) == "table") then | |||
for i,v in pairs(item[property]) do | |||
local tableValues = table.insert(tableValues, v) | |||
end | |||
return table.concat(tableValues, ", ") | |||
end | |||
return item[property] | |||
end | |||
--Get spirit scaling for a property | |||
--{{#invoke:ItemData|get_scalar|ITEM_NAME|PROPERTY|sig_figs_or_localize}}-- | |||
p.get_scalar = function(frame) | |||
local item_name = frame.args[1] | |||
local property = frame.args[2] | |||
local sig_figs_or_localize = frame.args[3] | |||
local item = get_json_item(item_name) | |||
if(item == nil) then return "<span style=\"color:red;\">Item Not Found.</span>" end | |||
local scaling_data = item[scaling_type .. "Scaling"] | |||
if scaling_data == nil then return scaling_type .. "Scaling data not found for hero" .. item end | |||
local scaling_value = scaling_data[property] | |||
if scaling_value == nil then return scaling_type .. "Scaling data does not have key " .. property .. " for item " .. item end | |||
--round | |||
if (sig_figs_or_localize ~= nil and tonumber(sig_figs_or_localize) ~= nil) then | |||
scaling_value = util_module.round_to_sig_fig(scaling_value, sig_figs_or_localize) | |||
if (scaling_value == nil) then return "get_hero_scalar() error with rounding" end | |||
end | |||
local scaling_str = p.write_scalar_str(scaling_value) | |||
if (scaling_str ~= "") then scaling_str = " " .. scaling_str end | |||
return scaling_str | |||
end | |||
-- Retrieve spirit scaling of an hero's given property, if it has scaling, else return blank | |||
-- Scaling string meaning the expanded template {{Ss|scalar}} | |||
function p.write_scalar_str(scaling_value) | |||
-- Return blank if it doesnt scale | |||
if (scaling_value == 0) then return "" end | |||
-- Round it | |||
scaling_value = util_module.round_to_sig_fig(scaling_value, 3) | |||
--The item has a spirit scaling value with this property | |||
local template_title = "Template:Ss" | |||
local template_args = {} | |||
template_args["1"] = scaling_value --store in 1st arg for {{{1}}} to grab it from {{SS}} or {{LS}} template | |||
return | local template_call = mw.getCurrentFrame():expandTemplate{ title = template_title, args = template_args } | ||
return template_call | |||
end | end | ||
Line 75: | Line 194: | ||
local item_name = frame.args[1] | local item_name = frame.args[1] | ||
local item = get_json_item(item_name) | local item = get_json_item(item_name) | ||
if(item == nil) then return "Item Not Found" end | if(item == nil) then return "<span style=\"color:red;\">Item Not Found.</span>" end | ||
local components = item['Components'] | local components = item['Components'] | ||
Line 86: | Line 205: | ||
return component['Name'] | return component['Name'] | ||
end | |||
-- {{Items count}} access point | |||
function p.get_headcount() | |||
local iter = 0 | |||
local tbl = get_similar_items("IsDisabled") | |||
for _, v in ipairs(tbl) do | |||
if (v["IsDisabled"] == false and v["Name"] ~= nil) then | |||
iter = iter + 1 | |||
end | |||
end | |||
return iter | |||
end | |||
--get codename of the item-- | |||
p.get_codename = function(frame) | |||
local name = frame.args[1] | |||
-- Exception for "Extended Magazine" | |||
if name == "Extended Magazine" then | |||
return "upgrade_clip_size" | |||
end | |||
for k, v in pairs(data) do | |||
if v["Name"] == name then | |||
return k -- returning the key (i.e., name of the table entry) | |||
end | |||
end | |||
return nil -- return nil if not found | |||
end | end | ||
return p | return p |
Latest revision as of 15:27, 12 June 2025
Loads data from Data:ItemData.json
Usage[edit source]
{{#invoke:ItemData|FUNCTION_NAME|PARAMETER1|PARAMETER2}}
Functions[edit source]
get_cost|ITEM_NAME
- Returns the total cost including components.
get_type|ITEM_NAME
- The ItemData.json has different names for each category: Weapon = Weapon, Vitality = Armor, Spirit = Tech. This function will return Weapon, Vitality, or Spirit
is_active|ITEM_NAME
- returns true/false
get_prop|ITEM_NAME|PROPERTY
- Returns the value of one of the item's properties. Check the json file for item properties
get_codename|ITEM_NAME
- Returns the item's codename in game files
Example[edit source]
To get the total cost of Boundless Spirit you'd type:
{{#invoke:ItemData|get_cost|Boundless Spirit}}
and it would return:
6,400
To get Boundless Spirit's Spirit Power:
{{#invoke:ItemData|get_prop|Boundless Spirit|TechPower}}
and it would return:
35
If an item key (English name) has been provided, the item name can be replaced by:
{{#var:item_key_or_en}}
for example:
{{#invoke:ItemData|get_prop|{{#var:item_key_or_en}}|TechPower}}
To get Boundless Spirit's codename:
{{#invoke:ItemData|get_codename|Boundless Spirit}}
and it would return:
upgrade_boundless_spirit
local p = {};
local lang = require "Module:Lang"
local util_module = require "Module:Utilities"
local data = mw.loadJsonData("Data:ItemData.json")
---------------------------------------- Utility functions
-- Returns the table of a specific item
-- @function get_json_item
-- @param {string}
-- @return {table}
local function get_json_item(name)
for _, v in pairs(data) do
if (v["Name"] == name) then
return v
end
end
return nil
end
-- Returns an array of item tables that have the same properties
-- @function get_similar_items
-- @param {string}
-- @return {array of tables}
local function get_similar_items(property)
local similarItems = {}
for _, v in pairs(data) do
if (v[property] ~= nil) then
table.insert(similarItems, v)
end
end
return similarItems
end
-- Adds commas delimiter to the thousands place
local function Format(amount)
local contentLanguage = mw.language.getContentLanguage()
local formatted = amount
if(type(formatted) ~= "number") then return "<span style=\"color:red;\">Cannot format non-number value.</span>" end
return contentLanguage:formatNum(tonumber(formatted))
end
--- Get cost of an item
-- @function get_cost
-- @param {string}
-- @return {number}
local function get_cost(item_name)
local item = get_json_item(item_name)
if(item == nil) then return "<span style=\"color:red;\">Item Not Found.</span>" end
return tonumber(item["Cost"])
end
--- Get type/slot/category of an item
-- @function get_type
-- @param {string}
-- @return {string}
--- Get type/slot/category of an item
-- @function get_type
-- @param {string} item_name
-- @param {boolean} raw (optional)
-- @return {string}
local function get_type(item_name, raw)
local item = get_json_item(item_name)
if not item then
return "<span style=\"color:red;\">Item Not Found.</span>"
end
local slot = item["Slot"]
if not slot then return nil end
local key_map = {
Weapon = 'CitadelCategoryWeapon',
Armor = 'CitadelCategoryArmor',
Tech = 'CitadelCategoryTech'
}
local key = key_map[slot]
if not key then return nil end
if raw then
return lang.get_string(key, "en")
else
return lang.get_string(key)
end
end
---------------------------------------- Invocable functions
--- {{#invoke:ItemData|get_cost|ITEM_NAME}} access point
p.get_cost = function(frame)
local item_name = frame.args[1]
return Format(get_cost(item_name))
end
-- Module access point
function p._get_cost(a)
a = tostring(a) or '0'
return get_cost(a)
end
-- {{#invoke:ItemData|get_type|ITEM_NAME}} access point
p.get_type = function(frame)
local item_name = frame.args[1]
-- Accept 'raw' as string "true" (case sensitive)
local raw = frame.args['raw'] == 'true'
return get_type(item_name, raw)
end
-- Module access point
function p._get_type(a)
a = tostring(a) or ""
return get_type(a)
end
--{{#invoke:ItemData|is_active|ITEM_NAME}}--
p.is_active = function(frame)
local item_name = frame.args[1]
local item = get_json_item(item_name)
if(item == nil) then return "<span style=\"color:red;\">Item Not Found.</span>" end
if (item["Activation"] == "Passive") then
return false
else
return true
end
end
--{{#invoke:ItemData|get_prop|ITEM_NAME|PROPERTY}}--
--check Data:ItemData.json for properties
p.get_prop = function(frame)
local tableValues = {}
local item_name = frame.args[1]
local property = frame.args[2]
local item = get_json_item(item_name)
if(item == nil) then return "<span style=\"color:red;\">Item Not Found.</span>" end
if(type(item[property]) == "table") then
for i,v in pairs(item[property]) do
local tableValues = table.insert(tableValues, v)
end
return table.concat(tableValues, ", ")
end
return item[property]
end
--Get spirit scaling for a property
--{{#invoke:ItemData|get_scalar|ITEM_NAME|PROPERTY|sig_figs_or_localize}}--
p.get_scalar = function(frame)
local item_name = frame.args[1]
local property = frame.args[2]
local sig_figs_or_localize = frame.args[3]
local item = get_json_item(item_name)
if(item == nil) then return "<span style=\"color:red;\">Item Not Found.</span>" end
local scaling_data = item[scaling_type .. "Scaling"]
if scaling_data == nil then return scaling_type .. "Scaling data not found for hero" .. item end
local scaling_value = scaling_data[property]
if scaling_value == nil then return scaling_type .. "Scaling data does not have key " .. property .. " for item " .. item end
--round
if (sig_figs_or_localize ~= nil and tonumber(sig_figs_or_localize) ~= nil) then
scaling_value = util_module.round_to_sig_fig(scaling_value, sig_figs_or_localize)
if (scaling_value == nil) then return "get_hero_scalar() error with rounding" end
end
local scaling_str = p.write_scalar_str(scaling_value)
if (scaling_str ~= "") then scaling_str = " " .. scaling_str end
return scaling_str
end
-- Retrieve spirit scaling of an hero's given property, if it has scaling, else return blank
-- Scaling string meaning the expanded template {{Ss|scalar}}
function p.write_scalar_str(scaling_value)
-- Return blank if it doesnt scale
if (scaling_value == 0) then return "" end
-- Round it
scaling_value = util_module.round_to_sig_fig(scaling_value, 3)
--The item has a spirit scaling value with this property
local template_title = "Template:Ss"
local template_args = {}
template_args["1"] = scaling_value --store in 1st arg for {{{1}}} to grab it from {{SS}} or {{LS}} template
local template_call = mw.getCurrentFrame():expandTemplate{ title = template_title, args = template_args }
return template_call
end
p.get_component_name = function(frame)
local item_name = frame.args[1]
local item = get_json_item(item_name)
if(item == nil) then return "<span style=\"color:red;\">Item Not Found.</span>" end
local components = item['Components']
--return empty string if no component found
if(components == nil) then return nil end
local component_key = components[1]
local component = data[component_key]
if (component == nil) then return nil end
return component['Name']
end
-- {{Items count}} access point
function p.get_headcount()
local iter = 0
local tbl = get_similar_items("IsDisabled")
for _, v in ipairs(tbl) do
if (v["IsDisabled"] == false and v["Name"] ~= nil) then
iter = iter + 1
end
end
return iter
end
--get codename of the item--
p.get_codename = function(frame)
local name = frame.args[1]
-- Exception for "Extended Magazine"
if name == "Extended Magazine" then
return "upgrade_clip_size"
end
for k, v in pairs(data) do
if v["Name"] == name then
return k -- returning the key (i.e., name of the table entry)
end
end
return nil -- return nil if not found
end
return p