from .Base import Character
from enum import Enum, auto
from random import choice, randrange


class Anadi(Character):
    @staticmethod
    def generate():
        n1 = ["", "", "ch", "h", "k", "m", "n", "r", "t", "v", "z"]
        n2 = [
            "aia",
            "eia",
            "aio",
            "a",
            "e",
            "i",
            "o",
            "a",
            "e",
            "i",
            "o",
            "a",
            "e",
            "i",
            "o",
            "a",
            "e",
            "i",
            "o",
            "a",
            "e",
            "i",
            "o",
        ]
        n3 = [
            "k",
            "l",
            "m",
            "n",
            "r",
            "t",
            "v",
            "k",
            "l",
            "m",
            "n",
            "r",
            "t",
            "v",
            "ch",
            "lk",
            "ln",
            "lt",
            "nk",
            "rk",
            "rv",
            "shk",
            "tch",
            "zk",
            "zr",
        ]
        n4 = ["ia", "oa", "ea", "oe", "ee", "aa", "a", "a", "e", "i", "o", "u", "u", "a", "a", "e", "i", "o", "u", "u"]
        n5 = ["a", "a", "e", "i", "o", "o", "u"]
        n6 = ["k", "l", "m", "n", "s", "t", "v", "ch", "cht"]
        n7 = ["", "", "", "", "", "", "", "h", "n"]

        s1 = [
            "Flower",
            "Grass",
            "Shrub",
            "Bush",
            "Tree",
            "Branch",
            "Twig",
            "Brush",
            "Moss",
            "Mushroom",
            "Dew",
            "Lichen",
            "Root",
            "Leaf",
            "Petal",
            "Strings",
            "Strings",
            "Web",
            "Strands",
            "Strands",
            "Webs",
            "Leaves",
            "Mosses",
            "Flowers",
            "Grasses",
            "Twigs",
            "Branches",
            "Mushrooms",
            "Fungi",
            "Lichen",
            "Roots",
            "Petals",
            "Pollen",
        ]
        s2 = [
            "Adorned",
            "Connected",
            "Focused",
            "Centered",
            "Protected",
            "Enchanted",
            "Enhanced",
            "Embellished",
            "Covered",
            "Capped",
            "Painted",
            "Hidden",
            "Guarded",
            "Sheltered",
            "On",
            "Over",
            "Across",
            "Above",
            "Through",
            "Between",
            "Amidst",
            "Around",
            "Shelter",
            "Protect",
            "Adorn",
            "Embellish",
            "Guard",
            "Shield",
            "Raise",
            "Teach",
            "Enchant",
            "Cover",
            "Hide",
            "Paint",
            "Decorate",
            "Lift",
            "Elate",
            "Inspire",
            "Embolden",
            "Sway",
            "Carry",
            "Quicken",
        ]
        s3 = [
            "The",
            "The",
            "The",
            "The",
            "All",
            "Our",
            "Family",
            "Family",
            "Family",
            "Anadi",
            "Parental",
            "Their",
            "Their",
            "Their",
            "Our",
        ]
        s4 = [
            "River",
            "Mountain",
            "Forest",
            "Path",
            "Lake",
            "Pond",
            "Treetops",
            "Meadow",
            "Flowers",
            "Waterfall",
            "Swamp",
            "Snow",
            "Ice",
            "Frost",
            "Warmth",
            "Cloud",
            "Road",
            "Park",
            "Grove",
            "Field",
            "Bridge",
            "Beach",
            "Web",
            "Strands",
            "Strings",
            "Home",
            "Feet",
            "Legs",
            "Bodies",
            "Eyes",
            "Home",
            "Friends",
            "Children",
        ]
        first_name = choice(n1) + choice(n2) + choice(n3) + choice(n4) + choice(n5) + choice(n6) + choice(n7)
        last_name = choice(s1) + "-" + choice(s2) + "-" + choice(s3) + "-" + choice(s4)

        return str(first_name + " " + last_name).title()


class Android(Character):
    @staticmethod
    def generate():
        n1 = ["", "", "", "b", "d", "f", "g", "h", "k", "pr", "s", "t", "tr", "v", "z"]
        n2 = ["y", "a", "e", "i", "o", "u"]
        n3 = [
            "l",
            "m",
            "n",
            "r",
            "t",
            "v",
            "l",
            "m",
            "n",
            "r",
            "t",
            "v",
            "br",
            "dr",
            "ld",
            "lg",
            "mr",
            "nd",
            "nr",
            "rd",
            "st",
            "str",
            "tr",
        ]
        n4 = ["a", "a", "e", "e", "i", "o", "u"]
        n5 = ["g", "k", "l", "m", "n", "r", "t", "v"]
        n6 = [
            "ia",
            "ea",
            "io",
            "ie",
            "y",
            "a",
            "e",
            "i",
            "o",
            "u",
            "y",
            "a",
            "e",
            "i",
            "o",
            "u",
            "y",
            "a",
            "e",
            "i",
            "o",
            "u",
            "y",
            "a",
            "e",
            "i",
            "o",
            "u",
            "y",
            "a",
            "e",
            "i",
            "o",
            "u",
        ]
        n7 = ["", "", "", "", "", "", "", "l", "n", "r", "s", "sh", "v"]

        name = choice(n1) + choice(n2) + choice(n3) + choice(n4)
        if randrange(2) == 1:
            name = name.title() + choice(n5) + choice(n6) + choice(n7)
        else:
            name = name.title() + choice(n7)

        if randrange(2) == 1:
            name += "-" + str(randrange(10))

        return name


class Automaton(Character):
    @staticmethod
    def generate():
        n1 = ["", "", "b", "d", "h", "k", "m", "n", "r", "t", "y", "z"]
        n2 = ["a", "e", "i", "u"]
        n3 = [
            "d",
            "g",
            "gh",
            "hk",
            "hm",
            "hn",
            "hr",
            "lm",
            "ln",
            "lnh",
            "lr",
            "lrh",
            "m",
            "mh",
            "n",
            "nh",
            "nt",
            "ntr",
            "ns",
            "s",
            "sn",
            "sm",
            "sr",
            "ss",
            "t",
            "tr",
            "v",
            "z",
            "zh",
            "zr",
        ]
        n4 = ["a", "a", "e", "i", "i", "o", "u"]
        n5 = ["h", "l", "m", "n", "r", "y", "z"]
        n6 = ["ia", "a", "a", "e", "i", "i", "o", "o", "u"]
        n7 = ["h", "l", "n", "r", "s"]
        n8 = [
            "Academic",
            "Acclaimed",
            "Admirable",
            "Admired",
            "Adored",
            "Affectionate",
            "Agile",
            "Angel",
            "Architect",
            "Artist",
            "Artistic",
            "Austere",
            "Authentic",
            "Beautiful",
            "Beloved",
            "Blessed",
            "Blissful",
            "Bold",
            "Brave",
            "Bright",
            "Brilliant",
            "Butterfly",
            "Calm",
            "Carefree",
            "Celebrated",
            "Charming",
            "Clever",
            "Complex",
            "Composed",
            "Conjurer",
            "Content",
            "Cook",
            "Cuddly",
            "Cuddly Bear",
            "Cunning",
            "Dancer",
            "Dapper",
            "Defiant",
            "Devoted",
            "Diligent",
            "Doctor",
            "Earnest",
            "Educated",
            "Elegant",
            "Emotional",
            "Enchanted",
            "Enchanting",
            "Enigma",
            "Enlightened",
            "Exalted",
            "Example",
            "Expert",
            "Fair",
            "Famous",
            "Fancy",
            "Fearless",
            "Flamboyant",
            "Flawed",
            "Flawless",
            "Forgiving",
            "Free",
            "Friend",
            "Funny",
            "Generous",
            "Gentle",
            "Genuine",
            "Gifted",
            "Giving",
            "Glorious",
            "Good",
            "Graceful",
            "Grand",
            "Great",
            "Guardian",
            "Guest",
            "Honest",
            "Honorable",
            "Honored",
            "Hospitable",
            "Humble",
            "Idealist",
            "Illustrious",
            "Immortal",
            "Incredible",
            "Infamous",
            "Innocent",
            "Inventor",
            "Ironclad",
            "Judge",
            "Just",
            "Keen",
            "Kind",
            "Lawful",
            "Learned",
            "Light",
            "Loving",
            "Loyal",
            "Magnificent",
            "Majestic",
            "Marvelous",
            "Master",
            "Mellow",
            "Merciful",
            "Merry",
            "Mighty",
            "Moral",
            "Nightingale",
            "Noble",
            "Ox",
            "Paragon",
            "Passionate",
            "Patient",
            "Peaceful",
            "Pleasant",
            "Precious",
            "Protector",
            "Proud",
            "Quaint",
            "Quiet",
            "Scholar",
            "Scientist",
            "Shield",
            "Silent",
            "Soothsayer",
            "Sophisticated",
            "Speaker",
            "Specialist",
            "Strong",
            "Student",
            "Swift",
            "Sympathetic",
            "Thoughtful",
            "Treasure",
            "Treasured",
            "Vagabond",
            "Valiant",
            "Victorious",
            "Vigilant",
            "Watcher",
            "Wayfarer",
            "Wise",
            "Wonderful",
        ]

        c = randrange(3)
        if c == 0:
            return str(choice(n1) + choice(n2) + choice(n3) + choice(n6) + choice(n7)).title()
        elif c == 1:
            return str(choice(n1) + choice(n2) + choice(n3) + choice(n4) + choice(n5) + choice(n6) + choice(n7)).title()
        else:
            return "The " + choice(n8)


class Azarketi(Character):
    @staticmethod
    def generate():
        n1 = [
            "Abaft",
            "Aft",
            "Air",
            "Alluvial",
            "Anabranch",
            "Archipelago",
            "Arroyo",
            "Astern",
            "Atmosphere",
            "Atoll",
            "Autumn",
            "Avalanche",
            "Barchan",
            "Barrier",
            "Basin",
            "Bay",
            "Bayou",
            "Beach",
            "Bearing",
            "Bight",
            "Blizzard",
            "Bluff",
            "Bornhardt",
            "Breeze",
            "Canyon",
            "Cape",
            "Cascade",
            "Cenote",
            "Chinook",
            "Cirrus",
            "Cliff",
            "Climate",
            "Cloud",
            "Course",
            "Cove",
            "Crater",
            "Crevasse",
            "Cuesta",
            "Cumulus",
            "Current",
            "Cyclone",
            "Dell",
            "Delta",
            "Desert",
            "Dew",
            "Dome",
            "Draft",
            "Drift",
            "Drought",
            "Dune",
            "Erg",
            "Estuary",
            "Fathom",
            "Fiddle",
            "Field",
            "Fjord",
            "Flood",
            "Flurry",
            "Fog",
            "Forest",
            "Fork",
            "Freeze",
            "Frost",
            "Gale",
            "Genoa",
            "Geo",
            "Geyser",
            "Glacier",
            "Glen",
            "Gorge",
            "Graben",
            "Grove",
            "Gulf",
            "Gully",
            "Gust",
            "Guyot",
            "Hail",
            "Halo",
            "Halyard",
            "Harbor",
            "Haze",
            "Hill",
            "Hull",
            "Hurricane",
            "Ice",
            "Island",
            "Isle",
            "Islet",
            "Isthmus",
            "Jib",
            "Karst",
            "Kedge",
            "Keel",
            "Ketch",
            "Knot",
            "Lagoon",
            "Lake",
            "Leeway",
            "Lightning",
            "Loch",
            "Luff",
            "Marine",
            "Marsh",
            "Meadow",
            "Meander",
            "Meridian",
            "Mesa",
            "Monsoon",
            "Moraine",
            "Mountain",
            "Nunatak",
            "Oasis",
            "Ocean",
            "Peak",
            "Plain",
            "Prairie",
            "RAvine",
            "Rain",
            "Rainbow",
            "Rapids",
            "Reef",
            "Reservoir",
            "Ria",
            "Ridge",
            "Riffle",
            "Rift",
            "River",
            "Sea",
            "Sleet",
            "Sloop",
            "Snow",
            "Source",
            "Spring",
            "Sternway",
            "Storm",
            "Strait",
            "Summer",
            "Terrace",
            "Thunder",
            "Tidal",
            "Tide",
            "Tributary",
            "Tsunami",
            "Typhoon",
            "Valley",
            "Vapor",
            "Veer",
            "Volcano",
            "Wake",
            "Waterfall",
            "Wind",
            "Windward",
            "Winter",
        ]

        return choice(n1)


class Catfolk(Character):
    class CatfolkType(Enum):
        Male = auto()
        Female = auto()

    @staticmethod
    def generate(gender: CatfolkType = None):
        f1 = ["br", "c", "cr", "dr", "f", "g", "gr", "j", "k", "kr", "m", "n", "p", "pr", "q", "qr", "r", "t", "z"]
        f2 = [
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "y",
            "y",
            "ou",
            "au",
            "ei",
        ]
        f3 = [
            "c",
            "cc",
            "cd",
            "cb",
            "g",
            "gg",
            "gt",
            "gb",
            "gd",
            "k",
            "kk",
            "kh",
            "kt",
            "mb",
            "mk",
            "mq",
            "nq",
            "nk",
            "ng",
            "q",
            "qh",
            "r",
            "rr",
            "rq",
            "rk",
            "th",
            "w",
        ]
        f4 = ["", "m", "n", "r", "s", "th"]
        m1 = ["", "", "", "d", "f", "g", "h", "j", "k", "l", "m", "n", "p", "r", "s", "t", "v", "z"]
        m2 = ["a", "e", "i", "o", "u"]
        m3 = [
            "f",
            "ff",
            "l",
            "ly",
            "lh",
            "ls",
            "lr",
            "lm",
            "ln",
            "m",
            "my",
            "mh",
            "n",
            "ny",
            "nh",
            "ph",
            "phr",
            "r",
            "rr",
            "ry",
            "rh",
            "sy",
            "sh",
            "sr",
            "sl",
            "th",
            "ty",
            "y",
        ]
        m4 = ["", "", "", "", "", "", "", "", "", "", "h", "s"]

        name = ""
        if gender is None or gender not in Catfolk.CatfolkType:
            gender = choice(list(Catfolk.CatfolkType))
        if gender == Catfolk.CatfolkType.Male:
            name += choice(m1) + choice(m2) + choice(m3)
            if randrange(2) == 1:
                name += choice(m2) + choice(m3)
            name += choice(m4)

        else:  # Female
            name += choice(f1) + choice(f2) + choice(f3)
            if randrange(2) == 1:
                name += choice(f2) + choice(f3)
            name += choice(f4)

        return name.title()


class Conrasu(Character):
    @staticmethod
    def generate():
        n1 = ["", "", "", "", "d", "g", "k", "l", "m", "n", "r", "v", "z"]
        n2 = ["a", "e", "o", "i", "u"]
        n3 = [
            "c",
            "c",
            "c",
            "ch",
            "d",
            "d",
            "d",
            "dr",
            "m",
            "m",
            "m",
            "n",
            "n",
            "n",
            "nc",
            "r",
            "r",
            "r",
            "rc",
            "rk",
            "v",
            "v",
            "v",
            "vr",
            "z",
            "z",
            "z",
            "zc",
            "zr",
        ]
        n4 = ["a", "e", "i", "u"]
        n5 = ["b", "d", "k", "l", "m", "n", "r", "v", "z"]
        n6 = ["a", "e", "i", "o", "u"]
        n7 = ["", "", "", "", "", "", "", "", "", "", "", "", "h", "l", "n", "s"]

        return str(choice(n1) + choice(n2) + choice(n3) + choice(n4) + choice(n5) + choice(n6) + choice(n7)).title()


class Dhampir(Character):
    class DhampirType(Enum):
        Male = auto()
        Female = auto()

    @staticmethod
    def generate(gender: DhampirType = None):
        s1 = [
            "Abram",
            "Acton",
            "Addington",
            "Adley",
            "Ainsley",
            "Ainsworth",
            "Alby",
            "Allerton",
            "Alston",
            "Altham",
            "Alton",
            "Anderton",
            "Ansley",
            "Appleton",
            "Asheton",
            "Ashley",
            "Ashton",
            "Astley",
            "Atherton",
            "Atterton",
            "Axton",
            "Badger",
            "Barclay",
            "Barlow",
            "Barney",
            "Barton",
            "Beckwith",
            "Benson",
            "Bentham",
            "Bentley",
            "Berkeley",
            "Beverly",
            "Bing",
            "Birkenhead",
            "Blackwood",
            "Blakeley",
            "Blakely",
            "Blankley",
            "Blyth",
            "Blythe",
            "Bradford",
            "Bradley",
            "Bradly",
            "Bradshaw",
            "Brady",
            "Brandon",
            "Branson",
            "Braxton",
            "Breeden",
            "Brent",
            "Bristol",
            "Brixton",
            "Browning",
            "Brownrigg",
            "Budd",
            "Burton",
            "Byron",
            "Camden",
            "Carlisle",
            "Carlton",
            "Carlyle",
            "Cason",
            "Charlton",
            "Chatham",
            "Chester",
            "Cholmondeley",
            "Churchill",
            "Clapham",
            "Clare",
            "Clayden",
            "Clayton",
            "Clifford",
            "Clifton",
            "Clinton",
            "Clive",
            "Colby",
            "Colton",
            "Compton",
            "Coombs",
            "Copeland",
            "Cornish",
            "Cotton",
            "Crawford",
            "Cromwell",
            "Cumberbatch",
            "Dalton",
            "Darby",
            "Darlington",
            "Davenport",
            "Dayton",
            "Deighton",
            "Denholm",
            "Digby",
            "Dryden",
            "Dudley",
            "Eastaughffe",
            "Eastoft",
            "Easton",
            "Elton",
            "Emsworth",
            "Enfield",
            "England",
            "Everleigh",
            "Everly",
            "Fawcett",
            "Fulton",
            "Garfield",
            "Garrick",
            "Gladstone",
            "Graeme",
            "Graham",
            "Gresham",
            "Hackney",
            "Hadlee",
            "Hadleigh",
            "Hadley",
            "Hailey",
            "Hale",
            "Haley",
            "Hallewell",
            "Halsey",
            "Hamilton",
            "Hampton",
            "Harlan",
            "Harley",
            "Harlow",
            "Harrington",
            "Hartford",
            "Hastings",
            "Hayden",
            "Hayes",
            "Hayhurst",
            "Hayley",
            "Holton",
            "Home",
            "Hornsby",
            "Huckabee",
            "Huxley",
            "Kelsey",
            "Kendal",
            "Kendall",
            "Kenley",
            "Kensley",
            "Kent",
            "Kimberley",
            "Kimberly",
            "Kinsley",
            "Kirby",
            "Lancaster",
            "Landon",
            "Langdon",
            "Langley",
            "Langston",
            "Law",
            "Leighton",
            "Lester",
            "Lincoln",
            "Lindsay",
            "Lindsey",
            "Livingstone",
            "Marlee",
            "Marleigh",
            "Marley",
            "Marlowe",
            "Marston",
            "Merton",
            "Middleton",
            "Milton",
            "Mitchell",
            "Morley",
            "Morton",
            "Myerscough",
            "Nash",
            "Nibley",
            "Northcott",
            "Norton",
            "Oakes",
            "Oakley",
            "Ogden",
            "Paxton",
            "Payton",
            "Perry",
            "Peyton",
            "Pickering",
            "Pinkerton",
            "Prescott",
            "Presley",
            "Preston",
            "Quinton",
            "Ramsay",
            "Ramsey",
            "Rayden",
            "Read",
            "Redfield",
            "Reed",
            "Reid",
            "Remington",
            "Ridley",
            "Riley",
            "Rodney",
            "Roscoe",
            "Rowley",
            "Royal",
            "Royston",
            "Rutherford",
            "Rutland",
            "Rylan",
            "Ryland",
            "Ryley",
            "Shelby",
            "Sheldon",
            "Shelley",
            "Shelly",
            "Sherwood",
            "Shipley",
            "Shirley",
            "Snape",
            "Snowdon",
            "Soames",
            "Southey",
            "Spalding",
            "Spaulding",
            "Springfield",
            "Stafford",
            "Stanford",
            "Stanley",
            "Stansfield",
            "Stanton",
            "Stapleton",
            "Stratford",
            "Sutherland",
            "Sutton",
            "Sydney",
            "Tattersall",
            "Tatum",
            "Tenley",
            "Tewksbury",
            "Thackeray",
            "Thornton",
            "Thorpe",
            "Tickle",
            "Tindall",
            "Tinley",
            "Trollope",
            "Tyndall",
            "Upton",
            "Vance",
            "Wade",
            "Wakefield",
            "Walcott",
            "Wallace",
            "Walpole",
            "Warwick",
            "Washington",
            "Webley",
            "Wedgwood",
            "Weld",
            "Wellington",
            "Wentworth",
            "Wesley",
            "Westbrook",
            "Westcott",
            "Weston",
            "Wharton",
            "Wheatley",
            "Whitby",
            "Wilberforce",
            "Willoughby",
            "Winchester",
            "Windsor",
            "Winterbourne",
            "Winthrop",
            "Wordsworth",
            "Yardley",
            "Yeardley",
            "York",
            "Yorke",
        ]

        if gender is None or gender not in Dhampir.DhampirType:
            gender = choice(list(Dhampir.DhampirType))
        if gender == Dhampir.DhampirType.Male:
            m1 = [
                "Quelii",
                "Zintius",
                "Fertuitus",
                "Dorlus",
                "Versum",
                "Zegrath",
                "Sebastian",
                "Christoph",
                "Kristoph",
                "Thaddeus",
                "Abel",
                "Abraham",
                "Acheron",
                "Adam",
                "Adrian",
                "Alaric",
                "Alec",
                "Aleister",
                "Aleron",
                "Alexander",
                "Alfred",
                "Aliester",
                "Angel",
                "Angelus",
                "Anton",
                "Arad",
                "Aramastus",
                "Archibald",
                "Armand",
                "Arnold",
                "Arthur",
                "Asa",
                "Ascelin",
                "Asema",
                "Asmodeus",
                "Astaroth",
                "Astrophel",
                "Athanasius",
                "Auberon",
                "Aubrey",
                "Aurel",
                "Azerrad",
                "Azriel",
                "Balthazar",
                "Barnabas",
                "Bartholomew",
                "Benedict",
                "Benjamin",
                "Bertram",
                "Bjorn",
                "Blayze",
                "Boris",
                "Brander",
                "Brandyn",
                "Brendan",
                "Bryce",
                "Byron",
                "Cadell",
                "Cadogan",
                "Caedmon",
                "Cain",
                "Caleb",
                "Cassius",
                "Cazimir",
                "Christian",
                "Church",
                "Ciaran",
                "Ciro",
                "Clarence",
                "Cleon",
                "Cole",
                "Colin",
                "Constantine",
                "Corbett",
                "Corbin",
                "Creighton",
                "Cynfael",
                "Cyprian",
                "Cyran",
                "D'Arcy",
                "Daire",
                "Damascus",
                "Damian",
                "Damien",
                "Damon",
                "Danag",
                "Daniel",
                "Dante",
                "Darick",
                "Darius",
                "Darren",
                "Darrien",
                "Davon",
                "Davorin",
                "Demetrius",
                "Demidicus",
                "Demitri",
                "Desmond",
                "Deverell",
                "Devin",
                "Dimitri",
                "Dommik",
                "Donovan",
                "Dorian",
                "Doru",
                "Dragon",
                "Dragos",
                "Drake",
                "Draven",
                "Dregan",
                "Dreven",
                "Duncan",
                "Duradel",
                "Echo",
                "Edmund",
                "Edward",
                "Edwin",
                "Eldon",
                "Elijah",
                "Elwin",
                "Emery",
                "Emil",
                "Enoch",
                "Eoghan",
                "Eoin",
                "Erasmus",
                "Etienne",
                "Everild",
                "Ezekiel",
                "Ezra",
                "Fabian",
                "Fane",
                "Florin",
                "Francis",
                "Frank",
                "Frederick",
                "Frey",
                "Gabe",
                "Gabriel",
                "Gadiel",
                "Gair",
                "Gale",
                "Gareth",
                "Garrett",
                "Garroway",
                "Garth",
                "Gattas",
                "Gawain",
                "Gdalicanu",
                "Gethin",
                "Ghislaine",
                "Gilbert",
                "Godfrey",
                "Gossom",
                "Gregory",
                "Griffin",
                "Grimbald",
                "Griswold",
                "Hacan",
                "Hale",
                "Hannibal",
                "Harland",
                "Harold",
                "Heathcliffe",
                "Hendrik",
                "Henry",
                "Heskel",
                "Holstein",
                "Horace",
                "Horatio",
                "Hunter",
                "Iancu",
                "Ichabod",
                "Idris",
                "Ingram",
                "Isaac",
                "Isaiah",
                "Ishmael",
                "Jacob",
                "Jael",
                "Jagger",
                "Jairus",
                "James",
                "Jarlath",
                "Jarlen",
                "Jasper",
                "Jedediah",
                "Jeffrey",
                "Jeremy",
                "Jett",
                "Jonas",
                "Jonathan",
                "Jorin",
                "Joseph",
                "Joshua",
                "Julian",
                "Julien",
                "Julius",
                "Justin",
                "Kalon",
                "Kane",
                "Kapral",
                "Karpov",
                "Kayne",
                "Kazimir",
                "Keenan",
                "Keir",
                "Keiran",
                "Kellam",
                "Kern",
                "Khalid",
                "Killian",
                "Kirnon",
                "Klyn",
                "Kozani",
                "Kragen",
                "Kristopher",
                "Lafayette",
                "Lance",
                "Lancelot",
                "Lauden",
                "Laurent",
                "Lawrence",
                "Lazarus",
                "Leander",
                "Leandro",
                "Lennix",
                "Leon",
                "Leopold",
                "Lestat",
                "Liam",
                "Lionel",
                "London",
                "Lothaire",
                "Louis",
                "Lucas",
                "Lucian",
                "Lucien",
                "Luther",
                "Lycidas",
                "Lysander",
                "Mabon",
                "Maggard",
                "Maggart",
                "Magna",
                "Magnus",
                "Malachi",
                "Malik",
                "Marcel",
                "Marcellus",
                "Marcus",
                "Marius",
                "Martel",
                "Mathias",
                "Maxius",
                "Maxwell",
                "Melchior",
                "Merle",
                "Merlin",
                "Moldark",
                "Mordecai",
                "Mordred",
                "Morgan",
                "Mortas",
                "Mullo",
                "Nathan",
                "Nathaniel",
                "Neculai",
                "Nehemiah",
                "Nelo",
                "Niall",
                "Nicholas",
                "Nicodemus",
                "Nicolai",
                "Nicu",
                "Nikolas",
                "Niles",
                "Nodin",
                "Norrix",
                "Nostro",
                "Obediah",
                "Oberon",
                "Obsidian",
                "Octavian",
                "Odolff",
                "Oliver",
                "Orien",
                "Orion",
                "Orsova",
                "Owen",
                "Ozul",
                "Paine",
                "Perseus",
                "Peter",
                "Phaeron",
                "Phelan",
                "Phoenix",
                "Qadir",
                "Quillan",
                "Quillon",
                "Quinn",
                "Radomir",
                "Radu",
                "Randal",
                "Ransley",
                "Raoul",
                "Raphael",
                "Rapheal",
                "Raymond",
                "Remus",
                "Renwick",
                "Reyes",
                "Rhain",
                "Rhazien",
                "Richard",
                "Riordan",
                "Riskel",
                "Roderick",
                "Roman",
                "Rufus",
                "Rune",
                "Ruse",
                "Saber",
                "Sabien",
                "Salem",
                "Samuel",
                "Sandor",
                "Santiago",
                "Saxon",
                "Seain",
                "Sebastian",
                "Seskel",
                "Seth",
                "Severn",
                "Seymour",
                "Silas",
                "Silvan",
                "Simon",
                "Sin",
                "Sirius",
                "Sliske",
                "Solomon",
                "Soran",
                "Spencer",
                "Spike",
                "Star",
                "Stelian",
                "Sterling",
                "Strix",
                "Sullivan",
                "Sun",
                "Tallon",
                "Talon",
                "Tama",
                "Taos",
                "Tearle",
                "Theron",
                "Thomas",
                "Thorin",
                "Thorne",
                "Tobias",
                "Treznor",
                "Ulfred",
                "Ulysses",
                "Urien",
                "Valentine",
                "Valerian",
                "Vance",
                "Vasile",
                "Vernon",
                "Victor",
                "Viktor",
                "Vincent",
                "Virgil",
                "Viscardi",
                "Vlad",
                "Vladimir",
                "Vorigan",
                "Waldron",
                "Walter",
                "Warren",
                "Wilfred",
                "William",
                "Wolf",
                "Wolfram",
                "Xanthus",
                "Xavier",
                "Xenos",
                "Ywain",
                "Zachaeus",
                "Zachariah",
                "Zadicus",
                "Zadimus",
                "Zaff",
                "Zane",
                "Zaros",
                "Zeidan",
                "Zeke",
                "Zoltan",
            ]
            return str(choice(m1) + " " + choice(s1)).title()
        else:
            f1 = [
                "Deyja",
                "Abby",
                "Abigale",
                "Ada",
                "Adriana",
                "Adrienne",
                "Aerin",
                "Aisling",
                "Akasha",
                "Aleron",
                "Alessandra",
                "Alexandra",
                "Alexandria",
                "Alice",
                "Alvira",
                "Amalia",
                "Amaris",
                "Amber",
                "Amelia",
                "Amelie",
                "Ana",
                "Anastasia",
                "Angelica",
                "Angelika",
                "Angelina",
                "Angelique",
                "Antoinette",
                "Arabella",
                "Arachne",
                "Arora",
                "Artemia",
                "Asphodel",
                "Athena",
                "Aubrey",
                "Aurelia",
                "Aurora",
                "Austra",
                "Autumn",
                "Babylon",
                "Badriyah",
                "Baptista",
                "Beatrice",
                "Beatrix",
                "Becca",
                "Bella",
                "Belladonna",
                "Bellatrix",
                "Bernia",
                "Bianca",
                "Bijou",
                "Branwen",
                "Briallen",
                "Brienne",
                "Brigid",
                "Buffy",
                "Caera",
                "Calamity",
                "Calantha",
                "Calista",
                "Callidora",
                "Calliope",
                "Carmilla",
                "Caroline",
                "Cassandra",
                "Cassara",
                "Ceiridwen",
                "Celeste",
                "Celosia",
                "Chandra",
                "Chantrea",
                "Charity",
                "Charlotte",
                "Chaseleigh",
                "Chastity",
                "Circe",
                "Claire",
                "Clara",
                "Claudia",
                "Clementine",
                "Constantia",
                "Cordelia",
                "Crimson",
                "Cristina",
                "Daniela",
                "Danika",
                "Daria",
                "Darian",
                "Darla",
                "Dawn",
                "December",
                "Deidre",
                "Delia",
                "Deliliah",
                "Demelza",
                "Demetria",
                "Denisa",
                "Desdemona",
                "Destiny",
                "Dominique",
                "Dru",
                "Druilla",
                "Drusilla",
                "Ebony",
                "Echo",
                "Edana",
                "Eden",
                "Eirisse",
                "Eirlys",
                "Eldia",
                "Eleanor",
                "Electra",
                "Elena",
                "Elenor",
                "Elisabeta",
                "Elissa",
                "Elizabeth",
                "Ellanora",
                "Ellanore",
                "Ellena",
                "Ellie",
                "Elvira",
                "Emberlynn",
                "Emerande",
                "Emilia",
                "Emily",
                "Emma",
                "Emmanuelle",
                "Emmeranne",
                "Ennata",
                "Eranthe",
                "Erylis",
                "Esmeralda",
                "Esmeralde",
                "Esther",
                "Estrella",
                "Ethelinda",
                "Eunice",
                "Eva",
                "Evangeline",
                "Eventide",
                "Fae",
                "Faine",
                "Faith",
                "Faline",
                "Fanchon",
                "Fawn",
                "Felicia",
                "Fern",
                "Feronia",
                "Fleurdelice",
                "Florence",
                "Fortune",
                "Gabriela",
                "Gabrielle",
                "Galexialyn",
                "Garnette",
                "Genevieve",
                "Gertrude",
                "Grace",
                "Gretchen",
                "Griselda",
                "Guinevere",
                "Gwendoline",
                "Gwendydd",
                "Haera",
                "Hagar",
                "Hazelmere",
                "Hecate",
                "Hegna",
                "Helana",
                "Helen",
                "Helena",
                "Helga",
                "Henrietta",
                "Herma",
                "Hesperia",
                "Hestia",
                "Hilda",
                "Hildegarde",
                "Ianira",
                "Ianthe",
                "Ileana",
                "Illythia",
                "Indigo",
                "Iolana",
                "Iolanthe",
                "Iona",
                "Ione",
                "Irene",
                "Irina",
                "Isabella",
                "Isadora",
                "Isis",
                "Isolabella",
                "Ivory",
                "Ivy",
                "Izora",
                "Jacqueline",
                "Jade",
                "Jane",
                "Janet",
                "Jett",
                "Jevera",
                "Jillian",
                "Jocasta",
                "Joliette",
                "Joscelyn",
                "Josephine",
                "Julia",
                "Julianna",
                "Julienne",
                "Juliet",
                "Kafara",
                "Kairos",
                "Kala",
                "Kali",
                "Kalonice",
                "Kamra",
                "Karlene",
                "Kat",
                "Katherine",
                "Kathryx",
                "Katrina",
                "Kavita",
                "Kenia",
                "Ketura",
                "Khalida",
                "Kiara",
                "Kismet",
                "Kolfinna",
                "Krista",
                "Kristian",
                "Kynthia",
                "Lahmia",
                "Lamia",
                "Lamya",
                "Lavinia",
                "Layla",
                "Leandra",
                "Lechsinska",
                "Lenora",
                "Lenore",
                "Leontine",
                "Leora",
                "Lethia",
                "Levana",
                "Lien",
                "Lilah",
                "Liliana",
                "Lilith",
                "Lisa",
                "Lisha",
                "Loredana",
                "Lorelei",
                "Loren",
                "Lorraine",
                "Lucia",
                "Lucilla",
                "Lucinda",
                "Lucretia",
                "Lucy",
                "Lullaby",
                "Luna",
                "Lupe",
                "Lycoris",
                "Lyllith",
                "Lynede",
                "Lynexia",
                "Lyra",
                "Lysa",
                "Madeline",
                "Madison",
                "Maeve",
                "Magda",
                "Magdalena",
                "Magdelena",
                "Magena",
                "Mallory",
                "Margaret",
                "Maria",
                "Mariana",
                "Marianne",
                "Marta",
                "Matilda",
                "Mehira",
                "Melantha",
                "Mercedes",
                "Mercy",
                "Meredith",
                "Merle",
                "Mildred",
                "Minerva",
                "Mira",
                "Misty",
                "Monique",
                "Mora",
                "Morgan",
                "Morrisey",
                "Morticia",
                "Morwenna",
                "Musette",
                "Myth",
                "Myvanwy",
                "Naida",
                "Narcisa",
                "Natalia",
                "Nebula",
                "Neferata",
                "Nessa",
                "Nevada",
                "Nezera",
                "Niamh",
                "Nichole",
                "Nicole",
                "Nicolette",
                "Nirvana",
                "Nisha",
                "Nissa",
                "Nokomis",
                "Nora",
                "Nyx",
                "Oana",
                "Odile",
                "Opal",
                "Ophelia",
                "Ordelia",
                "Orenda",
                "Osanna",
                "Pandora",
                "Parthena",
                "Permelia",
                "Persephone",
                "Petra",
                "Phaelyn",
                "Phaidra",
                "Philomena",
                "Phoenix",
                "Pixie",
                "Poison",
                "Prudence",
                "Psyche",
                "Purity",
                "Pythea",
                "Qadira",
                "Quintella",
                "Radella",
                "Raelinn",
                "Ramona",
                "Raphaelle",
                "Raven",
                "Ravette",
                "Rebecca",
                "Renee",
                "Renita",
                "Rhapsody",
                "Rhiannon",
                "Rhodanthe",
                "Riah",
                "River",
                "Rosalie",
                "Rosalyn",
                "Rowena",
                "Ruby",
                "Sabina",
                "Sabrione",
                "Samantha",
                "Sapphira",
                "Sapphire",
                "Sarah",
                "SarahAnn",
                "Scarlett",
                "Seiran",
                "Selena",
                "Selene",
                "Selina",
                "Senna",
                "Seraphine",
                "Seren",
                "Sierra",
                "Silvana",
                "Silver",
                "Silvia",
                "Simone",
                "Sky",
                "Skylar",
                "Sorcha",
                "Sorina",
                "Star",
                "Stefania",
                "Stella",
                "Sylvia",
                "Tabitha",
                "Tanith",
                "Tatiana",
                "Tempesta",
                "Tereza",
                "Tessa",
                "Thalia",
                "Thelma",
                "Thessalia",
                "Thora",
                "Thordis",
                "Tiana",
                "Tierney",
                "Timandra",
                "Tizane",
                "Topaz",
                "Tourmaline",
                "Trista",
                "Turaya",
                "Ulva",
                "Urania",
                "Ursula",
                "Ursulette",
                "Ursuline",
                "Valaine",
                "Valenthia",
                "Valentina",
                "Valeria",
                "Valerie",
                "Vanessa",
                "Vanita",
                "Vanity",
                "Vasilisa",
                "Velika",
                "Velorina",
                "Velvet",
                "Venette",
                "Venus",
                "Vesper",
                "Vespera",
                "Victoire",
                "Victoria",
                "Viessa",
                "Viktoria",
                "Violet",
                "Violeta",
                "Wanette",
                "Wilhelmina",
                "Willow",
                "Wilma",
                "Winnifred",
                "Wren",
                "Xanthe",
                "Xaverie",
                "Xena",
                "Xylia",
                "Yolanthe",
                "Ysabelle",
                "Yvonne",
                "Zabrina",
                "Zada",
                "Zafrina",
                "Zakira",
                "Zaleria",
                "Zara",
                "Zella",
                "Zephirah",
                "Zetta",
                "Zola",
            ]
            return str(choice(f1) + " " + choice(s1)).title()


