aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/demoserver.h1
-rw-r--r--src/aolayer.cpp22
-rw-r--r--src/demoserver.cpp50
-rw-r--r--src/path_functions.cpp2
4 files changed, 63 insertions, 12 deletions
diff --git a/include/demoserver.h b/include/demoserver.h
index 3dc645be..f41084e0 100644
--- a/include/demoserver.h
+++ b/include/demoserver.h
@@ -10,6 +10,7 @@
#include <QTcpSocket>
#include <QTimer>
#include <QFileDialog>
+#include <QMessageBox>
class DemoServer : public QObject
{
diff --git a/src/aolayer.cpp b/src/aolayer.cpp
index e4db75ad..795274f5 100644
--- a/src/aolayer.cpp
+++ b/src/aolayer.cpp
@@ -197,20 +197,20 @@ void CharLayer::load_image(QString p_filename, QString p_charname,
<< " continuous: " << continuous;
#endif
QStringList pathlist = {
- ao_app->get_image_suffix(ao_app->get_character_path(
- p_charname, prefix + current_emote)), // Default path
- ao_app->get_image_suffix(ao_app->get_character_path(
+ ao_app->get_character_path(
+ p_charname, prefix + current_emote), // Default path
+ ao_app->get_character_path(
p_charname,
- prefix + "/" + current_emote)), // Path check if it's categorized
+ prefix + "/" + current_emote), // Path check if it's categorized
// into a folder
- ao_app->get_image_suffix(ao_app->get_character_path(
+ ao_app->get_character_path(
p_charname,
- current_emote)), // Just use the non-prefixed image, animated or not
- ao_app->get_image_suffix(
- ao_app->get_theme_path("placeholder")), // Theme placeholder path
- ao_app->get_image_suffix(ao_app->get_theme_path(
- "placeholder", ao_app->default_theme))}; // Default theme placeholder path
- start_playback(find_image(pathlist));
+ current_emote), // Just use the non-prefixed image, animated or not
+ current_emote, // The path by itself after the above fail
+ ao_app->get_theme_path("placeholder"), // Theme placeholder path
+ ao_app->get_theme_path(
+ "placeholder", ao_app->default_theme)}; // Default theme placeholder path
+ start_playback(ao_app->get_image_path(pathlist));
}
void SplashLayer::load_image(QString p_filename, QString p_charname,
diff --git a/src/demoserver.cpp b/src/demoserver.cpp
index 09741fd4..d6927a5e 100644
--- a/src/demoserver.cpp
+++ b/src/demoserver.cpp
@@ -252,6 +252,56 @@ void DemoServer::load_demo(QString filename)
demo_data.enqueue(line);
line = demo_stream.readLine();
}
+ demo_file.flush();
+ demo_file.close();
+
+ // No-shenanigans 2.9.0 demo file with the dreaded demo desync bug detected https://github.com/AttorneyOnline/AO2-Client/pull/496
+ // If we don't start with the SC packet this means user-edited weirdo shenanigans. Don't screw around with those.
+ if (demo_data.head().startsWith("SC#") && demo_data.last().startsWith("wait#")) {
+ qDebug() << "Loaded a broken pre-2.9.1 demo file, with the wait desync issue!";
+ QMessageBox *msgBox = new QMessageBox;
+ msgBox->setAttribute(Qt::WA_DeleteOnClose);
+ msgBox->setTextFormat(Qt::RichText);
+ msgBox->setText("This appears to be a <b>broken</b> pre-2.9.1 demo file with the <a href=https://github.com/AttorneyOnline/AO2-Client/pull/496>wait desync issue</a>!<br>Do you want to correct this file? <i>If you refuse, this demo will be desynchronized!</i>");
+ msgBox->setWindowTitle("Pre-2.9.1 demo detected!");
+ msgBox->setStandardButtons(QMessageBox::NoButton);
+ QTimer::singleShot(2000, msgBox, std::bind(&QMessageBox::setStandardButtons,msgBox,QMessageBox::Yes|QMessageBox::No));
+ int ret = msgBox->exec();
+ QQueue <QString> p_demo_data;
+ switch (ret) {
+ case QMessageBox::Yes:
+ qDebug() << "Making a backup of the broken demo...";
+ QFile::copy(filename, filename + ".backup");
+ while (!demo_data.isEmpty()) {
+ QString current_packet = demo_data.dequeue();
+ // TODO: faster way of doing this, maybe with QtConcurrent's MapReduce methods?
+ if (!current_packet.startsWith("SC#") && current_packet.startsWith("wait#")) {
+ p_demo_data.insert(qMax(1, p_demo_data.size()-1), current_packet);
+ continue;
+ }
+ p_demo_data.enqueue(current_packet);
+ }
+ if (demo_file.open(QIODevice::WriteOnly | QIODevice::Text |
+ QIODevice::Truncate)) {
+ QTextStream out(&demo_file);
+ out.setCodec("UTF-8");
+ out << p_demo_data.dequeue();
+ for (QString line : p_demo_data) {
+ out << "\n" << line;
+ }
+ demo_file.flush();
+ demo_file.close();
+ }
+ load_demo(filename);
+ break;
+ case QMessageBox::No:
+ // No was clicked
+ break;
+ default:
+ // should never be reached
+ break;
+ }
+ }
}
void DemoServer::playback()
diff --git a/src/path_functions.cpp b/src/path_functions.cpp
index 51073494..79851c11 100644
--- a/src/path_functions.cpp
+++ b/src/path_functions.cpp
@@ -105,7 +105,6 @@ QString AOApplication::get_evidence_path(QString p_file)
QStringList AOApplication::get_asset_paths(QString p_element, QString p_theme, QString p_subtheme, QString p_default_theme, QString p_misc, QString p_character, QString p_placeholder)
{
QStringList pathlist;
- pathlist += p_element; // The path by itself
if (p_character != "")
pathlist += get_character_path(p_character, p_element); // Character folder
if (p_misc != "" && p_theme != "" && p_subtheme != "")
@@ -120,6 +119,7 @@ QStringList AOApplication::get_asset_paths(QString p_element, QString p_theme, Q
pathlist += get_theme_path(p_element, p_theme); // Theme path
if (p_default_theme != "")
pathlist += get_theme_path(p_element, p_default_theme); // Default theme path
+ pathlist += p_element; // The path by itself
if (p_placeholder != "" && p_theme != "")
pathlist += get_theme_path(p_placeholder, p_theme); // Placeholder path
if (p_placeholder != "" && p_default_theme != "")