X-Git-Url: http://git.scottworley.com/planeteer/blobdiff_plain/fcdc120bb1d01853dc3402284c2e33537cac14b4..ddef04ab661444f478e4602ba57784a4636f32ab:/planeteer.go diff --git a/planeteer.go b/planeteer.go index 060456d..a3a5a02 100644 --- a/planeteer.go +++ b/planeteer.go @@ -21,6 +21,7 @@ import "flag" import "fmt" import "json" import "os" +import "runtime/pprof" import "strings" var funds = flag.Int("funds", 0, @@ -62,29 +63,44 @@ var battery_price = flag.Int("battery_price", 0, "Today's Shield Battery price") var visit_string = flag.String("visit", "", "A comma-separated list of planets to make sure to visit") +var cpuprofile = flag.String("cpuprofile", "", "write cpu profile to file") + + +var visit_cache []string func visit() []string { - if *visit_string == "" { - return nil + if visit_cache == nil { + if *visit_string == "" { + return nil + } + visit_cache = strings.Split(*visit_string, ",") } - return strings.Split(*visit_string, ",") + return visit_cache } +var flight_plan_cache []string func flight_plan() []string { - if *flight_plan_string == "" { - return nil + if flight_plan_cache == nil { + if *flight_plan_string == "" { + return nil + } + flight_plan_cache = strings.Split(*flight_plan_string, ",") } - return strings.Split(*flight_plan_string, ",") + return flight_plan_cache } +var end_cache map[string]bool func end() map[string]bool { - if *end_string == "" { - return nil - } - m := make(map[string]bool) - for _, p := range strings.Split(*end_string, ",") { - m[p] = true + if end_cache == nil { + if *end_string == "" { + return nil + } + m := make(map[string]bool) + for _, p := range strings.Split(*end_string, ",") { + m[p] = true + } + end_cache = m } - return m + return end_cache } type Commodity struct { @@ -94,6 +110,7 @@ type Commodity struct { } type Planet struct { BeaconOn bool + Private bool /* Use relative prices rather than absolute prices because you can get relative prices without traveling to each planet. */ RelativePrices map[string]int @@ -320,6 +337,10 @@ func FillCellByArriving(data planet_data, dims []int, table []State, addr []int) } func FillCellBySelling(data planet_data, dims []int, table []State, addr []int) { + if data.Planets[data.i2p[addr[Location]]].Private { + // Can't do commerce on private planets + return + } if addr[Hold] > 0 { // Can't sell and still have cargo return @@ -357,6 +378,10 @@ func FillCellBySelling(data planet_data, dims []int, table []State, addr []int) } func FillCellByBuying(data planet_data, dims []int, table []State, addr []int) { + if data.Planets[data.i2p[addr[Location]]].Private { + // Can't do commerce on private planets + return + } if addr[Hold] == 0 { // Can't buy and then have nothing return @@ -429,6 +454,14 @@ func FillCellByMisc(data planet_data, dims []int, table []State, addr []int) { } /* Visit this planet */ + var i uint + for i = 0; i < uint(len(visit())); i++ { + if addr[Visit] & (1 << i) != 0 && visit()[i] == data.i2p[addr[Location]] { + other[Visit] = addr[Visit] & ^(1 << i) + UpdateCell(table, my_index, EncodeIndex(dims, other), 0) + } + } + other[Visit] = addr[Visit] } @@ -551,15 +584,17 @@ func FindBestState(data planet_data, dims []int, table []State) int { addr[BuyFighters] = dims[BuyFighters] - 1 addr[BuyShields] = dims[BuyShields] - 1 addr[Visit] = dims[Visit] - 1 - // Fuel, Hold, UnusedCargo left at 0 + // Hold and UnusedCargo left at 0 max_index := -1 max_value := 0 - for addr[Location] = 0; addr[Location] < dims[Location]; addr[Location]++ { - if len(end()) == 0 || end()[data.i2p[addr[Location]]] { - index := EncodeIndex(dims, addr) - if table[index].value > max_value { - max_value = table[index].value - max_index = index + for addr[Fuel] = 0; addr[Fuel] < 2; addr[Fuel]++ { + for addr[Location] = 0; addr[Location] < dims[Location]; addr[Location]++ { + if len(end()) == 0 || end()[data.i2p[addr[Location]]] { + index := EncodeIndex(dims, addr) + if table[index].value > max_value { + max_value = table[index].value + max_index = index + } } } } @@ -618,6 +653,10 @@ func DescribePath(data planet_data, dims []int, table []State, start int) (descr if addr[BuyFighters] == 1 && prev[BuyFighters] == 0 { line += fmt.Sprint("Buy ", *drones, " Fighter Drones") } + if addr[Visit] != prev[Visit] { + // TODO: verify that the bit chat changed is addr[Location] + line += fmt.Sprint("Visit ", data.i2p[addr[Location]]) + } if line == "" { line = fmt.Sprint(prev, " -> ", addr) } @@ -652,6 +691,14 @@ func IndexCommodities(m *map[string]Commodity, start_at int) (map[string]int, [] func main() { flag.Parse() + if *cpuprofile != "" { + f, err := os.Create(*cpuprofile) + if err != nil { + panic(err) + } + pprof.StartCPUProfile(f) + defer pprof.StopCPUProfile() + } data := ReadData() if *drone_price > 0 { temp := data.Commodities["Fighter Drones"]