/* EQEmu: EQEmulator Copyright (C) 2001-2026 EQEmu Development Team This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "races.h" #include "common/data_verification.h" const char* GetRaceIDName(uint16 race_id) { switch (race_id) { case Race::Abhorrent: return "Abhorrent"; case Race::AirElemental: case Race::AirElemental2: return "Air Elemental"; case Race::AirMephit: return "Air Mephit"; case Race::Akhevan: case Race::Akheva: return "Akheva"; case Race::Alaran: return "Alaran"; case Race::AlaranGhost: return "Alaran Ghost"; case Race::AlaranSentryStone: return "Alaran Sentry Stone"; case Race::Alligator: case Race::Alligator2: return "Alligator"; case Race::Denizen: case Race::Amygdalan: return "Amygdalan"; case Race::Aneuk: return "Aneuk"; case Race::AnimatedArmor: return "Animated Armor"; case Race::AnimatedHand: return "Animated Hand"; case Race::AnimatedStatue: case Race::AnimatedStatue2: return "Animated Statue"; case Race::Apexus: return "Apexus"; case Race::Arachnid: return "Arachnid"; case Race::ArcanistOfHate: return "Arcanist of Hate"; case Race::Armadillo: return "Armadillo"; case Race::ArmorRack: return "Armor Rack"; case Race::Aviak: case Race::Aviak2: return "Aviak"; case Race::AviakPullAlong: return "Aviak Pull Along"; case Race::AyonaeRo: return "Ayonae Ro"; case Race::Banner: case Race::Banner2: case Race::Banner3: case Race::Banner4: case Race::Banner5: case Race::Banner6: case Race::Banner7: return "Banner"; case Race::TenthAnniversaryBanner: return "10th Anniversary Banner"; case Race::Banshee: case Race::Banshee2: case Race::Banshee3: return "Banshee"; case Race::Barbarian: case Race::HalasCitizen: return "Barbarian"; case Race::Barrel: return "Barrel"; case Race::UndeadBoat: return "Barrel Barge Ship"; case Race::Basilisk: return "Basilisk"; case Race::GiantBat: case Race::Bat: case Race::Bat2: return "Bat"; case Race::Bazu: return "Bazu"; case Race::Bear: case Race::Bear2: case Race::Bear3: return "Bear"; case Race::BearMount: return "Bear Mount"; case Race::BearTrap: return "Bear Trap"; case Race::Beetle: case Race::Beetle2: case Race::Beetle3: return "Beetle"; case Race::HumanBeggar: return "Beggar"; case Race::Bellikos: return "Bellikos"; case Race::Bertoxxulous: case Race::BertoxxulousNew: return "Bertoxxulous"; case Race::Bixie: case Race::Bixie2: return "Bixie"; case Race::BlimpShip: return "Blimp Ship"; case Race::BlindDreamer: return "Blind Dreamer"; case Race::BloodRaven: return "Blood Raven"; case Race::Boat: case Race::Boat2: return "Boat"; case Race::Bolvirk: return "Bolvirk"; case Race::BoneGolem: case Race::BoneGolem2: return "Bone Golem"; case Race::Bones: return "Bones"; case Race::BookDervish: return "Book Dervish"; case Race::Portal: return "BoT Portal"; case Race::Boulder: return "Boulder"; case Race::Box: return "Box"; case Race::Braxi: return "Braxi"; case Race::BraxiMount: return "Braxi Mount"; case Race::Brell: return "Brell"; case Race::BrellsFirstCreation: return "Brell's First Creation"; case Race::Bristlebane: return "Bristlebane"; case Race::BrokenClockwork: return "Broken Clockwork"; case Race::Brontotherium: return "Brontotherium"; case Race::Brownie: case Race::Brownie2: return "Brownie"; case Race::Bubonian: return "Bubonian"; case Race::BubonianUnderling: return "Bubonian Underling"; case Race::Burynai: case Race::Burynai2: return "Burynai"; case Race::TenthAnniversaryCake: return "10th Anniversary Cake"; case Race::Campfire: return "Campfire"; case Race::CarrierHand: return "Carrier Hand"; case Race::Cat: return "Cat"; case Race::CazicThule: case Race::CazicThule2: return "Cazic Thule"; case Race::Centaur: case Race::Centaur2: return "Centaur"; case Race::Chest: case Race::Chest2: case Race::Chest3: return "Chest"; case Race::Chimera: case Race::Chimera2: return "Chimera"; case Race::Chokidai: return "Chokidai"; case Race::Clam: return "Clam"; case Race::CliknarMount: return "Cliknar Mount"; case Race::CliknarQueen: return "Cliknar Queen"; case Race::CliknarSoldier: return "Cliknar Soldier"; case Race::CliknarWorker: return "Cliknar Worker"; case Race::ClockworkBeetle: return "Clockwork Beetle"; case Race::ClockworkBoar: return "Clockwork Boar"; case Race::ClockworkBomb: return "Clockwork Bomb"; case Race::ClockworkBrain: return "Clockwork Brain"; case Race::ClockworkGnome: return "Clockwork Gnome"; case Race::ClockworkGolem: return "Clockwork Golem"; case Race::ClockworkGuardian: return "Clockwork Guardian"; case Race::Cockatrice: return "Cockatrice"; case Race::Coffin: case Race::Coffin2: return "Coffin"; case Race::CoinPurse: return "Coin Purse"; case Race::Coldain: case Race::Coldain2: case Race::Coldain3: return "Coldain"; case Race::Coral: return "Coral"; case Race::Corathus: return "Corathus"; case Race::Crab: return "Crab"; case Race::Cragbeast: return "Cragbeast"; case Race::Cragslither: return "Cragslither"; case Race::Crocodile: return "Crocodile"; case Race::Crystal: return "Crystal"; case Race::CrystalShard: return "Crystal Shard"; case Race::CrystalSphere: return "Crystal Sphere"; case Race::CrystalSpider: return "Crystal Spider"; case Race::CrystalskinAmbuloid: return "Crystalskin Ambuloid"; case Race::CrystalskinSessiloid: return "Crystalskin Sessiloid"; case Race::DaisyMan: return "Daisy Man"; case Race::DarkElf: case Race::NeriakCitizen: return "Dark Elf"; case Race::DarkLord: return "Dark Lord"; case Race::DemiLich: return "Demi Lich"; case Race::DemonVulture: return "Demon Vulture"; case Race::Dervish: case Race::Dervish2: case Race::Dervish3: case Race::Dervish4: return "Dervish"; case Race::Dervish5: return "Dervish(Ver. 5)"; case Race::Dervish6: return "Dervish(Ver. 6)"; case Race::Devourer: return "Devourer"; case Race::DireWolf: return "Dire Wolf"; case Race::DiscordShip: return "Discord Ship"; case Race::Discordling: return "Discordling"; case Race::DiseasedFiend: return "Diseased Fiend"; case Race::Djinn: return "Djinn"; case Race::Drachnid: case Race::Drachnid2: return "Drachnid"; case Race::DrachnidCocoon: return "Drachnid Cocoon"; case Race::Dracolich: return "Dracolich"; case Race::Draglock: return "Draglock"; case Race::LavaDragon: case Race::DragonSkeleton: case Race::WaterDragon: case Race::VeliousDragon: case Race::ClockworkDragon: case Race::BlackAndWhiteDragon: case Race::GhostDragon: case Race::PrismaticDragon: case Race::Quarm: case Race::Dragon: case Race::Dragon2: case Race::Dragon3: case Race::Dragon4: case Race::Dragon5: case Race::Dragon6: case Race::Dragon7: return "Dragon"; case Race::DragonBones: return "Dragon Bones"; case Race::DragonEgg: return "Dragon Egg"; case Race::DragonStatue: return "Dragon Statue"; case Race::Dragorn: return "Dragorn"; case Race::DragornBox: return "Dragorn Box"; case Race::Drake: case Race::Drake2: case Race::Drake3: return "Drake"; case Race::Drakkin: return "Drakkin"; case Race::Drixie: return "Drixie"; case Race::Drogmor: return "Drogmore"; case Race::Drolvarg: return "Drolvarg"; case Race::Dryad: return "Dryad"; case Race::Dwarf: case Race::KaladimCitizen: return "Dwarf"; case Race::DynamiteKeg: return "Dynamite Keg"; case Race::Dynleth: return "Dyn'Leth"; case Race::EarthElemental: case Race::EarthElemental2: return "Earth Elemental"; case Race::EarthMephit: return "Earth Mephit"; case Race::GiantEel: return "Eel"; case Race::Efreeti: case Race::Efreeti2: return "Efreeti"; case Race::Elddar: return "Elddar"; case Race::Elemental: return "Elemental"; case Race::ElkHead: return "Elk Head"; case Race::ElvenBoat: return "Elven Boat"; case Race::ElvenGhost: return "Elven Ghost"; case Race::EnchantedArmor: return "Enchanted Armor"; case Race::Erollisi: return "Erollisi"; case Race::Erudite: case Race::EruditeCitizen: case Race::Erudite2: return "Erudite"; case Race::EvanTest: return "Evan Test"; case Race::EvilEye: case Race::EvilEye2: case Race::EvilEye3: return "Evil Eye"; case Race::Exoskeleton: return "Exoskeleton"; case Race::ExplosiveCart: return "Explosive Cart"; case Race::EyeOfZomm: return "Eye"; case Race::Fairy: case Race::Fairy2: return "Fairy"; case Race::FallenKnight: return "Fallen Knight"; case Race::Faun: return "Faun"; case Race::FayDrake: return "Fay Drake"; case Race::FenninRo: return "Fennin Ro"; case Race::Feran: return "Feran"; case Race::FeranMount: return "Feran Mount"; case Race::Fiend: return "Fiend"; case Race::FireElemental: case Race::FireElemental2: return "Fire Elemental"; case Race::FireMephit: return "Fire Mephit"; case Race::Fish: case Race::KunarkFish: return "Fish"; case Race::Flag: return "Flag"; case Race::FloatingIsland: return "Floating Island"; case Race::FloatingSkull: return "Floating Skull"; case Race::FloatingTower: return "Floating Tower"; case Race::Fly: return "Fly"; case Race::FlyingCarpet: return "Flying Carpet"; case Race::ForestGiant2: return "Forest Giant"; case Race::Frog: case Race::Frog2: return "Frog"; case Race::Froglok: case Race::FroglokGhoul: case Race::Froglok2: return "Froglok"; case Race::FroglokGhost: return "Froglok Ghost"; case Race::FroglokSkeleton: return "Froglok Skeleton"; case Race::FungalFiend: return "Fungal Fiend"; case Race::FungusPatch: return "Fungus Patch"; case Race::Fungusman: return "Fungusman"; case Race::Galorian: return "Galorian"; case Race::Gargoyle: case Race::Gargoyle2: return "Gargoyle"; case Race::Gasbag: return "Gasbag"; case Race::GelatinousCube: case Race::GelatinousCube2: return "Gelatinous Cube"; case Race::Gelidran: return "Gelidran"; case Race::Genari: return "Genari"; case Race::Geonid: return "Geonid"; case Race::Ghost: case Race::DwarfGhost: case Race::EruditeGhost: case Race::PirateGhost: return "Ghost"; case Race::GhostShip: case Race::GhostShip2: return "Ghost Ship"; case Race::Ghoul: case Race::Ghoul2: return "Ghoul"; case Race::Giant: case Race::ForestGiant: case Race::FrostGiant: case Race::StormGiant: case Race::EarthGolem: case Race::IronGolem: case Race::StormGolem: case Race::AirGolem: case Race::WoodGolem: case Race::FireGolem: case Race::WaterGolem: case Race::Giant2: case Race::Giant3: return "Giant"; case Race::GiantClockwork: return "Giant Clockwork"; case Race::Giant4: return "Giant(Rallosian mats)"; case Race::GiantShade: return "Giant Shade"; case Race::Gigyn: return "Gigyn"; case Race::GingerbreadMan: return "Gingerbread Man"; case Race::Girplan: return "Girplan"; case Race::Gnoll: case Race::Gnoll2: case Race::Gnoll3: return "Gnoll"; case Race::Gnome: return "Gnome"; case Race::Gnomework: return "Gnomework"; case Race::GnomishBalloon: return "Gnomish Balloon"; case Race::GnomishBoat: return "Gnomish Boat"; case Race::GnomishHoveringTransport: return "Gnomish Hovering Transport"; case Race::GnomishRocketPack: return "Gnomish Rocket Pack"; case Race::Goblin: case Race::Bloodgill: case Race::KunarkGoblin: case Race::NewGoblin: case Race::Goblin2: return "Goblin"; case Race::Luclin2: return "God - Luclin(Ver. 2)"; case Race::Luclin3: return "God - Luclin(Ver. 3)"; case Race::Luclin4: return "God - Luclin(Ver. 4)"; case Race::GodOfDiscord: return "God of Discord"; case Race::Golem: case Race::Golem2: return "Golem"; case Race::Goo: case Race::Goo2: case Race::Goo3: case Race::Goo4: return "Goo"; case Race::Goral: return "Goral"; case Race::GoralMount: return "Goral Mount"; case Race::Gorgon: return "Gorgon"; case Race::Gorilla: case Race::Gorilla2: return "Gorilla"; case Race::GrandfatherClock: return "Grandfather Clock"; case Race::GrekenYoung: return "Greken - Young"; case Race::GrekenYoungAdult: return "Greken - Young Adult"; case Race::Grendlaen: return "Grendlaen"; case Race::GriegVeneficus: return "Grieg Veneficus"; case Race::Griffin: case Race::Griffin2: return "Griffin"; case Race::Grimling: return "Grimling"; case Race::GroundShaker: return "Ground Shaker"; case Race::FreeportGuard: case Race::Felguard: case Race::Fayguard: case Race::VahShirGuard: return "Guard"; case Race::GuardOfJustice: return "Guard of Justice"; case Race::GuardianCpu: return "Guardian CPU"; case Race::Hadal: return "Hadal"; case Race::Hag: return "Hag"; case Race::HalfElf: return "Half Elf"; case Race::Halfling: case Race::RivervaleCitizen: return "Halfling"; case Race::Harpy: case Race::Harpy2: return "Harpy"; case Race::HighElf: return "High Elf"; case Race::Hippogriff: return "Hippogriff"; case Race::Holgresh: case Race::Holgresh2: return "Holgresh"; case Race::HoneyPot: return "Honey Pot"; case Race::Horse: case Race::Horse2: case Race::Horse3: return "Horse"; case Race::HoveringPlatform: return "Hovering Platform"; case Race::Hraquis: return "Hraquis"; case Race::Human: case Race::HighpassCitizen: case Race::QeynosCitizen: case Race::Human2: return "Human"; case Race::HumanGhost: return "Human Ghost"; case Race::Huvul: return "Huvul"; case Race::HydraCrystal: return "Hydra Crystal"; case Race::HydraMount: return "Hydra Mount"; case Race::Hydra: return "Hydra NPC"; case Race::Hynid: return "Hynid"; case Race::IceSpectre: return "Ice Spectre"; case Race::Ikaav: return "Ikaav"; case Race::Iksar: case Race::IksarCitizen: return "Iksar"; case Race::IksarGhost: return "Iksar Ghost"; case Race::IksarGolem: return "Iksar Golem"; case Race::IksarSkeleton: return "Iksar Skeleton"; case Race::IksarSpirit: return "Iksar Spirit"; case Race::Imp: return "Imp"; case Race::Innoruuk: return "Innoruuk"; case Race::Insect: return "Insect"; case Race::InteractiveObject: return "Interactive Object"; case Race::InvisibleMan: case Race::InvisibleMan2: case Race::InvisibleMan3: return "Invisible Man"; case Race::InvisibleManOfZomm: return "Invisible Man of Zomm"; case Race::Ixt: return "Ixt"; case Race::Jokester: return "Jokester"; case Race::JumJumBucket: return "Jum Jum Bucket"; case Race::JunkBeast: return "Junk Beast"; case Race::Kangon: return "Kangon"; case Race::KangonMount: return "Kangon Mount"; case Race::Karana: return "Karana"; case Race::PhinigelAutropos: case Race::Kedge: return "Kedge"; case Race::Kerran: case Race::Kerran2: return "Kerran"; case Race::Kirin: case Race::Kirin2: return "Kirin"; case Race::KnightOfHate: return "Knight of Hate"; case Race::KnightOfPestilence: return "Knight of Pestilence"; case Race::Kobold: case Race::Kobold2: return "Kobold"; case Race::Kraken: return "Kraken"; case Race::Kyv: return "Kyv"; case Race::Launch: return "Launch"; case Race::LavaRock: return "Lava Rock"; case Race::LavaSpider: return "Lava Spider"; case Race::LavaSpiderQueen: return "Lava Spider Queen"; case Race::Leech: return "Leech"; case Race::Lepertoloth: return "Lepertoloth"; case Race::Lightcrawler: return "Lightcrawler"; case Race::LightingWarrior: return "Lightning Warrior"; case Race::Lion: return "Lion"; case Race::LizardMan: return "Lizard Man"; case Race::Luclin: return "Luclin"; case Race::Luggald: case Race::Luggald2: return "Luggald"; case Race::Luggald3: return "Luggalds"; case Race::Malarian: return "Malarian"; case Race::Mammoth: case Race::Mammoth2: return "Mammoth"; case Race::ManEatingPlant: return "Man - Eating Plant"; case Race::Mansion: return "Mansion"; case Race::Manticore: return "Manticore"; case Race::Unknown5: return "Mantrap"; case Race::Marionette: return "Marionette"; case Race::Mastruq: return "Mastruq"; case Race::MataMuram: return "Mata Muram"; case Race::Toolbox: return "Medium Plant"; case Race::Mephit: return "Mephit"; case Race::MerchantShip: return "Merchant Ship"; case Race::Mermaid: return "Mermaid"; case Race::Mimic: return "Mimic"; case Race::MiniPom: return "Mini POM"; case Race::Minotaur: case Race::Minotaur2: case Race::Minotaur3: case Race::Minotaur4: return "Minotaur"; case Race::MithanielMarr: return "Mithaniel Marr"; case Race::MorellThule: return "Morell Thule"; case Race::Mosquito: return "Mosquito"; case Race::MouthOfInsanity: return "Mouth of Insanity"; case Race::Muddite: return "Muddite"; case Race::Mummy: return "Mummy"; case Race::MuramiteArmorPile: return "Muramite Armor Pile"; case Race::Murkglider: return "Murkglider"; case Race::MurkgliderEggSack: return "Murkglider Egg Sac"; case Race::Mutna: return "Mutna"; case Race::Nekhon: return "Nekhon"; case Race::Netherbian: return "Netherbian"; case Race::Nightmare: return "Nightmare"; case Race::NightmareGargoyle: return "Nightmare Gargoyle"; case Race::NightmareGoblin: return "Nightmare Goblin"; case Race::NightmareMephit: return "Nightmare Mephit"; case Race::Unicorn2: case Race::Unicorn3: return "Nightmare / Unicorn"; case Race::NightmareWraith: return "Nightmare Wraith"; case Race::Nihil: return "Nihil"; case Race::Nilborien: return "Nilborien"; case Race::Noc: return "Noc"; case Race::Nymph: return "Nymph"; case Race::Ogre: case Race::OggokCitizen: return "Ogre"; case Race::Ogre2: return "Ogre NPC - Male"; case Race::Orb: return "Orb"; case Race::Orc: case Race::Orc2: return "Orc"; case Race::Othmir: return "Othmir"; case Race::Owlbear: return "Owlbear"; case Race::ParasiticScavenger: return "Parasitic Scavenger"; case Race::Pegasus: case Race::Pegasus2: case Race::Pegasus3: return "Pegasus"; case Race::Phoenix: return "Phoenix"; case Race::Piranha: return "Piranha"; case Race::OneArmedPirate: case Race::SpiritmasterNadox: case Race::BrokenSkullTaskmaster: case Race::GnomePirate: case Race::DarkElfPirate: case Race::OgrePirate: case Race::HumanPirate: case Race::EruditePirate: return "Pirate"; case Race::PirateShip: return "Pirate Ship"; case Race::Pixie: return "Pixie"; case Race::PoisonFrog: return "Poison Frog"; case Race::Portal2: return "Portal"; case Race::PowderKeg: return "Powder Keg"; case Race::PressurePlate: return "Pressure Plate"; case Race::PufferSpore: return "Puffer Spore"; case Race::Puma: case Race::Puma2: case Race::Puma3: return "Puma"; case Race::Pusling: return "Pusling"; case Race::Pyrilen: return "Pyrilen"; case Race::Ratuk: return "Ra`tuk"; case Race::Rabbit: return "Rabbit"; case Race::StatueOfRallosZek: case Race::NewRallosZek: return "Rallos Zek"; case Race::RallosOgre: return "Rallos Zek Minion"; case Race::Raptor: case Race::Raptor2: return "Raptor"; case Race::RaptorMount: return "Raptor Mount"; case Race::GiantRat: case Race::Rat: return "Rat"; case Race::RatMount: return "Rat Mount"; case Race::Ratman: case Race::Ratman2: return "Ratman"; case Race::ReanimatedHand: return "Reanimated Hand"; case Race::Recuso: return "Recuso"; case Race::RegenerationPool: return "Regeneration Pool"; case Race::RelicCase: return "Relic case "; case Race::RhinoBeetle: return "Rhino Beetle"; case Race::Rhinoceros: return "Rhinoceros"; case Race::RobocopterOfZomm: return "Robocopter of Zomm"; case Race::RockPile: return "Rock Pile"; case Race::Rockhopper: return "Rockhopper"; case Race::RonnieTest: return "Ronnie Test"; case Race::RootTentacle: return "Root Tentacle"; case Race::RotDogMount: return "Rot Dog Mount"; case Race::RotDog: return "Rotdog"; case Race::Rotocopter: return "Rotocopter"; case Race::Rowboat: return "Rowboat"; case Race::RoyalGuard: return "Royal Guard"; case Race::RujarkianOrc: case Race::MasterOrc: return "Rujarkian Orc"; case Race::RunedOrb: return "Runed Orb"; case Race::RunicSymbol: return "Runic Symbol"; case Race::Sabertooth: return "Saber - toothed Cat"; case Race::SaltpetterBomb: return "Saltpetter Bomb"; case Race::SandElf: return "Sand Elf"; case Race::Sandman: return "Sandman"; case Race::Sarnak: case Race::Sarnak2: return "Sarnak"; case Race::SarnakGolem: return "Sarnak Golem"; case Race::SarnakSpirit: return "Sarnak Spirit"; case Race::Saryrn: return "Saryrn"; case Race::Satyr: return "Satyr"; case Race::ScaledWolf: return "Scaled Wolf"; case Race::Scarecrow: case Race::Scarecrow2: return "Scarecrow"; case Race::ScarletCheetah: return "Scarlet Cheetah"; case Race::ScleraMount: return "Sclera Mount"; case Race::Scorpion: case Race::IksarScorpion: case Race::Scorpion2: return "Scorpion"; case Race::Scrykin: return "Scrykin"; case Race::SeaTurtle: return "Sea Turtle"; case Race::SeaHorse: return "Seahorse"; case Race::Selyrah: return "Selyrah"; case Race::SelyrahMount: return "Selyrah Mount"; case Race::LordInquisitorSeru: return "Seru"; case Race::ServantOfShadow: return "Servant of Shadow"; case Race::SessiloidMount: return "Sessiloid Mount"; case Race::Shade: case Race::Shade2: case Race::Shade3: return "Shade"; case Race::KhatiSha: return "Shadel"; case Race::ShamblingMound: return "Shambling Mound"; case Race::Shark: return "Shark"; case Race::Shiknar: return "Shik'Nar"; case Race::Shiliskin: return "Shiliskin"; case Race::Ship: return "Ship"; case Race::ShipInABottle: return "Ship in a Bottle"; case Race::Shissar: case Race::Shissar2: return "Shissar"; case Race::Shrieker: return "Shrieker"; case Race::Siren: case Race::Siren2: return "Siren"; case Race::SkeletalHorse: return "Skeletal Horse"; case Race::Skeleton: case Race::Skeleton2: case Race::Skeleton3: return "Skeleton"; case Race::Skunk: return "Skunk"; case Race::Skystrider: return "Skystrider"; case Race::Plant2: return "Small Plant"; case Race::GiantSnake: case Race::Snake: return "Snake"; case Race::SnakeElemental: return "Snake Elemental"; case Race::SnowDervish: return "Snow Dervish"; case Race::SnowRabbit: return "Snow Rabbit"; case Race::Sokokar: return "Sokokar"; case Race::SokokarMount: return "Sokokar Mount"; case Race::SokokarMount2: return "Sokokar(w saddle)"; case Race::SolusekRo: case Race::SolusekRo2: return "Solusek Ro"; case Race::SolusekRoGuard: return "Solusek Ro Guard"; case Race::SonicWolf: return "Sonic Wolf"; case Race::SoulDevourer: return "Soul Devourer"; case Race::Spectre: case Race::Spectre2: return "Spectre"; case Race::SpellParticle: return "Spell Particle 1"; case Race::Sphinx: case Race::Sphinx2: return "Sphinx"; case Race::GiantSpider: case Race::Spider: return "Spider"; case Race::SpiderEggSack: return "Spider Egg Sack"; case Race::SpiderMount: return "Spider Mount"; case Race::SpiderQueen: return "Spider Queen"; case Race::SpikeTrap: return "Spike Trap"; case Race::SpiritWolf: return "Spirit Wolf"; case Race::Sporali: return "Sporali"; case Race::StoneJug: return "Stone Jug"; case Race::StonePylon: return "Stone Pylon"; case Race::StoneRing: return "Stone Ring"; case Race::StoneWorker: case Race::StoneWorker2: return "Stone Worker"; case Race::Stonegrabber: return "Stonegrabber"; case Race::Stonemite: return "Stonemite"; case Race::Stormrider: return "Stormrider"; case Race::Succubus: return "Succubus"; case Race::Succulent: return "Succulent"; case Race::SullonZek: return "Sullon Zek"; case Race::Shadel: return "Sun Revenant"; case Race::Sunflower: return "Sunflower"; case Race::Swinetor: return "Swinetor"; case Race::Swordfish: return "Swordfish"; case Race::Synarcana: return "Synarcana"; case Race::Table: return "Table"; case Race::FroglokTadpole: return "Tadpole"; case Race::Taelosian: return "Taelosian"; case Race::WineCask: return "Tall Plant"; case Race::TallonZek: return "Tallon Zek"; case Race::Taneth: return "Taneth"; case Race::TarewMarr: return "Tarew Marr"; case Race::Tegi: return "Tegi"; case Race::TeleportMan: return "Teleport Man"; case Race::TeleportationStand: return "Teleportation Stand"; case Race::Telmira: return "Telmira"; case Race::TentacleTerror: case Race::TentacleTerror2: return "Tentacle Terror"; case Race::TerrisThule: return "Terris Thule"; case Race::TestObject: return "Test Object"; case Race::Rathe: return "The Rathe"; case Race::TribunalNew: return "The Tribunal"; case Race::ThoughtHorror: return "Thought Horror"; case Race::Tiger: return "Tiger"; case Race::TinSoldier: return "Tin Soldier"; case Race::Plant: return "Toolbox"; case Race::TopiaryLion: return "Topiary Lion"; case Race::TopiaryLionMount: return "Topiary Lion Mount"; case Race::Tormentor: return "Tormentor"; case Race::Totem: case Race::Totem2: return "Totem"; case Race::Trakanon: return "Trakanon"; case Race::Tranquilion: return "Tranquilion"; case Race::Treant: case Race::Treant2: case Race::Treant3: return "Treant"; case Race::Tribunal: return "Tribunal"; case Race::Triumvirate: return "Triumvirate"; case Race::Troll: case Race::GrobbCitizen: case Race::TrollCrewMember: case Race::PirateDeckhand: case Race::BrokenSkullPirate: return "Troll"; case Race::TrollZombie: return "Troll Zombie"; case Race::Trusik: return "Trusik"; case Race::Tsetsian: return "Tsetsian"; case Race::Tumbleweed: return "Tumbleweed"; case Race::Tunare: return "Tunare"; case Race::Turepta: return "Turepta"; case Race::Ukun: return "Ukun"; case Race::Ulthork: return "Ulthork"; case Race::UndeadChokidai: return "Undead Chokidai"; case Race::UndeadFootman: return "Undead Footman"; case Race::UndeadFroglok: return "Undead Froglok"; case Race::UndeadIksar: return "Undead Iksar"; case Race::UndeadKnight: return "Undead Knight"; case Race::UndeadSarnak: return "Undead Sarnak"; case Race::UndeadVeksar: return "Undead Veksar"; case Race::Underbulk: return "Underbulk"; case Race::Unicorn: return "Unicorn"; case Race::Doug: case Race::MinorIllusion: case Race::Tree: case Race::Unknown: case Race::Unknown2: case Race::Unknown3: case Race::Unknown4: return "UNKNOWN RACE"; case Race::VahShir: case Race::VahShirKing: return "Vah Shir"; case Race::VahShirSkeleton: return "Vah Shir Skeleton"; case Race::VallonZek: return "Vallon Zek"; case Race::Valorian: case Race::Valorian2: return "Valorian"; case Race::Vampire: case Race::ElfVampire: case Race::Vampire2: case Race::VampireVolatalis: case Race::UndeadVampire: case Race::Vampire3: case Race::MasterVampire: case Race::Vampire4: return "Vampire"; case Race::Vase: return "Vase"; case Race::Vegerog: return "Vegerog"; case Race::Veksar: case Race::Veksar2: case Race::Veksar3: return "Veksar"; case Race::VenrilSathir: return "Venril Sathir"; case Race::VineMaw: return "Vine Maw"; case Race::Wagon: return "Wagon"; case Race::Walrus: return "Walrus"; case Race::WarBoar: case Race::WarBoar2: return "War Boar"; case Race::WarWraith: return "War Wraith"; case Race::Wasp: return "Wasp"; case Race::WaterElemental: case Race::WaterElemental2: return "Water Elemental"; case Race::WaterMephit: return "Water Mephit"; case Race::WaterSpout: return "Water Spout"; case Race::WeaponRack: case Race::WeaponRack2: return "Weapon Rack"; case Race::Web: return "Web"; case Race::WeddingAltar: return "Wedding Altar"; case Race::WeddingArbor: return "Wedding Arbor"; case Race::WeddingFlowers: return "Wedding Flowers"; case Race::Wereorc: return "Wereorc"; case Race::Werewolf: case Race::Werewolf2: case Race::Werewolf3: return "Werewolf"; case Race::WetfangMinnow: return "Wetfang Minnow"; case Race::Whirligig: return "Whirligig"; case Race::WickerBasket: return "Wicker Basket"; case Race::Wisp: return "Will - O - Wisp"; case Race::StoneJug2: case Race::WineCask2: return "Wine Cask"; case Race::Witheran: case Race::Witheran2: return "Witheran"; case Race::Wolf: case Race::WolfElemental: case Race::Wolf2: return "Wolf"; case Race::WoodElf: return "Wood Elf"; case Race::Worg: case Race::Worg2: return "Worg"; case Race::Worm: return "Worm"; case Race::Wretch: return "Wretch"; case Race::Wrulon: case Race::Wrulon2: return "Wrulon"; case Race::Wurm: case Race::Wurm2: return "Wurm"; case Race::WurmMount: return "Wurm Mount"; case Race::Wyvern: case Race::Wyvern2: return "Wyvern"; case Race::Xalgoz: return "Xalgoz"; case Race::Xaric: return "Xaric the Unspoken"; case Race::Xegony: return "Xegony"; case Race::Yakkar: return "Yakkar"; case Race::Yeti: return "Yeti"; case Race::Zebuxoruk: return "Zebuxoruk"; case Race::ZebuxoruksCage: return "Zebuxoruk's Cage"; case Race::Zelniak: return "Zelniak"; case Race::Zombie: case Race::Zombie2: return "Zombie"; default: return "UNKNOWN RACE"; } } uint32 GetPlayerRaceValue(uint16 race_id) { switch (race_id) { case Race::Human: case Race::Barbarian: case Race::Erudite: case Race::WoodElf: case Race::HighElf: case Race::DarkElf: case Race::HalfElf: case Race::Dwarf: case Race::Troll: case Race::Ogre: case Race::Halfling: case Race::Gnome: return race_id; case Race::Iksar: return RaceIndex::Iksar; case Race::VahShir: return RaceIndex::VahShir; case Race::Froglok2: return RaceIndex::Froglok; case Race::Drakkin: return RaceIndex::Drakkin; default: return Race::Doug; } } uint16 GetPlayerRaceBit(uint16 race_id) { switch (race_id) { case Race::Human: return RaceBitmask::Human; case Race::Barbarian: return RaceBitmask::Barbarian; case Race::Erudite: return RaceBitmask::Erudite; case Race::WoodElf: return RaceBitmask::WoodElf; case Race::HighElf: return RaceBitmask::HighElf; case Race::DarkElf: return RaceBitmask::DarkElf; case Race::HalfElf: return RaceBitmask::HalfElf; case Race::Dwarf: return RaceBitmask::Dwarf; case Race::Troll: return RaceBitmask::Troll; case Race::Ogre: return RaceBitmask::Ogre; case Race::Halfling: return RaceBitmask::Halfling; case Race::Gnome: return RaceBitmask::Gnome; case Race::Iksar: return RaceBitmask::Iksar; case Race::VahShir: return RaceBitmask::VahShir; case Race::Froglok2: return RaceBitmask::Froglok; case Race::Drakkin: return RaceBitmask::Drakkin; default: return RaceBitmask::Unknown; } } uint16 GetRaceIDFromPlayerRaceValue(uint32 player_race_value) { switch (player_race_value) { case RaceIndex::Human: case RaceIndex::Barbarian: case RaceIndex::Erudite: case RaceIndex::WoodElf: case RaceIndex::HighElf: case RaceIndex::DarkElf: case RaceIndex::HalfElf: case RaceIndex::Dwarf: case RaceIndex::Troll: case RaceIndex::Ogre: case RaceIndex::Halfling: case RaceIndex::Gnome: return player_race_value; case RaceIndex::Iksar: return Race::Iksar; case RaceIndex::VahShir: return Race::VahShir; case RaceIndex::Froglok: return Race::Froglok2; case RaceIndex::Drakkin: return Race::Drakkin; default: return Race::Doug; } } float GetRaceGenderDefaultHeight(int race, int gender) { static float male_height[] = { 6.0f, 6.0f, 7.0f, 6.0f, 5.0f, 6.0f, 5.0f, 5.5f, 4.0f, 8.0f, 9.0f, 3.5f, 3.0f, 6.0f, 6.0f, 2.0f, 8.5f, 8.0f, 21.0f, 20.0f, 6.0f, 6.0f, 3.5f, 3.0f, 6.0f, 2.0f, 5.0f, 5.0f, 6.0f, 6.0f, 6.0f, 7.5f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 5.0f, 6.0f, 6.0f, 7.0f, 4.0f, 4.7f, 6.0f, 8.0f, 3.0f, 12.0f, 5.0f, 21.0f, 6.0f, 6.0f, 3.0f, 9.0f, 6.0f, 6.0f, 2.0f, 6.0f, 3.0f, 6.0f, 4.0f, 20.0f, 5.0f, 5.0f, 6.0f, 9.0f, 25.0f, 6.0f, 6.0f, 10.0f, 6.0f, 6.0f, 6.0f, 6.0f, 2.5f, 7.0f, 6.0f, 5.0f, 6.0f, 1.5f, 1.0f, 3.5f, 7.0f, 6.0f, 6.0f, 6.0f, 6.0f, 7.0f, 3.0f, 3.0f, 7.0f, 12.0f, 8.0f, 9.0f, 4.0f, 11.5f, 8.0f, 6.0f, 6.0f, 12.0f, 6.0f, 6.0f, 6.0f, 20.0f, 10.0f, 6.5f, 6.0f, 17.0f, 1.0f, 4.0f, 6.0f, 8.0f, 5.0f, 1.0f, 6.0f, 6.0f, 5.0f, 5.0f, 5.0f, 9.0f, 3.0f, 8.0f, 2.0f, 24.0f, 6.0f, 10.0f, 6.0f, 6.0f, 6.0f, 3.0f, 7.0f, 9.0f, 6.0f, 11.0f, 2.5f, 14.0f, 8.0f, 7.0f, 12.0f, 6.0f, 27.0f, 6.0f, 6.0f, 6.0f, 6.0f, 2.0f, 9.0f, 9.0f, 6.0f, 9.0f, 3.0f, 3.0f, 6.0f, 6.0f, 10.0f, 6.0f, 6.0f, 15.0f, 15.0f, 9.0f, 7.0f, 6.0f, 6.0f, 7.0f, 8.0f, 3.0f, 3.0f, 6.0f, 7.0f, 13.0f, 6.0f, 6.0f, 9.0f, 5.0f, 7.0f, 9.0f, 6.0f, 6.0f, 8.0f, 6.0f, 6.0f, 5.5f, 6.0f, 4.0f, 25.0f, 6.0f, 6.0f, 6.0f, 22.0f, 20.0f, 6.0f, 10.0f, 13.5f, 12.0f, 3.0f, 30.0f, 6.0f, 6.0f, 35.0f, 1.5f, 8.0f, 3.0f, 6.0f, 2.0f, 6.0f, 6.0f, 5.0f, 2.0f, 7.0f, 6.0f, 6.0f, 6.0f, 6.0f, 4.0f, 6.0f, 6.0f, 6.0f, 8.0f, 8.0f, 7.0f, 8.0f, 6.0f, 7.0f, 6.0f, 7.0f, 6.0f, 10.0f, 3.0f, 6.0f, 8.0f, 9.0f, 15.0f, 5.0f, 10.0f, 7.0f, 6.0f, 7.0f, 6.0f, 7.0f, 7.0f, 12.0f, 6.0f, 4.0f, 6.0f, 5.0f, 3.0f, 30.0f, 30.0f, 15.0f, 20.0f, 6.0f, 10.0f, 6.0f, 14.0f, 14.0f, 16.0f, 15.0f, 30.0f, 15.0f, 7.5f, 5.0f, 4.0f, 6.0f, 15.0f, 6.5f, 3.0f, 12.0f, 10.0f, 10.5f, 10.0f, 7.5f, 6.0f, 6.0f, 12.5f, 9.0f, 20.0f, 2.0f, 10.0f, 25.0f, 8.0f, 6.0f, 6.0f, 10.0f, 18.0f, 45.0f, 13.0f, 15.0f, 8.0f, 30.0f, 25.0f, 25.0f, 10.0f, 13.0f, 5.0f, 3.5f, 15.0f, 35.0f, 11.0f, 15.0f, 50.0f, 13.0f, 6.0f, 7.0f, 6.0f, 60.0f, 6.0f, 22.0f, 22.0f, 21.0f, 22.0f, 15.0f, 25.0f, 23.0f, 8.0f, 15.0f, 10.0f, 6.0f, 7.0f, 6.0f, 12.0f, 9.5f, 6.0f, 12.0f, 12.0f, 12.0f, 15.0f, 4.0f, 5.0f, 105.0f, 20.0f, 5.0f, 10.0f, 10.0f, 10.0f, 20.0f, 13.5f, 8.0f, 10.0f, 3.0f, 5.0f, 9.0f, 6.0f, 6.0f, 6.0f, 10.0f, 8.0f, 8.0f, 8.0f, 6.0f, 6.0f, 5.0f, 5.0f, 5.0f, 9.0f, 9.0f, 9.0f, 6.0f, 8.5f, 6.0f, 7.0f, 8.0f, 7.0f, 11.0f, 6.0f, 7.0f, 9.0f, 8.0f, 6.0f, 8.0f, 6.0f, 6.0f, 6.0f, 6.0f, 9.0f, 10.0f, 6.0f, 3.0f, 4.0f, 3.0f, 3.0f, 4.0f, 10.0f, 10.0f, 2.0f, 8.0f, 6.0f, 6.0f, 14.0f, 7.0f, 5.0f, 9.0f, 7.0f, 7.0f, 10.0f, 10.0f, 12.0f, 9.0f, 7.0f, 12.0f, 13.0f, 16.0f, 6.0f, 9.0f, 6.0f, 6.0f, 10.0f, 25.0f, 15.0f, 6.0f, 25.0f, 6.0f, 6.0f, 8.0f, 11.0f, 6.0f, 9.0f, 2.0f, 6.0f, 5.0f, 4.0f, 8.5f, 6.0f, 6.0f, 6.0f, 4.0f, 6.0f, 15.0f, 1.0f, 2.0f, 6.0f, 40.0f, 8.0f, 12.0f, 3.0f, 8.0f, 99.0f, 9.0f, 100.0f, 100.0f, 10.0f, 6.0f, 27.5f, 20.0f, 6.0f, 6.0f, 5.0f, 6.0f, 8.0f, 5.0f, 3.0f, 11.5f, 25.0f, 80.0f, 20.0f, 9.0f, 8.0f, 5.0f, 4.0f, 7.0f, 10.0f, 6.0f, 11.0f, 8.0f, 5.0f, 6.0f, 6.0f, 30.0f, 7.0f, 15.0f, 9.0f, 6.0f, 9.0f, 6.0f, 3.0f, 32.5f, 15.0f, 7.5f, 10.0f, 10.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 9.0f, 20.0f, 6.0f, 6.0f, 6.0f, 25.0f, 12.0f, 6.0f, 8.0f, 6.0f, 6.0f, 20.0f, 10.0f, 8.0f, 12.0f, 8.0f, 2.0f, 6.0f, 3.0f, 6.0f, 7.0f, 1.5f, 6.0f, 3.0f, 3.0f, 3.0f, 3.0f, 2.0f, 3.0f, 3.0f, 6.0f, 6.0f, 6.0f, 4.5f, 7.0f, 6.0f, 7.0f, 6.0f, 22.0f, 8.0f, 15.0f, 22.0f, 8.0f, 15.0f, 6.0f, 80.0f, 150.0f, 7.0f, 6.0f, 6.0f, 6.0f, 12.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 35.0f, 20.0f, 9.0f, 6.0f, 6.0f, 6.0f, 20.0f, 20.0f, 20.0f, 20.0f, 20.0f, 9.0f, 4.0f, 4.0f, 10.0f, 5.0f, 8.0f, 6.0f, 10.0f, 6.0f, 6.0f, 2.0f, 36.0f, 14.0f, 7.0f, 250.0f, 6.0f, 9.0f, 6.0f, 7.0f, 4.0f, 6.0f, 8.0f, 6.0f, 23.0f, 6.0f, 6.0f, 6.0f, 70.0f, 6.0f, 7.0f, 6.0f, 6.0f, 6.0f, 20.0f, 6.0f, 6.0f, 6.0f, 5.0f, 1.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 4.0f, 4.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 10.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 7.0f, 7.0f, 7.0f, 7.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 8.0f, 6.0f, 6.0f, 6.0f, 7.0f, 6.0f, 6.0f, 6.0f, 7.5f, 6.0f, 6.0f, 4.0f, 6.0f, 3.0f, 6.0f, 6.0f, 1.0f, 9.0f, 7.0f, 8.0f, 7.0f, 8.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 8.0f, }; static float female_height[] = { 6.0f, 6.0f, 7.0f, 6.0f, 5.0f, 6.0f, 5.0f, 5.5f, 4.0f, 8.0f, 9.0f, 3.5f, 3.0f, 6.0f, 6.0f, 2.0f, 8.5f, 8.0f, 21.0f, 20.0f, 6.0f, 6.0f, 3.5f, 3.0f, 6.0f, 2.0f, 5.0f, 5.0f, 6.0f, 6.0f, 6.0f, 7.5f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 5.0f, 6.0f, 6.0f, 7.0f, 4.0f, 4.7f, 6.0f, 8.0f, 3.0f, 12.0f, 5.0f, 21.0f, 6.0f, 6.0f, 3.0f, 9.0f, 6.0f, 6.0f, 2.0f, 6.0f, 3.0f, 6.0f, 4.0f, 20.0f, 5.0f, 5.0f, 6.0f, 9.0f, 25.0f, 6.0f, 6.0f, 10.0f, 6.0f, 6.0f, 6.0f, 6.0f, 2.5f, 7.0f, 6.0f, 5.0f, 6.0f, 1.5f, 1.0f, 3.5f, 7.0f, 6.0f, 6.0f, 6.0f, 6.0f, 7.0f, 3.0f, 3.0f, 7.0f, 12.0f, 8.0f, 9.0f, 4.0f, 11.5f, 8.0f, 6.0f, 6.0f, 12.0f, 6.0f, 6.0f, 6.0f, 20.0f, 10.0f, 6.5f, 6.0f, 17.0f, 1.0f, 4.0f, 6.0f, 8.0f, 5.0f, 1.0f, 6.0f, 6.0f, 5.0f, 5.0f, 5.0f, 9.0f, 3.0f, 8.0f, 2.0f, 24.0f, 6.0f, 10.0f, 6.0f, 6.0f, 6.0f, 3.0f, 7.0f, 9.0f, 6.0f, 11.0f, 2.5f, 14.0f, 8.0f, 7.0f, 12.0f, 6.0f, 27.0f, 6.0f, 6.0f, 6.0f, 6.0f, 2.0f, 9.0f, 9.0f, 6.0f, 9.0f, 3.0f, 3.0f, 6.0f, 6.0f, 10.0f, 6.0f, 6.0f, 15.0f, 15.0f, 9.0f, 7.0f, 6.0f, 6.0f, 7.0f, 8.0f, 3.0f, 3.0f, 6.0f, 7.0f, 13.0f, 6.0f, 6.0f, 9.0f, 5.0f, 7.0f, 9.0f, 6.0f, 6.0f, 8.0f, 6.0f, 6.0f, 5.5f, 6.0f, 4.0f, 25.0f, 6.0f, 6.0f, 6.0f, 22.0f, 20.0f, 6.0f, 10.0f, 13.5f, 12.0f, 3.0f, 30.0f, 6.0f, 6.0f, 35.0f, 1.5f, 8.0f, 3.0f, 6.0f, 2.0f, 6.0f, 6.0f, 5.0f, 2.0f, 7.0f, 6.0f, 6.0f, 6.0f, 6.0f, 4.0f, 6.0f, 6.0f, 6.0f, 8.0f, 8.0f, 7.0f, 8.0f, 6.0f, 7.0f, 6.0f, 7.0f, 6.0f, 10.0f, 3.0f, 6.0f, 8.0f, 9.0f, 15.0f, 5.0f, 10.0f, 7.0f, 6.0f, 7.0f, 6.0f, 7.0f, 7.0f, 12.0f, 6.0f, 4.0f, 6.0f, 5.0f, 3.0f, 30.0f, 30.0f, 15.0f, 20.0f, 6.0f, 10.0f, 6.0f, 14.0f, 14.0f, 16.0f, 15.0f, 30.0f, 15.0f, 7.5f, 5.0f, 4.0f, 6.0f, 15.0f, 6.5f, 3.0f, 12.0f, 10.0f, 10.5f, 10.0f, 7.5f, 6.0f, 6.0f, 12.5f, 9.0f, 20.0f, 2.0f, 10.0f, 25.0f, 8.0f, 6.0f, 6.0f, 10.0f, 18.0f, 45.0f, 13.0f, 15.0f, 8.0f, 30.0f, 25.0f, 25.0f, 10.0f, 13.0f, 5.0f, 3.5f, 15.0f, 35.0f, 11.0f, 15.0f, 50.0f, 13.0f, 6.0f, 7.0f, 6.0f, 60.0f, 6.0f, 22.0f, 22.0f, 21.0f, 22.0f, 15.0f, 25.0f, 23.0f, 8.0f, 15.0f, 10.0f, 6.0f, 7.0f, 6.0f, 12.0f, 9.5f, 6.0f, 12.0f, 12.0f, 12.0f, 15.0f, 4.0f, 5.0f, 105.0f, 20.0f, 5.0f, 10.0f, 10.0f, 10.0f, 20.0f, 13.5f, 8.0f, 10.0f, 3.0f, 5.0f, 9.0f, 6.0f, 6.0f, 6.0f, 10.0f, 8.0f, 8.0f, 8.0f, 6.0f, 6.0f, 5.0f, 5.0f, 5.0f, 9.0f, 9.0f, 9.0f, 6.0f, 8.5f, 6.0f, 7.0f, 8.0f, 7.0f, 11.0f, 6.0f, 7.0f, 9.0f, 8.0f, 6.0f, 8.0f, 6.0f, 6.0f, 6.0f, 6.0f, 9.0f, 10.0f, 6.0f, 3.0f, 4.0f, 3.0f, 3.0f, 4.0f, 10.0f, 10.0f, 2.0f, 8.0f, 6.0f, 6.0f, 14.0f, 7.0f, 5.0f, 9.0f, 7.0f, 7.0f, 10.0f, 10.0f, 12.0f, 9.0f, 7.0f, 12.0f, 13.0f, 16.0f, 6.0f, 9.0f, 6.0f, 6.0f, 10.0f, 25.0f, 15.0f, 6.0f, 25.0f, 6.0f, 6.0f, 8.0f, 11.0f, 6.0f, 9.0f, 2.0f, 6.0f, 5.0f, 4.0f, 8.5f, 6.0f, 6.0f, 6.0f, 4.0f, 6.0f, 15.0f, 1.0f, 2.0f, 6.0f, 40.0f, 8.0f, 12.0f, 3.0f, 8.0f, 99.0f, 9.0f, 100.0f, 100.0f, 10.0f, 6.0f, 27.5f, 20.0f, 6.0f, 6.0f, 5.0f, 6.0f, 8.0f, 5.0f, 3.0f, 11.5f, 25.0f, 80.0f, 20.0f, 9.0f, 8.0f, 5.0f, 4.0f, 7.0f, 10.0f, 6.0f, 11.0f, 8.0f, 5.0f, 6.0f, 6.0f, 30.0f, 7.0f, 15.0f, 9.0f, 6.0f, 9.0f, 6.0f, 3.0f, 32.5f, 15.0f, 7.5f, 10.0f, 10.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 9.0f, 20.0f, 6.0f, 6.0f, 6.0f, 25.0f, 12.0f, 6.0f, 8.0f, 6.0f, 6.0f, 20.0f, 9.0f, 8.0f, 12.0f, 8.0f, 2.0f, 6.0f, 3.0f, 6.0f, 7.0f, 1.5f, 6.0f, 3.0f, 3.0f, 3.0f, 3.0f, 2.0f, 3.0f, 3.0f, 6.0f, 6.0f, 6.0f, 4.5f, 7.0f, 6.0f, 7.0f, 5.7f, 22.0f, 8.0f, 15.0f, 22.0f, 8.0f, 15.0f, 6.0f, 80.0f, 150.0f, 7.0f, 6.0f, 6.0f, 6.0f, 12.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 35.0f, 20.0f, 9.0f, 6.0f, 6.0f, 6.0f, 20.0f, 20.0f, 20.0f, 20.0f, 20.0f, 9.0f, 4.0f, 4.0f, 10.0f, 5.0f, 8.0f, 6.0f, 10.0f, 5.7f, 6.0f, 2.0f, 36.0f, 14.0f, 7.0f, 250.0f, 6.0f, 9.0f, 6.0f, 7.0f, 4.0f, 6.0f, 8.0f, 6.0f, 23.0f, 6.0f, 6.0f, 6.0f, 70.0f, 6.0f, 7.0f, 6.0f, 6.0f, 6.0f, 20.0f, 6.0f, 6.0f, 6.0f, 5.0f, 1.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 4.0f, 4.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 10.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 7.0f, 7.0f, 7.0f, 7.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 8.0f, 6.0f, 6.0f, 6.0f, 7.0f, 6.0f, 6.0f, 6.0f, 7.5f, 6.0f, 6.0f, 4.0f, 6.0f, 3.0f, 6.0f, 6.0f, 1.0f, 9.0f, 7.0f, 8.0f, 7.0f, 8.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 8.0f, }; const auto size = sizeof(male_height) / sizeof(male_height[0]); if (race >= size) { return 6.0f; } if (gender == Gender::Female) { return female_height[race]; } return male_height[race]; } #define GetRaceGenderMask(race_id, gender_id) (((int)race_id << 8) | gender_id) bool RaceAppearance::IsValidBeard(uint16 race_id, uint8 gender_id, uint8 beard_value, bool use_luclin) { if (beard_value == std::numeric_limits::max()) { return true; } if (use_luclin) { switch (GetRaceGenderMask(race_id, gender_id)) { case RaceAppearance::DwarfFemale: if (beard_value <= 1) { return true; } break; case RaceAppearance::HighElfMale: case RaceAppearance::DarkElfMale: case RaceAppearance::HalfElfMale: case RaceAppearance::DrakkinFemale: if (beard_value <= 3) { return true; } break; case RaceAppearance::HumanMale: case RaceAppearance::BarbarianMale: case RaceAppearance::EruditeMale: case RaceAppearance::DwarfMale: case RaceAppearance::HalflingMale: case RaceAppearance::GnomeMale: if (beard_value <= 5) { return true; } break; case RaceAppearance::DrakkinMale: if (beard_value <= 11) { return true; } break; default: break; } return false; } else { switch (GetRaceGenderMask(race_id, gender_id)) { case RaceAppearance::DrakkinFemale: if (beard_value <= 3) { return true; } break; case RaceAppearance::DrakkinMale: if (beard_value <= 11) { return true; } break; default: break; } return false; } } bool RaceAppearance::IsValidBeardColor(uint16 race_id, uint8 gender_id, uint8 beard_color_value, bool use_luclin) { if (beard_color_value == std::numeric_limits::max()) { return true; } switch (GetRaceGenderMask(race_id, gender_id)) { case RaceAppearance::GnomeMale: if (beard_color_value <= 24) { return true; } break; case RaceAppearance::HumanMale: case RaceAppearance::BarbarianMale: case RaceAppearance::EruditeMale: case RaceAppearance::HalfElfMale: case RaceAppearance::DwarfMale: case RaceAppearance::DwarfFemale: case RaceAppearance::HalflingMale: if (beard_color_value <= 19) { return true; } break; case RaceAppearance::DarkElfMale: if (EQ::ValueWithin(beard_color_value, 13, 18)) { return true; } break; case RaceAppearance::HighElfMale: if (beard_color_value <= 14) { return true; } break; case RaceAppearance::FroglokMale: case RaceAppearance::FroglokFemale: case RaceAppearance::DrakkinMale: case RaceAppearance::DrakkinFemale: if (beard_color_value <= 3) { return true; } break; default: break; } return false; } bool RaceAppearance::IsValidDetail(uint16 race_id, uint8 gender_id, uint32 detail_value, bool use_luclin) { if (detail_value == std::numeric_limits::max()) { return true; } switch (GetRaceGenderMask(race_id, gender_id)) { case RaceAppearance::DrakkinMale: case RaceAppearance::DrakkinFemale: if (detail_value <= 7) { return true; } break; default: break; } return false; } bool RaceAppearance::IsValidEyeColor(uint16 race_id, uint8 gender_id, uint8 eye_color_value, bool use_luclin) { if (eye_color_value == std::numeric_limits::max()) { return true; } switch (GetRaceGenderMask(race_id, gender_id)) { case RaceAppearance::HumanMale: case RaceAppearance::HumanFemale: case RaceAppearance::BarbarianMale: case RaceAppearance::BarbarianFemale: case RaceAppearance::EruditeMale: case RaceAppearance::EruditeFemale: case RaceAppearance::WoodElfMale: case RaceAppearance::WoodElfFemale: case RaceAppearance::HighElfMale: case RaceAppearance::HighElfFemale: case RaceAppearance::DarkElfMale: case RaceAppearance::DarkElfFemale: case RaceAppearance::HalfElfMale: case RaceAppearance::HalfElfFemale: case RaceAppearance::DwarfMale: case RaceAppearance::DwarfFemale: case RaceAppearance::OgreMale: case RaceAppearance::OgreFemale: case RaceAppearance::HalflingMale: case RaceAppearance::HalflingFemale: case RaceAppearance::GnomeMale: case RaceAppearance::GnomeFemale: case RaceAppearance::IksarMale: case RaceAppearance::IksarFemale: case RaceAppearance::VahShirMale: case RaceAppearance::VahShirFemale: if (eye_color_value <= 9) { return true; } break; case RaceAppearance::TrollMale: case RaceAppearance::TrollFemale: if (eye_color_value <= 10) { return true; } break; case RaceAppearance::FroglokMale: case RaceAppearance::FroglokFemale: case RaceAppearance::DrakkinMale: case RaceAppearance::DrakkinFemale: if (eye_color_value <= 11) { return true; } break; default: break; } return false; } bool RaceAppearance::IsValidFace(uint16 race_id, uint8 gender_id, uint8 face_value, bool use_luclin) { if (face_value == std::numeric_limits::max()) { return true; } switch (GetRaceGenderMask(race_id, gender_id)) { case RaceAppearance::DrakkinMale: case RaceAppearance::DrakkinFemale: if (face_value <= 6) { return true; } break; case RaceAppearance::HumanMale: case RaceAppearance::HumanFemale: case RaceAppearance::BarbarianMale: case RaceAppearance::BarbarianFemale: case RaceAppearance::EruditeMale: case RaceAppearance::EruditeFemale: case RaceAppearance::WoodElfMale: case RaceAppearance::WoodElfFemale: case RaceAppearance::HighElfMale: case RaceAppearance::HighElfFemale: case RaceAppearance::DarkElfMale: case RaceAppearance::DarkElfFemale: case RaceAppearance::HalfElfMale: case RaceAppearance::HalfElfFemale: case RaceAppearance::DwarfMale: case RaceAppearance::DwarfFemale: case RaceAppearance::TrollMale: case RaceAppearance::TrollFemale: case RaceAppearance::OgreMale: case RaceAppearance::OgreFemale: case RaceAppearance::HalflingMale: case RaceAppearance::HalflingFemale: case RaceAppearance::GnomeMale: case RaceAppearance::GnomeFemale: case RaceAppearance::IksarMale: case RaceAppearance::IksarFemale: case RaceAppearance::VahShirMale: case RaceAppearance::VahShirFemale: if (face_value <= 7) { return true; } break; case RaceAppearance::FroglokMale: case RaceAppearance::FroglokFemale: if (face_value <= 9) { return true; } break; default: break; } return false; } bool RaceAppearance::IsValidHair(uint16 race_id, uint8 gender_id, uint8 hair_value, bool use_luclin) { if (hair_value == std::numeric_limits::max()) { return true; } if (use_luclin) { switch (GetRaceGenderMask(race_id, gender_id)) { case RaceAppearance::HumanMale: case RaceAppearance::HumanFemale: case RaceAppearance::BarbarianMale: case RaceAppearance::BarbarianFemale: case RaceAppearance::WoodElfMale: case RaceAppearance::WoodElfFemale: case RaceAppearance::HighElfMale: case RaceAppearance::HighElfFemale: case RaceAppearance::DarkElfMale: case RaceAppearance::DarkElfFemale: case RaceAppearance::HalfElfMale: case RaceAppearance::HalfElfFemale: case RaceAppearance::DwarfMale: case RaceAppearance::DwarfFemale: case RaceAppearance::TrollFemale: case RaceAppearance::OgreFemale: case RaceAppearance::HalflingMale: case RaceAppearance::HalflingFemale: case RaceAppearance::GnomeMale: case RaceAppearance::GnomeFemale: if (hair_value <= 3) { return true; } break; case RaceAppearance::EruditeMale: if (hair_value <= 5) { return true; } break; case RaceAppearance::DrakkinFemale: if (hair_value <= 7) { return true; } break; case RaceAppearance::EruditeFemale: case RaceAppearance::DrakkinMale: if (hair_value <= 8) { return true; } break; default: break; } return false; } else { switch (GetRaceGenderMask(race_id, gender_id)) { case RaceAppearance::DrakkinFemale: if (hair_value <= 7) { return true; } break; case RaceAppearance::DrakkinMale: if (hair_value <= 8) { return true; } break; default: break; } return false; } } bool RaceAppearance::IsValidHairColor(uint16 race_id, uint8 gender_id, uint8 hair_color_value, bool use_luclin) { if (hair_color_value == std::numeric_limits::max()) { return true; } switch (GetRaceGenderMask(race_id, gender_id)) { case RaceAppearance::GnomeMale: case RaceAppearance::GnomeFemale: if (hair_color_value <= 24) { return true; } break; case RaceAppearance::TrollFemale: case RaceAppearance::OgreFemale: if (hair_color_value <= 23) { return true; } break; case RaceAppearance::HumanMale: case RaceAppearance::HumanFemale: case RaceAppearance::BarbarianMale: case RaceAppearance::BarbarianFemale: case RaceAppearance::WoodElfMale: case RaceAppearance::WoodElfFemale: case RaceAppearance::HalfElfMale: case RaceAppearance::HalfElfFemale: case RaceAppearance::DwarfMale: case RaceAppearance::DwarfFemale: case RaceAppearance::HalflingMale: case RaceAppearance::HalflingFemale: if (hair_color_value <= 19) { return true; } break; case RaceAppearance::DarkElfMale: case RaceAppearance::DarkElfFemale: if (EQ::ValueWithin(hair_color_value, 13, 18)) { return true; } break; case RaceAppearance::HighElfMale: case RaceAppearance::HighElfFemale: if (hair_color_value <= 14) { return true; } break; case RaceAppearance::FroglokMale: case RaceAppearance::FroglokFemale: case RaceAppearance::DrakkinMale: case RaceAppearance::DrakkinFemale: if (hair_color_value <= 3) { return true; } break; default: break; } return false; } bool RaceAppearance::IsValidHeritage(uint16 race_id, uint8 gender_id, uint32 heritage_value, bool use_luclin) { if (heritage_value == std::numeric_limits::max()) { return true; } switch (GetRaceGenderMask(race_id, gender_id)) { case RaceAppearance::DrakkinMale: case RaceAppearance::DrakkinFemale: if (heritage_value <= 7) { return true; } break; default: break; } return false; } bool RaceAppearance::IsValidTattoo(uint16 race_id, uint8 gender_id, uint32 tattoo_value, bool use_luclin) { if (tattoo_value == std::numeric_limits::max()) { return true; } switch (GetRaceGenderMask(race_id, gender_id)) { case RaceAppearance::DrakkinMale: case RaceAppearance::DrakkinFemale: if (tattoo_value <= 7) { return true; } break; default: break; } return false; } bool RaceAppearance::IsValidWoad(uint16 race_id, uint8 gender_id, uint8 woad_value, bool use_luclin) { if (woad_value == std::numeric_limits::max()) { return true; } if (use_luclin) { switch (GetRaceGenderMask(race_id, gender_id)) { case RaceAppearance::BarbarianMale: case RaceAppearance::BarbarianFemale: if (woad_value <= 8) { return true; } break; default: break; } } return false; } const char* GetGenderName(uint32 gender_id) { const char* gender_name = "Unknown"; if (gender_id == Gender::Male) { gender_name = "Male"; } else if (gender_id == Gender::Female) { gender_name = "Female"; } else if (gender_id == Gender::Neuter) { gender_name = "Neuter"; } return gender_name; } const std::string GetPlayerRaceAbbreviation(uint16 race_id) { if (!IsPlayerRace(race_id)) { return std::string("UNK"); } switch (race_id) { case Race::Human: return "HUM"; case Race::Barbarian: return "BAR"; case Race::Erudite: return "ERU"; case Race::WoodElf: return "ELF"; case Race::HighElf: return "HIE"; case Race::DarkElf: return "DEF"; case Race::HalfElf: return "HEF"; case Race::Dwarf: return "DWF"; case Race::Troll: return "TRL"; case Race::Ogre: return "OGR"; case Race::Halfling: return "HFL"; case Race::Gnome: return "GNM"; case Race::Iksar: return "IKS"; case Race::VahShir: return "VAH"; case Race::Froglok2: return "FRG"; case Race::Drakkin: return "DRK"; } return std::string("UNK"); } bool IsPlayerRace(uint16 race_id) { return ( EQ::ValueWithin(race_id, Race::Human, Race::Gnome) || race_id == Race::Iksar || race_id == Race::VahShir || race_id == Race::Froglok2 || race_id == Race::Drakkin ); }