Files
cheesy-arena-lite/game/power_up.go

90 lines
1.9 KiB
Go
Raw Normal View History

2018-03-25 20:15:00 -07:00
// 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
}