]> git.scottworley.com Git - planeteer/blobdiff - planeteer.go
Print total cost of fighters and shields
[planeteer] / planeteer.go
index f4a64aae23449c055b8b3e9d2b8ccb1143d51323..a8e6516e26869422f005208df90337a2216f8907 100644 (file)
@@ -19,7 +19,7 @@ package main
 
 import "flag"
 import "fmt"
-import "json"
+import "encoding/json"
 import "os"
 import "runtime/pprof"
 import "strings"
@@ -535,7 +535,7 @@ func CellValue(data planet_data, dims []int, table []State, addr []int) int32 {
        return table[my_index].value
 }
 
-func FindBestState(data planet_data, dims []int, table []State) int32 {
+func FinalState(dims []int) []int {
        addr := make([]int, NumDimensions)
        addr[Edens] = *end_edens
        addr[Cloaks] = dims[Cloaks] - 1
@@ -545,6 +545,11 @@ func FindBestState(data planet_data, dims []int, table []State) int32 {
        addr[Traded] = 1
        addr[Hold] = 0
        addr[UnusedCargo] = 0
+       // Fuel and Location are determined by FindBestState
+       return addr
+}
+
+func FindBestState(data planet_data, dims []int, table []State, addr []int) int32 {
        max_index := int32(-1)
        max_value := 0.0
        max_fuel := 1
@@ -694,14 +699,47 @@ func main() {
        data.c2i, data.i2c = IndexCommodities(&data.Commodities, 1)
        dims := DimensionSizes(data)
        table := CreateStateTable(data, dims)
-       best := FindBestState(data, dims, table)
+       final_state := FinalState(dims)
+       best := FindBestState(data, dims, table, final_state)
        print("\n")
        if best == -1 {
                print("Cannot acheive success criteria\n")
-       } else {
-               description := DescribePath(data, dims, table, best)
-               for i := len(description) - 1; i >= 0; i-- {
-                       fmt.Println(description[i])
-               }
+               return
+       }
+       description := DescribePath(data, dims, table, best)
+       for i := len(description) - 1; i >= 0; i-- {
+               fmt.Println(description[i])
+       }
+
+       // Calculate total cost of fighters and shields
+       if *drones > 0 || *batteries > 0 {
+               fmt.Println()
+       }
+       if *drones > 0 {
+               final_state[BuyFighters] = 0
+               alt_best := FindBestState(data, dims, table, final_state)
+               cost := table[alt_best].value - table[best].value
+               fmt.Println("Drones were", float64(cost)/float64(*drones), "each")
+               final_state[BuyFighters] = 1
+       }
+       if *batteries > 0 {
+               final_state[BuyShields] = 0
+               alt_best := FindBestState(data, dims, table, final_state)
+               cost := table[alt_best].value - table[best].value
+               fmt.Println("Batteries were", float64(cost)/float64(*batteries), "each")
+               final_state[BuyShields] = 1
+       }
+
+       // Use extra eden warps
+       if *end_edens > 0 {
+               fmt.Println()
+       }
+       for extra_edens := 1; extra_edens <= *end_edens; extra_edens++ {
+               final_state[Edens] = *end_edens - extra_edens
+               alt_best := FindBestState(data, dims, table, final_state)
+               extra_funds := table[alt_best].value - table[best].value
+               fmt.Println("\rUse", extra_edens, "extra edens, make an extra",
+                       Commas(extra_funds), "(",
+                       Commas(extra_funds/int32(extra_edens)), "per eden)")
        }
 }