add exceptions to english_plural and english_singular

This commit is contained in:
GenevensiS
2026-04-19 16:04:20 +02:00
parent 968ad5f196
commit 17dd3cf407
2 changed files with 820 additions and 4 deletions
+33 -4
View File
@@ -7,6 +7,7 @@
// ----------------------------------------------------------------------------- : Includes // ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp> #include <util/prec.hpp>
#include <script/functions/english_exceptions.cpp>
#include <script/functions/functions.hpp> #include <script/functions/functions.hpp>
#include <script/functions/util.hpp> #include <script/functions/util.hpp>
#include <util/tagged_string.hpp> #include <util/tagged_string.hpp>
@@ -152,8 +153,22 @@ SCRIPT_FUNCTION(english_number_ordinal) {
// ----------------------------------------------------------------------------- : Singular/plural // ----------------------------------------------------------------------------- : Singular/plural
String english_singular(const String& str) { String english_singular(const String& str) {
if (str.Lower() == _("plains")) return str; if (str.empty()) return String();
String lower = str.Lower();
if (english_singular_exceptions.find(lower) != english_singular_exceptions.end()) {
if (isupper(str[0])) {
if (isupper(str[str.size()-1])) {
return english_singular_exceptions[lower].Upper();
} else {
return capitalize(english_singular_exceptions[lower]);
}
} else {
return english_singular_exceptions[lower];
}
}
if (str.size() > 3 && is_substr(str, str.size()-3, _("ies"))) { if (str.size() > 3 && is_substr(str, str.size()-3, _("ies"))) {
return str.substr(0, str.size() - 3) + _("y"); return str.substr(0, str.size() - 3) + _("y");
} else if (str.size() > 3 && is_substr(str, str.size()-3, _("oes"))) { } else if (str.size() > 3 && is_substr(str, str.size()-3, _("oes"))) {
@@ -174,8 +189,22 @@ String english_singular(const String& str) {
return str; return str;
} }
} }
String english_plural(const String& str) { String english_plural(const String& str) {
if (str.Lower() == _("plains")) return str; if (str.empty()) return String();
String lower = str.Lower();
if (english_plural_exceptions.find(lower) != english_plural_exceptions.end()) {
if (isupper(str[0])) {
if (isupper(str[str.size()-1])) {
return english_plural_exceptions[lower].Upper();
} else {
return capitalize(english_plural_exceptions[lower]);
}
} else {
return english_plural_exceptions[lower];
}
}
if (str.size() > 2) { if (str.size() > 2) {
Char a = str.GetChar(str.size() - 2); Char a = str.GetChar(str.size() - 2);
Char b = str.GetChar(str.size() - 1); Char b = str.GetChar(str.size() - 1);
+787
View File
@@ -0,0 +1,787 @@
//+----------------------------------------------------------------------------+
//| Description: Magic Set Editor - Program to make card games |
//| Copyright: (C) Twan van Laarhoven and the other MSE developers |
//| License: GNU General Public License 2 or later (see file COPYING) |
//+----------------------------------------------------------------------------+
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
// ----------------------------------------------------------------------------- : Maps
inline std::unordered_map<String, String> english_plural_exceptions {
{ "plains", "plains" }
, { "advisor", "advisors" }
, { "aetherborn", "aetherborn" }
, { "alien", "aliens" }
, { "ally", "allies" }
, { "angel", "angels" }
, { "antelope", "antelopes" }
, { "ape", "apes" }
, { "archer", "archers" }
, { "archon", "archons" }
, { "armadillo", "armadillos" }
, { "army", "armies" }
, { "artificer", "artificers" }
, { "assassin", "assassins" }
, { "assembly-worker", "assembly-workers" }
, { "astartes", "astartes" }
, { "atog", "atogs" }
, { "aurochs", "aurochs" }
, { "avatar", "avatars" }
, { "azra", "azra" }
, { "badger", "badgers" }
, { "balloon", "balloons" }
, { "barbarian", "barbarians" }
, { "bard", "bards" }
, { "basilisk", "basilisks" }
, { "bat", "bats" }
, { "bear", "bears" }
, { "beast", "beasts" }
, { "beaver", "beavers" }
, { "beeble", "beebles" }
, { "beholder", "beholders" }
, { "berserker", "berserkers" }
, { "bird", "birds" }
, { "bison", "bison" }
, { "blinkmoth", "blinkmoths" }
, { "boar", "boars" }
, { "bringer", "bringers" }
, { "brushwagg", "brushwaggs" }
, { "c'tan", "c'tan" }
, { "camarid", "camarids" }
, { "camel", "camels" }
, { "capybara", "capybaras" }
, { "caribou", "caribou" }
, { "carrier", "carriers" }
, { "cat", "cats" }
, { "centaur", "centaurs" }
, { "child", "children" }
, { "chimera", "chimeras" }
, { "citizen", "citizens" }
, { "cleric", "clerics" }
, { "clown", "clowns" }
, { "cockatrice", "cockatrices" }
, { "construct", "constructs" }
, { "coward", "cowards" }
, { "coyote", "coyotes" }
, { "crab", "crabs" }
, { "crocodile", "crocodiles" }
, { "custodes", "custodes" }
, { "cyberman", "cybermen" }
, { "cyclops", "cyclopes" }
, { "dalek", "daleks" }
, { "dauthi", "dauthi" }
, { "demigod", "demigods" }
, { "demon", "demons" }
, { "deserter", "deserters" }
, { "detective", "detectives" }
, { "devil", "devils" }
, { "dinosaur", "dinosaurs" }
, { "djinn", "djinn" }
, { "doctor", "doctors" }
, { "dog", "dogs" }
, { "dragon", "dragons" }
, { "drake", "drakes" }
, { "dreadnought", "dreadnoughts" }
, { "drix", "drix" }
, { "drone", "drones" }
, { "druid", "druids" }
, { "dryad", "dryads" }
, { "dwarf", "dwarves" }
, { "echidna", "echdnas" }
, { "efreet", "efreets" }
, { "egg", "eggs" }
, { "elder", "elders" }
, { "eldrazi", "eldrazi" }
, { "elemental", "elementals" }
, { "elephant", "elephants" }
, { "elf", "elves" }
, { "elk", "elk" }
, { "employee", "employees" }
, { "eternal", "eternals" }
, { "eye", "eyes" }
, { "faerie", "faeries" }
, { "ferret", "ferrets" }
, { "fish", "fish" }
, { "flagbearer", "flagbearers" }
, { "fox", "foxes" }
, { "fractal", "fractals" }
, { "frog", "frogs" }
, { "fungus", "fungi" }
, { "gamer", "gamers" }
, { "gamma", "gamma mutates" }
, { "gargoyle", "gargoyles" }
, { "germ", "germs" }
, { "giant", "giants" }
, { "giraffe", "giraffes" }
, { "gith", "gith" }
, { "glimmer", "glimmers" }
, { "gnoll", "gnolls" }
, { "gnome", "gnomes" }
, { "goat", "goats" }
, { "goblin", "goblins" }
, { "god", "gods" }
, { "golem", "golems" }
, { "gorgon", "gorgons" }
, { "graveborn", "graveborn" }
, { "gremlin", "gremlins" }
, { "griffin", "griffins" }
, { "guest", "guests" }
, { "hag", "hags" }
, { "halfling", "halflings" }
, { "hamster", "hamsters" }
, { "harpy", "harpies" }
, { "hedgehog", "hedgehogs" }
, { "hellion", "hellions" }
, { "hero", "heroes" }
, { "hippo", "hippos" }
, { "hippogriff", "hippogriffs" }
, { "homarid", "homarids" }
, { "homunculus", "homunculi" }
, { "horror", "horrors" }
, { "horse", "horses" }
, { "human", "humans" }
, { "hydra", "hydras" }
, { "hyena", "hyenas" }
, { "illusion", "illusions" }
, { "imp", "imps" }
, { "incarnation", "incarnations" }
, { "inkling", "inklings" }
, { "inquisitor", "inquisitors" }
, { "insect", "insects" }
, { "jackal", "jackals" }
, { "jellyfish", "jellyfish" }
, { "juggernaut", "juggernauts" }
, { "kangaroo", "kangaroos" }
, { "kavu", "kavu" }
, { "kirin", "kirin" }
, { "kithkin", "kithkin" }
, { "knight", "knights" }
, { "kobold", "kobolds" }
, { "kor", "kor" }
, { "kraken", "krakens" }
, { "lamia", "lamia" }
, { "lammasu", "lammasu" }
, { "leech", "leeches" }
, { "lemur", "lemurs" }
, { "leviathan", "leviathans" }
, { "lhurgoyf", "lhurgoyfs" }
, { "licid", "licids" }
, { "lizard", "lizards" }
, { "llama", "llamas" }
, { "lobster", "lobsters" }
, { "manticore", "manticores" }
, { "masticore", "masticores" }
, { "mercenary", "mercenaries" }
, { "merfolk", "merfolk" }
, { "metathran", "metathran" }
, { "minion", "minions" }
, { "minotaur", "minotaurs" }
, { "mite", "mites" }
, { "mole", "moles" }
, { "monger", "mongers" }
, { "mongoose", "mongooses" }
, { "monk", "monks" }
, { "monkey", "monkeys" }
, { "moogle", "moogles" }
, { "moonfolk", "moonfolk" }
, { "mount", "mounts" }
, { "mouse", "mice" }
, { "mutant", "mutants" }
, { "myr", "myr" }
, { "mystic", "mystics" }
, { "nautilus", "nautiluses" }
, { "necron", "necrons" }
, { "nephilim", "nephilim" }
, { "nightmare", "nightmares" }
, { "nightstalker", "nightstalkers" }
, { "ninja", "ninja" }
, { "noble", "nobles" }
, { "noggle", "noggles" }
, { "nomad", "nomads" }
, { "nymph", "nymphs" }
, { "octopus", "octopuses" }
, { "ogre", "ogres" }
, { "ooze", "oozes" }
, { "orb", "orbs" }
, { "orc", "orcs" }
, { "orgg", "orggs" }
, { "otter", "otters" }
, { "ouphe", "ouphes" }
, { "ox", "oxen" }
, { "oyster", "oysters" }
, { "pangolin", "pangolins" }
, { "peasant", "peasants" }
, { "pegasus", "pegasi" }
, { "pentavite", "pentavites" }
, { "performer", "performers" }
, { "pest", "pests" }
, { "phelddagrif", "phelddagrifs" }
, { "phoenix", "phoenixes" }
, { "phyrexian", "phyrexians" }
, { "pilot", "pilots" }
, { "pincher", "pinchers" }
, { "pirate", "pirates" }
, { "plant", "plants" }
, { "platypus", "platypuses" }
, { "porcupine", "porcupines" }
, { "possum", "possums" }
, { "praetor", "praetors" }
, { "primarch", "primarchs" }
, { "prism", "prisms" }
, { "processor", "processors" }
, { "qu", "qu" }
, { "rabbit", "rabbits" }
, { "raccoon", "raccoons" }
, { "ranger", "rangers" }
, { "rat", "rats" }
, { "rebel", "rebels" }
, { "reflection", "reflections" }
, { "rhino", "rhinos" }
, { "rigger", "riggers" }
, { "robot", "robots" }
, { "rogue", "rogues" }
, { "sable", "sables" }
, { "salamander", "salamanders" }
, { "samurai", "samurai" }
, { "sand", "sands" }
, { "saproling", "saprolings" }
, { "satyr", "satyrs" }
, { "scarecrow", "scarecrows" }
, { "scientist", "scientists" }
, { "scion", "scions" }
, { "scorpion", "scorpions" }
, { "scout", "scouts" }
, { "sculpture", "sculptures" }
, { "seal", "seals" }
, { "serf", "serfs" }
, { "serpent", "serpents" }
, { "servo", "servos" }
, { "shade", "shades" }
, { "shaman", "shamans" }
, { "shapeshifter", "shapeshifters" }
, { "shark", "sharks" }
, { "sheep", "sheep" }
, { "siren", "sirens" }
, { "skeleton", "skeletons" }
, { "skrull", "skrulls" }
, { "skunk", "skunks" }
, { "slith", "slith" }
, { "sliver", "slivers" }
, { "sloth", "sloths" }
, { "slug", "slugs" }
, { "snail", "snails" }
, { "snake", "snakes" }
, { "soldier", "soldiers" }
, { "soltari", "soltari" }
, { "sorcerer", "sorcerers" }
, { "spawn", "spawns" }
, { "specter", "specters" }
, { "spellshaper", "spellshapers" }
, { "sphinx", "sphinxes" }
, { "spider", "spiders" }
, { "spike", "spikes" }
, { "spirit", "spirits" }
, { "splinter", "splinters" }
, { "sponge", "sponges" }
, { "spy", "spies" }
, { "squid", "squids" }
, { "squirrel", "squirrels" }
, { "starfish", "starfish" }
, { "surrakar", "surrakar" }
, { "survivor", "survivors" }
, { "symbiote", "symbiotes" }
, { "synth", "synths" }
, { "tentacle", "tentacles" }
, { "tetravite", "tetravites" }
, { "thalakos", "thalakos" }
, { "thopter", "thopters" }
, { "thrull", "thrulls" }
, { "tiefling", "tieflings" }
, { "time lord", "time lords" }
, { "toy", "toys" }
, { "treefolk", "treefolk" }
, { "trilobite", "trilobites" }
, { "triskelavite", "triskelavites" }
, { "troll", "trolls" }
, { "turtle", "turtles" }
, { "tyranid", "tyranids" }
, { "unicorn", "unicorns" }
, { "utrom", "utrom" }
, { "vampire", "vampires" }
, { "varmint", "varmints" }
, { "vedalken", "vedalken" }
, { "villain", "villains" }
, { "volver", "volvers" }
, { "wall", "walls" }
, { "walrus", "walruses" }
, { "warlock", "warlocks" }
, { "warrior", "warriors" }
, { "weasel", "weasels" }
, { "weird", "weirds" }
, { "werewolf", "werewolves" }
, { "whale", "whales" }
, { "wizard", "wizards" }
, { "wolf", "wolves" }
, { "wolverine", "wolverines" }
, { "wombat", "wombats" }
, { "worm", "worms" }
, { "wraith", "wraiths" }
, { "wurm", "wurms" }
, { "yeti", "yeti" }
, { "zombie", "zombies" }
, { "zubera", "zubera" }
, { "alicorn", "alicorns" }
, { "armored", "armored" }
, { "art", "arts" }
, { "artist", "artists" }
, { "athlete", "athletes" }
, { "attendee", "attendees" }
, { "autobot", "autobots" }
, { "aven", "aven" }
, { "boxer", "boxers" }
, { "brainiac", "brainiacs" }
, { "bureaucrat", "bureaucrats" }
, { "chameleon", "chameleons" }
, { "champion", "champions" }
, { "chef", "chefs" }
, { "chicken", "chickens" }
, { "clamfolk", "clamfolk" }
, { "cow", "cows" }
, { "cyborg", "cyborgs" }
, { "deer", "deer" }
, { "designer", "designers" }
, { "die", "dice" }
, { "donkey", "donkeys" }
, { "elemental?", "elementals?" }
, { "elves", "elves" }
, { "expansion-symbol", "expansion-symbols" }
, { "fan", "fans" }
, { "fighter", "fighters" }
, { "glass", "glass" }
, { "gorilla", "gorillas" }
, { "grandchild", "grandchildren" }
, { "gus", "gus" }
, { "half", "halves" }
, { "hatificer", "hatificers" }
, { "hawk", "hawks" }
, { "head", "heads" }
, { "human?", "humans?" }
, { "jaguar", "jaguars" }
, { "judge", "judges" }
, { "killbot", "killbots" }
, { "lady of proper etiquette", "ladies of proper etiquette" }
, { "locus", "loci" }
, { "mammoth", "mammoths" }
, { "mime", "mimes" }
, { "mummy", "mummies" }
, { "paratrooper", "paratroopers" }
, { "penguin", "penguins" }
, { "pony", "ponies" }
, { "present", "presents" }
, { "reveler", "revelers" }
, { "ship", "ships" }
, { "sketch", "sketches" }
, { "spuzzem", "spuzzem" }
, { "spy", "spies" }
, { "stained", "stained" }
, { "teddy", "teddies" }
, { "the biggest, baddest, nastiest, scariest creature you'll ever see", "the biggest, baddest, nastiest, scariest creatures you'll ever see" }
, { "townsfolk", "townsfolk" }
, { "tree", "trees" }
, { "vampyre", "vampyres" }
, { "waiter", "waiters" }
, { "windmill", "windmills" }
, { "wrestler", "wrestlers" }
, { "zonian", "zonians" }
};
inline std::unordered_map<wxString, wxString> english_singular_exceptions {
{ "plains", "plains" }
, { "advisors", "advisor" }
, { "aetherborn", "aetherborn" }
, { "aliens", "alien" }
, { "allies", "ally" }
, { "angels", "angel" }
, { "antelopes", "antelope" }
, { "apes", "ape" }
, { "archers", "archer" }
, { "archons", "archon" }
, { "armadillos", "armadillo" }
, { "armies", "army" }
, { "artificers", "artificer" }
, { "assassins", "assassin" }
, { "assembly-workers", "assembly-worker" }
, { "astartes", "astartes" }
, { "atogs", "atog" }
, { "aurochs", "aurochs" }
, { "avatars", "avatar" }
, { "azra", "azra" }
, { "badgers", "badger" }
, { "balloons", "balloon" }
, { "barbarians", "barbarian" }
, { "bards", "bard" }
, { "basilisks", "basilisk" }
, { "bats", "bat" }
, { "bears", "bear" }
, { "beasts", "beast" }
, { "beavers", "beaver" }
, { "beebles", "beeble" }
, { "beholders", "beholder" }
, { "berserkers", "berserker" }
, { "birds", "bird" }
, { "bison", "bison" }
, { "blinkmoths", "blinkmoth" }
, { "boars", "boar" }
, { "bringers", "bringer" }
, { "brushwaggs", "brushwagg" }
, { "c'tan", "c'tan" }
, { "camarids", "camarid" }
, { "camels", "camel" }
, { "capybaras", "capybara" }
, { "caribou", "caribou" }
, { "carriers", "carrier" }
, { "cats", "cat" }
, { "centaurs", "centaur" }
, { "children", "child" }
, { "chimeras", "chimera" }
, { "citizens", "citizen" }
, { "clerics", "cleric" }
, { "clowns", "clown" }
, { "cockatrices", "cockatrice" }
, { "constructs", "construct" }
, { "cowards", "coward" }
, { "coyotes", "coyote" }
, { "crabs", "crab" }
, { "crocodiles", "crocodile" }
, { "custodes", "custodes" }
, { "cybermen", "cyberman" }
, { "cyclopes", "cyclops" }
, { "daleks", "dalek" }
, { "dauthi", "dauthi" }
, { "demigods", "demigod" }
, { "demons", "demon" }
, { "deserters", "deserter" }
, { "detectives", "detective" }
, { "devils", "devil" }
, { "dinosaurs", "dinosaur" }
, { "djinn", "djinn" }
, { "doctors", "doctor" }
, { "dogs", "dog" }
, { "dragons", "dragon" }
, { "drakes", "drake" }
, { "dreadnoughts", "dreadnought" }
, { "drix", "drix" }
, { "drones", "drone" }
, { "druids", "druid" }
, { "dryads", "dryad" }
, { "dwarves", "dwarf" }
, { "echdnas", "echidna" }
, { "efreets", "efreet" }
, { "eggs", "egg" }
, { "elders", "elder" }
, { "eldrazi", "eldrazi" }
, { "elementals", "elemental" }
, { "elephants", "elephant" }
, { "elves", "elf" }
, { "elk", "elk" }
, { "employees", "employee" }
, { "eternals", "eternal" }
, { "eyes", "eye" }
, { "faeries", "faerie" }
, { "ferrets", "ferret" }
, { "fish", "fish" }
, { "flagbearers", "flagbearer" }
, { "foxes", "fox" }
, { "fractals", "fractal" }
, { "frogs", "frog" }
, { "fungi", "fungus" }
, { "gamers", "gamer" }
, { "gamma mutates", "gamma" }
, { "gargoyles", "gargoyle" }
, { "germs", "germ" }
, { "giants", "giant" }
, { "giraffes", "giraffe" }
, { "gith", "gith" }
, { "glimmers", "glimmer" }
, { "gnolls", "gnoll" }
, { "gnomes", "gnome" }
, { "goats", "goat" }
, { "goblins", "goblin" }
, { "gods", "god" }
, { "golems", "golem" }
, { "gorgons", "gorgon" }
, { "graveborn", "graveborn" }
, { "gremlins", "gremlin" }
, { "griffins", "griffin" }
, { "guests", "guest" }
, { "hags", "hag" }
, { "halflings", "halfling" }
, { "hamsters", "hamster" }
, { "harpies", "harpy" }
, { "hedgehogs", "hedgehog" }
, { "hellions", "hellion" }
, { "heroes", "hero" }
, { "hippos", "hippo" }
, { "hippogriffs", "hippogriff" }
, { "homarids", "homarid" }
, { "homunculi", "homunculus" }
, { "horrors", "horror" }
, { "horses", "horse" }
, { "humans", "human" }
, { "hydras", "hydra" }
, { "hyenas", "hyena" }
, { "illusions", "illusion" }
, { "imps", "imp" }
, { "incarnations", "incarnation" }
, { "inklings", "inkling" }
, { "inquisitors", "inquisitor" }
, { "insects", "insect" }
, { "jackals", "jackal" }
, { "jellyfish", "jellyfish" }
, { "juggernauts", "juggernaut" }
, { "kangaroos", "kangaroo" }
, { "kavu", "kavu" }
, { "kirin", "kirin" }
, { "kithkin", "kithkin" }
, { "knights", "knight" }
, { "kobolds", "kobold" }
, { "kor", "kor" }
, { "krakens", "kraken" }
, { "lamia", "lamia" }
, { "lammasu", "lammasu" }
, { "leeches", "leech" }
, { "lemurs", "lemur" }
, { "leviathans", "leviathan" }
, { "lhurgoyfs", "lhurgoyf" }
, { "licids", "licid" }
, { "lizards", "lizard" }
, { "llamas", "llama" }
, { "lobsters", "lobster" }
, { "manticores", "manticore" }
, { "masticores", "masticore" }
, { "mercenaries", "mercenary" }
, { "merfolk", "merfolk" }
, { "metathran", "metathran" }
, { "minions", "minion" }
, { "minotaurs", "minotaur" }
, { "mites", "mite" }
, { "moles", "mole" }
, { "mongers", "monger" }
, { "mongooses", "mongoose" }
, { "monks", "monk" }
, { "monkeys", "monkey" }
, { "moogles", "moogle" }
, { "moonfolk", "moonfolk" }
, { "mounts", "mount" }
, { "mice", "mouse" }
, { "mutants", "mutant" }
, { "myr", "myr" }
, { "mystics", "mystic" }
, { "nautiluses", "nautilus" }
, { "necrons", "necron" }
, { "nephilim", "nephilim" }
, { "nightmares", "nightmare" }
, { "nightstalkers", "nightstalker" }
, { "ninja", "ninja" }
, { "nobles", "noble" }
, { "noggles", "noggle" }
, { "nomads", "nomad" }
, { "nymphs", "nymph" }
, { "octopuses", "octopus" }
, { "ogres", "ogre" }
, { "oozes", "ooze" }
, { "orbs", "orb" }
, { "orcs", "orc" }
, { "orggs", "orgg" }
, { "otters", "otter" }
, { "ouphes", "ouphe" }
, { "oxen", "ox" }
, { "oysters", "oyster" }
, { "pangolins", "pangolin" }
, { "peasants", "peasant" }
, { "pegasi", "pegasus" }
, { "pentavites", "pentavite" }
, { "performers", "performer" }
, { "pests", "pest" }
, { "phelddagrifs", "phelddagrif" }
, { "phoenixes", "phoenix" }
, { "phyrexians", "phyrexian" }
, { "pilots", "pilot" }
, { "pinchers", "pincher" }
, { "pirates", "pirate" }
, { "plants", "plant" }
, { "platypuses", "platypus" }
, { "porcupines", "porcupine" }
, { "possums", "possum" }
, { "praetors", "praetor" }
, { "primarchs", "primarch" }
, { "prisms", "prism" }
, { "processors", "processor" }
, { "qu", "qu" }
, { "rabbits", "rabbit" }
, { "raccoons", "raccoon" }
, { "rangers", "ranger" }
, { "rats", "rat" }
, { "rebels", "rebel" }
, { "reflections", "reflection" }
, { "rhinos", "rhino" }
, { "riggers", "rigger" }
, { "robots", "robot" }
, { "rogues", "rogue" }
, { "sables", "sable" }
, { "salamanders", "salamander" }
, { "samurai", "samurai" }
, { "sands", "sand" }
, { "saprolings", "saproling" }
, { "satyrs", "satyr" }
, { "scarecrows", "scarecrow" }
, { "scientists", "scientist" }
, { "scions", "scion" }
, { "scorpions", "scorpion" }
, { "scouts", "scout" }
, { "sculptures", "sculpture" }
, { "seals", "seal" }
, { "serfs", "serf" }
, { "serpents", "serpent" }
, { "servos", "servo" }
, { "shades", "shade" }
, { "shamans", "shaman" }
, { "shapeshifters", "shapeshifter" }
, { "sharks", "shark" }
, { "sheep", "sheep" }
, { "sirens", "siren" }
, { "skeletons", "skeleton" }
, { "skrulls", "skrull" }
, { "skunks", "skunk" }
, { "slith", "slith" }
, { "slivers", "sliver" }
, { "sloths", "sloth" }
, { "slugs", "slug" }
, { "snails", "snail" }
, { "snakes", "snake" }
, { "soldiers", "soldier" }
, { "soltari", "soltari" }
, { "sorcerers", "sorcerer" }
, { "spawns", "spawn" }
, { "specters", "specter" }
, { "spellshapers", "spellshaper" }
, { "sphinxes", "sphinx" }
, { "spiders", "spider" }
, { "spikes", "spike" }
, { "spirits", "spirit" }
, { "splinters", "splinter" }
, { "sponges", "sponge" }
, { "spies", "spy" }
, { "squids", "squid" }
, { "squirrels", "squirrel" }
, { "starfish", "starfish" }
, { "surrakar", "surrakar" }
, { "survivors", "survivor" }
, { "symbiotes", "symbiote" }
, { "synths", "synth" }
, { "tentacles", "tentacle" }
, { "tetravites", "tetravite" }
, { "thalakos", "thalakos" }
, { "thopters", "thopter" }
, { "thrulls", "thrull" }
, { "tieflings", "tiefling" }
, { "time lords", "time lord" }
, { "toys", "toy" }
, { "treefolk", "treefolk" }
, { "trilobites", "trilobite" }
, { "triskelavites", "triskelavite" }
, { "trolls", "troll" }
, { "turtles", "turtle" }
, { "tyranids", "tyranid" }
, { "unicorns", "unicorn" }
, { "utrom", "utrom" }
, { "vampires", "vampire" }
, { "varmints", "varmint" }
, { "vedalken", "vedalken" }
, { "villains", "villain" }
, { "volvers", "volver" }
, { "walls", "wall" }
, { "walruses", "walrus" }
, { "warlocks", "warlock" }
, { "warriors", "warrior" }
, { "weasels", "weasel" }
, { "weirds", "weird" }
, { "werewolves", "werewolf" }
, { "whales", "whale" }
, { "wizards", "wizard" }
, { "wolves", "wolf" }
, { "wolverines", "wolverine" }
, { "wombats", "wombat" }
, { "worms", "worm" }
, { "wraiths", "wraith" }
, { "wurms", "wurm" }
, { "yeti", "yeti" }
, { "zombies", "zombie" }
, { "zubera", "zubera" }
, { "alicorns", "alicorn" }
, { "armored", "armored" }
, { "arts", "art" }
, { "artists", "artist" }
, { "athletes", "athlete" }
, { "attendees", "attendee" }
, { "autobots", "autobot" }
, { "aven", "aven" }
, { "boxers", "boxer" }
, { "brainiacs", "brainiac" }
, { "bureaucrats", "bureaucrat" }
, { "chameleons", "chameleon" }
, { "champions", "champion" }
, { "chefs", "chef" }
, { "chickens", "chicken" }
, { "clamfolk", "clamfolk" }
, { "cows", "cow" }
, { "cyborgs", "cyborg" }
, { "deer", "deer" }
, { "designers", "designer" }
, { "dice", "die" }
, { "donkeys", "donkey" }
, { "elementals?", "elemental?" }
, { "elves", "elves" }
, { "expansion-symbols", "expansion-symbol" }
, { "fans", "fan" }
, { "fighters", "fighter" }
, { "glass", "glass" }
, { "gorillas", "gorilla" }
, { "grandchildren", "grandchild" }
, { "gus", "gus" }
, { "halves", "half" }
, { "hatificers", "hatificer" }
, { "hawks", "hawk" }
, { "heads", "head" }
, { "humans?", "human?" }
, { "jaguars", "jaguar" }
, { "judges", "judge" }
, { "killbots", "killbot" }
, { "ladies of proper etiquette", "lady of proper etiquette" }
, { "loci", "locus" }
, { "mammoths", "mammoth" }
, { "mimes", "mime" }
, { "mummies", "mummy" }
, { "paratroopers", "paratrooper" }
, { "penguins", "penguin" }
, { "ponies", "pony" }
, { "presents", "present" }
, { "revelers", "reveler" }
, { "ships", "ship" }
, { "sketches", "sketch" }
, { "spuzzem", "spuzzem" }
, { "spies", "spy" }
, { "stained", "stained" }
, { "teddies", "teddy" }
, { "the biggest, baddest, nastiest, scariest creatures you'll ever see", "the biggest, baddest, nastiest, scariest creature you'll ever see" }
, { "townsfolk", "townsfolk" }
, { "trees", "tree" }
, { "vampyres", "vampyre" }
, { "waiters", "waiter" }
, { "windmills", "windmill" }
, { "wrestlers", "wrestler" }
, { "zonians", "zonian" }
};