Files
namegen/generators/drow.go
T
2025-08-01 00:15:34 +01:00

106 lines
2.3 KiB
Go

package generators
import (
"encoding/json"
"fmt"
"math/rand"
"os"
"strings"
"time"
)
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))
}
rand.Seed(time.Now().UnixNano())
}
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)
}