mirror of
https://github.com/Team254/cheesy-arena-lite.git
synced 2026-03-10 06:06:47 -04:00
101 lines
2.7 KiB
Go
101 lines
2.7 KiB
Go
// Copyright 2017 Team 254. All Rights Reserved.
|
|
// Author: pat@patfairbank.com (Patrick Fairbank)
|
|
//
|
|
// Game-specific fields by which teams are ranked and the logic for sorting rankings.
|
|
|
|
package game
|
|
|
|
import "math/rand"
|
|
|
|
type RankingFields struct {
|
|
RankingPoints int
|
|
ParkClimbPoints int
|
|
AutoPoints int
|
|
OwnershipPoints int
|
|
VaultPoints int
|
|
Random float64
|
|
Wins int
|
|
Losses int
|
|
Ties int
|
|
Disqualifications int
|
|
Played int
|
|
}
|
|
|
|
type Ranking struct {
|
|
TeamId int
|
|
Rank int
|
|
RankingFields
|
|
}
|
|
|
|
type Rankings []*Ranking
|
|
|
|
func (fields *RankingFields) AddScoreSummary(ownScore *ScoreSummary, opponentScore *ScoreSummary, disqualified bool) {
|
|
fields.Played += 1
|
|
|
|
if disqualified {
|
|
// Don't award any points.
|
|
fields.Disqualifications += 1
|
|
return
|
|
}
|
|
|
|
// Assign ranking points and wins/losses/ties.
|
|
if ownScore.Score > opponentScore.Score {
|
|
fields.RankingPoints += 2
|
|
fields.Wins += 1
|
|
} else if ownScore.Score == opponentScore.Score {
|
|
fields.RankingPoints += 1
|
|
fields.Ties += 1
|
|
} else {
|
|
fields.Losses += 1
|
|
}
|
|
if ownScore.AutoQuest {
|
|
fields.RankingPoints += 1
|
|
}
|
|
if ownScore.FaceTheBoss {
|
|
fields.RankingPoints += 1
|
|
}
|
|
|
|
// Assign tiebreaker points.
|
|
fields.ParkClimbPoints += ownScore.ParkClimbPoints
|
|
fields.AutoPoints += ownScore.AutoPoints
|
|
fields.OwnershipPoints += ownScore.OwnershipPoints
|
|
fields.VaultPoints += ownScore.VaultPoints
|
|
|
|
// Store a random value to be used as the last tiebreaker if necessary.
|
|
fields.Random = rand.Float64()
|
|
}
|
|
|
|
// Helper function to implement the required interface for Sort.
|
|
func (rankings Rankings) Len() int {
|
|
return len(rankings)
|
|
}
|
|
|
|
// Helper function to implement the required interface for Sort.
|
|
func (rankings Rankings) Less(i, j int) bool {
|
|
a := rankings[i]
|
|
b := rankings[j]
|
|
|
|
// Use cross-multiplication to keep it in integer math.
|
|
if a.RankingPoints*b.Played == b.RankingPoints*a.Played {
|
|
if a.ParkClimbPoints*b.Played == b.ParkClimbPoints*a.Played {
|
|
if a.AutoPoints*b.Played == b.AutoPoints*a.Played {
|
|
if a.OwnershipPoints*b.Played == b.OwnershipPoints*a.Played {
|
|
if a.VaultPoints*b.Played == b.VaultPoints*a.Played {
|
|
return a.Random > b.Random
|
|
}
|
|
return a.VaultPoints*b.Played > b.VaultPoints*a.Played
|
|
}
|
|
return a.OwnershipPoints*b.Played > b.OwnershipPoints*a.Played
|
|
}
|
|
return a.AutoPoints*b.Played > b.AutoPoints*a.Played
|
|
}
|
|
return a.ParkClimbPoints*b.Played > b.ParkClimbPoints*a.Played
|
|
}
|
|
return a.RankingPoints*b.Played > b.RankingPoints*a.Played
|
|
}
|
|
|
|
// Helper function to implement the required interface for Sort.
|
|
func (rankings Rankings) Swap(i, j int) {
|
|
rankings[i], rankings[j] = rankings[j], rankings[i]
|
|
}
|