package generators import ( "encoding/json" "math/rand" "os" "time" ) type TabaxiArrays struct { Nm1 []string `json:"nm1"` Nm2 []string `json:"nm2"` Nm3 []string `json:"nm3"` Nm4 []string `json:"nm4"` Nm5 []string `json:"nm5"` } func LoadTabaxiArrays(path string) (TabaxiArrays, error) { var arr TabaxiArrays file, err := os.Open(path) if err != nil { return arr, err } defer file.Close() decoder := json.NewDecoder(file) if err := decoder.Decode(&arr); err != nil { return arr, err } return arr, nil } func GenerateTabaxiNames(arr *TabaxiArrays, gender string, swearFilter func(string) bool) []string { names := make([]string, 0, 10) r := rand.New(rand.NewSource(time.Now().UnixNano())) if gender == "female" { for i := 0; i < 10; i++ { rnd := r.Intn(len(arr.Nm4)) rnd2 := r.Intn(len(arr.Nm5)) name := "The " + arr.Nm4[rnd] + " " + arr.Nm5[rnd2] + " Clan" for name == "" || swearFilter(name) { rnd = r.Intn(len(arr.Nm4)) rnd2 = r.Intn(len(arr.Nm5)) name = "The " + arr.Nm4[rnd] + " " + arr.Nm5[rnd2] + " Clan" } names = append(names, name) } return names } // For main type, ensure unique draws for nm1, nm2, nm3 as in JS nm1 := make([]string, len(arr.Nm1)) copy(nm1, arr.Nm1) nm2 := make([]string, len(arr.Nm2)) copy(nm2, arr.Nm2) nm3 := make([]string, len(arr.Nm3)) copy(nm3, arr.Nm3) for i := 0; i < 10; i++ { var name string if i < 5 { rnd := r.Intn(len(nm1)) name = nm1[rnd] nm1 = append(nm1[:rnd], nm1[rnd+1:]...) } else { rnd := r.Intn(len(nm2)) rnd2 := r.Intn(len(nm3)) nTp := r.Intn(2) if nTp == 0 { name = nm2[rnd] + " " + nm3[rnd2] + " (" + nm2[rnd] + ")" } else { name = nm2[rnd] + " " + nm3[rnd2] + " (" + nm3[rnd2] + ")" } nm2 = append(nm2[:rnd], nm2[rnd+1:]...) nm3 = append(nm3[:rnd2], nm3[rnd2+1:]...) } for name == "" || swearFilter(name) { // repeat logic for unique draws if i < 5 && len(nm1) > 0 { rnd := r.Intn(len(nm1)) name = nm1[rnd] nm1 = append(nm1[:rnd], nm1[rnd+1:]...) } else if len(nm2) > 0 && len(nm3) > 0 { rnd := r.Intn(len(nm2)) rnd2 := r.Intn(len(nm3)) nTp := r.Intn(2) if nTp == 0 { name = nm2[rnd] + " " + nm3[rnd2] + " (" + nm2[rnd] + ")" } else { name = nm2[rnd] + " " + nm3[rnd2] + " (" + nm3[rnd2] + ")" } nm2 = append(nm2[:rnd], nm2[rnd+1:]...) nm3 = append(nm3[:rnd2], nm3[rnd2+1:]...) } } names = append(names, name) } return names }