diff --git a/field/arena.go b/field/arena.go index a4226dd4..0b09b738 100644 --- a/field/arena.go +++ b/field/arena.go @@ -47,6 +47,12 @@ const ( PostTimeout ) +type RankedTeam struct { + Rank int + TeamId int + Picked bool +} + type Arena struct { Database *model.Database EventSettings *model.EventSettings @@ -77,6 +83,7 @@ type Arena struct { SavedRankings game.Rankings AllianceStationDisplayMode string AllianceSelectionAlliances []model.Alliance + AllianceSelectionRankedTeams []*RankedTeam AllianceSelectionShowTimer bool AllianceSelectionTimeRemainingSec int PlayoffTournament *playoff.PlayoffTournament diff --git a/field/arena_notifiers.go b/field/arena_notifiers.go index 0c32979c..224d369c 100644 --- a/field/arena_notifiers.go +++ b/field/arena_notifiers.go @@ -69,10 +69,12 @@ func (arena *Arena) generateAllianceSelectionMessage() any { Alliances []model.Alliance ShowTimer bool TimeRemainingSec int + RankedTeams []*RankedTeam }{ arena.AllianceSelectionAlliances, arena.AllianceSelectionShowTimer, arena.AllianceSelectionTimeRemainingSec, + arena.AllianceSelectionRankedTeams, } } diff --git a/model/event_settings.go b/model/event_settings.go index a34aa042..fd87c1ca 100644 --- a/model/event_settings.go +++ b/model/event_settings.go @@ -21,6 +21,7 @@ type EventSettings struct { NumPlayoffAlliances int SelectionRound2Order string SelectionRound3Order string + SelectionShowUnpickedTeams bool TbaDownloadEnabled bool TbaPublishingEnabled bool TbaEventCode string @@ -70,6 +71,7 @@ func (database *Database) GetEventSettings() (*EventSettings, error) { NumPlayoffAlliances: 8, SelectionRound2Order: "L", SelectionRound3Order: "", + SelectionShowUnpickedTeams: false, TbaDownloadEnabled: true, ApChannel: 36, WarmupDurationSec: game.MatchTiming.WarmupDurationSec, diff --git a/static/css/audience_display.css b/static/css/audience_display.css index f463f0d5..4f1389d4 100644 --- a/static/css/audience_display.css +++ b/static/css/audience_display.css @@ -553,6 +553,26 @@ html { max-width: 800px; max-height: 400px; } +#allianceRankingsCentering { + position: absolute; + height: 100%; + left: 3em; + top: 3em; +} +#allianceRankings { + background-color: #fff; + padding: .5em 1em; + border: 2px solid #222; + font-size: 2em; + color: #222; + font-family: "FuturaLT"; + -webkit-column-count: 3; + -moz-column-count: 3; + column-count: 3; + -webkit-column-gap: 1em; + -moz-column-gap: 1em; + column-gap: 1em; +} #allianceSelectionCentering { position: absolute; height: 100%; diff --git a/static/js/audience_display.js b/static/js/audience_display.js index cf4bbb4c..64bc57c7 100644 --- a/static/js/audience_display.js +++ b/static/js/audience_display.js @@ -328,6 +328,7 @@ const handlePlaySound = function(sound) { // Handles a websocket message to update the alliance selection screen. const handleAllianceSelection = function(data) { const alliances = data.Alliances; + const rankedTeams = data.RankedTeams; if (alliances && alliances.length > 0) { const numColumns = alliances[0].TeamIds.length + 1; $.each(alliances, function(k, v) { @@ -335,6 +336,15 @@ const handleAllianceSelection = function(data) { }); $("#allianceSelection").html(allianceSelectionTemplate({alliances: alliances, numColumns: numColumns})); } + if (rankedTeams) { + var text = ''; + $.each(rankedTeams, function(i, v) { + if (!v.Picked) { + text += v.Rank + '. ' + v.TeamId + '
'; + } + }); + $("#allianceRankings").html(text); + } if (data.ShowTimer) { $("#allianceSelectionTimer").text(getCountdownString(data.TimeRemainingSec)); @@ -373,11 +383,14 @@ const handleLowerThird = function(data) { const transitionAllianceSelectionToBlank = function(callback) { $('#allianceSelectionCentering').transition({queue: false, right: "-60em"}, 500, "ease", callback); + $('#allianceRankingsCentering.enabled').transition({queue:false, left: "-60em"}, 500, "ease"); }; const transitionBlankToAllianceSelection = function(callback) { $('#allianceSelectionCentering').css("right","-60em").show(); $('#allianceSelectionCentering').transition({queue: false, right: "3em"}, 500, "ease", callback); + $('#allianceRankingsCentering.enabled').css('left', '-60em').show(); + $('#allianceRankingsCentering.enabled').transition({queue: false, left: "3em"}, 500, "ease"); }; const transitionBlankToBracket = function(callback) { diff --git a/templates/audience_display.html b/templates/audience_display.html index c7aa2cf7..f8688649 100644 --- a/templates/audience_display.html +++ b/templates/audience_display.html @@ -242,6 +242,9 @@ +
diff --git a/templates/setup_settings.html b/templates/setup_settings.html index cf6df401..7c797df1 100644 --- a/templates/setup_settings.html +++ b/templates/setup_settings.html @@ -97,6 +97,13 @@
+
+ +
+ +
+
Automatic Team Info Download diff --git a/web/alliance_selection.go b/web/alliance_selection.go index 49513760..81d376a6 100644 --- a/web/alliance_selection.go +++ b/web/alliance_selection.go @@ -7,6 +7,7 @@ package web import ( "fmt" + "github.com/Team254/cheesy-arena/field" "github.com/Team254/cheesy-arena/model" "github.com/Team254/cheesy-arena/tournament" "github.com/Team254/cheesy-arena/websocket" @@ -17,15 +18,6 @@ import ( "time" ) -type RankedTeam struct { - Rank int - TeamId int - Picked bool -} - -// Global var to hold the team rankings during the alliance selection. -var cachedRankedTeams []*RankedTeam - // Global var to hold configurable time limit for selections. A value of zero disables the timer. var allianceSelectionTimeLimitSec = 0 @@ -56,9 +48,9 @@ func (web *Web) allianceSelectionPostHandler(w http.ResponseWriter, r *http.Requ allianceSelectionTimeLimitSec, _ = strconv.Atoi(r.PostFormValue("timeLimitSec")) // Reset picked state for each team in preparation for reconstructing it. - newRankedTeams := make([]*RankedTeam, len(cachedRankedTeams)) - for i, team := range cachedRankedTeams { - newRankedTeams[i] = &RankedTeam{team.Rank, team.TeamId, false} + newRankedTeams := make([]*field.RankedTeam, len(web.arena.AllianceSelectionRankedTeams)) + for i, team := range web.arena.AllianceSelectionRankedTeams { + newRankedTeams[i] = &field.RankedTeam{team.Rank, team.TeamId, false} } // Iterate through all selections and update the alliances. @@ -100,7 +92,7 @@ func (web *Web) allianceSelectionPostHandler(w http.ResponseWriter, r *http.Requ } } } - cachedRankedTeams = newRankedTeams + web.arena.AllianceSelectionRankedTeams = newRankedTeams if allianceSelectionTicker != nil { allianceSelectionTicker.Stop() @@ -157,9 +149,9 @@ func (web *Web) allianceSelectionStartHandler(w http.ResponseWriter, r *http.Req handleWebErr(w, err) return } - cachedRankedTeams = make([]*RankedTeam, len(rankings)) + web.arena.AllianceSelectionRankedTeams = make([]*field.RankedTeam, len(rankings)) for i, ranking := range rankings { - cachedRankedTeams[i] = &RankedTeam{i + 1, ranking.TeamId, false} + web.arena.AllianceSelectionRankedTeams[i] = &field.RankedTeam{i + 1, ranking.TeamId, false} } web.arena.AllianceSelectionNotifier.Notify() @@ -191,7 +183,7 @@ func (web *Web) allianceSelectionResetHandler(w http.ResponseWriter, r *http.Req } web.arena.AllianceSelectionAlliances = []model.Alliance{} - cachedRankedTeams = []*RankedTeam{} + web.arena.AllianceSelectionRankedTeams = []*field.RankedTeam{} web.arena.AllianceSelectionNotifier.Notify() http.Redirect(w, r, "/alliance_selection", 303) } @@ -347,7 +339,7 @@ func (web *Web) renderAllianceSelection(w http.ResponseWriter, r *http.Request, data := struct { *model.EventSettings Alliances []model.Alliance - RankedTeams []*RankedTeam + RankedTeams []*field.RankedTeam NextRow int NextCol int ErrorMessage string @@ -355,7 +347,7 @@ func (web *Web) renderAllianceSelection(w http.ResponseWriter, r *http.Request, }{ web.arena.EventSettings, web.arena.AllianceSelectionAlliances, - cachedRankedTeams, + web.arena.AllianceSelectionRankedTeams, nextRow, nextCol, errorMessage, diff --git a/web/setup_settings.go b/web/setup_settings.go index 07fc3487..dbc5d279 100644 --- a/web/setup_settings.go +++ b/web/setup_settings.go @@ -7,6 +7,7 @@ package web import ( "fmt" + "github.com/Team254/cheesy-arena/field" "io" "io/ioutil" "net/http" @@ -71,6 +72,7 @@ func (web *Web) settingsPostHandler(w http.ResponseWriter, r *http.Request) { eventSettings.NumPlayoffAlliances = numAlliances eventSettings.SelectionRound2Order = r.PostFormValue("selectionRound2Order") eventSettings.SelectionRound3Order = r.PostFormValue("selectionRound3Order") + eventSettings.SelectionShowUnpickedTeams = r.PostFormValue("selectionShowUnpickedTeams") == "on" eventSettings.TbaDownloadEnabled = r.PostFormValue("tbaDownloadEnabled") == "on" eventSettings.TbaPublishingEnabled = r.PostFormValue("tbaPublishingEnabled") == "on" eventSettings.TbaEventCode = r.PostFormValue("tbaEventCode") @@ -256,7 +258,7 @@ func (web *Web) clearDbHandler(w http.ResponseWriter, r *http.Request) { return } web.arena.AllianceSelectionAlliances = []model.Alliance{} - cachedRankedTeams = []*RankedTeam{} + web.arena.AllianceSelectionRankedTeams = []*field.RankedTeam{} } http.Redirect(w, r, "/setup/settings", 303)