Skip to content

Commit c9ee2e5

Browse files
committed
fix: cap allleet to replace at most 2 characters
Previously allleet replaced every leet-mappable character in the nickname, often making the result unreadable (e.g. Beast -> 83427). Now it collects candidate positions, shuffles them, and replaces at most 2 — preserving the leet flavor while keeping the word recognizable.
1 parent 2c12d18 commit c9ee2e5

2 files changed

Lines changed: 24 additions & 10 deletions

File tree

dasmig/nicknamegen.hpp

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -441,24 +441,38 @@ class nng
441441
return leet_nickname;
442442
}
443443

444-
// Replaces as much letters as possible in the nickname by numerical
445-
// characters.
446-
static std::wstring allleet(
447-
const std::wstring& nickname,
448-
[[maybe_unused]] effolkronium::random_local& engine)
444+
// Replaces up to two random letters in the nickname by their numerical
445+
// leet-speak equivalents.
446+
static std::wstring allleet(const std::wstring& nickname,
447+
effolkronium::random_local& engine)
449448
{
450449
// Nickname leetified.
451450
std::wstring leet_nickname{nickname};
452451

453-
// Replace all possible characters.
454-
for (auto& character : leet_nickname)
452+
// Maximum number of characters to replace.
453+
static constexpr std::size_t max_replacements{2};
454+
455+
// Collect indices of leet-mappable characters.
456+
std::vector<std::size_t> candidate_positions;
457+
458+
for (std::size_t i = 0; i < leet_nickname.size(); ++i)
455459
{
456-
if (_leet_map.contains(character))
460+
if (_leet_map.contains(leet_nickname[i]))
457461
{
458-
character = _leet_map.at(character);
462+
candidate_positions.push_back(i);
459463
}
460464
}
461465

466+
// Shuffle and replace up to max_replacements positions.
467+
engine.shuffle(candidate_positions);
468+
469+
for (std::size_t n = 0;
470+
n < std::min(max_replacements, candidate_positions.size()); ++n)
471+
{
472+
auto pos = candidate_positions[n];
473+
leet_nickname[pos] = _leet_map.at(leet_nickname[pos]);
474+
}
475+
462476
return leet_nickname;
463477
}
464478

doc/usage.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ One of these transforms is randomly applied (50 % chance):
100100
| reverse | `emankcin` |
101101
| duovowel | `nicknamee` |
102102
| oneleet | `n1ckname` |
103-
| allleet | `n1ckn4m3` |
103+
| allleet | `n1cknam3` |
104104
| xfy | `XnicknameX` |
105105
| yfy | `nicknamy` |
106106
| numify | `nickname2000` |

0 commit comments

Comments
 (0)