-
Lobby::Lobby(AOApplication *p_ao_app) : QMainWindow()
{
ao_app = p_ao_app;
this->setWindowTitle("Attorney Online 2");
+ this->setWindowIcon(QIcon(":/logo.png"));
ui_background = new AOImage(this, ao_app);
ui_public_servers = new AOButton(this, ao_app);
@@ -52,6 +50,8 @@ Lobby::Lobby(AOApplication *p_ao_app) : QMainWindow()
connect(ui_chatmessage, SIGNAL(returnPressed()), this, SLOT(on_chatfield_return_pressed()));
connect(ui_cancel, SIGNAL(clicked()), ao_app, SLOT(loading_cancelled()));
+ ui_connect->setEnabled(false);
+
set_widgets();
}
@@ -265,21 +265,19 @@ void Lobby::on_connect_released()
void Lobby::on_about_clicked()
{
- call_notice("Attorney Online 2 is built using Qt 5.7\n\n"
- "Lead development:\n"
- "OmniTroid\n\n"
- "stonedDiscord\n"
- "longbyte1\n"
- "Supporting development:\n"
- "Fiercy\n\n"
- "UI design:\n"
- "Ruekasu\n"
- "Draxirch\n\n"
- "Special thanks:\n"
- "Unishred\n"
- "Argoneus\n"
- "Noevain\n"
- "Cronnicossy");
+ QString msg = tr("Attorney Online %1
"
+ "The courtroom drama simulator"
+ "Source code: "
+ ""
+ "https://github.com/AttorneyOnline/AO2-Client"
+ "
Major development:
"
+ "OmniTroid, stonedDiscord, longbyte1, gameboyprinter, Cerapter"
+ "
Special thanks:
"
+ "Remy, Iamgoofball, Hibiki, Qubrick (webAO), Ruekasu (UI design), "
+ "Draxirch (UI design), Unishred, Argoneus (tsuserver), Fiercy, "
+ "Noevain, Cronnicossy")
+ .arg(ao_app->get_version_string());
+ QMessageBox::about(this, "About", msg);
}
void Lobby::on_server_list_clicked(QModelIndex p_model)
@@ -315,6 +313,8 @@ void Lobby::on_server_list_clicked(QModelIndex p_model)
ui_player_count->setText("Offline");
+ ui_connect->setEnabled(false);
+
ao_app->net_manager->connect_to_server(f_server);
}
@@ -361,7 +361,7 @@ void Lobby::list_favorites()
void Lobby::append_chatmessage(QString f_name, QString f_message)
{
- ui_chatbox->append_chatmessage(f_name, f_message);
+ ui_chatbox->append_chatmessage(f_name, f_message, ao_app->get_color("ooc_default_color", "courtroom_design.ini").name());
}
void Lobby::append_error(QString f_message)
@@ -375,6 +375,11 @@ void Lobby::set_player_count(int players_online, int max_players)
ui_player_count->setText(f_string);
}
+void Lobby::enable_connect_button()
+{
+ ui_connect->setEnabled(true);
+}
+
Lobby::~Lobby()
{
diff --git a/lobby.h b/lobby.h
index 2d3aee5..19276a7 100644
--- a/lobby.h
+++ b/lobby.h
@@ -14,6 +14,9 @@
#include
#include
+#include
+#include
+
class AOApplication;
class Lobby : public QMainWindow
@@ -34,6 +37,7 @@ public:
void hide_loading_overlay(){ui_loading_background->hide();}
QString get_chatlog();
int get_selected_server();
+ void enable_connect_button();
void set_loading_value(int p_value);
diff --git a/main.cpp b/main.cpp
index 5696e2e..cf51b0a 100644
--- a/main.cpp
+++ b/main.cpp
@@ -5,9 +5,9 @@
#include "networkmanager.h"
#include "lobby.h"
#include "courtroom.h"
-
+#include
#include
-
+Q_IMPORT_PLUGIN(ApngImagePlugin);
int main(int argc, char *argv[])
{
#if QT_VERSION > QT_VERSION_CHECK(5, 6, 0)
@@ -16,10 +16,10 @@ int main(int argc, char *argv[])
// packages up to Qt 5.6, so this is conditional.
AOApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endif
+
AOApplication main_app(argc, argv);
main_app.construct_lobby();
main_app.net_manager->connect_to_master();
main_app.w_lobby->show();
-
return main_app.exec();
}
diff --git a/misc_functions.cpp b/misc_functions.cpp
index e767b2e..2352055 100644
--- a/misc_functions.cpp
+++ b/misc_functions.cpp
@@ -1,8 +1,5 @@
#include "misc_functions.h"
-#include
-#include
-
void delay(int p_milliseconds)
{
QTime dieTime = QTime::currentTime().addMSecs(p_milliseconds);
diff --git a/misc_functions.h b/misc_functions.h
index 0de2d8a..026c635 100644
--- a/misc_functions.h
+++ b/misc_functions.h
@@ -1,6 +1,9 @@
#ifndef MISC_FUNCTIONS_H
#define MISC_FUNCTIONS_H
+#include
+#include
+
void delay(int p_milliseconds);
#endif // MISC_FUNCTIONS_H
diff --git a/networkmanager.cpp b/networkmanager.cpp
index e7246fe..288a900 100644
--- a/networkmanager.cpp
+++ b/networkmanager.cpp
@@ -4,8 +4,6 @@
#include "debug_functions.h"
#include "lobby.h"
-#include
-
NetworkManager::NetworkManager(AOApplication *parent) : QObject(parent)
{
ao_app = parent;
@@ -21,10 +19,9 @@ NetworkManager::NetworkManager(AOApplication *parent) : QObject(parent)
QObject::connect(server_socket, SIGNAL(readyRead()), this, SLOT(handle_server_packet()));
QObject::connect(server_socket, SIGNAL(disconnected()), ao_app, SLOT(server_disconnected()));
- QString master_config = ao_app->read_config("master");
- if (master_config != "") {
+ QString master_config = ao_app->configini->value("master", "").value();
+ if (master_config != "")
ms_nosrv_hostname = master_config;
- }
}
NetworkManager::~NetworkManager()
diff --git a/networkmanager.h b/networkmanager.h
index 99987f3..e28abfd 100644
--- a/networkmanager.h
+++ b/networkmanager.h
@@ -21,6 +21,7 @@
#include
#include
#include
+#include
class NetworkManager : public QObject
{
diff --git a/packet_distribution.cpp b/packet_distribution.cpp
index 83faccf..954062e 100644
--- a/packet_distribution.cpp
+++ b/packet_distribution.cpp
@@ -7,9 +7,6 @@
#include "hardware_functions.h"
#include "debug_functions.h"
-#include
-#include
-
void AOApplication::ms_packet_received(AOPacket *p_packet)
{
p_packet->net_decode();
@@ -150,6 +147,10 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
improved_loading_enabled = false;
desk_mod_enabled = false;
evidence_enabled = false;
+ cccc_ic_support_enabled = false;
+ arup_enabled = false;
+ casing_alerts_enabled = false;
+ modcall_reason_enabled = false;
//workaround for tsuserver4
if (f_contents.at(0) == "NOENCRYPT")
@@ -177,7 +178,12 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
goto end;
if (courtroom_constructed)
- w_courtroom->append_server_chatmessage(f_contents.at(0), f_contents.at(1));
+ {
+ if (f_contents.size() == 3)
+ w_courtroom->append_server_chatmessage(f_contents.at(0), f_contents.at(1), f_contents.at(2));
+ else
+ w_courtroom->append_server_chatmessage(f_contents.at(0), f_contents.at(1), "0");
+ }
}
else if (header == "FL")
{
@@ -195,6 +201,16 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
desk_mod_enabled = true;
if (f_packet.contains("evidence",Qt::CaseInsensitive))
evidence_enabled = true;
+ if (f_packet.contains("cccc_ic_support",Qt::CaseInsensitive))
+ cccc_ic_support_enabled = true;
+ if (f_packet.contains("arup",Qt::CaseInsensitive))
+ arup_enabled = true;
+ if (f_packet.contains("casing_alerts",Qt::CaseInsensitive))
+ casing_alerts_enabled = true;
+ if (f_packet.contains("modcall_reason",Qt::CaseInsensitive))
+ modcall_reason_enabled = true;
+
+ w_lobby->enable_connect_button();
}
else if (header == "PN")
{
@@ -218,6 +234,7 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
loaded_chars = 0;
loaded_evidence = 0;
loaded_music = 0;
+ generated_chars = 0;
destruct_courtroom();
construct_courtroom();
@@ -233,7 +250,7 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
if (selected_server >= 0 && selected_server < server_list.size()) {
auto info = server_list.at(selected_server);
server_name = info.name;
- server_address = info.ip + info.port;
+ server_address = QString("%1:%2").arg(info.ip, info.port);
window_title += ": " + server_name;
}
}
@@ -264,7 +281,7 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
QCryptographicHash hash(QCryptographicHash::Algorithm::Sha256);
hash.addData(server_address.toUtf8());
- if(is_discord_enabled())
+ if (is_discord_enabled())
discord->state_server(server_name.toStdString(), hash.result().toBase64().toStdString());
}
else if (header == "CI")
@@ -272,8 +289,6 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
if (!courtroom_constructed)
goto end;
- int total_loading_size = char_list_size + evidence_list_size + music_list_size;
-
for (int n_element = 0 ; n_element < f_contents.size() ; n_element += 2)
{
if (f_contents.at(n_element).toInt() != loaded_chars)
@@ -300,7 +315,8 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
w_courtroom->append_char(f_char);
- int loading_value = (loaded_chars / static_cast(total_loading_size)) * 100;
+ 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(total_loading_size)) * 100);
w_lobby->set_loading_value(loading_value);
}
@@ -343,8 +359,8 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
w_courtroom->append_evidence(f_evi);
- int total_loading_size = char_list_size + evidence_list_size + music_list_size;
- int loading_value = ((loaded_chars + loaded_evidence) / static_cast(total_loading_size)) * 100;
+ 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(total_loading_size)) * 100);
w_lobby->set_loading_value(loading_value);
QString next_packet_number = QString::number(loaded_evidence);
@@ -356,7 +372,8 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
if (!courtroom_constructed)
goto end;
- int total_loading_size = char_list_size + evidence_list_size + music_list_size;
+ bool musics_time = false;
+ int areas = 0;
for (int n_element = 0 ; n_element < f_contents.size() ; n_element += 2)
{
@@ -372,12 +389,40 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
w_lobby->set_loading_text("Loading music:\n" + QString::number(loaded_music) + "/" + QString::number(music_list_size));
- w_courtroom->append_music(f_music);
+ if (musics_time)
+ {
+ w_courtroom->append_music(f_music);
+ }
+ else
+ {
+ if (f_music.endsWith(".wav") ||
+ f_music.endsWith(".mp3") ||
+ f_music.endsWith(".mp4") ||
+ f_music.endsWith(".ogg") ||
+ f_music.endsWith(".opus"))
+ {
+ musics_time = true;
+ areas--;
+ w_courtroom->fix_last_area();
+ w_courtroom->append_music(f_music);
+ }
+ else
+ {
+ w_courtroom->append_area(f_music);
+ areas++;
+ }
+ }
- int loading_value = ((loaded_chars + loaded_evidence + loaded_music) / static_cast(total_loading_size)) * 100;
+ 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(total_loading_size)) * 100);
w_lobby->set_loading_value(loading_value);
-
}
+
QString next_packet_number = QString::number(((loaded_music - 1) / 10) + 1);
send_server_packet(new AOPacket("AM#" + next_packet_number + "#%"));
}
@@ -400,8 +445,6 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
if (!courtroom_constructed)
goto end;
- int total_loading_size = char_list_size + evidence_list_size + music_list_size;
-
for (int n_element = 0 ; n_element < f_contents.size() ; ++n_element)
{
QStringList sub_elements = f_contents.at(n_element).split("&");
@@ -420,7 +463,8 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
w_courtroom->append_char(f_char);
- int loading_value = ((loaded_chars + loaded_evidence + loaded_music) / static_cast(total_loading_size)) * 100;
+ 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(total_loading_size)) * 100);
w_lobby->set_loading_value(loading_value);
}
@@ -431,7 +475,8 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
if (!courtroom_constructed)
goto end;
- int total_loading_size = char_list_size + evidence_list_size + music_list_size;
+ bool musics_time = false;
+ int areas = 0;
for (int n_element = 0 ; n_element < f_contents.size() ; ++n_element)
{
@@ -439,9 +484,37 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
w_lobby->set_loading_text("Loading music:\n" + QString::number(loaded_music) + "/" + QString::number(music_list_size));
- w_courtroom->append_music(f_contents.at(n_element));
+ 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"))
+ {
+ 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++;
+ }
+ }
- int loading_value = ((loaded_chars + loaded_evidence + loaded_music) / static_cast(total_loading_size)) * 100;
+ 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(total_loading_size)) * 100);
w_lobby->set_loading_value(loading_value);
}
@@ -455,6 +528,7 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
if (lobby_constructed)
w_courtroom->append_ms_chatmessage("", w_lobby->get_chatlog());
+ w_courtroom->character_loading_finished();
w_courtroom->done_received();
courtroom_loaded = true;
@@ -493,7 +567,13 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
if (f_contents.size() < 1)
goto end;
if (courtroom_constructed)
- w_courtroom->handle_wtce(f_contents.at(0));
+ {
+ if (f_contents.size() == 1)
+ w_courtroom->handle_wtce(f_contents.at(0), 0);
+ else if (f_contents.size() == 2) {
+ w_courtroom->handle_wtce(f_contents.at(0), f_contents.at(1).toInt());
+ }
+ }
}
else if (header == "HP")
{
@@ -524,6 +604,17 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
w_courtroom->set_evidence_list(f_evi_list);
}
}
+ else if (header == "ARUP")
+ {
+ if (courtroom_constructed)
+ {
+ int arup_type = f_contents.at(0).toInt();
+ for (int n_element = 1 ; n_element < f_contents.size() ; n_element++)
+ {
+ w_courtroom->arup_modify(arup_type, n_element - 1, f_contents.at(n_element));
+ }
+ }
+ }
else if (header == "IL")
{
if (courtroom_constructed && f_contents.size() > 0)
@@ -541,25 +632,23 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
}
else if (header == "KK")
{
- if (courtroom_constructed && f_contents.size() > 0)
+ if (courtroom_constructed && f_contents.size() >= 1)
{
- int f_cid = w_courtroom->get_cid();
- int remote_cid = f_contents.at(0).toInt();
-
- if (f_cid != remote_cid && remote_cid != -1)
- goto end;
-
- call_notice("You have been kicked.");
+ call_notice("You have been kicked from the server.\nReason: " + f_contents.at(0));
+ construct_lobby();
+ destruct_courtroom();
+ }
+ }
+ else if (header == "KB")
+ {
+ if (courtroom_constructed && f_contents.size() >= 1)
+ {
+ call_notice("You have been banned from the server.\nReason: " + f_contents.at(0));
construct_lobby();
destruct_courtroom();
}
}
- else if (header == "KB")
- {
- if (courtroom_constructed && f_contents.size() > 0)
- w_courtroom->set_ban(f_contents.at(0).toInt());
- }
else if (header == "BD")
{
call_notice("You are banned on this server.");
@@ -569,6 +658,11 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
if (courtroom_constructed && f_contents.size() > 0)
w_courtroom->mod_called(f_contents.at(0));
}
+ 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");
+ }
end:
diff --git a/path_functions.cpp b/path_functions.cpp
index 820c05a..7d40054 100644
--- a/path_functions.cpp
+++ b/path_functions.cpp
@@ -1,34 +1,40 @@
#include "aoapplication.h"
#include "courtroom.h"
#include "file_functions.h"
+
#include
-#include
#include
+#include
#ifdef BASE_OVERRIDE
#include "base_override.h"
#endif
-QString base_path = "";
+
+//this is a quite broad generalization
+//the most common OSes(mac and windows) are _usually_ case insensitive
+//however, there do exist mac installations with case sensitive filesystems
+//in that case, define CASE_SENSITIVE_FILESYSTEM and compile on a mac
+#if (defined (LINUX) || defined (__linux__))
+#define CASE_SENSITIVE_FILESYSTEM
+#endif
QString AOApplication::get_base_path()
{
- if (base_path == "")
- {
-#ifdef BASE_OVERRIDE
- base_path = base_override;
-#elif defined(ANDROID)
- QString sdcard_storage = getenv("SECONDARY_STORAGE");
- if (dir_exists(sdcard_storage + "/AO2/")){
- base_path = sdcard_storage + "/AO2/";
- }else{
- QString external_storage = getenv("EXTERNAL_STORAGE");
- base_path = external_storage + "/AO2/";
- }
+ QString base_path = "";
+#ifdef ANDROID
+ QString sdcard_storage = getenv("SECONDARY_STORAGE");
+ if (dir_exists(sdcard_storage + "/AO2/")){
+ base_path = sdcard_storage + "/AO2/";
+ }
+ else {
+ QString external_storage = getenv("EXTERNAL_STORAGE");
+ base_path = external_storage + "/AO2/";
+ }
#else
base_path = QDir::currentPath() + "/base/";
#endif
-}
- return base_path;
+
+ return base_path;
}
QString AOApplication::get_data_path()
@@ -36,72 +42,121 @@ QString AOApplication::get_data_path()
return get_base_path() + "data/";
}
-QString AOApplication::get_theme_path()
+QString AOApplication::get_default_theme_path(QString p_file)
{
- return get_base_path() + "themes/" + current_theme.toLower() + "/";
+ QString path = get_base_path() + "themes/default/" + p_file;
+#ifndef CASE_SENSITIVE_FILESYSTEM
+ return path;
+#else
+ return get_case_sensitive_path(path);
+#endif
}
-QString AOApplication::get_default_theme_path()
+QString AOApplication::get_custom_theme_path(QString p_theme, QString p_file)
{
- return get_base_path() + "themes/default/";
+ QString path = get_base_path() + "themes/" + p_theme + "/" + p_file;
+#ifndef CASE_SENSITIVE_FILESYSTEM
+ return path;
+#else
+ return get_case_sensitive_path(path);
+#endif
}
-QString AOApplication::get_character_path(QString p_character)
+QString AOApplication::get_theme_path(QString p_file)
{
- return get_base_path() + "characters/" + p_character.toLower() + "/";
+ QString path = get_base_path() + "themes/" + current_theme + "/" + p_file;
+#ifndef CASE_SENSITIVE_FILESYSTEM
+ return path;
+#else
+ return get_case_sensitive_path(path);
+#endif
}
-QString AOApplication::get_demothings_path()
+QString AOApplication::get_character_path(QString p_char, QString p_file)
{
- QString default_path = "misc/demothings/";
- QString alt_path = "misc/RosterImages";
- if (dir_exists(default_path))
- return get_base_path() + default_path;
- else if (dir_exists(alt_path))
- return get_base_path() + alt_path;
- else
- return get_base_path() + default_path;
+ QString path = get_base_path() + "characters/" + p_char + "/" + p_file;
+#ifndef CASE_SENSITIVE_FILESYSTEM
+ return path;
+#else
+ return get_case_sensitive_path(path);
+#endif
}
-QString AOApplication::get_sounds_path()
+
+QString AOApplication::get_sounds_path(QString p_file)
{
- return get_base_path() + "sounds/general/";
+ QString path = get_base_path() + "sounds/general/" + p_file;
+#ifndef CASE_SENSITIVE_FILESYSTEM
+ return path;
+#else
+ return get_case_sensitive_path(path);
+#endif
}
+
QString AOApplication::get_music_path(QString p_song)
{
- return get_base_path() + "sounds/music/" + p_song.toLower();
+ QString path = get_base_path() + "sounds/music/" + p_song;
+#ifndef CASE_SENSITIVE_FILESYSTEM
+ return path;
+#else
+ return get_case_sensitive_path(path);
+#endif
}
-QString AOApplication::get_background_path()
+QString AOApplication::get_background_path(QString p_file)
{
- if (courtroom_constructed)
- return w_courtroom->get_background_path();
- //this function being called when the courtroom isn't constructed makes no sense
- return "";
+ QString path = get_base_path() + "background/" + w_courtroom->get_current_background() + "/" + p_file;
+ if (courtroom_constructed) {
+#ifndef CASE_SENSITIVE_FILESYSTEM
+ return path;
+#else
+ return get_case_sensitive_path(path);
+#endif
+ }
+ return get_default_background_path(p_file);
}
-QString AOApplication::get_default_background_path()
+QString AOApplication::get_default_background_path(QString p_file)
{
- return get_base_path() + "background/default/";
+ QString path = get_base_path() + "background/default/" + p_file;
+#ifndef CASE_SENSITIVE_FILESYSTEM
+ return path;
+#else
+ return get_case_sensitive_path(path);
+#endif
}
-QString AOApplication::get_evidence_path()
+QString AOApplication::get_evidence_path(QString p_file)
{
- QString default_path = "evidence/";
- QString alt_path = "items/";
- if (dir_exists(default_path))
- return get_base_path() + default_path;
- else if (dir_exists(alt_path))
- return get_base_path() + alt_path;
- else
- return get_base_path() + default_path;
+ QString path = get_base_path() + "evidence/" + p_file;
+#ifndef CASE_SENSITIVE_FILESYSTEM
+ return path;
+#else
+ return get_case_sensitive_path(path);
+#endif
}
-QString Courtroom::get_background_path()
-{
- return ao_app->get_base_path() + "background/" + current_background.toLower() + "/";
-}
+QString AOApplication::get_case_sensitive_path(QString p_file) {
+ //first, check to see if it's actually there (also serves as base case for recursion)
+ if (exists(p_file)) return p_file;
-QString Courtroom::get_default_background_path()
-{
- return ao_app->get_base_path() + "background/default/";
+ QFileInfo file(p_file);
+
+ QString file_basename = file.fileName();
+ QString file_parent_dir = get_case_sensitive_path(file.absolutePath());
+
+ //second, does it exist in the new parent dir?
+ if (exists(file_parent_dir + "/" + file_basename))
+ return file_parent_dir + "/" + file_basename;
+
+ //last resort, dirlist parent dir and find case insensitive match
+ QRegExp file_rx = QRegExp(file_basename, Qt::CaseInsensitive);
+ QStringList files = QDir(file_parent_dir).entryList();
+
+ int result = files.indexOf(file_rx);
+
+ if (result != -1)
+ return file_parent_dir + "/" + files.at(result);
+
+ //if nothing is found, let the caller handle the missing file
+ return file_parent_dir + "/" + file_basename;
}
diff --git a/resources.qrc b/resources.qrc
index d0c2f22..51f3693 100644
--- a/resources.qrc
+++ b/resources.qrc
@@ -1,5 +1,6 @@
-
- resource/fonts/Ace-Attorney.ttf
+
+ resource/fonts/Ace-Attorney.ttf
+ logo.png
diff --git a/text_file_functions.cpp b/text_file_functions.cpp
index 1aebc35..afe8fc3 100644
--- a/text_file_functions.cpp
+++ b/text_file_functions.cpp
@@ -1,98 +1,72 @@
-#include "aoapplication.h"
-
-#include "file_functions.h"
-
-#include
-#include
-#include
-#include
-#include
-
-QString AOApplication::read_config(QString searchline)
-{
- QString return_value = "";
-
- QFile config_file(get_base_path() + "config.ini");
- if (!config_file.open(QIODevice::ReadOnly))
- return return_value;
-
- QTextStream in(&config_file);
-
- while(!in.atEnd())
- {
- QString f_line = in.readLine().trimmed();
-
- if (!f_line.startsWith(searchline))
- continue;
-
- QStringList line_elements = f_line.split("=");
-
- if (line_elements.at(0).trimmed() != searchline)
- continue;
-
- if (line_elements.size() < 2)
- continue;
-
- return_value = line_elements.at(1).trimmed();
- break;
- }
-
- config_file.close();
-
- return return_value;
-}
+#include "text_file_functions.h"
QString AOApplication::read_theme()
{
- QString result = read_config("theme");
-
- if (result == "")
- return "default";
- else
- return result;
-}
-
-QString AOApplication::get_ooc_name()
-{
- return read_config("ooc_name");
+ QString result = configini->value("theme", "default").value();
+ return result;
}
int AOApplication::read_blip_rate()
{
- QString result = read_config("blip_rate");
+ int result = configini->value("blip_rate", 1).toInt();
+ return result;
+}
- //note: the empty string converted to int will return 0
- if (result.toInt() <= 0)
- return 1;
- else
- return result.toInt();
+QString AOApplication::get_ooc_name()
+{
+ QString result = configini->value("ooc_name").value();
+ return result;
}
int AOApplication::get_default_music()
{
- QString f_result = read_config("default_music");
-
- if (f_result == "")
- return 50;
- else return f_result.toInt();
+ int result = configini->value("default_music", 50).toInt();
+ return result;
}
int AOApplication::get_default_sfx()
{
- QString f_result = read_config("default_sfx");
-
- if (f_result == "")
- return 50;
- else return f_result.toInt();
+ int result = configini->value("default_sfx", 50).toInt();
+ return result;
}
int AOApplication::get_default_blip()
{
- QString f_result = read_config("default_blip");
+ int result = configini->value("default_blip", 50).toInt();
+ return result;
+}
- if (f_result == "")
- return 50;
- else return f_result.toInt();
+int AOApplication::get_max_log_size()
+{
+ int result = configini->value("log_maximum", 200).toInt();
+ return result;
+}
+
+bool AOApplication::get_log_goes_downwards()
+{
+ QString result = configini->value("log_goes_downwards", "false").value();
+ return result.startsWith("true");
+}
+
+bool AOApplication::get_showname_enabled_by_default()
+{
+ QString result = configini->value("show_custom_shownames", "false").value();
+ return result.startsWith("true");
+}
+
+QString AOApplication::get_default_username()
+{
+ QString result = configini->value("default_username", "").value();
+ 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();
+ return result;
}
QStringList AOApplication::get_call_words()
@@ -174,46 +148,19 @@ QVector AOApplication::read_serverlist_txt()
QString AOApplication::read_design_ini(QString p_identifier, QString p_design_path)
{
- QFile design_ini;
-
- design_ini.setFileName(p_design_path);
-
- if (!design_ini.open(QIODevice::ReadOnly))
- {
- return "";
+ 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();
}
- QTextStream in(&design_ini);
-
- QString result = "";
-
- while (!in.atEnd())
- {
- QString f_line = in.readLine().trimmed();
-
- if (!f_line.startsWith(p_identifier))
- continue;
-
- QStringList line_elements = f_line.split("=");
-
- if (line_elements.at(0).trimmed() != p_identifier)
- continue;
-
- if (line_elements.size() < 2)
- continue;
-
- result = line_elements.at(1).trimmed();
- break;
- }
-
- design_ini.close();
-
- return result;
}
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 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;
@@ -242,8 +189,8 @@ QPoint AOApplication::get_button_spacing(QString p_identifier, QString p_file)
pos_size_type AOApplication::get_element_dimensions(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 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);
pos_size_type return_value;
@@ -276,8 +223,8 @@ pos_size_type AOApplication::get_element_dimensions(QString p_identifier, QStrin
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 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 == "")
@@ -293,12 +240,77 @@ int AOApplication::get_font_size(QString p_identifier, QString p_file)
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 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;
+}
+
+QColor AOApplication::get_chat_color(QString p_identifier, QString p_chat)
+{
QColor return_color(255, 255, 255);
+ if (p_identifier == "_inline_grey")
+ {
+ return_color = QColor(187, 187, 187);
+ }
+ else
+ {
+ switch (p_identifier.toInt()) {
+ case 1:
+ return_color = QColor(0, 255, 0);
+ break;
+ case 2:
+ return_color = QColor(255, 0, 0);
+ break;
+ case 3:
+ return_color = QColor(255, 165, 0);
+ break;
+ case 4:
+ return_color = QColor(45, 150, 255);
+ break;
+ case 5:
+ return_color = QColor(255, 255, 0);
+ break;
+ case 7:
+ return_color = QColor(255, 192, 203);
+ break;
+ case 8:
+ return_color = QColor(0, 255, 255);
+ break;
+ case 0:
+ case 6: // 6 is rainbow.
+ default:
+ return_color = QColor(255, 255, 255);
+ break;
+ }
+ }
+
+ p_identifier = p_identifier.prepend("c");
+ QString design_ini_path = get_base_path() + "misc/" + 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);
@@ -321,8 +333,8 @@ QColor AOApplication::get_color(QString p_identifier, QString p_file)
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 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 = "";
@@ -340,61 +352,46 @@ QString AOApplication::get_sfx(QString p_identifier)
return return_sfx;
}
+QString AOApplication::get_sfx_suffix(QString sound_to_check)
+{
+ QString mp3_check = get_sounds_path(sound_to_check + ".mp3");
+ QString opus_check = get_sounds_path(sound_to_check + ".opus");
+ if (file_exists(opus_check))
+ {
+ return sound_to_check + ".opus";
+ }
+ else if (file_exists(mp3_check))
+ {
+ return sound_to_check + ".mp3";
+ }
+ return sound_to_check + ".wav";
+}
+
+QString AOApplication::get_image_suffix(QString path_to_check)
+{
+ QString apng_check = get_sounds_path(path_to_check + ".apng");
+ if (file_exists(apng_check))
+ {
+ return path_to_check + ".apng";
+ }
+ return path_to_check + ".gif";
+}
+
+
//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, QString terminator_tag)
+QString AOApplication::read_char_ini(QString p_char, QString p_search_line, QString target_tag)
{
- QString char_ini_path = get_character_path(p_char) + "char.ini";
-
- QFile char_ini;
-
- char_ini.setFileName(char_ini_path);
-
- if (!char_ini.open(QIODevice::ReadOnly))
- return "";
-
- QTextStream in(&char_ini);
-
- bool tag_found = false;
-
- while(!in.atEnd())
- {
- QString line = in.readLine();
-
- if (QString::compare(line, terminator_tag, Qt::CaseInsensitive) == 0)
- break;
-
- if (line.startsWith(target_tag, Qt::CaseInsensitive))
- {
- tag_found = true;
- continue;
- }
-
- if (!line.startsWith(p_search_line, Qt::CaseInsensitive))
- continue;
-
- QStringList line_elements = line.split("=");
-
- if (QString::compare(line_elements.at(0).trimmed(), p_search_line, Qt::CaseInsensitive) != 0)
- continue;
-
- if (line_elements.size() < 2)
- continue;
-
- if (tag_found)
- {
- char_ini.close();
- return line_elements.at(1).trimmed();
- }
- }
-
- char_ini.close();
- return "";
+ 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;
}
QString AOApplication::get_char_name(QString p_char)
{
- QString f_result = read_char_ini(p_char, "name", "[Options]", "[Time]");
+ QString f_result = read_char_ini(p_char, "name", "Options");
if (f_result == "")
return p_char;
@@ -403,8 +400,11 @@ QString AOApplication::get_char_name(QString p_char)
QString AOApplication::get_showname(QString p_char)
{
- QString f_result = read_char_ini(p_char, "showname", "[Options]", "[Time]");
+ 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;
else return f_result;
@@ -412,7 +412,7 @@ QString AOApplication::get_showname(QString p_char)
QString AOApplication::get_char_side(QString p_char)
{
- QString f_result = read_char_ini(p_char, "side", "[Options]", "[Time]");
+ QString f_result = read_char_ini(p_char, "side", "Options");
if (f_result == "")
return "wit";
@@ -421,7 +421,7 @@ QString AOApplication::get_char_side(QString p_char)
QString AOApplication::get_gender(QString p_char)
{
- QString f_result = read_char_ini(p_char, "gender", "[Options]", "[Time]");
+ QString f_result = read_char_ini(p_char, "gender", "Options");
if (f_result == "")
return "male";
@@ -430,22 +430,22 @@ QString AOApplication::get_gender(QString p_char)
QString AOApplication::get_chat(QString p_char)
{
- QString f_result = read_char_ini(p_char, "chat", "[Options]", "[Time]");
+ 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.toLower();
+ return f_result;
}
QString AOApplication::get_char_shouts(QString p_char)
{
- QString f_result = read_char_ini(p_char, "shouts", "[Options]", "[Time]");
+ QString f_result = read_char_ini(p_char, "shouts", "Options");
- return f_result.toLower();
+ 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]", "[Emotions]");
+ QString f_result = read_char_ini(p_char, p_emote, "Time");
if (f_result == "")
return -1;
@@ -454,7 +454,7 @@ int AOApplication::get_preanim_duration(QString p_char, QString p_emote)
int AOApplication::get_ao2_preanim_duration(QString p_char, QString p_emote)
{
- QString f_result = read_char_ini(p_char, "%" + p_emote, "[Time]", "[Emotions]");
+ QString f_result = read_char_ini(p_char, "%" + p_emote, "Time");
if (f_result == "")
return -1;
@@ -463,7 +463,7 @@ int AOApplication::get_ao2_preanim_duration(QString p_char, QString p_emote)
int AOApplication::get_emote_number(QString p_char)
{
- QString f_result = read_char_ini(p_char, "number", "[Emotions]", "[SoundN]");
+ QString f_result = read_char_ini(p_char, "number", "Emotions");
if (f_result == "")
return 0;
@@ -472,7 +472,7 @@ int AOApplication::get_emote_number(QString p_char)
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]", "[SoundN]");
+ QString f_result = read_char_ini(p_char, QString::number(p_emote + 1), "Emotions");
QStringList result_contents = f_result.split("#");
@@ -486,7 +486,7 @@ QString AOApplication::get_emote_comment(QString p_char, int p_emote)
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]", "[SoundN]");
+ QString f_result = read_char_ini(p_char, QString::number(p_emote + 1), "Emotions");
QStringList result_contents = f_result.split("#");
@@ -500,7 +500,7 @@ QString AOApplication::get_pre_emote(QString p_char, int p_emote)
QString AOApplication::get_emote(QString p_char, int p_emote)
{
- QString f_result = read_char_ini(p_char, QString::number(p_emote + 1), "[Emotions]", "[SoundN]");
+ QString f_result = read_char_ini(p_char, QString::number(p_emote + 1), "Emotions");
QStringList result_contents = f_result.split("#");
@@ -514,7 +514,7 @@ QString AOApplication::get_emote(QString p_char, int p_emote)
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]", "[SoundN]");
+ QString f_result = read_char_ini(p_char, QString::number(p_emote + 1), "Emotions");
QStringList result_contents = f_result.split("#");
@@ -528,7 +528,7 @@ int AOApplication::get_emote_mod(QString p_char, int p_emote)
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]", "[SoundN]");
+ QString f_result = read_char_ini(p_char, QString::number(p_emote + 1), "Emotions");
QStringList result_contents = f_result.split("#");
@@ -544,7 +544,7 @@ int AOApplication::get_desk_mod(QString p_char, int p_emote)
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]", "[SoundT]");
+ QString f_result = read_char_ini(p_char, QString::number(p_emote + 1), "SoundN");
if (f_result == "")
return "1";
@@ -553,7 +553,7 @@ QString AOApplication::get_sfx_name(QString p_char, int p_emote)
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]", "[TextDelay]");
+ QString f_result = read_char_ini(p_char, QString::number(p_emote + 1), "SoundT");
if (f_result == "")
return 1;
@@ -562,28 +562,78 @@ int AOApplication::get_sfx_delay(QString p_char, int p_emote)
int AOApplication::get_text_delay(QString p_char, QString p_emote)
{
- QString f_result = read_char_ini(p_char, p_emote, "[TextDelay]", "END_OF_FILE");
+ QString f_result = read_char_ini(p_char, p_emote, "TextDelay");
if (f_result == "")
return -1;
else return f_result.toInt();
}
+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 f_result;
+}
+
bool AOApplication::get_blank_blip()
{
- QString f_result = read_config("blank_blip");
-
- return f_result.startsWith("true");
+ QString result = configini->value("blank_blip", "false").value();
+ return result.startsWith("true");
}
bool AOApplication::is_discord_enabled()
{
- QString f_result = read_config("discord");
- return !f_result.startsWith("false");
+ QString result = configini->value("discord", "true").value();
+ return result.startsWith("true");
}
-bool AOApplication::ic_scroll_down_enabled()
+bool AOApplication::get_casing_enabled()
{
- QString f_result = read_config("ic_scroll_down");
- return f_result.startsWith("true");
-}
\ No newline at end of file
+ QString result = configini->value("casing_enabled", "false").value();
+ return result.startsWith("true");
+}
+
+bool AOApplication::get_casing_defence_enabled()
+{
+ QString result = configini->value("casing_defence_enabled", "false").value();
+ return result.startsWith("true");
+}
+
+bool AOApplication::get_casing_prosecution_enabled()
+{
+ QString result = configini->value("casing_prosecution_enabled", "false").value();
+ return result.startsWith("true");
+}
+
+bool AOApplication::get_casing_judge_enabled()
+{
+ QString result = configini->value("casing_judge_enabled", "false").value();
+ return result.startsWith("true");
+}
+
+bool AOApplication::get_casing_juror_enabled()
+{
+ QString result = configini->value("casing_juror_enabled", "false").value();
+ return result.startsWith("true");
+}
+
+bool AOApplication::get_casing_steno_enabled()
+{
+ QString result = configini->value("casing_steno_enabled", "false").value();
+ return result.startsWith("true");
+}
+
+bool AOApplication::get_casing_cm_enabled()
+{
+ QString result = configini->value("casing_cm_enabled", "false").value();
+ return result.startsWith("true");
+}
+
+QString AOApplication::get_casing_can_host_cases()
+{
+ QString result = configini->value("casing_can_host_cases", "Turnabout Check Your Settings").value();
+ return result;
+}
diff --git a/text_file_functions.h b/text_file_functions.h
new file mode 100644
index 0000000..119f38e
--- /dev/null
+++ b/text_file_functions.h
@@ -0,0 +1,13 @@
+#ifndef TEXT_FILE_FUNCTIONS_H
+#define TEXT_FILE_FUNCTIONS_H
+
+#include "aoapplication.h"
+#include "file_functions.h"
+#include
+#include
+#include
+#include
+#include
+#include
+
+#endif // TEXT_FILE_FUNCTIONS_H