gen.go raw

   1  package world
   2  
   3  import (
   4  	"fmt"
   5  	"github.com/l0k18/alieninvasion/pkg/cities"
   6  	"math/rand"
   7  	"os"
   8  )
   9  
  10  // Line is a 1d array of names
  11  type Line []string
  12  
  13  // Grid is a 2d array of names
  14  type Grid []Line
  15  
  16  func Generate(h, v int64, seed int64) (w *World) {
  17  
  18  	rand.Seed(seed)
  19  	rand.Shuffle(
  20  		len(cities.NameList),
  21  		func(i, j int) { cities.NameList[i], cities.NameList[j] = cities.NameList[j], cities.NameList[i] },
  22  	)
  23  
  24  	w = New()
  25  
  26  	// We are going to generate a uniform grid of h*v cities from a 2d slice
  27  	// of random generated names
  28  
  29  	grid := make(Grid, v)
  30  	for i := range grid {
  31  		grid[i] = make(Line, h)
  32  	}
  33  
  34  	var name int
  35  	for lat := range grid {
  36  
  37  		for long := range grid[lat] {
  38  
  39  			grid[lat][long] = cities.NameList[name]
  40  			name++
  41  		}
  42  	}
  43  
  44  	latMax := int(v - 1)
  45  	longMax := int(h - 1)
  46  
  47  	for lat := range grid {
  48  
  49  		for long := range grid[lat] {
  50  
  51  			name := grid[lat][long]
  52  
  53  			// wrap the map at the edges
  54  			latN := lat - 1
  55  			if latN < 0 {
  56  				latN = latMax
  57  			}
  58  			latS := lat + 1
  59  			if latS > latMax {
  60  				latS = 0
  61  			}
  62  			longE := long - 1
  63  			if longE < 0 {
  64  				longE = longMax
  65  			}
  66  			longW := long + 1
  67  			if longW > longMax {
  68  				longW = 0
  69  			}
  70  
  71  			nN := grid[latN][long]
  72  			nE := grid[lat][longE]
  73  			nW := grid[lat][longW]
  74  			nS := grid[latS][long]
  75  
  76  			lineString := fmt.Sprintf("%s %s=%s %s=%s %s=%s %s=%s",
  77  				name, Dirs[N], nN, Dirs[E], nE, Dirs[W], nW, Dirs[S], nS)
  78  
  79  			err := w.AddFromString(lineString)
  80  			if err != nil {
  81  				fmt.Println("error adding", lat, long, name, err)
  82  				os.Exit(1)
  83  			}
  84  		}
  85  	}
  86  
  87  	return
  88  }
  89