package generators import ( "encoding/json" "fmt" "math/rand" "os" "strings" ) type DrowData struct { NmF []string `json:"nmF"` NmFRf []string `json:"nmFRf"` NmFRl []string `json:"nmFRl"` NmFFf []string `json:"nmFFf"` NmFFl []string `json:"nmFFl"` NmM []string `json:"nmM"` NmMRf []string `json:"nmMRf"` NmMRl []string `json:"nmMRl"` NmMFf []string `json:"nmMFf"` NmMFl []string `json:"nmMFl"` NmS []string `json:"nmS"` NmSRf []string `json:"nmSRf"` NmSRl []string `json:"nmSRl"` NmSFf []string `json:"nmSFf"` NmSFl []string `json:"nmSFl"` } var drowData DrowData func init() { file, err := os.Open("data/drow.json") if err != nil { panic(fmt.Errorf("failed to open drow.json: %w", err)) } defer file.Close() if err := json.NewDecoder(file).Decode(&drowData); err != nil { panic(fmt.Errorf("failed to decode drow.json: %w", err)) } } func DrowName(gender, surname string) string { var first, last string gender = strings.ToLower(gender) switch gender { case "male": first = drowFirstNameMale() case "female": first = drowFirstNameFemale() default: if rand.Intn(2) == 0 { first = drowFirstNameMale() } else { first = drowFirstNameFemale() } } // Surname logic if surname == "true" { last = drowSurname() } if last != "" { return first + " " + last } return first } func drowFirstNameMale() string { if rand.Intn(2) == 0 { return drowData.NmM[rand.Intn(len(drowData.NmM))] } return drowData.NmMRf[rand.Intn(len(drowData.NmMRf))] + drowData.NmMRl[rand.Intn(len(drowData.NmMRl))] } func drowFirstNameFemale() string { if rand.Intn(2) == 0 { return drowData.NmF[rand.Intn(len(drowData.NmF))] } return drowData.NmFFf[rand.Intn(len(drowData.NmFFf))] + drowData.NmFFl[rand.Intn(len(drowData.NmFFl))] } func drowSurname() string { if rand.Intn(2) == 0 { return drowData.NmS[rand.Intn(len(drowData.NmS))] } return drowData.NmSRf[rand.Intn(len(drowData.NmSRf))] + drowData.NmSRl[rand.Intn(len(drowData.NmSRl))] } // DrowSurname returns a random Drow surname. func DrowSurname() string { return drowSurname() } // LoadDrowData loads the Drow data from the specified JSON file. func LoadDrowData(path string) error { file, err := os.Open(path) if err != nil { return err } defer file.Close() return json.NewDecoder(file).Decode(&drowData) }