package generators import ( "encoding/json" "math/rand" "os" ) type SatyrArrays 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"` Nm15 []string `json:"nm15"` Nm16 []string `json:"nm16"` Nm17 []string `json:"nm17"` Nm18 []string `json:"nm18"` } func LoadSatyrArrays(path string) (SatyrArrays, error) { var arrays SatyrArrays 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 SatyrNameMas(arr *SatyrArrays, swearFilter func(string) bool) string { nTp := rand.Intn(2) rnd := rand.Intn(len(arr.Nm1)) rnd2 := rand.Intn(len(arr.Nm2)) rnd3 := rand.Intn(len(arr.Nm3)) rnd4 := rand.Intn(len(arr.Nm6)) rnd5 := rand.Intn(len(arr.Nm7)) for rnd2 == 0 && rnd4 == 0 { rnd2 = rand.Intn(len(arr.Nm2)) } var nMs string if nTp == 0 { for arr.Nm3[rnd3] == arr.Nm7[rnd5] && arr.Nm3[rnd3] == arr.Nm1[rnd] { rnd3 = rand.Intn(len(arr.Nm3)) } nMs = arr.Nm1[rnd] + arr.Nm2[rnd2] + arr.Nm3[rnd3] + arr.Nm6[rnd4] + arr.Nm7[rnd5] } else { rnd6 := rand.Intn(len(arr.Nm4)) rnd7 := rand.Intn(len(arr.Nm5)) for arr.Nm3[rnd5] == arr.Nm5[rnd3] && arr.Nm3[rnd5] == arr.Nm1[rnd] { rnd5 = rand.Intn(len(arr.Nm3)) } for rnd6 == 0 && rnd4 == 0 { rnd6 = rand.Intn(len(arr.Nm4)) } nMs = arr.Nm1[rnd] + arr.Nm2[rnd2] + arr.Nm3[rnd3] + arr.Nm4[rnd6] + arr.Nm5[rnd7] + arr.Nm6[rnd4] + arr.Nm7[rnd5] } if swearFilter != nil && swearFilter(nMs) { return "" } return nMs } func SatyrNameFem(arr *SatyrArrays, swearFilter func(string) bool) string { nTp := rand.Intn(8) var nMs string if nTp == 0 { rnd := rand.Intn(9) rnd2 := rand.Intn(3) nMs = arr.Nm8[rnd] + arr.Nm13[rnd2] } else { rnd := rand.Intn(len(arr.Nm8)) rnd2 := rand.Intn(len(arr.Nm9)) rnd3 := rand.Intn(len(arr.Nm10)) rnd4 := rand.Intn(len(arr.Nm13)) if nTp < 3 { for arr.Nm8[rnd] == arr.Nm10[rnd3] { rnd3 = rand.Intn(len(arr.Nm10)) } for rnd2 < 3 { rnd2 = rand.Intn(len(arr.Nm9)) } nMs = arr.Nm8[rnd] + arr.Nm9[rnd2] + arr.Nm10[rnd3] + arr.Nm13[rnd4] } else { rnd5 := rand.Intn(len(arr.Nm11)) rnd6 := rand.Intn(len(arr.Nm12)) for arr.Nm12[rnd6] == arr.Nm10[rnd3] && arr.Nm10[rnd3] == arr.Nm8[rnd] { rnd3 = rand.Intn(len(arr.Nm10)) } for rnd2 < 3 && rnd4 < 3 { rnd2 = rand.Intn(len(arr.Nm9)) } nMs = arr.Nm8[rnd] + arr.Nm9[rnd2] + arr.Nm10[rnd3] + arr.Nm11[rnd5] + arr.Nm12[rnd6] + arr.Nm13[rnd4] } } if swearFilter != nil && swearFilter(nMs) { return "" } return nMs } func SatyrNameChild(arr *SatyrArrays) string { nTp := rand.Intn(5) var nMs string if nTp == 0 { rnd := rand.Intn(len(arr.Nm18)) nMs = arr.Nm18[rnd] } else if nTp < 3 { rnd := rand.Intn(len(arr.Nm14)) rnd2 := rand.Intn(len(arr.Nm15)) for arr.Nm14[rnd] == arr.Nm15[rnd2] { rnd2 = rand.Intn(len(arr.Nm15)) } nMs = arr.Nm14[rnd] + arr.Nm15[rnd2] } else { rnd := rand.Intn(len(arr.Nm16)) rnd2 := rand.Intn(len(arr.Nm17)) for arr.Nm16[rnd] == arr.Nm17[rnd2] { rnd2 = rand.Intn(len(arr.Nm17)) } nMs = arr.Nm16[rnd] + arr.Nm17[rnd2] } return nMs } func GenerateSatyrNames(arr *SatyrArrays, gender string, swearFilter func(string) bool) []string { names := make([]string, 0, 10) switch gender { case "child": for i := 0; i < 10; i++ { n := SatyrNameChild(arr) names = append(names, n) } case "female": for i := 0; i < 10; i++ { n := SatyrNameFem(arr, swearFilter) for n == "" { n = SatyrNameFem(arr, swearFilter) } names = append(names, n) } default: for i := 0; i < 10; i++ { n := SatyrNameMas(arr, swearFilter) for n == "" { n = SatyrNameMas(arr, swearFilter) } names = append(names, n) } } return names }