Editing Module:Abilities/card

Jump to navigation Jump to search
Warning: You are not logged in. Once you make an edit, a temporary account will be created for you. Learn more. Log in or create an account to continue receiving notifications after this account expires, and to access other features.
The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then publish the changes below to finish undoing the edit.
Latest revision Your text
Line 3: Line 3:
local utils = require "Module:Abilities/utils"
local utils = require "Module:Abilities/utils"
local Icon = require"Module:Abilities/icon"
local Icon = require"Module:Abilities/icon"
local textfit = require "Module:TextFit"


local p = {}
local p = {}
Line 195: Line 194:
end
end


-- An attribute may carry either a single scaling or a list of them.
-- Get scaling of attribute, return nil if none is found
-- Extra entries are stat-category markers (duration, cooldown, range, radius,
function get_attr_scale(attr)
-- healing, charges) that always hold a value of 1 and are never displayed, so
if not attr then  
-- return the first entry that actually renders a badge.
return nil  
-- A zero-valued scaling is still returned when nothing else is displayable. The
-- card renders it as an x0 placeholder, and the ability upgrade gadget fills
-- that element in when an upgrade grants real scaling (Doorman's Doorway).
local function pick_scale(attr)
if not attr then
return nil
end
end
local scale = attr.Scale
local scale = attr.Scale
if type(scale) ~= 'table' then
return nil
end
-- A single scaling is stored directly as an object
if scale[1] == nil then
return scale
end
local placeholder = nil
for _, entry in ipairs(scale) do
if type(entry) == 'table' and Icon.isDisplayedScale(entry.Type) then
if entry.Value ~= 0 then
return entry
end
placeholder = placeholder or entry
end
end
return placeholder
end
-- Get scaling of attribute, return nil if none is found
function get_attr_scale(attr)
local scale = pick_scale(attr)
if not scale then
if not scale then
return nil
return nil
Line 246: Line 214:
-- Get scaling type of attribute, return nil if none is found
-- Get scaling type of attribute, return nil if none is found
function get_attr_scale_type(attr)
function get_attr_scale_type(attr)
local scale = pick_scale(attr)
if not attr then
return nil
end
local scale = attr.Scale
if not scale then
if not scale then
return nil
return nil
Line 260: Line 232:
-- Check if scaling should be multiplied instead of added
-- Check if scaling should be multiplied instead of added
function get_attr_scale_multiply(attr)
function get_attr_scale_multiply(attr)
local scale = pick_scale(attr)
if not attr then
return nil
end
local scale = attr.Scale
if not scale then
if not scale then
return nil
return nil
Line 334: Line 310:
for k, prop in ipairs(props) do  -- use ipairs for ordered iteration
for k, prop in ipairs(props) do  -- use ipairs for ordered iteration
local value = prop.Value
local value = prop.Value
local scale = pick_scale(prop)
-- If it scales with melee damage, set the value using the hero's base melee to match in game visuals
-- If it scales with melee damage, set the value using the hero's base melee to match in game visuals
if scale and scale.Type == 'melee' then
if prop.Scale and prop.Scale.Type == 'melee' then
local hero = get_hero_data(hero_key)
local hero = get_hero_data(hero_key)
value = prop.Value + hero.LightMeleeDamage * scale.Value
value = prop.Value + hero.LightMeleeDamage * prop.Scale.Value
elseif scale and scale.Type == 'heavy_melee' then
elseif prop.Scale and prop.Scale.Type == 'heavy_melee' then
local hero = get_hero_data(hero_key)
local hero = get_hero_data(hero_key)
value = prop.Value + hero.HeavyMeleeDamage * scale.Value
value = prop.Value + hero.HeavyMeleeDamage * prop.Scale.Value
elseif scale and scale.Type == 'weapon_power' then
elseif prop.Scale and prop.Scale.Type == 'weapon_power' then
local hero = get_hero_data(hero_key)
local hero = get_hero_data(hero_key)
value = hero.Weapon.BulletDamage * hero.Weapon.BulletsPerBurst * (scale.Value + 100) / 100
value = hero.Weapon.BulletDamage * hero.Weapon.BulletsPerBurst * (prop.Scale.Value + 100) / 100
end
end
Line 362: Line 337:
icon_color = icon and icon.color,
icon_color = icon and icon.color,
icon_size = icon and icon.size,
icon_size = icon and icon.size,
scale_value = scale and commonutils.round_to_sig_fig(scale.Value, 3),
scale_value = prop.Scale and commonutils.round_to_sig_fig(prop.Scale.Value, 3),
scale_type =  scale and scale.Type,
scale_type =  prop.Scale and prop.Scale.Type,
-- allow nil value here as some status effects don't have a value but should not be hidden
-- allow nil value here as some status effects don't have a value but should not be hidden
hide = value == 0 and "true" or "false",
hide = value == 0 and "true" or "false",
Line 379: Line 354:
icon_color = icon and icon.color,
icon_color = icon and icon.color,
icon_size = icon and icon.size,
icon_size = icon and icon.size,
scale_value = scale and commonutils.round_to_sig_fig(scale.Value, 3),
scale_value = prop.Scale and commonutils.round_to_sig_fig(prop.Scale.Value, 3),
scale_type =  scale and scale.Type,
scale_type =  prop.Scale and prop.Scale.Type,
hide = (value == nil or value == 0) and "true" or "false",
hide = (value == nil or value == 0) and "true" or "false",
}
}
Line 416: Line 391:
local alt_boxes = {}
local alt_boxes = {}
     for k, prop in ipairs(props) do
     for k, prop in pairs(props) do
     -- Some props don't have values, as those come from upgrades
     -- Some props don't have values, as those come from upgrades
     -- For now, we will ignore these and only show data for the base ability
     -- For now, we will ignore these and only show data for the base ability
