| Latest revision |
Your text |
| Line 25: |
Line 25: |
| BonusAbilityDurationPercent = true, | | BonusAbilityDurationPercent = true, |
| BonusAttackRangePercent = true, | | BonusAttackRangePercent = true, |
| BonusBaseHealth = true,
| |
| BonusBulletSpeedPercent = true, | | BonusBulletSpeedPercent = true, |
| BonusClipSizePercent = true, | | BonusClipSizePercent = true, |
| Line 34: |
Line 33: |
| BonusSoulsPct = true, | | BonusSoulsPct = true, |
| BonusZoomPercent = true, | | BonusZoomPercent = true, |
| BuffBulletResist = true,
| |
| BuffMeleeDamageBoost = true, | | BuffMeleeDamageBoost = true, |
| BuffTechResist = true,
| |
| BulletArmorReduction = true, | | BulletArmorReduction = true, |
| BulletDamageReflectedPct = true, | | BulletDamageReflectedPct = true, |
| Line 130: |
Line 127: |
| WeaponDamagePerStack = true, | | WeaponDamagePerStack = true, |
| WeaponPowerPerStack = true, | | WeaponPowerPerStack = true, |
| }
| |
|
| |
| -- Mappings from placeholder tokens (used in descriptions) to the actual
| |
| -- flat property keys in Data:ItemData.json
| |
| local PROPERTY_KEY_OVERRIDES = {
| |
| ["ArcaneSurgeWindow"] = "AbilityDuration",
| |
| -- Add any other mismatches here as they appear
| |
| } | | } |
|
| |
|
| Line 284: |
Line 274: |
| --check Data:ItemData.json for properties | | --check Data:ItemData.json for properties |
| p.get_prop = function(frame) | | p.get_prop = function(frame) |
| local item_name = frame.args[1]
| | local item_name = frame.args[1] |
| local property = frame.args[2]
| | local property = frame.args[2] |
| local raw = frame.args.raw == 'true'
| | local raw = frame.args.raw == 'true' |
| local item = get_json_item(item_name)
| | local item = get_json_item(item_name) |
| if(item == nil) then return "<span style=\"color:red;\">Item Not Found.</span>" end
| | if(item == nil) then return "<span style=\"color:red;\">Item Not Found.</span>" end |
|
| |
|
| -- Look up property directly; if missing, try the override table
| | local prop_value = item[property] |
| local prop_value = item[property]
| | if (prop_value == nil) then return nil end |
| if prop_value == nil and PROPERTY_KEY_OVERRIDES[property] then
| |
| prop_value = item[ PROPERTY_KEY_OVERRIDES[property] ]
| |
| end
| |
| if (prop_value == nil) then return nil end
| |
|
| |
|
| local display_value | | local display_value |
| Line 351: |
Line 337: |
| p.get_component_name = function(frame) | | p.get_component_name = function(frame) |
| local item_name = frame.args[1] | | local item_name = frame.args[1] |
| local slot_arg = frame.args[2]
| |
|
| |
| local item = get_json_item(item_name) | | local item = get_json_item(item_name) |
| if(item == nil) then return "<span style=\"color:red;\">Item Not Found.</span>" end | | if(item == nil) then return "<span style=\"color:red;\">Item Not Found.</span>" end |
| Line 360: |
Line 344: |
| if(components == nil) then return nil end | | if(components == nil) then return nil end |
| | | |
| local slot = tonumber(slot_arg) or 1
| | local component_key = components[1] |
|
| |
| local component_key = components[slot] | |
| if (component_key == nil) then return nil end
| |
| local component = data[component_key]
| |
| local component = data[component_key] | | local component = data[component_key] |
| if (component == nil or component["IsDisabled"] == true) then return nil end | | if (component == nil) then return nil end |
| | | |
| return component['Name'] | | return component['Name'] |
| Line 372: |
Line 352: |
|
| |
|
| -- {{Items count}} access point | | -- {{Items count}} access point |
| function p.get_headcount(frame) | | function p.get_headcount() |
| local item_type = frame.args[1]
| |
|
| |
| local iter = 0 | | local iter = 0 |
| local tbl = get_similar_items("IsDisabled") | | local tbl = get_similar_items("IsDisabled") |
| for _, v in ipairs(tbl) do | | for _, v in ipairs(tbl) do |
| if item_type == "Standard" then | | if (v["IsDisabled"] == false and v["Name"] ~= nil) then |
| -- return only regular items
| |
| if (v["IsDisabled"] == false and v["Slot"] ~= nil and v["StreetBrawl"] == false and v["Name"] ~= nil) then
| |
| iter = iter + 1 | | iter = iter + 1 |
| end
| | end |
| elseif item_type == "Street Brawl" then | |
| -- return only street brawl items
| |
| if (v["IsDisabled"] == false and v["Slot"] ~= nil and v["StreetBrawl"] == true and v["Name"] ~= nil) then
| |
| iter = iter + 1
| |
| end
| |
| end
| |
| end | | end |
| return iter | | return iter |
| Line 430: |
Line 400: |
| if upgrades == nil then return nil end | | if upgrades == nil then return nil end |
|
| |
|
| local value = upgrades[property] | | local prop_upgrades = upgrades[property] |
| if value == nil then return nil end | | if prop_upgrades == nil then return nil end |
| | |
| | -- Convert upgrade values to strings |
| | local values = {} |
| | for _, v in ipairs(prop_upgrades) do |
| | table.insert(values, raw and strip_suffix(v) or tostring(v)) |
| | end |
|
| |
|
| local result = raw and strip_suffix(value) or tostring(value) | | local result = table.concat(values, ", ") |
|
| |
|
| if raw then | | if raw then |
| Line 445: |
Line 421: |
| return result | | return result |
| end | | end |
| end
| |
|
| |
| -- Helping function for [[Module:Enhanced]]
| |
| function p.get_prop_meta(item_name, property)
| |
| local item = get_json_item(item_name)
| |
| if not item then return nil end
| |
|
| |
| local raw = item[property]
| |
| if raw == nil then return nil end
| |
|
| |
| local meta = {
| |
| unit = nil, -- "%", "m", "s" or nil
| |
| scale = nil -- { type = "Ss"/"Boon", value = number } or nil
| |
| }
| |
|
| |
| if percentage_properties[property] then
| |
| meta.unit = "%"
| |
| end
| |
|
| |
| if type(raw) == "table"
| |
| and raw.Scale
| |
| and raw.Scale.Value
| |
| and raw.Scale.Type
| |
| then
| |
| local scale_val = tonumber(raw.Scale.Value)
| |
| if scale_val and scale_val ~= 0 then
| |
| meta.scale = {
| |
| type = raw.Scale.Type == "power_increase" and "Boon" or "Ss",
| |
| value = util_module.round_to_sig_fig(scale_val, 2)
| |
| }
| |
| end
| |
| end
| |
|
| |
| return meta
| |
| end
| |
|
| |
| -- Builds Into functions
| |
|
| |
| -- Helper: accepts item key or display name, returns the key used in data table
| |
| local function get_codename_from_input(input)
| |
| if data[input] then return input end
| |
|
| |
| for k, v in pairs(data) do
| |
| if v["Name"] == input and (v["IsDisabled"] == false or v["IsDisabled"] == nil) then
| |
| return k
| |
| end
| |
| end
| |
| for k, v in pairs(data) do
| |
| if v["Name"] == input then return k end
| |
| end
| |
| return nil
| |
| end
| |
|
| |
| -- Core logic: returns table of keys that have this item in their Components
| |
| local function get_component_of(item_input)
| |
| local target_key = get_codename_from_input(item_input)
| |
| if not target_key then return {} end
| |
|
| |
| local parents = {}
| |
| for key, item in pairs(data) do
| |
| if item.IsDisabled ~= true and item.Components and type(item.Components) == "table" then
| |
| for _, comp in ipairs(item.Components) do
| |
| if comp == target_key then
| |
| table.insert(parents, key)
| |
| break
| |
| end
| |
| end
| |
| end
| |
| end
| |
| table.sort(parents)
| |
| return parents
| |
| end
| |
|
| |
| -- Template: {{#invoke:ItemData|get_builds_into_count|ITEM_NAME}}
| |
| p.get_builds_into_count = function(frame)
| |
| local item = frame.args[1]
| |
| return #get_component_of(item)
| |
| end
| |
|
| |
| -- Template: {{#invoke:ItemData|get_builds_into_name|ITEM_NAME|INDEX}}
| |
| p.get_builds_into_name = function(frame)
| |
| local item = frame.args[1]
| |
| local idx = tonumber(frame.args[2]) or 1
| |
| local parents = get_component_of(item)
| |
| local key = parents[idx]
| |
| return key and data[key] and data[key]["Name"] or ""
| |
| end
| |
|
| |
| -- Template: {{#invoke:ItemData|get_builds_into|ITEM_NAME}}
| |
| -- Returns fully rendered ItemIcon templates
| |
| p.get_builds_into = function(frame)
| |
| local item = frame.args[1]
| |
| local parents = get_component_of(item)
| |
| if #parents == 0 then return "" end
| |
|
| |
| local and_word = frame:preprocess("{{#invoke:Dictionary|translate|And}}")
| |
| and_word = mw.ustring.lower(and_word)
| |
|
| |
| local parts = {}
| |
| for _, key in ipairs(parents) do
| |
| local name = data[key] and data[key]["Name"] or key
| |
| local icon = mw.getCurrentFrame():expandTemplate{ title = "ItemIcon", args = { name } }
| |
| table.insert(parts, icon)
| |
| end
| |
|
| |
| if #parts == 1 then return parts[1] end
| |
| if #parts == 2 then
| |
| return parts[1] .. " " .. and_word .. " " .. parts[2]
| |
| end
| |
|
| |
| local last = table.remove(parts)
| |
| return table.concat(parts, ", ") .. ", " .. and_word .. " " .. last
| |
| end | | end |
|
| |
|
| return p | | return p |