]> git.scottworley.com Git - planeteer/blobdiff - planeteer.go
Allow specifying a starting cargo
[planeteer] / planeteer.go
index cfde30f1cca565d37f7fdaba68323ee62d6800a9..a707d589d11778890efc81cb73b5f2a31346278a 100644 (file)
@@ -43,6 +43,8 @@ var fuel = flag.Int("fuel", 16, "Hyper Jump power left")
 
 var hold = flag.Int("hold", 300, "Size of your cargo hold")
 
+var start_hold = flag.String("start_hold", "", "Start with a hold full of cargo")
+
 var start_edens = flag.Int("start_edens", 0,
        "How many Eden Warp Units are you starting with?")
 
@@ -241,9 +243,11 @@ type State struct {
 }
 
 const (
-       CELL_UNINITIALIZED = -2147483647 + iota
-       CELL_BEING_EVALUATED
-       CELL_RUBISH
+       FROM_ROOT = -2147483647 + iota
+       FROM_UNINITIALIZED
+       VALUE_UNINITIALIZED
+       VALUE_BEING_EVALUATED
+       VALUE_RUBISH
 )
 
 func EncodeIndex(dims, addr []int) int32 {
@@ -273,15 +277,20 @@ func DecodeIndex(dims []int, index int32) []int {
 func CreateStateTable(data planet_data, dims []int) []State {
        table := make([]State, StateTableSize(dims))
        for i := range table {
-               table[i].value = CELL_UNINITIALIZED
+               table[i].value = VALUE_UNINITIALIZED
+               table[i].from = FROM_UNINITIALIZED
        }
 
        addr := make([]int, NumDimensions)
        addr[Fuel] = *fuel
        addr[Edens] = *start_edens
        addr[Location] = data.p2i[*start]
-       addr[Traded] = 1
-       table[EncodeIndex(dims, addr)].value = int32(*funds)
+       if *start_hold != "" {
+               addr[Hold] = data.c2i[*start_hold]
+       }
+       start_index := EncodeIndex(dims, addr)
+       table[start_index].value = int32(*funds)
+       table[start_index].from = FROM_ROOT
 
        return table
 }
@@ -306,15 +315,15 @@ var cell_filled_count int
 
 func CellValue(data planet_data, dims []int, table []State, addr []int) int32 {
        my_index := EncodeIndex(dims, addr)
-       if table[my_index].value == CELL_BEING_EVALUATED {
+       if table[my_index].value == VALUE_BEING_EVALUATED {
                panic("Circular dependency")
        }
-       if table[my_index].value != CELL_UNINITIALIZED {
+       if table[my_index].value != VALUE_UNINITIALIZED {
                return table[my_index].value
        }
-       table[my_index].value = CELL_BEING_EVALUATED
+       table[my_index].value = VALUE_BEING_EVALUATED
 
-       best_value := int32(CELL_RUBISH)
+       best_value := int32(VALUE_RUBISH)
        best_source := make([]int, NumDimensions)
        other := make([]int, NumDimensions)
        copy(other, addr)
@@ -505,7 +514,7 @@ func CellValue(data planet_data, dims []int, table []State, addr []int) int32 {
 
        // Sanity check: This cell was in state BEING_EVALUATED
        // the whole time that it was being evaluated.
-       if table[my_index].value != CELL_BEING_EVALUATED {
+       if table[my_index].value != VALUE_BEING_EVALUATED {
                panic(my_index)
        }
 
@@ -515,7 +524,7 @@ func CellValue(data planet_data, dims []int, table []State, addr []int) int32 {
 
        // UI: Progress bar
        cell_filled_count++
-       if cell_filled_count&0xff == 0 {
+       if cell_filled_count&0xfff == 0 {
                print(fmt.Sprintf("\r%3.1f%%", 100*float64(cell_filled_count)/float64(StateTableSize(dims))))
        }
 
@@ -566,7 +575,10 @@ func Commas(n int32) (s string) {
 }
 
 func DescribePath(data planet_data, dims []int, table []State, start int32) (description []string) {
-       for index := start; index > 0 && table[index].from > 0; index = table[index].from {
+       for index := start; table[index].from > FROM_ROOT; index = table[index].from {
+               if table[index].from == FROM_UNINITIALIZED {
+                       panic(index)
+               }
                var line string
                addr := DecodeIndex(dims, index)
                prev := DecodeIndex(dims, table[index].from)
@@ -648,6 +660,10 @@ func IndexCommodities(m *map[string]Commodity, start_at int) (map[string]int, []
 
 func main() {
        flag.Parse()
+       if *start == "" || *funds == 0 {
+               print("--start and --funds are required.  --help for more\n")
+               return
+       }
        if *cpuprofile != "" {
                f, err := os.Create(*cpuprofile)
                if err != nil {