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.

136 lines
4.0 KiB
Go

10 years ago
package main
import (
"flag"
10 years ago
"fmt"
"log"
10 years ago
"math/rand"
"net"
10 years ago
"os"
10 years ago
"time"
10 years ago
)
var options struct {
bombCost int
bombSpeed float64
debug bool
economic int
frameLength time.Duration
colonyCost int
frameRate int
lightSpeed float64
makeBombTime time.Duration
makeColonyTime time.Duration
10 years ago
makeShieldTime time.Duration
moneyMean float64
moneySigma float64
playerSpeed float64
respawnFrames int64
respawnTime time.Duration
scanTime time.Duration
speckPath string
startBombs int
startMoney int
}
10 years ago
var (
info_log *log.Logger
error_log *log.Logger
currentGame *Game
10 years ago
)
10 years ago
func log_error(template string, args ...interface{}) {
error_log.Printf(template, args...)
10 years ago
}
func log_info(template string, args ...interface{}) {
info_log.Printf(template, args...)
10 years ago
}
func bail(status int, template string, args ...interface{}) {
10 years ago
if status == 0 {
fmt.Fprintf(os.Stdout, template, args...)
} else {
fmt.Fprintf(os.Stderr, template, args...)
}
os.Exit(status)
10 years ago
}
10 years ago
func handleConnection(conn *Connection) {
defer conn.Close()
conn.Login()
10 years ago
c := make(chan []string)
go conn.ReadLines(c)
10 years ago
10 years ago
for parts := range c {
conn.RunCommand(parts[0], parts[1:]...)
10 years ago
}
}
// converts a duration in human time to a number of in-game frames
func durToFrames(dur time.Duration) int64 {
return int64(dur / options.frameLength)
}
func framesToDur(frames int64) time.Duration {
return options.frameLength * time.Duration(frames)
}
10 years ago
func main() {
flag.Parse()
10 years ago
dbconnect()
options.frameLength = time.Second / time.Duration(options.frameRate)
options.respawnFrames = durToFrames(options.respawnTime)
10 years ago
rand.Seed(time.Now().UnixNano())
info_log = log.New(os.Stdout, "[INFO] ", 0)
error_log = log.New(os.Stderr, "[ERROR] ", 0)
10 years ago
10 years ago
setupDb()
addr := ":9220"
listener, err := net.Listen("tcp", addr)
if err != nil {
bail(E_No_Port, "unable to start server: %v", err)
}
log_info("listening on %s", addr)
go func() {
for {
log_info("starting new game")
currentGame = NewGame()
currentGame.Run()
}
}()
for {
conn, err := listener.Accept()
if err != nil {
log_error("error accepting connection: %v", err)
continue
}
10 years ago
go handleConnection(NewConnection(conn))
}
10 years ago
}
func init() {
flag.Float64Var(&options.lightSpeed, "light-speed", 0.01, "speed of light in parsecs per frame")
flag.IntVar(&options.frameRate, "frame-rate", 100, "frame rate, in frames per second")
flag.Float64Var(&options.playerSpeed, "player-speed", 0.8, "player travel speed, relative to C, the speed of light")
flag.Float64Var(&options.bombSpeed, "bomb-speed", 0.9, "bomb travel speed, relattive to C, the speed of light")
flag.IntVar(&options.economic, "economic", 25000, "amount of money needed to win economic victory")
flag.Float64Var(&options.moneyMean, "money-mean", 10000, "mean amount of money on a system")
flag.Float64Var(&options.moneySigma, "money-sigma", 1500, "standard deviation in money per system")
flag.BoolVar(&options.debug, "debug", false, "puts the game in debug mode")
6 years ago
flag.StringVar(&options.speckPath, "speck-path", "./expl.speck", "path to exoplanet speck file")
flag.DurationVar(&options.respawnTime, "respawn-time", 60*time.Second, "time for player respawn")
flag.DurationVar(&options.makeBombTime, "bomb-time", 5*time.Second, "time it takes to make a bomb")
flag.IntVar(&options.bombCost, "bomb-cost", 500, "price of a bomb")
flag.IntVar(&options.colonyCost, "colony-cost", 2000, "price of a colony")
flag.DurationVar(&options.makeColonyTime, "colony-time", 15*time.Second, "time it takes to make a colony")
flag.IntVar(&options.startBombs, "start-bombs", 0, "number of bombs a player has at game start")
flag.IntVar(&options.startMoney, "start-money", 1000, "amount of money a player has to start")
10 years ago
flag.DurationVar(&options.makeShieldTime, "shield-time", 15*time.Second, "time it takes to make a shield")
flag.DurationVar(&options.scanTime, "scan-recharge", 1*time.Minute, "time it takes for scanners to recharge")
}