diff --git a/Input.js b/Input.js index 86e4c9a..6d41832 100644 --- a/Input.js +++ b/Input.js @@ -48,6 +48,7 @@ const setAutoXpSynonyms = ["setautoxp", "autoxp"] const showAutoXpSynonyms = ["showautoxp"] const setDefaultDifficultySynonyms = ["setdefaultdifficulty", "defaultdifficulty", "setdefaultdc", "defaultdc", "setdefaultac", "defaultac"] const showDefaultDifficultySynonyms = ["showdefaultdifficulty", "showdefaultdc", "showdefaultac"] +const generateNameSynonyms = ["generatename", "name", "randomname", "makename", "createname"] const helpSynonyms = ["help"] const modifier = (text) => { @@ -80,7 +81,7 @@ const modifier = (text) => { return { text } } - if (!found) found = processCommandSynonyms(command, commandName, helpSynonyms.concat(rollSynonyms, noteSynonyms, eraseNoteSynonyms, showNotesSynonyms, clearNotesSynonyms, showCharactersSynonyms, removeCharacterSynonyms, resetSynonyms), function () {return true}) + if (!found) found = processCommandSynonyms(command, commandName, helpSynonyms.concat(rollSynonyms, noteSynonyms, eraseNoteSynonyms, showNotesSynonyms, clearNotesSynonyms, showCharactersSynonyms, removeCharacterSynonyms, generateNameSynonyms, resetSynonyms), function () {return true}) if (found == null) { if (state.characterName == null) { @@ -144,6 +145,7 @@ const modifier = (text) => { if (text == null) text = processCommandSynonyms(command, commandName, showAutoXpSynonyms, doShowAutoXp) if (text == null) text = processCommandSynonyms(command, commandName, setDefaultDifficultySynonyms, doSetDefaultDifficulty) if (text == null) text = processCommandSynonyms(command, commandName, showDefaultDifficultySynonyms, doShowDefaultDifficulty) + if (text == null) text = processCommandSynonyms(command, commandName, generateNameSynonyms, doGenerateName) if (text == null) text = processCommandSynonyms(command, commandName, helpSynonyms, doHelp) if (text == null) { var character = getCharacter() @@ -1654,6 +1656,17 @@ function doRemoveCharacter(command) { return `[Character ${arg0} was not found.]` } +function doGenerateName(command) { + var gender = searchArgument(command, /^(male)|(female)$/gi) + if (gender == null) gender = "male" + + var genre = searchArgument(command, /^(fantasy)|(modern)|(scifi)|(nordic)$/gi) + if (genre == null) genre = "fantasy" + + state.show = "none" + return `[The character's name is ${generateName(genre, gender.toLowerCase() == "male")}]` +} + function doClearSpells(command) { var character = getCharacter() character.spells = [] diff --git a/Library.js b/Library.js index be289fb..3cc6541 100644 --- a/Library.js +++ b/Library.js @@ -2,6 +2,21 @@ function getRandomInteger(min, max) { return Math.floor(Math.random() * (max - min + 1) ) + min; } +function getRandom(seed) { + var x = Math.sin(seed) * 10000 + return x - Math.floor(x) +} + +function shuffle(array, seed) { + let currentIndex = array.length + while (currentIndex != 0) { + let randomIndex = Math.floor(getRandom(seed + currentIndex) * currentIndex) + currentIndex-- + [array[currentIndex], array[randomIndex]] = [ + array[randomIndex], array[currentIndex]] + } +} + function sanitizeText(text) { if (/^\s*>.*says? ".*/.test(text)) { text = text.replace(/^\s*>\s/, "") @@ -404,4 +419,90 @@ function toTitleCase(str) { function stripPunctuation(str) { return str.replaceAll(/((\.)|(!))\s*$/g, "") +} + +var fantasyFemaleNames = ["Luna", "Kayla", "Serenity", "Eira", "Mirah", "Elowen", "Keira", "Calantha", "Natalia", "Eirlys", "Freya", "Ophelia", "Piper", "Alethea", "Melara", "Seraphina", "Delilah", "Lorna", "Echo", "Bree", "Daniella", "Branwen", "Matilda", "Eve", "Brynhild", "Ithilda", "Belinda", "Catarina", "Jora", "Zelda", "Thalia", "Rowan", "Aurora", "Coral", "Vivian", "Briella", "Elvina", "Lylah", "Mirastral", "Nadira", "Marcella", "Kestrel", "Avis", "Laura", "Vesper", "Lucilla", "Sabine", "Evelyn", "Kalinda", "Celeste", "Lilith", "Wren", "Jasmine", "Ondine", "Gabriella", "Astrid", "Elise", "Helena", "Nova", "Lyndal", "Zara", "Niamh", "Vynessa", "Erin", "Lyriel", "Dracaena", "Lila", "Brynna", "Zephyr", "Kira", "Ava", "Elinor", "Carmilla", "Isabella", "Ariana", "Rhianna", "Sylvie", "Kymberley", "Hazel", "Lirien", "Bridget", "Lyra", "Galatea", "Nadine", "Alethia", "Larissa", "Sariel", "Theodora", "Gwynneth", "Eleanor", "Odessa", "Meryll", "Sophia", "Kaia", "Brynhilda", "Haven", "Eluned", "Selene", "Bryony", "Ciara"] + +var fantasyMaleNames = ["Alexander", "Thane", "Gabriel", "Orion", "Grayson", "Cedric", "Sebastian", "Arin", "Liam", "Byerson", "Julian", "Zaneth", "Kel", "Eramon", "Ashfur", "Tristam", "Leonidas", "Ryzlen", "Caspian", "Jarron", "Eudicles", "Tarquin", "Terrence", "Ereth", "Thayon", "Braxton", "Twilight", "Argent", "Whisper", "Daemon", "Victor", "Blackthorn", "Dawnrunner", "Gareth", "Caelum", "Zephyr", "Brennan", "Theo", "Draco", "Cian", "Valoric", "Skye", "Sunfor", "Damon", "Maverick", "Bryson", "Lumo", "Drakken", "Ewen", "Waverley", "Lachlan", "Atlas", "Arden", "Ryker", "Asterion", "Bryon", "Judson", "Griffith", "Logan", "Ethan", "Darius", "Brodeth", "Cassius", "Eamon", "Rowan", "Paxton", "Michael", "Dommon", "Aragorn", "Bastier", "Maximus", "Kenrick", "Jasper", "Lucien", "Bryce", "Ryder", "Damian", "Daxton", "Brantley", "Griffin", "Xander", "Galen", "Brody", "Erek", "Drake", "Thayer", "Kieran", "Heath", "Raeleus", "Alistair", "Bastian", "Asher", "Ronan", "Zane", "Jaxon", "Ambrose", "Malcolm", "Axel", "Ehtan", "Avery", "Kael", "Riley"] + +var scifiFemaleNames = ["Jala", "Clea", "Jocosa", "Artemis", "Serafina", "Sevyn", "Tesla", "Lux", "Nine", "Kiara", "Valentina", "Morticia", "Rio", "Xyleena", "Libby", "Valkyrie", "Panika", "Lara", "Fenglina", "Makiko", "Katja", "Paige", "Elie", "Lucie", "Samanta", "Hazel", "Helena", "Leia", "Luminara", "Katan", "Vala", "Inara", "Saffron", "Zoe", "Jayne", "Kaylee", "Maeve", "Kara", "Athena", "Cally", "Anastasia", "Pegi", "Alita", "Alkhema", "Arcena", "Ko", "Bodika", "Candi", "Chi", "Rae", "Cylla", "Daria", "Chalma", "Elita", "Eryx", "Eva", "Nova", "Celeste", "Guri", "Hexen", "Indigo", "Juli", "Katana", "Talia", "Lala", "Mika", "Miranda", "Nebula", "Six", "Sasha", "Silica", "Sky", "Strika", "Terra", "Yori", "Andromeda", "Astra", "Bellatrix", "Callista", "Cosima", "Delphine", "Electra", "Phantasy", "Farrah", "Geneva", "Haven", "Jade", "Juno", "Lillix", "Lynx", "Nya", "Oria", "Parris", "Priya", "Rue", "Clarity", "Bloom", "Decca", "Domonique", "Grazi", "Helvetica", "Cadence"] + +var scifiMaleNames = ["Ares", "Astro", "Macro", "Cadmus", "Cyno", "Fade", "Hack", "Hax", "Indigo", "Hinge", "Jarno", "Jax", "Knox", "Link", "Maxx", "Merrick", "Miles", "Mirari", "Niko", "Nano", "Oberon", "Onyx", "Orion", "Osso", "Paradox", "Pip", "Phoenix", "Radius", "Rexx", "Razlin", "Reznor", "Rian", "Roscoe", "Ryker", "Rush", "Riden", "Drake", "Frost", "Cassian", "Neyo", "Maverick", "Azriel", "Auryn", "Daggar", "Evyn", "Jace", "Jaron", "Loki", "Oren", "Ridley", "Sagan", "Silas","Solon", "Stellan", "Sorrel", "Seth", "Theron", "Zen", "Klay", "Blaze", "Xander", "Mace", "Dozer", "Eno", "Tip", "Ray", "Genesis", "Galac", "Eclipse", "Zev", "Zaid", "Wilder", "Sol", "Jupiter", "Mars", "Star", "Cosmo", "Aster", "Lazer", "Zeno", "Sirius", "Azra", "Atom", "Teague", "Rigel", "Cato", "Zhane", "Ace", "Rocket", "Kip", "Meter", "Starbuck", "Roman", "Fiat", "Kyron", "Nyx", "Rune", "Nero", "Quantum", "Nym", "Morphius", "Striker", "Bridger"] + +var modernFemaleNames = ["Olivia", "Emma", "Amelia", "Ella", "Isabella", "Mia", "Valerie", "Eliana", "Charlotte", "Mila", "Aria", "Luna", "Harper", "Grace", "Zoey", "Jemma", "Priscilla", "Scarlett", "Hazel", "Ellie", "Naya", "Nila", "Tamia", "Cecilia", "Arianna", "Abigail", "Riley", "Autumn", "Maya", "Madelyn", "Maria", "Melody", "Sophia", "Ava", "Luz", "Eleanor", "Ivy", "Freya", "Alice", "Violet", "Clara", "Daphne", "Evelyn", "Nora", "Lucy", "Poppy", "Rose", "Chloe", "Phoebe", "Elsie", "Cordelia", "Willow", "Daisy", "Thea", "Adeline", "Arabella", "Maisie", "Lola", "Olive", "Sienna", "Sierra", "Elena", "Sadie", "Sophie", "Julia", "Alexandra", "Jane", "Mira", "Talia", "Zara", "Vera", "Amara", "Cynthia", "Hannah", "Aurora", "Anya", "Erin", "Felicity", "Juno", "Yelena", "Naomi", "Caroline", "Miriam", "Veronica", "Molly", "June", "Nina", "Piper", "Helena", "Amari", "Everly", "Bonnie", "Alina", "Emilia", "Harriet", "Isabel", "Sofia", "Kayla", "Lena", "Megan", "Diana"] + +var modernMaleNames = ["Jackson", "Aiden", "Charles", "Adam", "Christopher", "Daniel", "Liam", "Oliver", "Mateo", "Henry", "Lucas", "William", "Theodore", "Noah", "John", "Arnold", "Norman", "Ralph", "Virgil", "Will", "Sam", "Luca", "David", "Joseph", "Mason", "Luke", "Matthew", "Dylan", "Jacob", "Isaac", "Anthony", "Carter", "Caleb", "Cooper", "Josiah", "Nolan", "Cameron", "Nathan", "Josh", "Angel", "Andrew", "Aaron", "Ian", "Eli", "Ryan", "Everett", "Enzo", "Parker", "Jeremiah", "Landon", "Jordan", "Austin", "Jameson", "Myles", "Dominic", "Nicholas", "Kayden", "Hunter", "Harrison", "Milo", "Arthur", "Ryder", "Archer", "Luis", "George", "Evan", "Carlos", "Juan", "Jason", "Leon", "Calvin", "Ivan", "Cole", "Chase", "Dean", "Jayce", "Olliver", "Alan", "Jesus", "Charlie", "Tyler", "Elliot", "Kevin", "Ayden", "Felix", "Tate", "Jesse", "Brody", "Tucker", "Peter", "Joel", "Edward", "Oscar", "Victor", "Brandon", "Bruce", "Abel", "Richard", "Riley", "Patrick", "Eric", "Elian", "Louis"] + +var nordicFemaleNames = ["Freya", "Dagny", "Ingrid", "Froya", "Elin", "Solveig", "Maja", "Sol", "Linnea", "Vilde", "Var", "Aldis", "Alfrida", "Alfsol", "Alva", "Alvdis", "Alvida", "Andora", "Anveig", "Asa", "Astri", "Astrid", "Bolette", "Brynhild", "Disa", "Eir", "Eira", "Eidis", "Elevine", "Elfi", "Embla", "Erna", "Freja", "Frida", "Fredrikke", "Gerda", "Gry", "Gurina", "Gurine", "Gyda", "Haddy", "Halgerd", "Helga", "Helje", "Helle", "Herdis", "Herfrid", "Hilde", "Hulda", "Inga", "Idun", "Isfrid", "Iverna", "Iverine", "Jorgina", "Kari", "Lagertha", "Liv", "Livunn", "Malfrid", "Malmfrid", "Nanna", "Oda", "Odel", "Odine", "Olava", "Runa", "Ragnfrid", "Randi", "Ragnhild", "Saga", "Sif", "Sigrid", "Siv", "Solvei", "Soma", "Svanild", "Thora", "Tora", "Thurid", "Torveig", "Torfrid", "Trude", "Tyra", "Tyri", "Udna", "Unni", "Una", "Unnlaug", "Unnveig", "Valdine", "Vedis", "Valborg", "Vivil", "Ylva", "Yngva", "Thoril", "Thorine", "Sigfrida", "Sigun", "Sigvor", "Signe", "Reidunn"] + +var nordicMaleNames = ["Erik", "Bjorn", "Lars", "Asmund", "Harald", "Arne", "Odin", "Ivar", "Leif", "Aesir", "Axel", "Aren", "Aric", "Balder", "Birger", "Bjarke", "Bjarne", "Nils", "Steig", "Erling", "Espen", "Fenrir", "Frey", "Einar", "Garald", "Anders", "Gunnar", "Hagan", "Halfthor", "Halfdan", "Kjell", "Hanne", "Ingvar", "Helge", "Herleif", "Jarl", "Joran", "Magnus", "Norrell", "Njord", "Olaf", "Osman", "Ragnar", "Sigurd", "Steffen", "Sten", "Sven", "Tor", "Torben", "Troels", "Tyr", "Tyrell", "Ulf", "Viggo", "Vali", "Vidar", "Volund", "Wayde", "Waddell", "Alviss", "Anneli", "Stig", "Eino", "Haakon", "Haldor", "Iver", "Sindri", "Trym", "Varg", "Alf", "Amund", "Arn", "Arnstein", "Arvid", "Bjarni", "Bjoern", "Bragi", "Brede", "Dag", "Dagfinn", "Egil", "Endre", "Erlend", "Even", "Finn", "Flosi", "Fredrik", "Frode", "Freyr", "Geir", "Gisli", "Grim", "Gudbrand", "Gustav", "Hakan", "Hakon", "Hans", "Helgi", "Ingolf", "Jomar", "Knut", "Orm"] + +function generateName(genre, male) { + if (genre.toLowerCase() == "fantasy") { + if (male) { + if (state.fantasyMaleIndex == null || state.fantasyMaleIndex >= fantasyMaleNames.length) { + state.fantasyMaleIndex = 0 + state.fantasyMaleSeed = getRandomInteger(1, 1000) + } + shuffle(fantasyMaleNames, state.fantasyMaleSeed) + return fantasyMaleNames[state.fantasyMaleIndex++] + } else { + if (state.fantasyFemaleIndex == null || state.fantasyFemaleIndex >= fantasyFemaleNames.length) { + state.fantasyFemaleIndex = 0 + state.fantasyFemaleSeed = getRandomInteger(1, 1000) + } + shuffle(fantasyFemaleNames, state.fantasyFemaleSeed) + return fantasyFemaleNames[state.fantasyFemaleIndex++] + } + } else if (genre.toLowerCase() == "modern") { + if (male) { + if (state.modernMaleIndex == null || state.modernMaleIndex >= modernMaleNames.length) { + state.modernMaleIndex = 0 + state.modernMaleSeed = getRandomInteger(1, 1000) + } + shuffle(modernMaleNames, state.modernMaleSeed) + return modernMaleNames[state.modernMaleIndex++] + } else { + if (state.modernFemaleIndex == null || state.modernFemaleIndex >= modernFemaleNames.length) { + state.modernFemaleIndex = 0 + state.modernFemaleSeed = getRandomInteger(1, 1000) + } + shuffle(modernFemaleNames, state.modernFemaleSeed) + return modernFemaleNames[state.modernFemaleIndex++] + } + } else if (genre.toLowerCase() == "scifi") { + if (male) { + if (state.scifiMaleIndex == null || state.scifiMaleIndex >= scifiMaleNames.length) { + state.scifiMaleIndex = 0 + state.scifiMaleSeed = getRandomInteger(1, 1000) + } + shuffle(scifiMaleNames, state.scifiMaleSeed) + return scifiMaleNames[state.scifiMaleIndex++] + } + else { + if (state.scifiFemaleIndex == null || state.scifiFemaleIndex >= scifiFemaleNames.length) { + state.scifiFemaleIndex = 0 + state.scifiFemaleSeed = getRandomInteger(1, 1000) + } + shuffle(scifiFemaleNames, state.scifiFemaleSeed) + return scifiFemaleNames[state.scifiFemaleIndex++] + } + } else if (genre.toLowerCase() == "nordic") { + if (male) { + if (state.nordicMaleIndex == null || state.nordicMaleIndex >= nordicMaleNames.length) { + state.nordicMaleIndex = 0 + state.nordicMaleSeed = getRandomInteger(1, 1000) + } + shuffle(nordicMaleNames, state.nordicMaleSeed) + return nordicMaleNames[state.nordicMaleIndex++] + } + else { + if (state.nordicFemaleIndex == null || state.nordicFemaleIndex >= nordicFemaleNames.length) { + state.nordicFemaleIndex = 0 + state.nordicFemaleSeed = getRandomInteger(1, 1000) + } + shuffle(nordicFemaleNames, state.nordicFemaleSeed) + return nordicFemaleNames[state.nordicFemaleIndex++] + } + } } \ No newline at end of file diff --git a/Output.js b/Output.js index ca22b27..c08f9c6 100644 --- a/Output.js +++ b/Output.js @@ -189,6 +189,8 @@ const modifier = (text) => { text += "--Basic Hashtags--" text += "\n#roll (advantage|disadvantage) (dice_value)" text += "\n Rolls a die/dice and shows the result. dice_value can be in the following formats 5d20 or d20 or 20" + text += "\n#generatename (male|female) (fantasy|modern|scifi|nordic)" + text += "\n Retrieves a random name from a list of names in the specified gender and genre" text += "\n#shownotes" text += "\n Shows all the notes." text += "\n#note message"