aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorstonedDiscord <stoned@derpymail.org>2020-03-06 16:43:03 +0100
committerGitHub <noreply@github.com>2020-03-06 16:43:03 +0100
commitb668bb227652f0b19f0d0b7251c2afa2f36473c5 (patch)
tree9f23859a30574d9ce9220dd0f5fd2450b5ec7e2c /src
parentc2fd3796a97ee8d87544ec26df7d6797acfebd80 (diff)
parent8c93cce0be0a316723284349d1f618dbf770ba3f (diff)
Merge branch 'master' into music_list_update
Diffstat (limited to 'src')
-rw-r--r--src/aocaseannouncerdialog.cpp6
-rw-r--r--src/aocharmovie.cpp263
-rw-r--r--src/aoevidencebutton.cpp4
-rw-r--r--src/aomusicplayer.cpp61
-rw-r--r--src/aooptionsdialog.cpp58
-rw-r--r--src/aosfxplayer.cpp31
-rw-r--r--src/charselect.cpp112
-rw-r--r--src/courtroom.cpp526
-rw-r--r--src/lobby.cpp6
-rw-r--r--src/main.cpp2
-rw-r--r--src/packet_distribution.cpp148
-rw-r--r--src/path_functions.cpp32
-rw-r--r--src/text_file_functions.cpp63
13 files changed, 1006 insertions, 306 deletions
diff --git a/src/aocaseannouncerdialog.cpp b/src/aocaseannouncerdialog.cpp
index 5b82b64f..4b36fe62 100644
--- a/src/aocaseannouncerdialog.cpp
+++ b/src/aocaseannouncerdialog.cpp
@@ -54,12 +54,15 @@ AOCaseAnnouncerDialog::AOCaseAnnouncerDialog(QWidget *parent, AOApplication *p_a
ui_juror_needed->setText(tr("Jurors needed"));
ui_steno_needed = new QCheckBox(this);
ui_steno_needed->setText(tr("Stenographer needed"));
+ ui_witness_needed = new QCheckBox(this);
+ ui_witness_needed->setText(tr("Witness needed"));
ui_form_layout->setWidget(1, QFormLayout::FieldRole, ui_defense_needed);
ui_form_layout->setWidget(2, QFormLayout::FieldRole, ui_prosecutor_needed);
ui_form_layout->setWidget(3, QFormLayout::FieldRole, ui_judge_needed);
ui_form_layout->setWidget(4, QFormLayout::FieldRole, ui_juror_needed);
ui_form_layout->setWidget(5, QFormLayout::FieldRole, ui_steno_needed);
+ ui_form_layout->setWidget(6, QFormLayout::FieldRole, ui_witness_needed);
setUpdatesEnabled(true);
}
@@ -71,7 +74,8 @@ void AOCaseAnnouncerDialog::ok_pressed()
ui_prosecutor_needed->isChecked(),
ui_judge_needed->isChecked(),
ui_juror_needed->isChecked(),
- ui_steno_needed->isChecked());
+ ui_steno_needed->isChecked(),
+ ui_witness_needed->isChecked());
done(0);
}
diff --git a/src/aocharmovie.cpp b/src/aocharmovie.cpp
index 57487233..e84c493f 100644
--- a/src/aocharmovie.cpp
+++ b/src/aocharmovie.cpp
@@ -7,136 +7,221 @@
AOCharMovie::AOCharMovie(QWidget *p_parent, AOApplication *p_ao_app) : QLabel(p_parent)
{
ao_app = p_ao_app;
-
m_movie = new QMovie(this);
-
preanim_timer = new QTimer(this);
+ ticker = new QTimer(this);
preanim_timer->setSingleShot(true);
-
- connect(m_movie, SIGNAL(frameChanged(int)), this, SLOT(frame_change(int)));
- connect(preanim_timer, SIGNAL(timeout()), this, SLOT(timer_done()));
+ ticker->setSingleShot(true);
+ connect(ticker, SIGNAL(timeout()), this, SLOT(movie_ticker()));
+ this->setUpdatesEnabled(true);
}
void AOCharMovie::play(QString p_char, QString p_emote, QString emote_prefix)
{
+ apng = false;
QString original_path = ao_app->get_character_path(p_char, emote_prefix + p_emote + ".gif");
- QString alt_path = ao_app->get_character_path(p_char, p_emote + ".png");
+ QString alt_path = ao_app->get_character_path(p_char, emote_prefix + p_emote + ".png");
+ QString alt_path_still = ao_app->get_character_path(p_char, p_emote + ".png");
QString apng_path = ao_app->get_character_path(p_char, emote_prefix + p_emote + ".apng");
QString placeholder_path = ao_app->get_theme_path("placeholder.gif");
QString placeholder_default_path = ao_app->get_default_theme_path("placeholder.gif");
QString gif_path;
-
+ current_emote = emote_prefix + p_emote;
+ current_char = p_char;
if (file_exists(apng_path))
+ {
gif_path = apng_path;
+ apng = true;
+ }
else if (file_exists(original_path))
gif_path = original_path;
else if (file_exists(alt_path))
gif_path = alt_path;
+ else if (file_exists(alt_path_still))
+ gif_path = alt_path_still;
else if (file_exists(placeholder_path))
gif_path = placeholder_path;
else
gif_path = placeholder_default_path;
-
+ last_path = gif_path;
+ delete m_movie;
+ m_movie = new QMovie(this);
m_movie->stop();
+ this->clear();
m_movie->setFileName(gif_path);
+ m_movie->jumpToFrame(0);
+ this->LoadImageWithStupidMethodForFlipSupport(m_movie->currentImage());
+ this->show();
+ this->play_frame_sfx();
+ ticker->start(m_movie->nextFrameDelay());
+}
- QImageReader *reader = new QImageReader(gif_path);
-
- movie_frames.clear();
- QImage f_image = reader->read();
- while (!f_image.isNull())
+void AOCharMovie::play_frame_sfx()
+{
+ int current_frame = m_movie->currentFrameNumber();
+ QString sfx_to_play = ao_app->get_frame_sfx_name(current_char, current_emote, current_frame);
+ QString screenshake_to_play = ao_app->get_screenshake_frame(current_char, current_emote, current_frame);
+ QString realization_to_play = ao_app->get_realization_frame(current_char, current_emote, current_frame);
+ if(sfx_to_play != "" && !use_networked_framehell)
{
- if (m_flipped)
- movie_frames.append(f_image.mirrored(true, false));
- else
- movie_frames.append(f_image);
- f_image = reader->read();
+ frame_specific_sfx_player->play(ao_app->get_sfx_suffix(sfx_to_play));
+ }
+ else if(use_networked_framehell)
+ {
+ this->sfx_two_network_boogaloo();
+ }
+ if(screenshake_to_play != "" && !use_networked_framehell)
+ {
+ mycourtroom->doScreenShake();
+ }
+ else if(use_networked_framehell)
+ {
+ this->screenshake_two_network_boogaloo();
+ }
+ if(realization_to_play != "" && !use_networked_framehell)
+ {
+ mycourtroom->doRealization();
+ }
+ else if(use_networked_framehell)
+ {
+ this->realization_two_network_boogaloo();
}
-
- delete reader;
-
- this->show();
- m_movie->start();
}
-void AOCharMovie::play_pre(QString p_char, QString p_emote, int duration)
+void AOCharMovie::realization_two_network_boogaloo()
{
- QString gif_path = ao_app->get_character_path(p_char, p_emote);
+ int current_frame = m_movie->currentFrameNumber();
+ QStringList realizationList = this->frame_realization_hellstring.split("^");
+ for (int i = 0; i < realizationList.length(); i++) {
+ QString screenshakeList = realizationList.at(i);
+ QStringList extra_garbage = screenshakeList.split("|");
+ if(extra_garbage.at(0) != current_emote){
+ continue;
+ }
+ for (int ii = 1; ii < extra_garbage.length(); ii++) {
+ QString levels_of_garbage = extra_garbage.at(ii);
+ QStringList that_shouldnt_be_possible = levels_of_garbage.split("=");
+ if(that_shouldnt_be_possible.at(0).toInt() == current_frame && that_shouldnt_be_possible.at(1) != "") {
+ mycourtroom->doRealization();
+ }
+ }
+ }
+}
- m_movie->stop();
- this->clear();
- m_movie->setFileName(gif_path);
- m_movie->jumpToFrame(0);
+void AOCharMovie::screenshake_two_network_boogaloo()
+{
+ int current_frame = m_movie->currentFrameNumber();
+ QStringList realizationList = this->frame_screenshake_hellstring.split("^");
+ for (int i = 0; i < realizationList.length(); i++) {
+ QString screenshakeList = realizationList.at(i);
+ QStringList extra_garbage = screenshakeList.split("|");
+ if(extra_garbage.at(0) != current_emote){
+ continue;
+ }
+ for (int ii = 1; ii < extra_garbage.length(); ii++) {
+ QString levels_of_garbage = extra_garbage.at(ii);
+ QStringList that_shouldnt_be_possible = levels_of_garbage.split("=");
+ if(that_shouldnt_be_possible.at(0).toInt() == current_frame && that_shouldnt_be_possible.at(1) != "") {
+ mycourtroom->doScreenShake();
+ }
+ }
+ }
+}
- int full_duration = duration * time_mod;
- int real_duration = 0;
+void AOCharMovie::sfx_two_network_boogaloo()
+{
+ int current_frame = m_movie->currentFrameNumber();
+ QStringList realizationList = this->frame_sfx_hellstring.split("^");
+ for (int i = 0; i < realizationList.length(); i++) {
+ QString screenshakeList = realizationList.at(i);
+ QStringList extra_garbage = screenshakeList.split("|");
+ if(extra_garbage.at(0) != current_emote){
+ continue;
+ }
+ for (int ii = 1; ii < extra_garbage.length(); ii++) {
+ QString levels_of_garbage = extra_garbage.at(ii);
+ QStringList that_shouldnt_be_possible = levels_of_garbage.split("=");
+ if(that_shouldnt_be_possible.at(0).toInt() == current_frame && that_shouldnt_be_possible.at(1) != "") {
+ frame_specific_sfx_player->play(ao_app->get_sfx_suffix(that_shouldnt_be_possible.at(1)));
+ }
+ }
+ }
+}
- play_once = false;
- for (int n_frame = 0 ; n_frame < m_movie->frameCount() ; ++n_frame)
+void AOCharMovie::movie_ticker()
+{
+ if(apng){
+ ticker->start(m_movie->nextFrameDelay());
+ }
+ if(m_movie->currentFrameNumber() == m_movie->frameCount() - 1)
{
- real_duration += m_movie->nextFrameDelay();
- m_movie->jumpToFrame(n_frame + 1);
+ delete m_movie;
+ m_movie = new QMovie(this);
+ m_movie->stop();
+ this->clear();
+ m_movie->setFileName(last_path);
+ m_movie->jumpToFrame(0);
+ if(play_once)
+ {
+ timer_done();
+ }
}
-
-#ifdef DEBUG_GIF
- qDebug() << "full_duration: " << full_duration;
- qDebug() << "real_duration: " << real_duration;
-#endif
-
- double percentage_modifier = 100.0;
-
- if (real_duration != 0 && duration != 0)
+ else
{
- double modifier = full_duration / static_cast<double>(real_duration);
- percentage_modifier = 100 / modifier;
+ m_movie->jumpToNextFrame();
+ }
+ this->LoadImageWithStupidMethodForFlipSupport(m_movie->currentImage());
+ // imagine if QT had sane stuff like "mirror on QMovie" or "resize the image on QT" or "interface with the current QMovie image" or anything else
- if (percentage_modifier > 100.0)
- percentage_modifier = 100.0;
+ this->play_frame_sfx();
+ if(!apng){
+ ticker->start(m_movie->nextFrameDelay());
}
-#ifdef DEBUG_GIF
- qDebug() << "% mod: " << percentage_modifier;
-#endif
+}
- if (full_duration == 0 || full_duration >= real_duration)
- {
- play_once = true;
- }
- else
- {
- play_once = false;
- preanim_timer->start(full_duration);
- }
+void AOCharMovie::LoadImageWithStupidMethodForFlipSupport(QImage image)
+{
+ QPixmap f_pixmap;
+ if(m_flipped)
+ f_pixmap = QPixmap::fromImage(image.mirrored(true, false));
+ else
+ f_pixmap = QPixmap::fromImage(image);
+ auto aspect_ratio = Qt::KeepAspectRatio;
+ if (f_pixmap.size().width() > f_pixmap.size().height())
+ aspect_ratio = Qt::KeepAspectRatioByExpanding;
- m_movie->setSpeed(static_cast<int>(percentage_modifier));
- play(p_char, p_emote, "");
+ if (f_pixmap.size().width() > this->size().width() || f_pixmap.size().height() > this->size().height())
+ this->setPixmap(f_pixmap.scaled(this->width(), this->height(), aspect_ratio, Qt::SmoothTransformation));
+ else
+ this->setPixmap(f_pixmap.scaled(this->width(), this->height(), aspect_ratio, Qt::FastTransformation));
+
+ QLabel::move(x + (this->width() - this->pixmap()->width())/2, y);
}
-void AOCharMovie::play_talking(QString p_char, QString p_emote)
+void AOCharMovie::play_pre(QString p_char, QString p_emote, int duration)
{
- QString gif_path = ao_app->get_character_path(p_char, "(b)" + p_emote);
+ QString gif_path = ao_app->get_character_path(p_char, p_emote);
m_movie->stop();
- this->clear();
m_movie->setFileName(gif_path);
+ m_movie->jumpToFrame(0);
+ int real_duration = 0;
+ play_once = true;
+ play(p_char, p_emote, "");
+}
+void AOCharMovie::play_talking(QString p_char, QString p_emote)
+{
play_once = false;
- m_movie->setSpeed(100);
play(p_char, p_emote, "(b)");
}
void AOCharMovie::play_idle(QString p_char, QString p_emote)
{
- QString gif_path = ao_app->get_character_path(p_char, "(a)" + p_emote);
-
- m_movie->stop();
- this->clear();
- m_movie->setFileName(gif_path);
-
play_once = false;
- m_movie->setSpeed(100);
play(p_char, p_emote, "(a)");
}
@@ -144,7 +229,7 @@ void AOCharMovie::stop()
{
//for all intents and purposes, stopping is the same as hiding. at no point do we want a frozen gif to display
m_movie->stop();
- preanim_timer->stop();
+ frame_specific_sfx_player->stop();
this->hide();
}
@@ -152,9 +237,8 @@ void AOCharMovie::combo_resize(int w, int h)
{
QSize f_size(w, h);
this->resize(f_size);
- m_movie->setScaledSize(f_size);
+ m_movie->setScaledSize(this->size());
}
-
void AOCharMovie::move(int ax, int ay)
{
x = ax;
@@ -162,34 +246,7 @@ void AOCharMovie::move(int ax, int ay)
QLabel::move(x, y);
}
-void AOCharMovie::frame_change(int n_frame)
-{
-
- if (movie_frames.size() > n_frame)
- {
- QPixmap f_pixmap = QPixmap::fromImage(movie_frames.at(n_frame));
- auto aspect_ratio = Qt::KeepAspectRatio;
-
- if (f_pixmap.size().width() > f_pixmap.size().height())
- aspect_ratio = Qt::KeepAspectRatioByExpanding;
-
- if (f_pixmap.size().width() > this->size().width() || f_pixmap.size().height() > this->size().height())
- this->setPixmap(f_pixmap.scaled(this->width(), this->height(), aspect_ratio, Qt::SmoothTransformation));
- else
- this->setPixmap(f_pixmap.scaled(this->width(), this->height(), aspect_ratio, Qt::FastTransformation));
-
- QLabel::move(x + (this->width() - this->pixmap()->width())/2, y);
- }
-
- if (m_movie->frameCount() - 1 == n_frame && play_once)
- {
- preanim_timer->start(m_movie->nextFrameDelay());
- m_movie->stop();
- }
-}
-
void AOCharMovie::timer_done()
{
-
done();
}
diff --git a/src/aoevidencebutton.cpp b/src/aoevidencebutton.cpp
index 15b598fc..4dc03959 100644
--- a/src/aoevidencebutton.cpp
+++ b/src/aoevidencebutton.cpp
@@ -90,15 +90,11 @@ void AOEvidenceButton::mouseDoubleClickEvent(QMouseEvent *e)
void AOEvidenceButton::dragLeaveEvent(QMouseEvent *e)
{
//QWidget::dragLeaveEvent(e);
-
- qDebug() << "drag leave event";
}
void AOEvidenceButton::dragEnterEvent(QMouseEvent *e)
{
//QWidget::dragEnterEvent(e);
-
- qDebug() << "drag enter event";
}
*/
diff --git a/src/aomusicplayer.cpp b/src/aomusicplayer.cpp
index 27918092..74dcc639 100644
--- a/src/aomusicplayer.cpp
+++ b/src/aomusicplayer.cpp
@@ -1,7 +1,7 @@
#include "aomusicplayer.h"
#if defined(BASSAUDIO)
-AOMusicPlayer::AOMusicPlayer(QWidget *parent, AOApplication *p_ao_app)
+AOMusicPlayer::AOMusicPlayer(QWidget *parent, AOApplication *p_ao_app): QObject()
{
m_parent = parent;
ao_app = p_ao_app;
@@ -9,14 +9,14 @@ AOMusicPlayer::AOMusicPlayer(QWidget *parent, AOApplication *p_ao_app)
AOMusicPlayer::~AOMusicPlayer()
{
- BASS_ChannelStop(m_stream);
+ kill_loop();
}
void AOMusicPlayer::play(QString p_song)
{
BASS_ChannelStop(m_stream);
- QString f_path = ao_app->get_music_path(p_song);
+ f_path = ao_app->get_music_path(p_song);
m_stream = BASS_StreamCreateFile(FALSE, f_path.utf16(), 0, 0, BASS_STREAM_AUTOFREE | BASS_UNICODE | BASS_ASYNCFILE);
@@ -24,7 +24,18 @@ void AOMusicPlayer::play(QString p_song)
if (ao_app->get_audio_output_device() != "default")
BASS_ChannelSetDevice(m_stream, BASS_GetDevice());
+ if(enable_looping)
+ {
+ BASS_ChannelFlags(m_stream, BASS_SAMPLE_LOOP, BASS_SAMPLE_LOOP);
+ }
+ else
+ {
+ BASS_ChannelFlags(m_stream, 0, BASS_SAMPLE_LOOP);
+ }
BASS_ChannelPlay(m_stream, false);
+
+
+
}
void AOMusicPlayer::set_volume(int p_value)
@@ -33,8 +44,19 @@ void AOMusicPlayer::set_volume(int p_value)
float volume = m_volume / 100.0f;
BASS_ChannelSetAttribute(m_stream, BASS_ATTRIB_VOL, volume);
}
+
+QString AOMusicPlayer::get_path()
+{
+ return f_path;
+}
+
+void AOMusicPlayer::kill_loop()
+{
+ BASS_ChannelStop(m_stream);
+}
+
#elif defined(QTAUDIO)
-AOMusicPlayer::AOMusicPlayer(QWidget *parent, AOApplication *p_ao_app)
+AOMusicPlayer::AOMusicPlayer(QWidget *parent, AOApplication *p_ao_app): QObject()
{
m_parent = parent;
ao_app = p_ao_app;
@@ -53,7 +75,7 @@ void AOMusicPlayer::play(QString p_song)
m_player.setMedia(QUrl::fromLocalFile(f_path));
- this->set_volume(m_volume);
+ this->set_volume(100);
m_player.play();
}
@@ -61,10 +83,25 @@ void AOMusicPlayer::play(QString p_song)
void AOMusicPlayer::set_volume(int p_value)
{
m_volume = p_value;
- m_player.setVolume(m_volume);
+
+ qreal linearVolume = QAudio::convertVolume(m_volume / qreal(100),
+ QAudio::LogarithmicVolumeScale,
+ QAudio::LinearVolumeScale);
+
+ m_player.setVolume(linearVolume*100);
+}
+
+QString AOMusicPlayer::get_path()
+{
+ return f_path;
+}
+
+void AOMusicPlayer::kill_loop()
+{
+ m_player.stop();
}
#else
-AOMusicPlayer::AOMusicPlayer(QWidget *parent, AOApplication *p_ao_app)
+AOMusicPlayer::AOMusicPlayer(QWidget *parent, AOApplication *p_ao_app): QObject()
{
m_parent = parent;
ao_app = p_ao_app;
@@ -84,4 +121,14 @@ void AOMusicPlayer::set_volume(int p_value)
{
}
+
+QString AOMusicPlayer::get_path()
+{
+ return f_path;
+}
+
+void AOMusicPlayer::kill_loop()
+{
+
+}
#endif
diff --git a/src/aooptionsdialog.cpp b/src/aooptionsdialog.cpp
index 82507a1f..37d49573 100644
--- a/src/aooptionsdialog.cpp
+++ b/src/aooptionsdialog.cpp
@@ -166,10 +166,21 @@ AOOptionsDialog::AOOptionsDialog(QWidget *parent, AOApplication *p_ao_app) : QDi
ui_gameplay_form->setWidget(9, QFormLayout::FieldRole, ui_discord_cb);
+ ui_epilepsy_lbl = new QLabel(ui_form_layout_widget);
+ ui_epilepsy_lbl->setText(tr("Allow Shake/Flash:"));
+ ui_epilepsy_lbl->setToolTip(tr("Allows screenshaking and flashing. Disable this if you have concerns or issues with photosensitivity and/or seizures."));
+
+ ui_gameplay_form->setWidget(10, QFormLayout::LabelRole, ui_epilepsy_lbl);
+
+ ui_epilepsy_cb = new QCheckBox(ui_form_layout_widget);
+ ui_epilepsy_cb->setChecked(ao_app->is_shakeandflash_enabled());
+
+ ui_gameplay_form->setWidget(10, QFormLayout::FieldRole, ui_epilepsy_cb);
+
ui_language_label = new QLabel(ui_form_layout_widget);
ui_language_label->setText(tr("Language:"));
ui_language_label->setToolTip(tr("Sets the language if you don't want to use your system language."));
- ui_gameplay_form->setWidget(10, QFormLayout::LabelRole, ui_language_label);
+ ui_gameplay_form->setWidget(11, QFormLayout::LabelRole, ui_language_label);
ui_language_combobox = new QComboBox(ui_form_layout_widget);
ui_language_combobox->addItem(configini->value("language", " ").value<QString>() + " - Keep current setting");
@@ -179,7 +190,7 @@ AOOptionsDialog::AOOptionsDialog(QWidget *parent, AOApplication *p_ao_app) : QDi
ui_language_combobox->addItem("es - Español");
ui_language_combobox->addItem("jp - 日本語");
ui_language_combobox->addItem("ru - Русский");
- ui_gameplay_form->setWidget(10, QFormLayout::FieldRole, ui_language_combobox);
+ ui_gameplay_form->setWidget(11, QFormLayout::FieldRole, ui_language_combobox);
// Here we start the callwords tab.
ui_callwords_tab = new QWidget();
@@ -334,6 +345,29 @@ AOOptionsDialog::AOOptionsDialog(QWidget *parent, AOApplication *p_ao_app) : QDi
ui_audio_layout->setWidget(7, QFormLayout::FieldRole, ui_blank_blips_cb);
+ ui_loopsfx_lbl = new QLabel(ui_audio_widget);
+ ui_loopsfx_lbl->setText(tr("Enable Looping SFX:"));
+ ui_loopsfx_lbl->setToolTip(tr("If true, the game will allow looping sound effects to play on preanimations."));
+
+ ui_audio_layout->setWidget(8, QFormLayout::LabelRole, ui_loopsfx_lbl);
+
+ ui_loopsfx_cb = new QCheckBox(ui_audio_widget);
+ ui_loopsfx_cb->setChecked(p_ao_app->get_looping_sfx());
+
+ ui_audio_layout->setWidget(8, QFormLayout::FieldRole, ui_loopsfx_cb);
+
+
+ ui_objectmusic_lbl = new QLabel(ui_audio_widget);
+ ui_objectmusic_lbl->setText(tr("Kill Music On Objection:"));
+ ui_objectmusic_lbl->setToolTip(tr("If true, the game will stop music when someone objects, like in the actual games."));
+
+ ui_audio_layout->setWidget(9, QFormLayout::LabelRole, ui_objectmusic_lbl);
+
+ ui_objectmusic_cb = new QCheckBox(ui_audio_widget);
+ ui_objectmusic_cb->setChecked(p_ao_app->get_objectmusic());
+
+ ui_audio_layout->setWidget(9, QFormLayout::FieldRole, ui_objectmusic_cb);
+
// The casing tab!
ui_casing_tab = new QWidget();
ui_settings_tabs->addTab(ui_casing_tab, tr("Casing"));
@@ -455,6 +489,18 @@ AOOptionsDialog::AOOptionsDialog(QWidget *parent, AOApplication *p_ao_app) : QDi
ui_casing_layout->setWidget(7, QFormLayout::FieldRole, ui_casing_cm_cb);
+ ui_casing_wit_lbl = new QLabel(ui_casing_widget);
+ ui_casing_wit_lbl->setText(tr("Witness:"));
+ ui_casing_wit_lbl->setToolTip(tr("If checked, you will appear amongst the potential "
+ "witnesses on the server."));
+
+ ui_casing_layout->setWidget(8, QFormLayout::LabelRole, ui_casing_wit_lbl);
+
+ ui_casing_wit_cb = new QCheckBox(ui_casing_widget);
+ ui_casing_wit_cb->setChecked(ao_app->get_casing_wit_enabled());
+
+ ui_casing_layout->setWidget(8, QFormLayout::FieldRole, ui_casing_wit_cb);
+
// -- CM CASES ANNOUNCEMENTS
ui_casing_cm_cases_lbl = new QLabel(ui_casing_widget);
@@ -462,12 +508,12 @@ AOOptionsDialog::AOOptionsDialog(QWidget *parent, AOApplication *p_ao_app) : QDi
ui_casing_cm_cases_lbl->setToolTip(tr("If you're a CM, enter what cases you are "
"willing to host."));
- ui_casing_layout->setWidget(8, QFormLayout::LabelRole, ui_casing_cm_cases_lbl);
+ ui_casing_layout->setWidget(9, QFormLayout::LabelRole, ui_casing_cm_cases_lbl);
ui_casing_cm_cases_textbox = new QLineEdit(ui_casing_widget);
ui_casing_cm_cases_textbox->setText(ao_app->get_casing_can_host_cases());
- ui_casing_layout->setWidget(8, QFormLayout::FieldRole, ui_casing_cm_cases_textbox);
+ ui_casing_layout->setWidget(9, QFormLayout::FieldRole, ui_casing_cm_cases_textbox);
// When we're done, we should continue the updates!
setUpdatesEnabled(true);
@@ -485,6 +531,7 @@ void AOOptionsDialog::save_pressed()
configini->setValue("show_custom_shownames", ui_showname_cb->isChecked());
configini->setValue("master", ui_ms_textbox->text());
configini->setValue("discord", ui_discord_cb->isChecked());
+ configini->setValue("shakeandflash", ui_epilepsy_cb->isChecked());
configini->setValue("language", ui_language_combobox->currentText().left(2));
QFile* callwordsini = new QFile(ao_app->get_base_path() + "callwords.ini");
@@ -506,6 +553,8 @@ void AOOptionsDialog::save_pressed()
configini->setValue("default_blip", ui_blips_volume_spinbox->value());
configini->setValue("blip_rate", ui_bliprate_spinbox->value());
configini->setValue("blank_blip", ui_blank_blips_cb->isChecked());
+ configini->setValue("looping_sfx", ui_loopsfx_cb->isChecked());
+ configini->setValue("kill_music_on_object", ui_objectmusic_cb->isChecked());
configini->setValue("casing_enabled", ui_casing_enabled_cb->isChecked());
configini->setValue("casing_defence_enabled", ui_casing_def_cb->isChecked());
@@ -514,6 +563,7 @@ void AOOptionsDialog::save_pressed()
configini->setValue("casing_juror_enabled", ui_casing_jur_cb->isChecked());
configini->setValue("casing_steno_enabled", ui_casing_steno_cb->isChecked());
configini->setValue("casing_cm_enabled", ui_casing_cm_cb->isChecked());
+ configini->setValue("casing_wit_enabled", ui_casing_wit_cb->isChecked());
configini->setValue("casing_can_host_cases", ui_casing_cm_cases_textbox->text());
callwordsini->close();
diff --git a/src/aosfxplayer.cpp b/src/aosfxplayer.cpp
index ad8ced60..d2140e3e 100644
--- a/src/aosfxplayer.cpp
+++ b/src/aosfxplayer.cpp
@@ -2,7 +2,7 @@
#include "file_functions.h"
#if defined(BASSAUDIO) //Using bass.dll for sfx
-AOSfxPlayer::AOSfxPlayer(QWidget *parent, AOApplication *p_ao_app)
+AOSfxPlayer::AOSfxPlayer(QWidget *parent, AOApplication *p_ao_app): QObject()
{
m_parent = parent;
ao_app = p_ao_app;
@@ -29,7 +29,7 @@ void AOSfxPlayer::play(QString p_sfx, QString p_char, QString shout)
f_path = misc_path;
else
f_path = sound_path;
-
+ BASS_ChannelStop(m_stream);
m_stream = BASS_StreamCreateFile(FALSE, f_path.utf16(), 0, 0, BASS_STREAM_AUTOFREE | BASS_UNICODE | BASS_ASYNCFILE);
set_volume_internal(m_volume);
@@ -37,6 +37,19 @@ void AOSfxPlayer::play(QString p_sfx, QString p_char, QString shout)
if (ao_app->get_audio_output_device() != "default")
BASS_ChannelSetDevice(m_stream, BASS_GetDevice());
BASS_ChannelPlay(m_stream, false);
+ if(looping_sfx && ao_app->get_looping_sfx())
+ {
+ BASS_ChannelFlags(m_stream, BASS_SAMPLE_LOOP, BASS_SAMPLE_LOOP);
+ }
+ else
+ {
+ BASS_ChannelFlags(m_stream, 0, BASS_SAMPLE_LOOP);
+ }
+}
+
+void AOSfxPlayer::setLooping(bool is_looping)
+{
+ this->looping_sfx = is_looping;
}
void AOSfxPlayer::stop()
@@ -56,7 +69,7 @@ void AOSfxPlayer::set_volume_internal(qreal p_value)
BASS_ChannelSetAttribute(m_stream, BASS_ATTRIB_VOL, volume);
}
#elif defined(QTAUDIO) //Using Qt's QSoundEffect class
-AOSfxPlayer::AOSfxPlayer(QWidget *parent, AOApplication *p_ao_app)
+AOSfxPlayer::AOSfxPlayer(QWidget *parent, AOApplication *p_ao_app): QObject()
{
m_parent = parent;
ao_app = p_ao_app;
@@ -94,6 +107,11 @@ void AOSfxPlayer::play(QString p_sfx, QString p_char, QString shout)
}
}
+void AOSfxPlayer::setLooping(bool is_looping)
+{
+ this->looping_sfx = is_looping;
+}
+
void AOSfxPlayer::stop()
{
m_sfx.stop();
@@ -110,7 +128,7 @@ void AOSfxPlayer::set_volume_internal(qreal p_value)
m_sfx.setVolume(m_volume);
}
#else
-AOSfxPlayer::AOSfxPlayer(QWidget *parent, AOApplication *p_ao_app)
+AOSfxPlayer::AOSfxPlayer(QWidget *parent, AOApplication *p_ao_app): QObject()
{
m_parent = parent;
ao_app = p_ao_app;
@@ -121,6 +139,11 @@ void AOSfxPlayer::play(QString p_sfx, QString p_char, QString shout)
}
+void AOSfxPlayer::setLooping(bool is_looping)
+{
+ this->looping_sfx = is_looping;
+}
+
void AOSfxPlayer::stop()
{
diff --git a/src/charselect.cpp b/src/charselect.cpp
index 0cfb7753..d6ee0445 100644
--- a/src/charselect.cpp
+++ b/src/charselect.cpp
@@ -5,6 +5,59 @@
#include "debug_functions.h"
#include "hardware_functions.h"
+class AOCharSelectGenerationThreading : public QRunnable
+{
+public:
+ Courtroom *thisCourtroom;
+ int char_num;
+ AOCharButton *char_button;
+ AOCharSelectGenerationThreading(Courtroom *my_courtroom, int character_number, AOCharButton *charbut){
+ thisCourtroom = my_courtroom;
+ char_num = character_number;
+ char_button = charbut;
+ }
+ void run()
+ {
+ AOCharButton* thisCharacterButton = char_button;
+ thisCharacterButton->reset();
+ thisCharacterButton->hide();
+ thisCharacterButton->set_image(thisCourtroom->char_list.at(char_num).name);
+ thisCourtroom->ui_char_button_list.append(thisCharacterButton);
+
+ thisCourtroom->connect(thisCharacterButton, SIGNAL(clicked()), thisCourtroom->char_button_mapper, SLOT(map()));
+ thisCourtroom->char_button_mapper->setMapping(thisCharacterButton, thisCourtroom->ui_char_button_list.size() - 1);
+ }
+};
+
+class AOCharSelectFilterThreading : public QRunnable
+{
+public:
+ Courtroom *thisCourtroom;
+ int char_num;
+ AOCharSelectFilterThreading(Courtroom *my_courtroom, int character_number){
+ thisCourtroom = my_courtroom;
+ char_num = character_number;
+ }
+ void run()
+ {
+ AOCharButton* current_char = thisCourtroom->ui_char_button_list.at(char_num);
+
+ if (!thisCourtroom->ui_char_taken->isChecked() && thisCourtroom->char_list.at(char_num).taken)
+ return;
+
+ if (!thisCourtroom->char_list.at(char_num).name.contains(thisCourtroom->ui_char_search->text(), Qt::CaseInsensitive))
+ return;
+
+ // We only really need to update the fact that a character is taken
+ // for the buttons that actually appear.
+ // You'd also update the passwordedness and etc. here later.
+ current_char->reset();
+ current_char->set_taken(thisCourtroom->char_list.at(char_num).taken);
+
+ thisCourtroom->ui_char_button_list_filtered.append(current_char);
+ }
+};
+
void Courtroom::construct_char_select()
{
ui_char_select_background = new AOImage(this, ao_app);
@@ -44,6 +97,7 @@ void Courtroom::construct_char_select()
set_size_and_pos(ui_char_buttons, "char_buttons");
+ connect(char_button_mapper, SIGNAL(mapped(int)), this, SLOT(char_clicked(int)));
connect(ui_back_to_lobby, SIGNAL(clicked()), this, SLOT(on_back_to_lobby_clicked()));
connect(ui_char_select_left, SIGNAL(clicked()), this, SLOT(on_char_select_left_clicked()));
@@ -125,7 +179,7 @@ void Courtroom::char_clicked(int n_char)
if (!file_exists(char_ini_path))
{
- call_notice("Could not find " + char_ini_path);
+ call_notice(tr("Could not find %1").arg(char_ini_path, 1));
return;
}
@@ -197,28 +251,15 @@ void Courtroom::character_loading_finished()
// Later on, we'll be revealing buttons as we need them.
for (int n = 0; n < char_list.size(); n++)
{
- AOCharButton* char_button = new AOCharButton(ui_char_buttons, ao_app, 0, 0, char_list.at(n).taken);
- char_button->reset();
- char_button->hide();
- char_button->set_image(char_list.at(n).name);
- ui_char_button_list.append(char_button);
-
- connect(char_button, &AOCharButton::clicked, [this, n](){
- this->char_clicked(n);
- });
-
- // This part here serves as a way of showing to the player that the game is still running, it is
- // just loading the pictures of the characters.
- if (ao_app->lobby_constructed)
- {
- ao_app->generated_chars++;
- int total_loading_size = ao_app->char_list_size * 2 + ao_app->evidence_list_size + ao_app->music_list_size;
- int loading_value = int(((ao_app->loaded_chars + ao_app->generated_chars + ao_app->loaded_music + ao_app->loaded_evidence) / static_cast<double>(total_loading_size)) * 100);
- ao_app->w_lobby->set_loading_value(loading_value);
- ao_app->w_lobby->set_loading_text(tr("Generating chars:\n%1/%2").arg(QString::number(ao_app->generated_chars)).arg(QString::number(ao_app->char_list_size)));
- }
+ AOCharButton* characterButton = new AOCharButton(ui_char_buttons, ao_app, 0, 0, char_list.at(n).taken);
+ AOCharSelectGenerationThreading *char_generate = new AOCharSelectGenerationThreading(this, n, characterButton);
+ QThreadPool::globalInstance()->start(char_generate);
+ if(QThreadPool::globalInstance()->activeThreadCount() == QThreadPool::globalInstance()->maxThreadCount())
+ {
+ QThreadPool::globalInstance()->waitForDone();
+ }
}
-
+ QThreadPool::globalInstance()->waitForDone();
filter_character_list();
}
@@ -227,27 +268,14 @@ void Courtroom::filter_character_list()
ui_char_button_list_filtered.clear();
for (int i = 0; i < char_list.size(); i++)
{
- AOCharButton* current_char = ui_char_button_list.at(i);
-
- // It seems passwording characters is unimplemented yet?
- // Until then, this will stay here, I suppose.
- //if (ui_char_passworded->isChecked() && character_is_passworded??)
- // continue;
-
- if (!ui_char_taken->isChecked() && char_list.at(i).taken)
- continue;
-
- if (!char_list.at(i).name.contains(ui_char_search->text(), Qt::CaseInsensitive))
- continue;
-
- // We only really need to update the fact that a character is taken
- // for the buttons that actually appear.
- // You'd also update the passwordedness and etc. here later.
- current_char->reset();
- current_char->set_taken(char_list.at(i).taken);
-
- ui_char_button_list_filtered.append(current_char);
+ AOCharSelectFilterThreading *char_filter = new AOCharSelectFilterThreading(this, i);
+ QThreadPool::globalInstance()->start(char_filter);
+ if(QThreadPool::globalInstance()->activeThreadCount() == QThreadPool::globalInstance()->maxThreadCount())
+ {
+ QThreadPool::globalInstance()->waitForDone();
+ }
}
+ QThreadPool::globalInstance()->waitForDone();
current_char_page = 0;
set_char_select_page();
diff --git a/src/courtroom.cpp b/src/courtroom.cpp
index c6a8749a..718470fc 100644
--- a/src/courtroom.cpp
+++ b/src/courtroom.cpp
@@ -1,5 +1,4 @@
#include "courtroom.h"
-
Courtroom::Courtroom(AOApplication *p_ao_app) : QMainWindow()
{
ao_app = p_ao_app;
@@ -64,6 +63,8 @@ Courtroom::Courtroom(AOApplication *p_ao_app) : QMainWindow()
testimony_hide_timer = new QTimer(this);
testimony_hide_timer->setSingleShot(true);
+ char_button_mapper = new QSignalMapper(this);
+
music_player = new AOMusicPlayer(this, ao_app);
music_player->set_volume(0);
@@ -73,6 +74,13 @@ Courtroom::Courtroom(AOApplication *p_ao_app) : QMainWindow()
objection_player = new AOSfxPlayer(this, ao_app);
objection_player->set_volume(0);
+ misc_sfx_player = new AOSfxPlayer(this, ao_app);
+ misc_sfx_player->set_volume(0);
+ frame_emote_sfx_player = new AOSfxPlayer(this, ao_app);
+ frame_emote_sfx_player->set_volume(0);
+ pair_frame_emote_sfx_player = new AOSfxPlayer(this, ao_app); // todo: recode pair
+ pair_frame_emote_sfx_player->set_volume(0);
+
blip_player = new AOBlipPlayer(this, ao_app);
blip_player->set_volume(0);
@@ -86,7 +94,11 @@ Courtroom::Courtroom(AOApplication *p_ao_app) : QMainWindow()
ui_vp_speedlines = new AOMovie(ui_viewport, ao_app);
ui_vp_speedlines->set_play_once(false);
ui_vp_player_char = new AOCharMovie(ui_viewport, ao_app);
+ ui_vp_player_char->frame_specific_sfx_player = frame_emote_sfx_player;
+ ui_vp_player_char->mycourtroom = this;
ui_vp_sideplayer_char = new AOCharMovie(ui_viewport, ao_app);
+ ui_vp_sideplayer_char->frame_specific_sfx_player = pair_frame_emote_sfx_player;
+ ui_vp_sideplayer_char->mycourtroom = this;
ui_vp_sideplayer_char->hide();
ui_vp_desk = new AOScene(ui_viewport, ao_app);
ui_vp_legacy_desk = new AOScene(ui_viewport, ao_app);
@@ -201,7 +213,9 @@ Courtroom::Courtroom(AOApplication *p_ao_app) : QMainWindow()
ui_flip->hide();
ui_guard = new QCheckBox(this);
- ui_guard->setText(tr("Guard"));
+
+ ui_guard->setText(tr("Disable Modcalls"));
+
ui_guard->hide();
ui_casing = new QCheckBox(this);
@@ -219,6 +233,7 @@ Courtroom::Courtroom(AOApplication *p_ao_app) : QMainWindow()
ui_custom_objection = new AOButton(this, ao_app);
ui_realization = new AOButton(this, ao_app);
+ ui_screenshake = new AOButton(this, ao_app);
ui_mute = new AOButton(this, ao_app);
ui_defense_plus = new AOButton(this, ao_app);
@@ -304,7 +319,7 @@ Courtroom::Courtroom(AOApplication *p_ao_app) : QMainWindow()
connect(ui_custom_objection, SIGNAL(clicked()), this, SLOT(on_custom_objection_clicked()));
connect(ui_realization, SIGNAL(clicked()), this, SLOT(on_realization_clicked()));
-
+ connect(ui_screenshake, SIGNAL(clicked()), this, SLOT(on_screenshake_clicked()));
connect(ui_mute, SIGNAL(clicked()), this, SLOT(on_mute_clicked()));
connect(ui_defense_minus, SIGNAL(clicked()), this, SLOT(on_defense_minus_clicked()));
@@ -642,6 +657,9 @@ void Courtroom::set_widgets()
set_size_and_pos(ui_realization, "realization");
ui_realization->set_image("realization.png");
+ set_size_and_pos(ui_screenshake, "screenshake");
+ ui_screenshake->set_image("screenshake.png");
+
set_size_and_pos(ui_mute, "mute_button");
ui_mute->set_image("mute.png");
@@ -784,6 +802,24 @@ void Courtroom::set_size_and_pos(QWidget *p_widget, QString p_identifier)
}
}
+QPoint Courtroom::get_theme_pos(QString p_identifier)
+{
+ QString filename = "courtroom_design.ini";
+
+ pos_size_type design_ini_result = ao_app->get_element_dimensions(p_identifier, filename);
+
+ if (design_ini_result.width < 0 || design_ini_result.height < 0)
+ {
+ qDebug() << "W: could not find \"" << p_identifier << "\" in " << filename;
+ return QPoint(0,0);
+ }
+ else
+ {
+ return QPoint(design_ini_result.x, design_ini_result.y);
+ }
+}
+
+
void Courtroom::set_taken(int n_char, bool p_taken)
{
if (n_char >= char_list.size())
@@ -844,45 +880,58 @@ void Courtroom::set_background(QString p_background)
}
}
-void Courtroom::enter_courtroom(int p_cid)
-{
- m_cid = p_cid;
+void Courtroom::set_character(int char_id)
+{
+ m_cid = char_id;
- QString f_char;
+ QString f_char;
- if (m_cid == -1)
- {
- if (ao_app->is_discord_enabled())
- ao_app->discord->state_spectate();
- f_char = "";
- }
- else
- {
- f_char = ao_app->get_char_name(char_list.at(m_cid).name);
+ if (m_cid == -1)
+ {
+ if (ao_app->is_discord_enabled())
+ ao_app->discord->state_spectate();
+ f_char = "";
+ }
+ else
+ {
+ f_char = ao_app->get_char_name(char_list.at(m_cid).name);
- if (ao_app->is_discord_enabled())
- ao_app->discord->state_character(f_char.toStdString());
- }
+ if (ao_app->is_discord_enabled())
+ ao_app->discord->state_character(f_char.toStdString());
+ }
- current_char = f_char;
+ current_char = f_char;
- current_emote_page = 0;
- current_emote = 0;
+ current_emote_page = 0;
+ current_emote = 0;
- if (m_cid == -1)
- ui_emotes->hide();
- else
- ui_emotes->show();
+ if (m_cid == -1)
+ ui_emotes->hide();
+ else
+ ui_emotes->show();
+
+ set_emote_page();
+ set_emote_dropdown();
+
+ if (ao_app->custom_objection_enabled &&
+ (file_exists(ao_app->get_character_path(current_char, "custom.gif")) ||
+ file_exists(ao_app->get_character_path(current_char, "custom.apng"))) &&
+ file_exists(ao_app->get_character_path(current_char, "custom.wav")))
+ ui_custom_objection->show();
+ else
+ ui_custom_objection->hide();
+}
- set_emote_page();
- set_emote_dropdown();
+void Courtroom::enter_courtroom(int p_cid)
+{
+ this->set_character(p_cid);
current_evidence_page = 0;
current_evidence = 0;
set_evidence_page();
- QString side = ao_app->get_char_side(f_char);
+ QString side = ao_app->get_char_side(current_char);
if (side == "jud")
{
@@ -931,6 +980,9 @@ void Courtroom::enter_courtroom(int p_cid)
music_player->set_volume(ui_music_slider->value());
sfx_player->set_volume(ui_sfx_slider->value());
objection_player->set_volume(ui_sfx_slider->value());
+ misc_sfx_player->set_volume(ui_sfx_slider->value());
+ frame_emote_sfx_player->set_volume(ui_sfx_slider->value());
+ pair_frame_emote_sfx_player->set_volume(ui_sfx_slider->value());
blip_player->set_volume(ui_blip_slider->value());
testimony_in_progress = false;
@@ -960,12 +1012,10 @@ void Courtroom::list_music()
for (int n_song = 0 ; n_song < music_list.size() ; ++n_song)
{
QString i_song = music_list.at(n_song);
- QString i_song_listname = i_song;
- i_song_listname = i_song_listname.left(i_song_listname.lastIndexOf("."));
if (i_song.toLower().contains(ui_music_search->text().toLower()))
{
- ui_music_list->addItem(i_song_listname);
+ ui_music_list->addItem(i_song);
music_row_to_number.append(n_song);
QString song_path = ao_app->get_music_path(i_song);
@@ -1072,10 +1122,75 @@ void Courtroom::append_server_chatmessage(QString p_name, QString p_message, QSt
colour = ao_app->get_color("ooc_default_color", "courtroom_design.ini").name();
if (p_colour == "1")
colour = ao_app->get_color("ooc_server_color", "courtroom_design.ini").name();
+ if(p_message == "Logged in as a moderator.")
+ {
+ ui_guard->show();
+ append_server_chatmessage("CLIENT", tr("You were granted the Disable Modcalls button."), "1");
+ }
ui_server_chatlog->append_chatmessage(p_name, p_message, colour);
}
+class AOFrameThreadingPre : public QRunnable
+{
+public:
+ Courtroom *thisCourtroom;
+ int my_frameNumber;
+ AOFrameThreadingPre(Courtroom *my_courtroom, int frameNumber){
+ thisCourtroom = my_courtroom;
+ my_frameNumber = frameNumber;
+ }
+ void run()
+ {
+ qDebug() << my_frameNumber << " FRAME NUMBER" << " from" << QThread::currentThread();
+ QString sfx_to_play = thisCourtroom->ao_app->get_frame_sfx_name(thisCourtroom->current_char, thisCourtroom->ao_app->get_pre_emote(thisCourtroom->current_char, thisCourtroom->current_emote), my_frameNumber);
+ QString screenshake_to_play = thisCourtroom->ao_app->get_screenshake_frame(thisCourtroom->current_char, thisCourtroom->ao_app->get_pre_emote(thisCourtroom->current_char, thisCourtroom->current_emote), my_frameNumber);
+ QString realization_to_play = thisCourtroom->ao_app->get_realization_frame(thisCourtroom->current_char, thisCourtroom->ao_app->get_pre_emote(thisCourtroom->current_char, thisCourtroom->current_emote), my_frameNumber);
+ if(sfx_to_play != "")
+ {
+ thisCourtroom->threading_sfx += "|" + QString::number(my_frameNumber) + "=" + sfx_to_play;
+ }
+ if(screenshake_to_play != "")
+ {
+ thisCourtroom->threading_shake += "|" + QString::number(my_frameNumber) + "=" + screenshake_to_play;
+ }
+ if(realization_to_play != "")
+ {
+ thisCourtroom->threading_flash += "|" + QString::number(my_frameNumber) + "=" + realization_to_play;
+ }
+ }
+};
+
+
+class AOFrameThreading : public QRunnable
+{
+public:
+ Courtroom *thisCourtroom;
+ int my_frameNumber;
+ AOFrameThreading(Courtroom *my_courtroom, int frameNumber){
+ thisCourtroom = my_courtroom;
+ my_frameNumber = frameNumber;
+ }
+ void run()
+ {
+ QString sfx_to_play = thisCourtroom->ao_app->get_frame_sfx_name(thisCourtroom->current_char, thisCourtroom->threading_prefix + thisCourtroom->ao_app->get_emote(thisCourtroom->current_char, thisCourtroom->current_emote), my_frameNumber);
+ QString screenshake_to_play = thisCourtroom->ao_app->get_screenshake_frame(thisCourtroom->current_char, thisCourtroom->threading_prefix + thisCourtroom->ao_app->get_emote(thisCourtroom->current_char, thisCourtroom->current_emote), my_frameNumber);
+ QString realization_to_play = thisCourtroom->ao_app->get_realization_frame(thisCourtroom->current_char, thisCourtroom->threading_prefix + thisCourtroom->ao_app->get_emote(thisCourtroom->current_char, thisCourtroom->current_emote), my_frameNumber);
+ if(sfx_to_play != "")
+ {
+ thisCourtroom->threading_sfx += "|" + QString::number(my_frameNumber) + "=" + sfx_to_play;
+ }
+ if(screenshake_to_play != "")
+ {
+ thisCourtroom->threading_shake += "|" + QString::number(my_frameNumber) + "=" + screenshake_to_play;
+ }
+ if(realization_to_play != "")
+ {
+ thisCourtroom->threading_flash += "|" + QString::number(my_frameNumber) + "=" + realization_to_play;
+ }
+ }
+};
+
void Courtroom::on_chat_return_pressed()
{
if (ui_ic_chat_message->text() == "" || is_muted)
@@ -1249,10 +1364,133 @@ void Courtroom::on_chat_return_pressed()
packet_contents.append("0");
}
}
+ // If the server we're on supports Looping SFX and Screenshake, use it if the emote uses it.
+ if (ao_app->looping_sfx_support_enabled)
+ {
+ packet_contents.append(ao_app->get_sfx_looping(current_char, current_emote));
+ qDebug() << "Are we looping this? " << ao_app->get_sfx_looping(current_char, current_emote);
+ packet_contents.append(QString::number(screenshake_state));
+ qDebug() << "Are we screen shaking this one? " << screenshake_state;
+ qDebug() << "MAX THREAD COUNT " << QThreadPool::globalInstance()->maxThreadCount();
+ QString frame_screenshake = "";
+ QString frame_realization = "";
+ QString frame_sfx = "";
+
+ QString preemote_sfx = "";
+ QString preemote_shake = "";
+ QString preemote_flash = "";
+
+ QString talkemote_sfx = "";
+ QString talkemote_shake = "";
+ QString talkemote_flash = "";
+
+ QString idleemote_sfx = "";
+ QString idleemote_shake = "";
+ QString idleemote_flash = "";
+
+ QString preemote = ao_app->get_image_suffix(ao_app->get_character_path(current_char, ao_app->get_pre_emote(current_char, current_emote)));
+ QString talkemote_to_check = ao_app->get_image_suffix(ao_app->get_character_path(current_char, "(b)" + ao_app->get_emote(current_char, current_emote)));
+ QString idleemote_to_check = ao_app->get_image_suffix(ao_app->get_character_path(current_char, "(a)" + ao_app->get_emote(current_char, current_emote)));
+
+ frame_emote_checker = new QMovie(this);
+ frame_emote_checker->setFileName(preemote);
+ frame_emote_checker->jumpToFrame(0);
+ qDebug() << "Premote: " << frame_emote_checker->frameCount();
+
+ preemote_sfx += ao_app->get_pre_emote(current_char, current_emote);
+ preemote_shake += ao_app->get_pre_emote(current_char, current_emote);
+ preemote_flash += ao_app->get_pre_emote(current_char, current_emote);
+
+ threading_sfx = preemote_sfx;
+ threading_shake = preemote_shake;
+ threading_flash = preemote_flash;
+
+ for(int i=0; i < frame_emote_checker->frameCount(); i++){
+ AOFrameThreadingPre *testfuck = new AOFrameThreadingPre(this, i);
+ QThreadPool::globalInstance()->start(testfuck);
+ }
+ QThreadPool::globalInstance()->waitForDone();
+ preemote_sfx = threading_sfx;
+ preemote_shake = threading_shake;
+ preemote_flash = threading_flash;
+ preemote_sfx += "^";
+ preemote_shake += "^";
+ preemote_flash += "^";
+ delete frame_emote_checker;
+
+
+
+ talkemote_sfx += "(b)" + ao_app->get_emote(current_char, current_emote);
+ talkemote_shake += "(b)" + ao_app->get_emote(current_char, current_emote);
+ talkemote_flash += "(b)" + ao_app->get_emote(current_char, current_emote);
+
+ frame_emote_checker = new QMovie(this);
+ frame_emote_checker->setFileName(talkemote_to_check);
+ frame_emote_checker->jumpToFrame(0);
+ qDebug() << "Talk: " << frame_emote_checker->frameCount();
+
+ threading_sfx = talkemote_sfx;
+ threading_shake = talkemote_shake;
+ threading_flash = talkemote_flash;
+ threading_prefix = QString("(b)");
+
+ for(int i=0; i < frame_emote_checker->frameCount(); i++){
+ AOFrameThreading *testfuck = new AOFrameThreading(this, i);
+ QThreadPool::globalInstance()->start(testfuck);
+ }
+ QThreadPool::globalInstance()->waitForDone();
+
+ talkemote_sfx = threading_sfx;
+ talkemote_shake = threading_shake;
+ talkemote_flash = threading_flash;
+ talkemote_sfx += "^";
+ talkemote_shake += "^";
+ talkemote_flash += "^";
+ delete frame_emote_checker;
+
+
+
+ idleemote_sfx += "(a)" + ao_app->get_emote(current_char, current_emote);
+ idleemote_shake += "(a)" + ao_app->get_emote(current_char, current_emote);
+ idleemote_flash += "(a)" + ao_app->get_emote(current_char, current_emote);
+
+ frame_emote_checker = new QMovie(this);
+ frame_emote_checker->setFileName(idleemote_to_check);
+ frame_emote_checker->jumpToFrame(0);
+ qDebug() << "idle: " << frame_emote_checker->frameCount();
+
+ threading_sfx = idleemote_sfx;
+ threading_shake = idleemote_shake;
+ threading_flash = idleemote_flash;
+ threading_prefix = QString("(a)");
+ for(int i=0; i < frame_emote_checker->frameCount(); i++){
+ AOFrameThreading *testfuck = new AOFrameThreading(this, i);
+ QThreadPool::globalInstance()->start(testfuck);
+ }
+ QThreadPool::globalInstance()->waitForDone();
+ idleemote_sfx = threading_sfx;
+ idleemote_shake = threading_shake;
+ idleemote_flash = threading_flash;
+ delete frame_emote_checker;
+
+ frame_screenshake += preemote_shake;
+ frame_screenshake += talkemote_shake;
+ frame_screenshake += idleemote_shake;
+
+ frame_realization += preemote_flash;
+ frame_realization += talkemote_flash;
+ frame_realization += idleemote_flash;
+
+ frame_sfx += preemote_sfx;
+ frame_sfx += talkemote_sfx;
+ frame_sfx += idleemote_sfx;
+ packet_contents.append(frame_screenshake);
+ packet_contents.append(frame_realization);
+ packet_contents.append(frame_sfx);
+ }
ao_app->send_server_packet(new AOPacket("MS", packet_contents));
}
-
void Courtroom::handle_chatmessage(QStringList *p_contents)
{
// Instead of checking for whether a message has at least chatmessage_size
@@ -1307,7 +1545,6 @@ void Courtroom::handle_chatmessage(QStringList *p_contents)
text_state = 0;
anim_state = 0;
ui_vp_objection->stop();
- ui_vp_player_char->stop();
chat_tick_timer->stop();
ui_vp_evidence_display->reset();
@@ -1318,6 +1555,7 @@ void Courtroom::handle_chatmessage(QStringList *p_contents)
ui_ic_chat_message->clear();
objection_state = 0;
realization_state = 0;
+ screenshake_state = 0;
is_presenting_evidence = false;
ui_pre->setChecked(false);
ui_hold_it->set_image("holdit.png");
@@ -1325,6 +1563,7 @@ void Courtroom::handle_chatmessage(QStringList *p_contents)
ui_take_that->set_image("takethat.png");
ui_custom_objection->set_image("custom.png");
ui_realization->set_image("realization.png");
+ ui_screenshake->set_image("screenshake.png");
ui_evidence_present->set_image("present_disabled.png");
}
@@ -1356,6 +1595,8 @@ void Courtroom::handle_chatmessage(QStringList *p_contents)
case 2:
ui_vp_objection->play("objection", f_char, f_custom_theme);
objection_player->play("objection.wav", f_char, f_custom_theme);
+ if(ao_app->get_objectmusic())
+ music_player->kill_loop();
break;
case 3:
ui_vp_objection->play("takethat", f_char, f_custom_theme);
@@ -1388,7 +1629,10 @@ void Courtroom::handle_chatmessage_2()
{
ui_vp_speedlines->stop();
ui_vp_player_char->stop();
-
+ ui_vp_player_char->frame_sfx_hellstring = m_chatmessage[FRAME_SFX];
+ ui_vp_player_char->frame_realization_hellstring = m_chatmessage[FRAME_REALIZATION];
+ ui_vp_player_char->frame_screenshake_hellstring = m_chatmessage[FRAME_SCREENSHAKE];
+ ui_vp_player_char->use_networked_framehell = true;
if (m_chatmessage[SHOWNAME].isEmpty() || !ui_showname_enable->isChecked())
{
QString real_name = char_list.at(m_chatmessage[CHAR_ID].toInt()).name;
@@ -1570,6 +1814,7 @@ void Courtroom::handle_chatmessage_2()
ui_vp_sideplayer_char->set_flipped(true);
else
ui_vp_sideplayer_char->set_flipped(false);
+ ui_vp_sideplayer_char->use_networked_framehell = false;
ui_vp_sideplayer_char->play_idle(m_chatmessage[OTHER_NAME], m_chatmessage[OTHER_EMOTE]);
}
else
@@ -1577,13 +1822,17 @@ void Courtroom::handle_chatmessage_2()
// If the server understands other characters, but there
// really is no second character, hide 'em, and center the first.
ui_vp_sideplayer_char->hide();
+ ui_vp_sideplayer_char->stop();
ui_vp_sideplayer_char->move(0,0);
ui_vp_player_char->move(0,0);
}
}
}
-
+ if (m_chatmessage[SCREENSHAKE] == "1")
+ {
+ this->doScreenShake();
+ }
switch (emote_mod)
{
case 1: case 2: case 6:
@@ -1600,6 +1849,55 @@ void Courtroom::handle_chatmessage_2()
}
}
+void Courtroom::doScreenShake()
+{
+ if(!ao_app->is_shakeandflash_enabled())
+ return;
+ screenshake_group = new QParallelAnimationGroup;
+ screenshake_animation = new QPropertyAnimation(ui_viewport, "pos", this);
+ chatbox_screenshake_animation = new QPropertyAnimation(ui_vp_chatbox, "pos", this);
+ int screen_x = get_theme_pos("viewport").x();
+ int screen_y = get_theme_pos("viewport").y();
+ QPoint pos_default = QPoint(screen_x, screen_y);
+ QPoint pos1 = QPoint(screen_x + 3, screen_y + -5);
+ QPoint pos2 = QPoint(screen_x + 3, screen_y + -5);
+ QPoint pos3 = QPoint(screen_x + -3, screen_y + 5);
+ QPoint pos4 = QPoint(screen_x + 3, screen_y + -5);
+ QPoint pos5 = QPoint(screen_x + -3,screen_y + -5);
+
+ int chatbox_x = get_theme_pos("ao2_chatbox").x();
+ int chatbox_y = get_theme_pos("ao2_chatbox").y();
+ QPoint chatbox_pos_default = QPoint(chatbox_x, chatbox_y);
+ QPoint chatbox_pos1 = QPoint(chatbox_x + 3, chatbox_y + -5);
+ QPoint chatbox_pos2 = QPoint(chatbox_x + 3, chatbox_y + -5);
+ QPoint chatbox_pos3 = QPoint(chatbox_x + -3, chatbox_y + 5);
+ QPoint chatbox_pos4 = QPoint(chatbox_x + 3, chatbox_y + -5);
+ QPoint chatbox_pos5 = QPoint(chatbox_x + -3,chatbox_y + -5);
+
+ screenshake_animation->setDuration(200);
+ screenshake_animation->setKeyValueAt(0, pos_default);
+ screenshake_animation->setKeyValueAt(0.1, pos1);
+ screenshake_animation->setKeyValueAt(0.3, pos2);
+ screenshake_animation->setKeyValueAt(0.5, pos3);
+ screenshake_animation->setKeyValueAt(0.7, pos4);
+ screenshake_animation->setKeyValueAt(0.9, pos5);
+ screenshake_animation->setEndValue(pos_default);
+ screenshake_animation->setEasingCurve(QEasingCurve::Linear);
+ chatbox_screenshake_animation->setDuration(200);
+ chatbox_screenshake_animation->setKeyValueAt(0, chatbox_pos_default);
+ chatbox_screenshake_animation->setKeyValueAt(0.1, chatbox_pos3);
+ chatbox_screenshake_animation->setKeyValueAt(0.3, chatbox_pos5);
+ chatbox_screenshake_animation->setKeyValueAt(0.5, chatbox_pos2);
+ chatbox_screenshake_animation->setKeyValueAt(0.7, chatbox_pos1);
+ chatbox_screenshake_animation->setKeyValueAt(0.9, chatbox_pos4);
+ chatbox_screenshake_animation->setEndValue(chatbox_pos_default);
+ chatbox_screenshake_animation->setEasingCurve(QEasingCurve::Linear);
+
+ screenshake_group->addAnimation(screenshake_animation);
+ screenshake_group->addAnimation(chatbox_screenshake_animation);
+ screenshake_group->start(QAbstractAnimation::DeletionPolicy::DeleteWhenStopped);
+}
+
void Courtroom::handle_chatmessage_3()
{
start_chat_ticking();
@@ -1731,6 +2029,17 @@ QString Courtroom::filter_ic_text(QString p_text)
p_text.remove(trick_check_pos,1);
}
+ else if (f_character == "$" and !ic_next_is_not_special)
+ {
+ p_text.remove(trick_check_pos,1);
+ }
+
+ else if (f_character == "@" and !ic_next_is_not_special)
+ {
+ p_text.remove(trick_check_pos,1);
+ }
+
+
// Orange inline colourisation.
else if (f_character == "|" and !ic_next_is_not_special)
{
@@ -1941,14 +2250,14 @@ void Courtroom::play_preanim(bool noninterrupting)
int ao2_duration = ao_app->get_ao2_preanim_duration(f_char, f_preanim);
int text_delay = ao_app->get_text_delay(f_char, f_preanim) * time_mod;
int sfx_delay = m_chatmessage[SFX_DELAY].toInt() * 60;
-
+ bool looping_sfx = m_chatmessage[LOOPING_SFX] == "1";
int preanim_duration;
if (ao2_duration < 0)
preanim_duration = ao_app->get_preanim_duration(f_char, f_preanim);
else
preanim_duration = ao2_duration;
-
+ sfx_player->setLooping(looping_sfx);
sfx_delay_timer->start(sfx_delay);
QString anim_to_find = ao_app->get_image_suffix(ao_app->get_character_path(f_char, f_preanim));
if (!file_exists(anim_to_find) ||
@@ -1964,7 +2273,6 @@ void Courtroom::play_preanim(bool noninterrupting)
}
ui_vp_player_char->play_pre(f_char, f_preanim, preanim_duration);
-
if (noninterrupting)
anim_state = 4;
else
@@ -1988,6 +2296,15 @@ void Courtroom::realization_done()
ui_vp_realization->hide();
}
+void Courtroom::doRealization()
+{
+ if(!ao_app->is_shakeandflash_enabled())
+ return;
+ realization_timer->start(60);
+ ui_vp_realization->show();
+
+}
+
void Courtroom::start_chat_ticking()
{
//we need to ensure that the text isn't already ticking because this function can be called by two logic paths
@@ -1996,11 +2313,9 @@ void Courtroom::start_chat_ticking()
if (m_chatmessage[REALIZATION] == "1")
{
- realization_timer->start(60);
- ui_vp_realization->show();
- sfx_player->play(ao_app->get_custom_realization(m_chatmessage[CHAR_NAME]));
+ this->doRealization();
+ misc_sfx_player->play(ao_app->get_custom_realization(m_chatmessage[CHAR_NAME]));
}
-
ui_vp_message->clear();
set_text_color();
rainbow_counter = 0;
@@ -2046,7 +2361,6 @@ void Courtroom::chat_tick()
//do not perform heavy operations here
QString f_message = m_chatmessage[MESSAGE];
- f_message.remove(0, tick_pos);
// Due to our new text speed system, we always need to stop the timer now.
chat_tick_timer->stop();
@@ -2061,7 +2375,7 @@ void Courtroom::chat_tick()
f_message.remove(0,2);
}
- if (f_message.size() == 0)
+ if (tick_pos >= f_message.size())
{
text_state = 2;
if (anim_state != 4)
@@ -2073,21 +2387,9 @@ void Courtroom::chat_tick()
else
{
- QTextBoundaryFinder tbf(QTextBoundaryFinder::Grapheme, f_message);
- QString f_character;
- int f_char_length;
-
- tbf.toNextBoundary();
-
- if (tbf.position() == -1)
- f_character = f_message;
- else
- f_character = f_message.left(tbf.position());
-
- f_char_length = f_character.length();
+ QString f_character = f_message.at(tick_pos);
f_character = f_character.toHtmlEscaped();
-
if (f_character == " ")
ui_vp_message->insertPlainText(" ");
@@ -2111,6 +2413,18 @@ void Courtroom::chat_tick()
formatting_char = true;
}
+ else if (f_character == "@" and !next_character_is_not_special)
+ {
+ this->doScreenShake();
+ formatting_char = true;
+ }
+
+ else if (f_character == "$" and !next_character_is_not_special)
+ {
+ this->doRealization();
+ formatting_char = true;
+ }
+
// Orange inline colourisation.
else if (f_character == "|" and !next_character_is_not_special)
{
@@ -2180,7 +2494,7 @@ void Courtroom::chat_tick()
else
{
next_character_is_not_special = true;
- tick_pos -= f_char_length;
+ tick_pos--;
}
}
@@ -2201,7 +2515,7 @@ void Courtroom::chat_tick()
else
{
next_character_is_not_special = true;
- tick_pos -= f_char_length;
+ tick_pos--;
}
}
@@ -2245,7 +2559,11 @@ void Courtroom::chat_tick()
case INLINE_GREY:
ui_vp_message->insertHtml("<font color=\""+ get_text_color("_inline_grey").name() +"\">" + f_character + "</font>");
break;
+ default:
+ ui_vp_message->insertHtml(f_character);
+ break;
}
+
}
else
{
@@ -2296,7 +2614,7 @@ void Courtroom::chat_tick()
if(blank_blip)
qDebug() << "blank_blip found true";
- if (f_character != ' ' || blank_blip)
+ if (f_message.at(tick_pos) != ' ' || blank_blip)
{
if (blip_pos % blip_rate == 0 && !formatting_char)
@@ -2308,7 +2626,7 @@ void Courtroom::chat_tick()
++blip_pos;
}
- tick_pos += f_char_length;
+ ++tick_pos;
// Restart the timer, but according to the newly set speeds, if there were any.
// Keep the speed at bay.
@@ -2335,7 +2653,6 @@ void Courtroom::chat_tick()
}
}
-
void Courtroom::show_testimony()
{
if (!testimony_in_progress || m_chatmessage[SIDE] != "wit")
@@ -2518,7 +2835,7 @@ void Courtroom::set_ban(int p_cid)
if (p_cid != m_cid && p_cid != -1)
return;
- call_notice("You have been banned.");
+ call_notice(tr("You have been banned."));
ao_app->construct_lobby();
ao_app->destruct_courtroom();
@@ -2533,9 +2850,10 @@ void Courtroom::handle_song(QStringList *p_contents)
QString f_song = f_contents.at(0);
QString f_song_clear = f_song;
- f_song_clear = f_song_clear.left(f_song_clear.lastIndexOf("."));
int n_char = f_contents.at(1).toInt();
+ qDebug() << "playing song "+ao_app->get_music_path(f_song);
+
if (n_char < 0 || n_char >= char_list.size())
{
music_player->play(f_song);
@@ -2547,9 +2865,22 @@ void Courtroom::handle_song(QStringList *p_contents)
if (p_contents->length() > 2)
{
- str_show = p_contents->at(2);
+ if(p_contents->at(2) != "")
+ {
+ str_show = p_contents->at(2);
+ }
+ }
+ if (p_contents->length() > 3)
+ {
+ if(p_contents->at(3) != "-1")
+ {
+ music_player->enable_looping = false;
+ }
+ else
+ {
+ music_player->enable_looping = true;
+ }
}
-
if (!mute_map.value(n_char))
{
chatlogpiece* temp = new chatlogpiece(str_char, str_show, f_song, true);
@@ -2560,12 +2891,18 @@ void Courtroom::handle_song(QStringList *p_contents)
ic_chatlog_history.removeFirst();
}
- append_ic_text(f_song_clear, str_show, true);
+ append_ic_text(f_song, str_show, true);
music_player->play(f_song);
}
}
}
+void Courtroom::handle_failed_login()
+{
+ music_player->enable_looping = false;
+ music_player->play("failed_login");
+}
+
void Courtroom::handle_wtce(QString p_wtce, int variant)
{
QString sfx_file = "courtroom_sounds.ini";
@@ -2573,7 +2910,7 @@ void Courtroom::handle_wtce(QString p_wtce, int variant)
//witness testimony
if (p_wtce == "testimony1")
{
- sfx_player->play(ao_app->get_sfx("witness_testimony"));
+ misc_sfx_player->play(ao_app->get_sfx("witness_testimony"));
ui_vp_wtce->play("witnesstestimony");
testimony_in_progress = true;
show_testimony();
@@ -2581,7 +2918,7 @@ void Courtroom::handle_wtce(QString p_wtce, int variant)
//cross examination
else if (p_wtce == "testimony2")
{
- sfx_player->play(ao_app->get_sfx("cross_examination"));
+ misc_sfx_player->play(ao_app->get_sfx("cross_examination"));
ui_vp_wtce->play("crossexamination");
testimony_in_progress = false;
}
@@ -2589,12 +2926,12 @@ void Courtroom::handle_wtce(QString p_wtce, int variant)
{
if (variant == 0)
{
- sfx_player->play(ao_app->get_sfx("not_guilty"));
+ misc_sfx_player->play(ao_app->get_sfx("not_guilty"));
ui_vp_wtce->play("notguilty");
testimony_in_progress = false;
}
else if (variant == 1) {
- sfx_player->play(ao_app->get_sfx("guilty"));
+ misc_sfx_player->play(ao_app->get_sfx("guilty"));
ui_vp_wtce->play("guilty");
testimony_in_progress = false;
}
@@ -2647,14 +2984,14 @@ void Courtroom::toggle_judge_buttons(bool is_on)
void Courtroom::mod_called(QString p_ip)
{
ui_server_chatlog->append(p_ip);
- if (ui_guard->isChecked())
+ if (!ui_guard->isChecked())
{
modcall_player->play(ao_app->get_sfx("mod_call"));
ao_app->alert(this);
}
}
-void Courtroom::case_called(QString msg, bool def, bool pro, bool jud, bool jur, bool steno)
+void Courtroom::case_called(QString msg, bool def, bool pro, bool jud, bool jur, bool steno, bool witness)
{
if (ui_casing->isChecked())
{
@@ -2663,7 +3000,8 @@ void Courtroom::case_called(QString msg, bool def, bool pro, bool jud, bool jur,
(ao_app->get_casing_prosecution_enabled() && pro) ||
(ao_app->get_casing_judge_enabled() && jud) ||
(ao_app->get_casing_juror_enabled() && jur) ||
- (ao_app->get_casing_steno_enabled() && steno))
+ (ao_app->get_casing_steno_enabled() && steno) ||
+ (ao_app->get_casing_wit_enabled() && witness))
{
modcall_player->play(ao_app->get_sfx("case_call"));
ao_app->alert(this);
@@ -2692,7 +3030,7 @@ void Courtroom::on_ooc_return_pressed()
else if (ooc_message.startsWith("/login"))
{
ui_guard->show();
- append_server_chatmessage("CLIENT", tr("You were granted the Guard button."), "1");
+ append_server_chatmessage("CLIENT", tr("You were granted the Disable Modcalls button."), "1");
}
else if (ooc_message.startsWith("/rainbow") && ao_app->yellow_text_enabled && !rainbow_appended)
{
@@ -3232,6 +3570,22 @@ void Courtroom::on_realization_clicked()
ui_ic_chat_message->setFocus();
}
+void Courtroom::on_screenshake_clicked()
+{
+ if (screenshake_state == 0)
+ {
+ screenshake_state = 1;
+ ui_screenshake->set_image("screenshake_pressed.png");
+ }
+ else
+ {
+ screenshake_state = 0;
+ ui_screenshake->set_image("screenshake.png");
+ }
+
+ ui_ic_chat_message->setFocus();
+}
+
void Courtroom::on_mute_clicked()
{
if (ui_mute_list->isHidden())
@@ -3315,6 +3669,9 @@ void Courtroom::on_sfx_slider_moved(int p_value)
{
sfx_player->set_volume(p_value);
objection_player->set_volume(p_value);
+ misc_sfx_player->set_volume(p_value);
+ frame_emote_sfx_player->set_volume(p_value);
+ pair_frame_emote_sfx_player->set_volume(p_value);
ui_ic_chat_message->setFocus();
}
@@ -3419,7 +3776,7 @@ void Courtroom::on_char_select_right_clicked()
void Courtroom::on_spectator_clicked()
{
- enter_courtroom(-1);
+ this->set_character(-1);
ui_emotes->hide();
@@ -3557,15 +3914,16 @@ void Courtroom::on_casing_clicked()
f_packet.append(QString::number(ao_app->get_casing_judge_enabled()));
f_packet.append(QString::number(ao_app->get_casing_juror_enabled()));
f_packet.append(QString::number(ao_app->get_casing_steno_enabled()));
+ f_packet.append(QString::number(ao_app->get_casing_wit_enabled()));
ao_app->send_server_packet(new AOPacket("SETCASE", f_packet));
}
else
- ao_app->send_server_packet(new AOPacket("SETCASE#\"\"#0#0#0#0#0#0#%"));
+ ao_app->send_server_packet(new AOPacket("SETCASE#\"\"#0#0#0#0#0#0#0#%"));
}
}
-void Courtroom::announce_case(QString title, bool def, bool pro, bool jud, bool jur, bool steno)
+void Courtroom::announce_case(QString title, bool def, bool pro, bool jud, bool jur, bool steno, bool wit)
{
if (ao_app->casing_alerts_enabled)
{
@@ -3577,6 +3935,7 @@ void Courtroom::announce_case(QString title, bool def, bool pro, bool jud, bool
f_packet.append(QString::number(jud));
f_packet.append(QString::number(jur));
f_packet.append(QString::number(steno));
+ f_packet.append(QString::number(wit));
ao_app->send_server_packet(new AOPacket("CASEA", f_packet));
}
@@ -3590,30 +3949,25 @@ Courtroom::~Courtroom()
delete blip_player;
}
-
+#ifdef BASSAUDIO
#if (defined (_WIN32) || defined (_WIN64))
void Courtroom::load_bass_opus_plugin()
{
- #ifdef BASSAUDIO
BASS_PluginLoad("bassopus.dll", 0);
- #endif
}
#elif (defined (LINUX) || defined (__linux__))
void Courtroom::load_bass_opus_plugin()
{
- #ifdef BASSAUDIO
BASS_PluginLoad("libbassopus.so", 0);
- #endif
}
#elif defined __APPLE__
void Courtroom::load_bass_opus_plugin()
{
QString libpath = ao_app->get_base_path() + "../../Frameworks/libbassopus.dylib";
QByteArray ba = libpath.toLocal8Bit();
- #ifdef BASSAUDIO
BASS_PluginLoad(ba.data(), 0);
- #endif
}
#else
#error This operating system is unsupported for bass plugins.
#endif
+#endif
diff --git a/src/lobby.cpp b/src/lobby.cpp
index 6f257cec..d8172667 100644
--- a/src/lobby.cpp
+++ b/src/lobby.cpp
@@ -69,7 +69,7 @@ void Lobby::set_widgets()
if (f_lobby.width < 0 || f_lobby.height < 0)
{
- qDebug() << "W: did not find lobby width or height in " << filename;
+ qDebug() << "W: did not find lobby width or height in " << ao_app->get_theme_path(filename);
// Most common symptom of bad config files and missing assets.
call_notice(tr("It doesn't look like your client is set up correctly.\n"
@@ -173,6 +173,10 @@ void Lobby::set_size_and_pos(QWidget *p_widget, QString p_identifier)
}
}
+void Lobby::lobbyThreadHandler(QString loadingText){
+ this->set_loading_text(loadingText);
+}
+
void Lobby::set_loading_text(QString p_text)
{
ui_loading_text->clear();
diff --git a/src/main.cpp b/src/main.cpp
index 6c7b1513..778323fc 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -37,7 +37,7 @@ int main(int argc, char *argv[])
main_app.installTranslator(&appTranslator);
main_app.construct_lobby();
- main_app.net_manager->connect_to_master();
main_app.w_lobby->show();
+ main_app.net_manager->connect_to_master();
return main_app.exec();
}
diff --git a/src/packet_distribution.cpp b/src/packet_distribution.cpp
index cfd6d8c6..5538c15e 100644
--- a/src/packet_distribution.cpp
+++ b/src/packet_distribution.cpp
@@ -7,6 +7,35 @@
#include "hardware_functions.h"
#include "debug_functions.h"
+class AOPacketLoadMusicThreading : public QRunnable
+{
+public:
+ AOApplication *myapp;
+ QString filename;
+ bool ismusic;
+ AOPacketLoadMusicThreading(AOApplication *my_app, QString file_name, bool is_music){
+ myapp = my_app;
+ filename = file_name;
+ ismusic = is_music;
+ }
+ void run()
+ {
+ if(ismusic)
+ {
+ myapp->w_courtroom->append_music(filename);
+ }
+ else
+ {
+ myapp->w_courtroom->append_area(filename);
+ myapp->area_count++;
+ }
+ for (int area_n = 0; area_n < myapp->area_count; area_n++)
+ {
+ myapp->w_courtroom->arup_append(0, "Unknown", "Unknown", "Unknown");
+ }
+ }
+};
+
void AOApplication::ms_packet_received(AOPacket *p_packet)
{
p_packet->net_decode();
@@ -156,6 +185,7 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
arup_enabled = false;
casing_alerts_enabled = false;
modcall_reason_enabled = false;
+ looping_sfx_support_enabled = false;
//workaround for tsuserver4
if (f_contents.at(0) == "NOENCRYPT")
@@ -216,6 +246,10 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
casing_alerts_enabled = true;
if (f_packet.contains("modcall_reason",Qt::CaseInsensitive))
modcall_reason_enabled = true;
+ if (f_packet.contains("looping_sfx",Qt::CaseInsensitive))
+ looping_sfx_support_enabled = true;
+
+ w_lobby->enable_connect_button();
}
else if (header == "PN")
{
@@ -316,7 +350,7 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
++loaded_chars;
- w_lobby->set_loading_text("Loading chars:\n" + QString::number(loaded_chars) + "/" + QString::number(char_list_size));
+ w_lobby->set_loading_text(tr("Loading chars:\n%1/%2").arg(QString::number(loaded_chars)).arg(QString::number(char_list_size)));
w_courtroom->append_char(f_char);
@@ -408,7 +442,7 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
{
musics_time = true;
areas--;
- w_courtroom->fix_last_area();
+ //w_courtroom->fix_last_area();
w_courtroom->append_music(f_music);
}
else
@@ -477,53 +511,39 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
}
else if (header == "SM")
{
- if (!courtroom_constructed)
- goto end;
+ if (!courtroom_constructed)
+ goto end;
- bool musics_time = false;
- int areas = 0;
+ bool musics_time = false;
+ area_count = 0;
- for (int n_element = 0 ; n_element < f_contents.size() ; ++n_element)
- {
- ++loaded_music;
-
- w_lobby->set_loading_text(tr("Loading music:\n%1/%2").arg(QString::number(loaded_music)).arg(QString::number(music_list_size)));
-
- if (musics_time)
- {
- w_courtroom->append_music(f_contents.at(n_element));
- }
- else
- {
- if (f_contents.at(n_element).endsWith(".wav") ||
- f_contents.at(n_element).endsWith(".mp3") ||
- f_contents.at(n_element).endsWith(".mp4") ||
- f_contents.at(n_element).endsWith(".ogg") ||
- f_contents.at(n_element).endsWith(".opus"))
+ for (int n_element = 0 ; n_element < f_contents.size() ; ++n_element)
{
- musics_time = true;
- w_courtroom->fix_last_area();
- w_courtroom->append_music(f_contents.at(n_element));
- areas--;
- }
- else
- {
- w_courtroom->append_area(f_contents.at(n_element));
- areas++;
+ if (!musics_time && (f_contents.at(n_element).startsWith("==") ||
+ f_contents.at(n_element).endsWith(".wav") ||
+ f_contents.at(n_element).endsWith(".mp3") ||
+ f_contents.at(n_element).endsWith(".mp4") ||
+ f_contents.at(n_element).endsWith(".ogg") ||
+ f_contents.at(n_element).endsWith(".opus")))
+ {
+ musics_time = true;
+ continue;
+ }
+ AOPacketLoadMusicThreading *music_load = new AOPacketLoadMusicThreading(this, f_contents.at(n_element), musics_time);
+ QThreadPool::globalInstance()->start(music_load);
+ ++loaded_music;
+ int total_loading_size = char_list_size * 2 + evidence_list_size + music_list_size;
+ int loading_value = int(((loaded_chars + generated_chars + loaded_music + loaded_evidence) / static_cast<double>(total_loading_size)) * 100);
+ w_lobby->set_loading_value(loading_value);
+ w_lobby->set_loading_text(tr("Loading music:\n%1/%2").arg(QString::number(loaded_music)).arg(QString::number(music_list_size)));
+ if(QThreadPool::globalInstance()->activeThreadCount() == QThreadPool::globalInstance()->maxThreadCount())
+ {
+ QThreadPool::globalInstance()->waitForDone(); //out of order music is bad
+ }
}
- }
+ QThreadPool::globalInstance()->waitForDone();
- for (int area_n = 0; area_n < areas; area_n++)
- {
- w_courtroom->arup_append(0, "Unknown", "Unknown", "Unknown");
- }
-
- int total_loading_size = char_list_size * 2 + evidence_list_size + music_list_size;
- int loading_value = int(((loaded_chars + generated_chars + loaded_music + loaded_evidence) / static_cast<double>(total_loading_size)) * 100);
- w_lobby->set_loading_value(loading_value);
- }
-
- send_server_packet(new AOPacket("RD#%"));
+ send_server_packet(new AOPacket("RD#%"));
}
else if (header == "FM")
{
@@ -582,6 +602,16 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
destruct_lobby();
}
+ else if (header == "REFMUSIC")
+ {
+ if (courtroom_constructed)
+ w_courtroom->reset_music_list();
+ for (int n_element = 0 ; n_element < f_contents.size() ; ++n_element)
+ {
+ w_courtroom->append_music(f_contents.at(n_element));
+ }
+ w_courtroom->list_music();
+ }
else if (header == "BN")
{
if (f_contents.size() < 1)
@@ -595,9 +625,24 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
{
if (f_contents.size() < 3)
goto end;
-
- if (courtroom_constructed)
- w_courtroom->enter_courtroom(f_contents.at(2).toInt());
+ if(f_contents.size() < 4){
+ if (courtroom_constructed)
+ w_courtroom->enter_courtroom(f_contents.at(2).toInt());
+ }
+ else
+ {
+ if (courtroom_constructed)
+ {
+ if(f_contents.at(3) == "True")
+ {
+ w_courtroom->set_character(f_contents.at(2).toInt());
+ }
+ else
+ {
+ w_courtroom->enter_courtroom(f_contents.at(2).toInt());
+ }
+ }
+ }
}
else if (header == "MS")
{
@@ -662,6 +707,11 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
}
}
}
+ else if (header == "FAILEDLOGIN")
+ {
+ if (courtroom_constructed)
+ w_courtroom->handle_failed_login();
+ }
else if (header == "IL")
{
if (courtroom_constructed && f_contents.size() > 0)
@@ -707,8 +757,8 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
}
else if (header == "CASEA")
{
- if (courtroom_constructed && f_contents.size() > 6)
- w_courtroom->case_called(f_contents.at(0), f_contents.at(1) == "1", f_contents.at(2) == "1", f_contents.at(3) == "1", f_contents.at(4) == "1", f_contents.at(5) == "1");
+ if (courtroom_constructed && f_contents.size() > 7)
+ w_courtroom->case_called(f_contents.at(0), f_contents.at(1) == "1", f_contents.at(2) == "1", f_contents.at(3) == "1", f_contents.at(4) == "1", f_contents.at(5) == "1", f_contents.at(6) == "1");
}
end:
diff --git a/src/path_functions.cpp b/src/path_functions.cpp
index 5eb97a32..72b7accc 100644
--- a/src/path_functions.cpp
+++ b/src/path_functions.cpp
@@ -96,11 +96,37 @@ QString AOApplication::get_sounds_path(QString p_file)
QString AOApplication::get_music_path(QString p_song)
{
- QString path = get_base_path() + "sounds/music/" + p_song;
+ QString withending_check = get_base_path() + "sounds/music/" + p_song;
+ QString mp3_check = get_base_path() + "sounds/music/" + p_song + ".mp3";
+ QString opus_check = get_base_path() + "sounds/music/" + p_song + ".opus";
+ if (file_exists(opus_check))
+ {
+ #ifndef CASE_SENSITIVE_FILESYSTEM
+ return opus_check;
+ #else
+ return get_case_sensitive_path(opus_check);
+ #endif
+ }
+ else if (file_exists(mp3_check))
+ {
+ #ifndef CASE_SENSITIVE_FILESYSTEM
+ return mp3_check;
+ #else
+ return get_case_sensitive_path(mp3_check);
+ #endif
+ }
+ else if (file_exists(withending_check))
+ {
+ #ifndef CASE_SENSITIVE_FILESYSTEM
+ return withending_check;
+ #else
+ return get_case_sensitive_path(withending_check);
+ #endif
+ }
#ifndef CASE_SENSITIVE_FILESYSTEM
- return path;
+ return get_base_path() + "sounds/music/" + p_song + ".wav";
#else
- return get_case_sensitive_path(path);
+ return get_case_sensitive_path(get_base_path() + "sounds/music/" + p_song + ".wav");
#endif
}
diff --git a/src/text_file_functions.cpp b/src/text_file_functions.cpp
index 5a34ac8b..1e1c4744 100644
--- a/src/text_file_functions.cpp
+++ b/src/text_file_functions.cpp
@@ -8,7 +8,7 @@ QString AOApplication::read_theme()
int AOApplication::read_blip_rate()
{
- int result = configini->value("blip_rate", 1).toInt();
+ int result = configini->value("blip_rate", 2).toInt();
if (result < 1)
return 1;
@@ -568,6 +568,42 @@ QString AOApplication::get_sfx_name(QString p_char, int p_emote)
else return f_result;
}
+QString AOApplication::get_sfx_looping(QString p_char, int p_emote)
+{
+ QString f_result = read_char_ini(p_char, QString::number(p_emote + 1), "SoundL");
+
+ if (f_result == "")
+ return "0";
+ else return f_result;
+}
+
+QString AOApplication::get_frame_sfx_name(QString p_char, QString p_emote, int n_frame)
+{
+ QString f_result = read_char_ini(p_char, QString::number(n_frame), p_emote.append("_FrameSFX"));
+ if (f_result == "")
+ return "";
+ else return f_result;
+}
+
+QString AOApplication::get_screenshake_frame(QString p_char, QString p_emote, int n_frame)
+{
+ QString f_result = read_char_ini(p_char, QString::number(n_frame), p_emote.append("_FrameScreenshake"));
+ if (f_result == "")
+ return "";
+ else return f_result;
+}
+
+
+QString AOApplication::get_realization_frame(QString p_char, QString p_emote, int n_frame)
+{
+ QString f_result = read_char_ini(p_char, QString::number(n_frame), p_emote.append("_FrameRealization"));
+ if (f_result == "")
+ return "";
+ else return f_result;
+}
+
+
+
int AOApplication::get_sfx_delay(QString p_char, int p_emote)
{
QString f_result = read_char_ini(p_char, QString::number(p_emote + 1), "SoundT");
@@ -601,12 +637,31 @@ bool AOApplication::get_blank_blip()
return result.startsWith("true");
}
+bool AOApplication::get_looping_sfx()
+{
+ QString result = configini->value("looping_sfx", "true").value<QString>();
+ return result.startsWith("true");
+}
+
+bool AOApplication::get_objectmusic()
+{
+ QString result = configini->value("kill_music_on_object", "false").value<QString>();
+ return result.startsWith("true");
+}
+
bool AOApplication::is_discord_enabled()
{
QString result = configini->value("discord", "true").value<QString>();
return result.startsWith("true");
}
+bool AOApplication::is_shakeandflash_enabled()
+{
+ QString result = configini->value("shakeandflash", "true").value<QString>();
+ return result.startsWith("true");
+}
+
+
bool AOApplication::get_casing_enabled()
{
QString result = configini->value("casing_enabled", "false").value<QString>();
@@ -643,6 +698,12 @@ bool AOApplication::get_casing_steno_enabled()
return result.startsWith("true");
}
+bool AOApplication::get_casing_wit_enabled()
+{
+ QString result = configini->value("casing_wit_enabled", "false").value<QString>();
+ return result.startsWith("true");
+}
+
bool AOApplication::get_casing_cm_enabled()
{
QString result = configini->value("casing_cm_enabled", "false").value<QString>();