Line 423: Line 398:


     local value = prop.Value
     local value = prop.Value
    local scale = pick_scale(prop)


     if scale and scale.Type == 'weapon_power' then
     if prop.Scale and prop.Scale.Type == 'weapon_power' then
     local hero = get_hero_data(hero_key)
     local hero = get_hero_data(hero_key)
     value = hero.Weapon.BulletDamage * hero.Weapon.BulletsPerBurst * (scale.Value + 100) / 100
     value = hero.Weapon.BulletDamage * hero.Weapon.BulletsPerBurst * (prop.Scale.Value + 100) / 100
     end
     end


Line 439: Line 413:
     icon_color = icon and icon.color,
     icon_color = icon and icon.color,
     icon_size = icon and icon.size,
     icon_size = icon and icon.size,
     scale_value = scale and commonutils.round_to_sig_fig(scale.Value, 3),
     scale_value = prop.Scale and commonutils.round_to_sig_fig(prop.Scale.Value, 3),
     scale_type = scale and scale.Type,
     scale_type = prop.Scale and prop.Scale.Type,
     hide = value == 0 and "true" or "false",
     hide = value == 0 and "true" or "false",
     }
     }
Line 452: Line 426:


local UPGRADE_COST_MAP = {1, 2, 5}
local UPGRADE_COST_MAP = {1, 2, 5}
-- Upgrade description sizing. These are design proportions, not copies of any
-- CSS measurement: the browser supplies the box width through the container
-- query on .ac-upgrade-descwrap, so nothing here needs updating if the card's
-- widths, margins or padding change.
local UG_DESC_ASPECT = 0.357  -- max height of the text block, as a multiple of its width
local UG_LINE_HEIGHT = 1.4    -- emitted alongside the size so the two cannot drift
local UG_MAX_CQW    = 11.9  -- ceiling, as % of the text width (~16px on a full-width card)
local UG_MIN_CQW    = 6.7    -- floor (~9px)
function get_upgrade_boxes(hero_key, ability_num)
function get_upgrade_boxes(hero_key, ability_num)
local ability = utils.get_ability_card_data(hero_key, ability_num)
local ability = utils.get_ability_card_data(hero_key, ability_num)
Line 471: Line 435:
local upgrade_boxes = {}
local upgrade_boxes = {}
for k, upgrade in ipairs(upgrades) do
for k, upgrade in pairs(upgrades) do
local description = lang.get_string(upgrade.DescKey)
local description = lang.get_string(upgrade.DescKey)
local desc_length = description and #description or 0


-- bypass some keys if they are mistakenly left in game files
-- bypass some keys if they are mistakenly left in game files
Line 492: Line 457:
end
end
-- Expand once, then size from the text the reader actually sees, rather
-- Vary the font size based on the number of characters to prevent overflow
-- than from a character count of the unexpanded string.
local fontsize = '1rem'
local rendered = frame:preprocess(description)
if desc_length > 30 and desc_length < 51 then
local cqw = textfit.fit(rendered, {
fontsize = '0.9rem'
aspect = UG_DESC_ASPECT,
elseif desc_length > 50 and desc_length < 71 then
lineHeight = UG_LINE_HEIGHT,
fontsize = '0.8rem'
max = UG_MAX_CQW,
elseif desc_length > 70 then
min = UG_MIN_CQW,
fontsize = '0.7rem'
})
end
local upgrade_scale = pick_scale(upgrade)
local upgrade_box = frame:expandTemplate{
local upgrade_box = frame:expandTemplate{
title = "Ability_card_v2/Card/UpgradeBox",
title = "Ability_card_v2/Card/UpgradeBox",
Line 508: Line 472:
index = k,
index = k,
cost = UPGRADE_COST_MAP[k],
cost = UPGRADE_COST_MAP[k],
description = rendered,
description = frame:preprocess(description),
scale_value = upgrade_scale and commonutils.round_to_sig_fig(upgrade_scale.Value, 3),
scale_value = upgrade.Scale and commonutils.round_to_sig_fig(upgrade.Scale.Value, 3),
scale_type =  upgrade_scale and upgrade_scale.Type,
scale_type =  upgrade.Scale and upgrade.Scale.Type,
-- Measured against the box's own width, so the size stays correct
fontsize = fontsize
-- when the card renders below its 500px max-width.
fontsize = string.format('%.2fcqw', cqw),
lineheight = UG_LINE_HEIGHT
}
}
}
}
Please note that all contributions to The Deadlock Wiki are considered to be released under the Creative Commons Attribution-NonCommercial-ShareAlike (see Deadlock:Copyrights for details). If you do not want your writing to be edited mercilessly and redistributed at will, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource. Do not submit copyrighted work without permission!
Cancel Editing help (opens in new window)
Preview page with this template