class Dwarf(Character):
    class DwarfType(Enum):
        Male = auto()
        Female = auto()

    @staticmethod
    def generate(gender: DwarfType = None):
        m1 = [
            "An",
            "Ar",
            "Baer",
            "Bar",
            "Bel",
            "Belle",
            "Bon",
            "Bonn",
            "Braen",
            "Bral",
            "Bralle",
            "Bran",
            "Bren",
            "Bret",
            "Bril",
            "Brille",
            "Brol",
            "Bron",
            "Brul",
            "Bryl",
            "Brylle",
            "Bryn",
            "Bryt",
            "Byl",
            "Bylle",
            "Daer",
            "Dear",
            "Dim",
            "Ed",
            "Ein",
            "El",
            "Gem",
            "Ger",
            "Gwan",
            "Gwen",
            "Gwin",
            "Gwyn",
            "Gym",
            "Ing",
            "Jen",
            "Jenn",
            "Jin",
            "Jyn",
            "Kait",
            "Kar",
            "Kat",
            "Kath",
            "Ket",
            "Las",
            "Lass",
            "Les",
            "Less",
            "Lyes",
            "Lys",
            "Lyss",
            "Maer",
            "Maev",
            "Mar",
            "Mis",
            "Mist",
            "Myr",
            "Mys",
            "Myst",
            "Naer",
            "Nal",
            "Nas",
            "Nass",
            "Nes",
            "Nis",
            "Nys",
            "Raen",
            "Ran",
            "Red",
            "Reyn",
            "Run",
            "Ryn",
            "Sar",
            "Sol",
            "Tas",
            "Taz",
            "Tis",
            "Tish",
            "Tiz",
            "Tor",
            "Tys",
            "Tysh",
        ]
        m2 = [
            "belle",
            "bera",
            "delle",
            "deth",
            "dielle",
            "dille",
            "dish",
            "dora",
            "dryn",
            "dyl",
            "giel",
            "glia",
            "glian",
            "gwyn",
            "la",
            "leen",
            "leil",
            "len",
            "lin",
            "linn",
            "lyl",
            "lyn",
            "lynn",
            "ma",
            "mera",
            "mora",
            "mura",
            "myl",
            "myla",
            "nan",
            "nar",
            "nas",
            "nera",
            "nia",
            "nip",
            "nis",
            "niss",
            "nora",
            "nura",
            "nyl",
            "nys",
            "nyss",
            "ra",
            "ras",
            "res",
            "ri",
            "ria",
            "rielle",
            "rin",
            "ris",
            "ros",
            "ryl",
            "ryn",
            "sael",
            "selle",
            "sora",
            "syl",
            "thel",
            "thiel",
            "tin",
            "tyn",
            "va",
            "van",
            "via",
            "vian",
            "waen",
            "win",
            "wyn",
            "wynn",
        ]
        f1 = [
            "Ad",
            "Am",
            "Arm",
            "Baer",
            "Daer",
            "Bal",
            "Ban",
            "Bar",
            "Bel",
            "Ben",
            "Ber",
            "Bhal",
            "Bhar",
            "Bhel",
            "Bram",
            "Bran",
            "Brom",
            "Brum",
            "Bun",
            "Dal",
            "Dar",
            "Dol",
            "Dul",
            "Eb",
            "Em",
            "Erm",
            "Far",
            "Gal",
            "Gar",
            "Ger",
            "Gim",
            "Gral",
            "Gram",
            "Gran",
            "Grem",
            "Gren",
            "Gril",
            "Gry",
            "Gul",
            "Har",
            "Hjal",
            "Hjol",
            "Hjul",
            "Hor",
            "Hul",
            "Hur",
            "Kar",
            "Khar",
            "Kram",
            "Krom",
            "Krum",
            "Mag",
            "Mal",
            "Mel",
            "Mor",
            "Muir",
            "Mur",
            "Rag",
            "Ran",
            "Reg",
            "Rot",
            "Thal",
            "Thar",
            "Thel",
            "Ther",
            "Tho",
            "Thor",
            "Thul",
            "Thur",
            "Thy",
            "Tor",
            "Ty",
            "Um",
            "Urm",
            "Von",
        ]
        f2 = [
            "adin",
            "bek",
            "brek",
            "dahr",
            "dain",
            "dal",
            "dan",
            "dar",
            "dek",
            "dir",
            "dohr",
            "dor",
            "drak",
            "dram",
            "dren",
            "drom",
            "drum",
            "drus",
            "duhr",
            "dur",
            "dus",
            "garn",
            "gram",
            "gran",
            "grim",
            "grom",
            "gron",
            "grum",
            "grun",
            "gurn",
            "gus",
            "iggs",
            "kahm",
            "kam",
            "kohm",
            "kom",
            "kuhm",
            "kum",
            "kyl",
            "man",
            "mand",
            "mar",
            "mek",
            "miir",
            "min",
            "mir",
            "mond",
            "mor",
            "mun",
            "mund",
            "mur",
            "mus",
            "myl",
            "myr",
            "nam",
            "nar",
            "nik",
            "nir",
            "nom",
            "num",
            "nur",
            "nus",
            "nyl",
            "rak",
            "ram",
            "ren",
            "rig",
            "rigg",
            "rik",
            "rim",
            "rom",
            "ron",
            "rum",
            "rus",
            "ryl",
            "tharm",
            "tharn",
            "thran",
            "thrum",
            "thrun",
        ]
        s1 = [
            "battle",
            "big",
            "black",
            "blood",
            "bold",
            "boulder",
            "brave",
            "brawn",
            "bright",
            "broad",
            "bronze",
            "brood",
            "burrow",
            "cold",
            "dark",
            "deep",
            "drunk",
            "even",
            "ever",
            "fire",
            "first",
            "flint",
            "frost",
            "frozen",
            "giant",
            "goblin",
            "gold",
            "golden",
            "gray",
            "great",
            "half",
            "hammer",
            "hard",
            "iron",
            "keen",
            "kind",
            "last",
            "light",
            "loud",
            "mad",
            "marble",
            "might",
            "molten",
            "mountain",
            "silver",
            "smug",
            "stark",
            "steel",
            "stern",
            "stone",
            "storm",
            "stout",
            "strong",
            "thunder",
            "troll",
            "true",
            "wild",
        ]
        s2 = [
            "ale",
            "anvil",
            "axe",
            "back",
            "bane",
            "beard",
            "belch",
            "belt",
            "blade",
            "bleeder",
            "blood",
            "boot",
            "boots",
            "bottom",
            "braid",
            "branch",
            "breaker",
            "breath",
            "brow",
            "buster",
            "delver",
            "eye",
            "eyes",
            "fall",
            "feast",
            "finder",
            "fist",
            "fists",
            "flight",
            "force",
            "forge",
            "found",
            "front",
            "fury",
            "gift",
            "grace",
            "grip",
            "guard",
            "hammer",
            "hand",
            "handle",
            "head",
            "heart",
            "helm",
            "hold",
            "horn",
            "kin",
            "kind",
            "kith",
            "mane",
            "mantle",
            "mask",
            "might",
            "pass",
            "past",
            "pride",
            "reach",
            "rest",
            "roar",
            "rock",
            "shaper",
            "shield",
            "song",
            "stand",
            "stone",
            "storm",
            "strike",
            "tale",
            "tankard",
            "ward",
        ]

        if gender is None or gender not in Dwarf.DwarfType:
            gender = choice(list(Dwarf.DwarfType))
        if gender == Dwarf.DwarfType.Male:
            return str(choice(m1) + choice(m2) + " " + choice(s1) + choice(s2)).title()
        else:
            return str(choice(f1) + choice(f2) + " " + choice(s1) + choice(s2)).title()


class Elf(Character):
    class ElfType(Enum):
        Male = auto()
        Female = auto()

    @staticmethod
    def generate(gender: ElfType = None):
        m1 = [
            "Ad",
            "Ae",
            "Bal",
            "Bei",
            "Car",
            "Cra",
            "Dae",
            "Dor",
            "El",
            "Ela",
            "Er",
            "Far",
            "Fen",
            "Gen",
            "Glyn",
            "Hei",
            "Her",
            "Ian",
            "Ili",
            "Kea",
            "Kel",
            "Leo",
            "Lu",
            "Mira",
            "Mor",
            "Nae",
            "Nor",
            "Olo",
            "Oma",
            "Pa",
            "Per",
            "Pet",
            "Qi",
            "Qin",
            "Ralo",
            "Ro",
            "Sar",
            "Syl",
            "The",
            "Tra",
            "Ume",
            "Uri",
            "Va",
            "Vir",
            "Waes",
            "Wran",
            "Yel",
            "Yin",
            "Zin",
            "Zum",
        ]
        m2 = [
            "balar",
            "beros",
            "can",
            "ceran",
            "dan",
            "dithas",
            "faren",
            "fir",
            "geiros",
            "golor",
            "hice",
            "horn",
            "jeon",
            "jor",
            "kas",
            "kian",
            "lamin",
            "lar",
            "len",
            "maer",
            "maris",
            "menor",
            "myar",
            "nan",
            "neiros",
            "nelis",
            "norin",
            "peiros",
            "petor",
            "qen",
            "quinal",
            "ran",
            "ren",
            "ric",
            "ris",
            "ro",
            "salor",
            "sandoral",
            "toris",
            "tumal",
            "valur",
            "ven",
            "warin",
            "wraek",
            "xalim",
            "xidor",
            "yarus",
            "ydark",
            "zeiros",
            "zumin",
        ]
        f1 = [
            "Ad",
            "Ara",
            "Bi",
            "Bry",
            "Cai",
            "Chae",
            "Da",
            "Dae",
            "Eil",
            "En",
            "Fa",
            "Fae",
            "Gil",
            "Gre",
            "Hele",
            "Hola",
            "Iar",
            "Ina",
            "Jo",
            "Key",
            "Kris",
            "Lia",
            "Lora",
            "Mag",
            "Mia",
            "Neri",
            "Ola",
            "Ori",
            "Phi",
            "Pres",
            "Qi",
            "Qui",
            "Rava",
            "Rey",
            "Sha",
            "Syl",
            "Tor",
            "Tris",
            "Ula",
            "Uri",
            "Val",
            "Ven",
            "Wyn",
            "Wysa",
            "Xil",
            "Xyr",
            "Yes",
            "Ylla",
            "Zin",
            "Zyl",
        ]
        f2 = [
            "banise",
            "bella",
            "caryn",
            "cyne",
            "di",
            "dove",
            "fiel",
            "fina",
            "gella",
            "gwyn",
            "hana",
            "harice",
            "jyre",
            "kalyn",
            "krana",
            "lana",
            "lee",
            "leth",
            "lynn",
            "moira",
            "mys",
            "na",
            "nala",
            "phine",
            "phyra",
            "qirelle",
            "ra",
            "ralei",
            "rel",
            "rie",
            "rieth",
            "rona",
            "rora",
            "roris",
            "satra",
            "stina",
            "sys",
            "thana",
            "thyra",
            "tris",
            "varis",
            "vyre",
            "wenys",
            "wynn",
            "xina",
            "xisys",
            "ynore",
            "yra",
            "zana",
            "zorwyn",
        ]
        s1 = [
            "alder",
            "amber",
            "ash",
            "aspen",
            "autumn",
            "azure",
            "beech",
            "birch",
            "blue",
            "bold",
            "bronze",
            "cedar",
            "crimson",
            "dawn",
            "dew",
            "diamond",
            "dusk",
            "eager",
            "elder",
            "elm",
            "ember",
            "even",
            "fall",
            "far",
            "feather",
            "fir",
            "flower",
            "fog",
            "forest",
            "gem",
            "gold",
            "green",
            "hazel",
            "light",
            "lunar",
            "mist",
            "moon",
            "moss",
            "night",
            "oak",
            "oaken",
            "ocean",
            "poplar",
            "rain",
            "rapid",
            "raven",
            "sage",
            "shadow",
            "silent",
            "silver",
            "spark",
            "spirit",
            "spring",
            "star",
            "still",
            "stone",
            "summer",
            "sun",
            "swift",
            "wild",
            "willow",
            "wind",
            "winter",
            "wood",
        ]
        s2 = [
            "beam",
            "bell",
            "birth",
            "blossom",
            "breath",
            "breeze",
            "brook",
            "cloud",
            "crown",
            "dew",
            "dream",
            "dreamer",
            "fall",
            "fate",
            "flight",
            "flow",
            "flower",
            "fond",
            "gaze",
            "gazer",
            "gift",
            "gleam",
            "grove",
            "guard",
            "heart",
            "heel",
            "hold",
            "kind",
            "light",
            "mane",
            "might",
            "mind",
            "moon",
            "path",
            "petal",
            "pride",
            "rest",
            "river",
            "seeker",
            "sense",
            "shadow",
            "shard",
            "shine",
            "singer",
            "smile",
            "song",
            "spark",
            "spell",
            "spirit",
            "star",
            "vale",
            "walker",
            "watcher",
            "whisper",
            "wish",
        ]

        if gender is None or gender not in Elf.ElfType:
            gender = choice(list(Elf.ElfType))
        if gender == Elf.ElfType.Male:
            return str(choice(m1) + choice(m2) + " " + choice(s1) + choice(s2)).title()
        else:
            return str(choice(f1) + choice(f2) + " " + choice(s1) + choice(s2)).title()


class Fetchling(Character):
    @staticmethod
    def generate():
        n1 = ["", "", "", "br", "dr", "gr", "j", "m", "n", "q", "qr", "r", "s", "tr", "x", "y", "z"]
        n2 = ["a", "e", "i", "o", "u"]
        n3 = ["c", "d", "g", "h", "j", "k", "l", "m", "n", "r", "s", "t", "v", "z"]
        n4 = ["", "", "", "c", "h", "l", "m", "n", "r", "t", "x"]
        n5 = ["c", "f", "g", "h", "l", "m", "n", "q", "r", "s", "t", "th", "v", "y", "z"]
        n6 = [
            "c",
            "fz",
            "fn",
            "g",
            "gv",
            "gn",
            "gz",
            "h",
            "hn",
            "hv",
            "hz",
            "l",
            "lv",
            "lr",
            "ls",
            "lz",
            "m",
            "mr",
            "mv",
            "mz",
            "nv",
            "nz",
            "nr",
            "r",
            "rr",
            "rs",
            "rz",
            "rh",
            "rv",
            "sc",
            "sh",
            "sr",
            "sv",
            "th",
            "thr",
            "tv",
            "tn",
        ]
        n7 = ["", "", "", "", "", "", "", "", "", "", "", "", "", "h", "l", "m", "n", "s", "x"]

        c = randrange(3)
        if c == 0:
            return str(choice(n5) + choice(n2) + choice(n6) + choice(n2) + choice(n7)).title()
        elif c == 1:
            return str(choice(n5) + choice(n2) + choice(n6) + choice(n2) + choice(n6) + choice(n2) + choice(n7)).title()
        else:
            return str(choice(n1) + choice(n2) + choice(n3) + choice(n2) + choice(n4)).title()


class Fleshwarp(Character):
    @staticmethod
    def generate():
        n1 = ["", "b", "d", "f", "g", "h", "k", "m", "n", "s", "sh", "w", "z"]
        n2 = ["a", "e", "o", "u"]
        n3 = [
            "cr",
            "gl",
            "gr",
            "mb",
            "mp",
            "rbl",
            "rdl",
            "rgl",
            "rn",
            "sb",
            "sk",
            "str",
            "tr",
            "tl",
            "ttl",
            "zb",
            "zl",
            "zk",
            "ztr",
        ]
        n4 = ["a", "e", "e", "i", "i", "o", "o", "u"]
        n6 = [
            "",
            "g",
            "k",
            "m",
            "n",
            "r",
            "t",
            "f",
            "ff",
            "g",
            "g",
            "mp",
            "k",
            "m",
            "n",
            "n",
            "nn",
            "nd",
            "nt",
            "r",
            "r",
            "rd",
            "rm",
            "rn",
            "rt",
            "st",
            "s",
            "ss",
            "t",
            "tt",
        ]
        n7 = [
            "mouth",
            "nose",
            "head",
            "chest",
            "back",
            "mouthed",
            "nosed",
            "headed",
            "chested",
            "backed",
            "feet",
            "hands",
            "eyes",
            "ears",
            "arms",
            "legs",
            "handed",
            "legged",
            "armed",
            "eared",
            "limbs",
            "limbed",
            "fingers",
            "fingered",
            "toes",
            "toed",
        ]
        n8 = [
            "no",
            "zero",
            "double",
            "two",
            "twin",
            "extra",
            "split",
            "triple",
            "trice",
            "three",
            "quadrupel",
            "quad",
            "four",
            "five",
            "six",
            "seven",
            "eight",
            "dozen",
        ]
        n9 = [
            "bark",
            "root",
            "stone",
            "liquid",
            "little",
            "big",
            "twist",
            "split",
            "twin",
            "break",
            "broken",
            "gore",
            "warp",
            "demon",
            "angel",
            "fiend",
            "bone",
            "craven",
            "dire",
            "long",
            "shrunk",
            "balloon",
            "feeble",
            "giant",
            "grim",
            "high",
            "no",
            "limp",
            "light",
            "low",
            "high",
            "mad",
            "numb",
        ]
        n10 = [
            "mouth",
            "nose",
            "head",
            "chest",
            "back",
            "mouthed",
            "nosed",
            "headed",
            "chested",
            "backed",
            "feet",
            "hands",
            "eyes",
            "ears",
            "arms",
            "legs",
            "handed",
            "legged",
            "armed",
            "eared",
            "limbs",
            "limbed",
            "fingers",
            "fingered",
            "toes",
        ]
        n11 = [" ", "-", ""]

        name = choice(n1) + choice(n2) + choice(n3) + choice(n4) + choice(n6)
        if randrange(2) == 0:
            name += ", " + choice(n8) + choice(n11) + choice(n7)
        else:
            name += ", " + choice(n9) + choice(n11) + choice(n10)

        return name.title()


class Ghoran(Character):
    @staticmethod
    def generate():
        n1 = ["", "", "f", "h", "l", "m", "n", "r", "s", "v", "z"]
        n2 = [
            "oo",
            "aa",
            "a",
            "a",
            "e",
            "e",
            "i",
            "o",
            "u",
            "a",
            "a",
            "e",
            "e",
            "i",
            "o",
            "u",
            "a",
            "a",
            "e",
            "e",
            "i",
            "o",
            "u",
            "a",
            "a",
            "e",
            "e",
            "i",
            "o",
            "u",
            "a",
            "a",
            "e",
            "e",
            "i",
            "o",
            "u",
            "a",
            "a",
            "e",
            "e",
            "i",
            "o",
            "u",
        ]
        n3 = ["h", "l", "lm", "ln", "lv", "m", "mm", "mn", "ms", "n", "nn", "nv", "nz", "r", "v", "w", "z", "zn", "zr"]
        n4 = ["a", "a", "e", "i", "o", "u"]
        n5 = ["h", "l", "m", "n", "r", "s", "th", "v", "z"]
        n6 = [
            "ie",
            "ia",
            "iu",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
        ]
        n7 = ["", "", "", "ch", "d", "l", "ld", "lt", "m", "n", "r", "t"]

        if randrange(2) == 0:
            return str(choice(n1) + choice(n2) + choice(n3) + choice(n6) + choice(n7)).title()
        else:
            return str(choice(n1) + choice(n2) + choice(n3) + choice(n4) + choice(n5) + choice(n6) + choice(n7)).title()


