]> git.scottworley.com Git - planeteer/blobdiff - planeteer.go
Consistent hyper-jump terminology.
[planeteer] / planeteer.go
index d17c5a5eea021b9a0e3d8d912df03e5be5401e31..93ecf7278553ebb73172887a8cbef567e3e1b913 100644 (file)
@@ -30,7 +30,7 @@ var start = flag.String("start", "",
        "The planet to start at")
 
 var flight_plan_string = flag.String("flight_plan", "",
-       "Your hidey-holes for the day, comma-separated.")
+       "Your hyper-holes for the day, comma-separated.")
 
 var end_string = flag.String("end", "",
        "A comma-separated list of acceptable ending planets.")
@@ -38,7 +38,7 @@ var end_string = flag.String("end", "",
 var planet_data_file = flag.String("planet_data_file", "planet-data",
        "The file to read planet data from")
 
-var fuel = flag.Int("fuel", 16, "Reactor units")
+var fuel = flag.Int("fuel", 16, "Hyper Jump power left")
 
 var hold = flag.Int("hold", 300, "Size of your cargo hold")
 
@@ -160,7 +160,7 @@ const (
        Edens        = iota //   1     3  # of Eden warp units (0 - 2 typically)
        Cloaks              //   2     2  # of Devices of Cloaking (0 or 1)
        UnusedCargo         //   3     4  # of unused cargo spaces (0 - 3 typically)
-       Fuel                //   4    17  Reactor power left (0 - 16)
+       Fuel                //   4    17  Hyper jump power left (0 - 16)
        Location            //   5    26  Location (which planet)
        Hold                //   6    15  Cargo bay contents (a *Commodity or nil)
        NeedFighters        //   7     2  Errand: Buy fighter drones (needed or not)
@@ -221,7 +221,7 @@ func EncodeIndex(dims, addr []int) int {
                panic(0)
        }
        for i := 1; i < NumDimensions; i++ {
-               if addr[i] > dims[i] {
+               if addr[i] < 0 || addr[i] > dims[i] {
                        panic(i)
                }
                index = index*dims[i] + addr[i]
@@ -286,7 +286,7 @@ func FillCellByArriving(data planet_data, dims []int, table []State, addr []int)
                other[Fuel] = addr[Fuel]
        }
 
-       /* Travel here via a hidey hole */
+       /* Travel here via a hyper hole */
        if addr[Fuel]+1 < dims[Fuel] {
                hole_index := (dims[Fuel] - 1) - (addr[Fuel] + 1)
                if hole_index < len(flight_plan()) && addr[Location] == data.p2i[flight_plan()[hole_index]] {
@@ -300,14 +300,16 @@ func FillCellByArriving(data planet_data, dims []int, table []State, addr []int)
        }
 
        /* Travel here via Eden Warp Unit */
-       if addr[Edens]+1 < dims[Edens] {
+       if addr[Edens]+1 < dims[Edens] && addr[UnusedCargo] > 1 {
                _, available := data.Planets[data.i2p[addr[Location]]].RelativePrices["Eden Warp Units"]
                if !available {
                        other[Edens] = addr[Edens] + 1
+                       other[UnusedCargo] = addr[UnusedCargo] - 1
                        for other[Location] = 0; other[Location] < dims[Location]; other[Location]++ {
                                UpdateCell(table, my_index, EncodeIndex(dims, other), 0)
                        }
                        other[Location] = addr[Location]
+                       other[UnusedCargo] = addr[UnusedCargo]
                        other[Edens] = addr[Edens]
                }
        }
@@ -382,7 +384,7 @@ func FillCellByMisc(data planet_data, dims []int, table []State, addr []int) {
        my_index := EncodeIndex(dims, addr)
        other := make([]int, NumDimensions)
        copy(other, addr)
-       /* Buy Eden warp units */
+
        /* Buy a Device of Cloaking */
        if addr[Cloaks] == 1 && addr[UnusedCargo] < dims[UnusedCargo]-1 {
                relative_price, available := data.Planets[data.i2p[addr[Location]]].RelativePrices["Device Of Cloakings"]
@@ -403,6 +405,32 @@ func FillCellByMisc(data planet_data, dims []int, table []State, addr []int) {
        /* Visit this planet */
 }
 
+func FillCellByBuyingEdens(data planet_data, dims []int, table []State, addr []int) {
+       my_index := EncodeIndex(dims, addr)
+       other := make([]int, NumDimensions)
+       copy(other, addr)
+
+       /* Buy Eden warp units */
+       eden_limit := data.Commodities["Eden Warp Units"].Limit
+       if addr[Edens] > 0 && addr[Edens] <= eden_limit {
+               relative_price, available := data.Planets[data.i2p[addr[Location]]].RelativePrices["Eden Warp Units"]
+               if available {
+                       absolute_price := int(float64(data.Commodities["Eden Warp Units"].BasePrice) * float64(relative_price) / 100.0)
+                       for quantity := addr[Edens]; quantity > 0; quantity-- {
+                               other[Edens] = addr[Edens] - quantity
+                               if addr[Hold] != 0 {
+                                       other[UnusedCargo] = addr[UnusedCargo] + quantity
+                               }
+                               if other[UnusedCargo] < dims[UnusedCargo] {
+                                       UpdateCell(table, my_index, EncodeIndex(dims, other), -absolute_price * quantity)
+                               }
+                       }
+                       other[Edens] = addr[Edens]
+                       other[UnusedCargo] = addr[UnusedCargo]
+               }
+       }
+}
+
 func FillStateTable2Iteration(data planet_data, dims []int, table []State,
 addr []int, f func(planet_data, []int, []State, []int)) {
        /* TODO: Justify the safety of the combination of this dimension
@@ -423,11 +451,7 @@ addr []int, f func(planet_data, []int, []State, []int)) {
 }
 
 func FillStateTable2(data planet_data, dims []int, table []State,
-fuel_remaining, edens_remaining int, planet string, barrier chan<- bool) {
-       addr := make([]int, len(dims))
-       addr[Edens] = edens_remaining
-       addr[Fuel] = fuel_remaining
-       addr[Location] = data.p2i[planet]
+addr []int, barrier chan<- bool) {
        FillStateTable2Iteration(data, dims, table, addr, FillCellByArriving)
        FillStateTable2Iteration(data, dims, table, addr, FillCellBySelling)
        FillStateTable2Iteration(data, dims, table, addr, FillCellByBuying)
@@ -459,9 +483,13 @@ func FillStateTable1(data planet_data, dims []int, table []State) {
        work_done := 0.0
        for fuel_remaining := *fuel; fuel_remaining >= 0; fuel_remaining-- {
                for edens_remaining := eden_capacity; edens_remaining >= 0; edens_remaining-- {
+                       /* Do the brunt of the work */
                        for planet := range data.Planets {
-                               go FillStateTable2(data, dims, table, fuel_remaining,
-                                       edens_remaining, planet, barrier)
+                               addr := make([]int, len(dims))
+                               addr[Edens] = edens_remaining
+                               addr[Fuel] = fuel_remaining
+                               addr[Location] = data.p2i[planet]
+                               go FillStateTable2(data, dims, table, addr, barrier)
                        }
                        for _ = range data.Planets {
                                <-barrier
@@ -469,6 +497,15 @@ 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")
 }
@@ -509,27 +546,26 @@ func Commas(n int) (s string) {
 
 func DescribePath(data planet_data, dims []int, table []State, start int) (description []string) {
        for index := start; index > 0 && table[index].from > 0; index = table[index].from {
-               line := fmt.Sprintf("%13v", Commas(table[index].value))
+               var line string
                addr := DecodeIndex(dims, index)
                prev := DecodeIndex(dims, table[index].from)
-               if addr[Location] != prev[Location] {
+               if addr[Fuel] != prev[Fuel] {
                        from := data.i2p[prev[Location]]
                        to := data.i2p[addr[Location]]
-                       if addr[Fuel] != prev[Fuel] {
-                               line += fmt.Sprintf(" Jump from %v to %v (%v reactor units)", from, to, prev[Fuel]-addr[Fuel])
-                       } else if addr[Edens] != prev[Edens] {
-                               line += fmt.Sprintf(" Eden warp from %v to %v", from, to)
-                       } else {
-                               panic("Traveling without fuel?")
-                       }
+                       line += fmt.Sprintf("Jump from %v to %v (%v hyper jump units)", from, to, prev[Fuel]-addr[Fuel])
+               }
+               if addr[Edens] == prev[Edens] - 1 {
+                       from := data.i2p[prev[Location]]
+                       to := data.i2p[addr[Location]]
+                       line += fmt.Sprintf("Eden warp from %v to %v", from, to)
                }
                if addr[Hold] != prev[Hold] {
                        if addr[Hold] == 0 {
                                quantity := *hold - (prev[UnusedCargo] + prev[Edens] + prev[Cloaks])
-                               line += fmt.Sprintf(" Sell %v %v", quantity, data.i2c[prev[Hold]])
+                               line += fmt.Sprintf("Sell %v %v", quantity, data.i2c[prev[Hold]])
                        } else if prev[Hold] == 0 {
                                quantity := *hold - (addr[UnusedCargo] + addr[Edens] + addr[Cloaks])
-                               line += fmt.Sprintf(" Buy %v %v", quantity, data.i2c[addr[Hold]])
+                               line += fmt.Sprintf("Buy %v %v", quantity, data.i2c[addr[Hold]])
                        } else {
                                panic("Switched cargo?")
                        }
@@ -537,9 +573,15 @@ func DescribePath(data planet_data, dims []int, table []State, start int) (descr
                }
                if addr[Cloaks] == 1 && prev[Cloaks] == 0 {
                        // TODO: Dump cloaks, convert from cargo?
-                       line += " Buy a Cloak"
+                       line += "Buy a Cloak"
+               }
+               if addr[Edens] > prev[Edens] {
+                       line += fmt.Sprint("Buy ", addr[Edens] - prev[Edens], " Eden Warp Units")
+               }
+               if line == "" {
+                       line = fmt.Sprint(prev, " -> ", addr)
                }
-               description = append(description, line)
+               description = append(description, fmt.Sprintf("%13v ", Commas(table[index].value)) + line)
        }
        return
 }