You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

99 lines
1.9 KiB
Go

package main
import (
"fmt"
"strings"
"time"
)
type Bomb struct {
profile *Connection
origin *System
target *System
start time.Time
done bool
fti int64 // frames to impact
}
func NewBomb(conn *Connection, from, to *System) *Bomb {
dist := from.DistanceTo(to)
fti := int64(dist / (options.lightSpeed * options.bombSpeed))
eta := time.Duration(fti) * time.Second / time.Duration(options.frameRate)
log_info("bomb from: %v to: %v ETA: %v", from, to, eta)
return &Bomb{
profile: conn,
origin: from,
target: to,
fti: fti,
start: time.Now(),
}
}
func (b *Bomb) Dead() bool {
return b.done
}
func (b *Bomb) Tick(frame int64) {
b.fti -= 1
if b.fti <= 0 {
b.target.Bombed(b.profile, frame)
b.done = true
log_info("bomb went off on %v", b.target)
}
}
func (b *Bomb) String() string {
return fmt.Sprintf("[bomb from: %v to: %v lived: %s]", b.origin, b.target, time.Since(b.start))
}
type MakeBombState struct {
CommandSuite
*System
start int64
}
func MakeBomb(s *System) ConnectionState {
m := &MakeBombState{System: s}
m.CommandSuite = CommandSet{
balCommand,
BroadcastCommand(s),
NearbyCommand(s),
playersCommand,
}
return m
}
func (m *MakeBombState) Enter(c *Connection) {
c.Printf("Making a bomb...\n")
c.money -= options.bombCost
}
func (m *MakeBombState) Tick(c *Connection, frame int64) ConnectionState {
if m.start == 0 {
m.start = frame
}
if framesToDur(frame-m.start) >= options.makeBombTime {
return Idle(m.System)
}
return m
}
func (m *MakeBombState) Exit(c *Connection) {
c.bombs += 1
c.Printf("Done! You now have %v bombs.\n", c.bombs)
}
func (m *MakeBombState) PrintStatus(c *Connection) {
elapsedFrames := c.game.frame - m.start
elapsedDur := framesToDur(elapsedFrames)
msg := fmt.Sprintf(`
Currently making a bomb!
Current System: %s
Build time elapsed: %v
Build time remaining: %v
`, m.System, elapsedDur, options.makeBombTime-elapsedDur)
c.Printf(strings.TrimSpace(msg))
}