diff --git a/field/arena.go b/field/arena.go index 4221088..7b43a33 100755 --- a/field/arena.go +++ b/field/arena.go @@ -114,14 +114,6 @@ func NewArena(dbPath string) (*Arena, error) { arena.Displays = make(map[string]*Display) - // Reconstruct the playoff bracket in memory. - if err = arena.CreatePlayoffBracket(); err != nil { - return nil, err - } - if err = arena.UpdatePlayoffBracket(nil); err != nil { - return nil, err - } - // Load empty match as current. arena.MatchState = PreMatch arena.LoadTestMatch() @@ -171,6 +163,14 @@ func (arena *Arena) LoadSettings() error { game.UpdateMatchSounds() arena.MatchTimingNotifier.Notify() + // Reconstruct the playoff bracket in memory. + if err = arena.CreatePlayoffBracket(); err != nil { + return err + } + if err = arena.UpdatePlayoffBracket(nil); err != nil { + return err + } + return nil } diff --git a/templates/bracket.svg b/templates/bracket.svg index e4b5968..04bb9a7 100644 --- a/templates/bracket.svg +++ b/templates/bracket.svg @@ -13,7 +13,6 @@ .right{text-anchor:end;} .active #active_bg{fill:#444444;} .active .st21{fill:#ffffff;} - .hidden {display:none;} .st0{fill:#0070FE;} .st1{fill:#2F56D2;} .st2{fill:#203D99;} @@ -37,7 +36,7 @@ .st20{text-anchor:middle;} .st21{font-size:27px;} .st22{text-anchor:middle;} - .st23{font-size:42px;} + .st23{font-size:34px;} .st24{text-anchor:middle;} .st25{display:none;} .st26{display:inline;} @@ -62,210 +61,371 @@ .red{fill:#FF2222;} .blue{fill:#2080FF;} - - #label1 {transform: translate(219px, 975px);} - #label2 {transform: translate(516px, 975px);} - #label3 {transform: translate(813px, 975px);} - #label4 {transform: translate(1109px, 975px);} - #label5 {transform: translate(1405px, 975px);} - #label6 {transform: translate(1702px, 975px);} + {{if eq .BracketType "double"}} + + #label1 {transform: translate(219px, 975px);} + #label2 {transform: translate(516px, 975px);} + #label3 {transform: translate(813px, 975px);} + #label4 {transform: translate(1109px, 975px);} + #label5 {transform: translate(1405px, 975px);} + #label6 {transform: translate(1702px, 975px);} - #m6a #match_title{display:none;} + + #match_1_1 {transform: translate(114px, 158px);} + #match_1_2 {transform: translate(114px, 348px);} + #match_1_3 {transform: translate(114px, 538px);} + #match_1_4 {transform: translate(114px, 728px);} - - #match_1_1 {transform: translate(114px, 158px);} - #match_1_2 {transform: translate(114px, 348px);} - #match_1_3 {transform: translate(114px, 538px);} - #match_1_4 {transform: translate(114px, 728px);} + #match_2_3 {transform: translate(412px, 158px);} + #match_2_4 {transform: translate(412px, 348px);} + #match_2_1 {transform: translate(412px, 538px);} + #match_2_2 {transform: translate(412px, 728px);} - #match_2_3 {transform: translate(412px, 158px);} - #match_2_4 {transform: translate(412px, 348px);} - #match_2_1 {transform: translate(412px, 538px);} - #match_2_2 {transform: translate(412px, 728px);} + #match_3_2 {transform: translate(709px, 504px);} + #match_3_1 {transform: translate(709px, 694px);} - #match_3_2 {transform: translate(709px, 504px);} - #match_3_1 {transform: translate(709px, 694px);} + #match_4_2 {transform: translate(1006px, 301px);} + #match_4_1 {transform: translate(1006px, 592px);} - #match_4_2 {transform: translate(1006px, 301px);} - #match_4_1 {transform: translate(1006px, 592px);} + #match_5_1 {transform: translate(1302px, 567px);} - #match_5_1 {transform: translate(1302px, 567px);} + #match_6_1 {transform: translate(1598px, 417px);} - #match_6_1 {transform: translate(1598px, 417px);} + + #connectors_temporary g{display:none;} + #connectors_temporary g.active{display:inline;} + #connectors_temporary g.active g{display:inline;} + {{else}} + + .bracket_2 .st38, + .bracket_4 .st39, + .bracket_4 .st40, + .bracket_8 .st39, + .bracket_8 .st41, + .bracket_8 .st27 + {display:none;} - - #connectors_temporary g{display:none;} - #connectors_temporary g.active{display:inline;} - #connectors_temporary g.active g{display:inline;} + .bracket_8 #l2a {transform: translate(578px, 964px);} + .bracket_8 #l3a {transform: translate(960px, 964px);} + .bracket_8 #l4 {transform: translate(1346px, 964px);} + .bracket_4 #l3a {transform: translate(768px, 840px);} + .bracket_4 #l4 {transform: translate(1154px, 840px);} + + + .bracket_16 #match_1_1 {transform: translate(94px, 158px);} + .bracket_16 #match_1_2 {transform: translate(94px, 348px);} + .bracket_16 #match_1_3 {transform: translate(94px, 538px);} + .bracket_16 #match_1_4 {transform: translate(94px, 728px);} + .bracket_16 #match_1_5 {transform: translate(1614px, 158px);} + .bracket_16 #match_1_6 {transform: translate(1614px, 348px);} + .bracket_16 #match_1_7 {transform: translate(1614px, 538px);} + .bracket_16 #match_1_8 {transform: translate(1614px, 728px);} + + .bracket_16 #match_2_1 {transform: translate(349px, 253px);} + .bracket_16 #match_2_2 {transform: translate(349px, 633px);} + .bracket_16 #match_2_3 {transform: translate(1361px, 253px);} + .bracket_16 #match_2_4 {transform: translate(1361px, 633px);} + + .bracket_16 #match_3_1 {transform: translate(602px, 488px);} + .bracket_16 #match_3_2 {transform: translate(1108px, 488px);} + .bracket_16 #match_4_1 {transform: translate(856px, 408px);} + + .bracket_8 #match_1_1, + .bracket_8 #match_1_2, + .bracket_8 #match_1_3, + .bracket_8 #match_1_4, + .bracket_8 #match_1_5, + .bracket_8 #match_1_6, + .bracket_8 #match_1_7, + .bracket_8 #match_1_8 + {display:none;} + + .bracket_8 #match_2_1 {transform: translate(473px, 158px);} + .bracket_8 #match_2_2 {transform: translate(473px, 348px);} + .bracket_8 #match_2_3 {transform: translate(473px, 538px);} + .bracket_8 #match_2_4 {transform: translate(473px, 728px);} + + .bracket_8 #match_3_1 {transform: translate(857px, 321px);} + .bracket_8 #match_3_2 {transform: translate(857px, 565px);} + .bracket_8 #match_4_1 {transform: translate(1241px, 443px);} + + .bracket_4 #match_1_1, + .bracket_4 #match_1_2, + .bracket_4 #match_1_3, + .bracket_4 #match_1_4, + .bracket_4 #match_1_5, + .bracket_4 #match_1_6, + .bracket_4 #match_1_7, + .bracket_4 #match_1_8, + .bracket_4 #match_2_1, + .bracket_4 #match_2_2, + .bracket_4 #match_2_3, + .bracket_4 #match_2_4 + {display:none;} + + .bracket_4 #match_3_1 {transform: translate(665px, 397px);} + .bracket_4 #match_3_2 {transform: translate(665px, 601px);} + .bracket_4 #match_4_1 {transform: translate(1049px, 499px);} + + .bracket_2 #match_1_1, + .bracket_2 #match_1_2, + .bracket_2 #match_1_3, + .bracket_2 #match_1_4, + .bracket_2 #match_1_5, + .bracket_2 #match_1_6, + .bracket_2 #match_1_7, + .bracket_2 #match_1_8, + .bracket_2 #match_2_1, + .bracket_2 #match_2_2, + .bracket_2 #match_2_3, + .bracket_2 #match_2_4, + .bracket_2 #match_3_1, + .bracket_2 #match_3_2 + {display:none;} + + .bracket_2 #match_4_1 {transform: translate(857px, 435px);} + + + .bracket_16 #bg8, + .bracket_16 #bg4, + .bracket_16 #bg2, + .bracket_8 #bg16, + .bracket_8 #bg4, + .bracket_8 #bg2, + .bracket_4 #bg16, + .bracket_4 #bg8, + .bracket_4 #bg2, + .bracket_2 #bg16, + .bracket_2 #bg8, + .bracket_2 #bg4 + {display:none;} + + + .bracket_2 #connectors, + .bracket_16 .cb8, + .bracket_16 .cb4, + .bracket_8 .cb16, + .bracket_8 .cb4, + .bracket_4 .cb16, + .bracket_4 .cb8 + {display:none;} + {{end}} - + - + {{if eq .BracketType "double"}} + + {{else}} + + + + + {{end}} - - - - - - - - - - - - - - - - W - L + {{if eq .BracketType "double"}} + + + + + + + + + + - - - - W - L + + + + + W + L + + + + + W + L + + + + + W + L + + + + + W + L + + + + W + L + + + + + L + L + + + + W + L + + + + + L + L + + + + + W + L + + W + W + + + + + + + + + W + L + + + W + W + + + + + + + W + W + L + + + + L + + + + + + W + W + L + + + + L + + + + W + L + + + + W + W + + + + + + + + W + W + W + L + + + + + + + W + W + W + + + + W + L + + L + + + + + + W + W + - - - - W - L + {{else}} + + {{if index .Matchups "1_1"}}{{end}} + {{if index .Matchups "1_2"}}{{end}} + {{if index .Matchups "1_3"}}{{end}} + {{if index .Matchups "1_4"}}{{end}} + {{if index .Matchups "1_5"}}{{end}} + {{if index .Matchups "1_6"}}{{end}} + {{if index .Matchups "1_7"}}{{end}} + {{if index .Matchups "1_8"}}{{end}} + + + + + + + + {{if index .Matchups "2_1"}}{{end}} + {{if index .Matchups "2_2"}}{{end}} + {{if index .Matchups "2_3"}}{{end}} + {{if index .Matchups "2_4"}}{{end}} + + + + {{if index .Matchups "3_1"}}{{end}} + {{if index .Matchups "3_2"}}{{end}} - - - - W - L - - - - W - L - - - - - L - L - - - - W - L - - - - - L - L - - - - - W - L - - W - W - - - - - - - - - W - L - - - W - W - - - - - - - W - W - L - - - - L - - - - - - W - W - L - - - - L - - - - W - L - - - - W - W - - - - - - - - W - W - W - L - - - - - - - W - W - W - - - - W - L - - L - - - - - - W - W - - + {{end}} {{range $matchup := .Matchups}} {{template "matchup" index $matchup}} {{end}} - Round 1 - Round 2 - Round 3 - Round 4 - Round 5 - Finals - Best-of-3 + {{if eq .BracketType "double"}} + Round 1 + Round 2 + Round 3 + Round 4 + Round 5 + Finals + Best-of-3 + {{else}} + + Round of 16 + Round of 16 + Quarterfinals + Quarterfinals + Semifinals + Semifinals + Finals + {{end}} @@ -280,7 +440,7 @@ {{.SeriesStatus}} {{.DisplayName}} {{if .RedAlliance}} - {{.RedAlliance.Id}} + {{.RedAlliance.Id}} {{if ge (len .RedAlliance.TeamIds) 3}} {{index .RedAlliance.TeamIds 0}} {{index .RedAlliance.TeamIds 1}} @@ -293,7 +453,7 @@ {{.RedAllianceSource}} {{end}} {{if .BlueAlliance}} - {{.BlueAlliance.Id}} + {{.BlueAlliance.Id}} {{if ge (len .BlueAlliance.TeamIds) 3}} {{index .BlueAlliance.TeamIds 0}} {{index .BlueAlliance.TeamIds 1}} diff --git a/templates/setup_settings.html b/templates/setup_settings.html index b6deb90..11c31fb 100755 --- a/templates/setup_settings.html +++ b/templates/setup_settings.html @@ -31,14 +31,14 @@
diff --git a/web/api.go b/web/api.go index 5cf78d7..5dbbf23 100755 --- a/web/api.go +++ b/web/api.go @@ -266,15 +266,29 @@ func (web *Web) bracketSvgApiHandler(w http.ResponseWriter, r *http.Request) { } } + bracketType := "double" + numAlliances := web.arena.EventSettings.NumElimAlliances + if web.arena.EventSettings.ElimType == "single" { + if numAlliances > 8 { + bracketType = "16" + } else if numAlliances > 4 { + bracketType = "8" + } else if numAlliances > 2 { + bracketType = "4" + } else { + bracketType = "2" + } + } + template, err := web.parseFiles("templates/bracket.svg") if err != nil { handleWebErr(w, err) return } data := struct { - *model.EventSettings - Matchups map[string]*allianceMatchup - }{web.arena.EventSettings, matchups} + BracketType string + Matchups map[string]*allianceMatchup + }{bracketType, matchups} w.Header().Set("Content-Type", "image/svg+xml") err = template.ExecuteTemplate(w, "bracket", data) if err != nil { diff --git a/web/setup_settings_test.go b/web/setup_settings_test.go index 700ca62..ba19583 100644 --- a/web/setup_settings_test.go +++ b/web/setup_settings_test.go @@ -27,7 +27,7 @@ func TestSetupSettings(t *testing.T) { assert.NotContains(t, recorder.Body.String(), "tbaPublishingEnabled\" checked") // Change the settings and check the response. - recorder = web.postHttpResponse("/setup/settings", "name=Chezy Champs&code=CC&numElimAlliances=16&"+ + recorder = web.postHttpResponse("/setup/settings", "name=Chezy Champs&code=CC&elimType=single&numElimAlliances=16&"+ "tbaPublishingEnabled=on&tbaEventCode=2014cc&tbaSecretId=secretId&tbaSecret=tbasec") assert.Equal(t, 303, recorder.Code) recorder = web.getHttpResponse("/setup/settings")