From 21d51d9739996266f7f515c56c79754010357a17 Mon Sep 17 00:00:00 2001 From: Loren Burkholder Date: Tue, 27 Feb 2024 13:13:08 -0500 Subject: Add a command to gradually glitch text in a message --- src/CommandCompleter.cpp | 6 ++++++ src/CommandCompleter.h | 1 + src/Utils.cpp | 52 +++++++++++++++++++++++++++++++++++++++-------- src/Utils.h | 3 +++ src/timeline/InputBar.cpp | 3 +++ 5 files changed, 57 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/CommandCompleter.cpp b/src/CommandCompleter.cpp index 67be642f..33e7ef2c 100644 --- a/src/CommandCompleter.cpp +++ b/src/CommandCompleter.cpp @@ -93,6 +93,8 @@ CommandCompleter::data(const QModelIndex &index, int role) const return QStringLiteral("/msgtype "); case Glitch: return QStringLiteral("/glitch "); + case GradualGlitch: + return QStringLiteral("/gradualglitch "); case Goto: return QStringLiteral("/goto "); case ConvertToDm: @@ -174,6 +176,8 @@ CommandCompleter::data(const QModelIndex &index, int role) const return tr("/goto "); case Glitch: return tr("/glitch "); + case GradualGlitch: + return tr("/gradualglitch "); case ConvertToDm: return QStringLiteral("/converttodm"); case ConvertToRoom: @@ -251,6 +255,8 @@ CommandCompleter::data(const QModelIndex &index, int role) const return tr("Send a message with a custom message type."); case Glitch: return tr("Send a message with a glitch effect."); + case GradualGlitch: + return tr("Send a message that gradually glitches."); case Goto: return tr("Go to a specific message using an event id, index or matrix: link"); case ConvertToDm: diff --git a/src/CommandCompleter.h b/src/CommandCompleter.h index 44b192c3..9dc18119 100644 --- a/src/CommandCompleter.h +++ b/src/CommandCompleter.h @@ -49,6 +49,7 @@ public: Rainfall, Msgtype, Glitch, + GradualGlitch, Goto, ConvertToDm, ConvertToRoom, diff --git a/src/Utils.cpp b/src/Utils.cpp index 253b3761..3151d017 100644 --- a/src/Utils.cpp +++ b/src/Utils.cpp @@ -2014,24 +2014,60 @@ utils::removeExpiredEvents() ApplyEventExpiration::next(std::move(asus)); } +namespace { +static const QList diacritics = []() { + QList ret; + for (wchar_t c = u'\u0300'; c <= u'\u036f'; ++c) + ret.append(QChar(c)); + return ret; +}(); +} + QString utils::glitchText(const QString &text) { - static const QList diacritics = []() { - QList ret; - for (wchar_t c = u'\u0300'; c <= u'\u036f'; ++c) - ret.append(QChar(c)); - return ret; - }(); - QString result; - for (int i = 0; i < text.size(); ++i) { result.append(text.at(i)); if (QRandomGenerator64::global()->bounded(0, 100) >= 25) result.append( diacritics.at(QRandomGenerator64::global()->bounded(0, diacritics.size()))); } + return result; +} + +QString +utils::graduallyGlitchText(const QString &text) +{ + QString result; + + const int noGlitch = text.size() * 0.5; + const int someGlitch = text.size() * 0.8; + const int lotsOfGlitch = text.size() * 0.95; + + for (int i = 0; i < text.size(); ++i) { + result.append(text.at(i)); + + if (i < noGlitch) // first 40% of text is normal + continue; + else if (i < someGlitch) // next 25% is progressively glitchier + { + if (QRandomGenerator64::global()->bounded(noGlitch, someGlitch) < + noGlitch + (i - noGlitch) * 0.05) + result.append( + diacritics.at(QRandomGenerator64::global()->bounded(0, diacritics.size()))); + } else if (i < lotsOfGlitch) { // oh no, it's spreading! + if (QRandomGenerator64::global()->bounded(someGlitch, lotsOfGlitch) < i) + result.append( + diacritics.at(QRandomGenerator64::global()->bounded(0, diacritics.size()))); + } else { // just give up, your computer is cursed now + do { + if (QRandomGenerator64::global()->bounded(text.size() / 5, text.size()) < i) + result.append( + diacritics.at(QRandomGenerator64::global()->bounded(0, diacritics.size()))); + } while (QRandomGenerator64::global()->bounded(0, 100) < 35); + } + } return result; } diff --git a/src/Utils.h b/src/Utils.h index 1f477485..75438a7b 100644 --- a/src/Utils.h +++ b/src/Utils.h @@ -208,4 +208,7 @@ removeExpiredEvents(); QString glitchText(const QString &text); + +QString +graduallyGlitchText(const QString &text); } diff --git a/src/timeline/InputBar.cpp b/src/timeline/InputBar.cpp index f29b806c..62d38cf5 100644 --- a/src/timeline/InputBar.cpp +++ b/src/timeline/InputBar.cpp @@ -239,6 +239,7 @@ InputBar::updateTextContentProperties(const QString &t) QStringLiteral("rainfall"), QStringLiteral("msgtype"), QStringLiteral("glitch"), + QStringLiteral("gradualglitch"), QStringLiteral("goto"), QStringLiteral("converttodm"), QStringLiteral("converttoroom"), @@ -921,6 +922,8 @@ InputBar::command(const QString &command, QString args) customMsgtype(args.section(' ', 0, 0), args.section(' ', 1, -1)); } else if (command == QLatin1String("glitch")) { message(utils::glitchText(args)); + } else if (command == QLatin1String("gradualglitch")) { + message(utils::graduallyGlitchText(args)); } else if (command == QLatin1String("goto")) { // Goto has three different modes: // 1 - Going directly to a given event ID -- cgit 1.4.1