class Gillman(Character):
    class GillmanType(Enum):
        Male = auto()
        Female = auto()

    @staticmethod
    def generate(gender: GillmanType = None):
        m1 = [
            "Aqilus",
            "Porcus",
            "Nater",
            "Filtys",
            "Merpus ",
            "Tertis",
            "Osharus",
            "Rimulus",
            "Aberdeen",
            "Aberforth",
            "Adrian",
            "Aeces",
            "Aenon",
            "Agual",
            "Anchor",
            "Andaman",
            "Anenon",
            "Aquarius",
            "Aquor",
            "Arroyo",
            "Baltic",
            "Barracudon",
            "Bay",
            "Beck",
            "Bered",
            "Bo",
            "Bourne",
            "Brendan",
            "Brooke",
            "Bruinen",
            "Calder",
            "Caol",
            "Cari",
            "Caspian",
            "Cato",
            "Chalakon",
            "Clifford",
            "Clyde",
            "Coburn",
            "Como",
            "Conway",
            "Cruise",
            "Cyraenan",
            "Cyraeneus",
            "Cyraeni",
            "Cyreus",
            "Dathan",
            "Davey",
            "Deniz",
            "Dewy",
            "Dillon",
            "Dorado",
            "Douglas",
            "Dover",
            "Drake",
            "Duff",
            "Dune",
            "Duxor",
            "Dylan",
            "Dylon",
            "Earendil",
            "Ecthelion",
            "Ervin",
            "Finn",
            "Ford",
            "Gal",
            "Gar",
            "Guadalupe",
            "Hali",
            "Hawkins",
            "Hiro",
            "Hurley",
            "Indra",
            "Irvin",
            "Irving",
            "Jabal",
            "Jack",
            "Jacques",
            "Jafar",
            "Jetty",
            "Jonah",
            "Jorah",
            "Jordan",
            "Jubal",
            "Kae",
            "Kaerio",
            "Kaerius",
            "Kai",
            "Kailani",
            "Kairius",
            "Kawai",
            "Keel",
            "Kelvin",
            "Kendall",
            "Kenn",
            "Krill",
            "Kyle",
            "Lachlan",
            "Laekces",
            "Laguna",
            "Laiken",
            "Leith",
            "Leomaris",
            "Leven",
            "Ligurian",
            "Lincoln",
            "Llyr",
            "Lusca",
            "Lynn",
            "Maggiore",
            "Mako",
            "Marin",
            "Marinus",
            "Marious",
            "Marius",
            "Marlin",
            "Marlow",
            "Marlowe",
            "Marsh",
            "Marshal",
            "Marsious",
            "Maxwell",
            "Merrick",
            "Mizuko",
            "Moby",
            "Monroe",
            "Moor",
            "Moore",
            "Morcant",
            "Morgan",
            "Morrissey",
            "Mortimer",
            "Morven",
            "Muir",
            "Muiress",
            "Muriel",
            "Murphy",
            "Murray",
            "Murrissey",
            "Naga",
            "Nebraska",
            "Neptune",
            "Neres",
            "Nereus",
            "Nerio",
            "Nerrocen",
            "Noelani",
            "Oceanus",
            "Octopian",
            "Orman",
            "Orta",
            "Paio",
            "Pelagius",
            "Peleg",
            "Pike",
            "Plato",
            "Poseider",
            "Poseidon",
            "Queseon",
            "Raen",
            "Ran",
            "Ray",
            "Reif",
            "Ren",
            "Rio",
            "Rip",
            "Roan",
            "Ronan",
            "Ross",
            "Santus",
            "Seaton",
            "Seirus",
            "Shar",
            "Skipper",
            "Storm",
            "Strom",
            "Tack",
            "Tad",
            "Tamesis",
            "Taron",
            "Thames",
            "Tide",
            "Trent",
            "Trenton",
            "Tridenton",
            "Triton",
            "Tullius",
            "Wade",
            "Wyatt",
            "Yarrow",
            "Yuval",
            "Zale",
            "Zander",
        ]
        f1 = [
            "Nadia",
            "Vivia",
            "Tyene",
            "Meri",
            "Riva",
            "Kelby",
            "Nixie",
            "Doria",
            "Nerissa",
            "Kailani",
            "Taila",
            "Leena",
            "Nami",
            "Pavati",
            "Aquina",
            "Nyissa",
            "Oshiera",
            "Marina",
            "Koia",
            "Sebaysha",
            "Larinia",
            "Corrissa",
            "Aban",
            "Abenahir",
            "Aberfa",
            "Adella",
            "Adra",
            "Adrea",
            "Adreanna",
            "Adria",
            "Adriana",
            "Adriane",
            "Adrianna",
            "Adrianne",
            "Adrie",
            "Adrielle",
            "Adriene",
            "Adrienna",
            "Adrienne",
            "Adrina",
            "Adva",
            "Aedre",
            "Aegaea",
            "Aegates",
            "Aerial",
            "Aerwyna",
            "Afshak",
            "Afshaneh",
            "Afshang",
            "Alana",
            "Allura",
            "Allure",
            "Amadahy",
            "Amara",
            "Amaria",
            "Amphitrite",
            "Anahita",
            "Anat",
            "Anath",
            "Andrina",
            "Aphrodite",
            "Apulia",
            "Aquarius",
            "Aquata",
            "Ara",
            "Araxie",
            "Ardvisura",
            "Ariel",
            "Arielle",
            "Arista",
            "Arva",
            "Arvia",
            "Assana",
            "Assane",
            "Assyria",
            "Atargatis",
            "Attina",
            "Avalon",
            "Avonmora",
            "Azalea",
            "Bayou",
            "Beatrice",
            "Beck",
            "Beverlee",
            "Beverley",
            "Beverly",
            "Bo",
            "Brimlad",
            "Briny",
            "Brook",
            "Brooke",
            "Brooklyn",
            "Brooklynn",
            "Brooklynne",
            "Bubbles",
            "Calder",
            "Callan",
            "Camie",
            "Cari",
            "Caspian",
            "Ceto",
            "Charybdis",
            "Chelsea",
            "Chenelle",
            "Cherith",
            "Chumani",
            "Coco",
            "Cora",
            "Coralia",
            "Cordelia",
            "Cotovatre",
            "Coventina",
            "Cragen",
            "Creiddylad",
            "Dalis",
            "Dalit",
            "Darya",
            "Deema",
            "Delma",
            "Delmar",
            "Delmara",
            "Delmare",
            "Delora",
            "Deloras",
            "Deloros",
            "Deniz",
            "Diana",
            "Diona",
            "Diondra",
            "Dione",
            "Dionna",
            "Dionne",
            "Dominique",
            "Dorea",
            "Doria",
            "Dorian",
            "Doriana",
            "Dorianna",
            "Dorianne",
            "Dorien",
            "Dorienne",
            "Doris",
            "Dwynwen",
            "Dyesebel",
            "Dylan",
            "Earwine",
            "Earwyn",
            "Earwyna",
            "Eathelin",
            "Eathelyn",
            "Ebba",
            "Echo",
            "Edlen",
            "Edlin",
            "Edlyn",
            "Eirene",
            "Eldoris",
            "Emily",
            "Ephyra",
            "Erwina",
            "Erwyna",
            "Euadne",
            "Fontanne",
            "Gal",
            "Galit",
            "Geneva",
            "Genevieve",
            "Genna",
            "Genny",
            "Genoveva",
            "Genowefa",
            "Ginevra",
            "Glan",
            "Goldie",
            "Guadalupe",
            "Guinemere",
            "Guinevere",
            "Hali",
            "Halimeda",
            "Hama",
            "Hamako",
            "Hanon",
            "Hecate",
            "Hydra",
            "Indra",
            "Ingemar",
            "Irvetta",
            "Irvette",
            "Isla",
            "Itsaso",
            "Jaleh",
            "Jeevika",
            "Jennifer",
            "Jenny",
            "Jennyfer",
            "Jennyver",
            "Jewel",
            "Jharna",
            "Jorah",
            "Jordan",
            "June",
            "Jurmala",
            "Kai",
            "Kaia",
            "Kailani",
            "Kairi",
            "Karen",
            "Kawai",
            "Kawthar",
            "Kelby",
            "Kelda",
            "Kelde",
            "Kendall",
            "Kevser",
            "Kishi",
            "Kishiko",
            "Kyla",
            "Kyle",
            "Lage",
            "Laguna",
            "Lagune",
            "Laiken",
            "Lamia",
            "Lana",
            "Laraine",
            "Latine",
            "Lausanne",
            "Leena",
            "Lethe",
            "Leuconoe",
            "Leucothea",
            "Leucothia",
            "Leven",
            "Lily",
            "Lin",
            "Lola",
            "Lorelei",
            "Lorelie",
            "Lorraine",
            "Lucia",
            "Lyn",
            "Lynn",
            "Lynna",
            "Lynne",
            "Madison",
            "Malila",
            "Mamia",
            "Marea",
            "Mareen",
            "Mareena",
            "Marella",
            "Marena",
            "Maressa",
            "Maricia",
            "Marilla",
            "Marin",
            "Marina",
            "Marinda",
            "Marine",
            "Marinella",
            "Marinelle",
            "Marinna",
            "Marinochka",
            "Maris",
            "Marisabel",
            "Marissa",
            "Maritza",
            "Mariza",
            "Marlin",
            "Marlow",
            "Marlowe",
            "Marna",
            "Martha",
            "Maryn",
            "Maryssa",
            "Masika",
            "Maya",
            "Mayim",
            "Melody",
            "Meltem",
            "Meredith",
            "Meri",
            "Meriel",
            "Meris",
            "Merise",
            "Merissa",
            "Mesi",
            "Mica",
            "Michal",
            "Mira",
            "Miranda",
            "Mishell",
            "Misty",
            "Mizuko",
            "Moana",
            "Molly",
            "Monroe",
            "Moor",
            "Morcan",
            "Morgaine",
            "Morgan",
            "Morgana",
            "Morgance",
            "Morgane",
            "Morgann",
            "Morgant",
            "Morgayne",
            "Morwen",
            "Morwenna",
            "Moselle",
            "Muiel",
            "Muirgheal",
            "Murel",
            "Muriel",
            "Murphy",
            "Murray",
            "Nadah",
            "Nadia",
            "Nagisa",
            "Nahla",
            "Naida",
            "Nami",
            "Nanami",
            "Narissa",
            "Naunet",
            "Nautia",
            "Nawfar",
            "Nebraska",
            "Nebula",
            "Nebulia",
            "Neha",
            "Neith",
            "Neptune",
            "Nereida",
            "Nereyda",
            "Nerice",
            "Nerida",
            "Neried",
            "Nerin",
            "Nerina",
            "Nerine",
            "Neris",
            "Nerissa",
            "Nerita",
            "Nimiane",
            "Nimue",
            "Nineve",
            "Nireta",
            "Nixie",
            "Noelani",
            "Noelle",
            "Nyneve",
            "Oceane",
            "Oceana",
            "Oceane",
            "Ondine",
            "Oona",
            "Orabel",
            "Orabelle",
            "Pamuya",
            "Pasha",
            "Pavati",
            "Pearl",
            "Peirene",
            "Pelagia",
            "Priscilla",
            "Puakai",
            "Raina",
            "Raine",
            "Rainey",
            "Rainie",
            "Ran",
            "Rana",
            "Reka",
            "Ren",
            "Rhode",
            "Rhodos",
            "Ria",
            "Rilla",
            "Rille",
            "Rilletta",
            "Rillette",
            "Rillia",
            "Rillie",
            "Rina",
            "Rio",
            "Riva",
            "Rive",
            "River",
            "Robeab",
            "Rocio",
            "Rudabeh",
            "Sabrina",
            "Sadaf",
            "Sara",
            "Scylla",
            "Seira",
            "Sereia",
            "Serena",
            "Serenna",
            "Shabnan",
            "Sheila",
            "Shellina",
            "Shizue",
            "Siera",
            "Sirena",
            "Sokanon",
            "Struana",
            "Styx",
            "Sybil",
            "Tal",
            "Talia",
            "Talise",
            "Tallulah",
            "Talora",
            "Talori",
            "Talulah",
            "Talya",
            "Taura",
            "Tefnut",
            "Tethys",
            "Thalassa",
            "Thames",
            "Thessalonike",
            "Tishtar",
            "Torlan",
            "Tulia",
            "Tyna",
            "Tyne",
            "Ula",
            "Umiko",
            "Una",
            "Undina",
            "Undine",
            "Undinia",
            "Vanora",
            "Varina",
            "Venilia",
            "Venus",
            "Vivian",
            "Viviana",
            "Viviane",
            "Vivianna",
            "Vivianne",
            "Vivien",
            "Wade",
            "Waverly",
            "Winnifred",
            "Wynnifred",
            "Yara",
            "Yardenah",
            "Yaritza",
            "Yarrow",
            "Yoki",
            "Zhaleh",
        ]

        if gender is None or gender not in Gillman.GillmanType:
            gender = choice(list(Gillman.GillmanType))
        if gender == Gillman.GillmanType.Male:
            return choice(m1)

        else:  # Female
            return choice(f1)


class Gnoll(Character):
    @staticmethod
    def generate():
        n1 = [
            "Aardvark",
            "Abyssinian",
            "Addax",
            "Affenpinscher",
            "Akbash",
            "Akita",
            "Albatross",
            "Alligator",
            "Alpaca",
            "Anemone Fish",
            "Angelfish",
            "Angora",
            "Anole",
            "Ant",
            "Anteater",
            "Antelope",
            "Aoudad",
            "Ape",
            "Argali",
            "Armadillo",
            "Avocet",
            "Axolotl",
            "Baboon",
            "Badger",
            "Balinese",
            "Bandicoot",
            "Barb",
            "Barnacle",
            "Barracuda",
            "Basilisk",
            "Bat",
            "Beagle",
            "Bear",
            "Bearded Dragon",
            "Beaver",
            "Bee",
            "Beetle",
            "Bighorn",
            "Binturong",
            "Bird",
            "Birman",
            "Bison",
            "Bloodhound",
            "Boa",
            "Boar",
            "Bobcat",
            "Bombay",
            "Bongo",
            "Bonobo",
            "Booby",
            "Borer",
            "Budgerigar",
            "Buffalo",
            "Bull",
            "Bull Terrier",
            "Bulldog",
            "Bullfrog",
            "Bunny",
            "Burmese",
            "Burro",
            "Butterfly",
            "Cayman",
            "Camel",
            "Canary",
            "Capuchin",
            "Capybara",
            "Caracal",
            "Cardinal",
            "Caribou",
            "Cassowary",
            "Cat",
            "Caterpillar",
            "Catfish",
            "Centipede",
            "Chameleon",
            "Chamois",
            "Cheetah",
            "Chicken",
            "Chihuahua",
            "Chimpanzee",
            "Chinchilla",
            "Chinook",
            "Chipmunk",
            "Cichlid",
            "Civet",
            "Coati",
            "Cockroach",
            "Collie",
            "Colt",
            "Cony",
            "Coral",
            "Cougar",
            "Cow",
            "Coyote",
            "Crab",
            "Crane",
            "Crocodile",
            "Crow",
            "Cuscus",
            "Cuttlefish",
            "Dachshund",
            "Dalmatian",
            "Darter",
            "Deer",
            "Dhole",
            "Dingo",
            "Discus",
            "Dodo",
            "Doe",
            "Dog",
            "Dogfish",
            "Dolphin",
            "Donkey",
            "Dormouse",
            "Dragon",
            "Dragonfly",
            "Drever",
            "Dromedary",
            "Duck",
            "Duckbill",
            "Dugong",
            "Dunker",
            "Eagle",
            "Earwig",
            "Echidna",
            "Eel",
            "Egret",
            "Eland",
            "Elephant",
            "Eleuth",
            "Elk",
            "Emu",
            "Ermine",
            "Ewe",
            "Falcon",
            "Fawn",
            "Ferret",
            "Finch",
            "Firefinch",
            "Fish",
            "Flamingo",
            "Flounder",
            "Fly",
            "Fossa",
            "Fox",
            "Frigatebird",
            "Frog",
            "Fulgorid",
            "Gar",
            "Gazelle",
            "Gecko",
            "Gemsbok",
            "Gerbil",
            "Gharial",
            "Gibbon",
            "Gila monster",
            "Giraffe",
            "Gnu",
            "Goat",
            "Goatfish",
            "Goose",
            "Gopher",
            "Gorilla",
            "Grasshopper",
            "Greyhound",
            "Grizzly bear",
            "Ground hog",
            "Grouse",
            "Guanaco",
            "Guinea pig",
            "Guppy",
            "Hamlet",
            "Hamster",
            "Hare",
            "Harrier",
            "Hartebeest",
            "Havanese",
            "Hedgehog",
            "Heron",
            "Himalayan",
            "Hippo",
            "Hippopotamus",
            "Hog",
            "Hornbill",
            "Hornet",
            "Horse",
            "Hound",
            "Human",
            "Hummingbird",
            "Ibex",
            "Ibis",
            "Iguana",
            "Impala",
            "Indri",
            "Insect",
            "Jackal",
            "Jackrabbit",
            "Jaguar",
            "Javanese",
            "Jay",
            "Jellyfish",
            "Jerboa",
            "Kakapo",
            "Kangaroo",
            "Katydid",
            "Kid",
            "Kingfisher",
            "Kinkajou",
            "Kitten",
            "Kiwi",
            "Koala",
            "Komodo",
            "Koodoo",
            "Kookaburra",
            "Kudu",
            "Labradoodle",
            "Ladybird",
            "Lamb",
            "Lechwe",
            "Lemming",
            "Lemur",
            "Leopard",
            "Liger",
            "Lion",
            "Lionfish",
            "Lizard",
            "Llama",
            "Lobster",
            "Locust",
            "Longclaw",
            "Lovebird",
            "Lynx",
            "Macaw",
            "Magpie",
            "Maltese",
            "Mammoth",
            "Manatee",
            "Mandrill",
            "Mantis",
            "Mare",
            "Markhor",
            "Marmoset",
            "Marmot",
            "Marten",
            "Mastiff",
            "Mastigodryas",
            "Mayfly",
            "Meerkat",
            "Millipede",
            "Mink",
            "Mole",
            "Molly",
            "Mongoose",
            "Mongrel",
            "Monkey",
            "Moorhen",
            "Moose",
            "Moth",
            "Mountain goat",
            "Mouse",
            "Mule",
            "Musk deer",
            "Musk-ox",
            "Muskrat",
            "Mustang",
            "Mynah bird",
            "Neanderthal",
            "Newfoundland",
            "Newt",
            "Nightingale",
            "Numbat",
            "Ocelot",
            "Octopus",
            "Oedemera",
            "Okapi",
            "Olm",
            "Opossum",
            "Orang-utan",
            "Orangutan",
            "Orca",
            "Oryx",
            "Ostrich",
            "Otter",
            "Owl",
            "Ox",
            "Oyster",
            "Pademelon",
            "Panda",
            "Panther",
            "Parakeet",
            "Parrot",
            "Peacock",
            "Peccary",
            "Pekingese",
            "Pelican",
            "Penguin",
            "Persian",
            "Pheasant",
            "Pig",
            "Pika",
            "Pike",
            "Piranha",
            "Platypus",
            "Pointer",
            "Polar bear",
            "Pony",
            "Poodle",
            "Porcupine",
            "Porpoise",
            "Possum",
            "Prairie dog",
            "Prawn",
            "Pronghorn",
            "Puffin",
            "Pug",
            "Puma",
            "Puppy",
            "Quagga",
            "Quail",
            "Quetzal",
            "Quokka",
            "Quoll",
            "Rabbit",
            "Raccoon",
            "Ragdoll",
            "Ram",
            "Rat",
            "Rattlesnake",
            "Raven",
            "Reindeer",
            "Reptile",
            "Retriever",
            "Rhino",
            "Rhinoceros",
            "Robin",
            "Roebuck",
            "Rottweiler",
            "Salamander",
            "Saola",
            "Scorpion",
            "Seahorse",
            "Seal",
            "Serval",
            "Shark",
            "Sheep",
            "Sheepdog",
            "Shrew",
            "Shrimp",
            "Siamese",
            "Siberian",
            "Skink",
            "Skunk",
            "Sloth",
            "Slug",
            "Snail",
            "Snake",
            "Snowshoe",
            "Somali",
            "Spaniel",
            "Spanish Flag",
            "Sparrow",
            "Sparrowhawk",
            "Spider",
            "Sponge",
            "Springbok",
            "Squid",
            "Squirrel",
            "Stallion",
            "Starfish",
            "Starling",
            "Steer",
            "Stingray",
            "Stoat",
            "Stork",
            "Sunfish",
            "Swan",
            "Tamarin",
            "Tang",
            "Tapir",
            "Tarantula",
            "Tarsier",
            "Tayra",
            "Termite",
            "Terrier",
            "Tetra",
            "Tiffany",
            "Tiger",
            "Toad",
            "Tortoise",
            "Toucan",
            "Triggerfish",
            "Tropicbird",
            "Trunkfish",
            "Tuatara",
            "Turkey",
            "Turtle",
            "Uakari",
            "Uguisu",
            "Umbrellabird",
            "Urchin",
            "Vicuna",
            "Vole",
            "Vulture",
            "Wallaby",
            "Walrus",
            "Wapiti",
            "Warthog",
            "Wasp",
            "Waterbuck",
            "Weasel",
            "Weaver",
            "Whale",
            "Whippet",
            "Wildcat",
            "Wildebeest",
            "Wolf",
            "Wolfhound",
            "Wolverine",
            "Wombat",
            "Woodchuck",
            "Woodlouse",
            "Woodpecker",
            "Wrasse",
            "Yak",
            "Zebra",
            "Zebu",
            "Zonkey",
            "Zorse",
            "Acacia",
            "Aconite",
            "Alder",
            "Almond",
            "Apricot",
            "Arrowwood",
            "Ash",
            "Aspen",
            "Azalea",
            "Azolla",
            "Balsa",
            "Bamboo",
            "Baobab",
            "Bayonet",
            "Beech",
            "Belladonna",
            "Birch",
            "Bittercress",
            "Bitterweed",
            "Boabab",
            "Bow-wood",
            "Bower",
            "Box",
            "Boxelder",
            "Brier",
            "Brittlebush",
            "Buckeye",
            "Buckthorn",
            "Bunya",
            "Bush",
            "Buxus",
            "Cane",
            "Cap",
            "Cassava",
            "Catalpa",
            "Cedar",
            "Cherry",
            "Chestnut",
            "Clove",
            "Clover",
            "Colwort",
            "Conifer",
            "Cornel",
            "Cress",
            "Crowfoot",
            "Cycad",
            "Cypress",
            "Deadnettle",
            "Dindle",
            "Dogbane",
            "Dogwood",
            "Duscle",
            "Elder",
            "Elm",
            "Eucalyptus",
            "Fern",
            "Fir",
            "Flax",
            "Fluxroot",
            "Fumewort",
            "Gallberry",
            "Geranium",
            "Ginger",
            "Gutweed",
            "Harlequin",
            "Hawthorn",
            "Hazel",
            "Hellebore",
            "Hemlock",
            "Hickory",
            "Hogweed",
            "Holly",
            "Hornbeam",
            "Itchweed",
            "Ivy",
            "Juniper",
            "Larch",
            "Laurel",
            "Leaf",
            "Locust",
            "Lotus",
            "Magnolia",
            "Mahogany",
            "Mangrove",
            "Maple",
            "Medlar",
            "Milkbark",
            "Milkweed",
            "Mint",
            "Moosewood",
            "Morel",
            "Moss",
            "Mulberry",
            "Needle",
            "Nettle",
            "Nightshade",
            "Oak",
            "Oleander",
            "Palm",
            "Palmetto",
            "Persimmon",
            "Pine",
            "Poinsetta",
            "Pokeroot",
            "Pokeweed",
            "Poplar",
            "Privet",
            "Ragweed",
            "Redbud",
            "Rhododendron",
            "Ribwort",
            "Rose",
            "Rowan",
            "Saffron",
            "Sage",
            "Sequoia",
            "Silkweed",
            "Skunkweed",
            "Snakeberry",
            "Snowdrop",
            "Sorrel",
            "Spruce",
            "Stickweed",
            "Strongbark",
            "Sumac",
            "Sycamore",
            "Tassel",
            "Thimbleweed",
            "Thistle",
            "Thorn",
            "Thyme",
            "Tree",
            "Viburnum",
            "Vine",
            "Violet",
            "Willow",
            "Windroot",
            "Wood",
            "Wormwood",
            "Woundwort",
            "Yew",
            "Yucca",
            "Acacia",
            "Aconite",
            "Alder",
            "Almond",
            "Apricot",
            "Arrowwood",
            "Ash",
            "Aspen",
            "Azalea",
            "Azolla",
            "Balsa",
            "Bamboo",
            "Baobab",
            "Bayonet",
            "Beech",
            "Belladonna",
            "Birch",
            "Bittercress",
            "Bitterweed",
            "Boabab",
            "Bow-wood",
            "Bower",
            "Box",
            "Boxelder",
            "Brier",
            "Brittlebush",
            "Buckeye",
            "Buckthorn",
            "Bunya",
            "Bush",
            "Buxus",
            "Cane",
            "Cap",
            "Cassava",
            "Catalpa",
            "Cedar",
            "Cherry",
            "Chestnut",
            "Clove",
            "Clover",
            "Colwort",
            "Conifer",
            "Cornel",
            "Cress",
            "Crowfoot",
            "Cycad",
            "Cypress",
            "Deadnettle",
            "Dindle",
            "Dogbane",
            "Dogwood",
            "Duscle",
            "Elder",
            "Elm",
            "Eucalyptus",
            "Fern",
            "Fir",
            "Flax",
            "Fluxroot",
            "Fumewort",
            "Gallberry",
            "Geranium",
            "Ginger",
            "Gutweed",
            "Harlequin",
            "Hawthorn",
            "Hazel",
            "Hellebore",
            "Hemlock",
            "Hickory",
            "Hogweed",
            "Holly",
            "Hornbeam",
            "Itchweed",
            "Ivy",
            "Juniper",
            "Larch",
            "Laurel",
            "Leaf",
            "Locust",
            "Lotus",
            "Magnolia",
            "Mahogany",
            "Mangrove",
            "Maple",
            "Medlar",
            "Milkbark",
            "Milkweed",
            "Mint",
            "Moosewood",
            "Morel",
            "Moss",
            "Mulberry",
            "Needle",
            "Nettle",
            "Nightshade",
            "Oak",
            "Oleander",
            "Palm",
            "Palmetto",
            "Persimmon",
            "Pine",
            "Poinsetta",
            "Pokeroot",
            "Pokeweed",
            "Poplar",
            "Privet",
            "Ragweed",
            "Redbud",
            "Rhododendron",
            "Ribwort",
            "Rose",
            "Rowan",
            "Saffron",
            "Sage",
            "Sequoia",
            "Silkweed",
            "Skunkweed",
            "Snakeberry",
            "Snowdrop",
            "Sorrel",
            "Spruce",
            "Stickweed",
            "Strongbark",
            "Sumac",
            "Sycamore",
            "Tassel",
            "Thimbleweed",
            "Thistle",
            "Thorn",
            "Thyme",
            "Tree",
            "Viburnum",
            "Vine",
            "Violet",
            "Willow",
            "Windroot",
            "Wood",
            "Wormwood",
            "Woundwort",
            "Yew",
            "Yucca",
            "Skull",
            "Tooth",
            "Canine",
            "Tusk",
            "Spine",
            "Marrow",
            "Rib",
            "Cranium",
            "Mandible",
            "Humerus",
            "Femur",
            "Tibia",
            "Fibula",
            "Skull",
            "Tooth",
            "Canine",
            "Tusk",
            "Spine",
            "Marrow",
            "Rib",
            "Cranium",
            "Mandible",
            "Humerus",
            "Femur",
            "Tibia",
            "Fibula",
            "Skull",
            "Tooth",
            "Canine",
            "Tusk",
            "Spine",
            "Marrow",
            "Rib",
            "Cranium",
            "Mandible",
            "Humerus",
            "Femur",
            "Tibia",
            "Fibula",
            "Skull",
            "Tooth",
            "Canine",
            "Tusk",
            "Spine",
            "Marrow",
            "Rib",
            "Cranium",
            "Mandible",
            "Humerus",
            "Femur",
            "Tibia",
            "Fibula",
        ]
        n2 = [
            "Abyss",
            "Aching",
            "Ancestral",
            "Arctic",
            "Ashen",
            "Assassin",
            "Banshee",
            "Barbed",
            "Bitter",
            "Black",
            "Blessed",
            "Bloodied",
            "Blue",
            "Bright",
            "Bronze",
            "Cave",
            "Chilling",
            "Crimson",
            "Dancing",
            "Dead",
            "Deadly",
            "Dim",
            "Dire",
            "Dragon",
            "Dragon's",
            "Dreaming",
            "Drifting",
            "Eternal",
            "Fanged",
            "Fire",
            "Flying",
            "Frozen",
            "Giant",
            "Glowing",
            "Golden",
            "Grand",
            "Grave",
            "Gray",
            "Green",
            "Grim",
            "Happy",
            "Hidden",
            "Hollow",
            "Horned",
            "Humble",
            "Invincible",
            "Invisible",
            "Joyful",
            "Lethal",
            "Lunar",
            "Majestic",
            "Master",
            "Miracle",
            "Nightmare",
            "Orange",
            "Phantom",
            "Phoenix",
            "Pink",
            "Pleasant",
            "Quiet",
            "Rare",
            "Raven",
            "Red",
            "Sacred",
            "Sanguine",
            "Savage",
            "Shady",
            "Shadowed",
            "Silent",
            "Silver",
            "Smooth",
            "Solar",
            "Sweet",
            "Tall",
            "Twilight",
            "Twin",
            "Twisted",
            "White",
            "Wicked",
            "Wild",
            "Wise",
            "Yellow",
        ]
        n3 = [
            "at Distance",
            "at March",
            "at Midnight",
            "at Night",
            "at Noon",
            "at Rest",
            "at Sunrise",
            "at Sunset",
            "at the Beginning",
            "at the End",
            "in Amazement",
            "in Awe",
            "in Balance",
            "in Battle",
            "in Celebration",
            "in Darkness",
            "in Discussion",
            "in Disturbance",
            "in Dreams",
            "in Enchantment",
            "in Eternity",
            "in Excitement",
            "in Fields",
            "in Flight",
            "in Focus",
            "in Gardens",
            "in Good Health",
            "in Grace",
            "in Gratitude",
            "in Happiness",
            "in Harmony",
            "in History",
            "in Judgment",
            "in Light",
            "in Love",
            "in Moonlight",
            "in Mountains",
            "in Nature",
            "in Peace",
            "in Question",
            "in Rain",
            "in Redemption",
            "in Reflection",
            "in Secret",
            "in Shadow",
            "in Shadows",
            "in Snow",
            "in Spirit",
            "in Sunlight",
            "in Surprise",
            "in Thought",
            "in Tranquility",
            "in Wonder",
            "in the Afternoon",
            "in the Clouds",
            "in the Morning",
            "of Air",
            "of Ambition",
            "of Bravery",
            "of Brilliance",
            "of Challenge",
            "of Champions",
            "of Chaos",
            "of Charity",
            "of Clarity",
            "of Courage",
            "of Curiosity",
            "of Delight",
            "of Destiny",
            "of Earth",
            "of Faith",
            "of Fascination",
            "of Fire",
            "of Flowers",
            "of Fortune",
            "of Freedom",
            "of Friends",
            "of Generosity",
            "of Giants",
            "of Gifts",
            "of Gratitude",
            "of Guidance",
            "of Honesty",
            "of Honor",
            "of Importance",
            "of Influence",
            "of Integrity",
            "of Iron",
            "of Jewels",
            "of Journeys",
            "of Justice",
            "of Kindness",
            "of Knowledge",
            "of Liberty",
            "of Luck",
            "of Memory",
            "of Moons",
            "of Music",
            "of Opportunity",
            "of Passage",
            "of Patience",
            "of Pride",
            "of Principle",
            "of Progress",
            "of Promise",
            "of Purpose",
            "of Riddles",
            "of Secrets",
            "of Songs",
            "of Stars",
            "of Storms",
            "of Strength",
            "of Thunder",
            "of Water",
            "of Wisdom",
        ]

        if randrange(2) == 0:
            return str(choice(n2) + " " + choice(n1)).title()
        else:
            return str(choice(n2) + " " + choice(n1) + " " + choice(n3)).title()


