mirror of
https://github.com/Team254/cheesy-arena-lite.git
synced 2026-03-09 21:56:50 -04:00
90 lines
1.9 KiB
Go
90 lines
1.9 KiB
Go
// Copyright 2018 Team 254. All Rights Reserved.
|
|
// Author: pat@patfairbank.com (Patrick Fairbank)
|
|
//
|
|
// Scoring logic for the 2018 power ups.
|
|
|
|
package game
|
|
|
|
import (
|
|
"time"
|
|
)
|
|
|
|
const powerUpDurationSec = 10
|
|
|
|
// Power up type/effect enum.
|
|
const (
|
|
force = iota
|
|
boost
|
|
)
|
|
|
|
// Power up state enum.
|
|
const (
|
|
queued = iota
|
|
active
|
|
expired
|
|
)
|
|
|
|
type PowerUp struct {
|
|
alliance int
|
|
kind int
|
|
level int
|
|
startTime time.Time
|
|
}
|
|
|
|
var powerUpUses []*PowerUp
|
|
|
|
func ResetPowerUps() {
|
|
powerUpUses = powerUpUses[:0]
|
|
}
|
|
|
|
func (powerUp *PowerUp) GetState(currentTime time.Time) int {
|
|
if powerUp.startTime.After(currentTime) {
|
|
return queued
|
|
}
|
|
if powerUp.getEndTime().After(currentTime) {
|
|
return active
|
|
}
|
|
return expired
|
|
}
|
|
|
|
func (powerUp *PowerUp) getEndTime() time.Time {
|
|
return powerUp.startTime.Add(powerUpDurationSec * time.Second)
|
|
}
|
|
|
|
// Returns the current active power up, or nil if there isn't one.
|
|
func getActivePowerUp(currentTime time.Time) *PowerUp {
|
|
for _, powerUp := range powerUpUses {
|
|
if powerUp.GetState(currentTime) == active {
|
|
return powerUp
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// Activates the given power up if it can be played, or if not, queues it if the active power up belongs to the other
|
|
// alliance. Returns the power up if successful and nil if it cannot be played.
|
|
func maybeActivatePowerUp(powerUp *PowerUp, currentTime time.Time) *PowerUp {
|
|
canActivate := false
|
|
if len(powerUpUses) == 0 {
|
|
canActivate = true
|
|
powerUp.startTime = currentTime
|
|
} else {
|
|
lastPowerUp := powerUpUses[len(powerUpUses)-1]
|
|
lastPowerUpState := lastPowerUp.GetState(currentTime)
|
|
if lastPowerUpState == expired {
|
|
canActivate = true
|
|
powerUp.startTime = currentTime
|
|
} else if lastPowerUpState == active && lastPowerUp.alliance != powerUp.alliance {
|
|
canActivate = true
|
|
powerUp.startTime = lastPowerUp.getEndTime()
|
|
}
|
|
}
|
|
|
|
if canActivate {
|
|
powerUpUses = append(powerUpUses, powerUp)
|
|
return powerUp
|
|
}
|
|
|
|
return nil
|
|
}
|