<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://deadlock.wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=~2026-InfernusBoundlessDynamo701</id>
	<title>The Deadlock Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://deadlock.wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=~2026-InfernusBoundlessDynamo701"/>
	<link rel="alternate" type="text/html" href="https://deadlock.wiki/Special:Contributions/~2026-InfernusBoundlessDynamo701"/>
	<updated>2026-09-06T06:29:19Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://deadlock.wiki/Module:StreetBrawlItems?diff=96722</id>
		<title>Module:StreetBrawlItems</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/Module:StreetBrawlItems?diff=96722"/>
		<updated>2026-07-19T13:18:59Z</updated>

		<summary type="html">&lt;p&gt;~2026-InfernusBoundlessDynamo701: Wrap rendered groups in flex rows so cards and hero icons have consistent spacing (with help from vergir-bot LLM)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local sb = mw.loadJsonData(&amp;quot;Data:StreetBrawlData.json&amp;quot;)[&amp;quot;item-buckets&amp;quot;]&lt;br /&gt;
local items = mw.loadJsonData(&amp;quot;Data:ItemData.json&amp;quot;)&lt;br /&gt;
local heroes = mw.loadJsonData(&amp;quot;Data:HeroData.json&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
local NAME_TO_KEY, KEY_TO_NAME, RELEASED = {}, {}, {}&lt;br /&gt;
for key, h in pairs(heroes) do&lt;br /&gt;
	if type(h) == &amp;quot;table&amp;quot; and h.Name then&lt;br /&gt;
		KEY_TO_NAME[key] = h.Name&lt;br /&gt;
		NAME_TO_KEY[mw.ustring.lower(h.Name)] = key&lt;br /&gt;
		if not h.InDevelopment and not h.IsDisabled then RELEASED[key] = true end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function hero_key(input)&lt;br /&gt;
	if not input then return nil end&lt;br /&gt;
	input = mw.text.trim(input)&lt;br /&gt;
	if input == &amp;quot;&amp;quot; then return nil end&lt;br /&gt;
	if heroes[input] then return input end&lt;br /&gt;
	return NAME_TO_KEY[mw.ustring.lower(input)]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function iname(code) local it = items[code]; return it and it.Name or nil end&lt;br /&gt;
local function iok(code) local it = items[code]; return it ~= nil and it.Name ~= nil end&lt;br /&gt;
local function itier(code)&lt;br /&gt;
	local it = items[code]; if not it then return nil end&lt;br /&gt;
	if it.StreetBrawl == true then return 5 end&lt;br /&gt;
	return it.Tier&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function render_item(frame, code, style)&lt;br /&gt;
	local name = iname(code); if not name then return nil end&lt;br /&gt;
	if style == &amp;quot;icon&amp;quot; then return frame:expandTemplate{title = &amp;quot;ItemIcon&amp;quot;, args = {name}} end&lt;br /&gt;
	return frame:expandTemplate{title = &amp;quot;ItemBox&amp;quot;, args = {name, showTierTag = &amp;quot;true&amp;quot;}}&lt;br /&gt;
end&lt;br /&gt;
local function render_hero(frame, key)&lt;br /&gt;
	local name = KEY_TO_NAME[key]; if not name then return nil end&lt;br /&gt;
	return frame:expandTemplate{title = &amp;quot;HeroIcon&amp;quot;, args = {name}}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Lays rendered members out in a wrapping flex row with a consistent gap.&lt;br /&gt;
local function flexrow(parts, gap, center)&lt;br /&gt;
	if #parts == 0 then return &amp;quot;&amp;quot; end&lt;br /&gt;
	local align = center and &amp;quot;center&amp;quot; or &amp;quot;flex-start&amp;quot;&lt;br /&gt;
	return &#039;&amp;lt;div style=&amp;quot;display:flex; flex-wrap:wrap; gap:&#039; .. gap .. &#039;; align-items:&#039; .. align .. &#039;&amp;quot;&amp;gt;&#039;&lt;br /&gt;
		.. table.concat(parts) .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Wraps a rendered row with an optional bold label / italic note, or a collapsible box.&lt;br /&gt;
-- Returns &amp;quot;&amp;quot; when the row is empty, so nothing (not even the label) shows.&lt;br /&gt;
local function wrap(inner, label, note, collapse)&lt;br /&gt;
	if inner == &amp;quot;&amp;quot; then return &amp;quot;&amp;quot; end&lt;br /&gt;
	if collapse then&lt;br /&gt;
		local header = (label and label ~= &amp;quot;&amp;quot;) and label or &amp;quot;&amp;amp;nbsp;&amp;quot;&lt;br /&gt;
		return &#039;{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;width:100%&amp;quot;\n&#039;&lt;br /&gt;
			.. &#039;! style=&amp;quot;text-align:left&amp;quot; | &#039; .. header .. &#039;\n|-\n| &#039; .. inner .. &#039;\n|}&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local pre = &amp;quot;&amp;quot;&lt;br /&gt;
	if label and label ~= &amp;quot;&amp;quot; then pre = pre .. &amp;quot;&#039;&#039;&#039;&amp;quot; .. label .. &amp;quot;&#039;&#039;&#039;&amp;lt;br&amp;gt;&amp;quot; end&lt;br /&gt;
	if note and note ~= &amp;quot;&amp;quot; then pre = pre .. &amp;quot;&#039;&#039;&amp;quot; .. note .. &amp;quot;&#039;&#039;&amp;lt;br&amp;gt;&amp;quot; end&lt;br /&gt;
	return pre .. inner&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function hero_sets(hkey)&lt;br /&gt;
	local favored, unfavored, special, counter = {}, {}, {}, {}&lt;br /&gt;
	for _, o in ipairs(sb.Outliers) do&lt;br /&gt;
		if o.Hero == hkey then&lt;br /&gt;
			if o.Bucket == &amp;quot;Good&amp;quot; then favored[o.Item] = true; special[o.Item] = true&lt;br /&gt;
			elseif type(o.Weight) == &amp;quot;number&amp;quot; and o.Weight &amp;lt; 1 then unfavored[o.Item] = true; special[o.Item] = true end&lt;br /&gt;
			if o.Counter ~= nil then counter[#counter + 1] = o.Item end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return favored, unfavored, special, counter&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function item_code(input)&lt;br /&gt;
	input = mw.text.trim(input or &amp;quot;&amp;quot;)&lt;br /&gt;
	if input == &amp;quot;&amp;quot; then return nil end&lt;br /&gt;
	if items[input] then return input end&lt;br /&gt;
	for k, v in pairs(items) do&lt;br /&gt;
		if type(v) == &amp;quot;table&amp;quot; and v.Name == input and v.IsDisabled ~= true then return k end&lt;br /&gt;
	end&lt;br /&gt;
	for k, v in pairs(items) do&lt;br /&gt;
		if type(v) == &amp;quot;table&amp;quot; and v.Name == input then return k end&lt;br /&gt;
	end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:StreetBrawlItems|hero|HERO|GROUP|TIER|label=..|collapse=yes|style=card|icon}}&lt;br /&gt;
