package main import ( "math/rand" "strings" "github.com/hajimehoshi/ebiten/v2" ) const ( MAX_RANDOM_INCREMENT = 50 ) type Leaderboard struct { Board *ebiten.Image //the team board target image teams map[string]*AnimatedScoreBar //collection of teams + score bars } func NewLeaderboard(w, h int, teamnames []string) *Leaderboard { t := &Leaderboard{} t.Board = ebiten.NewImage(w, h) t.teams = make(map[string]*AnimatedScoreBar) for i, name := range teamnames { cleanname := strings.ToUpper(name) t.teams[cleanname] = NewAnimatedScoreBar(CharacterType(i%CHARACTER_NUMTYPES), strings.ToUpper(name)) t.teams[cleanname].SetOrder(i) } return t } func (t *Leaderboard) SetScaleFactor(sf float64) { for _, team := range t.teams { team.SetScaleFactor(sf) } } func (l *Leaderboard) UpdateScoreForTeam(name string, score int) { t := l.teams[strings.ToUpper(name)] if t != nil { t.SetTarget(float64(score)) } } func (l *Leaderboard) GetLeaders() []*AnimatedScoreBar { leaders := []*AnimatedScoreBar{} highScore := 0 for _, team := range l.teams { teamscore := int(team.GetTarget()) if teamscore > highScore { leaders = leaders[:0] leaders = append(leaders, team) highScore = teamscore } else if teamscore == highScore { leaders = append(leaders, team) } } return leaders } func (t *Leaderboard) Animate() { t.Board.Clear() for _, v := range t.teams { op := &ebiten.DrawImageOptions{} op.GeoM.Translate(0, float64(v.GetOrder())*(ASB_HEIGHT+ASB_BUFFER)) t.Board.DrawImage(v.ScoreImage, op) v.Animate() } } func (l *Leaderboard) SetAllTargets(t float64) { for _, board := range l.teams { board.SetTarget(t) } } func (l *Leaderboard) RandomizeTeamTargets() { for _, board := range l.teams { board.SetTarget(board.GetTarget() + float64(rand.Int()%MAX_RANDOM_INCREMENT)) } }