Add player name placeholder and improve dialog text substitution

Adds $n placeholder for player character names in quest and gossip dialog. Enhances documentation for three-option gender placeholders to clarify support for neutral terms like friend/champion/sibling. Player name defaults to 'Adventurer' when character not loaded.
This commit is contained in:
Kelsi 2026-02-09 17:46:45 -08:00
parent 0071c24713
commit e7f8fb557c
2 changed files with 16 additions and 5 deletions

View file

@ -4649,11 +4649,15 @@ std::string GameScreen::getSettingsPath() {
} }
std::string GameScreen::replaceGenderPlaceholders(const std::string& text, game::GameHandler& gameHandler) { std::string GameScreen::replaceGenderPlaceholders(const std::string& text, game::GameHandler& gameHandler) {
// Get player gender and pronouns // Get player gender, pronouns, and name
game::Gender gender = game::Gender::NONBINARY; game::Gender gender = game::Gender::NONBINARY;
std::string playerName = "Adventurer";
const auto* character = gameHandler.getActiveCharacter(); const auto* character = gameHandler.getActiveCharacter();
if (character) { if (character) {
gender = character->gender; gender = character->gender;
if (!character->name.empty()) {
playerName = character->name;
}
} }
game::Pronouns pronouns = game::Pronouns::forGender(gender); game::Pronouns pronouns = game::Pronouns::forGender(gender);
@ -4665,7 +4669,8 @@ std::string GameScreen::replaceGenderPlaceholders(const std::string& text, game:
s.erase(s.find_last_not_of(" \t\n\r") + 1); s.erase(s.find_last_not_of(" \t\n\r") + 1);
}; };
// Replace pronoun placeholders first (simpler, no complex parsing) // Replace simple placeholders first
// $n = player name
// $p = subject pronoun (he/she/they) // $p = subject pronoun (he/she/they)
// $o = object pronoun (him/her/them) // $o = object pronoun (him/her/them)
// $s = possessive adjective (his/her/their) // $s = possessive adjective (his/her/their)
@ -4678,6 +4683,7 @@ std::string GameScreen::replaceGenderPlaceholders(const std::string& text, game:
std::string replacement; std::string replacement;
switch (code) { switch (code) {
case 'n': replacement = playerName; break;
case 'p': replacement = pronouns.subject; break; case 'p': replacement = pronouns.subject; break;
case 'o': replacement = pronouns.object; break; case 'o': replacement = pronouns.object; break;
case 's': replacement = pronouns.possessive; break; case 's': replacement = pronouns.possessive; break;
@ -4691,7 +4697,7 @@ std::string GameScreen::replaceGenderPlaceholders(const std::string& text, game:
continue; continue;
} }
// Replace the pronoun placeholder // Replace the placeholder
result.replace(pos, 2, replacement); result.replace(pos, 2, replacement);
pos += replacement.length(); pos += replacement.length();
} }

View file

@ -6,12 +6,16 @@
namespace wowee { namespace ui { namespace wowee { namespace ui {
namespace { namespace {
// Helper function to replace gender placeholders and pronouns // Helper function to replace gender placeholders, pronouns, and name
std::string replaceGenderPlaceholders(const std::string& text, game::GameHandler& gameHandler) { std::string replaceGenderPlaceholders(const std::string& text, game::GameHandler& gameHandler) {
game::Gender gender = game::Gender::NONBINARY; game::Gender gender = game::Gender::NONBINARY;
std::string playerName = "Adventurer";
const auto* character = gameHandler.getActiveCharacter(); const auto* character = gameHandler.getActiveCharacter();
if (character) { if (character) {
gender = character->gender; gender = character->gender;
if (!character->name.empty()) {
playerName = character->name;
}
} }
game::Pronouns pronouns = game::Pronouns::forGender(gender); game::Pronouns pronouns = game::Pronouns::forGender(gender);
@ -22,7 +26,7 @@ std::string replaceGenderPlaceholders(const std::string& text, game::GameHandler
s.erase(s.find_last_not_of(" \t\n\r") + 1); s.erase(s.find_last_not_of(" \t\n\r") + 1);
}; };
// Replace pronoun placeholders // Replace simple placeholders
size_t pos = 0; size_t pos = 0;
while ((pos = result.find('$', pos)) != std::string::npos) { while ((pos = result.find('$', pos)) != std::string::npos) {
if (pos + 1 >= result.length()) break; if (pos + 1 >= result.length()) break;
@ -31,6 +35,7 @@ std::string replaceGenderPlaceholders(const std::string& text, game::GameHandler
std::string replacement; std::string replacement;
switch (code) { switch (code) {
case 'n': replacement = playerName; break;
case 'p': replacement = pronouns.subject; break; case 'p': replacement = pronouns.subject; break;
case 'o': replacement = pronouns.object; break; case 'o': replacement = pronouns.object; break;
case 's': replacement = pronouns.possessive; break; case 's': replacement = pronouns.possessive; break;