Expand get_image_suffix to fall back on .png last

Reorganize the file_exists checks to be an array iterator instead for much less code duplication and easier ordering of priority
Reorganize desk and set_image loading on AOScene class, resolve issues with last_image setting to prevent animations from being restarted when characters talk on the same pos in succession
Apply get_image_suffix for seancestand and jurystand searches
TODO: At the moment, if you feed a .png shout, it will send the "Done" signal on the first frame (frame 0), not showing you the .png image at all. The shout code should be reorganized to allow static images to be displayed for exactly 720ms - the standard AA objection length. Usage of the timer similarly to the realizationflash.png might be possible.
This commit is contained in:
Crystalwarrior 2019-09-12 15:40:19 +03:00
parent 7e2ec58c7e
commit 3b415f5a70
6 changed files with 66 additions and 99 deletions

View File

@ -219,7 +219,7 @@ public:
//Figure out if we can opus this or if we should fall back to wav
QString get_sfx_suffix(QString sound_to_check);
// Can we use APNG for this? If not, WEBP? If not, fall back to gif.
// Can we use APNG for this? If not, WEBP? If not, GIF? If not, fall back to PNG.
QString get_image_suffix(QString path_to_check);
//Returns the value of p_search_line within target_tag and terminator_tag

View File

@ -19,25 +19,26 @@ AOCharMovie::AOCharMovie(QWidget *p_parent, AOApplication *p_ao_app) : QLabel(p_
void AOCharMovie::play(QString p_char, QString p_emote, QString emote_prefix)
{
QString original_path = ao_app->get_image_suffix(ao_app->get_character_path(p_char, emote_prefix + p_emote));
QString alt_path = ao_app->get_character_path(p_char, p_emote + ".png");
QString placeholder_path = ao_app->get_image_suffix(ao_app->get_theme_path("placeholder"));
QString placeholder_default_path = ao_app->get_image_suffix(ao_app->get_default_theme_path("placeholder"));
QString gif_path;
QString emote_path;
QList<QString> pathlist;
pathlist << ao_app->get_image_suffix(ao_app->get_character_path(p_char, emote_prefix + p_emote)) <<//Default path
ao_app->get_character_path(p_char, p_emote + ".png") << //Non-animated path if emote_prefix fails
ao_app->get_image_suffix(ao_app->get_theme_path("placeholder")) << //Theme placeholder path
ao_app->get_image_suffix(ao_app->get_default_theme_path("placeholder")); //Default theme placeholder path
if (file_exists(original_path))
gif_path = original_path;
else if (file_exists(alt_path))
gif_path = alt_path;
else if (file_exists(placeholder_path))
gif_path = placeholder_path;
else
gif_path = placeholder_default_path;
for (QString path : pathlist)
{
if (file_exists(path))
{
emote_path = path;
break;
}
}
m_movie->stop();
m_movie->setFileName(gif_path);
m_movie->setFileName(emote_path);
QImageReader *reader = new QImageReader(gif_path);
QImageReader *reader = new QImageReader(emote_path);
movie_frames.clear();
QImage f_image = reader->read();

View File

@ -24,39 +24,30 @@ void AOMovie::play(QString p_gif, QString p_char, QString p_custom_theme)
{
m_movie->stop();
QString gif_path;
QString custom_path;
QString shout_path;
QList<QString> pathlist;
if (p_gif == "custom")
custom_path = ao_app->get_image_suffix(ao_app->get_character_path(p_char, p_gif));
pathlist << ao_app->get_image_suffix(ao_app->get_character_path(p_char, p_gif));
else
custom_path = ao_app->get_image_suffix(ao_app->get_character_path(p_char, p_gif + "_bubble"));
pathlist << ao_app->get_image_suffix(ao_app->get_character_path(p_char, p_gif + "_bubble"));
QString misc_path = ao_app->get_image_suffix(ao_app->get_base_path() + "misc/" + p_custom_theme + "/" + p_gif + "_bubble");
QString custom_theme_path = ao_app->get_image_suffix(ao_app->get_custom_theme_path(p_custom_theme, p_gif));
QString theme_path = ao_app->get_image_suffix(ao_app->get_theme_path(p_gif));
QString default_theme_path = ao_app->get_image_suffix(ao_app->get_default_theme_path(p_gif));
QString placeholder_path = ao_app->get_image_suffix(ao_app->get_theme_path("placeholder"));
QString default_placeholder_path =ao_app->get_image_suffix( ao_app->get_default_theme_path("placeholder"));
pathlist << ao_app->get_image_suffix(ao_app->get_base_path() + "misc/" + p_custom_theme + "/" + p_gif + "_bubble") << //Misc path
ao_app->get_image_suffix(ao_app->get_custom_theme_path(p_custom_theme, p_gif)) << //Custom theme path
ao_app->get_image_suffix(ao_app->get_theme_path(p_gif)) << //Theme path
ao_app->get_image_suffix(ao_app->get_default_theme_path(p_gif)) << //Default theme path
ao_app->get_image_suffix(ao_app->get_theme_path("placeholder")) << //Placeholder path
ao_app->get_image_suffix( ao_app->get_default_theme_path("placeholder")); //Default placeholder path
if (file_exists(custom_path))
gif_path = custom_path;
else if (file_exists(misc_path))
gif_path = misc_path;
else if (file_exists(custom_theme_path))
gif_path = custom_theme_path;
else if (file_exists(theme_path))
gif_path = theme_path;
else if (file_exists(default_theme_path))
gif_path = default_theme_path;
else if (file_exists(placeholder_path))
gif_path = placeholder_path;
else if (file_exists(default_placeholder_path))
gif_path = default_placeholder_path;
else
gif_path = "";
for (QString path : pathlist)
{
if (file_exists(path))
{
shout_path = path;
break;
}
}
m_movie->setFileName(gif_path);
m_movie->setFileName(shout_path);
this->show();
m_movie->start();

View File

@ -12,16 +12,13 @@ AOScene::AOScene(QWidget *parent, AOApplication *p_ao_app) : QLabel(parent)
void AOScene::set_image(QString p_image)
{
QString background_path = ao_app->get_background_path(p_image + ".png");
QString default_path = ao_app->get_default_background_path(p_image + ".png");
QString animated_background_path = ao_app->get_image_suffix(ao_app->get_background_path(p_image));
QString background_path = ao_app->get_image_suffix(ao_app->get_background_path(p_image));
if (!file_exists(background_path))
background_path = ao_app->get_image_suffix(ao_app->get_default_background_path(p_image)); //Default path
if (file_exists(animated_background_path) && animated_background_path == last_image)
if (file_exists(background_path) && background_path == last_image)
return;
QPixmap background(background_path);
QPixmap default_bg(default_path);
int w = this->width();
int h = this->height();
@ -29,74 +26,60 @@ void AOScene::set_image(QString p_image)
this->setMovie(nullptr);
m_movie->stop();
m_movie->setFileName(animated_background_path);
m_movie->setFileName(background_path);
m_movie->setScaledSize(QSize(w, h));
if (m_movie->isValid())
{
this->setMovie(m_movie);
m_movie->start();
last_image = animated_background_path;
}
else if (file_exists(background_path))
{
this->setPixmap(background.scaled(w, h));
}
else
{
this->setPixmap(default_bg.scaled(w, h));
QPixmap background(background_path);
this->setPixmap(background.scaled(w, h));
}
last_image = background_path;
}
void AOScene::set_legacy_desk(QString p_image)
{
//vanilla desks vary in both width and height. in order to make that work with viewport rescaling,
//some INTENSE math is needed.
QString desk_path = ao_app->get_background_path(p_image + ".png");
QString animated_desk_path = ao_app->get_image_suffix(ao_app->get_background_path(p_image));
QString default_path = ao_app->get_image_suffix(ao_app->get_default_background_path(p_image));
QString desk_path = ao_app->get_image_suffix(ao_app->get_background_path(p_image));
if (!file_exists(desk_path))
desk_path = ao_app->get_image_suffix(ao_app->get_default_background_path(p_image)); //Default path
if (file_exists(animated_desk_path) && animated_desk_path == last_image)
if (file_exists(desk_path) && desk_path == last_image)
return;
QPixmap f_desk;
QPixmap f_desk(desk_path);
//vanilla desks vary in both width and height. in order to make that work with viewport rescaling,
//some INTENSE math is needed.
int vp_width = m_parent->width();
int vp_height = m_parent->height();
//double y_modifier = 147 / 192;
//double w_modifier = vp_width / 256;
double h_modifier = vp_height / 192;
//int final_y = y_modifier * vp_height;
//int final_w = w_modifier * f_desk.width();
int final_h = static_cast<int>(h_modifier * f_desk.height());
this->clear();
this->setMovie(nullptr);
m_movie->stop();
m_movie->setFileName(animated_desk_path);
m_movie->setFileName(desk_path);
m_movie->setScaledSize(QSize(vp_width, vp_height));
m_movie->setScaledSize(QSize(vp_width, final_h));
if (m_movie->isValid())
{
this->setMovie(m_movie);
m_movie->start();
last_image = animated_desk_path;
}
else
{
if (file_exists(desk_path))
f_desk.load(desk_path);
else
f_desk.load(default_path);
//this->resize(final_w, final_h);
//this->setPixmap(f_desk.scaled(final_w, final_h));
this->resize(vp_width, final_h);
this->setPixmap(f_desk.scaled(vp_width, final_h));
}
last_image = desk_path;
}

View File

@ -908,10 +908,8 @@ void Courtroom::enter_courtroom(int p_cid)
}
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.webp"))) &&
file_exists(ao_app->get_character_path(current_char, "custom.wav")))
(file_exists(ao_app->get_image_suffix(ao_app->get_character_path(current_char, "custom"))) &&
file_exists(ao_app->get_character_path(current_char, "custom.wav"))))
ui_custom_objection->show();
else
ui_custom_objection->hide();
@ -2378,6 +2376,7 @@ void Courtroom::set_scene()
QString f_desk_mod = m_chatmessage[DESK_MOD];
QString f_side = m_chatmessage[SIDE];
//This thing desperately needs to be made into an array iteration.
if (f_side == "def")
{
f_background = "defenseempty";
@ -2409,18 +2408,12 @@ void Courtroom::set_scene()
f_background = "prohelperstand";
f_desk_image = "prohelperdesk";
}
else if (f_side == "jur" && (file_exists(ao_app->get_background_path("jurystand.png")) ||
file_exists(ao_app->get_background_path("jurystand.gif")) ||
file_exists(ao_app->get_background_path("jurystand.apng")) ||
file_exists(ao_app->get_background_path("jurystand.webp"))))
else if (f_side == "jur" && (file_exists(ao_app->get_image_suffix(ao_app->get_background_path("jurystand")))))
{
f_background = "jurystand";
f_desk_image = "jurydesk";
}
else if (f_side == "sea" && (file_exists(ao_app->get_background_path("seancestand.png")) ||
file_exists(ao_app->get_background_path("seancestand.gif")) ||
file_exists(ao_app->get_background_path("seancestand.apng")) ||
file_exists(ao_app->get_background_path("seancestand.webp"))))
else if (f_side == "sea" && (file_exists(ao_app->get_image_suffix(ao_app->get_background_path("seancestand")))))
{
f_background = "seancestand";
f_desk_image = "seancedesk";
@ -2436,7 +2429,6 @@ void Courtroom::set_scene()
ui_vp_background->set_image(f_background);
ui_vp_desk->set_image(f_desk_image);
ui_vp_legacy_desk->set_legacy_desk(f_desk_image);
if (f_desk_mod == "0" || (f_desk_mod != "1" &&
(f_side == "jud" ||
f_side == "hld" ||

View File

@ -385,13 +385,13 @@ QString AOApplication::get_sfx_suffix(QString sound_to_check)
QString AOApplication::get_image_suffix(QString path_to_check)
{
QString webp_check = path_to_check + ".webp";
QString apng_check = path_to_check + ".apng";
if (file_exists(webp_check))
return webp_check;
if (file_exists(apng_check))
return apng_check;
return path_to_check + ".gif";
if (file_exists(path_to_check + ".webp"))
return path_to_check + ".webp";
if (file_exists(path_to_check + ".apng"))
return path_to_check + ".apng";
if (file_exists(path_to_check + ".gif"))
return path_to_check + ".gif";
return path_to_check + ".png";
}