]> git.scottworley.com Git - planeteer/blobdiff - planeteer.go
Private flag
[planeteer] / planeteer.go
index e94ebe5bda36524a3a38775d68baa51cb8aec321..e9f10c7595b13fc863ea68801b90e0b972b40c39 100644 (file)
@@ -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]
 
 }
 
@@ -483,7 +516,10 @@ addr []int, barrier chan<- bool) {
        FillStateTable2Iteration(data, dims, table, addr, FillCellBySelling)
        FillStateTable2Iteration(data, dims, table, addr, FillCellByBuying)
        FillStateTable2Iteration(data, dims, table, addr, FillCellByMisc)
-       barrier <- true
+       FillStateTable2Iteration(data, dims, table, addr, FillCellByBuyingEdens)
+       if barrier != nil {
+               barrier <- true
+       }
 }
 
 /* Filling the state table is a set of nested for loops NumDimensions deep.
@@ -509,6 +545,19 @@ func FillStateTable1(data planet_data, dims []int, table []State) {
        work_units := (float64(*fuel) + 1) * (float64(eden_capacity) + 1)
        work_done := 0.0
        for fuel_remaining := *fuel; fuel_remaining >= 0; fuel_remaining-- {
+               /* Make an Eden-buying pass (Eden vendors' energy gradient
+                * along the Edens dimension runs backwards) */
+               for edens_remaining := 0; edens_remaining <= eden_capacity; edens_remaining++ {
+                       for planet := range data.Planets {
+                               if _, available := data.Planets[planet].RelativePrices["Eden Warp Units"]; available {
+                                       addr := make([]int, len(dims))
+                                       addr[Edens] = edens_remaining
+                                       addr[Fuel] = fuel_remaining
+                                       addr[Location] = data.p2i[planet]
+                                       FillStateTable2(data, dims, table, addr, nil)
+                               }
+                       }
+               }
                for edens_remaining := eden_capacity; edens_remaining >= 0; edens_remaining-- {
                        /* Do the brunt of the work */
                        for planet := range data.Planets {
@@ -524,15 +573,6 @@ func FillStateTable1(data planet_data, dims []int, table []State) {
                        work_done++
                        print(fmt.Sprintf("\r%3.0f%%", 100*work_done/work_units))
                }
-               /* Make an Eden-buying pass (uphill) */
-               addr := make([]int, len(dims))
-               addr[Fuel] = fuel_remaining
-               for addr[Edens] = 0; addr[Edens] <= eden_capacity; addr[Edens]++ {
-                       for planet := range data.Planets {
-                               addr[Location] = data.p2i[planet]
-                               FillStateTable2Iteration(data, dims, table, addr, FillCellByBuyingEdens)
-                       }
-               }
        }
        print("\n")
 }
@@ -611,6 +651,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)
                }
@@ -645,6 +689,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"]