<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://nssportwiki.com/index.php?action=history&amp;feed=atom&amp;title=Module%3ABuild_bracket%2FStateChecks</id>
	<title>Module:Build bracket/StateChecks - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://nssportwiki.com/index.php?action=history&amp;feed=atom&amp;title=Module%3ABuild_bracket%2FStateChecks"/>
	<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Module:Build_bracket/StateChecks&amp;action=history"/>
	<updated>2026-08-15T12:25:11Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.40.1</generator>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Module:Build_bracket/StateChecks&amp;diff=76408&amp;oldid=prev</id>
		<title>Osarius: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Module:Build_bracket/StateChecks&amp;diff=76408&amp;oldid=prev"/>
		<updated>2026-07-24T10:50:37Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en-GB&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 10:50, 24 July 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en-GB&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Module:Build_bracket/StateChecks&amp;diff=76407&amp;oldid=prev</id>
		<title>wikipedia&gt;MusikBot II: Protected &quot;Module:Build bracket/StateChecks&quot;: High-risk template or module: 8490 transclusions (more info) ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite))</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Module:Build_bracket/StateChecks&amp;diff=76407&amp;oldid=prev"/>
		<updated>2025-08-18T18:00:36Z</updated>

		<summary type="html">&lt;p&gt;Protected &amp;quot;&lt;a href=&quot;/wiki/Module:Build_bracket/StateChecks&quot; title=&quot;Module:Build bracket/StateChecks&quot;&gt;Module:Build bracket/StateChecks&lt;/a&gt;&amp;quot;: &lt;a href=&quot;https://en.wikipedia.org/wiki/High-risk_templates&quot; class=&quot;extiw&quot; title=&quot;wikipedia:High-risk templates&quot;&gt;High-risk template or module&lt;/a&gt;: 8490 transclusions (&lt;a href=&quot;/index.php?title=User:MusikBot_II/TemplateProtector&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;User:MusikBot II/TemplateProtector (page does not exist)&quot;&gt;more info&lt;/a&gt;) ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite))&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local StateChecks = {}&lt;br /&gt;
&lt;br /&gt;
-- =========================&lt;br /&gt;
-- 1) MODULE BINDINGS&lt;br /&gt;
-- =========================&lt;br /&gt;
-- Bound at runtime&lt;br /&gt;
local state, config, Helpers&lt;br /&gt;
&lt;br /&gt;
-- Local aliases (filled in bind; with fallbacks)&lt;br /&gt;
local isempty, notempty&lt;br /&gt;
&lt;br /&gt;
function StateChecks.bind(_state, _config, _Helpers)&lt;br /&gt;
    state, config, Helpers = _state, _config, _Helpers&lt;br /&gt;
    isempty  = (Helpers and Helpers.isempty)  or function(v) return v == nil or v == &amp;quot;&amp;quot; end&lt;br /&gt;
    notempty = (Helpers and Helpers.notempty) or function(v) return v ~= nil and v ~= &amp;quot;&amp;quot; end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- =========================&lt;br /&gt;
-- 2) CONTENT CHECKS&lt;br /&gt;
-- =========================&lt;br /&gt;
-- True when the entry at (col,row) is empty for rendering purposes.&lt;br /&gt;
-- For &amp;#039;team&amp;#039; → check team text; for &amp;#039;text&amp;#039; → check text; everything else counts as blank.&lt;br /&gt;
function StateChecks.isBlankEntry(col, row)&lt;br /&gt;
    local colEntries = state.entries and state.entries[col]&lt;br /&gt;
    if not colEntries then return true end&lt;br /&gt;
&lt;br /&gt;
    local e = colEntries[row]&lt;br /&gt;
    if not e then return true end&lt;br /&gt;