class Gnome(Character):
    class GnomeType(Enum):
        Male = auto()
        Female = auto()

    @staticmethod
    def generate(gender: GnomeType = None):
        m1 = [
            "Al",
            "Ari",
            "Bil",
            "Bri",
            "Cal",
            "Cor",
            "Dav",
            "Dor",
            "Eni",
            "Er",
            "Far",
            "Fel",
            "Ga",
            "Gra",
            "His",
            "Hor",
            "Ian",
            "Ipa",
            "Je",
            "Jor",
            "Kas",
            "Kel",
            "Lan",
            "Lo",
            "Man",
            "Mer",
            "Nes",
            "Ni",
            "Or",
            "Oru",
            "Pana",
            "Po",
            "Qua",
            "Quo",
            "Ras",
            "Ron",
            "Sa",
            "Sal",
            "Sin",
            "Tan",
            "To",
            "Tra",
            "Um",
            "Uri",
            "Val",
            "Vor",
            "War",
            "Wil",
            "Wre",
            "Xal",
            "Xo",
            "Ye",
            "Yos",
            "Zan",
            "Zil",
        ]
        m2 = [
            "bar",
            "ben",
            "bis",
            "corin",
            "cryn",
            "don",
            "dri",
            "fan",
            "fiz",
            "gim",
            "grim",
            "hik",
            "him",
            "ji",
            "jin",
            "kas",
            "kur",
            "len",
            "lin",
            "min",
            "mop",
            "morn",
            "nan",
            "ner",
            "ni",
            "pip",
            "pos",
            "rick",
            "ros",
            "rug",
            "ryn",
            "ser",
            "ston",
            "tix",
            "tor",
            "ver",
            "vyn",
            "win",
            "wor",
            "xif",
            "xim",
            "ybar",
            "yur",
            "ziver",
            "zu",
        ]
        f1 = [
            "Alu",
            "Ari",
            "Ban",
            "Bree",
            "Car",
            "Cel",
            "Daphi",
            "Do",
            "Eili",
            "El",
            "Fae",
            "Fen",
            "Fol",
            "Gal",
            "Gren",
            "Hel",
            "Hes",
            "Ina",
            "Iso",
            "Jel",
            "Jo",
            "Klo",
            "Kri",
            "Lil",
            "Lori",
            "Min",
            "My",
            "Ni",
            "Ny",
            "Oda",
            "Or",
            "Phi",
            "Pri",
            "Qi",
            "Que",
            "Re",
            "Rosi",
            "Sa",
            "Sel",
            "Spi",
            "Ta",
            "Tifa",
            "Tri",
            "Ufe",
            "Uri",
            "Ven",
            "Vo",
            "Wel",
            "Wro",
            "Xa",
            "Xyro",
            "Ylo",
            "Yo",
            "Zani",
            "Zin",
        ]
        f2 = [
            "bi",
            "bys",
            "celi",
            "ci",
            "dira",
            "dysa",
            "fi",
            "fyx",
            "gani",
            "gyra",
            "hana",
            "hani",
            "kasys",
            "kini",
            "la",
            "li",
            "lin",
            "lys",
            "mila",
            "miphi",
            "myn",
            "myra",
            "na",
            "niana",
            "noa",
            "nove",
            "phina",
            "pine",
            "qaryn",
            "qys",
            "rhana",
            "roe",
            "sany",
            "ssa",
            "sys",
            "tina",
            "tra",
            "wyn",
            "wyse",
            "xi",
            "xis",
            "yaris",
            "yore",
            "za",
            "zyre",
        ]
        s1 = [
            "babble",
            "baffle",
            "bellow",
            "belly",
            "berry",
            "billow",
            "bold",
            "boon",
            "brass",
            "brisk",
            "broad",
            "bronze",
            "cobble",
            "copper",
            "dapple",
            "dark",
            "dazzle",
            "deep",
            "fapple",
            "fiddle",
            "fine",
            "fizzle",
            "flicker",
            "fluke",
            "glitter",
            "gobble",
            "gold",
            "iron",
            "kind",
            "last",
            "light",
            "long",
            "loud",
            "lucky",
            "marble",
            "pale",
            "pebble",
            "puddle",
            "quick",
            "quiet",
            "quill",
            "shadow",
            "short",
            "silver",
            "single",
            "sparkle",
            "spring",
            "squiggle",
            "stark",
            "stout",
            "strong",
            "swift",
            "thistle",
            "thunder",
            "tinker",
            "toggle",
            "tossle",
            "true",
            "twin",
            "twist",
            "waggle",
            "whistle",
            "wiggle",
            "wild",
            "wobble",
        ]
        s2 = [
            "back",
            "badge",
            "belch",
            "bell",
            "belt",
            "bit",
            "block",
            "bonk",
            "boot",
            "boots",
            "bottom",
            "braid",
            "branch",
            "brand",
            "case",
            "cheek",
            "cloak",
            "collar",
            "cord",
            "craft",
            "crag",
            "diggles",
            "drop",
            "dust",
            "dwadle",
            "fall",
            "feast",
            "fen",
            "fern",
            "field",
            "firn",
            "flight",
            "flow",
            "front",
            "gem",
            "gift",
            "grace",
            "guard",
            "hand",
            "heart",
            "helm",
            "hide",
            "hold",
            "kind",
            "ligt",
            "lob",
            "mane",
            "mantle",
            "mask",
            "patch",
            "peak",
            "pitch",
            "pocket",
            "reach",
            "rest",
            "river",
            "rock",
            "shield",
            "song",
            "span",
            "spark",
            "spell",
            "spring",
            "stamp",
            "stand",
            "stitch",
            "stone",
            "thread",
            "top",
            "trick",
            "twist",
            "wander",
        ]

        name = ""
        if gender is None or gender not in Gnome.GnomeType:
            gender = choice(list(Gnome.GnomeType))
        if gender == Gnome.GnomeType.Male:
            name += choice(m1) + choice(m2)
        else:  # Female
            name += choice(f1) + choice(f2)

        name += choice(s1) + choice(s2)
        return name.title()


class Goblin(Character):
    class GoblinType(Enum):
        Male = auto()
        Female = auto()
        Chieftain = auto()

    @staticmethod
    def generate(gender: GoblinType = None):
        m1 = ["", "", "", "", "b", "ch", "dr", "fl", "g", "gh", "j", "k", "kr", "l", "m", "n", "p", "r", "v", "w", "z"]
        m2 = [
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "o",
            "u",
            "oo",
            "ou",
            "oa",
        ]
        m3 = [
            "bb",
            "bbl",
            "bm",
            "br",
            "bn",
            "bz",
            "d",
            "dd",
            "dr",
            "dz",
            "dg",
            "ff",
            "g",
            "ggl",
            "gm",
            "gn",
            "gt",
            "gv",
            "gb",
            "gd",
            "m",
            "md",
            "mb",
            "mz",
            "mg",
            "mk",
            "nth",
            "nz",
            "nd",
            "ng",
            "ngb",
            "ngl",
            "nd",
            "nv",
            "rg",
            "rk",
            "rp",
            "rs",
            "rt",
            "rd",
            "rg",
            "tf",
            "tv",
            "tt",
            "tg",
            "v",
            "vg",
            "vd",
            "vn",
            "vm",
        ]
        m4 = [
            "",
            "",
            "",
            "",
            "",
            "b",
            "ff",
            "g",
            "k",
            "n",
            "nk",
            "rch",
            "rd",
            "rg",
            "rk",
            "rnk",
            "rt",
            "s",
            "sh",
            "t",
            "wg",
            "z",
        ]
        f1 = [
            "",
            "",
            "",
            "",
            "",
            "ch",
            "f",
            "g",
            "gh",
            "gr",
            "h",
            "j",
            "kl",
            "l",
            "m",
            "n",
            "p",
            "r",
            "v",
            "vr",
            "y",
            "z",
        ]
        f2 = [
            "a",
            "e",
            "i",
            "o",
            "u",
            "e",
            "i",
            "o",
            "a",
            "e",
            "i",
            "o",
            "u",
            "e",
            "i",
            "o",
            "a",
            "e",
            "i",
            "o",
            "u",
            "e",
            "i",
            "o",
            "ee",
            "ie",
            "oo",
        ]
        f3 = [
            "ck",
            "dl",
            "dg",
            "dr",
            "dn",
            "dk",
            "g",
            "gl",
            "gn",
            "gm",
            "gl",
            "k",
            "kk",
            "kl",
            "kn",
            "km",
            "kch",
            "kt",
            "lk",
            "ld",
            "lg",
            "lv",
            "lb",
            "ll",
            "mb",
            "ml",
            "mp",
            "md",
            "mk",
            "mr",
            "nb",
            "nch",
            "nd",
            "ng",
            "nk",
            "p",
            "ph",
            "phr",
            "phl",
            "rk",
            "rg",
            "rd",
            "rb",
            "rbl",
            "s",
            "sh",
            "ss",
            "sk",
            "st",
            "t",
            "tr",
            "tl",
            "tch",
            "vv",
            "x",
        ]
        f4 = [
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "b",
            "h",
            "l",
            "k",
            "n",
            "ns",
            "ms",
            "s",
            "sh",
            "th",
        ]
        c1 = [
            "Amber",
            "Ash",
            "Bear",
            "Blade",
            "Blood",
            "Bone",
            "Boulder",
            "Cask",
            "Claw",
            "Crag",
            "Crow",
            "Crystal",
            "Dead",
            "Dew",
            "Dog",
            "Doom",
            "Ear",
            "Earth",
            "Elf",
            "Ember",
            "Far",
            "Finger",
            "Fire",
            "Fist",
            "Flame",
            "Flint",
            "Forest",
            "Frost",
            "Fuse",
            "Gloom",
            "Gold",
            "Gore",
            "Grass",
            "Gut",
            "Hallow",
            "Hard",
            "Haze",
            "Heart",
            "Heavy",
            "Hell",
            "High",
            "Hill",
            "Hog",
            "Horse",
            "Ice",
            "Iron",
            "Keen",
            "Long",
            "Man",
            "Marble",
            "Marsh",
            "Meadow",
            "Moon",
            "Moss",
            "Nettle",
            "Nose",
            "Orb",
            "Pine",
            "Plain",
            "Poke",
            "Rage",
            "Rain",
            "Raven",
            "Rip",
            "River",
            "Rock",
            "Rough",
            "Shadow",
            "Silver",
            "Skull",
            "Snake",
            "Snow",
            "Spider",
            "Stab",
            "Star",
            "Steel",
            "Stern",
            "Stone",
            "Storm",
            "Strong",
            "Stump",
            "Swamp",
            "Toe",
            "Tree",
            "Water",
            "Wild",
            "Wind",
            "Wold",
            "Wood",
        ]
        c2 = [
            "bane",
            "bash",
            "basher",
            "belly",
            "bender",
            "binder",
            "bite",
            "biter",
            "blazer",
            "bleeder",
            "blight",
            "brace",
            "brand",
            "breaker",
            "breath",
            "brew",
            "brook",
            "brow",
            "bumper",
            "caller",
            "chaser",
            "chew",
            "chewer",
            "chopper",
            "cleaver",
            "cooker",
            "crag",
            "crest",
            "crusher",
            "cut",
            "cutter",
            "dancer",
            "draft",
            "dreamer",
            "dust",
            "eye",
            "fall",
            "fang",
            "flaw",
            "flayer",
            "force",
            "fury",
            "gloom",
            "grip",
            "gripper",
            "guard",
            "gut",
            "hammerer",
            "horn",
            "hunter",
            "jumper",
            "killer",
            "lasher",
            "mark",
            "mauler",
            "maw",
            "more",
            "nugget",
            "part",
            "parts",
            "pike",
            "punch",
            "puncher",
            "rage",
            "rager",
            "reaper",
            "reaver",
            "rip",
            "ripper",
            "roar",
            "rock",
            "scar",
            "scream",
            "seeker",
            "shard",
            "shield",
            "shooter",
            "shot",
            "singer",
            "slaver",
            "slayer",
            "snacker",
            "snarl",
            "snouth",
            "spark",
            "spear",
            "splitter",
            "stalk",
            "stalker",
            "steel",
            "stick",
            "stomper",
            "strike",
            "striker",
            "surge",
            "taker",
            "tracker",
            "trapper",
            "wad",
            "walker",
            "watcher",
            "wound",
        ]

        name = ""
        if gender is None or gender not in Gnome.GnomeType:
            gender = choice(list(Gnome.GnomeType))
        if gender == Gnome.GnomeType.Male:
            if randrange(2) == 0:
                name += choice(m1) + choice(m2) + choice(m3) + choice(m2) + choice(m4)
            else:
                name += choice(m1) + choice(m2) + choice(m3) + choice(m2) + choice(m3) + choice(m2) + choice(m4)
        elif gender == Gnome.GnomeType.Female:
            if randrange(2) == 0:
                name += choice(f1) + choice(f2) + choice(f3) + choice(f2) + choice(f4)
            else:
                name += choice(f1) + choice(f2) + choice(f3) + choice(f2) + choice(f3) + choice(f2) + choice(f4)
        else:  # Chieftain
            name += choice(c1) + choice(c2)

        return name.title()


class Goloma(Character):
    @staticmethod
    def generate():
        n1 = ["b", "c", "g", "h", "j", "k", "qu", "r", "t", "z"]
        n2 = [
            "aa",
            "ou",
            "a",
            "e",
            "i",
            "u",
            "a",
            "e",
            "i",
            "u",
            "a",
            "e",
            "i",
            "u",
            "a",
            "e",
            "i",
            "u",
            "a",
            "e",
            "i",
            "u",
            "a",
            "e",
            "i",
            "u",
            "a",
            "e",
            "i",
            "u",
            "a",
            "e",
            "i",
            "u",
        ]
        n3 = [
            "b",
            "d",
            "dk",
            "dz",
            "hb",
            "hk",
            "k",
            "m",
            "mk",
            "qk",
            "qr",
            "r",
            "rb",
            "rj",
            "rg",
            "rk",
            "rr",
            "rt",
            "z",
            "zk",
            "zr",
            "zt",
            "zz",
        ]
        n4 = ["uu", "uue", "ua", "aa", "au", "ou", "oo", "ao"]
        n5 = ["d", "j", "k", "r", "t", "z"]
        n6 = [
            "uu",
            "aa",
            "ii",
            "eu",
            "a",
            "a",
            "a",
            "e",
            "i",
            "o",
            "o",
            "o",
            "u",
            "u",
            "u",
            "a",
            "a",
            "a",
            "e",
            "i",
            "o",
            "o",
            "o",
            "u",
            "u",
            "u",
            "a",
            "a",
            "a",
            "e",
            "i",
            "o",
            "o",
            "o",
            "u",
            "u",
            "u",
            "a",
            "a",
            "a",
            "e",
            "i",
            "o",
            "o",
            "o",
            "u",
            "u",
            "u",
            "a",
            "a",
            "a",
            "e",
            "i",
            "o",
            "o",
            "o",
            "u",
            "u",
            "u",
            "a",
            "a",
            "a",
            "e",
            "i",
            "o",
            "o",
            "o",
            "u",
            "u",
            "u",
        ]
        n7 = ["c", "h", "g", "l", "r", "t"]

        if randrange(2) == 0:
            return str(choice(n1) + choice(n2) + choice(n3) + choice(n6) + choice(n7)).title()
        else:
            return str(choice(n1) + choice(n2) + choice(n3) + choice(n4) + choice(n5) + choice(n6) + choice(n7)).title()


class Grippli(Character):
    class GrippliType(Enum):
        Male = auto()
        Female = auto()

    @staticmethod
    def generate(gender: GrippliType = None):
        m1 = [
            "Alien",
            "Arrow",
            "Bazoo",
            "Beaker",
            "Belch",
            "Belcher",
            "Binky",
            "Bloats",
            "Blob",
            "Bob",
            "Bog",
            "Bogs",
            "Booger",
            "Boogy",
            "Bubba",
            "Bubbles",
            "Buffle",
            "Buffles",
            "Bully",
            "Buster",
            "Charizard",
            "Charmander",
            "Chubber",
            "Chubbles",
            "Chubbs",
            "Chubby",
            "Chunky",
            "Claw",
            "Clawde",
            "Clawdius",
            "Claws",
            "Cozmo",
            "Cricket",
            "Croak",
            "Croaker",
            "Croaks",
            "Crook",
            "Cruncher",
            "Crunchy",
            "Curmet",
            "Dart",
            "Darts",
            "Doc",
            "Fatty",
            "Fiddles",
            "Fire",
            "Flibbit",
            "Flippy",
            "Flips",
            "Flubber",
            "Flubs",
            "Flye",
            "Freak",
            "Freckles",
            "Frogger",
            "Froggie",
            "Frogzilla",
            "Gobbles",
            "Goble",
            "Gobles",
            "Godzilla",
            "Golem",
            "Goliath",
            "Gooey",
            "Grog",
            "Hobbit",
            "Hopkins",
            "Hopper",
            "Hopscotch",
            "Hudini",
            "Jabba",
            "JarJar",
            "Kermi",
            "Kermie",
            "Kermit",
            "Leaps",
            "Leapy",
            "Mantis",
            "Marsh",
            "Mello",
            "Mellow",
            "Mog",
            "MrSticky",
            "Mud",
            "Muds",
            "Newt",
            "Newton",
            "Orbit",
            "Patches",
            "Pickle",
            "Pickles",
            "Pogo",
            "Predator",
            "Prince",
            "Puddles",
            "Pudge",
            "Pug",
            "Quibbit",
            "Ribbit",
            "Shmoo",
            "Shmooch",
            "Skippy",
            "Skittles",
            "Slick",
            "Slimes",
            "Slippy",
            "Slub",
            "Slug",
            "Slugg",
            "Sluggs",
            "Slugs",
            "Smeagol",
            "Smudge",
            "Spot",
            "Sticky",
            "Stinky",
            "Stubby",
            "Stumper",
            "Swampie",
            "Swamps",
            "Thor",
            "Toad",
            "Weirdo",
            "Whopper",
            "Wiggles",
            "Wobble",
            "Wobbles",
            "Yoda",
        ]
        f1 = [
            "Algee",
            "Amazone",
            "Amazonia",
            "Babe",
            "Belchy",
            "Blinks",
            "Blinky",
            "Bloats",
            "Bubble",
            "Bubbles",
            "Buffy",
            "Bufonia",
            "Cherry",
            "Chops",
            "Chubbles",
            "Chubby",
            "Clawdia",
            "Cookie",
            "Cosmo",
            "Cricket",
            "Croaks",
            "Daphne",
            "Dirty",
            "Faye",
            "Fern",
            "Fiddle",
            "Flubby",
            "Flye",
            "Freakey",
            "Freckles",
            "Frogzilla",
            "Fye",
            "Fyre",
            "Geo",
            "Gobbles",
            "Gooey",
            "Hippity",
            "Hipscotch",
            "Hoppity",
            "Iggy",
            "Karma",
            "Kirby",
            "Kiss",
            "Kisses",
            "Leaps",
            "Leapy",
            "Lilo",
            "Lily",
            "Lilypad",
            "Lips",
            "Mello",
            "Muddy",
            "Muds",
            "Mystique",
            "Noodles",
            "Patches",
            "Peeps",
            "Penelope",
            "Pepper",
            "Pickle",
            "Pickles",
            "Princess",
            "Puds",
            "Pugs",
            "Pumpkin",
            "Raisin",
            "Ribbit",
            "Ribbits",
            "Sally",
            "Shirly",
            "Shmoo",
            "Shmooches",
            "Slimey",
            "Slippy",
            "Smiley",
            "Smooch",
            "Snaile",
            "Sparkle",
            "Sparkles",
            "Speckles",
            "Spot",
            "Spots",
            "Squee",
            "Squiggy",
            "Stitch",
            "Stitches",
            "Teeny",
            "Tiggles",
            "Tiny",
            "Tootsie",
            "Trixie",
            "Twiggy",
            "Twinkle",
            "Waddle",
            "Waddles",
            "Wiggle",
            "Wiggles",
            "Wobble",
            "Wobbles",
            "Xena",
        ]

        if gender is None or gender not in Grippli.GrippliType:
            gender = choice(list(Grippli.GrippliType))
        if gender == Grippli.GrippliType.Male:
            return choice(m1)

        else:  # Female
            return choice(f1)


class Halfling(Character):
    class HalflingType(Enum):
        Male = auto()
        Female = auto()

    @staticmethod
    def generate(gender: HalflingType = None):
        m1 = ["", "", "b", "br", "d", "f", "h", "j", "l", "m", "n", "p", "r", "s", "t", "tr", "v", "vr", "x"]
        m2 = ["a", "e", "i", "o", "u", "a", "e", "i", "o", "u", "a", "e", "i", "o", "u", "aa"]
        m3 = [
            "b",
            "b",
            "d",
            "d",
            "f",
            "f",
            "g",
            "g",
            "k",
            "k",
            "l",
            "l",
            "lb",
            "ld",
            "m",
            "m",
            "mr",
            "mg",
            "n",
            "n",
            "nd",
            "ng",
            "nk",
            "nt",
            "r",
            "r",
            "rb",
            "rc",
            "rg",
            "rr",
            "rk",
            "sg",
            "sk",
            "st",
            "v",
            "v",
            "x",
            "x",
        ]
        m4 = ["", "", "", "k", "l", "m", "n", "nd", "pp", "r", "rd", "rn", "s", "th"]
        f1 = ["", "", "", "b", "d", "f", "h", "j", "k", "l", "m", "n", "pr", "r", "s", "t", "v", "w", "y"]
        f2 = [
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "iu",
            "io",
            "oe",
            "ai",
            "ia",
            "ae",
        ]
        f3 = [
            "dg",
            "f",
            "f",
            "hs",
            "hr",
            "hn",
            "hj",
            "l",
            "l",
            "lc",
            "lk",
            "ll",
            "lm",
            "ln",
            "ld",
            "lr",
            "m",
            "m",
            "mb",
            "n",
            "n",
            "nt",
            "nth",
            "nr",
            "r",
            "r",
            "rl",
            "rr",
            "s",
            "s",
            "ss",
            "st",
            "str",
            "t",
            "t",
            "th",
            "tt",
            "v",
            "v",
            "y",
            "y",
            "z",
            "z",
        ]
        f4 = ["", "", "", "", "", "", "", "", "", "", "h", "l", "n", "s", "t", "th"]
        s1 = ["", "", "", "b", "bl", "c", "d", "f", "g", "gl", "gn", "h", "k", "kl", "n", "p", "r", "s", "t", "v", "vl"]
        s2 = [
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "y",
            "ia",
            "ae",
            "ea",
            "ai",
        ]
        s3 = [
            "bl",
            "br",
            "bbl",
            "dl",
            "dn",
            "dr",
            "ffl",
            "ggl",
            "gr",
            "gdd",
            "gn",
            "l",
            "ld",
            "lb",
            "lv",
            "ln",
            "lm",
            "lr",
            "lz",
            "lv",
            "m",
            "mb",
            "md",
            "n",
            "nd",
            "ng",
            "nb",
            "nv",
            "nch",
            "nd",
            "r",
            "rb",
            "rd",
            "rw",
            "s",
            "sr",
            "sb",
            "sd",
            "sl",
            "v",
            "vr",
            "vl",
            "wh",
            "zr",
            "zz",
        ]
        s4 = ["", "", "", "g", "l", "lk", "n", "nch", "nd", "r", "rd", "rg", "s", "th", "x"]
        s5 = [
            "Amber",
            "Arms",
            "Ash",
            "Autumn",
            "Bard",
            "Black",
            "Blaze",
            "Blossom",
            "Bright",
            "Bronze",
            "Cask",
            "Cinder",
            "Cliff",
            "Cloud",
            "Cold",
            "Common",
            "Coven",
            "Crag",
            "Dark",
            "Dawn",
            "Day",
            "Deep",
            "Dew",
            "Down",
            "Dream",
            "Dusk",
            "Dust",
            "Earth",
            "Even",
            "Ever",
            "Far",
            "Feather",
            "Fern",
            "Flame",
            "Flat",
            "Flint",
            "Fog",
            "Forest",
            "Free",
            "Frost",
            "Full",
            "Gold",
            "Grand",
            "Grass",
            "Gray",
            "Green",
            "Hard",
            "Haven",
            "Haze",
            "Heart",
            "High",
            "Hill",
            "Honor",
            "Humble",
            "Iron",
            "Keen",
            "Leaf",
            "Light",
            "Lone",
            "Long",
            "Low",
            "Meadow",
            "Mild",
            "Mist",
            "Moon",
            "Moss",
            "Never",
            "Night",
            "Noble",
            "Orb",
            "Pale",
            "Pine",
            "Plain",
            "Rain",
            "Red",
            "Rich",
            "River",
            "Rumble",
            "Shadow",
            "Silent",
            "Simple",
            "Single",
            "Snow",
            "Soft",
            "Spirit",
            "Spring",
            "Star",
            "Still",
            "Stone",
            "Summer",
            "Sun",
            "Swift",
            "Tree",
            "True",
            "Truth",
            "Turn",
            "Water",
            "Whit",
            "Wind",
            "Winter",
            "Wise",
            "Wood",
        ]
        s6 = [
            "arm",
            "beam",
            "bend",
            "blaze",
            "bloom",
            "blossom",
            "bough",
            "brace",
            "branch",
            "brand",
            "breath",
            "breeze",
            "brook",
            "brow",
            "cloud",
            "coin",
            "creek",
            "crest",
            "dew",
            "down",
            "draft",
            "dream",
            "fall",
            "flaw",
            "flow",
            "flower",
            "force",
            "gaze",
            "gazer",
            "gem",
            "glade",
            "gleam",
            "glide",
            "glow",
            "grain",
            "grip",
            "guard",
            "hair",
            "hand",
            "heart",
            "helm",
            "horn",
            "keep",
            "leaf",
            "less",
            "light",
            "more",
            "orb",
            "peak",
            "ridge",
            "root",
            "run",
            "shine",
            "shot",
            "soar",
            "song",
            "spark",
            "stream",
            "stride",
            "sun",
            "surge",
            "sword",
            "sworn",
            "thorn",
            "tide",
            "track",
            "vale",
            "valor",
            "ward",
            "water",
            "whirl",
            "wing",
            "with",
            "worth",
        ]

        name = ""
        if gender is None or gender not in Halfling.HalflingType:
            gender = choice(list(Halfling.HalflingType))
        if gender == Halfling.HalflingType.Male:
            if randrange(2) == 0:
                name += choice(m1) + choice(m2) + choice(m3) + choice(m2) + choice(m4)
            else:
                name += choice(m1) + choice(m2) + choice(m3) + choice(m2) + choice(m3) + choice(m2) + choice(m4)
        else:  # Female
            if randrange(2) == 0:
                name += choice(f1) + choice(f2) + choice(f3) + choice(f2) + choice(f4)
            else:
                name += choice(f1) + choice(f2) + choice(f3) + choice(f2) + choice(f3) + choice(f2) + choice(f4)

        c = randrange(2)
        if c == 0:
            name += " " + choice(s1) + choice(s2) + choice(f3) + choice(s2) + choice(s4)
        elif c == 1:
            name += " " + choice(s1) + choice(s2) + choice(s3) + choice(s2) + choice(f3) + choice(f2) + choice(f4)
        else:
            name += " " + choice(s5) + choice(s6)

        return name.title()


