Refactor playoff bracket logic to more easily support alternative formats.

This commit is contained in:
Patrick Fairbank
2022-08-03 20:53:16 -07:00
parent 737972f494
commit bfc5e56fc9
15 changed files with 995 additions and 530 deletions

View File

@@ -7,6 +7,7 @@ package field
import (
"fmt"
"github.com/Team254/cheesy-arena-lite/bracket"
"github.com/Team254/cheesy-arena-lite/game"
"github.com/Team254/cheesy-arena-lite/model"
"github.com/Team254/cheesy-arena-lite/network"
@@ -71,6 +72,7 @@ type Arena struct {
SavedRankings game.Rankings
AllianceStationDisplayMode string
AllianceSelectionAlliances []model.Alliance
PlayoffBracket *bracket.Bracket
LowerThird *model.LowerThird
ShowLowerThird bool
MuteMatchSounds bool
@@ -112,6 +114,14 @@ 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()
@@ -164,6 +174,30 @@ func (arena *Arena) LoadSettings() error {
return nil
}
// Constructs an empty playoff bracket in memory, based only on the number of alliances.
func (arena *Arena) CreatePlayoffBracket() error {
alliances, err := arena.Database.GetAllAlliances()
if err != nil {
return err
}
if len(alliances) > 0 {
arena.PlayoffBracket, err = bracket.NewSingleEliminationBracket(len(alliances))
if err != nil {
return err
}
}
return nil
}
// Traverses the in-memory playoff bracket to populate alliances, create matches, and assess winners. Does nothing if
// the bracket has not been created.are
func (arena *Arena) UpdatePlayoffBracket(startTime *time.Time) error {
if arena.PlayoffBracket == nil {
return nil
}
return arena.PlayoffBracket.Update(arena.Database, startTime)
}
// Sets up the arena for the given match.
func (arena *Arena) LoadMatch(match *model.Match) error {
if arena.MatchState != PreMatch {