package main import ( "math/rand" "strings" "github.com/hajimehoshi/ebiten/v2" ) const ( LDRBRD_MAX_RANDOM_INCREMENT = 50 LDRBRD_BAR_CLR_GRD_24TOP = 0xeb40d4 LDRBRD_BAR_CLR_GRD_24BOT = 0xc625af ) 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)) } } // return current list of leaders, and while we're at it, update our current lead indicators func (l *Leaderboard) GetLeaders() []*AnimatedScoreBar { leaders := []*AnimatedScoreBar{} highScore := 0 for _, team := range l.teams { team.ResetLead() teamscore := int(team.GetTarget()) if teamscore > highScore { leaders = leaders[:0] leaders = append(leaders, team) highScore = teamscore } else if teamscore == highScore { leaders = append(leaders, team) } } //for new set of leaders, set appropriate lead indicators for _, bar := range leaders { bar.SetLead() } 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()%LDRBRD_MAX_RANDOM_INCREMENT)) } } func (l *Leaderboard) Pinkify() { for _, board := range l.teams { board.SetBarColors(HexToRGBA(LDRBRD_BAR_CLR_GRD_24TOP), HexToRGBA(LDRBRD_BAR_CLR_GRD_24BOT)) } }