class Hobgoblin(Character):
    @staticmethod
    def generate():
        n1 = [
            "",
            "",
            "",
            "",
            "",
            "d",
            "dr",
            "g",
            "gl",
            "gr",
            "k",
            "kh",
            "kl",
            "kr",
            "l",
            "m",
            "n",
            "r",
            "rh",
            "sh",
            "v",
            "vr",
            "z",
            "zr",
        ]
        n2 = ["a", "o", "a", "o", "e", "u"]
        n3 = [
            "d",
            "dr",
            "g",
            "gr",
            "gn",
            "k",
            "kk",
            "kr",
            "kn",
            "kv",
            "ldr",
            "lv",
            "lz",
            "lvr",
            "nd",
            "ndr",
            "nk",
            "r",
            "rb",
            "rd",
            "rk",
            "v",
            "vr",
            "vl",
            "z",
            "zr",
        ]
        n4 = ["e", "e", "a", "o", "i", "u", "e", "a", "o"]
        n5 = ["d", "l", "n", "r", "v", "z"]
        n6 = ["a", "e", "o", "u"]
        n7 = ["c", "d", "g", "k", "l", "n", "r", "rg", "rz"]
        n8 = [
            "Bark",
            "Bash",
            "Bellow",
            "Bleed",
            "Blow",
            "Bolster",
            "Bolt",
            "Brawl",
            "Break",
            "Bruise",
            "Buckle",
            "Bully",
            "Burn",
            "Burst",
            "Butcher",
            "Cackle",
            "Carve",
            "Chomp",
            "Conquer",
            "Crash",
            "Crunch",
            "Crush",
            "Dash",
            "Devour",
            "Dodge",
            "Duel",
            "Edge",
            "Etch",
            "Feign",
            "Flail",
            "Flare",
            "Forge",
            "Froth",
            "Fume",
            "Glare",
            "Gnash",
            "Grimace",
            "Grin",
            "Growl",
            "Hook",
            "Impale",
            "Jolt",
            "Kill",
            "Lash",
            "Lurch",
            "Mangle",
            "Mark",
            "Maul",
            "Pierce",
            "Prowl",
            "Pummel",
            "Quake",
            "Rage",
            "Rebuke",
            "Reign",
            "Rend",
            "Repel",
            "Retch",
            "Revel",
            "Roam",
            "Ruin",
            "Rush",
            "Saw",
            "Scorch",
            "Scrub",
            "Seethe",
            "Sever",
            "Shock",
            "Shred",
            "Slay",
            "Smirk",
            "Smush",
            "Snarl",
            "Squish",
            "Stalk",
            "Sting",
            "Stomp",
            "Strike",
            "Stunt",
            "Swipe",
            "Thrash",
            "Thunder",
            "Trail",
            "Trample",
            "Twist",
            "Twitch",
            "Vex",
            "Whack",
            "the Beast",
            "the Behemoth",
            "the Blade",
            "the Boar",
            "the Bold",
            "the Brute",
            "the Bull",
            "the Butcher",
            "the Cold",
            "the Corrupt",
            "the Cruel",
            "the Dagger",
            "the Demon",
            "the Edge",
            "the Fury",
            "the Giant",
            "the Grand",
            "the Grim",
            "the Harsh",
            "the Hollow",
            "the Hook",
            "the Hungry",
            "the Hunter",
            "the Insane",
            "the Knife",
            "the Loud",
            "the Mad",
            "the Maniac",
            "the Manslayer",
            "the Marked",
            "the Mask",
            "the Mighty",
            "the Monster",
            "the Oaf",
            "the Ox",
            "the Razor",
            "the Reckless",
            "the Red",
            "the Rogue",
            "the Rotten",
            "the Sabre",
            "the Serpent",
            "the Shallow",
            "the Shank",
            "the Shield",
            "the Shiv",
            "the Skeleton",
            "the Slayer",
            "the Snake",
            "the Strong",
            "the Sword",
            "the Thief",
            "the Tyrant",
            "the Vengeful",
            "the Vicious",
            "the Violent",
            "the Vulture",
            "the Warlord",
            "the Warmonger",
            "the Warrior",
            "the Watcher",
            "the Wrath",
            "the Wretched",
        ]

        if randrange(2) == 0:
            name = choice(n1) + choice(n2) + choice(n3) + choice(n6) + choice(n7)
        else:
            name = choice(n1) + choice(n2) + choice(n3) + choice(n4) + choice(n5) + choice(n6) + choice(n7)

        if randrange(2) == 0:
            name += " " + choice(n8)

        return name.title()


class Human(Character):
    class HumanType(Enum):
        Male = auto()
        Female = auto()

    @staticmethod
    def generate(gender: HumanType = None):
        f1 = [
            "",
            "",
            "",
            "",
            "",
            "b",
            "bj",
            "br",
            "f",
            "fr",
            "g",
            "gr",
            "h",
            "hr",
            "hj",
            "j",
            "k",
            "kr",
            "m",
            "r",
            "s",
            "st",
            "sv",
            "sk",
            "t",
            "th",
            "v",
            "y",
        ]
        f2 = [
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "au",
            "ei",
            "uu",
            "ae",
        ]
        f3 = [
            "bj",
            "d",
            "ddv",
            "dg",
            "dm",
            "dv",
            "g",
            "gb",
            "gbj",
            "gf",
            "gg",
            "gn",
            "gnv",
            "k",
            "ks",
            "lb",
            "lbj",
            "ld",
            "ldm",
            "lk",
            "ll",
            "lld",
            "m",
            "n",
            "nd",
            "ng",
            "ngv",
            "nk",
            "nn",
            "nv",
            "p",
            "r",
            "rg",
            "rl",
            "rn",
            "rnl",
            "rr",
            "rs",
            "rt",
            "rv",
            "sg",
            "sk",
            "st",
            "th",
            "tv",
            "v",
            "w",
            "x",
            "z",
        ]
        f4 = [
            "",
            "",
            "",
            "",
            "c",
            "d",
            "f",
            "g",
            "gg",
            "gr",
            "k",
            "ld",
            "lf",
            "lfr",
            "ll",
            "m",
            "n",
            "nd",
            "ndr",
            "nn",
            "r",
            "rk",
            "rl",
            "rn",
            "rr",
            "rth",
            "st",
            "t",
        ]
        m1 = [
            "",
            "",
            "",
            "",
            "",
            "b",
            "br",
            "d",
            "dr",
            "f",
            "fr",
            "g",
            "gr",
            "h",
            "j",
            "k",
            "l",
            "lj",
            "m",
            "n",
            "r",
            "s",
            "sv",
            "th",
            "t",
            "v",
        ]
        m2 = [
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "y",
            "y",
            "au",
            "ie",
            "ae",
        ]
        m3 = [
            "bj",
            "d",
            "df",
            "dg",
            "dh",
            "dl",
            "dn",
            "dr",
            "fl",
            "g",
            "gd",
            "gn",
            "gv",
            "ld",
            "lk",
            "ll",
            "llg",
            "lv",
            "m",
            "n",
            "nd",
            "nfr",
            "ng",
            "nj",
            "nng",
            "nnv",
            "r",
            "rd",
            "rf",
            "rg",
            "rgr",
            "rl",
            "rn",
            "sfr",
            "sg",
            "sl",
            "str",
            "th",
            "thr",
        ]
        m4 = [
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "d",
            "f",
            "g",
            "ld",
            "lf",
            "n",
            "nn",
            "rd",
            "rg",
            "s",
            "th",
        ]
        s1 = [
            "Amber",
            "Arm",
            "Ash",
            "Autumn",
            "Battle",
            "Bear",
            "Black",
            "Blaze",
            "Blood",
            "Boar",
            "Boulder",
            "Brawl",
            "Bright",
            "Bronze",
            "Bull",
            "Cinder",
            "Cloud",
            "Cold",
            "Common",
            "Dark",
            "Dawn",
            "Dead",
            "Doom",
            "Dream",
            "Dusk",
            "Dust",
            "Ember",
            "Even",
            "Fine",
            "Forest",
            "Free",
            "Frost",
            "Frozen",
            "Gloom",
            "Gold",
            "Grand",
            "Great",
            "Grim",
            "Grizzly",
            "Hallow",
            "Hell",
            "High",
            "Honey",
            "Horn",
            "Ice",
            "Iron",
            "Keen",
            "Light",
            "Lone",
            "Long",
            "Mighty",
            "Mist",
            "Moss",
            "Mountain",
            "Night",
            "Noble",
            "Pale",
            "Plain",
            "Pride",
            "Proud",
            "Quick",
            "Rage",
            "Rapid",
            "Raven",
            "River",
            "Rock",
            "Rune",
            "Shadow",
            "Sharp",
            "Silent",
            "Silver",
            "Smoke",
            "Snow",
            "Soft",
            "Spirit",
            "Star",
            "Steel",
            "Stone",
            "Storm",
            "Strong",
            "Summer",
            "Swift",
            "Thunder",
            "Troll",
            "True",
            "War",
            "Wild",
            "Wind",
            "Winter",
            "Wolf",
        ]
        s2 = [
            "arm",
            "arrow",
            "bane",
            "bash",
            "bear",
            "blade",
            "brace",
            "brand",
            "breaker",
            "breath",
            "brew",
            "caller",
            "cleaver",
            "crest",
            "crusher",
            "cut",
            "cutter",
            "dream",
            "eye",
            "eyes",
            "fall",
            "fire",
            "fist",
            "flame",
            "force",
            "forge",
            "fury",
            "gaze",
            "gleam",
            "grip",
            "guard",
            "hair",
            "hall",
            "hammer",
            "hand",
            "heart",
            "hunter",
            "killer",
            "lash",
            "mane",
            "mantle",
            "mark",
            "maul",
            "rage",
            "reaper",
            "reaver",
            "rider",
            "ripper",
            "roar",
            "rock",
            "root",
            "scar",
            "scream",
            "shield",
            "shout",
            "slayer",
            "snarl",
            "song",
            "spirit",
            "splitter",
            "star",
            "stride",
            "sun",
            "sword",
            "thorn",
            "tongue",
            "walker",
            "ward",
            "watcher",
            "wind",
            "wine",
            "wolf",
        ]

        name = ""
        if gender is None or gender not in Human.HumanType:
            gender = choice(list(Human.HumanType))
        if gender == Human.HumanType.Male:
            name += choice(m1) + choice(m2) + choice(m3)
            if randrange(2) == 1:
                name += choice(m2) + choice(m3)
            name += choice(m4)

        else:  # Female
            name += choice(f1) + choice(f2) + choice(f3)
            if randrange(2) == 1:
                name += choice(f2) + choice(f3)
            name += choice(f4)

        # Last Name
        name += " " + choice(s1) + choice(s2)

        return name.title()


class Ifrit(Character):
    class IfritType(Enum):
        Male = auto()
        Female = auto()

    @staticmethod
    def generate(gender: IfritType = None):
        m1 = ["", "", "", "", "b", "d", "g", "j", "k", "m", "n", "r", "t", "v", "z"]
        m2 = ["a", "e", "i", "u"]
        m3 = ["c", "f", "g", "j", "k", "l", "m", "n", "q", "r", "v"]
        m4 = ["", "", "", "d", "g", "h", "j", "l", "m", "n", "q", "t"]
        f1 = ["", "", "", "c", "f", "g", "h", "l", "m", "n", "q", "s", "w", "z"]
        f2 = ["a", "e", "i"]
        f3 = [
            "d",
            "dw",
            "dr",
            "h",
            "l",
            "lr",
            "ly",
            "m",
            "ml",
            "mr",
            "n",
            "nr",
            "nl",
            "q",
            "qh",
            "qr",
            "r",
            "rh",
            "ry",
            "rl",
            "t",
            "ty",
            "th",
            "tw",
            "tr",
            "w",
            "y",
        ]
        f4 = ["", "", "", "", "", "", "", "", "h", "n", "s"]

        name = ""
        if gender is None or gender not in Ifrit.IfritType:
            gender = choice(list(Ifrit.IfritType))
        if gender == Ifrit.IfritType.Male:
            if randrange(2) == 0:
                name += choice(m1) + choice(m2) + choice(m3) + choice(m2) + choice(m4)
            else:
                name += choice(m1) + choice(m2) + choice(m3) + choice(m2) + choice(m3) + choice(m2) + choice(m4)
        else:  # Female
            if randrange(2) == 0:
                name += choice(f1) + choice(f2) + choice(f3) + choice(f2) + choice(f4)
            else:
                name += choice(f1) + choice(f2) + choice(f3) + choice(f2) + choice(f3) + choice(f2) + choice(f4)

        return name.title()


class Kashrishi(Character):
    @staticmethod
    def generate():
        n1 = [
            "Adept",
            "Agent",
            "Alchemist",
            "Archer",
            "Audience",
            "Autumn",
            "Bard",
            "Beam",
            "Beauty",
            "Border",
            "Brasshorn",
            "Brave",
            "Brawler",
            "Bridge",
            "Brother",
            "Candle",
            "Canvas",
            "Challenge",
            "Chameleon",
            "Champion",
            "Chance",
            "Chaos",
            "Charity",
            "Child",
            "Clarity",
            "Cleric",
            "Climber",
            "Clock",
            "Cloud",
            "Cold",
            "Comfort",
            "Concern",
            "Conflict",
            "Conjurer",
            "Constant",
            "Corsair",
            "Courage",
            "Creative",
            "Creator",
            "Crusader",
            "Curious",
            "Cushion",
            "Dancer",
            "Darkness",
            "Day",
            "Defender",
            "Designer",
            "Disaster",
            "Discoverer",
            "Disturbance",
            "Doctor",
            "Dreamer",
            "Druid",
            "Duty",
            "Elementalist",
            "Emissary",
            "Enchanter",
            "Engineer",
            "Eternal",
            "Explorer",
            "Family",
            "Father",
            "Firehorn",
            "Flame",
            "Fluke",
            "Focused",
            "Fortunate",
            "Fortune",
            "Free",
            "Friend",
            "Frosthorn",
            "Future",
            "Gardener",
            "Gentle",
            "Gentlehand",
            "Giant",
            "Gladiator",
            "Good",
            "Great",
            "Greatheart",
            "Grimoire",
            "Guard",
            "Guardian",
            "Happy",
            "Harbinger",
            "Healer",
            "Heart",
            "Hearth",
            "Home",
            "Honest",
            "Honor",
            "Hunter",
            "Illusionist",
            "Impulse",
            "Jester",
            "Joker",
            "Journey",
            "Justice",
            "Keeneyes",
            "Kind",
            "Knight",
            "Knowledge",
            "Lantern",
            "Laughter",
            "Leader",
            "Light",
            "Living",
            "Loyal",
            "Lucky",
            "Marble",
            "Mask",
            "Might",
            "Mirror",
            "Mother",
            "Mountain",
            "Music",
            "Mystic",
            "Navigator",
            "Night",
            "Omen",
            "Oracle",
            "Paladin",
            "Paragon",
            "Passage",
            "Passenger",
            "Passion",
            "Past",
            "Pathfinder",
            "Patient",
            "Pirate",
            "Play",
            "Poem",
            "Poet",
            "Possiblity",
            "Pride",
            "Prism",
            "Prize",
            "Promise",
            "Prophet",
            "Purpose",
            "Question",
            "Ranger",
            "Ravager",
            "Redemption",
            "Reflection",
            "Regret",
            "Relief",
            "Reward",
            "Riches",
            "Riddle",
            "Risk",
            "River",
            "Ruin",
            "Rumor",
            "Safe",
            "Safety",
            "Scout",
            "Secret",
            "Service",
            "Shadow",
            "Shield",
            "Shining",
            "Sibling",
            "Singer",
            "Skyguard",
            "Smile",
            "Smoke",
            "Softhand",
            "Song",
            "Sorcerer",
            "Sorrow",
            "Spark",
            "Spirit",
            "Spring",
            "Storm",
            "Strange",
            "Stranger",
            "Stronghand",
            "Struggle",
            "Student",
            "Success",
            "Summer",
            "Surprise",
            "Sword",
            "Teacher",
            "Tempest",
            "Thrill",
            "Throne",
            "Thunder",
            "Tomorrow",
            "Tree",
            "Victory",
            "Warden",
            "Warmth",
            "Warrior",
            "Weaver",
            "Winter",
            "Witch",
            "Yesterday",
        ]

        return choice(n1)


class Kitsune(Character):
    class KitsuneType(Enum):
        Male = auto()
        Female = auto()

    @staticmethod
    def generate(gender: KitsuneType = None):
        f1 = [
            "",
            "",
            "",
            "a",
            "j",
            "k",
            "m",
            "a",
            "sh",
            "s",
        ]
        f2 = [
            "y",
            "i",
            "u",
            "a",
        ]
        f3 = [
            "k",
            "j",
            "m",
            "n",
            "l",
            "ll",
        ]
        f4 = [
            "",
            "",
            "",
            "ki",
            "li",
            "ro",
            "ra",
            "ry",
            "i",
            "mi",
            "mo",
        ]
        m1 = [
            "",
            "",
            "",
            "ch",
            "im",
            "k",
            "n",
            "m",
            "ya",
            "j",
        ]
        m2 = ["y", "i", "u", "a", "o", "oo", "e", "ee"]
        m3 = [
            "nk",
            "n",
            "k",
            "rs",
            "s",
            "r",
            "m",
            "mm",
        ]
        m4 = [
            "",
            "",
            "",
            "tu",
            "ru",
            "ku",
            "su",
            "ty",
            "ky",
            "sy",
            "ry",
        ]

        name = ""
        if gender is None or gender not in Kitsune.KitsuneType:
            gender = choice(list(Kitsune.KitsuneType))
        if gender == Kitsune.KitsuneType.Male:
            if randrange(2) == 0:
                name += choice(m1) + choice(m2) + choice(m3) + choice(m2) + choice(m4)
            else:
                name += choice(m1) + choice(m2) + choice(m3) + choice(m2) + choice(m3) + choice(m2) + choice(m4)
        else:  # Female
            if randrange(2) == 0:
                name += choice(f1) + choice(f2) + choice(f3) + choice(f2) + choice(f4)
            else:
                name += choice(f1) + choice(f2) + choice(f3) + choice(f2) + choice(f3) + choice(f2) + choice(f4)

        return name.title()


class Kobold(Character):
    class KoboldType(Enum):
        Male = auto()
        Female = auto()

    @staticmethod
    def generate(gender: KoboldType = None):
        m1 = [
            "",
            "",
            "",
            "",
            "",
            "br",
            "cr",
            "dr",
            "d",
            "dh",
            "g",
            "gh",
            "gr",
            "j",
            "k",
            "m",
            "n",
            "q",
            "qr",
            "r",
            "rh",
            "v",
            "vr",
            "vh",
            "z",
        ]
        m2 = [
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "i",
            "o",
            "a",
            "i",
            "o",
            "aa",
            "ea",
            "oo",
            "ee",
        ]
        m3 = [
            "d",
            "dd",
            "dr",
            "dz",
            "dh",
            "gn",
            "gm",
            "gr",
            "gz",
            "gh",
            "k",
            "kk",
            "kn",
            "kz",
            "km",
            "kr",
            "l",
            "lz",
            "ll",
            "lr",
            "ld",
            "ln",
            "m",
            "mk",
            "mz",
            "n",
            "nz",
            "nr",
            "pm",
            "pz",
            "pr",
            "r",
            "rl",
            "rn",
            "rm",
            "rg",
            "rk",
            "rd",
            "rz",
            "rr",
            "t",
            "tr",
            "tz",
            "x",
            "zh",
            "z",
            "zz",
            "zr",
            "zk",
        ]
        m4 = ["", "", "", "", "", "b", "d", "g", "k", "l", "ld", "lk", "lp", "n", "nk", "p", "rk", "s", "sk", "x"]
        f1 = ["", "", "", "", "d", "f", "g", "h", "l", "m", "n", "p", "r", "s", "t", "v", "z"]
        f2 = [
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "o",
            "a",
            "o",
            "a",
            "o",
            "aa",
            "ia",
            "ai",
            "ee",
        ]
        f3 = [
            "d",
            "dk",
            "dr",
            "gr",
            "gl",
            "g",
            "h",
            "hr",
            "k",
            "kr",
            "kkr",
            "ks",
            "l",
            "lr",
            "lk",
            "ls",
            "r",
            "rk",
            "rs",
            "rg",
            "rl",
            "s",
            "ss",
            "sr",
            "sk",
            "sg",
            "sgr",
            "skr",
            "ssr",
            "tr",
            "th",
            "thr",
            "z",
            "zr",
            "zk",
            "zn",
            "zl",
        ]
        f4 = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "h", "k", "l", "n", "m", "r", "s"]

        name = ""
        if gender is None or gender not in Kobold.KoboldType:
            gender = choice(list(Kobold.KoboldType))
        if gender == Kobold.KoboldType.Male:
            if randrange(2) == 0:
                name += choice(m1) + choice(m2) + choice(m3) + choice(m2) + choice(m4)
            else:
                name += choice(m1) + choice(m2) + choice(m3) + choice(m2) + choice(m3) + choice(m2) + choice(m4)
        else:
            if randrange(2) == 0:
                name += choice(f1) + choice(f2) + choice(f3) + choice(f2) + choice(f4)
            else:
                name += choice(f1) + choice(f2) + choice(f3) + choice(f2) + choice(f3) + choice(f2) + choice(f4)

        return name.title()


class Leshy(Character):
    @staticmethod
    def generate():
        n1 = [
            "Amber",
            "Azure",
            "Bronze",
            "Cardinal",
            "Cerulean",
            "Copper",
            "Crimson",
            "Emerald",
            "Golden",
            "Indigo",
            "Ivory",
            "Jade",
            "Lavender",
            "Magenta",
            "Maroon",
            "Rose",
            "Ruby",
            "Saffron",
            "Sanguine",
            "Sapphire",
            "Scarlet",
            "Silver",
            "Teal",
            "Verdant",
            "Violet",
            "Viridian",
            "Ancient",
            "Blissful",
            "Brave",
            "Broken",
            "Bruised",
            "Carefree",
            "Cheeky",
            "Cheerful",
            "Clumsy",
            "Curious",
            "Defiant",
            "Evasive",
            "Evergreen",
            "Fierce",
            "Fragile",
            "Fragrant",
            "Gentle",
            "Handsome",
            "Hasty",
            "Honest",
            "Humble",
            "Idle",
            "Jovial",
            "Juvenile",
            "Lazy",
            "Lone",
            "Loyal",
            "Lucky",
            "Mad",
            "Mellow",
            "Merry",
            "Mysterious",
            "Nebulous",
            "Nimble",
            "Odd",
            "Outstanding",
            "Passionate",
            "Playful",
            "Pleasant",
            "Powerful",
            "Precious",
            "Protective",
            "Proud",
            "Quick",
            "Quiet",
            "Radiant",
            "Reckless",
            "Serene",
            "Short",
            "Silent",
            "Skillful",
            "Smiling",
            "Snowy",
            "Somber",
            "Sparkling",
            "Strange",
            "Superior",
            "Talented",
            "Tiny",
            "Tranquil",
            "Turbulent",
            "Vagabond",
            "Vibrant",
            "Voiceless",
            "Volatile",
            "Watchful",
        ]
        n2 = [
            "in Summer",
            "in Winter",
            "in Autumn",
            "in Spring",
            "Air",
            "Autumn",
            "Beach",
            "Bubble",
            "Cloud",
            "Color",
            "Dew",
            "Dirt",
            "Dust",
            "Faith",
            "Fate",
            "Flame",
            "Fog",
            "Frost",
            "Gift",
            "Gold",
            "Grace",
            "Hope",
            "Ice",
            "Iron",
            "Lake",
            "Life",
            "Light",
            "Love",
            "Might",
            "Mist",
            "Moon",
            "Mud",
            "Peace",
            "Plant",
            "Pond",
            "Rain",
            "River",
            "Rock",
            "Sand",
            "Sea",
            "Shade",
            "Shadow",
            "Smoke",
            "Snow",
            "Soil",
            "Song",
            "Spell",
            "Spring",
            "Storm",
            "Summer",
            "Sun",
            "Tale",
            "Thrill",
            "Thunder",
            "Time",
            "Trick",
            "Truth",
            "Warmth",
            "Water",
            "Wave",
            "Web",
            "Wind",
            "Winter",
        ]
        n3 = [
            "babbler",
            "basker",
            "bather",
            "binder",
            "blender",
            "breather",
            "catcher",
            "changer",
            "chaser",
            "dancer",
            "dasher",
            "defender",
            "dreamer",
            "drifter",
            "drinker",
            "fetcher",
            "finder",
            "former",
            "gardener",
            "giver",
            "harvester",
            "heaper",
            "hoarder",
            "holder",
            "hunter",
            "leaper",
            "lifter",
            "listener",
            "marcher",
            "mender",
            "nestler",
            "painter",
            "rambler",
            "reader",
            "roamer",
            "runner",
            "shifter",
            "singer",
            "sketcher",
            "sleeper",
            "soother",
            "summoner",
            "tamer",
            "tender",
            "walker",
            "weaver",
        ]
        n4 = [
            "Acacia",
            "Alder",
            "Ash",
            "Aspen",
            "Azalea",
            "Balsa",
            "Bamboo",
            "Baobab",
            "Bayonet",
            "Beech",
            "Birch",
            "Box",
            "Buckeye",
            "Buckthorn",
            "Bunya",
            "Bush",
            "Cassava",
            "Catalpa",
            "Cedar",
            "Conifer",
            "Cycad",
            "Cypress",
            "Elder",
            "Elm",
            "Eucalyptus",
            "Fir",
            "Hawthorn",
            "Hazel",
            "Hemlock",
            "Hickory",
            "Holly",
            "Hornbeam",
            "Juniper",
            "Larch",
            "Leaf",
            "Locust",
            "Magnolia",
            "Mahogany",
            "Mangrove",
            "Maple",
            "Medlar",
            "Milkbark",
            "Oak",
            "Oleander",
            "Palm",
            "Palmetto",
            "Persimmon",
            "Pine",
            "Poplar",
            "Privet",
            "Rhododendron",
            "Rowan",
            "Sequoia",
            "Spruce",
            "Strongbark",
            "Sumac",
            "Sycamore",
            "Tree",
            "Viburnum",
            "Willow",
            "Wood",
            "Yew",
            "Yucca",
        ]
        n5 = ["Bark", "Branch", "Bud", "Child", "Crown", "Leaf", "Root", "Sapling", "Trunk", "Twig"]

        c = randrange(4)
        if c == 0:
            return choice(n1) + " " + choice(n2)
        elif c == 1:
            return choice(n1) + " " + choice(n2) + " " + choice(n3)
        elif c == 2:
            return choice(n4) + " " + choice(n5)
        else:
            return choice(n1) + " " + choice(n4) + " " + choice(n5)


