package generators import ( "encoding/json" "math/rand" "os" ) type HalflingArrays struct { Nm1 []string `json:"nm1"` Nm2 []string `json:"nm2"` Nm3 []string `json:"nm3"` Nm4 []string `json:"nm4"` Nm12 []string `json:"nm12"` Nm13 []string `json:"nm13"` } func LoadHalflingArrays(path string) (HalflingArrays, error) { var arrays HalflingArrays 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 HalflingNameFem(arr *HalflingArrays) string { rnd := rand.Intn(len(arr.Nm3)) rnd2 := rand.Intn(len(arr.Nm4)) return arr.Nm3[rnd] + arr.Nm4[rnd2] } func HalflingNameMas(arr *HalflingArrays, swearFilter func(string) bool) string { rnd := rand.Intn(len(arr.Nm1)) rnd2 := rand.Intn(len(arr.Nm2)) nMs := arr.Nm1[rnd] + arr.Nm2[rnd2] if swearFilter == nil || !swearFilter(nMs) { return nMs } return "" } func GenerateHalflingNames(arr *HalflingArrays, gender string, swearFilter func(string) bool) []string { names := make([]string, 0, 10) nm12 := make([]string, len(arr.Nm12)) nm13 := make([]string, len(arr.Nm13)) copy(nm12, arr.Nm12) copy(nm13, arr.Nm13) for i := 0; i < 10; i++ { var nMs string if gender == "female" { nMs = HalflingNameFem(arr) for nMs == "" { nMs = HalflingNameFem(arr) } } else { nMs = HalflingNameMas(arr, swearFilter) for nMs == "" { nMs = HalflingNameMas(arr, swearFilter) } } // Surname logic rnd := rand.Intn(len(nm12)) rnd2 := rand.Intn(len(nm13)) for nm12[rnd] == nm13[rnd2] { rnd2 = rand.Intn(len(nm13)) } surname := nm12[rnd] + nm13[rnd2] nm12 = append(nm12[:rnd], nm12[rnd+1:]...) nm13 = append(nm13[:rnd2], nm13[rnd2+1:]...) names = append(names, nMs+" "+surname) } return names }