aboutsummaryrefslogtreecommitdiff
path: root/src/aocharmovie.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/aocharmovie.cpp')
-rw-r--r--src/aocharmovie.cpp295
1 files changed, 117 insertions, 178 deletions
diff --git a/src/aocharmovie.cpp b/src/aocharmovie.cpp
index 35d9b031..57487233 100644
--- a/src/aocharmovie.cpp
+++ b/src/aocharmovie.cpp
@@ -1,242 +1,150 @@
#include "aocharmovie.h"
-#include "aoapplication.h"
-#include "file_functions.h"
#include "misc_functions.h"
+#include "file_functions.h"
+#include "aoapplication.h"
-AOCharMovie::AOCharMovie(QWidget *p_parent, AOApplication *p_ao_app)
- : QLabel(p_parent)
+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);
- ticker->setSingleShot(true);
- connect(ticker, SIGNAL(timeout()), this, SLOT(movie_ticker()));
- this->setUpdatesEnabled(true);
+
+ connect(m_movie, SIGNAL(frameChanged(int)), this, SLOT(frame_change(int)));
+ connect(preanim_timer, SIGNAL(timeout()), this, SLOT(timer_done()));
}
void AOCharMovie::play(QString p_char, QString p_emote, QString emote_prefix)
{
- 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, emote_prefix + p_emote + ".png");
- QString apng_path =
- ao_app->get_character_path(p_char, emote_prefix + p_emote + ".apng");
- QString alt_path_still = ao_app->get_character_path(p_char, p_emote + ".png");
-
+ 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 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 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;
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();
- // if the frame count is 0 (i.e. it's a static PNG) don't try to play the next
- // frame, ya goofus
- if (m_movie->frameCount() != 0) {
- ticker->start(m_movie->nextFrameDelay());
- }
-}
-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) {
- 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();
+ QImageReader *reader = new QImageReader(gif_path);
+
+ movie_frames.clear();
+ QImage f_image = reader->read();
+ while (!f_image.isNull())
+ {
+ if (m_flipped)
+ movie_frames.append(f_image.mirrored(true, false));
+ else
+ movie_frames.append(f_image);
+ f_image = reader->read();
}
- else if (use_networked_framehell) {
- this->realization_two_network_boogaloo();
- }
-}
-void AOCharMovie::realization_two_network_boogaloo()
-{
- 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();
- }
- }
- }
-}
+ delete reader;
-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();
- }
- }
- }
+ this->show();
+ m_movie->start();
}
-void AOCharMovie::sfx_two_network_boogaloo()
+void AOCharMovie::play_pre(QString p_char, QString p_emote, int duration)
{
- 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)));
- }
- }
- }
-}
+ QString gif_path = ao_app->get_character_path(p_char, p_emote);
-void AOCharMovie::movie_ticker()
-{
- if (m_movie->currentFrameNumber() == m_movie->frameCount() - 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();
- }
- }
- else {
- 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
+ m_movie->stop();
+ this->clear();
+ m_movie->setFileName(gif_path);
+ m_movie->jumpToFrame(0);
- this->play_frame_sfx();
+ int full_duration = duration * time_mod;
+ int real_duration = 0;
- if (m_movie->frameCount() == 0) {
- return;
- }
- else {
- ticker->start(m_movie->nextFrameDelay());
+ play_once = false;
+
+ for (int n_frame = 0 ; n_frame < m_movie->frameCount() ; ++n_frame)
+ {
+ real_duration += m_movie->nextFrameDelay();
+ m_movie->jumpToFrame(n_frame + 1);
}
-}
-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;
+#ifdef DEBUG_GIF
+ qDebug() << "full_duration: " << full_duration;
+ qDebug() << "real_duration: " << real_duration;
+#endif
+
+ double percentage_modifier = 100.0;
- if (f_pixmap.size().width() > f_pixmap.size().height())
- aspect_ratio = Qt::KeepAspectRatioByExpanding;
+ if (real_duration != 0 && duration != 0)
+ {
+ double modifier = full_duration / static_cast<double>(real_duration);
+ percentage_modifier = 100 / modifier;
- 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));
+ if (percentage_modifier > 100.0)
+ percentage_modifier = 100.0;
+ }
+
+#ifdef DEBUG_GIF
+ qDebug() << "% mod: " << percentage_modifier;
+#endif
+
+ if (full_duration == 0 || full_duration >= real_duration)
+ {
+ play_once = true;
+ }
else
- this->setPixmap(f_pixmap.scaled(this->width(), this->height(), aspect_ratio,
- Qt::FastTransformation));
+ {
+ play_once = false;
+ preanim_timer->start(full_duration);
+ }
- QLabel::move(x + (this->width() - this->pixmap()->width()) / 2, y);
+
+ m_movie->setSpeed(static_cast<int>(percentage_modifier));
+ play(p_char, p_emote, "");
}
-void AOCharMovie::play_pre(QString p_char, QString p_emote, int duration)
+void AOCharMovie::play_talking(QString p_char, QString p_emote)
{
- QString gif_path = ao_app->get_character_path(p_char, p_emote);
+ QString gif_path = ao_app->get_character_path(p_char, "(b)" + p_emote);
m_movie->stop();
+ this->clear();
m_movie->setFileName(gif_path);
- m_movie->jumpToFrame(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)");
}
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
+ //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();
- frame_specific_sfx_player->stop();
+ preanim_timer->stop();
this->hide();
}
@@ -244,8 +152,9 @@ void AOCharMovie::combo_resize(int w, int h)
{
QSize f_size(w, h);
this->resize(f_size);
- m_movie->setScaledSize(this->size());
+ m_movie->setScaledSize(f_size);
}
+
void AOCharMovie::move(int ax, int ay)
{
x = ax;
@@ -253,4 +162,34 @@ void AOCharMovie::move(int ax, int ay)
QLabel::move(x, y);
}
-void AOCharMovie::timer_done() { done(); }
+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();
+}