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