Spaces:
Sleeping
Sleeping
| import random | |
| import fictional_names.tolkien as tolkien | |
| import fictional_names.viking as viking | |
| import fictional_names.rowling as rowling | |
| def generate_fantasy_name(race, gender=None): | |
| """Generates a random fantasy name based on race using fictional-names library data.""" | |
| race = race.lower() | |
| # Mapping our app's races to library components | |
| if "human" in race: | |
| # Use full names for humans as they are already diverse | |
| source = viking | |
| elif any(r in race for r in ["elf", "elven"]): | |
| # Tolkien elven feel | |
| source = tolkien | |
| elif "dwarf" in race: | |
| # Tolkien dwarven feel | |
| source = tolkien | |
| elif "orc" in race: | |
| # Tolkien orcish feel | |
| source = tolkien | |
| elif any(r in race for r in ["tiefling", "dragonborn"]): | |
| # Rowling components have a more exotic/latinate feel | |
| source = rowling | |
| else: | |
| # Default fallback | |
| source = tolkien | |
| # Decide gender list | |
| if gender and gender.lower() == "female": | |
| prefixes = source.female_prefix | |
| suffixes = source.female_suffix | |
| names = source.female_names | |
| elif gender and gender.lower() == "male": | |
| prefixes = source.male_prefix | |
| suffixes = source.male_suffix | |
| names = source.male_names | |
| else: | |
| # Combine both for 'any' | |
| prefixes = source.male_prefix + source.female_prefix | |
| suffixes = source.male_suffix + source.female_suffix | |
| names = source.male_names + source.female_names | |
| # Use a mix of full names and generated ones for maximum variety | |
| if random.random() > 0.4 and names: | |
| first_name = random.choice(names) | |
| else: | |
| # Generate from syllables | |
| prefix = random.choice(prefixes) if prefixes else "Al" | |
| suffix = random.choice(suffixes) if suffixes else "en" | |
| first_name = (prefix + suffix).capitalize() | |
| # Surnames (if available in the source) | |
| surname = "" | |
| if hasattr(source, "surnames") and random.random() > 0.3: | |
| surname = random.choice(source.surnames) | |
| if surname: | |
| return f"{first_name} {surname}" | |
| return first_name | |