reimplement scan echos

slack
Jordan Orelli 10 years ago
parent 444896f364
commit d46884d4f4

@ -120,9 +120,7 @@ var scanCommand = &Command{
fmt.Fprintf(conn, "scanners are still recharging. Can scan again in %v\n", conn.NextScan()) fmt.Fprintf(conn, "scanners are still recharging. Can scan again in %v\n", conn.NextScan())
return return
} }
s := &scan{start: time.Now(), origin: conn.System()} currentGame.Register(NewScan(conn.System()))
currentGame.Register(s)
conn.RecordScan() conn.RecordScan()
system := conn.System() system := conn.System()
log_info("scan sent from %s", system.name) log_info("scan sent from %s", system.name)

@ -118,6 +118,7 @@ func (g *Game) tick() {
g.frame += 1 g.frame += 1
for elem := range g.elems { for elem := range g.elems {
if elem.Dead() { if elem.Dead() {
log_info("delete game object: %v", elem)
delete(g.elems, elem) delete(g.elems, elem)
} }
} }
@ -128,11 +129,5 @@ func (g *Game) tick() {
type GameElement interface { type GameElement interface {
Tick(frame int64) Tick(frame int64)
Dead() Mortality Dead() bool
}
type Mortality bool
func (m Mortality) Dead() Mortality {
return m
} }

@ -1,30 +1,80 @@
package main package main
import ( import (
"fmt"
"time" "time"
) )
type scan struct { type scan struct {
Mortality start time.Time
start time.Time origin *System
origin *System dist float64
dist float64 nextHitIndex int
nextHitIndex int nextEchoIndex int
results []scanResult
}
type scanResult struct {
system *System
dist float64
players map[*Connection]bool
colonizedBy *Connection
}
func NewScan(origin *System) *scan {
return &scan{
origin: origin,
start: time.Now(),
results: make([]scanResult, 0, len(origin.Distances())),
}
} }
func (s *scan) Tick(frame int64) { func (s *scan) Tick(frame int64) {
s.dist += lightSpeed s.dist += lightSpeed
for { s.hits()
s.echos()
}
func (s *scan) Dead() bool {
return s.nextEchoIndex >= len(s.origin.Distances())
}
func (s *scan) String() string {
return fmt.Sprintf("[scan origin: %s start_time: %v]", s.origin.name, s.start)
}
func (s *scan) hits() {
for ; s.nextHitIndex < len(s.origin.Distances()); s.nextHitIndex += 1 {
candidate := s.origin.Distances()[s.nextHitIndex] candidate := s.origin.Distances()[s.nextHitIndex]
if s.dist < candidate.dist { if s.dist < candidate.dist {
break break
} }
s.results = append(s.results, s.hitSystem(candidate.s, candidate.dist))
log_info("scan hit %v. Traveled %v in %v", candidate.s.name, candidate.dist, time.Since(s.start)) log_info("scan hit %v. Traveled %v in %v", candidate.s.name, candidate.dist, time.Since(s.start))
s.nextHitIndex += 1 }
if s.nextHitIndex >= len(s.origin.Distances()) { }
s.Mortality = true
log_info("scan complete") func (s *scan) hitSystem(sys *System, dist float64) scanResult {
r := scanResult{
system: sys,
colonizedBy: sys.colonizedBy,
dist: dist * 2.0,
}
if sys.players != nil {
r.players = make(map[*Connection]bool, len(sys.players))
for k, v := range sys.players {
r.players[k] = v
}
}
return r
}
func (s *scan) echos() {
for ; s.nextEchoIndex < len(s.results); s.nextEchoIndex += 1 {
res := s.results[s.nextEchoIndex]
if s.dist < res.dist {
break break
} }
log_info("echo from %v reached origin %v after %v", res.system.name, s.origin.name, time.Since(s.start))
} }
} }

Loading…
Cancel
Save