&lt;br /&gt;
    local ct = e.ctype&lt;br /&gt;
    if ct == &amp;quot;team&amp;quot; then&lt;br /&gt;
        return isempty(e.team)&lt;br /&gt;
    elseif ct == &amp;quot;text&amp;quot; then&lt;br /&gt;
        return isempty(e.text)&lt;br /&gt;
    end&lt;br /&gt;
    -- headers/lines/blanks or anything else are non-content here&lt;br /&gt;
    return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- =========================&lt;br /&gt;
-- 3) SEED VISIBILITY&lt;br /&gt;
-- =========================&lt;br /&gt;
-- Show seeds when forced, when this team has a seed, or when any teammate in the same match has a seed.&lt;br /&gt;
function StateChecks.showSeeds(j, i)&lt;br /&gt;
    local col = state.entries and state.entries[j]&lt;br /&gt;
    if not col then return false end&lt;br /&gt;
&lt;br /&gt;
    local e = col[i]&lt;br /&gt;
    if not e or e.ctype ~= &amp;quot;team&amp;quot; then return false end&lt;br /&gt;
&lt;br /&gt;
    if config.forceseeds or notempty(e.seed) then&lt;br /&gt;
        return true&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local group = e.group&lt;br /&gt;
    local tpm   = state.teamsPerMatch[j] or 2&lt;br /&gt;
    if tpm &amp;lt;= 1 then return false end&lt;br /&gt;
&lt;br /&gt;
    -- Teams are laid out every 2 rows per match.&lt;br /&gt;
    local step  = 2&lt;br /&gt;
    local R     = config.r&lt;br /&gt;
&lt;br /&gt;
    local function neighborHasSeed(idx)&lt;br /&gt;
        local n = col[idx]&lt;br /&gt;
        return n and n.ctype == &amp;quot;team&amp;quot; and n.group == group and notempty(n.seed)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Check teammates forward/back within the match block&lt;br /&gt;
    for k = 1, tpm - 1 do&lt;br /&gt;
        local plus  = i + step * k&lt;br /&gt;
        local minus = i - step * k&lt;br /&gt;
        if plus  &amp;lt;= R and neighborHasSeed(plus)  then return true end&lt;br /&gt;
        if minus &amp;gt;= 1 and neighborHasSeed(minus) then return true end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- =========================&lt;br /&gt;
-- 4) ROUND VISIBILITY (HIDE)&lt;br /&gt;
-- =========================&lt;br /&gt;
-- Mutates state.hide[j][hidx] to false when content is found under a header (keeps legacy semantics).&lt;br /&gt;
&lt;br /&gt;
function StateChecks.teamLegs(j, i)&lt;br /&gt;
    local col          = state.entries and state.entries[j]&lt;br /&gt;
    local roundDefault = (state.rlegs and state.rlegs[j]) or 1&lt;br /&gt;
    if not col then return roundDefault end&lt;br /&gt;
&lt;br /&gt;
    local e = col[i]&lt;br /&gt;
    if not e or e.ctype ~= &amp;quot;team&amp;quot; then return roundDefault end&lt;br /&gt;
&lt;br /&gt;
    local legs = roundDefault&lt;br /&gt;
    if notempty(e.legs) then&lt;br /&gt;
        legs = tonumber(e.legs) or legs&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Treat nil/&amp;#039;&amp;#039; and strings containing &amp;#039;nbsp&amp;#039; as blank&lt;br /&gt;
    local function isScoreBlank(v)&lt;br /&gt;
        if isempty(v) then return true end&lt;br /&gt;
        return type(v) == &amp;quot;string&amp;quot; and v:find(&amp;quot;nbsp&amp;quot;, 1, true) ~= nil&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if config.autolegs and e.score then&lt;br /&gt;
        local l = 1&lt;br /&gt;
        while not isScoreBlank(e.score[l]) do&lt;br /&gt;
            l = l + 1&lt;br /&gt;
        end&lt;br /&gt;
        local inferred = l - 1&lt;br /&gt;
        if inferred &amp;gt; 0 then&lt;br /&gt;
            legs = inferred&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return legs&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- =========================&lt;br /&gt;
