mirror of
https://github.com/Team254/cheesy-arena-lite.git
synced 2026-03-10 06:06:47 -04:00
120 lines
3.1 KiB
Go
120 lines
3.1 KiB
Go
// Copyright 2017 Team 254. All Rights Reserved.
|
|
// Author: pat@patfairbank.com (Patrick Fairbank)
|
|
//
|
|
// Model representing the instantaneous score of a match.
|
|
|
|
package game
|
|
|
|
type Score struct {
|
|
AutoRuns int
|
|
AutoOwnershipPoints int
|
|
AutoEndSwitchOwnership bool
|
|
TeleopOwnershipPoints int
|
|
ForceCubes int
|
|
ForcePlayed bool
|
|
LevitateCubes int
|
|
LevitatePlayed bool
|
|
BoostCubes int
|
|
BoostPlayed bool
|
|
Climbs int
|
|
Parks int
|
|
Fouls []Foul
|
|
ElimDq bool
|
|
}
|
|
|
|
type ScoreSummary struct {
|
|
AutoRunPoints int
|
|
AutoPoints int
|
|
OwnershipPoints int
|
|
VaultPoints int
|
|
ParkClimbPoints int
|
|
FoulPoints int
|
|
Score int
|
|
AutoQuest bool
|
|
FaceTheBoss bool
|
|
}
|
|
|
|
// Calculates and returns the summary fields used for ranking and display.
|
|
func (score *Score) Summarize(opponentFouls []Foul) *ScoreSummary {
|
|
summary := new(ScoreSummary)
|
|
|
|
// Leave the score at zero if the team was disqualified.
|
|
if score.ElimDq {
|
|
return summary
|
|
}
|
|
|
|
// Calculate autonomous score.
|
|
autoRuns := score.AutoRuns
|
|
if autoRuns > 3 {
|
|
autoRuns = 3
|
|
}
|
|
summary.AutoRunPoints = 5 * autoRuns
|
|
summary.AutoPoints = summary.AutoRunPoints + score.AutoOwnershipPoints
|
|
|
|
// Calculate teleop score.
|
|
summary.OwnershipPoints = score.AutoOwnershipPoints + score.TeleopOwnershipPoints
|
|
forceCubes := score.ForceCubes
|
|
if forceCubes > 3 {
|
|
forceCubes = 3
|
|
}
|
|
levitateCubes := score.LevitateCubes
|
|
if levitateCubes > 3 {
|
|
levitateCubes = 3
|
|
}
|
|
boostCubes := score.BoostCubes
|
|
if boostCubes > 3 {
|
|
boostCubes = 3
|
|
}
|
|
summary.VaultPoints = 5 * (forceCubes + levitateCubes + boostCubes)
|
|
climbs := score.Climbs
|
|
if climbs > 3 {
|
|
climbs = 3
|
|
}
|
|
if score.LevitatePlayed && score.Climbs < 3 {
|
|
climbs++
|
|
}
|
|
parks := score.Parks
|
|
if parks+climbs > 3 {
|
|
parks = 3 - climbs
|
|
}
|
|
summary.ParkClimbPoints = 5*parks + 30*climbs
|
|
|
|
// Calculate bonuses.
|
|
if autoRuns == 3 && score.AutoEndSwitchOwnership {
|
|
summary.AutoQuest = true
|
|
}
|
|
if climbs == 3 {
|
|
summary.FaceTheBoss = true
|
|
}
|
|
|
|
// Calculate penalty points.
|
|
for _, foul := range opponentFouls {
|
|
summary.FoulPoints += foul.PointValue()
|
|
}
|
|
|
|
summary.Score = summary.AutoRunPoints + summary.OwnershipPoints + summary.VaultPoints + summary.ParkClimbPoints +
|
|
summary.FoulPoints
|
|
|
|
return summary
|
|
}
|
|
|
|
func (score *Score) Equals(other *Score) bool {
|
|
if score.AutoRuns != other.AutoRuns || score.AutoEndSwitchOwnership != other.AutoEndSwitchOwnership ||
|
|
score.AutoOwnershipPoints != other.AutoOwnershipPoints ||
|
|
score.TeleopOwnershipPoints != other.TeleopOwnershipPoints || score.ForceCubes != other.ForceCubes ||
|
|
score.ForcePlayed != other.ForcePlayed || score.LevitateCubes != other.LevitateCubes ||
|
|
score.LevitatePlayed != other.LevitatePlayed || score.BoostCubes != other.BoostCubes ||
|
|
score.BoostPlayed != other.BoostPlayed || score.Parks != other.Parks || score.Climbs != other.Climbs ||
|
|
score.ElimDq != other.ElimDq || len(score.Fouls) != len(other.Fouls) {
|
|
return false
|
|
}
|
|
|
|
for i, foul := range score.Fouls {
|
|
if foul != other.Fouls[i] {
|
|
return false
|
|
}
|
|
}
|
|
|
|
return true
|
|
}
|