class Lizardfolk(Character):
    @staticmethod
    def generate():
        n1 = ["", "", "", "b", "d", "g", "h", "k", "n", "r", "sh", "t", "z"]
        n2 = ["a", "e", "i", "u"]
        n3 = [
            "gz",
            "l",
            "l",
            "lr",
            "lz",
            "lk",
            "n",
            "n",
            "nk",
            "nz",
            "nsh",
            "r",
            "r",
            "rr",
            "rsh",
            "rsk",
            "rzk",
            "s",
            "sh",
            "shk",
            "ss",
            "ss",
            "t",
            "t",
            "z",
            "z",
            "zk",
        ]
        n4 = ["g", "k", "n", "r", "sh", "t", "z"]
        n5 = ["", "", "g", "m", "k", "r", "sh", "shk"]

        if randrange(2) == 0:
            return str(choice(n1) + choice(n2) + choice(n3) + choice(n2) + choice(n5)).title()
        else:
            return str(choice(n1) + choice(n2) + choice(n3) + choice(n2) + choice(n4) + choice(n2) + choice(n5)).title()


class Merfolk(Character):
    class MerfolkType(Enum):
        Male = auto()
        Female = auto()

    @staticmethod
    def generate(gender: MerfolkType = None):
        f1 = ["d", "g", "j", "n", "s", "t", "v", "z"]
        f2 = ["a", "e", "i", "o", "a", "e", "i", "o", "u"]
        f3 = [
            "d",
            "dd",
            "dr",
            "fr",
            "fl",
            "l",
            "ll",
            "lr",
            "ln",
            "n",
            "nn",
            "nd",
            "r",
            "rd",
            "rz",
            "rs",
            "rv",
            "t",
            "tt",
            "tr",
            "y",
            "z",
            "zz",
        ]
        f4 = ["d", "g", "gg", "l", "n", "nd", "ng", "t"]
        m1 = ["", "", "", "c", "g", "h", "j", "k", "l", "m", "n", "t", "th"]
        m2 = ["a", "a", "i", "o", "o", "u"]
        m3 = ["d", "l", "m", "n", "r", "s", "t", "z"]
        m4 = ["d", "h", "l", "m", "n", "r", "y"]
        s1 = [
            "Adept",
            "Ambassador",
            "Angler",
            "Apothecary",
            "Assassin",
            "Bouncer",
            "Commander",
            "Disciple",
            "Diver",
            "Douser",
            "Drowner",
            "Elite",
            "Entangler",
            "Explorer",
            "Fighter",
            "Fluxmage",
            "Guard",
            "Guardian",
            "Guide",
            "Harbinger",
            "Hero",
            "Hunter",
            "Hypnotist",
            "Illusionist",
            "Infiltrator",
            "Knight",
            "Legate",
            "Mage",
            "Mentor",
            "Merchant",
            "Merfolk",
            "Mesmerist",
            "Mystic",
            "Patrol",
            "Pilferer",
            "Priest",
            "Prophet",
            "Raider",
            "Rider",
            "Sage",
            "Scout",
            "Scryer",
            "Seer",
            "Selkie",
            "Sentinel",
            "Shaman",
            "Spy",
            "Stalker",
            "Summoner",
            "Thief",
            "Tracker",
            "Trader",
            "Trapper",
            "Trasher",
            "Triton",
            "Visionary",
            "Warrior",
            "Watch",
            "Weaver",
            "bar",
            "bend",
            "bender",
            "bind",
            "binder",
            "bough",
            "bow",
            "brand",
            "breath",
            "breeze",
            "brine",
            "brook",
            "brooke",
            "brow",
            "caller",
            "channel",
            "crag",
            "crash",
            "creek",
            "crest",
            "dancer",
            "dew",
            "dream",
            "dreamer",
            "fallow",
            "fathom",
            "fin",
            "flow",
            "front",
            "gabber",
            "gill",
            "glade",
            "glide",
            "helm",
            "line",
            "might",
            "more",
            "rider",
            "ridge",
            "river",
            "sage",
            "scape",
            "seeker",
            "shaper",
            "shard",
            "shine",
            "sigh",
            "singer",
            "soar",
            "spanner",
            "spout",
            "stand",
            "stream",
            "surge",
            "sworn",
            "tail",
            "tide",
            "trapper",
            "tread",
            "vigor",
            "wake",
            "ward",
            "water",
            "weaver",
            "wine",
            "Abyss",
            "Abyssal",
            "Agile",
            "Arctic",
            "Atoll",
            "Azure",
            "Barrier",
            "Basin",
            "Bay",
            "Brave",
            "Buoyant",
            "Cape",
            "Careful",
            "Careless",
            "Coral",
            "Coven",
            "Darting",
            "Defiant",
            "Depth",
            "Diligent",
            "Diving",
            "Enclave",
            "Energetic",
            "Esteemed",
            "Exalted",
            "Expanse",
            "Experienced",
            "Fearless",
            "Gifted",
            "Glorious",
            "Grand",
            "Gulf",
            "Harbor",
            "Hasty",
            "Intrepid",
            "Jolting",
            "Juvenile",
            "Keen",
            "Lagoon",
            "Marine",
            "Maritime",
            "Nautical",
            "Nimble",
            "Oceanic",
            "Prime",
            "Prism",
            "Radiant",
            "Reckless",
            "Reef",
            "Salty",
            "Shore",
            "Slippery",
            "Stark",
            "Storm",
            "Surf",
            "Surfing",
            "Surge",
            "Swift",
            "Tidal",
            "Tide",
            "Turbulent",
            "Vicious",
            "Vigilant",
            "Void",
            "Wake",
            "Wave",
            "Webbed",
            "Wharf",
            "Whirlpool",
            "Wild",
            "Zealous",
            "azure",
            "blue",
            "bright",
            "clear",
            "cloud",
            "coral",
            "coven",
            "crystal",
            "deep",
            "depth",
            "down",
            "dream",
            "fallow",
            "fore",
            "grand",
            "gravel",
            "haze",
            "ink",
            "keen",
            "light",
            "low",
            "mellow",
            "mer",
            "mild",
            "moon",
            "night",
            "ocean",
            "orb",
            "pale",
            "prism",
            "pure",
            "razor",
            "rip ",
            "root",
            "rough",
            "sand",
            "sea",
            "shadow",
            "shore",
            "silver",
            "soft",
            "star",
            "storm",
            "strong",
            "surge",
            "swift",
            "tidal",
            "tide",
            "void",
            "wake",
            "wander",
            "water",
            "wave",
            "well",
            "whit",
            "wild",
            "wind",
        ]

        name = ""
        if gender is None or gender not in Merfolk.MerfolkType:
            gender = choice(list(Merfolk.MerfolkType))
        if gender == Merfolk.MerfolkType.Male:
            if randrange(2) == 0:
                name += choice(m1) + choice(m2) + choice(m3) + choice(m2) + choice(m4)
            else:
                name += choice(m1) + choice(m2) + choice(m3) + choice(m2) + choice(m3) + choice(m2) + choice(m4)
        else:  # Female
            if randrange(2) == 0:
                name += choice(f1) + choice(f2) + choice(f3) + choice(f2) + choice(f4)
            else:
                name += choice(f1) + choice(f2) + choice(f3) + choice(f2) + choice(f3) + choice(f2) + choice(f4)

        return name.title() + " " + choice(s1)


class Nagaji(Character):
    class NagajiType(Enum):
        Male = auto()
        Female = auto()

    @staticmethod
    def generate(gender: NagajiType = None):
        f1 = [
            "",
            "",
            "",
            "",
            "",
            "",
            "ch",
            "d",
            "dh",
            "dhr",
            "h",
            "hr",
            "j",
            "jy",
            "k",
            "kh",
            "kr",
            "ksh",
            "l",
            "m",
            "n",
            "p",
            "pr",
            "s",
            "sr",
            "t",
            "v",
            "vr",
        ]
        f2 = ["a", "e", "i", "o", "u", "a", "a", "a", "a", "a", "a", "i", "i"]
        f3 = [
            "bh",
            "d",
            "g",
            "h",
            "j",
            "k",
            "l",
            "m",
            "n",
            "p",
            "r",
            "s",
            "t",
            "v",
            "y",
            "bh",
            "d",
            "dg",
            "dh",
            "dhy",
            "dm",
            "dr",
            "g",
            "h",
            "hl",
            "hy",
            "j",
            "k",
            "kh",
            "ksh",
            "ky",
            "l",
            "lm",
            "lw",
            "m",
            "mkh",
            "mv",
            "mvr",
            "n",
            "nd",
            "ndh",
            "ng",
            "nj",
            "nkh",
            "nm",
            "nshtr",
            "nt",
            "nth",
            "p",
            "pt",
            "r",
            "rd",
            "rk",
            "rm",
            "rn",
            "rt",
            "ry",
            "s",
            "sh",
            "shk",
            "shm",
            "shn",
            "shp",
            "shth",
            "shtr",
            "sr",
            "st",
            "sth",
            "sw",
            "t",
            "th",
            "tr",
            "tt",
            "ttr",
            "ty",
            "v",
            "vy",
            "y",
            "yl",
        ]
        f4 = ["a", "a", "a", "a", "a", "a", "a", "a", "a", "i", "u", "as", "at"]
        m1 = [
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "c",
            "cr",
            "ch",
            "d",
            "h",
            "k",
            "kr",
            "kh",
            "l",
            "r",
            "s",
            "s",
            "s",
            "sh",
            "sz",
            "sc",
            "sy",
            "sz",
            "sh",
            "t",
            "th",
            "x",
            "y",
            "z",
            "zs",
            "zh",
        ]
        m2 = [
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "aa",
            "ai",
            "ee",
            "ei",
            "ie",
        ]
        m3 = [
            "c",
            "d",
            "dh",
            "k",
            "kh",
            "l",
            "r",
            "s",
            "sh",
            "t",
            "th",
            "x",
            "xh",
            "z",
            "zh",
            "c",
            "d",
            "k",
            "l",
            "r",
            "s",
            "t",
            "x",
            "z",
            "c",
            "d",
            "k",
            "l",
            "r",
            "s",
            "t",
            "x",
            "z",
            "s",
            "s",
            "sh",
            "sh",
            "cc",
            "ch",
            "ck",
            "cs",
            "csh",
            "cz",
            "dh",
            "dj",
            "kk",
            "kh",
            "ks",
            "ksh",
            "kz",
            "ll",
            "lh",
            "lz",
            "ls",
            "rr",
            "rc",
            "rg",
            "rh",
            "rj",
            "rs",
            "rsh",
            "rz",
            "rsz",
            "rt",
            "rth",
            "rc",
            "rk",
            "ss",
            "sc",
            "sh",
            "sk",
            "sz",
            "sy",
            "th",
            "tr",
            "ts",
            "tz",
            "tsh",
            "xh",
            "xs",
            "xz",
            "zh",
            "zs",
            "zz",
            "zs",
        ]
        m4 = [
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "kh",
            "l",
            "r",
            "s",
            "sj",
            "ss",
            "sh",
            "sz",
            "t",
            "th",
            "x",
            "z",
            "zs",
        ]

        name = ""
        if gender is None or gender not in Nagaji.NagajiType:
            gender = choice(list(Nagaji.NagajiType))
        if gender == Nagaji.NagajiType.Male:
            if randrange(2) == 0:
                name += choice(m1) + choice(m2) + choice(m3) + choice(m2) + choice(m4)
            else:
                name += choice(m1) + choice(m2) + choice(m3) + choice(m2) + choice(m3) + choice(m2) + choice(m4)
        else:  # Female
            if randrange(2) == 0:
                name += choice(f1) + choice(f2) + choice(f3) + choice(f2) + choice(f4)
            else:
                name += choice(f1) + choice(f2) + choice(f3) + choice(f2) + choice(f3) + choice(f2) + choice(f4)

        return name.title()


class Orc(Character):
    class OrcType(Enum):
        Male = auto()
        Female = auto()

    @staticmethod
    def generate(gender: OrcType = None):
        m1 = [
            "",
            "",
            "",
            "b",
            "bh",
            "br",
            "d",
            "dh",
            "dr",
            "g",
            "gh",
            "gr",
            "j",
            "l",
            "m",
            "n",
            "r",
            "rh",
            "sh",
            "z",
            "zh",
        ]
        m2 = ["a", "o", "u"]
        m3 = [
            "b",
            "br",
            "bz",
            "d",
            "dd",
            "dz",
            "dg",
            "dr",
            "g",
            "gg",
            "gr",
            "gz",
            "gv",
            "hr",
            "hz",
            "j",
            "kr",
            "kz",
            "m",
            "mz",
            "mv",
            "n",
            "ng",
            "nd",
            "nz",
            "r",
            "rt",
            "rz",
            "rd",
            "rl",
            "rz",
            "t",
            "tr",
            "v",
            "vr",
            "z",
            "zz",
        ]
        m4 = ["b", "d", "g", "g", "k", "k", "kk", "kk", "l", "ll", "n", "r"]
        f1 = ["", "", "", "", "b", "bh", "d", "dh", "g", "gh", "h", "k", "m", "n", "r", "rh", "s", "sh", "v", "z"]
        f2 = [
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "ee",
            "au",
            "ye",
            "ie",
            "aa",
            "ou",
            "ua",
            "ao",
        ]
        f3 = [
            "d",
            "dd",
            "dk",
            "dg",
            "dv",
            "g",
            "gg",
            "gn",
            "gv",
            "gz",
            "l",
            "ll",
            "lv",
            "lz",
            "m",
            "md",
            "mz",
            "mv",
            "ng",
            "nk",
            "ns",
            "nz",
            "t",
            "thr",
            "th",
            "v",
            "vn",
            "vr",
            "vg",
            "vd",
            "wnk",
            "wg",
            "wn",
        ]
        f4 = ["", "", "", "", "", "f", "h", "k", "l", "m", "n", "ng", "v", "z"]
        s1 = [
            "Aberrant",
            "Ancient",
            "Angry",
            "Anguished",
            "Arrogant",
            "Barbarian",
            "Barbaric",
            "Barren",
            "Berserk",
            "Bitter",
            "Bloody",
            "Broad",
            "Broken",
            "Brutal",
            "Brute",
            "Butcher",
            "Coarse",
            "Cold",
            "Colossal",
            "Crazy",
            "Crooked",
            "Cruel",
            "Dark",
            "Defiant",
            "Delirious",
            "Deranged",
            "Disfigured",
            "Enormous",
            "Enraged",
            "Fearless",
            "Feisty",
            "Fierce",
            "Filthy",
            "Forsaken",
            "Frantic",
            "Gargantuan",
            "Giant",
            "Glorious",
            "Grand",
            "Grave",
            "Grim",
            "Gross",
            "Gruesome",
            "Hollow",
            "Infernal",
            "Lethal",
            "Lost",
            "Loyal",
            "Macabre",
            "Mad",
            "Maniac",
            "Merciless",
            "Mighty",
            "Miscreant",
            "Noxious",
            "Outlandish",
            "Powerful",
            "Prime",
            "Proud",
            "Putrid",
            "Radical",
            "Reckless",
            "Repulsive",
            "Rotten",
            "Ruthless",
            "Shady",
            "Sick",
            "Silent",
            "Simple",
            "Smug",
            "Spiteful",
            "Swift",
            "Turbulent",
            "Ugly",
            "Unsightly",
            "Vengeful",
            "Venomous",
            "Vicious",
            "Violent",
            "Vivid",
            "Volatile",
            "Vulgar",
            "Warped",
            "Wicked",
            "Wild",
            "Worthless",
            "Wrathful",
            "Wretched",
        ]
        s2 = [
            "Anger",
            "Ankle",
            "Ash",
            "Battle",
            "Beast",
            "Bitter",
            "Black",
            "Blood",
            "Bone",
            "Brain",
            "Brass",
            "Breath",
            "Chaos",
            "Chest",
            "Chin",
            "Cold",
            "Dark",
            "Death",
            "Dirt",
            "Doom",
            "Dream",
            "Elf",
            "Eye",
            "Fang",
            "Feet",
            "Fiend",
            "Finger",
            "Flame",
            "Flesh",
            "Foot",
            "Ghost",
            "Giant",
            "Gnoll",
            "Gnome",
            "Gore",
            "Hand",
            "Hate",
            "Head",
            "Heart",
            "Heel",
            "Hell",
            "Horror",
            "Iron",
            "Joint",
            "Kidney",
            "Kill",
            "Knee",
            "Muscle",
            "Nose",
            "Pest",
            "Poison",
            "Power",
            "Pride",
            "Rib",
            "Scale",
            "Skin",
            "Skull",
            "Slave",
            "Smoke",
            "Sorrow",
            "Spine",
            "Spite",
            "Steel",
            "Storm",
            "Talon",
            "Teeth",
            "Throat",
            "Thunder",
            "Toe",
            "Tooth",
            "Vein",
            "Venom",
            "Vermin",
            "War",
        ]
        s3 = [
            "Axe",
            "Blade",
            "Brand",
            "Breaker",
            "Bruiser",
            "Burster",
            "Butcher",
            "Carver",
            "Chopper",
            "Cleaver",
            "Clobberer",
            "Conquerer",
            "Cracker",
            "Cruncher",
            "Crusher",
            "Cutter",
            "Dagger",
            "Defacer",
            "Despoiler",
            "Destroyer",
            "Dissector",
            "Ender",
            "Flayer",
            "Gasher",
            "Glaive",
            "Gouger",
            "Hacker",
            "Hammer",
            "Killer",
            "Lance",
            "Marauder",
            "Masher",
            "Mutilator",
            "Piercer",
            "Pummel",
            "Quasher",
            "Quelcher",
            "Queller",
            "Razer",
            "Render",
            "Ripper",
            "Saber",
            "Sabre",
            "Scalper",
            "Shatterer",
            "Skinner",
            "Slayer",
            "Slicer",
            "Smasher",
            "Snapper",
            "Spear",
            "Splitter",
            "Squasher",
            "Squelcher",
            "Squisher",
            "Strangler",
            "Sunderer",
            "Sword",
            "Trampler",
            "Trasher",
            "Vanquisher",
            "Wrecker",
        ]

        name = ""
        if gender is None or gender not in Orc.OrcType:
            gender = choice(list(Orc.OrcType))
        if gender == Orc.OrcType.Male:
            name += choice(m1) + choice(m2) + choice(m3)
            if randrange(2) == 1:
                name += choice(m2) + choice(m3)
            name += choice(m4)

        else:  # Female
            name += choice(f1) + choice(f2) + choice(f3)
            if randrange(2) == 1:
                name += choice(f2) + choice(f3)
            name += choice(f4)

        # Last name
        if randrange(2) == 0:
            name += " The" + choice(s1)
        else:
            name += " " + choice(s2) + " " + choice(s3)

        return name.title()


class Oread(Character):
    class OreadType(Enum):
        Male = auto()
        Female = auto()

    @staticmethod
    def generate(gender: OreadType = None):
        f1 = ["", "", "", "b", "d", "g", "j", "l", "m", "n", "p", "r", "s", "t", "v"]
        f2 = ["a", "e", "i", "o", "u", "a", "o", "u", "y"]
        f3 = [
            "d",
            "dd",
            "f",
            "fd",
            "ft",
            "hd",
            "hn",
            "hv",
            "l",
            "ll",
            "ln",
            "lm",
            "ld",
            "lv",
            "lt",
            "lth",
            "lm",
            "m",
            "md",
            "mt",
            "mh",
            "mv",
            "n",
            "nd",
            "nt",
            "nv",
            "nh",
            "nn",
            "nm",
            "nh",
            "nr",
            "r",
            "rt",
            "rh",
            "rn",
            "rm",
            "rl",
            "rv",
            "rr",
            "rd",
            "th",
            "tr",
            "thr",
            "v",
            "vh",
            "vr",
        ]
        f4 = ["", "m", "n", "r", "s", "t"]
        m1 = [
            "",
            "",
            "",
            "b",
            "bh",
            "d",
            "dh",
            "gh",
            "h",
            "l",
            "m",
            "n",
            "p",
            "r",
            "rh",
            "s",
            "sh",
            "t",
            "th",
            "v",
            "w",
        ]
        m2 = ["a", "e", "i", "o", "u", "a", "i", "e"]
        m3 = [
            "c",
            "ch",
            "d",
            "dh",
            "f",
            "ff",
            "fh",
            "fth",
            "h",
            "hn",
            "hv",
            "hl",
            "hs",
            "l",
            "lh",
            "ln",
            "lm",
            "ls",
            "lsh",
            "m",
            "mn",
            "mm",
            "mh",
            "my",
            "n",
            "nn",
            "nh",
            "ny",
            "ns",
            "nth",
            "nf",
            "r",
            "ry",
            "rh",
            "rs",
            "rsh",
            "rth",
            "s",
            "sh",
            "sth",
            "sht",
            "sn",
            "sm",
            "sy",
            "sl",
            "t",
            "th",
            "ty",
            "thy",
            "y",
        ]
        m4 = [
            "d",
            "dd",
            "f",
            "fd",
            "ft",
            "hd",
            "hn",
            "hv",
            "l",
            "ll",
            "ln",
            "lm",
            "ld",
            "lv",
            "lt",
            "lth",
            "lm",
            "m",
            "md",
            "mt",
            "mh",
            "mv",
            "n",
            "nd",
            "nt",
            "nv",
            "nh",
            "nn",
            "nm",
            "nh",
            "nr",
            "r",
            "rt",
            "rh",
            "rn",
            "rm",
            "rl",
            "rv",
            "rr",
            "rd",
            "th",
            "tr",
            "thr",
            "v",
            "vh",
            "vr",
        ]

        name = ""
        if gender is None or gender not in Oread.OreadType:
            gender = choice(list(Oread.OreadType))
        if gender == Oread.OreadType.Male:
            name += choice(m1) + choice(m2) + choice(m3)
            if randrange(2) == 1:
                name += choice(m2) + choice(m3)
            name += choice(m4)

        else:  # Female
            name += choice(f1) + choice(f2) + choice(f3)
            if randrange(2) == 1:
                name += choice(f2) + choice(f3)
            name += choice(f4)

        return name.title()


class Poppet(Character):
    @staticmethod
    def generate():
        n1 = [
            "Abaca",
            "Alpaca",
            "Ambitious",
            "Angora",
            "Anxious",
            "Awningstripe",
            "Bamboo",
            "Bamboostitch",
            "Barleycorn",
            "Basketweave",
            "Birdseye",
            "Bobblestitch",
            "Botanical",
            "Brioche",
            "Bubblestitch",
            "Buffalo",
            "Burlap",
            "Buttoneyes",
            "Camo",
            "Carefree",
            "Careless",
            "Caring",
            "Cashmere",
            "Chalkstripe",
            "Checker",
            "Chevron",
            "Chinoserie",
            "Clockwhirr",
            "Coir",
            "Collage",
            "Contour",
            "Coral",
            "Cotton",
            "Crazy",
            "Creative",
            "Curious",
            "Diamond",
            "Ditsy",
            "Dot",
            "Dupplin",
            "Entrelac",
            "Fairisle",
            "Faith",
            "Fivestitch",
            "Fleurdelis",
            "Floral",
            "Foulard",
            "Fret",
            "Funny",
            "Garter",
            "Gingham",
            "Glencheck",
            "Graph",
            "Guilloche",
            "Harlequin",
            "Harringbone",
            "Hemp",
            "Herringbonestitch",
            "Honeycomb",
            "Honeycombstitch",
            "Houndstooth",
            "Hurdlestitch",
            "Ikat",
            "Illusion",
            "Intarsia",
            "Jute",
            "Kapoc",
            "Kind",
            "Kitchener",
            "Lace",
            "Lattice",
            "Lazy",
            "Linen",
            "Madras",
            "Magicknot",
            "Maverick",
            "Mohair",
            "Mood",
            "Mosaic",
            "Mossstitch",
            "Nailshead",
            "Nettle",
            "Ombre",
            "Optimist",
            "Paisley",
            "Perfect",
            "Pessimist",
            "Picot",
            "Pinstripe",
            "Plaid",
            "Polite",
            "Polka",
            "Polkadot",
            "Popcornstitch",
            "Preppy",
            "Purlstitch",
            "Quatrefoil",
            "Ramie",
            "Ramina",
            "Random",
            "Raspberrystitch",
            "Regency",
            "Ribstitch",
            "Scramble",
            "Seamless",
            "Seedstitch",
            "Sharkskin",
            "Shepherd",
            "Shy",
            "Silk",
            "Sincere",
            "Sisal",
            "Slapdash",
            "Stipple",
            "Stockinette",
            "Striae",
            "Stuffing",
            "Taffeta",
            "Tartan",
            "Tattercap",
            "Tattersail",
            "Tessellation",
            "Trefoil",
            "Twill",
            "Volatile",
            "Wafflestitch",
            "Watercolor",
            "Windowpane",
            "Wool",
            "Wreath",
            "Yarnball",
            "Yarnover",
            "Zigzag",
        ]

        return choice(n1)


class Ratfolk(Character):
    class RatfolkType(Enum):
        Male = auto()
        Female = auto()

    @staticmethod
    def generate(gender: RatfolkType = None):
        f1 = [
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "b",
            "br",
            "c",
            "cr",
            "ch",
            "d",
            "dr",
            "dj",
            "g",
            "gr",
            "gn",
            "gl",
            "j",
            "k",
            "kr",
            "kv",
            "kn",
            "m",
            "n",
            "p",
            "pr",
            "r",
            "s",
            "st",
            "sr",
            "skr",
            "sc",
            "scr",
            "sk",
            "t",
            "tr",
            "v",
            "vr",
            "z",
            "zr",
        ]
        f2 = ["a", "e", "i", "o", "a", "e", "i"]
        f3 = [
            "cc",
            "cd",
            "cr",
            "gg",
            "gr",
            "gk",
            "gv",
            "gd",
            "kk",
            "kr",
            "kv",
            "kz",
            "m",
            "mm",
            "md",
            "mk",
            "mv",
            "mz",
            "n",
            "nn",
            "nd",
            "nv",
            "nk",
            "ng",
            "nz",
            "rr",
            "r",
            "rk",
            "rv",
            "rz",
            "rc",
            "rg",
            "rd",
            "vv",
            "v",
            "vd",
            "vk",
            "vz",
        ]
        f4 = [
            "c",
            "g",
            "c",
            "g",
            "hl",
            "hz",
            "hk",
            "hn",
            "hc",
            "k",
            "m",
            "n",
            "q",
            "r",
            "s",
            "t",
            "z",
            "k",
            "m",
            "n",
            "q",
            "r",
            "s",
            "t",
            "z",
        ]
        m1 = [
            "b",
            "bh",
            "c",
            "ch",
            "dh",
            "f",
            "fr",
            "fh",
            "gh",
            "j",
            "k",
            "m",
            "n",
            "nh",
            "p",
            "r",
            "s",
            "sh",
            "t",
            "th",
            "v",
            "vh",
            "z",
            "zh",
        ]
        m2 = ["a", "e", "i", "o", "u", "e", "e", "e", "i", "i", "i"]
        m3 = [
            "b",
            "bb",
            "c",
            "cc",
            "f",
            "ff",
            "g",
            "gg",
            "j",
            "k",
            "kk",
            "l",
            "ll",
            "m",
            "mm",
            "n",
            "nn",
            "p",
            "pp",
            "r",
            "rr",
            "s",
            "ss",
            "t",
            "tt",
            "z",
            "zz",
        ]
        m4 = [
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "ch",
            "f",
            "hm",
            "hl",
            "ks",
            "l",
            "m",
            "n",
            "r",
            "s",
            "sh",
            "t",
            "th",
            "tch",
            "x",
        ]

        name = ""
        if gender is None or gender not in Ratfolk.RatfolkType:
            gender = choice(list(Ratfolk.RatfolkType))
        if gender == Ratfolk.RatfolkType.Male:
            name += choice(m1) + choice(m2) + choice(m3)
            if randrange(2) == 1:
                name += choice(m2) + choice(m3)
            name += choice(m4)

        else:  # Female
            name += choice(f1) + choice(f2) + choice(f3)
            if randrange(2) == 1:
                name += choice(f2) + choice(f3)
            name += choice(f4)

        return name.title()


class Shisk(Character):
    @staticmethod
    def generate():
        n1 = ["", "", "", "ch", "d", "g", "h", "l", "m", "n", "s", "sh", "th", "qu", "y", "z", "zh"]
        n2 = ["a", "e", "i", "o", "a", "e", "i", "o", "u"]
        n3 = [
            "ch",
            "d",
            "ds",
            "g",
            "h",
            "hs",
            "l",
            "ln",
            "ls",
            "lsh",
            "m",
            "ns",
            "nsh",
            "sh",
            "sj",
            "ss",
            "shn",
            "sht",
            "th",
            "thr",
            "z",
            "zhn",
            "zhr",
        ]
        n4 = ["a", "a", "e", "i", "i", "o", "o", "u"]
        n5 = ["ch", "l", "lh", "ls", "lsh", "n", "ns", "sh", "ss", "ssh", "th", "z", "zh"]
        n6 = [
            "ia",
            "ea",
            "io",
            "a",
            "a",
            "e",
            "i",
            "o",
            "o",
            "u",
            "u",
            "a",
            "a",
            "e",
            "i",
            "o",
            "o",
            "u",
            "u",
            "a",
            "a",
            "e",
            "i",
            "o",
            "o",
            "u",
            "u",
            "a",
            "a",
            "e",
            "i",
            "o",
            "o",
            "u",
            "u",
        ]

        if randrange(2) == 0:
            return str(choice(n1) + choice(n2) + choice(n3) + choice(n6)).title()
        else:
            return str(choice(n1) + choice(n2) + choice(n3) + choice(n4) + choice(n5) + choice(n6)).title()


