Merge pull request #305 from Crystalwarrior/bugfix/blip-accuracy

More accurate/consistent blip rate functionality + punctuation slowdown fixes
This commit is contained in:
oldmud0 2020-11-10 14:07:45 -06:00 committed by GitHub
commit 4eb45ef2b0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 31 additions and 15 deletions

View File

@ -22,12 +22,9 @@ public:
int m_cycle = 0; int m_cycle = 0;
private: private:
const int max_blip_ms = 60;
QWidget *m_parent; QWidget *m_parent;
AOApplication *ao_app; AOApplication *ao_app;
qreal m_volume; qreal m_volume;
QElapsedTimer delay;
void set_volume_internal(qreal p_volume); void set_volume_internal(qreal p_volume);

View File

@ -275,7 +275,7 @@ private:
bool message_is_centered = false; bool message_is_centered = false;
int current_display_speed = 3; int current_display_speed = 3;
int message_display_speed[7] = {0, 10, 25, 40, 50, 70, 90}; int message_display_speed[7] = {5, 10, 25, 40, 50, 70, 90};
// The character ID of the character this user wants to appear alongside with. // The character ID of the character this user wants to appear alongside with.
int other_charid = -1; int other_charid = -1;
@ -314,7 +314,7 @@ private:
int real_tick_pos = 0; int real_tick_pos = 0;
// used to determine how often blips sound // used to determine how often blips sound
int blip_ticker = 0; int blip_ticker = 0;
int blip_rate = 1; int blip_rate = 2;
int rainbow_counter = 0; int rainbow_counter = 0;
bool rainbow_appended = false; bool rainbow_appended = false;
bool blank_blip = false; bool blank_blip = false;

View File

@ -26,10 +26,6 @@ void AOBlipPlayer::set_blips(QString p_sfx)
void AOBlipPlayer::blip_tick() void AOBlipPlayer::blip_tick()
{ {
if (delay.isValid() && delay.elapsed() < max_blip_ms)
return;
delay.start();
int f_cycle = m_cycle++; int f_cycle = m_cycle++;
if (m_cycle == 5) if (m_cycle == 5)

View File

@ -2990,17 +2990,40 @@ void Courtroom::chat_tick()
ui_vp_message->ensureCursorVisible(); ui_vp_message->ensureCursorVisible();
// Blip player and real tick pos ticker // We blip every "blip rate" letters.
if (!formatting_char && (f_character != ' ' || blank_blip)) { // Here's an example with blank_blip being false and blip_rate being 2:
if (blip_ticker % blip_rate == 0) { // I am you
blip_player->blip_tick(); // ! ! ! !
// where ! is the blip sound
int b_rate = blip_rate;
// Earrape prevention without using timers, this method is more consistent.
if (msg_delay != 0 && msg_delay <= 25) {
// The default blip speed is 40ms, and if current msg_delay is 25ms,
// the formula will result in the blip rate of:
// 40/25 = 1.6 = 2
// And if it's faster than that:
// 40/10 = 4
b_rate = qMax(b_rate, qRound(static_cast<float>(message_display_speed[3])/msg_delay));
} }
if (blip_ticker % b_rate == 0) {
// ignoring white space unless blank_blip is enabled.
if (!formatting_char && (f_character != ' ' || blank_blip)) {
blip_player->blip_tick();
++blip_ticker;
}
}
else
{
// Don't fully ignore whitespace still, keep ticking until
// we reached the need to play a blip sound - we also just
// need to wait for a letter to play it on.
++blip_ticker; ++blip_ticker;
} }
// Punctuation delayer // Punctuation delayer, only kicks in on speed ticks less than }}
if (punctuation_chars.contains(f_character)) { if (current_display_speed > 1 && punctuation_chars.contains(f_character)) {
msg_delay *= punctuation_modifier; // Making the user have to wait any longer than 150ms per letter is downright unreasonable
msg_delay = qMin(150, msg_delay * punctuation_modifier);
} }
// If this color is talking // If this color is talking