package main import ( "fmt" "time" ) type IdleState struct { CommandSuite NopExit *System } func Idle(sys *System) ConnectionState { i := &IdleState{System: sys} i.CommandSuite = CommandSet{ balCommand, playersCommand, BroadcastCommand(sys), NearbyCommand(sys), Command{ name: "goto", help: "travel between star systems", arity: 1, handler: i.travelTo, }, Command{ name: "bomb", help: "bomb another star system", arity: 1, handler: i.bomb, }, 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, }, 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 } 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) 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) c.game.Register(bomb) } 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) c.Printf("Space duckets available: %v\n", i.money) } 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") c.game.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 case "shield": MakeShield(c, i.System) default: c.Printf("I don't know how to make a %v.\n", args[0]) } } func (i *IdleState) PrintStatus(c *Connection) { panic("not done") }