class Shoony(Character):
    @staticmethod
    def generate():
        n1 = ["", "", "b", "d", "g", "h", "m", "p", "r"]
        n2 = [
            "ie",
            "ia",
            "io",
            "ou",
            "aa",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
        ]
        n3 = [
            "bm",
            "bl",
            "bw",
            "f",
            "f",
            "fr",
            "gg",
            "ghm",
            "gw",
            "h",
            "h",
            "l",
            "l",
            "mg",
            "mw",
            "nd",
            "ng",
            "nw",
            "p",
            "p",
            "pr",
            "r",
            "r",
            "rb",
            "rg",
            "rgw",
            "rn",
            "rnb",
        ]
        n4 = [
            "ia",
            "iu",
            "io",
            "a",
            "i",
            "o",
            "o",
            "u",
            "u",
            "a",
            "i",
            "o",
            "o",
            "u",
            "u",
            "a",
            "i",
            "o",
            "o",
            "u",
            "u",
            "a",
            "i",
            "o",
            "o",
            "u",
            "u",
            "a",
            "i",
            "o",
            "o",
            "u",
            "u",
            "a",
            "i",
            "o",
            "o",
            "u",
            "u",
            "a",
            "i",
            "o",
            "o",
            "u",
            "u",
            "a",
            "i",
            "o",
            "o",
            "u",
            "u",
        ]
        n5 = ["g", "gr", "l", "ld", "lr", "m", "r", "rd", "rl", "w", "z"]
        n6 = [
            "eu",
            "io",
            "ia",
            "a",
            "i",
            "o",
            "u",
            "a",
            "i",
            "o",
            "u",
            "a",
            "i",
            "o",
            "u",
            "a",
            "i",
            "o",
            "u",
            "a",
            "i",
            "o",
            "u",
            "a",
            "i",
            "o",
            "u",
            "a",
            "i",
            "o",
            "u",
            "a",
            "i",
            "o",
            "u",
            "a",
            "i",
            "o",
            "u",
        ]
        n7 = ["", "", "d", "g", "l", "n", "nd", "ng", "r", "rd"]

        if randrange(2) == 0:
            return str(choice(n1) + choice(n2) + choice(n3) + choice(n6) + choice(n7)).title()
        else:
            return str(choice(n1) + choice(n2) + choice(n3) + choice(n4) + choice(n5) + choice(n6) + choice(n7)).title()


class Skeleton(Character):
    @staticmethod
    def generate():
        n1 = [
            "Bluster",
            "Buster",
            "Clanker",
            "Clatter",
            "Crackle",
            "Dither",
            "Flutter",
            "Jangle",
            "Jingle",
            "Quaver",
            "Quiver",
            "Rattle",
            "Scatter",
            "Shatter",
            "Shiver",
            "Shudder",
            "Smatter",
            "Splinter",
            "Tremble",
            "Tumble",
            "Waver",
            "Wiggle",
            "Wobble",
        ]
        n2 = ["jaw", "bone", "bones", "skull", "rib", "ribs", "spine", "toes"]
        n3 = [
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "Final",
            "Ultimate",
            "Willing",
            "Unaware",
            "Enthusiastic",
            "Prepared",
            "Favored",
            "Zealous",
            "Unbidden",
            "Bidden",
            "Reliable",
            "Voluntary",
            "Involuntary",
            "Heedless",
            "Oblivious",
            "Careless",
            "Unknowing",
            "Unsuspecting",
            "Arranged",
            "Primed",
            "Available",
            "Qualified",
            "Disposable",
            "Adequate",
            "Proven",
            "Tested",
            "Reborn",
            "Eternal",
            "Trivial",
            "Useless",
            "Replacable",
        ]
        n4 = [
            "Sacrifice",
            "Demise",
            "Doom",
            "End",
            "Ending",
            "Terminus",
            "Fate",
            "Fatality",
            "Casualty",
            "Offering",
            "Forfeit",
            "Calamity",
            "Disaster",
            "Annihilation",
            "Tragedy",
            "Verdict",
            "Destination",
            "Cataclysm",
            "Curtains",
            "Scourge",
            "Wreck",
            "Wreckage",
            "Collapse",
            "Misfortune",
            "Departure",
        ]
        n5 = [
            "Cannon",
            "Mace",
            "Sword",
            "Arrow",
            "Spear",
            "Javelin",
            "Bullet",
            "Bow",
            "Archer",
            "Club",
            "Knife",
            "Dart",
            "Sickle",
            "Axe",
            "Hammer",
            "Flail",
            "Sling",
            "Crossbow",
            "Pistol",
        ]
        n6 = [
            "fodder",
            "sink",
            "lure",
            "dodger",
            "bait",
            "decoy",
            "trap",
            "trick",
            "snare",
            "con",
            "ditcher",
            "swerver",
            "juker",
            "fudger",
            "trickster",
        ]

        c = randrange(4)
        if c == 0:
            return str(choice(n1) + choice(n2)).title()
        elif c == 1:
            return str(choice(n4)).title()
        elif c == 1:
            return str(choice(n3) + " " + choice(n4)).title()
        else:
            return str(choice(n5) + choice(n6)).title()


class Sprite(Character):
    @staticmethod
    def generate():
        n1 = [
            "Abyss",
            "Acacia",
            "Acorn",
            "Air",
            "Alcyone",
            "Allium",
            "Almond",
            "Alyssum",
            "Amaryllis",
            "Amber",
            "Amethyst",
            "Anemone",
            "Aphid",
            "Apple",
            "Apricot",
            "Aqua",
            "Aria",
            "Ash",
            "Aspen",
            "Aurora",
            "Autumn",
            "Axis",
            "Azalea",
            "Badger",
            "Barley",
            "Basil",
            "Bear",
            "Beauty",
            "Beech",
            "Begonia",
            "Belladonna",
            "Bellflower",
            "Berry",
            "Beryl",
            "Birch",
            "Bird",
            "Birdy",
            "Bitter",
            "Blaze",
            "Blossom",
            "Blue",
            "Bluebell",
            "Bracken",
            "Bramble",
            "Breeze",
            "Briar",
            "Bright",
            "Brine",
            "Broom",
            "Bubble",
            "Bud",
            "Bumble",
            "Buttercup",
            "Candle",
            "Canyon",
            "Caraway",
            "Carrot",
            "Cat",
            "Cayenne",
            "Cedar",
            "Celeste",
            "Celestial",
            "Charity",
            "Chasm",
            "Cherry",
            "Chestnut",
            "Chickadee",
            "Chilly",
            "Chipmunk",
            "Cinder",
            "Cinnamon",
            "Cintrine",
            "Citron",
            "Citrus",
            "Cloud",
            "Clove",
            "Clover",
            "Cocoa",
            "Coconut",
            "Comet",
            "Cookie",
            "Copper",
            "Coral",
            "Coriander",
            "Cornflower",
            "Cosmo",
            "Cotton",
            "Coyote",
            "Cozy",
            "Crabapple",
            "Cranberry",
            "Cricket",
            "Crystal",
            "Cupcake",
            "Cute",
            "Cypress",
            "Daffodil",
            "Dahlia",
            "Daisy",
            "Dalila",
            "Dandelion",
            "Dapple",
            "Dark",
            "Dawn",
            "Day",
            "Daybreak",
            "Daylily",
            "Dazzle",
            "Dew",
            "Dewdrop",
            "Diamond",
            "Dill",
            "Dimple",
            "Dragonfly",
            "Drake",
            "Drift",
            "Dune",
            "Dusk",
            "Earth",
            "Echo",
            "Elm",
            "Ember",
            "Emerald",
            "Evening",
            "Faith",
            "Falcon",
            "Fancy",
            "Fantasia",
            "Fauna",
            "Fern",
            "Fiery",
            "Fig",
            "Finch",
            "Fire",
            "Flame",
            "Flare",
            "Flax",
            "Flint",
            "Flirt",
            "Flora",
            "Flutter",
            "Fog",
            "Fox",
            "Foxglove",
            "Frost",
            "Frostbite",
            "Galaxy",
            "Garden",
            "Garlic",
            "Garnet",
            "Gem",
            "Giggle",
            "Ginger",
            "Ginko",
            "Glitter",
            "Gold",
            "Grace",
            "Grass",
            "Gray",
            "Green",
            "Grove",
            "Gullie",
            "Gypsum",
            "Happy",
            "Harbor",
            "Harmony",
            "Hazel",
            "Heather",
            "Heaven",
            "Herb",
            "Hibiscus",
            "Hickoy",
            "Holly",
            "Hollyhock",
            "Honey",
            "Hope",
            "Horizon",
            "Hurricane",
            "Hyacinth",
            "Hydrangea",
            "Ice",
            "Indigo",
            "Infinity",
            "Iris",
            "Island",
            "Isle",
            "Ivory",
            "Ivy",
            "Jade",
            "Jasmine",
            "Jelly",
            "Jester",
            "Jewel",
            "Jingle",
            "Joy",
            "June",
            "Juniper",
            "Kiwi",
            "Labyrinth",
            "Lake",
            "Lapis",
            "Lark",
            "Laurel",
            "Lavender",
            "Lazuli",
            "Leaf",
            "Lemon",
            "Lemony",
            "Lichen",
            "Light",
            "Lightning",
            "Lilac",
            "Lilly",
            "Lime",
            "Little",
            "Lotus",
            "Love",
            "Lucky",
            "Lucy",
            "Magenta",
            "Magic",
            "Magnolia",
            "Magpie",
            "Mahogany",
            "Mango",
            "Maple",
            "Marigold",
            "Meadow",
            "Melody",
            "Merry",
            "Midnight",
            "Milkweed",
            "Mist",
            "Moon",
            "Moonbeam",
            "Morel",
            "Morning",
            "Moss",
            "Mountain",
            "Mud",
            "Mulberry",
            "Nature",
            "Nebula",
            "Nectarine",
            "Never",
            "Newt",
            "Night",
            "Nightfall",
            "Nightshade",
            "Nimbus",
            "North",
            "Nova",
            "Nutmeg",
            "Oak",
            "Ocean",
            "Oleander",
            "Olive",
            "Onyx",
            "Opal",
            "Orange",
            "Orchid",
            "Oregano",
            "Palm",
            "Parsley",
            "Passiflora",
            "Peach",
            "Peanut",
            "Pear",
            "Pearl",
            "Pecan",
            "Pepper",
            "Peridot",
            "Persimmon",
            "Petal",
            "Petunia",
            "Pine",
            "Pineapple",
            "Pinecone",
            "Pistachio",
            "Plum",
            "Plume",
            "Poinsetia",
            "Poison",
            "Pollen",
            "Poplar",
            "Poppy",
            "Prairie",
            "Pretty",
            "Primrose",
            "Prize",
            "Prudence",
            "Pumpkin",
            "Purple",
            "Pyre",
            "Quick",
            "Quicksilver",
            "Rain",
            "Rainbow",
            "Raven",
            "Red",
            "Reef",
            "Ridge",
            "River",
            "Robin",
            "Rock",
            "Rose",
            "Rosemary",
            "Ruby",
            "Saffron",
            "Sage",
            "Sapphire",
            "Scarlet",
            "Scorpion",
            "Sea",
            "Seaweed",
            "Serendipity",
            "Shade",
            "Shadow",
            "Shimmer",
            "Shiny",
            "Silhouette",
            "Silk",
            "Silver",
            "Sky",
            "Skylark",
            "Smoke",
            "Sneeze",
            "Snow",
            "Snowdrop",
            "Snowflake",
            "Sorrell",
            "Sour",
            "Spark",
            "Sparkle",
            "Spice",
            "Spider",
            "Spore",
            "Spring",
            "Sprinkle",
            "Spruce",
            "Star",
            "Stardust",
            "Starfish",
            "Stone",
            "Storm",
            "Strawberry",
            "Summer",
            "Sun",
            "Sunflower",
            "Sunrise",
            "Sunset",
            "Sunshine",
            "Swan",
            "Sweet",
            "Swift",
            "Tadpole",
            "Tangle",
            "Tarragon",
            "Tempest",
            "Thicket",
            "Thistle",
            "Thunder",
            "Tiger",
            "Timber",
            "Tiny",
            "Toad",
            "Topaz",
            "Topiary",
            "Tourmaline",
            "Tree",
            "Tulip",
            "Tumble",
            "Turnip",
            "Turquoise",
            "Turtle",
            "Twig",
            "Twilight",
            "Twinkle",
            "Twist",
            "Urchin",
            "Vanilla",
            "Viola",
            "Violet",
            "Walnut",
            "Water",
            "Waterfall",
            "Wave",
            "West",
            "Whirl",
            "White",
            "Wild",
            "Willow",
            "Wind",
            "Winter",
            "Wolf",
            "Wonder",
            "Wood",
            "Wren",
            "Wrinkle",
            "Yucca",
            "Zephyr",
        ]

        return choice(n1)


class Strix(Character):
    class StrixType(Enum):
        Male = auto()
        Female = auto()

    @staticmethod
    def generate(gender: StrixType = None):
        m1 = [
            "Angler",
            "Baker",
            "Barker",
            "Basher",
            "Bather",
            "Beggar",
            "Biter",
            "Boiler",
            "Bomber",
            "Bonker",
            "Bouncer",
            "Braker",
            "Brander",
            "Breaker",
            "Broiler",
            "Bruiser",
            "Bubbler",
            "Burner",
            "Butcher",
            "Buzzer",
            "Cackler",
            "Carver",
            "Caster",
            "Chimer",
            "Chitter",
            "Chomper",
            "Chopper",
            "Clamor",
            "Clamper",
            "Clanger",
            "Clapper",
            "Clawer",
            "Cleaver",
            "Clicker",
            "Clinger",
            "Clinker",
            "Clipper",
            "Clubber",
            "Clucker",
            "Cobbler",
            "Cooker",
            "Cougher",
            "Crackler",
            "Crinkler",
            "Croaker",
            "Cruncher",
            "Crusher",
            "Cutter",
            "Dangler",
            "Deflater",
            "Digger",
            "Dipper",
            "Doodler",
            "Dragger",
            "Drawer",
            "Dribbler",
            "Driller",
            "Dripper",
            "Drummer",
            "Duster",
            "Enchanter",
            "Engraver",
            "Etcher",
            "Exploder",
            "Flapper",
            "Flipper",
            "Flopper",
            "Flusher",
            "Forger",
            "Fryer",
            "Giggler",
            "Gnasher",
            "Gnawer",
            "Gouger",
            "Greaser",
            "Griller",
            "Grinder",
            "Growler",
            "Gusher",
            "Hammer",
            "Hammerer",
            "Hiccup",
            "Hummer",
            "Impaler",
            "Inscriber",
            "Itcher",
            "Jangler",
            "Jingler",
            "Knocker",
            "Lasher",
            "Locker",
            "Lugger",
            "Mangler",
            "Masher",
            "Mauler",
            "Mewer",
            "Mimer",
            "Molder",
            "Nailer",
            "Neigher",
            "Nestler",
            "Nibbler",
            "Paddler",
            "Piercer",
            "Piper",
            "Plunger",
            "Presser",
            "Prodder",
            "Puffer",
            "Raker",
            "Rasper",
            "Rattler",
            "Ripper",
            "Roarer",
            "Roaster",
            "Ruffler",
            "Rustler",
            "Scooper",
            "Scorcher",
            "Scratcher",
            "Scribbler",
            "Scrubber",
            "Shaker",
            "Shaver",
            "Shearer",
            "Shoveler",
            "Shrieker",
            "Sifter",
            "Singer",
            "Sketcher",
            "Slammer",
            "Slicer",
            "Smasher",
            "Snapper",
            "Sneezer",
            "Snorer",
            "Spitter",
            "Splasher",
            "Splitter",
            "Squeaker",
            "Squealer",
            "Squisher",
            "Stamper",
            "Stomper",
            "Strangler",
            "Striker",
            "Strummer",
            "Swatter",
            "Sweeper",
            "Swiper",
            "Tinkerer",
            "Trampler",
            "Walloper",
            "Whacker",
            "Whipper",
            "Whistler",
        ]
        f1 = [
            "Albatross Call",
            "Albatross Flap",
            "Alligator Hiss",
            "Alligator Roar",
            "Ape Call",
            "Ape Hoot",
            "Ape Scratch",
            "Aper",
            "Badger Growl",
            "Badger Run",
            "Badger Scratch",
            "Barker",
            "Bat Flap",
            "Bat Screech",
            "Bat Swoop",
            "Bear Growl",
            "Bear Roar",
            "Bear Rustle",
            "Bear Step",
            "Bear Stomp",
            "Beaver Call",
            "Beaver Chew",
            "Beaver Nibble",
            "Beaver Rustle",
            "Bee Buzzer",
            "Bison Breath",
            "Bison Call",
            "Bison Stomp",
            "Bleater",
            "Boar Charge",
            "Boar Grunt",
            "Boar Rustle",
            "Boar Squeal",
            "Boar Stamp",
            "Boarer",
            "Cackler",
            "Cat Call",
            "Cat Hiss",
            "Cat Purr",
            "Cat Rustle",
            "Cat Scratch",
            "Catter",
            "Chirper",
            "Cow Moo",
            "Cow Step",
            "Cow Stomp",
            "Cower",
            "Coyote Cackle",
            "Coyote Howl",
            "Coyote Yelp",
            "Coyote Yowl",
            "Cricket Chirp",
            "Cricketer",
            "Croaker",
            "Crocodile Hiss",
            "Crocodile Roar",
            "Crocodiler",
            "Crow Call",
            "Crow Rustle",
            "Crower",
            "Deer Clash",
            "Deer Rustle",
            "Deer Scratch",
            "Deer Stomp",
            "Dino Chew",
            "Dino Growl",
            "Dino Roar",
            "Dino Snort",
            "Dino Stomp",
            "Dog Bark",
            "Dog Growl",
            "Dog Howl",
            "Dog Run",
            "Dog Sneeze",
            "Dog Step",
            "Dog Wiggle",
            "Dog Yelp",
            "Dog Yip",
            "Dog Yowl",
            "Dogger",
            "Donkey Call",
            "Donkey Stomp",
            "Dove Rustle",
            "Dove Swoop",
            "Dover",
            "Dragon Bite",
            "Dragon Breath",
            "Dragon Chew",
            "Dragon Roar",
            "Dragon Swoop",
            "Duck Quacker",
            "Duck Rustle",
            "Ducker",
            "Eagle Screech",
            "Elephant Roar",
            "Elephant Stampede",
            "Elephant Stomp",
            "Falcon Rustle",
            "Falcon Swoop",
            "Fox Rustle",
            "Fox Yelp",
            "Fox Yowl",
            "Foxer",
            "Frog Croak",
            "Frog Splash",
            "Frogger",
            "Gecko Croak",
            "Giraffe Smash",
            "Giraffe Snort",
            "Giraffe Stomp",
            "Goat Baa",
            "Goat Bleat",
            "Goat Chew",
            "Goater",
            "Goose Hiss",
            "Goose Honk",
            "Growler",
            "Hamster Squeak",
            "Hee-Haw",
            "Hisser",
            "Hog Oink",
            "Hog Snort",
            "Honker",
            "Hooter",
            "Horse Blow",
            "Horse Neigh",
            "Horse Sneeze",
            "Horse Snort",
            "Horse Stamp",
            "Horse Whinny",
            "Horser",
            "Howler",
            "Hyena Cackle",
            "Hyena Laugh",
            "Jackal Call",
            "Jackal Laugh",
            "Jackal Rustle",
            "Lion Growl",
            "Lion Roar",
            "Monker",
            "Monkey Howl",
            "Monkey Rustle",
            "Monkey Scream",
            "Mouse Peep",
            "Mouse Rustle",
            "Mouse Squeak",
            "Mouser",
            "Nightingale Song",
            "Nightingaler",
            "Oinker",
            "Owl Call",
            "Owl Hoot",
            "Owl Rustle",
            "Owl Swoop",
            "Owler",
            "Panda Sneeze",
            "Panther Growl",
            "Panther Roar",
            "Parrot",
            "Parrot Bite",
            "Parrot Call",
            "Parrot Nibble",
            "Parrot Rustle",
            "Parrot Squawk",
            "Parroter",
            "Pheasant Call",
            "Pheasant Rustle",
            "Pig Snort",
            "Pigeon Coo",
            "Pigeon Rustle",
            "Pigeoner",
            "Quacker",
            "Quail Call",
            "Quail Rustle",
            "Quailer",
            "Rabbit Scream",
            "Rabbit Yelp",
            "Ram Ram",
            "Ram Stamp",
            "Rammer",
            "Rat",
            "Rat Rustle",
            "Rat Squeak",
            "Rat Yelp",
            "Ratter",
            "Raven Rustle",
            "Rhino Snort",
            "Rhino Stamp",
            "Rook Rustle",
            "Rooker",
            "Screamer",
            "Screecher",
            "Seal Bark",
            "Seal Flop",
            "Sealer",
            "Sheep Baa",
            "Sheep Bleat",
            "Singer",
            "Snake Hiss",
            "Snake Rattle",
            "Snake Slither",
            "Snaker",
            "Snorter",
            "Squawker",
            "Squeaker",
            "Squirrel Chatter",
            "Squirrel Chitter",
            "Squirrel Nibble",
            "Squirrel Rustle",
            "Squirreler",
            "Stampede",
            "Swan Cry",
            "Swan Flap",
            "Swan Hiss",
            "Swan Honk",
            "Swanner",
            "Toad Croak",
            "Trumpet",
            "Trumpeter",
            "Turkey Call",
            "Turkey Gobble",
            "Tweeter",
            "Vulture Scream",
            "Warbler",
            "Whale Song",
            "Wolf Growl",
            "Wolf Howl",
            "Wolf Yelp",
            "Wolfer",
            "Wolverine Growl",
            "Wolverine Yelp",
        ]
        s1 = [
            "Net Cast",
            "Net Splash",
            "Anchor Splash",
            "Anchor Chain",
            "Anchor Drop",
            "Leather Smack",
            "Leather Flick",
            "Leather Drop",
            "Hide Smack",
            "Hide Flick",
            "Hide Drop",
            "Paint Drop",
            "Paint Stroke",
            "Paint Squeeze",
            "Brush Stroke",
            "Brush Flick",
            "Hammer Crash",
            "Hammer Drop",
            "Hammer Clank",
            "Nail Drop",
            "Nail Tingle",
            "Saw Drop",
            "Saw Wobble",
            "Saw Pull",
            "Spade Dig",
            "Spade Drop",
            "Hoe Dig",
            "Hoe Scrape",
            "Hoe Scratch",
            "Mallet Crash",
            "Mallet Smash",
            "Mallet Drop",
            "Chisel Tick",
            "Chisel Cut",
            "Chisel Carve",
            "Armor Clank",
            "Armor Crash",
            "Steel Clank",
            "Steel Crash",
            "Steel Drop",
            "Furnace Roar",
            "Furnace Door",
            "Hatchet Cut",
            "Hatchet Drop",
            "Hatchet Split",
            "Hatchet Chop",
            "Wood Chop",
            "Wood Crack",
            "Wood Creak",
            "Wood Drop",
            "Tree Fall",
            "Tree Creak",
            "Fire Crackle",
            "Fire Roar",
            "Potion Bubble",
            "Potion Crash",
            "Potion Gush",
            "Potion Swirl",
            "Potion Splash",
            "Kettle Bubble",
            "Kettle Splash",
            "Kettle Bubble",
            "Cauldron Swirl",
            "Cauldron Stir",
            "Cauldron Bubble",
            "Cauldron Splash",
            "Bell Ring",
            "Bell Drop",
            "Crier Bell",
            "Bowstring Flick",
            "Bowstring Stretch",
            "Blacksmith Clank",
            "Lute Pluck",
            "Lute String",
            "Glass Shatter",
            "Fruit Squish",
            "Crate Smash",
            "Crate Crack",
            "Crate Creak",
            "Ship Creak",
            "Sail Slap",
            "Rope Slap",
            "Rope Whip",
            "Book Drop",
            "Book Slam",
            "Page Turn",
            "Grain Trash",
            "Grain Mill",
            "Cork Pop",
            "Wood Scrape",
            "Sail Flick",
        ]

        name = ""
        if gender is None or gender not in Strix.StrixType:
            gender = choice(list(Strix.StrixType))
        if gender == Strix.StrixType.Male:
            name += choice(m1)

        else:  # Female
            name += choice(f1)

        name += " " + choice(s1)

        return name.title()


class Suli(Character):
    class SuliType(Enum):
        Male = auto()
        Female = auto()

    @staticmethod
    def generate(gender: SuliType = None):
        f1 = ["", "", "", "", "", "b", "bh", "d", "dh", "g", "gh", "h", "j", "k", "m", "n", "r", "s", "sh", "y", "z"]
        f2 = [
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "aa",
            "ee",
            "ua",
            "ai",
            "oo",
        ]
        f3 = [
            "b",
            "bb",
            "br",
            "d",
            "h",
            "k",
            "kh",
            "m",
            "n",
            "nq",
            "q",
            "s",
            "sh",
            "sm",
            "ss",
            "sf",
            "st",
            "t",
            "z",
            "zz",
        ]
        f4 = ["", "", "", "", "d", "f", "l", "m", "n", "sh", "z"]
        m1 = [
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "f",
            "g",
            "gh",
            "h",
            "j",
            "k",
            "kh",
            "l",
            "m",
            "n",
            "ph",
            "r",
            "s",
            "sh",
            "t",
            "th",
            "w",
            "y",
            "z",
        ]
        m2 = [
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "a",
            "i",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "a",
            "i",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "a",
            "i",
            "aa",
            "ee",
            "ai",
            "ia",
        ]
        m3 = ["b", "d", "dh", "dr", "f", "ff", "l", "ll", "m", "mn", "r", "s", "sh", "ss", "t", "th", "w", "y", "z"]
        m4 = ["", "", "", "", "", "", "", "", "h", "l", "n"]
        s1 = ["", "", "", "", "", "bh", "d", "dh", "g", "gh", "h", "j", "k", "kh", "m", "n", "r", "s", "sh", "y", "z"]
        s2 = [
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "a",
            "i",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "a",
            "i",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "a",
            "i",
            "aa",
            "ee",
            "ai",
        ]
        s3 = ["b", "bb", "d", "h", "kh", "l", "ll", "m", "n", "r", "rr", "s", "sh", "ss", "t", "th", "z", "zz"]
        s4 = ["", "", "", "h", "l", "m", "n", "s", "z"]
        t1 = [
            "Accomplished",
            "Adored",
            "Adventurous",
            "Amazing",
            "Ancient",
            "Austere",
            "Beloved",
            "Better",
            "Bold",
            "Bountiful",
            "Brilliant",
            "Carefree",
            "Courageous",
            "Creative",
            "Cruel",
            "Daring",
            "Devoted",
            "Dreamy",
            "Elegant",
            "Enchanted",
            "Enlightened",
            "Exalted",
            "Extravagant",
            "Fair",
            "Fantastic",
            "Fearless",
            "Fesity",
            "First",
            "Flawless",
            "Fortunate",
            "Friendly",
            "Generous",
            "Gentle",
            "Gifted",
            "Giving",
            "Glamorous",
            "Glorious",
            "Gorgeous",
            "Graceful",
            "Gracious",
            "Grand",
            "Grandiose",
            "Great",
            "Handsome",
            "Happy",
            "Harmonious",
            "Heavenly",
            "Honest",
            "Honored",
            "Humble",
            "Idolized",
            "Illustrious",
            "Impeccable",
            "Incredible",
            "Intrepid",
            "Jolly",
            "Joyful",
            "Joyous",
            "Kind",
            "Kindhearted",
            "Light",
            "Lovable",
            "Loyal",
            "Lucky",
            "Luminous",
            "Lustrous",
            "Luxurious",
            "Magnificent",
            "Majestic",
            "Marvelous",
            "Mighty",
            "Mysterious",
            "Original",
            "Pleasant",
            "Pleasing",
            "Powerful",
            "Precious",
            "Proud",
            "Pure",
            "Radiant",
            "Rewarding",
            "Rich",
            "Royal",
            "Sane",
            "Scented",
            "Serene",
            "Silent",
            "Simple",
            "Spectacular",
            "Stunning",
            "Superior",
            "Swift",
            "Tender",
            "Terrific",
            "Treasured",
            "Tremendous",
            "Trustworthy",
            "Truthful",
            "Unequaled",
            "Venerated",
            "Vibrant",
            "Victorious",
            "Virtuous",
            "Wealthy",
            "Wise",
            "Wonderful",
        ]

        name = ""
        if gender is None or gender not in Suli.SuliType:
            gender = choice(list(Suli.SuliType))
        if gender == Suli.SuliType.Male:
            name += choice(m1) + choice(m2) + choice(m3)
            if randrange(2) == 1:
                name += choice(m2) + choice(m3)
            name += choice(m4)

        else:  # Female
            name += choice(f1) + choice(f2) + choice(f3)
            if randrange(2) == 1:
                name += choice(f2) + choice(f3)
            name += choice(f4)

        # Last name
        name += " " + choice(s1) + choice(s2) + choice(s3)
        if randrange(2) == 1:
            name += choice(s2) + choice(s3)
        name += choice(s4)

        # Title
        if randrange(4) == 0:
            name += ", The " + choice(t1)

        return name.title()


