Module:ItemData: Difference between revisions

Jump to navigation Jump to search
LVL (talk | contribs)
Updated module to support new scaling format
LVL (talk | contribs)
Added percentage formatting for stats and removed old scalar functions as they're not needed.
Line 3: Line 3:
local util_module = require "Module:Utilities"
local util_module = require "Module:Utilities"
local data = mw.loadJsonData("Data:ItemData.json")
local data = mw.loadJsonData("Data:ItemData.json")
-- A list of item properties that should have a '%' sign appended to their base value.
local percentage_properties = {
    AbilityLifestealPercentHero = true,
    BaseAttackDamagePercent = true,
    BonusAbilityDurationPercent = true,
    BonusBulletSpeedPercent = true,
    BonusClipSizePercent = true,
    BonusFireRate = true,
    BonusMeleeDamagePercent = true,
    BulletArmorReduction = true,
    BulletLifestealPercent = true,
    BulletResist = true,
    CooldownReduction = true,
    CooldownReductionPctOnOthers = true,
    CritDamagePercent = true,
    DamagePctVsNonHeroes = true,
    DeathImmunityDamageReduction = true,
    DeflectionPercent = true,
    DotHealthPercent = true,
    FireRateSlow = true,
    GroundDashReductionPercent = true,
    HealAmpCastPercent = true,
    HealAmpReceivePenaltyPercent = true,
    HealAmpRegenPenaltyPercent = true,
    HealAmpRegenPercent = true,
    HealLifePercentOutOfCombat = true,
    HealPercentAmount = true,
    HealPercentPerHeadshot = true,
    ItemCooldownReduction = true,
    MagicIncreasePerStack = true,
    MagicResistReduction = true,
    MaxSlowPercent = true,
    MaxHealthLossPercent = true,
    MeleeDistanceScale = true,
    MeleeResistPercent = true,
    MoveWhileShootingSpeedPenaltyReductionPercent = true,
    MoveWhileZoomedSpeedPenaltyReductionPercent = true,
    NonHeroHealPct = true,
    NonPlayerBonusWeaponPower = true,
    NonPlayerBulletResist = true,
    OutgoingDamagePenaltyPercent = true,
    PercentDamage = true,
    ProcChance = true,
    RicochetDamagePercent = true,
    SlideScale = true,
    SlowPercent = true,
    SlowResistancePercent = true,
    StatusResistancePercent = true,
    TechArmorDamageReduction = true,
    TechPowerPercent = true,
    TechPowerReduction = true,
    TechRadiusMultiplier = true,
    TechRangeMultiplier = true,
    TechResist = true,
    TechResistBelowThreshold = true
}


---------------------------------------- Utility functions
---------------------------------------- Utility functions
Line 51: Line 108:
end
end


--- Get type/slot/category of an item
-- @function  get_type
-- @param      {string}
-- @return    {string}
--- Get type/slot/category of an item  
--- Get type/slot/category of an item  
-- @function  get_type
-- @function  get_type
Line 138: Line 191:
if (prop_value == nil) then return nil end
if (prop_value == nil) then return nil end


-- Handle properties that are tables (either scaled attributes or simple lists)
local display_value
local scaling_str = "" -- Default to an empty string for non-scaled values
 
-- Determine the base value and scaling string (if any)
if(type(prop_value) == "table") then
if(type(prop_value) == "table") then
-- Check if the property is a structured attribute with scaling data
if prop_value["Value"] ~= nil and prop_value["Scale"] ~= nil and prop_value["Scale"]["Value"] ~= nil and prop_value["Scale"]["Type"] ~= nil then
if prop_value["Value"] ~= nil and prop_value["Scale"] ~= nil and prop_value["Scale"]["Value"] ~= nil and prop_value["Scale"]["Type"] ~= nil then
local base_val = tostring(prop_value["Value"])
-- This is a structured attribute with scaling data
display_value = tostring(prop_value["Value"])
local scale_val = tonumber(prop_value["Scale"]["Value"])
local scale_val = tonumber(prop_value["Scale"]["Value"])
local scale_type = prop_value["Scale"]["Type"]
-- Return only the base value if the scaling amount is zero
if scale_val == 0 then
return base_val
end
-- Use the shared utility module to round the scaling value to 2 significant figures for a cleaner display
local rounded_scale_val = util_module.round_to_sig_fig(scale_val, 2)
-- Select the appropriate display template based on the scaling type
if scale_val ~= 0 then
local template_title
local scale_type = prop_value["Scale"]["Type"]
if scale_type == "power_increase" then
local rounded_scale_val = util_module.round_to_sig_fig(scale_val, 2)
template_title = "Template:Boon"
else
local template_title
-- Default to Spirit Scaling for other types (e.g., "spirit")
if scale_type == "power_increase" then
template_title = "Template:Ss"
template_title = "Template:Boon"
else
template_title = "Template:Ss"
end
local template_args = { [1] = rounded_scale_val }
-- Add a space before the scaling template for proper separation
scaling_str = " " .. mw.getCurrentFrame():expandTemplate{ title = template_title, args = template_args }
end
end
-- Prepare arguments and expand the chosen template
local template_args = { [1] = rounded_scale_val }
local scaling_str = mw.getCurrentFrame():expandTemplate{ title = template_title, args = template_args }
-- Combine the base value with the formatted scaling string
return base_val .. " " .. scaling_str
else
else
-- Handle properties that are simple lists (e.g., TargetTypes, Components)
-- This is a simple list (e.g., TargetTypes), handle and return it directly
local tableValues = {}
local tableValues = {}
for _, v in pairs(prop_value) do
for _, v in pairs(prop_value) do
Line 177: Line 224:
return table.concat(tableValues, ", ")
return table.concat(tableValues, ", ")
end
end
else
-- This is a simple, non-table property
display_value = tostring(prop_value)
end
end
-- Handle non-table properties by returning the value directly
-- Assemble the final string, adding the '%' sign if necessary
return prop_value
if percentage_properties[property] == true then
end
return display_value .. "%" .. scaling_str
 
else
--Get spirit scaling for a property
return display_value .. scaling_str
--{{#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
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
end