Kelsidavis-WoWee/src/game/character.cpp
Kelsi 0605d1522d Add character creation screen with race/class/appearance customization
Implements a full character creation UI integrated into the existing flow.
In single-player mode, auth screen now goes to character creation before
entering the world. In online mode, a "Create Character" button on the
character selection screen sends CMSG_CHAR_CREATE to the server. Includes
WoW 3.3.5a race/class combo validation and appearance range limits.
2026-02-05 14:13:48 -08:00

96 lines
4.3 KiB
C++

#include "game/character.hpp"
namespace wowee {
namespace game {
bool isValidRaceClassCombo(Race race, Class cls) {
// WoW 3.3.5a valid race/class combinations
switch (race) {
case Race::HUMAN:
return cls == Class::WARRIOR || cls == Class::PALADIN || cls == Class::ROGUE ||
cls == Class::PRIEST || cls == Class::MAGE || cls == Class::WARLOCK ||
cls == Class::DEATH_KNIGHT;
case Race::ORC:
return cls == Class::WARRIOR || cls == Class::HUNTER || cls == Class::ROGUE ||
cls == Class::SHAMAN || cls == Class::WARLOCK || cls == Class::DEATH_KNIGHT;
case Race::DWARF:
return cls == Class::WARRIOR || cls == Class::PALADIN || cls == Class::HUNTER ||
cls == Class::ROGUE || cls == Class::PRIEST || cls == Class::DEATH_KNIGHT;
case Race::NIGHT_ELF:
return cls == Class::WARRIOR || cls == Class::HUNTER || cls == Class::ROGUE ||
cls == Class::PRIEST || cls == Class::DRUID || cls == Class::DEATH_KNIGHT;
case Race::UNDEAD:
return cls == Class::WARRIOR || cls == Class::ROGUE || cls == Class::PRIEST ||
cls == Class::MAGE || cls == Class::WARLOCK || cls == Class::DEATH_KNIGHT;
case Race::TAUREN:
return cls == Class::WARRIOR || cls == Class::HUNTER || cls == Class::DRUID ||
cls == Class::SHAMAN || cls == Class::DEATH_KNIGHT;
case Race::GNOME:
return cls == Class::WARRIOR || cls == Class::ROGUE || cls == Class::MAGE ||
cls == Class::WARLOCK || cls == Class::DEATH_KNIGHT;
case Race::TROLL:
return cls == Class::WARRIOR || cls == Class::HUNTER || cls == Class::ROGUE ||
cls == Class::PRIEST || cls == Class::SHAMAN || cls == Class::MAGE ||
cls == Class::DEATH_KNIGHT;
case Race::BLOOD_ELF:
return cls == Class::PALADIN || cls == Class::HUNTER || cls == Class::ROGUE ||
cls == Class::PRIEST || cls == Class::MAGE || cls == Class::WARLOCK ||
cls == Class::DEATH_KNIGHT;
case Race::DRAENEI:
return cls == Class::WARRIOR || cls == Class::PALADIN || cls == Class::HUNTER ||
cls == Class::PRIEST || cls == Class::SHAMAN || cls == Class::MAGE ||
cls == Class::DEATH_KNIGHT;
default:
return false;
}
}
uint8_t getMaxSkin(Race /*race*/, Gender /*gender*/) { return 9; }
uint8_t getMaxFace(Race /*race*/, Gender /*gender*/) { return 9; }
uint8_t getMaxHairStyle(Race /*race*/, Gender /*gender*/) { return 11; }
uint8_t getMaxHairColor(Race /*race*/, Gender /*gender*/) { return 9; }
uint8_t getMaxFacialFeature(Race /*race*/, Gender /*gender*/) { return 8; }
const char* getRaceName(Race race) {
switch (race) {
case Race::HUMAN: return "Human";
case Race::ORC: return "Orc";
case Race::DWARF: return "Dwarf";
case Race::NIGHT_ELF: return "Night Elf";
case Race::UNDEAD: return "Undead";
case Race::TAUREN: return "Tauren";
case Race::GNOME: return "Gnome";
case Race::TROLL: return "Troll";
case Race::GOBLIN: return "Goblin";
case Race::BLOOD_ELF: return "Blood Elf";
case Race::DRAENEI: return "Draenei";
default: return "Unknown";
}
}
const char* getClassName(Class characterClass) {
switch (characterClass) {
case Class::WARRIOR: return "Warrior";
case Class::PALADIN: return "Paladin";
case Class::HUNTER: return "Hunter";
case Class::ROGUE: return "Rogue";
case Class::PRIEST: return "Priest";
case Class::DEATH_KNIGHT: return "Death Knight";
case Class::SHAMAN: return "Shaman";
case Class::MAGE: return "Mage";
case Class::WARLOCK: return "Warlock";
case Class::DRUID: return "Druid";
default: return "Unknown";
}
}
const char* getGenderName(Gender gender) {
switch (gender) {
case Gender::MALE: return "Male";
case Gender::FEMALE: return "Female";
default: return "Unknown";
}
}
} // namespace game
} // namespace wowee