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.

157 lines
3.5 KiB
Go

package main
import (
"fmt"
"time"
)
type IdleState struct {
CommandSuite
10 years ago
NopExit
*System
}
func Idle(sys *System) ConnectionState {
i := &IdleState{System: sys}
i.CommandSuite = CommandSet{
balCommand,
helpCommand,
playersCommand,
BroadcastCommand(sys),
Command{
name: "goto",
help: "travel between star systems",
arity: 1,
handler: i.travelTo,
},
Command{
name: "nearby",
help: "list nearby star systems",
arity: 0,
handler: i.nearby,
},
Command{
name: "bomb",
help: "bomb another star system",
arity: 1,
handler: i.bomb,
},
10 years ago
Command{
name: "mine",
help: "mine the current system for resources",
arity: 0,
handler: i.mine,
},
Command{
name: "info",
help: "gives you information about the current star system",
arity: 0,
handler: i.info,
},
10 years ago
Command{
name: "scan",
help: "scans the galaxy for signs of life",
arity: 0,
handler: i.scan,
},
Command{
name: "make",
help: "makes things",
handler: i.maek,
},
}
return i
}
10 years ago
func (i *IdleState) Enter(c *Connection) {
i.System.Arrive(c)
}
func (i *IdleState) String() string {
return fmt.Sprintf("idle on %v", i.System)
}
func (i *IdleState) Tick(c *Connection, frame int64) ConnectionState {
return i
}
func (i *IdleState) travelTo(c *Connection, args ...string) {
dest, err := GetSystem(args[0])
if err != nil {
c.Printf("%v\n", err)
return
}
c.SetState(NewTravel(c, i.System, dest))
}
func (i *IdleState) nearby(c *Connection, args ...string) {
neighbors, err := i.Nearby(25)
if err != nil {
log_error("unable to get neighbors: %v", err)
return
}
c.Printf("--------------------------------------------------------------------------------\n")
c.Printf("%-4s %-20s %s\n", "id", "name", "distance")
c.Printf("--------------------------------------------------------------------------------\n")
for _, neighbor := range neighbors {
other := index[neighbor.id]
c.Printf("%-4d %-20s %v\n", other.id, other.name, neighbor.distance)
}
c.Printf("--------------------------------------------------------------------------------\n")
}
func (i *IdleState) bomb(c *Connection, args ...string) {
if c.bombs <= 0 {
c.Printf("Cannot send bomb: no bombs left! Build more bombs!\n")
return
}
if time.Since(c.lastBomb) < 5*time.Second {
c.Printf("Cannot send bomb: bombs are reloading\n")
return
}
target, err := GetSystem(args[0])
if err != nil {
c.Printf("Cannot send bomb: %v\n", err)
return
}
c.bombs -= 1
c.lastBomb = time.Now()
bomb := NewBomb(c, i.System, target)
currentGame.Register(bomb)
}
10 years ago
func (i *IdleState) mine(c *Connection, args ...string) {
c.SetState(Mine(i.System))
}
func (i *IdleState) info(c *Connection, args ...string) {
c.Printf("Currently idle on system %v\n", i.System)
}
10 years ago
func (i *IdleState) scan(c *Connection, args ...string) {
if time.Since(c.lastScan) < 1*time.Minute {
return
}
c.Printf("Scanning the galaxy for signs of life...\n")
currentGame.Register(NewScan(i.System))
}
// "make" is already a keyword
func (i *IdleState) maek(c *Connection, args ...string) {
switch args[0] {
case "bomb":
if c.money < options.bombCost {
c.Printf("Not enough money! Bombs costs %v but you only have %v space duckets. Mine more space duckets!\n", options.bombCost, c.money)
return
}
c.SetState(MakeBomb(i.System))
case "colony":
MakeColony(c, i.System)
return
default:
c.Printf("I don't know how to make a %v.\n", args[0])
}
}