package generators import ( "encoding/json" "math/rand" "os" ) type LizardfolkArrays 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"` } func LoadLizardfolkArrays(path string) (LizardfolkArrays, error) { var arrays LizardfolkArrays 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 LizardfolkNameMas(arr *LizardfolkArrays, i int, swearFilter func(string) bool) string { rnd := rand.Intn(len(arr.Nm1)) rnd2 := rand.Intn(len(arr.Nm2)) rnd3 := rand.Intn(len(arr.Nm6)) var nMs string if i < 2 { if rnd < 5 { for arr.Nm6[rnd3] == arr.Nm1[rnd] { rnd3 = rand.Intn(len(arr.Nm6)) } } nMs = arr.Nm1[rnd] + arr.Nm2[rnd2] + arr.Nm6[rnd3] } else { rnd4 := rand.Intn(len(arr.Nm3)) rnd5 := rand.Intn(len(arr.Nm4)) for arr.Nm3[rnd4] == arr.Nm1[rnd] || arr.Nm3[rnd4] == arr.Nm6[rnd3] { rnd4 = rand.Intn(len(arr.Nm3)) } if i < 7 { nMs = arr.Nm1[rnd] + arr.Nm2[rnd2] + arr.Nm3[rnd4] + arr.Nm4[rnd5] + arr.Nm6[rnd3] } else { rnd6 := rand.Intn(len(arr.Nm2)) rnd7 := rand.Intn(len(arr.Nm5)) for arr.Nm5[rnd7] == arr.Nm3[rnd4] || arr.Nm5[rnd7] == arr.Nm6[rnd3] { rnd7 = rand.Intn(len(arr.Nm5)) } nMs = arr.Nm1[rnd] + arr.Nm2[rnd2] + arr.Nm3[rnd4] + arr.Nm2[rnd6] + arr.Nm5[rnd7] + arr.Nm4[rnd5] + arr.Nm6[rnd3] } } if swearFilter != nil && swearFilter(nMs) { return "" } return nMs } func LizardfolkNameWord(arr *LizardfolkArrays, used map[int]bool) string { if len(used) >= len(arr.Nm7) { return "" } for { rnd := rand.Intn(len(arr.Nm7)) if !used[rnd] { used[rnd] = true return arr.Nm7[rnd] } } } func GenerateLizardfolkNames(arr *LizardfolkArrays, gender string, swearFilter func(string) bool) []string { names := make([]string, 0, 10) if gender == "female" { used := make(map[int]bool) for i := 0; i < 10; i++ { word := LizardfolkNameWord(arr, used) if word != "" { names = append(names, word) } } } else { for i := 0; i < 10; i++ { n := LizardfolkNameMas(arr, i, swearFilter) for n == "" { n = LizardfolkNameMas(arr, i, swearFilter) } names = append(names, n) } } return names }