-- 6) ROUND CONTENT CHECK&lt;br /&gt;
-- =========================&lt;br /&gt;
-- Used for &amp;#039;byes&amp;#039; detection: true when there is no content until the next header (or end).&lt;br /&gt;
function StateChecks.roundIsEmpty(j, i)&lt;br /&gt;
    local col = state.entries and state.entries[j]&lt;br /&gt;
    if not col then return true end&lt;br /&gt;
&lt;br /&gt;
    local row, R = i + 1, config.r&lt;br /&gt;
    while row &amp;lt;= R do&lt;br /&gt;
        local e = col[row]&lt;br /&gt;
        if e and e.ctype == &amp;quot;header&amp;quot; then break end&lt;br /&gt;
        if not StateChecks.isBlankEntry(j, row) then&lt;br /&gt;
            return false&lt;br /&gt;
        end&lt;br /&gt;
        row = row + 1&lt;br /&gt;
    end&lt;br /&gt;
    return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- =========================&lt;br /&gt;
-- 7) DEFAULT HEADER TEXT&lt;br /&gt;
-- =========================&lt;br /&gt;
-- Default header text when none provided (keeps legacy strings).&lt;br /&gt;
function StateChecks.defaultHeaderText(j, headerindex)&lt;br /&gt;
    if headerindex ~= 1 then&lt;br /&gt;
        return &amp;quot;Lower round &amp;quot; .. tostring(j)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local base    = config.base or 0&lt;br /&gt;
    local orig_j  = j + base&lt;br /&gt;
    local total   = config.c_total or (config.c + base)&lt;br /&gt;
    local rem     = total - orig_j&lt;br /&gt;
&lt;br /&gt;
    if rem == 0 then&lt;br /&gt;
        return &amp;quot;Final&amp;quot;&lt;br /&gt;
    elseif rem == 1 then&lt;br /&gt;
        return &amp;quot;Semifinals&amp;quot;&lt;br /&gt;
    elseif rem == 2 then&lt;br /&gt;
        return &amp;quot;Quarterfinals&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
        return &amp;quot;Round &amp;quot; .. tostring(orig_j)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- =========================&lt;br /&gt;
-- 8) PATH PRESENCE CHECK&lt;br /&gt;
-- =========================&lt;br /&gt;
-- True when the path block between j → j+1 at row i has no visible lines at all.&lt;br /&gt;
function StateChecks.noPaths(j, i)&lt;br /&gt;
    local hasCross = state.hascross and state.hascross[j]&lt;br /&gt;
    local cols     = hasCross and 3 or 2&lt;br /&gt;
&lt;br /&gt;
    -- Path cells: any nonzero border means a path&lt;br /&gt;
    local pcj = state.pathCell and state.pathCell[j]&lt;br /&gt;
    local pci = pcj and pcj[i]&lt;br /&gt;
    if pci then&lt;br /&gt;
        for k = 1, cols do&lt;br /&gt;
            local edges = pci[k] and pci[k][1]&lt;br /&gt;
            if edges and (&lt;br /&gt;
                (edges[1] and edges[1] ~= 0) or&lt;br /&gt;
                (edges[2] and edges[2] ~= 0) or&lt;br /&gt;
                (edges[3] and edges[3] ~= 0) or&lt;br /&gt;
                (edges[4] and edges[4] ~= 0)&lt;br /&gt;
            ) then&lt;br /&gt;
                return false&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Cross cells: left/right flag at index 1 means a cross path&lt;br /&gt;
    if hasCross then&lt;br /&gt;
        local ccj = state.crossCell and state.crossCell[j]&lt;br /&gt;
        local cci = ccj and ccj[i]&lt;br /&gt;
        if cci then&lt;br /&gt;
            local left, right = cci.left, cci.right&lt;br /&gt;
            if (left and left[1] == 1) or (right and right[1] == 1) then&lt;br /&gt;
                return false&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return StateChecks&lt;/div&gt;</summary>
		<author><name>wikipedia&gt;MusikBot II</name></author>
	</entry>
</feed>