User:Samlovesmath/Sandbox: Difference between revisions

Samlovesmath (talk | contribs)
more cleanup / finalizing styles
Samlovesmath (talk | contribs)
updated for infobox hero finishing
Tag: Replaced
Line 1: Line 1:
__TOC__
__TOC__
=Infobox Tests=
=Infobox Tests=
(Note: Only properly viewable with [[User:Samlovesmath/common.css]], and with site's default Common.css disabled.)
(Note: Full experience with [[Wiki_Redesign.css]] recommended.)


===Hero Infobox v2===
===Hero Infobox v2===
'''Uses new variables:'''
<div><tabber style="width:100%;">
* color1 &nbsp;&nbsp;<span style="font-size:small; opacity:50%">*quote color</span>
|-| Abrams=
* color1_grad &nbsp;&nbsp;<span style="font-size:small; opacity:50%">*lower background gradient color</span>
{{Samlovesmath/Infobox hero
* color2 &nbsp;&nbsp;<span style="font-size:small; opacity:50%">*same hue as roster select, brightened for clarity</span>
| key = hero_atlas
* background image &nbsp;&nbsp;<span style="font-size:small; opacity:50%">*ex. [[:File:Geist_select_background.png|Geist_select_background.png]] for [[Lady Geist]]</span>
| voice_actor = Samoa Joe
 
| release_date = April 24, 2024
 
| codenames = Atlas; Bull
'''Todos:'''
* APPLY NEW SANDBOX MODULE
* Fix Stat key word links--certain parts that stand for the same thing point to different places
* Add class name to bullet/spirit superscript template on certain stats (ex. +48 [heart-gun image]) to make CSS for padding displacement to avoid clipping over where it is placed
* Fix/finish quote replacement
* Lang.json:
** Change Citadel_HeroPage_BaseStats -- BASE STATS ➔ BASE STATISTICS
 
 
'''Errors noted:'''
* Weapon Stat property "Max Range" is a manual template input for heroes such as [[Bebop]]. Future updates to this value would have to be updated manually. Make it properly implemented in HeroData for automatic changes? (ask Sur/LVL/Domo?)
 
<span style="font-size:small; opacity:50%">'''''WIP -- Last edited: Mar 28, 2026'''''</span>
<!--
-->{{#vardefine:key|hero_ghost}}<!-- hero keyname
 
-->{{#vardefine:color1| \#{{#invoke:Samlovesmath/Sandbox|get_value|{{#var:key}}|color1}} }} <!--
-->{{#vardefine:color1_grad| \#{{#invoke:Samlovesmath/Sandbox|get_value|{{#var:key}}|color1_grad}} }} <!--
-->{{#vardefine:color2| \#{{#invoke:Samlovesmath/Sandbox|get_value|{{#var:key}}|color2}} }} <!--
-->{{#vardefine:grad_offset| {{#invoke:Samlovesmath/Sandbox|get_value|{{#var:key}}|grad_offset}} }} <!--
 
-->{{#vardefine:text_title| \#{{#invoke:Samlovesmath/Sandbox|get_value|{{#var:key}}|text_title}} }} <!--
-->{{#vardefine:stats_text| \#{{#invoke:Samlovesmath/Sandbox|get_value|{{#var:key}}|stats_text}} }} <!--
-->{{#vardefine:stats_back| \#{{#invoke:Samlovesmath/Sandbox|get_value|{{#var:key}}|stats_back}} }} <!--
 
-->{{#vardefine:background_height| {{#invoke:Samlovesmath/Sandbox|get_value|{{#var:key}}|background_height}} }} <!--
-->{{#vardefine:background_margin| {{#invoke:Samlovesmath/Sandbox|get_value|{{#var:key}}|background_margin}} }} <!--
 
-->{{#vardefine:logo_height| {{#invoke:Samlovesmath/Sandbox|get_value|{{#var:key}}|logo_height}} }} <!--
-->{{#vardefine:logo_bleed| {{#invoke:Samlovesmath/Sandbox|get_value|{{#var:key}}|logo_bleed}} }} <!--
-->{{#vardefine:logo_bottom| {{#invoke:Samlovesmath/Sandbox|get_value|{{#var:key}}|logo_bottom}} }} <!--
 
-->{{#vardefine:grad_height| calc({{#var:grad_offset}} + {{#var:background_height}})  }} <!--
 
 
-->{{#vardefine:voice_actor| {{#invoke:Samlovesmath/Sandbox|get_value|{{#var:key}}|voice_actor}} }} <!--
-->{{#vardefine:release_date| {{#invoke:Samlovesmath/Sandbox|get_value|{{#var:key}}|release_date}} }} <!--
-->{{#vardefine:codenames| {{#invoke:Samlovesmath/Sandbox|get_value|{{#var:key}}|codenames}} }} <!--
-->{{#vardefine:pronouns| {{#invoke:Samlovesmath/Sandbox|get_value|{{#var:key}}|pronouns}} }} <!--
-->{{#vardefine:hero_key_or_en|{{#var:key}}}} <!-- en
-->{{#vardefine:hero_en|{{#invoke:Lang|get_string|{{#var:key}}|lang_code_override=en}}}}<!-- en
 
-->{{#vardefine:quotemark|"}} <!-- for inserting into html
 
--{{#vardefine:max_range|31}} <!-- debug; manual template value (weapon stats)
-->
 
<!---- Overridden Variable Styles ---->
<div class="infobox" style=
{{#var:quotemark}}
--infobox_th_color2: {{#var:color2}} !important;
--infobox_th_text_title: {{#var:text_title}} !important;
--infobox_th_stats_text: {{#var:stats_text}} !important;
--infobox_th_stats_back: {{#var:stats_back}} !important;
--infobox_th_backMargin: {{#var:background_margin}} !important;
--infobox_th_logoBleed: {{#var:logo_bleed}} !important;
--infobox_th_logoBottom: {{#var:logo_bottom}} !important;
{{#var:quotemark}}>
 
<!---- Box Background ---->
<div class="infobox-background">[[File:{{#invoke:Samlovesmath/Sandbox|get_value|{{#var:key}}|background_image}}|x{{#var:background_height}}|right|link=]]</div>
 
{| class="infobox-content" style="background-image: linear-gradient(180deg, {{#var:color1}}b3 calc({{#var:grad_height}} * calc(3/7)), {{#var:color1_grad}} {{#var:grad_height}}); background-color: transparent;"
! colspan="2" class="infobox-title" style="font-size: {{{font-size|25px}}};" |
 
<!---- Title + Name Image + Hero Thumbnail ---->
<div class="infobox-title-hero" style="display: flex; justify-content: space-between;">
<div class="infobox-title-hero-left"></div>
<div class="infobox-title-hero-middle">{{If lang|{{#ifeq: {{{no_name|}}}|true|{{{name|{{#invoke:Lang|get_string|{{#var:key}}}}}}}|{{Template:Icon/White|[[File:{{{name|{{#invoke:Lang|get_string|{{#var:key}}}}}}}_name.png|{{#var:logo_height}}|class=notpageimage]]}}}}|{{{name|{{#invoke:Lang|get_string|{{#var:key}}}}}}}}}</div>
<div class="infobox-title-hero-right"><div>
<div class="infobox-title-hero-tornbox" style={{#var:quotemark}}background-color:{{#var:color2}};{{#var:quotemark}}></div>
<div class="infobox-title-hero-icon">{{#ifeq: {{{no_icon|}}}|true||[[Image:{{{icon|{{#invoke:HeroData|get_hero_var|{{#var:hero_key_or_en}}|Name}}}}}.png|center|35px]]}}</div></div>
</div>
 
<!---- Hero Image Card ---->
|-
! colspan="2" class="infobox-image" style="margin:auto; border:none; --secondaryColor: {{#var:color2}};" |<div>[[File:{{{card|{{#invoke:HeroData|get_hero_var|{{#var:hero_key_or_en}}|Name}} card.png}}}|190px|alt={{{BASEPAGENAME}}}]]</div>
 
<!---- Weapon Name ---->
|-
!colspan="2" class="infobox-text-weapon infotext-bold" | <span class="infotext-title">{{#invoke:Lang|get_string|CitadelCategoryWeapon}}:</span><br><span class="infotext-bold infotext-bigger">''"{{{weapon_name|{{#invoke:HeroData|get_hero_var|{{#var:hero_key_or_en}}|NameKey|true}}}}}"''</span>
 
<!---- "Base Statistics" ---->
|-
!colspan="2" class="infobox-text-stat-subtitle" style="border-top: solid 3px {{#var:color2}};"|
<span class="infotext-bold infotext-title infotext-big">{{#invoke:Lang|get_string|Citadel_HeroPage_BaseStats}}</span>
 
<!---- Weapon Dropdown ---->
|-
! colspan="2" class="infobox-subsection infobox-dropdown infobox-dropdown-weapon" |
{| class="mw-collapsible mw-collapsed infobox-subsection-child"
|+ class="infobox-dropdown-header" | [[Stats{{If_lang}}#Weapon|<span class="infotext-bold infobox-dropdown-title">{{#invoke:Lang|get_string|CitadelHeroStats_Weapon}}</span>]]
|-
<!---- Damage per second ---->
| [[Damage per second{{If_lang}}|<span>{{#invoke:Lang|get_string|DPS_label}}</span>]]:
| style="white-space: nowrap;" | {{Icon/Brown|[[File:Damage.png|20px|link=Damage per second{{If_lang}}]]|{{{dps|{{#invoke:HeroData|get_hero_var|{{#var:hero_key_or_en}}|DPS|3}}}}}}}
|-
<!---- Bullet Damage ---->
| [[Bullet Damage{{If_lang}}|<span>{{#invoke:Lang|get_string|StatDesc_BulletDamage}}</span>]]:
| style="white-space: nowrap; padding-right: 5px;" | {{Icon/Brown|[[File:Bullet damage.png|20px|link=Bullet Damage{{If_lang}}]]|{{{bullet_damage|{{#invoke:HeroData|get_hero_var|{{#var:hero_key_or_en}}|BulletDamage|3}}}}}{{#invoke:HeroData|get_hero_scalar|{{#var:hero_key_or_en}}|Level|BulletDamage}}{{#invoke:HeroData|get_hero_scalar|{{#var:hero_key_or_en}}|Spirit|BulletDamage}}}}
|-
<!---- Ammo ---->
| [[Ammo{{If_lang}}|<span>{{#invoke:Lang|get_string|StatDesc_ClipSizeBonus}}</span>]]:
| style="white-space: nowrap;"| {{Icon/Grey|[[File:Clip size icon.png|20px|link=Ammo{{If_lang}}]]|{{{ammo|{{#ifeq: {{{no_ammo|}}}|true|N/A|{{#invoke:HeroData|get_hero_var|{{#var:hero_key_or_en}}|ClipSize|3}}{{#invoke:HeroData|get_hero_scalar|{{#var:hero_key_or_en}}|Level|ClipSize}}{{#invoke:HeroData|get_hero_scalar|{{#var:hero_key_or_en}}|Spirit|ClipSize}}}}}}}}}
|-
<!---- Bullets per sec ---->
| [[Fire_Rate{{If_lang}}|<span>{{#invoke:Lang|get_string|StatDesc_RoundsPerSecond}}</span>]]:
| style="white-space: nowrap;"| {{Icon/Grey|[[File:Bullets per sec icon.png|20px|link=Fire Rate{{If_lang}}]]|{{{bullets_per_sec|{{#invoke:HeroData|get_hero_var|{{#var:hero_key_or_en}}|RoundsPerSecond|3}}}}}{{#invoke:HeroData|get_hero_scalar|{{#var:hero_key_or_en}}|Level|RoundsPerSecond}}{{#invoke:HeroData|get_hero_scalar|{{#var:hero_key_or_en}}|Spirit|RoundsPerSecond}}}}
|-
<!---- Reload Time ---->
| [[Reload Time{{If_lang}}|<span>{{#invoke:Lang|get_string|StatDesc_ReloadTime}}</span>]]:
| style="white-space: nowrap;"| {{Icon/Grey|[[File:AttributeIconReloadTime.png|20px|link=Reload Time{{If_lang}}]]|{{{reload_time|{{#ifeq: {{{no_ammo|}}}|true|N/A|{{#invoke:HeroData|get_hero_var|{{#var:hero_key_or_en}}|ReloadTime|3}}s}}}}}}}
|-
<!---- Bullet Velocity ---->
| [[Bullet Velocity{{If_lang}}|<span>{{#invoke:Lang|get_string|StatDesc_BulletSpeed}}</span>]]:
| style="white-space: nowrap;"| {{Icon/Grey|[[File:AttributeIconBulletSpeed.png|20px|link=Bullet Velocity{{If_lang}}]]|{{{bullet_velocity|{{#invoke:HeroData|get_hero_var|{{#var:hero_key_or_en}}|BulletSpeed|3}}}}}m/s}}
|-
<!---- Light Melee ---->
| [[Melee Damage{{If_lang}}|<span>{{#invoke:Lang|get_string|StatDesc_LightMeleeDamage}}</span>]]:
| style="white-space: nowrap; padding-right: 5px;"| {{Icon/Brown|[[File:Melee damage.png|20px|link=Melee Damage{{If_lang}}]]|{{{light_melee|{{#invoke:HeroData|get_hero_var|{{#var:hero_key_or_en}}|LightMeleeDamage|3}}}}}{{#invoke:HeroData|get_hero_scalar|{{#var:hero_key_or_en}}|Level|LightMeleeDamage}}{{#invoke:HeroData|get_hero_scalar|{{#var:hero_key_or_en}}|Spirit|LightMeleeDamage}}}}
|-
<!---- Heavy Melee ---->
| [[Melee Damage{{If_lang}}|<span>{{#invoke:Lang|get_string|StatDesc_HeavyMeleeDamage}}</span>]]:
| style="white-space: nowrap; padding-right: 5px;"| {{Icon/Brown|[[File:Melee damage.png|20px|link=Melee Damage{{If_lang}}]]|{{{heavy_melee|{{#invoke:HeroData|get_hero_var|{{#var:hero_key_or_en}}|HeavyMeleeDamage|3}}}}}{{#invoke:HeroData|get_hero_scalar|{{#var:hero_key_or_en}}|Level|HeavyMeleeDamage}}{{#invoke:HeroData|get_hero_scalar|{{#var:hero_key_or_en}}|Spirit|HeavyMeleeDamage}}}}
|-
<!---- Falloff Range ---->
| [[Falloff Range{{If_lang}}|<span>{{#invoke:Lang|get_string|CitadelHeroStats_Weapon_Falloff}}</span>]]:
| style="white-space: nowrap;"| {{Icon/Brown||{{{range|{{#ifeq: {{{no_falloff|}}}|true|N/A|{{#invoke:HeroData|get_hero_var|{{#var:hero_key_or_en}}|FalloffStartRange|2}}m <span style="color:#ecac19;">➔</span> {{#invoke:HeroData|get_hero_var|{{#var:hero_key_or_en}}|FalloffEndRange|2}}m}}}}}}}
|-
<!---- Maximum Range (Manual Input) ---->
{{#if: {{#var:max_range|}} |
{{!}} [[Falloff_Range{{If_lang}}|<span>Max Range</span>]]:
{{!}} style="font-size: 16px;text-shadow: 1.5px 1.5px 0.8px rgba(0, 0, 0, 0.8);text-align:left"{{!}}{{Icon/Brown||31}}}}
|-
<!---- Crit Bonus Scale ---->
{{#ifexpr: {{#invoke:HeroData|get_hero_var|{{#var:hero_key_or_en}}|CritDamageBonusPercent|3}} != 0 |
{{!}} [[Weapon Damage{{If_lang}}#Crit_Multiplier|<span>{{#invoke:Lang|get_string|StatDesc_CritDamageBonusScale}}</span>]]:
{{!}} style="white-space: nowrap;"{{!}}{{Icon/Grey|[[File:Crit reduction.png|20px|link=Weapon Damage#Crit_Multiplier]]|{{#invoke:HeroData|get_hero_var|{{#var:hero_key_or_en}}|CritDamageBonusPercent|3}}%}}}}
|}
 
<!---- Vitality Dropdown ---->
|-
! colspan="2" class="infobox-subsection infobox-dropdown infobox-dropdown-vitality" |
{| class="mw-collapsible mw-collapsed infobox-subsection-child"
|+ class="infobox-dropdown-header" | [[Stats#Vitality|<span class="infotext-bold infobox-dropdown-title">{{#invoke:Lang|get_string|CitadelHeroStats_Vitality}}</span>]]
|-
<!---- Health ---->
| style="padding-top: 8px;"| [[Health{{If_lang}}|<span>{{#invoke:Lang|get_string|StatDesc_HealthAttribute}}</span>]]:
| style="white-space: nowrap; padding-right: 5px; padding-top: 8px;"| {{Icon/Green|[[File:Health.png|20px|link=Health{{If_lang}}]]|{{{max_health|{{#invoke:HeroData|get_hero_var|{{#var:hero_key_or_en}}|MaxHealth|3}}}}}{{#invoke:HeroData|get_hero_scalar|{{#var:hero_key_or_en}}|Level|MaxHealth}}{{#invoke:HeroData|get_hero_scalar|{{#var:hero_key_or_en}}|Spirit|MaxHealth}}}}
|-
<!---- Health Regen ---->
| [[Health Regen{{If_lang}}|<span>{{#invoke:Lang|get_string|StatDesc_HealthRegen}}</span>]]:
| style="white-space: nowrap;"| {{Icon/Grey|[[File:Health regen.png|20px|link=Health Regen{{If_lang}}]]|{{{health_regen|{{#invoke:HeroData|get_hero_var|{{#var:hero_key_or_en}}|BaseHealthRegen|2}}}}}{{#invoke:HeroData|get_hero_scalar|{{#var:hero_key_or_en}}|Level|BaseHealthRegen}}{{#invoke:HeroData|get_hero_scalar|{{#var:hero_key_or_en}}|Spirit|BaseHealthRegen}}}}
|-
<!---- Crit Resistance ---->
{{#if: {{{crit_reduction|}}}{{#invoke:HeroData|hero_has_stat|{{#var:hero_key_or_en}}|CritDamageReceivedPercent}} |
{{!}}[[Damage Resistance{{If_lang}}#Crit_Reduction|<span>{{#invoke:Lang|get_string|StatDesc_CritDamageReceivedScale}}</span>]]:
{{!}}style="white-space: nowrap;"{{!}}{{Icon/Grey|[[File:Crit reduction.png|20px|link=Damage Resistance{{If_lang}}#Crit_Reduction]]|{{{crit_reduction|{{#invoke:HeroData|get_hero_var|{{#var:hero_key_or_en}}|CritDamageReceivedPercent|3}}}}}%{{#invoke:HeroData|get_hero_scalar|{{#var:hero_key_or_en}}|Level|CritDamageReceivedPercent}}{{#invoke:HeroData|get_hero_scalar|{{#var:hero_key_or_en}}|Spirit|CritDamageReceivedPercent}}}}}}
|-
<!---- Bullet Resistance ---->
{{#if: {{{bullet_resist|}}}{{#invoke:HeroData|hero_has_stat|{{#var:hero_key_or_en}}|BulletResist}} |
{{!}}[[Damage Resistance{{If_lang}}|<span>{{#invoke:Lang|get_string|StatDesc_BulletArmorDamageReduction}}</span>]]:
{{!}}style="white-space: nowrap;"{{!}}{{Icon/Grey|[[File:Bullet Armor.png|20px|link=Bullet Resist{{If_lang}}]]|{{{bullet_resist|{{#invoke:HeroData|get_hero_var|{{#var:hero_key_or_en}}|BulletResist|3}}}}}%{{#invoke:HeroData|get_hero_scalar|{{#var:hero_key_or_en}}|Level|BulletResist}}{{#invoke:HeroData|get_hero_scalar|{{#var:hero_key_or_en}}|Spirit|BulletResist}}}}}}
|-
<!---- Spirit Resistance ---->
{{#if: {{{spirit_resist|}}}{{#invoke:HeroData|hero_has_stat|{{#var:hero_key_or_en}}|TechResist}} |
{{!}}[[Damage Resistance{{If_lang}}#Spirit_Resist|<span>{{#invoke:Lang|get_string|StatDesc_TechArmorDamageReduction}}</span>]]:
{{!}}style="white-space: nowrap;"{{!}}{{Icon/Grey|[[File:Spirit Armor.png|20px|link=Damage Resistance{{If_lang}}#Spirit_Resist]]|{{{spirit_resist|{{#invoke:HeroData|get_hero_var|{{#var:hero_key_or_en}}|TechResist|3}}}}}%{{#invoke:HeroData|get_hero_scalar|{{#var:hero_key_or_en}}|Level|TechResist}}{{#invoke:HeroData|get_hero_scalar|{{#var:hero_key_or_en}}|Spirit|TechResist}}}}}}
|-
<!---- Melee Resistance ---->
{{#if: {{{melee_resist|}}}{{#invoke:HeroData|hero_has_stat|{{#var:hero_key_or_en}}|MeleeResist}} |
{{!}}[[Damage Resistance{{If_lang}}#Melee Resist|<span>{{#invoke:Lang|get_string|StatDesc_MeleeResist}}</span>]]:
{{!}}style="white-space: nowrap;"{{!}}{{Icon/Grey|[[File:Melee damage.png|20px|link=Damage Resistance{{If_lang}}#Melee Resist]]|{{{melee_resist|{{#invoke:HeroData|get_hero_var|{{#var:hero_key_or_en}}|MeleeResist|3}}}}}%{{#invoke:HeroData|get_hero_scalar|{{#var:hero_key_or_en}}|Level|MeleeResist}}{{#invoke:HeroData|get_hero_scalar|{{#var:hero_key_or_en}}|Spirit|MeleeResist}}}}}}
|-
<!---- Bullet Lifesteal ---->
{{#if: {{{bullet_lifesteal|}}}{{#invoke:HeroData|hero_has_stat|{{#var:hero_key_or_en}}|BulletLifesteal}} |
{{!}}[[Lifesteal{{If_lang}}#Bullet Lifesteal|<span>{{#invoke:Lang|get_string|StatDesc_BulletLifesteal}}</span>]]:
{{!}}style="white-space: nowrap;"{{!}}{{Icon/Grey|[[File:AttributeIconBulletLifesteal.png|20px|link=Lifesteal{{If_lang}}#Bullet Lifesteal]]|{{{bullet_lifesteal|{{#invoke:HeroData|get_hero_var|{{#var:hero_key_or_en}}|BulletLifesteal|3}}}}}%{{#invoke:HeroData|get_hero_scalar|{{#var:hero_key_or_en}}|Level|BulletLifesteal}}{{#invoke:HeroData|get_hero_scalar|{{#var:hero_key_or_en}}|Spirit|BulletLifesteal}}}}}}
|-
<!---- Spirit Lifesteal ---->
{{#if: {{{spirit_lifesteal|}}}{{#invoke:HeroData|hero_has_stat|{{#var:hero_key_or_en}}|SpiritLifesteal}} |
{{!}}[[Lifesteal{{If_lang}}#Spirit Lifesteal|<span>{{#invoke:Lang|get_string|StatDesc_SpiritLifesteal}}</span>]]:
{{!}}style="white-space: nowrap;"{{!}}{{Icon/Grey|[[File:AttributeIconBulletLifesteal.png|20px|link=Lifesteal{{If_lang}}#Spirit Lifesteal]]|{{{spirit_lifesteal|{{#invoke:HeroData|get_hero_var|{{#var:hero_key_or_en}}|SpiritLifesteal|3}}}}}%{{#invoke:HeroData|get_hero_scalar|{{#var:hero_key_or_en}}|Level|SpiritLifesteal}}{{#invoke:HeroData|get_hero_scalar|{{#var:hero_key_or_en}}|Spirit|SpiritLifesteal}}}}}}
|-
<!---- Move Speed ---->
| [[Move Speed{{If_lang}}|<span>{{#invoke:Lang|get_string|StatDesc_RunSpeed}}</span>]]:
| style="white-space: nowrap;"| {{Icon/Green|[[File:Move speed.png|20px|link=Move Speed]]|{{{move_speed|{{#invoke:HeroData|get_hero_var|{{#var:hero_key_or_en}}|MaxMoveSpeed|2}}}}}m/s{{#invoke:HeroData|get_hero_scalar|{{#var:hero_key_or_en}}|Level|MaxMoveSpeed}}{{#invoke:HeroData|get_hero_scalar|{{#var:hero_key_or_en}}|Spirit|MaxMoveSpeed}}}}
|-
<!---- Sprint Speed ---->
| [[Move Speed{{If_lang}}#Sprint|<span>{{#invoke:Lang|get_string|StatDesc_SprintSpeed}}</span>]]:
| style="white-space: nowrap;"| {{Icon/Green|[[File:Move speed sprint.png|20px|link=Move Speed#Sprint]]|{{{sprint_speed|{{#invoke:HeroData|get_hero_var|{{#var:hero_key_or_en}}|SprintSpeed|2}}}}}m/s{{#invoke:HeroData|get_hero_scalar|{{#var:hero_key_or_en}}|Level|SprintSpeed}}{{#invoke:HeroData|get_hero_scalar|{{#var:hero_key_or_en}}|Spirit|SprintSpeed}}}}
|-
<!---- Dash Speed ---->
| [[Stamina{{If_lang}}#Dash_Speed|<span>{{#invoke:Lang|get_string|DashSpeed_label}}</span>]]:
| style="white-space: nowrap;"| {{Icon/Green|[[File:Springy_boots_icon.png|20px|link=Stamina#Dash_Speed]]|{{#invoke:HeroData|get_hero_var|{{#var:hero_key_or_en}}|GroundDashSpeed|3}}s{{#invoke:HeroData|get_hero_scalar|{{#var:hero_key_or_en}}|Level|GroundDashSpeed}}{{#invoke:HeroData|get_hero_scalar|{{#var:hero_key_or_en}}|Spirit|GroundDashSpeed}}}}
|-
<!---- Stamina ---->
| [[Stamina{{If_lang}}|<span>{{#invoke:Lang|get_string|StatDesc_Stamina}}</span>]]:
| style="white-space: nowrap;"| {{Icon/Green|[[File:Springy_boots_icon.png|20px|link=Stamina]]|{{{stamina|{{#invoke:HeroData|get_hero_var|{{#var:hero_key_or_en}}|Stamina|2}}}}}{{#invoke:HeroData|get_hero_scalar|{{#var:hero_key_or_en}}|Level|Stamina}}{{#invoke:HeroData|get_hero_scalar|{{#var:hero_key_or_en}}|Spirit|Stamina}}}}
|-
<!---- Stamina Cooldown ---->
| [[Stamina{{If_lang}}#Cooldown|<span>{{#invoke:Lang|get_string|StatDesc_StaminaCooldown}}</span>]]:
| style="white-space: nowrap;"|{{Icon/Grey|[[File:AttributeIconTechDuration.png|20px|link=Stamina#Cooldown]]|{{{stamina_cooldown|{{#invoke:HeroData|get_hero_var|{{#var:hero_key_or_en}}|StaminaCooldown|2}}}}}s{{#invoke:HeroData|get_hero_scalar|{{#var:hero_key_or_en}}|Level|StaminaCooldown}}{{#invoke:HeroData|get_hero_scalar|{{#var:hero_key_or_en}}|Spirit|StaminaCooldown}}}}
|}
 
<!---- Spirit Dropdown ---->
|-
! colspan="2" class="infobox-subsection infobox-dropdown infobox-dropdown-spirit" |
{| class="mw-collapsible mw-collapsed infobox-subsection-child"
|+ class="infobox-dropdown-header" | [[Stats#Vitality|<span class="infotext-bold infobox-dropdown-title">{{#invoke:Lang|get_string|CitadelHeroStats_Spirit}}</span>]]
|-
| style="padding-top: 8px;"| [[Spirit Power{{If_lang}}|<span>{{#invoke:Lang|get_string|SpiritPower_label}}</span>]]:
| style="white-space: nowrap; padding-right: 4px; padding-top: 8px;"| {{Icon/Purple|[[File:Spirit_icon_noborder.png|20px|link=Spirit Power{{If_lang}}]]|{{{spirit_power|{{#invoke:HeroData|get_hero_var|{{#var:hero_key_or_en}}|TechPower|2}}}}}{{#invoke:HeroData|get_hero_scalar|{{#var:hero_key_or_en}}|Level|TechPower}}{{#invoke:HeroData|get_hero_scalar|{{#var:hero_key_or_en}}|Spirit|TechPower}}}}
|}
 
<!---- "Information" ---->
|-
!colspan="2" class="infobox-text-stat-subtitle"|
<span class="infotext-bold infotext-title infotext-big">{{#invoke:Dictionary|translate|Information}}</span>
|-
! colspan="2" class="infobox-subsection" |
{| class="infobox-subsection-child"
|-
<!---- Pronouns (Manual Input) ---->
{{#if: {{#var:pronouns}} |
{{!}}Pronouns:
{{!}}{{#var:pronouns}}
}}
}}
|-
|-| Dynamo=
<!---- Voice Actor (Manual Input) ---->
{{Samlovesmath/Infobox hero
{{#if: {{#var:voice_actor}} |
| key = hero_dynamo
{{!}}{{#invoke:Dictionary|translate|VoiceActor}}:
| voice_actor = John Patrick Lowrie
{{!}}{{#var:voice_actor}}
| release_date = April 24, 2024
| codenames = Prof_dynamo; Prof; Sumo; Jeong
}}
}}
|-
|-| Lady Geist=
<!---- Release Date (Manual Input) ---->
{{Samlovesmath/Infobox hero
{{#if: {{#var:release_date}} |
| key = hero_ghost
{{!}}[[Heroes by release{{If_lang}}|<span>{{#invoke:Dictionary|translate|ReleaseDate}}</span>]]:
| voice_actor = Abigail Marlowe
{{!}}{{#var:release_date}}
| release_date = April 24, 2024
| codenames = Geist; Ghost; Spectre
}}
}}
|-
|-| Rem=
<!---- Codenames (Manual Input) ---->
{{Samlovesmath/Infobox hero
{{#if: {{#var:codenames}} |
| key = hero_familiar
{{!}}{{#invoke:Dictionary|translate|Codenames}}:
| release_date = January 26, 2026
{{!}}{{#var:codenames}}
| codenames = Familiar
}}
}}
|}
|-| Sinclair=
 
{{Samlovesmath/Infobox hero
|}
| key = hero_magician
</div>
| release_date = January 17, 2025
 
| codenames = Magician
<!---- Search Engine Optimization ---->
| pronouns = They/Them
{{#seo:
| voice_actor = Harron Atkins (Henry);
|keywords=Deadlock, {{{name|{{#invoke:Lang|get_string|{{{key}}}}}}}}, hero, abilities, wiki, MOBA, shooter, character, heroes, game, valve
Andia Winslow (Savannah)
|image_alt = A portrait image of {{{name|{{#invoke:Lang|get_string|{{{key}}}}}}}} from the video game Deadlock
}}
}}
 
</tabber></div>
<!---- Quotes rendering ---->
{{#ifeq: {{{no_summary|}}}|true
||{{Quotation||
<div class{{=}}"infobox-herotags" style{{=}}{{#var:quotemark}}--infobox_th_tags_back: #{{#invoke:Samlovesmath/Sandbox|get_value|{{#var:key}}|tags_back}}; --infobox_th_tags_text: #{{#invoke:Samlovesmath/Sandbox|get_value|{{#var:key}}|tags_text}}; {{#var:quotemark}}>
<div><div class{{=}}"infobox-herotag-back"></div><div class{{=}}"infobox-herotag-text">{{#invoke:HeroData|get_hero_tag|{{#var:hero_en}}|1}}</div></div>
<div><div class{{=}}"infobox-herotag-back"></div><div class{{=}}"infobox-herotag-text">{{#invoke:HeroData|get_hero_tag|{{#var:hero_en}}|2}}</div></div>
<div><div class{{=}}"infobox-herotag-back"></div><div class{{=}}"infobox-herotag-text">{{#invoke:HeroData|get_hero_tag|{{#var:hero_en}}|3}}</div></div>
</div>}}}}