package generators import ( "encoding/json" "math/rand" "os" ) type GnomeArrays struct { Nm1 []string `json:"nm1"` Nm2 []string `json:"nm2"` Nm3 []string `json:"nm3"` Nm4 []string `json:"nm4"` Nm5 []string `json:"nm5"` Nm6 []string `json:"nm6"` Nm7 []string `json:"nm7"` Nm8 []string `json:"nm8"` Nm9 []string `json:"nm9"` Nm10 []string `json:"nm10"` Nm11 []string `json:"nm11"` Nm12 []string `json:"nm12"` Nm13 []string `json:"nm13"` Nm14 []string `json:"nm14"` } func LoadGnomeArrays(path string) (GnomeArrays, error) { var arrays GnomeArrays file, err := os.Open(path) if err != nil { return arrays, err } defer file.Close() decoder := json.NewDecoder(file) err = decoder.Decode(&arrays) return arrays, err } func GnomeNameFem(arr *GnomeArrays, swearFilter func(string) bool) string { rnd := rand.Intn(len(arr.Nm3)) rnd2 := rand.Intn(len(arr.Nm4)) return arr.Nm3[rnd] + arr.Nm4[rnd2] } func GnomeNameMas(arr *GnomeArrays, swearFilter func(string) bool) string { rnd := rand.Intn(len(arr.Nm1)) rnd2 := rand.Intn(len(arr.Nm2)) return arr.Nm1[rnd] + arr.Nm2[rnd2] } func GnomeNameSur(arr *GnomeArrays, swearFilter func(string) bool) string { nTp := rand.Intn(8) if nTp < 2 { rnd := rand.Intn(len(arr.Nm5)) rnd2 := rand.Intn(len(arr.Nm10)) rnd3 := rand.Intn(len(arr.Nm12)) rnd4 := rand.Intn(len(arr.Nm5)) rnd5 := rand.Intn(len(arr.Nm10)) for arr.Nm5[rnd] == "" { rnd = rand.Intn(len(arr.Nm5)) } for arr.Nm5[rnd4] == "" { rnd4 = rand.Intn(len(arr.Nm5)) } return arr.Nm5[rnd] + arr.Nm10[rnd2] + arr.Nm12[rnd3] + "e" + arr.Nm5[rnd4] + arr.Nm10[rnd5] + arr.Nm12[rnd3] + "e" } else { rnd := rand.Intn(len(arr.Nm5)) rnd2 := rand.Intn(len(arr.Nm6)) rnd3 := rand.Intn(len(arr.Nm7)) rnd4 := rand.Intn(len(arr.Nm8)) rnd5 := rand.Intn(len(arr.Nm11)) if nTp < 3 { for arr.Nm7[rnd3] == arr.Nm5[rnd] || arr.Nm7[rnd3] == arr.Nm11[rnd5] { rnd3 = rand.Intn(len(arr.Nm7)) } return arr.Nm5[rnd] + arr.Nm6[rnd2] + arr.Nm7[rnd3] + arr.Nm8[rnd4] + arr.Nm11[rnd5] } else { rnd6 := rand.Intn(len(arr.Nm9)) rnd7 := rand.Intn(len(arr.Nm10)) for arr.Nm7[rnd3] == arr.Nm9[rnd6] || arr.Nm9[rnd6] == arr.Nm11[rnd5] { rnd6 = rand.Intn(len(arr.Nm9)) } if nTp < 5 { return arr.Nm5[rnd] + arr.Nm6[rnd2] + arr.Nm7[rnd3] + arr.Nm8[rnd4] + arr.Nm9[rnd6] + arr.Nm10[rnd7] + arr.Nm11[rnd5] } else { rnd8 := rand.Intn(len(arr.Nm9)) rnd9 := rand.Intn(len(arr.Nm10)) for arr.Nm7[rnd3] == arr.Nm9[rnd8] || arr.Nm9[rnd6] == arr.Nm9[rnd8] { rnd8 = rand.Intn(len(arr.Nm9)) } return arr.Nm5[rnd] + arr.Nm6[rnd2] + arr.Nm7[rnd3] + arr.Nm8[rnd4] + arr.Nm9[rnd6] + arr.Nm10[rnd7] + arr.Nm9[rnd8] + arr.Nm10[rnd9] + arr.Nm11[rnd5] } } } } func GenerateGnomeNames(arr *GnomeArrays, gender string, swearFilter func(string) bool) []string { names := make([]string, 0, 10) for i := 0; i < 10; i++ { var nMs, baseName string if i < 5 { rnd := rand.Intn(len(arr.Nm13)) rnd2 := rand.Intn(len(arr.Nm14)) for arr.Nm13[rnd] == arr.Nm14[rnd2] { rnd2 = rand.Intn(len(arr.Nm14)) } baseName = arr.Nm13[rnd] + arr.Nm14[rnd2] } else { baseName = GnomeNameSur(arr, swearFilter) for baseName == "" { baseName = GnomeNameSur(arr, swearFilter) } } if gender == "female" { nMs = GnomeNameFem(arr, swearFilter) for nMs == "" { nMs = GnomeNameFem(arr, swearFilter) } } else { nMs = GnomeNameMas(arr, swearFilter) for nMs == "" { nMs = GnomeNameMas(arr, swearFilter) } } names = append(names, nMs+" "+baseName) } return names }