class Sylph(Character):
    class SylphType(Enum):
        Male = auto()
        Female = auto()

    @staticmethod
    def generate(gender: SylphType = None):
        f1 = ["", "", "", "", "", "c", "d", "f", "g", "h", "j", "l", "m", "n", "s", "v", "w", "z"]
        f2 = [
            "a",
            "e",
            "i",
            "u",
            "a",
            "e",
            "i",
            "u",
            "a",
            "e",
            "i",
            "u",
            "a",
            "e",
            "i",
            "u",
            "a",
            "e",
            "i",
            "u",
            "aa",
            "uu",
            "ii",
        ]
        f3 = ["d", "f", "g", "j", "k", "l", "m", "n", "s", "v", "w", "z"]
        f4 = ["d", "l", "m", "n", "sh"]
        m1 = ["", "", "", "", "", "d", "f", "h", "k", "l", "m", "n", "r", "s", "t", "v", "w", "z"]
        m2 = ["a", "e", "i", "a", "e", "i", "a", "e", "i", "a", "e", "i", "a", "e", "i", "a", "a", "a", "ee", "aa"]
        m3 = ["d", "f", "ff", "h", "l", "ll", "m", "mm", "n", "nn", "s", "ss", "v", "y", "w"]
        m4 = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "h", "m", "n", "sh"]

        name = ""
        if gender is None or gender not in Sylph.SylphType:
            gender = choice(list(Sylph.SylphType))
        if gender == Sylph.SylphType.Male:
            name += choice(m1) + choice(m2) + choice(m3)
            if randrange(2) == 1:
                name += choice(m2) + choice(m3)
            name += choice(m4)

        else:  # Female
            name += choice(f1) + choice(f2) + choice(f3)
            if randrange(2) == 1:
                name += choice(f2) + choice(f3)
            name += choice(f4)

        return name.title()


class Tengu(Character):
    class TenguType(Enum):
        Male = auto()
        Female = auto()

    @staticmethod
    def generate(gender: TenguType = None):
        f1 = [
            "",
            "",
            "",
            "",
            "",
            "b",
            "ch",
            "gr",
            "j",
            "k",
            "kr",
            "p",
            "pr",
            "q",
            "qr",
            "r",
            "s",
            "t",
            "tr",
            "tch",
            "x",
            "v",
            "z",
        ]
        f2 = [
            "a",
            "e",
            "o",
            "u",
            "a",
            "e",
            "o",
            "u",
            "a",
            "e",
            "o",
            "u",
            "a",
            "e",
            "o",
            "u",
            "i",
            "i",
            "a",
            "e",
            "o",
            "u",
            "au",
            "ai",
            "oi",
            "ou",
        ]
        f3 = [
            "ch",
            "j",
            "k",
            "kk",
            "l",
            "ll",
            "m",
            "n",
            "nn",
            "p",
            "pp",
            "q",
            "r",
            "rr",
            "s",
            "t",
            "v",
            "y",
            "x",
            "z",
            "zz",
        ]
        f4 = ["", "", "", "", "", "", "", "", "", "", "ck", "gh", "k", "l", "n", "r"]
        m1 = [
            "",
            "",
            "",
            "",
            "",
            "ch",
            "d",
            "g",
            "gh",
            "k",
            "kh",
            "m",
            "n",
            "p",
            "q",
            "r",
            "s",
            "sh",
            "t",
            "th",
            "v",
            "z",
            "zh",
        ]
        m2 = [
            "a",
            "e",
            "o",
            "u",
            "a",
            "e",
            "o",
            "u",
            "a",
            "e",
            "o",
            "u",
            "a",
            "e",
            "o",
            "u",
            "i",
            "i",
            "a",
            "e",
            "o",
            "u",
            "ai",
            "io",
            "ee",
            "ae",
        ]
        m3 = [
            "b",
            "ch",
            "g",
            "j",
            "k",
            "ky",
            "lk",
            "l",
            "ll",
            "ly",
            "m",
            "mk",
            "nk",
            "ny",
            "p",
            "py",
            "r",
            "rr",
            "rk",
            "s",
            "t",
            "ty",
            "tch",
            "v",
            "vy",
            "z",
            "zz",
        ]
        m4 = ["", "", "", "", "", "", "", "", "", "", "k", "l", "n", "r"]
        s1 = [
            "",
            "",
            "",
            "",
            "",
            "b",
            "ch",
            "d",
            "g",
            "j",
            "k",
            "kr",
            "m",
            "n",
            "p",
            "pr",
            "q",
            "r",
            "s",
            "t",
            "tch",
            "v",
            "z",
        ]
        s2 = ["a", "e", "i", "o", "u", "a", "o", "e", "a", "o", "e", "u"]
        s3 = [
            "ch",
            "g",
            "j",
            "k",
            "kk",
            "ky",
            "l",
            "ll",
            "m",
            "n",
            "ng",
            "nk",
            "p",
            "pp",
            "q",
            "r",
            "rr",
            "s",
            "t",
            "tch",
            "v",
            "y",
            "z",
            "zz",
        ]
        s4 = ["", "", "ck", "k", "l", "n", "r", "t"]

        name = ""
        if gender is None or gender not in Tengu.TenguType:
            gender = choice(list(Tengu.TenguType))
        if gender == Tengu.TenguType.Male:
            name += choice(m1) + choice(m2) + choice(m3)
            if randrange(2) == 1:
                name += choice(m2) + choice(m3)
            name += choice(m4)

        else:  # Female
            name += choice(f1) + choice(f2) + choice(f3)
            if randrange(2) == 1:
                name += choice(f2) + choice(f3)
            name += choice(f4)

        # Last name
        name += " " + choice(s1) + choice(s2) + choice(s3)
        if randrange(2) == 1:
            name += choice(s2) + choice(s3)
        name += choice(s4)

        return name.title()


class Tian(Character):
    class TianType(Enum):
        Male = auto()
        Female = auto()

    @staticmethod
    def generate(gender: TianType = None):
        f1 = [
            "",
            "",
            "",
            "b",
            "c",
            "ch",
            "d",
            "dh",
            "g",
            "gh",
            "h",
            "j",
            "k",
            "kh",
            "l",
            "m",
            "n",
            "q",
            "s",
            "sh",
            "t",
            "th",
            "ts",
            "x",
            "y",
            "z",
            "zh",
        ]
        f2 = [
            "aie",
            "aa",
            "ei",
            "aiu",
            "ua",
            "uu",
            "eio",
            "oi",
            "ai",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
        ]
        f3 = [
            "b",
            "cch",
            "ch",
            "d",
            "dk",
            "dy",
            "g",
            "gh",
            "ght",
            "gm",
            "gs",
            "j",
            "k",
            "kh",
            "khg",
            "khj",
            "kt",
            "l",
            "lb",
            "lch",
            "ld",
            "lg",
            "lgh",
            "lj",
            "lt",
            "lz",
            "m",
            "mb",
            "ml",
            "n",
            "nb",
            "ndj",
            "ng",
            "ngg",
            "ngs",
            "nksh",
            "nt",
            "nz",
            "q",
            "r",
            "rch",
            "rd",
            "rg",
            "rgh",
            "rk",
            "rkh",
            "rt",
            "s",
            "sg",
            "sh",
            "sl",
            "t",
            "tb",
            "tg",
            "tl",
            "ts",
            "y",
            "z",
            "zb",
            "zh",
        ]
        f4 = ["", "", "", "d", "g", "gh", "gt", "l", "ld", "m", "n", "nt", "r", "t", "y"]
        m1 = [
            "b",
            "ch",
            "c",
            "d",
            "f",
            "g",
            "h",
            "j",
            "k",
            "kw",
            "l",
            "m",
            "n",
            "p",
            "q",
            "r",
            "sh",
            "s",
            "t",
            "w",
            "x",
            "y",
            "zh",
            "z",
        ]
        m2 = [
            "ao",
            "ua",
            "ai",
            "ui",
            "ia",
            "ei",
            "ue",
            "iu",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
            "a",
            "e",
            "i",
            "o",
            "u",
        ]
        m3 = [
            "b",
            "c",
            "ch",
            "d",
            "f",
            "h",
            "hw",
            "j",
            "k",
            "l",
            "m",
            "n",
            "nd",
            "nf",
            "ng",
            "ngch",
            "ngg",
            "ngh",
            "ngj",
            "ngl",
            "ngm",
            "ngt",
            "ngx",
            "ngy",
            "ngzh",
            "nh",
            "nl",
            "nm",
            "nq",
            "nr",
            "nt",
            "nx",
            "ny",
            "nzh",
            "q",
            "r",
            "sh",
            "t",
            "w",
            "x",
            "y",
            "zh",
        ]
        m4 = [
            "b",
            "c",
            "ch",
            "d",
            "f",
            "g",
            "h",
            "hs",
            "hw",
            "j",
            "k",
            "kh",
            "kw",
            "l",
            "m",
            "n",
            "p",
            "q",
            "r",
            "s",
            "sh",
            "sz",
            "t",
            "ts",
            "w",
            "x",
            "y",
            "zh",
            "z",
        ]
        s1 = [
            "a",
            "ba",
            "bai",
            "be",
            "bo",
            "bu",
            "chi",
            "da",
            "dai",
            "ei",
            "fu",
            "ga",
            "ge",
            "gi",
            "go",
            "ha",
            "hei",
            "hi",
            "ho",
            "hyo",
            "i",
            "ie",
            "jo",
            "ju",
            "ka",
            "ke",
            "kei",
            "ki",
            "ko",
            "ku",
            "kyu",
            "ma",
            "mi",
            "mo",
            "mu",
            "na",
            "nao",
            "ni",
            "no",
            "o",
            "ri",
            "ro",
            "ryo",
            "ryu",
            "sa",
            "se",
            "sei",
            "shi",
            "sho",
            "shu",
            "so",
            "su",
            "ta",
            "te",
            "tei",
            "to",
            "tsu",
            "u",
            "wa",
            "ya",
            "yo",
            "yu",
        ]
        s2 = [
            "bumi",
            "buro",
            "buru",
            "chemon",
            "chi",
            "chiro",
            "chiyo",
            "chizo",
            "dayu",
            "deki",
            "do",
            "fu",
            "fumi",
            "gobei",
            "goro",
            "hari",
            "haru",
            "hide",
            "hiko",
            "hira",
            "hiro",
            "hisa",
            "hito",
            "ji",
            "jio",
            "jiro",
            "juro",
            "kado",
            "kan",
            "kao",
            "karu",
            "kazu",
            "kei",
            "ki",
            "kichi",
            "kin",
            "kio",
            "kira",
            "ko",
            "koto",
            "kuchu",
            "kudo",
            "kumi",
            "kuni",
            "kusai",
            "kushi",
            "kusho",
            "kuzo",
            "mane",
            "maro",
            "masu",
            "matsu",
            "mei",
            "miaki",
            "michi",
            "mio",
            "mitsu",
            "mon",
            "mori",
            "moru",
            "moto",
            "mune",
            "nabu",
            "naga",
            "nari",
            "nji",
            "njiro",
            "nkei",
            "nko",
            "nobu",
            "nori",
            "noru",
            "noto",
            "noye",
            "npaku",
            "nshiro",
            "ntaro",
            "nzo",
            "rata",
            "rei",
            "ro",
            "roji",
            "roshi",
            "ru",
            "sada",
            "sake",
            "saku",
            "sami",
            "samu",
            "sashi",
            "sato",
            "seki",
            "setsu",
            "shashi",
            "shi",
            "shige",
            "shiko",
            "shiro",
            "sho",
            "shushu",
            "soshi",
            "su",
            "suke",
            "suki",
            "ta",
            "tada",
            "taka",
            "tane",
            "tari",
            "taro",
            "taru",
            "toki",
            "toku",
            "tomo",
            "tora",
            "toshi",
            "tsu",
            "tsugu",
            "tsumi",
            "tsuna",
            "tsune",
            "tsuta",
            "tsuyo",
            "tzumi",
            "wane",
            "yaki",
            "yasu",
            "yori",
            "yoshi",
            "yuki",
            "zane",
            "zo",
            "zuka",
            "zuki",
            "zuko",
            "zuma",
            "zumi",
            "zumo",
            "zushi",
        ]
        s3 = [
            "a",
            "ai",
            "ba",
            "be",
            "chi",
            "e",
            "ei",
            "fu",
            "ge",
            "ha",
            "hai",
            "hi",
            "ho",
            "i",
            "jo",
            "ka",
            "kae",
            "ki",
            "ko",
            "ku",
            "ma",
            "mae",
            "me",
            "mi",
            "mo",
            "mu",
            "na",
            "nao",
            "ni",
            "no",
            "o",
            "rai",
            "rei",
            "ri",
            "ro",
            "ru",
            "sa",
            "sai",
            "se",
            "shi",
            "su",
            "ta",
            "te",
            "to",
            "tsu",
            "u",
            "wa",
            "ya",
            "yae",
            "yo",
            "yu",
        ]
        s4 = [
            "bari",
            "chi",
            "chiha",
            "chiho",
            "chiko",
            "cho",
            "deko",
            "doka",
            "fumi",
            "fuyu",
            "gino",
            "gusa",
            "haru",
            "hiro",
            "ho",
            "hoko",
            "homi",
            "hori",
            "jiko",
            "ka",
            "kage",
            "kako",
            "kami",
            "kane",
            "kari",
            "karu",
            "kaze",
            "ki",
            "kichi",
            "kiko",
            "kina",
            "kio",
            "kira",
            "ko",
            "koto",
            "kuko",
            "kuma",
            "kuro",
            "kyo",
            "maki",
            "mako",
            "mari",
            "maya",
            "meka",
            "meko",
            "mi",
            "miho",
            "mika",
            "miki",
            "miko",
            "mina",
            "miri",
            "miya",
            "mugi",
            "na",
            "nae",
            "nai",
            "nako",
            "nami",
            "natsu",
            "neka",
            "neko",
            "niko",
            "no",
            "noka",
            "nomi",
            "noue",
            "nu",
            "nuko",
            "nuye",
            "nuyo",
            "ra",
            "rako",
            "rante",
            "rari",
            "rea",
            "ri",
            "rika",
            "riko",
            "rime",
            "rimi",
            "rino",
            "risa",
            "risu",
            "rize",
            "ro",
            "roe",
            "roko",
            "romi",
            "roshi",
            "ru",
            "rui",
            "ruka",
            "ruko",
            "rumi",
            "sa",
            "sae",
            "sahi",
            "saji",
            "saki",
            "sako",
            "sami",
            "samu",
            "sano",
            "sato",
            "se",
            "shi",
            "shiko",
            "shiyo",
            "soko",
            "sono",
            "suka",
            "suki",
            "sumi",
            "suzu",
            "taba",
            "tako",
            "taru",
            "to",
            "tomi",
            "tomo",
            "tose",
            "toshi",
            "tsu",
            "tsue",
            "tsuka",
            "tsuko",
            "tsumi",
            "tsune",
            "tsuyo",
            "yaka",
            "yako",
            "yame",
            "yano",
            "yeko",
            "yo",
            "yu",
            "yuka",
            "yuki",
            "yuko",
            "yume",
            "yumi",
            "yuri",
            "zami",
            "zu",
            "zue",
            "zuki",
            "zuko",
            "zumi",
            "zuru",
            "zusa",
        ]

        name = ""
        if gender is None or gender not in Tian.TianType:
            gender = choice(list(Tian.TianType))
        if gender == Tian.TianType.Male:
            name += choice(m1) + choice(m2) + choice(m3)
            if randrange(2) == 1:
                name += choice(m2) + choice(m3)
            name += choice(m4)

        else:  # Female
            name += choice(f1) + choice(f2) + choice(f3)
            if randrange(2) == 1:
                name += choice(f2) + choice(f3)
            name += choice(f4)

        # Last name
        name += " " + choice(s1) + choice(s2) + choice(s3)
        if randrange(2) == 1:
            name += choice(s2) + choice(s3)
        name += choice(s4)

        return name.title()


class Undine(Character):
    class UndineType(Enum):
        Male = auto()
        Female = auto()

    @staticmethod
    def generate(gender: UndineType = None):
        f1 = ["", "", "", "", "", "bh", "d", "dh", "g", "gh", "j", "kh", "m", "n", "r", "rh", "sh", "v", "z"]
        f2 = [
            "a",
            "e",
            "i",
            "o",
            "a",
            "e",
            "i",
            "o",
            "a",
            "e",
            "i",
            "o",
            "a",
            "e",
            "i",
            "o",
            "a",
            "e",
            "i",
            "o",
            "a",
            "e",
            "i",
            "o",
            "aa",
            "oo",
        ]
        f3 = [
            "b",
            "bd",
            "c",
            "cd",
            "d",
            "dd",
            "db",
            "g",
            "gd",
            "gv",
            "gn",
            "gm",
            "j",
            "k",
            "kb",
            "kd",
            "kn",
            "km",
            "kv",
            "m",
            "md",
            "mm",
            "mb",
            "n",
            "nn",
            "nb",
            "nd",
            "r",
            "rd",
            "rg",
            "rv",
            "rz",
            "v",
            "b",
            "c",
            "d",
            "g",
            "j",
            "k",
            "m",
            "n",
            "r",
            "v",
        ]
        f4 = ["d", "hz", "j", "k", "m", "n", "r", "sh", "v"]
        m1 = ["", "", "", "b", "c", "d", "f", "h", "l", "m", "n", "p", "r", "s", "w", "z"]
        m2 = [
            "a",
            "e",
            "i",
            "u",
            "a",
            "e",
            "i",
            "u",
            "a",
            "e",
            "i",
            "u",
            "a",
            "e",
            "i",
            "u",
            "a",
            "e",
            "i",
            "u",
            "y",
            "y",
            "y",
            "ya",
            "aa",
        ]
        m3 = [
            "b",
            "bh",
            "d",
            "dz",
            "dh",
            "fd",
            "fn",
            "ff",
            "f",
            "fz",
            "hn",
            "hl",
            "hr",
            "hm",
            "h",
            "hh",
            "l",
            "lg",
            "ld",
            "lb",
            "lf",
            "ln",
            "m",
            "mm",
            "mn",
            "mr",
            "mf",
            "n",
            "nn",
            "nr",
            "nd",
            "nf",
            "nh",
            "r",
            "rh",
            "rb",
            "rv",
            "rd",
            "rz",
            "v",
            "vr",
            "b",
            "d",
            "f",
            "h",
            "l",
            "n",
            "m",
            "r",
            "v",
            "b",
            "d",
            "f",
            "h",
            "l",
            "n",
            "m",
            "r",
            "v",
        ]
        m4 = ["", "", "", "", "", "", "", "", "", "", "h", "n"]

        name = ""
        if gender is None or gender not in Undine.UndineType:
            gender = choice(list(Undine.UndineType))
        if gender == Undine.UndineType.Male:
            name += choice(m1) + choice(m2) + choice(m3)
            if randrange(2) == 1:
                name += choice(m2) + choice(m3)
            name += choice(m4)

        else:  # Female
            name += choice(f1) + choice(f2) + choice(f3)
            if randrange(2) == 1:
                name += choice(f2) + choice(f3)
            name += choice(f4)

        return name.title()


class Vanara(Character):
    @staticmethod
    def generate():
        n1 = [
            "Abder",
            "Absyr",
            "Abyd",
            "Acast",
            "Achat",
            "Achel",
            "Acher",
            "Achil",
            "Achl",
            "Acris",
            "Act",
            "Adelph",
            "Adm",
            "Adon",
            "Adr",
            "Adras",
            "Aeg",
            "Aeol",
            "Aggel",
            "Alcin",
            "Ald",
            "Ambr",
            "Amyc",
            "Anast",
            "Anat",
            "Anc",
            "And",
            "Andr",
            "Ant",
            "Apost",
            "Arc",
            "Arg",
            "Arist",
            "Ars",
            "Ast",
            "Aster",
            "Bacc",
            "Bas",
            "Bast",
            "Bauc",
            "Ceph",
            "Cerb",
            "Ces",
            "Cet",
            "Char",
            "Cim",
            "Cir",
            "Corb",
            "Cyr",
            "Daem",
            "Dam",
            "Dar",
            "Darr",
            "Dem",
            "Dim",
            "Dion",
            "Dor",
            "Dun",
            "Egid",
            "Elefth",
            "Eleuth",
            "Endr",
            "Eras",
            "Ereb",
            "Eum",
            "Eur",
            "Eust",
            "Ev",
            "Fan",
            "Fed",
            "Feodr",
            "Gael",
            "Gal",
            "Gil",
            "Gor",
            "Greg",
            "Haem",
            "Hect",
            "Hel",
            "Ias",
            "Ic",
            "Idom",
            "Ignat",
            "Inach",
            "Ivank",
            "Jas",
            "Kadm",
            "Kir",
            "Konst",
            "Korud",
            "Kost",
            "Krat",
            "Kyr",
            "Lad",
            "Lak",
            "Land",
            "Laz",
            "Leand",
            "Lich",
            "Louk",
            "Lox",
            "Lyc",
            "Maur",
            "Ment",
            "Mich",
            "Myl",
            "Nark",
            "Nem",
            "Nik",
            "Nil",
            "Nill",
            "Ocn",
            "Oen",
            "Oenom",
            "Or",
            "Orthr",
            "Pal",
            "Panag",
            "Par",
            "Pell",
            "Petr",
            "Pil",
            "Pirr",
            "Preb",
            "Prot",
            "Rhod",
            "Sav",
            "Savv",
            "Sim",
            "Sot",
            "Stam",
            "Stavr",
            "Stel",
            "Sterg",
            "Tak",
            "Tal",
            "Than",
            "Thaum",
            "Tim",
            "Timm",
            "Tit",
            "Tod",
            "Tol",
            "Tox",
            "Trit",
            "Vas",
            "Yan",
            "Yann",
            "Yor",
            "Yrig",
            "Zar",
            "Zen",
            "Zeph",
            "Zolt",
        ]
        n2 = ["us", "ius", "os", "in", "as"]
        n3 = ["ia", "ia", "a", "ia"]

        c = randrange(3)
        if c == 0:
            return choice(n1) + choice(n2)
        elif c == 1:
            return choice(n1) + choice(n3)
        elif c == 2:
            return choice(n1) + choice(n2) + choice(n3)


class Vishkanya(Character):
    @staticmethod
    def generate():
        n1 = ["", "", "", "", "c", "d", "g", "r", "s", "t", "th", "v", "z"]
        n2 = ["a", "e", "i", "o", "u"]
        n3 = [
            "ch",
            "h",
            "hr",
            "l",
            "lr",
            "lth",
            "lv",
            "n",
            "nn",
            "nv",
            "r",
            "rr",
            "rv",
            "rz",
            "s",
            "sh",
            "th",
            "z",
            "zh",
            "zr",
        ]
        n4 = ["y", "a", "a", "e", "i", "o", "u", "u"]
        n5 = ["h", "m", "n", "r", "s", "th", "v", "z"]
        n6 = [
            "ee",
            "ia",
            "ea",
            "a",
            "a",
            "e",
            "i",
            "i",
            "o",
            "u",
            "a",
            "a",
            "e",
            "i",
            "i",
            "o",
            "u",
            "a",
            "a",
            "e",
            "i",
            "i",
            "o",
            "u",
            "a",
            "a",
            "e",
            "i",
            "i",
            "o",
            "u",
            "a",
            "a",
            "e",
            "i",
            "i",
            "o",
            "u",
            "a",
            "a",
            "e",
            "i",
            "i",
            "o",
            "u",
            "a",
            "a",
            "e",
            "i",
            "i",
            "o",
            "u",
            "a",
            "a",
            "e",
            "i",
            "i",
            "o",
            "u",
        ]
        n7 = ["", "", "", "", "", "", "", "d", "l", "r", "s", "th", "v", "z"]
        n8 = [
            "Battle",
            "Bear",
            "Blood",
            "Bone",
            "Boulder",
            "Bright",
            "Dark",
            "Dead",
            "Death",
            "Demon",
            "Doom",
            "Dragon",
            "Ember",
            "Fire",
            "Fist",
            "Frost",
            "Fuse",
            "Giant",
            "Gold",
            "Gore",
            "Grand",
            "Great",
            "Hell",
            "Iron",
            "Light",
            "Mammoth",
            "Molten",
            "Night",
            "Phoenix",
            "Proud",
            "Rage",
            "Raven",
            "Red",
            "Rock",
            "Rumble",
            "Shadow",
            "Sharp",
            "Shield",
            "Silent",
            "Silver",
            "Single",
            "Skull",
            "Spirit",
            "Steel",
            "Stone",
            "Storm",
            "Stout",
            "Strong",
            "Swift",
            "Thunder",
            "True",
            "Void",
            "War",
            "Wild",
            "Wolf",
        ]
        n9 = [
            "bane",
            "blade",
            "blood",
            "blow",
            "bolt",
            "bow",
            "breaker",
            "brow",
            "chaser",
            "claw",
            "cleaver",
            "crest",
            "cut",
            "eye",
            "fang",
            "fist",
            "flayer",
            "fury",
            "gaze",
            "grim",
            "grimace",
            "grip",
            "hair",
            "hallow",
            "hammer",
            "hand",
            "head",
            "heart",
            "helm",
            "hide",
            "mane",
            "mantle",
            "might",
            "pelt",
            "rage",
            "roar",
            "scar",
            "scream",
            "shade",
            "shadow",
            "shield",
            "shout",
            "snarl",
            "song",
            "sorrow",
            "stare",
            "stride",
            "strike",
            "sword",
            "sworn",
            "talon",
            "thorn",
            "tongue",
            "visage",
        ]
        n10 = [
            "Riddle",
            "War",
            "Adventure",
            "Ambition",
            "Battle",
            "Beginning",
            "Border",
            "Breath",
            "Light",
            "Chain",
            "Challenge",
            "Comfort",
            "Creation",
            "Death",
            "Delay",
            "Puzzle",
            "Dream",
            "Escape",
            "Failure",
            "Faith",
            "Fear",
            "Flow",
            "Fortune",
            "Friendship",
            "Gift",
            "Horror",
            "Image",
            "Impulse",
            "Joke",
            "Journey",
            "Mask",
            "Pleasure",
            "Prize",
            "Price",
            "Storm",
            "Redemption",
            "Requiem",
            "Risk",
            "River",
            "Path",
            "Rumor",
            "Shadow",
            "Secret",
            "Song",
            "Sorrow",
            "Spirit",
            "Soul",
            "Thrill",
            "Surprise",
            "Thunder",
            "Wisdom",
            "Wealth",
            "Victory",
            "Strength",
            "Silver",
            "Riches",
            "Pride",
            "Power",
            "Patience",
            "Mercy",
            "Magic",
            "Luck",
            "Love",
            "Life",
            "Liberty",
            "Lessons",
            "Laughter",
            "Justice",
            "Kindness",
            "History",
            "Happiness",
            "Grief",
            "Grace",
            "Gold",
            "Generosity",
            "Elegance",
            "Dreams",
            "Distance",
            "Guidance",
            "Discovery",
            "Dance",
            "Curiosity",
            "Courage",
            "Clouds",
            "Charity",
            "Light",
            "Darkness",
            "Brilliance",
            "Bravery",
            "Blood",
            "Advice",
            "Might",
            "Prowess",
        ]

        name = ""
        if randrange(2) == 0:
            name += choice(n1) + choice(n2) + choice(n3) + choice(n6) + choice(n7)
        else:
            name += choice(n1) + choice(n2) + choice(n3) + choice(n4) + choice(n5) + choice(n6) + choice(n7)

        c = randrange(6)
        if c == 0:
            name += " " + choice(n8) + choice(n9)
        elif c == 1:
            name += " " + choice(n8) + " " + choice(n9)
        elif c == 2:
            name += " " + choice(n8) + " " + choice(n9)
        elif c == 3:
            name += " of " + choice(n10) + "s"
        elif c == 4:
            name += " of " + choice(n10)
        else:
            name = choice(n10) + " of " + name

        return name.title()
