mirror of
https://github.com/Team254/cheesy-arena-lite.git
synced 2026-03-09 21:56:50 -04:00
Refactor playoff bracket logic to more easily support alternative formats.
This commit is contained in:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user