88 lines
1.8 KiB
Go
88 lines
1.8 KiB
Go
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))
|
|
}
|
|
}
|