-- GROUP = favored | unfavored | common   (use hero_counter for counters)&lt;br /&gt;
function p.hero(frame)&lt;br /&gt;
	local hkey = hero_key(frame.args[1]); if not hkey then return &amp;quot;&amp;quot; end&lt;br /&gt;
	local group = mw.text.trim(frame.args[2] or &amp;quot;&amp;quot;)&lt;br /&gt;
	local tier = tonumber(frame.args[3])&lt;br /&gt;
	local style = frame.args.style&lt;br /&gt;
	if not style or style == &amp;quot;&amp;quot; then style = (group == &amp;quot;common&amp;quot;) and &amp;quot;icon&amp;quot; or &amp;quot;card&amp;quot; end&lt;br /&gt;
	local collapse = (frame.args.collapse == &amp;quot;yes&amp;quot; or frame.args.collapse == &amp;quot;true&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	local favored, unfavored, special = hero_sets(hkey)&lt;br /&gt;
	local pred&lt;br /&gt;
	if group == &amp;quot;favored&amp;quot; then pred = function(c) return favored[c] end&lt;br /&gt;
	elseif group == &amp;quot;unfavored&amp;quot; then pred = function(c) return unfavored[c] end&lt;br /&gt;
	elseif group == &amp;quot;common&amp;quot; then pred = function(c) return not special[c] end&lt;br /&gt;
	else return &amp;quot;&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
	local codes = {}&lt;br /&gt;
	for _, c in ipairs(sb.AvailableItems) do&lt;br /&gt;
		if iok(c) and (tier == nil or itier(c) == tier) and pred(c) then codes[#codes + 1] = c end&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(codes, function(a, b) return (iname(a) or a) &amp;lt; (iname(b) or b) end)&lt;br /&gt;
&lt;br /&gt;
	local parts = {}&lt;br /&gt;
	for _, c in ipairs(codes) do local r = render_item(frame, c, style); if r then parts[#parts + 1] = r end end&lt;br /&gt;
	local is_icon = (style == &amp;quot;icon&amp;quot;)&lt;br /&gt;
	local inner = flexrow(parts, is_icon and &amp;quot;4px 10px&amp;quot; or &amp;quot;8px&amp;quot;, is_icon)&lt;br /&gt;
	return wrap(inner, frame.args.label, nil, collapse)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:StreetBrawlItems|hero_counter|HERO|heading=..|note=..}}&lt;br /&gt;
-- Returns the whole counter block (heading + note + cards), or &amp;quot;&amp;quot; when empty.&lt;br /&gt;
function p.hero_counter(frame)&lt;br /&gt;
	local hkey = hero_key(frame.args[1]); if not hkey then return &amp;quot;&amp;quot; end&lt;br /&gt;
	local _, _, _, counter = hero_sets(hkey)&lt;br /&gt;
&lt;br /&gt;
	local codes = {}&lt;br /&gt;
	for _, c in ipairs(counter) do if iok(c) then codes[#codes + 1] = c end end&lt;br /&gt;
	if #codes == 0 then return &amp;quot;&amp;quot; end&lt;br /&gt;
	table.sort(codes, function(a, b) return (iname(a) or a) &amp;lt; (iname(b) or b) end)&lt;br /&gt;
&lt;br /&gt;
	local parts = {}&lt;br /&gt;
	for _, c in ipairs(codes) do local r = render_item(frame, c, &amp;quot;card&amp;quot;); if r then parts[#parts + 1] = r end end&lt;br /&gt;
&lt;br /&gt;
	local out = {}&lt;br /&gt;
	local heading = frame.args.heading&lt;br /&gt;
	if heading and heading ~= &amp;quot;&amp;quot; then out[#out + 1] = &amp;quot;=== &amp;quot; .. heading .. &amp;quot; ===&amp;quot; end&lt;br /&gt;
	local note = frame.args.note&lt;br /&gt;
	if note and note ~= &amp;quot;&amp;quot; then out[#out + 1] = &amp;quot;&#039;&#039;&amp;quot; .. note .. &amp;quot;&#039;&#039;&amp;quot; end&lt;br /&gt;
	out[#out + 1] = flexrow(parts, &amp;quot;8px&amp;quot;, false)&lt;br /&gt;
	return table.concat(out, &amp;quot;\n&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:StreetBrawlItems|item|ITEM|GROUP|label=..|note=..}}&lt;br /&gt;
-- GROUP = favored | unfavored | counter&lt;br /&gt;
function p.item(frame)&lt;br /&gt;
	local code = item_code(frame.args[1]); if not code then return &amp;quot;&amp;quot; end&lt;br /&gt;
	local group = mw.text.trim(frame.args[2] or &amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	local fav, unf, ctr = {}, {}, {}&lt;br /&gt;
	for _, o in ipairs(sb.Outliers) do&lt;br /&gt;
		if o.Item == code and RELEASED[o.Hero] then&lt;br /&gt;
			if o.Bucket == &amp;quot;Good&amp;quot; then fav[#fav + 1] = o.Hero&lt;br /&gt;
			elseif type(o.Weight) == &amp;quot;number&amp;quot; and o.Weight &amp;lt; 1 then unf[#unf + 1] = o.Hero end&lt;br /&gt;
			if o.Counter ~= nil then ctr[#ctr + 1] = o.Hero end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local list = (group == &amp;quot;favored&amp;quot; and fav) or (group == &amp;quot;unfavored&amp;quot; and unf) or (group == &amp;quot;counter&amp;quot; and ctr)&lt;br /&gt;
	if not list then return &amp;quot;&amp;quot; end&lt;br /&gt;
	table.sort(list, function(a, b) return (KEY_TO_NAME[a] or a) &amp;lt; (KEY_TO_NAME[b] or b) end)&lt;br /&gt;
&lt;br /&gt;
	local parts = {}&lt;br /&gt;
	for _, k in ipairs(list) do local r = render_hero(frame, k); if r then parts[#parts + 1] = r end end&lt;br /&gt;
	local inner = flexrow(parts, &amp;quot;4px 10px&amp;quot;, true)&lt;br /&gt;
	return wrap(inner, frame.args.label, frame.args.note, false)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:StreetBrawlItems|item_in_pool|ITEM}} -&amp;gt; &amp;quot;1&amp;quot; if in the Street Brawl pool, else &amp;quot;&amp;quot;&lt;br /&gt;
function p.item_in_pool(frame)&lt;br /&gt;
	local code = item_code(frame.args[1]); if not code then return &amp;quot;&amp;quot; end&lt;br /&gt;
	for _, c in ipairs(sb.AvailableItems) do if c == code then return &amp;quot;1&amp;quot; end end&lt;br /&gt;
	return &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>~2026-InfernusBoundlessDynamo701</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/User:Vergir?diff=96642</id>
		<title>User:Vergir</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/User:Vergir?diff=96642"/>
		<updated>2026-07-19T13:16:32Z</updated>

		<summary type="html">&lt;p&gt;~2026-InfernusBoundlessDynamo701: Prepend item-side Street Brawl previews for verification (with help from vergir-bot LLM)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;ITEM PREVIEW CHECK&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;target_stun (in pool, has counters):&#039;&#039;&#039;&lt;br /&gt;
{{ItemStreetBrawl|upgrade_target_stun}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bullet Armor (not in pool):&#039;&#039;&#039;&lt;br /&gt;
{{ItemStreetBrawl|Bullet Armor}}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
{{AbilityTable|dontbreakstealth}}&lt;br /&gt;
&lt;br /&gt;
ash&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&#039;&#039;&#039;Street Brawl template previews (sandbox)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hero preview — Holliday&#039;&#039;&#039;&lt;br /&gt;
{{HeroStreetBrawl|Holliday}}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&#039;&#039;&#039;Item preview — in pool with counters (target_stun)&#039;&#039;&#039;&lt;br /&gt;
{{ItemStreetBrawl|upgrade_target_stun}}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&#039;&#039;&#039;Item preview — pool item, unfavored-heavy (Shrink Ray)&#039;&#039;&#039;&lt;br /&gt;
{{ItemStreetBrawl|Shrink Ray}}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&#039;&#039;&#039;Item preview — not in pool (Bullet Armor)&#039;&#039;&#039;&lt;br /&gt;
{{ItemStreetBrawl|Bullet Armor}}&lt;/div&gt;</summary>
		<author><name>~2026-InfernusBoundlessDynamo701</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/User:Vergir?diff=96641</id>
		<title>User:Vergir</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/User:Vergir?diff=96641"/>
		<updated>2026-07-19T13:13:46Z</updated>

		<summary type="html">&lt;p&gt;~2026-InfernusBoundlessDynamo701: Append Street Brawl template render previews for review (with help from vergir-bot LLM)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{AbilityTable|dontbreakstealth}}&lt;br /&gt;
&lt;br /&gt;
ash&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&#039;&#039;&#039;Street Brawl template previews (sandbox)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hero preview — Holliday&#039;&#039;&#039;&lt;br /&gt;
{{HeroStreetBrawl|Holliday}}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&#039;&#039;&#039;Item preview — in pool with counters (target_stun)&#039;&#039;&#039;&lt;br /&gt;
{{ItemStreetBrawl|upgrade_target_stun}}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&#039;&#039;&#039;Item preview — pool item, unfavored-heavy (Shrink Ray)&#039;&#039;&#039;&lt;br /&gt;
{{ItemStreetBrawl|Shrink Ray}}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&#039;&#039;&#039;Item preview — not in pool (Bullet Armor)&#039;&#039;&#039;&lt;br /&gt;
{{ItemStreetBrawl|Bullet Armor}}&lt;/div&gt;</summary>
		<author><name>~2026-InfernusBoundlessDynamo701</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/Template:ItemStreetBrawl?diff=96640</id>
		<title>Template:ItemStreetBrawl</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/Template:ItemStreetBrawl?diff=96640"/>
		<updated>2026-07-19T13:12:47Z</updated>

		<summary type="html">&lt;p&gt;~2026-InfernusBoundlessDynamo701: Populate item Street Brawl section: more/less likely heroes and counter block via Module:StreetBrawlItems (with help from vergir-bot LLM)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;== Street Brawl ==&lt;br /&gt;
{{#if:{{#invoke:StreetBrawlItems|item_in_pool|{{{1}}}}}|In [[Street Brawl]], this item can be offered to any hero, but it is weighted to appear more or less often for some.&lt;br /&gt;
&lt;br /&gt;
{{#invoke:StreetBrawlItems|item|{{{1}}}|favored|label=More likely for}}&lt;br /&gt;
{{#invoke:StreetBrawlItems|item|{{{1}}}|unfavored|label=Less likely for}}&lt;br /&gt;
{{#invoke:StreetBrawlItems|item|{{{1}}}|counter|label=Counters|note=Offered more often to players facing these heroes.}}|&#039;&#039;This item does not appear in the [[Street Brawl]] item pool.&#039;&#039;}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;{{Documentation}}&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>~2026-InfernusBoundlessDynamo701</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/Template:HeroStreetBrawlItems?diff=96639</id>
		<title>Template:HeroStreetBrawlItems</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/Template:HeroStreetBrawlItems?diff=96639"/>
		<updated>2026-07-19T13:12:28Z</updated>

		<summary type="html">&lt;p&gt;~2026-InfernusBoundlessDynamo701: Populate hero Street Brawl section: tier headings + favored/unfavored/common groups and counter block via Module:StreetBrawlItems (with help from vergir-bot LLM)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;== Street Brawl ==&lt;br /&gt;
In [[Street Brawl]], every hero draws from a shared item pool. The cards below show which items are weighted &#039;&#039;&#039;for&#039;&#039;&#039; and &#039;&#039;&#039;against&#039;&#039;&#039; {{{1}}}, grouped by [[Street Brawl#Legendary Items|tier]]. The full shared pool sits inside each &amp;quot;Common&amp;quot; collapsible.&lt;br /&gt;
&lt;br /&gt;
=== Tier 1 ===&lt;br /&gt;
{{#invoke:StreetBrawlItems|hero|{{{1}}}|favored|1|label=Favored}}&lt;br /&gt;
{{#invoke:StreetBrawlItems|hero|{{{1}}}|unfavored|1|label=Unfavored}}&lt;br /&gt;
{{#invoke:StreetBrawlItems|hero|{{{1}}}|common|1|label=Common|collapse=yes}}&lt;br /&gt;
&lt;br /&gt;
=== Tier 2 ===&lt;br /&gt;
{{#invoke:StreetBrawlItems|hero|{{{1}}}|favored|2|label=Favored}}&lt;br /&gt;
{{#invoke:StreetBrawlItems|hero|{{{1}}}|unfavored|2|label=Unfavored}}&lt;br /&gt;
{{#invoke:StreetBrawlItems|hero|{{{1}}}|common|2|label=Common|collapse=yes}}&lt;br /&gt;
&lt;br /&gt;
=== Tier 3 ===&lt;br /&gt;
{{#invoke:StreetBrawlItems|hero|{{{1}}}|favored|3|label=Favored}}&lt;br /&gt;
{{#invoke:StreetBrawlItems|hero|{{{1}}}|unfavored|3|label=Unfavored}}&lt;br /&gt;
{{#invoke:StreetBrawlItems|hero|{{{1}}}|common|3|label=Common|collapse=yes}}&lt;br /&gt;
&lt;br /&gt;
=== Tier 4 ===&lt;br /&gt;
{{#invoke:StreetBrawlItems|hero|{{{1}}}|favored|4|label=Favored}}&lt;br /&gt;
{{#invoke:StreetBrawlItems|hero|{{{1}}}|unfavored|4|label=Unfavored}}&lt;br /&gt;
{{#invoke:StreetBrawlItems|hero|{{{1}}}|common|4|label=Common|collapse=yes}}&lt;br /&gt;
&lt;br /&gt;
=== Legendary ===&lt;br /&gt;
{{#invoke:StreetBrawlItems|hero|{{{1}}}|favored|5|label=Favored}}&lt;br /&gt;
{{#invoke:StreetBrawlItems|hero|{{{1}}}|unfavored|5|label=Unfavored}}&lt;br /&gt;
{{#invoke:StreetBrawlItems|hero|{{{1}}}|common|5|label=Common|collapse=yes}}&lt;br /&gt;
&lt;br /&gt;
{{#invoke:StreetBrawlItems|hero_counter|{{{1}}}|heading=Counter items|note=When facing {{{1}}} in Street Brawl, the enemy team is more likely to be offered these items as counters.}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;{{Documentation}}&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>~2026-InfernusBoundlessDynamo701</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/Module:StreetBrawlItems?diff=96638</id>
		<title>Module:StreetBrawlItems</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/Module:StreetBrawlItems?diff=96638"/>
		<updated>2026-07-19T13:11:36Z</updated>

		<summary type="html">&lt;p&gt;~2026-InfernusBoundlessDynamo701: Populate Street Brawl item-weighting helper: joins Data:StreetBrawlData.json with ItemData/HeroData, renders favored/unfavored/common/counter groups for hero and item pages (with help from vergir-bot LLM)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local sb = mw.loadJsonData(&amp;quot;Data:StreetBrawlData.json&amp;quot;)[&amp;quot;item-buckets&amp;quot;]&lt;br /&gt;
local items = mw.loadJsonData(&amp;quot;Data:ItemData.json&amp;quot;)&lt;br /&gt;
local heroes = mw.loadJsonData(&amp;quot;Data:HeroData.json&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
local NAME_TO_KEY, KEY_TO_NAME, RELEASED = {}, {}, {}&lt;br /&gt;
for key, h in pairs(heroes) do&lt;br /&gt;
	if type(h) == &amp;quot;table&amp;quot; and h.Name then&lt;br /&gt;
		KEY_TO_NAME[key] = h.Name&lt;br /&gt;
		NAME_TO_KEY[mw.ustring.lower(h.Name)] = key&lt;br /&gt;
		if not h.InDevelopment and not h.IsDisabled then RELEASED[key] = true end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function hero_key(input)&lt;br /&gt;
	if not input then return nil end&lt;br /&gt;
	input = mw.text.trim(input)&lt;br /&gt;
	if input == &amp;quot;&amp;quot; then return nil end&lt;br /&gt;
	if heroes[input] then return input end&lt;br /&gt;
	return NAME_TO_KEY[mw.ustring.lower(input)]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function iname(code) local it = items[code]; return it and it.Name or nil end&lt;br /&gt;
local function iok(code) local it = items[code]; return it ~= nil and it.Name ~= nil end&lt;br /&gt;
local function itier(code)&lt;br /&gt;
	local it = items[code]; if not it then return nil end&lt;br /&gt;
	if it.StreetBrawl == true then return 5 end&lt;br /&gt;
	return it.Tier&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function render_item(frame, code, style)&lt;br /&gt;
	local name = iname(code); if not name then return nil end&lt;br /&gt;
	if style == &amp;quot;icon&amp;quot; then return frame:expandTemplate{title = &amp;quot;ItemIcon&amp;quot;, args = {name}} end&lt;br /&gt;
	return frame:expandTemplate{title = &amp;quot;ItemBox&amp;quot;, args = {name, showTierTag = &amp;quot;true&amp;quot;}}&lt;br /&gt;
end&lt;br /&gt;
local function render_hero(frame, key)&lt;br /&gt;
	local name = KEY_TO_NAME[key]; if not name then return nil end&lt;br /&gt;
	return frame:expandTemplate{title = &amp;quot;HeroIcon&amp;quot;, args = {name}}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Wraps a rendered list with an optional bold label / italic note, or a collapsible box.&lt;br /&gt;
-- Returns &amp;quot;&amp;quot; when the list is empty, so nothing (not even the label) shows.&lt;br /&gt;
local function wrap(inner, label, note, collapse)&lt;br /&gt;
	if inner == &amp;quot;&amp;quot; then return &amp;quot;&amp;quot; end&lt;br /&gt;
	if collapse then&lt;br /&gt;
		local header = (label and label ~= &amp;quot;&amp;quot;) and label or &amp;quot;&amp;amp;nbsp;&amp;quot;&lt;br /&gt;
		return &#039;{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;width:100%&amp;quot;\n&#039;&lt;br /&gt;
			.. &#039;! style=&amp;quot;text-align:left&amp;quot; | &#039; .. header .. &#039;\n|-\n| &#039; .. inner .. &#039;\n|}&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local pre = &amp;quot;&amp;quot;&lt;br /&gt;
	if label and label ~= &amp;quot;&amp;quot; then pre = pre .. &amp;quot;&#039;&#039;&#039;&amp;quot; .. label .. &amp;quot;&#039;&#039;&#039;&amp;lt;br&amp;gt;&amp;quot; end&lt;br /&gt;
	if note and note ~= &amp;quot;&amp;quot; then pre = pre .. &amp;quot;&#039;&#039;&amp;quot; .. note .. &amp;quot;&#039;&#039;&amp;lt;br&amp;gt;&amp;quot; end&lt;br /&gt;
	return pre .. inner&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function hero_sets(hkey)&lt;br /&gt;
	local favored, unfavored, special, counter = {}, {}, {}, {}&lt;br /&gt;
	for _, o in ipairs(sb.Outliers) do&lt;br /&gt;
		if o.Hero == hkey then&lt;br /&gt;
			if o.Bucket == &amp;quot;Good&amp;quot; then favored[o.Item] = true; special[o.Item] = true&lt;br /&gt;
			elseif type(o.Weight) == &amp;quot;number&amp;quot; and o.Weight &amp;lt; 1 then unfavored[o.Item] = true; special[o.Item] = true end&lt;br /&gt;
			if o.Counter ~= nil then counter[#counter + 1] = o.Item end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return favored, unfavored, special, counter&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function item_code(input)&lt;br /&gt;
	input = mw.text.trim(input or &amp;quot;&amp;quot;)&lt;br /&gt;
	if input == &amp;quot;&amp;quot; then return nil end&lt;br /&gt;
	if items[input] then return input end&lt;br /&gt;
	for k, v in pairs(items) do&lt;br /&gt;
		if type(v) == &amp;quot;table&amp;quot; and v.Name == input and v.IsDisabled ~= true then return k end&lt;br /&gt;
	end&lt;br /&gt;
	for k, v in pairs(items) do&lt;br /&gt;
		if type(v) == &amp;quot;table&amp;quot; and v.Name == input then return k end&lt;br /&gt;
	end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:StreetBrawlItems|hero|HERO|GROUP|TIER|label=..|collapse=yes|style=card|icon}}&lt;br /&gt;
-- GROUP = favored | unfavored | common   (use hero_counter for counters)&lt;br /&gt;
function p.hero(frame)&lt;br /&gt;
	local hkey = hero_key(frame.args[1]); if not hkey then return &amp;quot;&amp;quot; end&lt;br /&gt;
	local group = mw.text.trim(frame.args[2] or &amp;quot;&amp;quot;)&lt;br /&gt;
	local tier = tonumber(frame.args[3])&lt;br /&gt;
	local style = frame.args.style&lt;br /&gt;
	if not style or style == &amp;quot;&amp;quot; then style = (group == &amp;quot;common&amp;quot;) and &amp;quot;icon&amp;quot; or &amp;quot;card&amp;quot; end&lt;br /&gt;
	local collapse = (frame.args.collapse == &amp;quot;yes&amp;quot; or frame.args.collapse == &amp;quot;true&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	local favored, unfavored, special = hero_sets(hkey)&lt;br /&gt;
	local pred&lt;br /&gt;
	if group == &amp;quot;favored&amp;quot; then pred = function(c) return favored[c] end&lt;br /&gt;
	elseif group == &amp;quot;unfavored&amp;quot; then pred = function(c) return unfavored[c] end&lt;br /&gt;
	elseif group == &amp;quot;common&amp;quot; then pred = function(c) return not special[c] end&lt;br /&gt;
	else return &amp;quot;&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
	local codes = {}&lt;br /&gt;
	for _, c in ipairs(sb.AvailableItems) do&lt;br /&gt;
		if iok(c) and (tier == nil or itier(c) == tier) and pred(c) then codes[#codes + 1] = c end&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(codes, function(a, b) return (iname(a) or a) &amp;lt; (iname(b) or b) end)&lt;br /&gt;
&lt;br /&gt;
	local parts = {}&lt;br /&gt;
	for _, c in ipairs(codes) do local r = render_item(frame, c, style); if r then parts[#parts + 1] = r end end&lt;br /&gt;
	return wrap(table.concat(parts), frame.args.label, nil, collapse)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:StreetBrawlItems|hero_counter|HERO|heading=..|note=..}}&lt;br /&gt;
-- Returns the whole counter block (heading + note + cards), or &amp;quot;&amp;quot; when empty.&lt;br /&gt;
function p.hero_counter(frame)&lt;br /&gt;
	local hkey = hero_key(frame.args[1]); if not hkey then return &amp;quot;&amp;quot; end&lt;br /&gt;
	local _, _, _, counter = hero_sets(hkey)&lt;br /&gt;
&lt;br /&gt;
	local codes = {}&lt;br /&gt;
	for _, c in ipairs(counter) do if iok(c) then codes[#codes + 1] = c end end&lt;br /&gt;
	if #codes == 0 then return &amp;quot;&amp;quot; end&lt;br /&gt;
	table.sort(codes, function(a, b) return (iname(a) or a) &amp;lt; (iname(b) or b) end)&lt;br /&gt;
&lt;br /&gt;
	local parts = {}&lt;br /&gt;
	for _, c in ipairs(codes) do local r = render_item(frame, c, &amp;quot;card&amp;quot;); if r then parts[#parts + 1] = r end end&lt;br /&gt;
&lt;br /&gt;
	local out = {}&lt;br /&gt;
	local heading = frame.args.heading&lt;br /&gt;
	if heading and heading ~= &amp;quot;&amp;quot; then out[#out + 1] = &amp;quot;=== &amp;quot; .. heading .. &amp;quot; ===&amp;quot; end&lt;br /&gt;
	local note = frame.args.note&lt;br /&gt;
	if note and note ~= &amp;quot;&amp;quot; then out[#out + 1] = &amp;quot;&#039;&#039;&amp;quot; .. note .. &amp;quot;&#039;&#039;\n&amp;quot; end&lt;br /&gt;
	out[#out + 1] = table.concat(parts)&lt;br /&gt;
	return table.concat(out, &amp;quot;\n&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:StreetBrawlItems|item|ITEM|GROUP|label=..|note=..}}&lt;br /&gt;
-- GROUP = favored | unfavored | counter&lt;br /&gt;
function p.item(frame)&lt;br /&gt;
	local code = item_code(frame.args[1]); if not code then return &amp;quot;&amp;quot; end&lt;br /&gt;
	local group = mw.text.trim(frame.args[2] or &amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	local fav, unf, ctr = {}, {}, {}&lt;br /&gt;
	for _, o in ipairs(sb.Outliers) do&lt;br /&gt;
		if o.Item == code and RELEASED[o.Hero] then&lt;br /&gt;
			if o.Bucket == &amp;quot;Good&amp;quot; then fav[#fav + 1] = o.Hero&lt;br /&gt;
			elseif type(o.Weight) == &amp;quot;number&amp;quot; and o.Weight &amp;lt; 1 then unf[#unf + 1] = o.Hero end&lt;br /&gt;
			if o.Counter ~= nil then ctr[#ctr + 1] = o.Hero end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local list = (group == &amp;quot;favored&amp;quot; and fav) or (group == &amp;quot;unfavored&amp;quot; and unf) or (group == &amp;quot;counter&amp;quot; and ctr)&lt;br /&gt;
	if not list then return &amp;quot;&amp;quot; end&lt;br /&gt;
	table.sort(list, function(a, b) return (KEY_TO_NAME[a] or a) &amp;lt; (KEY_TO_NAME[b] or b) end)&lt;br /&gt;
&lt;br /&gt;
	local parts = {}&lt;br /&gt;
	for _, k in ipairs(list) do local r = render_hero(frame, k); if r then parts[#parts + 1] = r end end&lt;br /&gt;
	return wrap(table.concat(parts), frame.args.label, frame.args.note, false)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:StreetBrawlItems|item_in_pool|ITEM}} -&amp;gt; &amp;quot;1&amp;quot; if in the Street Brawl pool, else &amp;quot;&amp;quot;&lt;br /&gt;
function p.item_in_pool(frame)&lt;br /&gt;
	local code = item_code(frame.args[1]); if not code then return &amp;quot;&amp;quot; end&lt;br /&gt;
	for _, c in ipairs(sb.AvailableItems) do if c == code then return &amp;quot;1&amp;quot; end end&lt;br /&gt;
	return &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>~2026-InfernusBoundlessDynamo701</name></author>
	</entry>
</feed>