atrooney-online-2/src/text_file_functions.cpp
Crystalwarrior 2d1de1fb54
Desynchronize viewport from the IC chat log so that users have a smooth viewing experience as an option (#385)
* Begin trying to understand handle_chatmessage monstrosity
Rearrange some functionality to be more consistent with what the particular handle_chatmessage is *supposed* to be responsible for
Single responsibility principle doesn't apply not just to script files but even functions in this goddamned program apparently.

* Fix some oversights relating to "has presented evidence" logs

* Fix an edge case crash with negative evidence, idk why this didn't happen before.

* Completely refactor handle_chatmessage hell and split it up into single-responsibility-principle functions like a sane and organized coder would.
This will break any PRs that touch handle_chatmessage and will have to conform to the new standard, but it's very good in the long run.
Functions have also been meticulously commentated to make sure that everyone can understand at a glance what everything does.
This refactor is done to pave way for smooth viewport, making characters no longer randomly interrupt each other when speaking.

* Rename confusingly named "handle_chatbox" to "handle_ic_speaking"
Add a new function "handle_callwords"

* Parse blankposts in the packet unpacking phase
log_chatmessage is now an argument-based funciton instead of using m_chatmessage monstrosity
Commentate the heck out of log_chatmessage
Fix showname displaying logic being bonkers for log entries
Fix -1 char_id most likely crashing client, even tho they're supposed to be system messages
Fix [CHARID] being referenced instead of [OTHER_CHARID] in the pair display func
Fix chat message color being used for "has played a song" even though it shouldn't

* Move setting emote_mod from the objection thing to the packet unpacking thing
handle_emote_mod has become argumented

* Make display_pair_character take in only vars it needs

* Add functionality for message stacks (does not handle logging separately yet)
Currently segfaults at line 1823 if stacking behavior actually occurs. Plz help I'm poopie brain at this

* Make sense of pointers and dereference some pointers to prevent wacky errors
Replace _stack with _queue, and turn it into a QQueue

* Implement a minimum text delay queue timer so that each msg must stay on screen for a specified amount of time
Chat_arrow only shows up when the minimum text delay has expired
Check if target is muted in the enqueueing, as well as the validity of the character id, so we don't even bother adding it to the queue
Add a settings option to set text stay time (minimum amount of time to pass before displaying the next message).
TODO: Handle queued interjections in a cooler way

* Adjust default option for stay_time to be 200ms
Make the stay_time setting of 0 disable the queue system entirely

* Make interjections force-clear the message queue
Use interjections to instantly process those messages - objections are usually extremely important and must have everyone's immediate attention.
TODO: Add a settings option for interjection behavior

* Clear message queue when bg display packet is received

* Add an instant objection setting which, when enabled, will interrupt and skip the message queue on objections (effectively bypassing text_delay system)

* Stop using AOPacket for the queue and use QStringList instead (packet contents, we don't care for the header)
Implement objection threshold which works in a queue if instant objections are disabled (not exposed to the settings yet)
Modify packet contents directly instead of waiting for m_chatmessage shenanigans (we should deprecate this soon)
Rename isinstant_objection_enabled options check to be more consistent

* Make it so objections display as soon as the message is over if instant_objection is disabled

* Remove emote_mod = "1" thing that had no real purpose
Implement desynchronized logs settings option, which is false by default, meaning users' messages and display IC logs are going to be in sync.
Split up display and logging behavior, meaning IC logs will be saved with accurate timings on the .logs file, while display can be slower.
Remove dumb "System" showname thing cuz it was dumb

* Bring back minimum packet size safety check

* Make sure shouts are properly logged. I am very sorry for this horrible amount of code duplication though.

* fix compile errors

* fix html parsing error

* Rearrange the order of logging so IC messages go like this:
* shouts go first
* evidence goes second
* chat message goes last

* Fix No Interrupt coming back, go away you foolish beast

* fix borked options dialog

* Crank down "press enter delay" from 600ms to 200ms so it's not as harsh

Co-authored-by: in1tiate <radwoodward@vikings.grayson.edu>
Co-authored-by: oldmud0 <oldmud0@users.noreply.github.com>
2021-01-12 11:24:11 +03:00

1115 lines
28 KiB
C++

#include "text_file_functions.h"
QString AOApplication::read_theme()
{
QString result = configini->value("theme", "default").value<QString>();
return result;
}
int AOApplication::read_blip_rate()
{
int result = configini->value("blip_rate", 2).toInt();
if (result < 1)
return 1;
return result;
}
QString AOApplication::get_ooc_name()
{
QString result = configini->value("ooc_name").value<QString>();
return result;
}
int AOApplication::get_default_music()
{
int result = configini->value("default_music", 50).toInt();
return result;
}
int AOApplication::get_default_sfx()
{
int result = configini->value("default_sfx", 50).toInt();
return result;
}
int AOApplication::get_default_blip()
{
int result = configini->value("default_blip", 50).toInt();
return result;
}
int AOApplication::get_max_log_size()
{
int result = configini->value("log_maximum", 200).toInt();
return result;
}
int AOApplication::stay_time()
{
int result = configini->value("stay_time", 200).toInt();
return result;
}
bool AOApplication::get_log_goes_downwards()
{
QString result =
configini->value("log_goes_downwards", "true").value<QString>();
return result.startsWith("true");
}
bool AOApplication::get_log_newline()
{
QString result =
configini->value("log_newline", "false").value<QString>();
return result.startsWith("true");
}
int AOApplication::get_log_margin()
{
int result = configini->value("log_margin", 0).toInt();
return result;
}
bool AOApplication::get_log_timestamp()
{
QString result =
configini->value("log_timestamp", "false").value<QString>();
return result.startsWith("true");
}
bool AOApplication::get_log_ic_actions()
{
QString result =
configini->value("log_ic_actions", "true").value<QString>();
return result.startsWith("true");
}
bool AOApplication::get_showname_enabled_by_default()
{
QString result =
configini->value("show_custom_shownames", "true").value<QString>();
return result.startsWith("true");
}
QString AOApplication::get_default_username()
{
QString result = configini->value("default_username", "").value<QString>();
if (result.isEmpty())
return get_ooc_name();
else
return result;
}
QString AOApplication::get_audio_output_device()
{
QString result =
configini->value("default_audio_device", "default").value<QString>();
return result;
}
QStringList AOApplication::get_call_words()
{
return get_list_file(get_base_path() + "callwords.ini");
}
QStringList AOApplication::get_list_file(QString p_file)
{
QStringList return_value;
QFile p_ini;
p_ini.setFileName(p_file);
if (!p_ini.open(QIODevice::ReadOnly))
return return_value;
QTextStream in(&p_ini);
while (!in.atEnd()) {
QString line = in.readLine();
return_value.append(line);
}
return return_value;
}
QString AOApplication::read_file(QString filename)
{
QFile f_log(filename);
if (!f_log.open(QIODevice::ReadOnly | QIODevice::Text)) {
qDebug() << "Couldn't open" << filename;
return "";
}
QTextStream in(&f_log);
QString text = in.readAll();
f_log.close();
return text;
}
bool AOApplication::write_to_file(QString p_text, QString p_file, bool make_dir)
{
QString path = QFileInfo(p_file).path();
if (make_dir) {
// Create the dir if it doesn't exist yet
QDir dir(path);
if (!dir.exists())
if (!dir.mkpath("."))
return false;
}
QFile f_log(p_file);
if (f_log.open(QIODevice::WriteOnly | QIODevice::Text |
QIODevice::Truncate)) {
QTextStream out(&f_log);
out << p_text;
f_log.flush();
f_log.close();
return true;
}
return false;
}
bool AOApplication::append_to_file(QString p_text, QString p_file,
bool make_dir)
{
QString path = QFileInfo(p_file).path();
// Create the dir if it doesn't exist yet
if (make_dir) {
QDir dir(path);
if (!dir.exists())
if (!dir.mkpath("."))
return false;
}
QFile f_log(p_file);
if (f_log.open(QIODevice::WriteOnly | QIODevice::Append)) {
QTextStream out(&f_log);
out << "\r\n" << p_text;
f_log.flush();
f_log.close();
return true;
}
return false;
}
void AOApplication::write_to_serverlist_txt(QString p_line)
{
QFile serverlist_txt;
QString serverlist_txt_path = get_base_path() + "serverlist.txt";
serverlist_txt.setFileName(serverlist_txt_path);
if (!serverlist_txt.open(QIODevice::WriteOnly | QIODevice::Append)) {
return;
}
QTextStream out(&serverlist_txt);
out << "\r\n" << p_line;
serverlist_txt.close();
}
QVector<server_type> AOApplication::read_serverlist_txt()
{
QVector<server_type> f_server_list;
QFile serverlist_txt;
QString serverlist_txt_path = get_base_path() + "serverlist.txt";
serverlist_txt.setFileName(serverlist_txt_path);
if (!serverlist_txt.open(QIODevice::ReadOnly)) {
return f_server_list;
}
QTextStream in(&serverlist_txt);
while (!in.atEnd()) {
QString line = in.readLine();
server_type f_server;
QStringList line_contents = line.split(":");
if (line_contents.size() < 3)
continue;
f_server.ip = line_contents.at(0);
f_server.port = line_contents.at(1).toInt();
f_server.name = line_contents.at(2);
f_server.desc = "";
f_server_list.append(f_server);
}
return f_server_list;
}
QString AOApplication::read_design_ini(QString p_identifier,
QString p_design_path)
{
QSettings settings(p_design_path, QSettings::IniFormat);
QVariant value = settings.value(p_identifier);
if (value.type() == QVariant::StringList) {
return value.toStringList().join(",");
}
else {
return value.toString();
}
}
QPoint AOApplication::get_button_spacing(QString p_identifier, QString p_file)
{
QString design_ini_path = get_theme_path(p_file);
QString default_path = get_default_theme_path(p_file);
QString f_result = read_design_ini(p_identifier, design_ini_path);
QPoint return_value;
return_value.setX(0);
return_value.setY(0);
if (f_result == "") {
f_result = read_design_ini(p_identifier, default_path);
if (f_result == "")
return return_value;
}
QStringList sub_line_elements = f_result.split(",");
if (sub_line_elements.size() < 2)
return return_value;
return_value.setX(sub_line_elements.at(0).toInt());
return_value.setY(sub_line_elements.at(1).toInt());
return return_value;
}
pos_size_type AOApplication::get_element_dimensions(QString p_identifier,
QString p_file,
QString p_char)
{
QString char_ini_path =
get_base_path() + "misc/" + get_chat(p_char) + "/" + p_file;
QString design_ini_path = get_theme_path(p_file);
QString default_path = get_default_theme_path(p_file);
QString f_result = read_design_ini(p_identifier, char_ini_path);
pos_size_type return_value;
return_value.x = 0;
return_value.y = 0;
return_value.width = -1;
return_value.height = -1;
if (f_result == "") {
f_result = read_design_ini(p_identifier, design_ini_path);
if (f_result == "") {
f_result = read_design_ini(p_identifier, default_path);
if (f_result == "")
return return_value;
}
}
QStringList sub_line_elements = f_result.split(",");
if (sub_line_elements.size() < 4)
return return_value;
return_value.x = sub_line_elements.at(0).toInt();
return_value.y = sub_line_elements.at(1).toInt();
return_value.width = sub_line_elements.at(2).toInt();
return_value.height = sub_line_elements.at(3).toInt();
return return_value;
}
QString AOApplication::get_design_element(QString p_identifier, QString p_file,
QString p_char)
{
QString char_ini_path =
get_base_path() + "misc/" + get_chat(p_char) + "/" + p_file;
QString design_ini_path = get_theme_path(p_file);
QString default_path = get_default_theme_path(p_file);
QString f_result = read_design_ini(p_identifier, char_ini_path);
if (f_result == "") {
f_result = read_design_ini(p_identifier, design_ini_path);
if (f_result == "")
f_result = read_design_ini(p_identifier, default_path);
}
return f_result;
}
QString AOApplication::get_font_name(QString p_identifier, QString p_file)
{
QString design_ini_path = get_theme_path(p_file);
QString f_result = read_design_ini(p_identifier, design_ini_path);
QString default_path = get_default_theme_path(p_file);
if (f_result == "") {
f_result = read_design_ini(p_identifier, default_path);
if (f_result == "")
return "";
}
return f_result;
}
int AOApplication::get_font_size(QString p_identifier, QString p_file)
{
QString design_ini_path = get_theme_path(p_file);
QString default_path = get_default_theme_path(p_file);
QString f_result = read_design_ini(p_identifier, design_ini_path);
if (f_result == "") {
f_result = read_design_ini(p_identifier, default_path);
if (f_result == "")
return 10;
}
return f_result.toInt();
}
QColor AOApplication::get_color(QString p_identifier, QString p_file)
{
QString design_ini_path = get_theme_path(p_file);
QString default_path = get_default_theme_path(p_file);
QString f_result = read_design_ini(p_identifier, design_ini_path);
QColor return_color(0, 0, 0);
if (f_result == "") {
f_result = read_design_ini(p_identifier, default_path);
if (f_result == "")
return return_color;
}
QStringList color_list = f_result.split(",");
if (color_list.size() < 3)
return return_color;
return_color.setRed(color_list.at(0).toInt());
return_color.setGreen(color_list.at(1).toInt());
return_color.setBlue(color_list.at(2).toInt());
return return_color;
}
QString AOApplication::get_stylesheet(QString p_file)
{
QString design_ini_path = get_theme_path(p_file);
QString default_path = get_default_theme_path(p_file);
QFile design_ini;
design_ini.setFileName(design_ini_path);
if (!design_ini.open(QIODevice::ReadOnly)) {
design_ini.setFileName(default_path);
if (!design_ini.open(QIODevice::ReadOnly))
return "";
}
QTextStream in(&design_ini);
QString f_text;
while (!in.atEnd()) {
f_text.append(in.readLine());
}
design_ini.close();
return f_text;
}
QString AOApplication::get_tagged_stylesheet(QString target_tag, QString p_file)
{
QString design_ini_path = get_theme_path(p_file);
QFile design_ini;
design_ini.setFileName(design_ini_path);
if (!design_ini.open(QIODevice::ReadOnly))
return "";
QTextStream in(&design_ini);
QString f_text;
bool tag_found = false;
while (!in.atEnd()) {
QString line = in.readLine();
if (line.startsWith(target_tag, Qt::CaseInsensitive)) {
tag_found = true;
continue;
}
if (tag_found) {
if ((line.startsWith("[") && line.endsWith("]")))
break;
f_text.append(line);
}
}
design_ini.close();
return f_text;
}
QString AOApplication::get_chat_markdown(QString p_identifier, QString p_chat)
{
QString design_ini_path =
get_base_path() + "misc/" + get_chat(p_chat) + "/config.ini";
QString default_path = get_base_path() + "misc/default/config.ini";
QString f_result = read_design_ini(p_identifier, design_ini_path);
if (f_result == "")
f_result = read_design_ini(p_identifier, default_path);
return f_result.toLatin1();
}
QColor AOApplication::get_chat_color(QString p_identifier, QString p_chat)
{
QColor return_color(255, 255, 255);
QString design_ini_path =
get_base_path() + "misc/" + get_chat(p_chat) + "/config.ini";
QString default_path = get_base_path() + "misc/default/config.ini";
QString f_result = read_design_ini(p_identifier, design_ini_path);
if (f_result == "") {
f_result = read_design_ini(p_identifier, default_path);
if (f_result == "")
return return_color;
}
QStringList color_list = f_result.split(",");
if (color_list.size() < 3)
return return_color;
return_color.setRed(color_list.at(0).toInt());
return_color.setGreen(color_list.at(1).toInt());
return_color.setBlue(color_list.at(2).toInt());
return return_color;
}
QString AOApplication::get_sfx(QString p_identifier)
{
QString design_ini_path = get_theme_path("courtroom_sounds.ini");
QString default_path = get_default_theme_path("courtroom_sounds.ini");
QString f_result = read_design_ini(p_identifier, design_ini_path);
QString return_sfx = "";
if (f_result == "") {
f_result = read_design_ini(p_identifier, default_path);
if (f_result == "")
return return_sfx;
}
return_sfx = f_result;
return return_sfx;
}
QString AOApplication::get_sfx_suffix(QString sound_to_check)
{
if (file_exists(sound_to_check))
return sound_to_check;
if (file_exists(sound_to_check + ".opus"))
return sound_to_check + ".opus";
if (file_exists(sound_to_check + ".ogg"))
return sound_to_check + ".ogg";
if (file_exists(sound_to_check + ".mp3"))
return sound_to_check + ".mp3";
if (file_exists(sound_to_check + ".mp4"))
return sound_to_check + ".mp4";
return sound_to_check + ".wav";
}
QString AOApplication::get_image_suffix(QString path_to_check)
{
if (file_exists(path_to_check))
return path_to_check;
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";
}
QString AOApplication::get_static_image_suffix(QString path_to_check)
{
return path_to_check + ".png";
}
// returns whatever is to the right of "search_line =" within target_tag and
// terminator_tag, trimmed returns the empty string if the search line couldnt
// be found
QString AOApplication::read_char_ini(QString p_char, QString p_search_line,
QString target_tag)
{
QSettings settings(get_character_path(p_char, "char.ini"),
QSettings::IniFormat);
settings.beginGroup(target_tag);
QString value = settings.value(p_search_line).toString();
settings.endGroup();
return value;
}
void AOApplication::set_char_ini(QString p_char, QString value,
QString p_search_line, QString target_tag)
{
QSettings settings(get_character_path(p_char, "char.ini"),
QSettings::IniFormat);
settings.beginGroup(target_tag);
settings.setValue(p_search_line, value);
settings.endGroup();
}
// returns all the values of target_tag
QStringList AOApplication::read_ini_tags(QString p_path, QString target_tag)
{
QStringList r_values;
QSettings settings(p_path, QSettings::IniFormat);
if (!target_tag.isEmpty())
settings.beginGroup(target_tag);
QStringList keys = settings.allKeys();
foreach (QString key, keys) {
QString value = settings.value(key).toString();
r_values << key + "=" + value;
}
if (!settings.group().isEmpty())
settings.endGroup();
return r_values;
}
QString AOApplication::get_char_name(QString p_char)
{
QString f_result = read_char_ini(p_char, "name", "Options");
if (f_result == "")
return p_char;
return f_result;
}
QString AOApplication::get_showname(QString p_char)
{
QString f_result = read_char_ini(p_char, "showname", "Options");
QString f_needed = read_char_ini(p_char, "needs_showname", "Options");
if (f_needed.startsWith("false"))
return "";
if (f_result == "")
return p_char;
return f_result;
}
QString AOApplication::get_char_side(QString p_char)
{
QString f_result = read_char_ini(p_char, "side", "Options");
if (f_result == "")
return "wit";
return f_result;
}
QString AOApplication::get_blips(QString p_char)
{
QString f_result = read_char_ini(p_char, "blips", "Options");
if (f_result == "") {
f_result = read_char_ini(p_char, "gender", "Options"); // not very PC, FanatSors
if (f_result == "")
f_result = "male";
}
if (!file_exists(get_sfx_suffix(get_sounds_path(f_result)))) {
if (file_exists(get_sfx_suffix(get_sounds_path("../blips/" + f_result))))
return "../blips/" + f_result; // Return the cool kids variant
return "sfx-blip" + f_result; // Return legacy variant
}
return f_result;
}
QString AOApplication::get_chat(QString p_char)
{
if (p_char == "default")
return "default";
QString f_result = read_char_ini(p_char, "chat", "Options");
// handling the correct order of chat is a bit complicated, we let the caller
// do it
return f_result;
}
QString AOApplication::get_chat_font(QString p_char)
{
QString f_result = read_char_ini(p_char, "chat_font", "Options");
return f_result;
}
int AOApplication::get_chat_size(QString p_char)
{
QString f_result = read_char_ini(p_char, "chat_size", "Options");
if (f_result == "")
return -1;
return f_result.toInt();
}
QString AOApplication::get_char_shouts(QString p_char)
{
QString f_result = read_char_ini(p_char, "shouts", "Options");
if (f_result == "")
return current_theme; // The default option is the current theme.
return f_result;
}
int AOApplication::get_preanim_duration(QString p_char, QString p_emote)
{
QString f_result = read_char_ini(p_char, p_emote, "Time");
if (f_result == "")
return -1;
return f_result.toInt();
}
int AOApplication::get_ao2_preanim_duration(QString p_char, QString p_emote)
{
QString f_result = read_char_ini(p_char, "%" + p_emote, "Time");
if (f_result == "")
return -1;
return f_result.toInt();
}
int AOApplication::get_emote_number(QString p_char)
{
QString f_result = read_char_ini(p_char, "number", "Emotions");
if (f_result == "")
return 0;
return f_result.toInt();
}
QString AOApplication::get_emote_comment(QString p_char, int p_emote)
{
QString f_result =
read_char_ini(p_char, QString::number(p_emote + 1), "Emotions");
QStringList result_contents = f_result.split("#");
if (result_contents.size() < 4) {
qDebug() << "W: misformatted char.ini: " << p_char << ", " << p_emote;
return "normal";
}
return result_contents.at(0);
}
QString AOApplication::get_pre_emote(QString p_char, int p_emote)
{
QString f_result =
read_char_ini(p_char, QString::number(p_emote + 1), "Emotions");
QStringList result_contents = f_result.split("#");
if (result_contents.size() < 4) {
qDebug() << "W: misformatted char.ini: " << p_char << ", " << p_emote;
return "";
}
return result_contents.at(1);
}
QString AOApplication::get_emote(QString p_char, int p_emote)
{
QString f_result =
read_char_ini(p_char, QString::number(p_emote + 1), "Emotions");
QStringList result_contents = f_result.split("#");
if (result_contents.size() < 4) {
qDebug() << "W: misformatted char.ini: " << p_char << ", " << p_emote;
return "normal";
}
return result_contents.at(2);
}
int AOApplication::get_emote_mod(QString p_char, int p_emote)
{
QString f_result =
read_char_ini(p_char, QString::number(p_emote + 1), "Emotions");
QStringList result_contents = f_result.split("#");
if (result_contents.size() < 4) {
qDebug() << "W: misformatted char.ini: " << p_char << ", "
<< QString::number(p_emote);
return 0;
}
return result_contents.at(3).toInt();
}
int AOApplication::get_desk_mod(QString p_char, int p_emote)
{
QString f_result =
read_char_ini(p_char, QString::number(p_emote + 1), "Emotions");
QStringList result_contents = f_result.split("#");
if (result_contents.size() < 5)
return -1;
QString string_result = result_contents.at(4);
if (string_result == "")
return -1;
return string_result.toInt();
}
QString AOApplication::get_sfx_name(QString p_char, int p_emote)
{
QString f_result =
read_char_ini(p_char, QString::number(p_emote + 1), "SoundN");
if (f_result == "")
return "1";
return f_result;
}
QString AOApplication::get_emote_blip(QString p_char, int p_emote)
{
QString f_result =
read_char_ini(p_char, QString::number(p_emote + 1), "SoundB");
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");
if (f_result == "")
return 1;
return f_result.toInt();
}
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");
qDebug() << f_result;
if (f_result == "")
return "0";
else
return f_result;
}
QString AOApplication::get_sfx_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("_FrameSFX"));
if (f_result == "")
return "";
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 "";
return f_result;
}
QString AOApplication::get_flash_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 "";
return f_result;
}
int AOApplication::get_text_delay(QString p_char, QString p_emote)
{
QString f_result = read_char_ini(p_char, p_emote, "stay_time");
if (f_result == "")
return -1;
return f_result.toInt();
}
QStringList AOApplication::get_theme_effects()
{
QString p_path = get_theme_path("effects/effects.ini");
QString default_path = get_default_theme_path("effects/effects.ini");
QStringList effects;
if (!file_exists(p_path)) {
p_path = default_path;
if (!file_exists(p_path))
return effects;
}
QStringList lines = read_file(p_path).split("\n");
foreach (QString effect, lines) {
effect = effect.split("=")[0].trimmed();
if (!effect.isEmpty() && !effects.contains(effect))
effects.append(effect);
}
return effects;
}
QStringList AOApplication::get_effects(QString p_char)
{
QString p_effect = read_char_ini(p_char, "effects", "Options");
QString p_path = get_base_path() + "misc/" + p_effect + "/effects.ini";
QStringList effects = get_theme_effects();
if (!file_exists(p_path))
return effects;
QStringList lines = read_file(p_path).split("\n");
foreach (QString effect, lines) {
effect = effect.split("=")[0].trimmed();
if (!effect.isEmpty() && !effects.contains(effect))
effects.append(effect);
}
return effects;
}
QString AOApplication::get_effect(QString effect, QString p_char,
QString p_folder)
{
QString p_effect = p_folder;
if (p_folder == "")
p_effect = read_char_ini(p_char, "effects", "Options");
QString p_path =
get_image_suffix(get_base_path() + "misc/" + p_effect + "/" + effect);
QString design_ini_path =
get_image_suffix(get_theme_path("effects/" + effect));
QString default_path =
get_image_suffix(get_default_theme_path("effects/" + effect));
if (!file_exists(p_path)) {
p_path = design_ini_path;
if (!file_exists(p_path)) {
p_path = default_path;
if (!file_exists(p_path)) {
return "";
}
}
}
return p_path;
}
QString AOApplication::get_effect_sound(QString fx_name, QString p_char)
{
QString p_effect = read_char_ini(p_char, "effects", "Options");
QString p_path = get_base_path() + "misc/" + p_effect + "/effects.ini";
QString design_ini_path = get_theme_path("effects/effects.ini");
QString default_path = get_default_theme_path("effects/effects.ini");
QString f_result = read_design_ini(fx_name, p_path);
if (f_result == "") {
f_result = read_design_ini(fx_name, design_ini_path);
if (f_result == "") {
f_result = read_design_ini(fx_name, default_path);
}
}
if (fx_name == "realization") {
f_result = get_custom_realization(p_char);
}
return f_result;
}
QString AOApplication::get_custom_realization(QString p_char)
{
QString f_result = read_char_ini(p_char, "realization", "Options");
if (f_result == "")
return get_sfx("realization");
else
return get_sfx_suffix(get_sounds_path(f_result));
}
bool AOApplication::get_blank_blip()
{
QString result = configini->value("blank_blip", "false").value<QString>();
return result.startsWith("true");
}
bool AOApplication::get_looping_sfx()
{
QString result = configini->value("looping_sfx", "true").value<QString>();
return result.startsWith("true");
}
bool AOApplication::objection_stop_music()
{
QString result =
configini->value("objection_stop_music", "false").value<QString>();
return result.startsWith("true");
}
bool AOApplication::is_instant_objection_enabled()
{
QString result = configini->value("instant_objection", "true").value<QString>();
return result.startsWith("true");
}
bool AOApplication::is_desyncrhonized_logs_enabled()
{
QString result = configini->value("desync_logs", "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_shake_enabled()
{
QString result = configini->value("shake", "true").value<QString>();
return result.startsWith("true");
}
bool AOApplication::is_effects_enabled()
{
QString result = configini->value("effects", "true").value<QString>();
return result.startsWith("true");
}
bool AOApplication::is_frame_network_enabled()
{
QString result = configini->value("framenetwork", "true").value<QString>();
return result.startsWith("true");
}
bool AOApplication::is_colorlog_enabled()
{
QString result = configini->value("colorlog", "true").value<QString>();
return result.startsWith("true");
}
bool AOApplication::is_stickysounds_enabled()
{
QString result = configini->value("stickysounds", "false").value<QString>();
return result.startsWith("true");
}
bool AOApplication::is_stickyeffects_enabled()
{
QString result = configini->value("stickyeffects", "false").value<QString>();
return result.startsWith("true");
}
bool AOApplication::is_stickypres_enabled()
{
QString result = configini->value("stickypres", "false").value<QString>();
return result.startsWith("true");
}
bool AOApplication::is_customchat_enabled()
{
QString result = configini->value("customchat", "true").value<QString>();
return result.startsWith("true");
}
bool AOApplication::get_casing_enabled()
{
QString result = configini->value("casing_enabled", "false").value<QString>();
return result.startsWith("true");
}
bool AOApplication::get_casing_defence_enabled()
{
QString result =
configini->value("casing_defence_enabled", "false").value<QString>();
return result.startsWith("true");
}
bool AOApplication::get_casing_prosecution_enabled()
{
QString result =
configini->value("casing_prosecution_enabled", "false").value<QString>();
return result.startsWith("true");
}
bool AOApplication::get_casing_judge_enabled()
{
QString result =
configini->value("casing_judge_enabled", "false").value<QString>();
return result.startsWith("true");
}
bool AOApplication::get_casing_juror_enabled()
{
QString result =
configini->value("casing_juror_enabled", "false").value<QString>();
return result.startsWith("true");
}
bool AOApplication::get_casing_steno_enabled()
{
QString result =
configini->value("casing_steno_enabled", "false").value<QString>();
return result.startsWith("true");
}
bool AOApplication::get_casing_cm_enabled()
{
QString result =
configini->value("casing_cm_enabled", "false").value<QString>();
return result.startsWith("true");
}
QString AOApplication::get_casing_can_host_cases()
{
QString result =
configini->value("casing_can_host_cases", "Turnabout Check Your Settings")
.value<QString>();
return result;
}
bool AOApplication::get_auto_logging_enabled()
{
QString result =
configini->value("automatic_logging_enabled", "true").value<QString>();
return result.startsWith("true");
}