aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Attorney_Online.pro3
-rw-r--r--include/aoapplication.h4
-rw-r--r--include/aopacket.h4
-rw-r--r--include/courtroom.h12
-rw-r--r--include/encryption_functions.h15
-rw-r--r--include/hex_functions.h16
-rw-r--r--include/lobby.h1
-rw-r--r--src/aoimage.cpp15
-rw-r--r--src/aopacket.cpp20
-rw-r--r--src/aosfxplayer.cpp9
-rw-r--r--src/charselect.cpp6
-rw-r--r--src/courtroom.cpp247
-rw-r--r--src/encryption_functions.cpp58
-rw-r--r--src/hex_functions.cpp17
-rw-r--r--src/lobby.cpp8
-rw-r--r--src/packet_distribution.cpp183
16 files changed, 230 insertions, 388 deletions
diff --git a/Attorney_Online.pro b/Attorney_Online.pro
index d2c20624..b9722b1d 100644
--- a/Attorney_Online.pro
+++ b/Attorney_Online.pro
@@ -15,6 +15,9 @@ HEADERS += $$files($$PWD/include/*.h)
LIBS += -L$$PWD/lib
+# Uncomment for verbose network logging
+# DEFINES += DEBUG_NETWORK
+
# Uncomment to enable Discord Rich Presence
# DEFINES += DISCORD
diff --git a/include/aoapplication.h b/include/aoapplication.h
index 60d945ec..c06f3f96 100644
--- a/include/aoapplication.h
+++ b/include/aoapplication.h
@@ -63,14 +63,10 @@ public:
/////////////////server metadata//////////////////
- unsigned int s_decryptor = 5;
- bool encryption_needed = true;
-
bool yellow_text_enabled = false;
bool prezoom_enabled = false;
bool flipping_enabled = false;
bool custom_objection_enabled = false;
- bool improved_loading_enabled = false;
bool desk_mod_enabled = false;
bool evidence_enabled = false;
bool cccc_ic_support_enabled = false;
diff --git a/include/aopacket.h b/include/aopacket.h
index 4097be86..e6369982 100644
--- a/include/aopacket.h
+++ b/include/aopacket.h
@@ -15,14 +15,10 @@ public:
QStringList &get_contents() { return m_contents; }
QString to_string();
- void encrypt_header(unsigned int p_key);
- void decrypt_header(unsigned int p_key);
-
void net_encode();
void net_decode();
private:
- bool encrypted = false;
QString m_header;
QStringList m_contents;
diff --git a/include/courtroom.h b/include/courtroom.h
index 38621c82..f05b15ac 100644
--- a/include/courtroom.h
+++ b/include/courtroom.h
@@ -280,9 +280,12 @@ private:
// The character ID of the character this user wants to appear alongside with.
int other_charid = -1;
- // The offset this user has given if they want to appear alongside someone.
+ // The horizontal offset this user has given if they want to appear alongside someone.
int char_offset = 0;
+ // The vertical offset this user has given.
+ int char_vert_offset = 0;
+
// 0 = in front, 1 = behind
int pair_order = 0;
@@ -424,8 +427,12 @@ private:
// List of all currently available pos
QStringList pos_dropdown_list;
+ // is the message we're about to send supposed to present evidence?
bool is_presenting_evidence = false;
+ // have we already presented evidence for this message?
+ bool evidence_presented = false;
+
QString effect = "";
// Music effect flags we want to send to server when we play music
@@ -520,6 +527,7 @@ private:
AOButton *ui_pair_button;
QListWidget *ui_pair_list;
QSpinBox *ui_pair_offset_spinbox;
+ QSpinBox *ui_pair_vert_offset_spinbox;
QComboBox *ui_pair_order_dropdown;
@@ -701,6 +709,7 @@ private slots:
void music_random();
void music_list_expand_all();
void music_list_collapse_all();
+ void music_stop();
void on_area_list_double_clicked(QTreeWidgetItem *p_item, int column);
void select_emote(int p_id);
@@ -774,6 +783,7 @@ private slots:
void on_log_limit_changed(int value);
void on_pair_offset_changed(int value);
+ void on_pair_vert_offset_changed(int value);
void on_ooc_toggle_clicked();
diff --git a/include/encryption_functions.h b/include/encryption_functions.h
deleted file mode 100644
index b70e8e65..00000000
--- a/include/encryption_functions.h
+++ /dev/null
@@ -1,15 +0,0 @@
-#ifndef ENCRYPTION_FUNCTIONS_H
-#define ENCRYPTION_FUNCTIONS_H
-
-#include <QString>
-
-#include <QVector>
-#include <cstddef>
-#include <iomanip>
-#include <sstream>
-#include <stdlib.h>
-
-QString fanta_encrypt(QString p_input, unsigned int key);
-QString fanta_decrypt(QString p_input, unsigned int key);
-
-#endif // ENCRYPTION_FUNCTIONS_H
diff --git a/include/hex_functions.h b/include/hex_functions.h
deleted file mode 100644
index d178ba1b..00000000
--- a/include/hex_functions.h
+++ /dev/null
@@ -1,16 +0,0 @@
-#ifndef HEX_OPERATIONS_H
-#define HEX_OPERATIONS_H
-
-#include <algorithm>
-#include <bitset>
-#include <cstdint>
-#include <iomanip>
-#include <iostream>
-#include <sstream>
-#include <string>
-
-namespace omni {
-std::string int_to_hex(unsigned int input);
-}
-
-#endif // HEX_OPERATIONS_H
diff --git a/include/lobby.h b/include/lobby.h
index 42f52977..4278534c 100644
--- a/include/lobby.h
+++ b/include/lobby.h
@@ -46,6 +46,7 @@ public:
void set_loading_value(int p_value);
bool public_servers_selected = true;
+ bool doubleclicked = false;
~Lobby();
diff --git a/src/aoimage.cpp b/src/aoimage.cpp
index 2663ba05..3977c979 100644
--- a/src/aoimage.cpp
+++ b/src/aoimage.cpp
@@ -2,6 +2,8 @@
#include "aoimage.h"
+#include <QBitmap>
+
AOImage::AOImage(QWidget *parent, AOApplication *p_ao_app) : QLabel(parent)
{
m_parent = parent;
@@ -29,9 +31,10 @@ bool AOImage::set_image(QString p_image)
}
QPixmap f_pixmap(final_image_path);
-
- this->setPixmap(
- f_pixmap.scaled(this->width(), this->height(), Qt::IgnoreAspectRatio));
+ f_pixmap =
+ f_pixmap.scaled(this->width(), this->height(), Qt::IgnoreAspectRatio);
+ this->setPixmap(f_pixmap);
+ this->setMask(f_pixmap.mask());
return true;
}
@@ -45,7 +48,9 @@ bool AOImage::set_chatbox(QString p_path)
QPixmap f_pixmap(p_path);
- this->setPixmap(
- f_pixmap.scaled(this->width(), this->height(), Qt::IgnoreAspectRatio));
+ f_pixmap =
+ f_pixmap.scaled(this->width(), this->height(), Qt::IgnoreAspectRatio);
+ this->setPixmap(f_pixmap);
+ this->setMask(f_pixmap.mask());
return true;
}
diff --git a/src/aopacket.cpp b/src/aopacket.cpp
index 6afd39e7..4cf43e1d 100644
--- a/src/aopacket.cpp
+++ b/src/aopacket.cpp
@@ -1,7 +1,5 @@
#include "aopacket.h"
-#include "encryption_functions.h"
-
AOPacket::AOPacket(QString p_packet_string)
{
QStringList packet_contents = p_packet_string.split("#");
@@ -31,24 +29,8 @@ QString AOPacket::to_string()
f_string += "#%";
- if (encrypted)
- return "#" + f_string;
- else
- return f_string;
-}
-
-void AOPacket::encrypt_header(unsigned int p_key)
-{
- m_header = fanta_encrypt(m_header, p_key);
-
- encrypted = true;
-}
-
-void AOPacket::decrypt_header(unsigned int p_key)
-{
- m_header = fanta_decrypt(m_header, p_key);
- encrypted = false;
+ return f_string;
}
void AOPacket::net_encode()
diff --git a/src/aosfxplayer.cpp b/src/aosfxplayer.cpp
index 8c4f3c86..1a0e2d2f 100644
--- a/src/aosfxplayer.cpp
+++ b/src/aosfxplayer.cpp
@@ -37,11 +37,16 @@ void AOSfxPlayer::play(QString p_sfx, QString p_char, QString shout,
QString misc_path = "";
QString char_path = "";
+ QString theme_path = "";
QString sound_path = ao_app->get_sfx_suffix(ao_app->get_sounds_path(p_sfx));
- if (shout != "")
+ if (shout != "") {
misc_path = ao_app->get_sfx_suffix(ao_app->get_base_path() + "misc/" +
shout + "/" + p_sfx);
+ theme_path = ao_app->get_sfx_suffix(ao_app->get_theme_path(p_sfx));
+ if (!file_exists(theme_path))
+ theme_path = ao_app->get_sfx_suffix(ao_app->get_default_theme_path(p_sfx));
+ }
if (p_char != "")
char_path =
ao_app->get_sfx_suffix(ao_app->get_character_path(p_char, p_sfx));
@@ -52,6 +57,8 @@ void AOSfxPlayer::play(QString p_sfx, QString p_char, QString shout,
f_path = char_path;
else if (file_exists(misc_path))
f_path = misc_path;
+ else if (shout != "" && file_exists(theme_path)) //only check here for shouts
+ f_path = theme_path;
else
f_path = sound_path;
diff --git a/src/charselect.cpp b/src/charselect.cpp
index 8e0aab5e..b5439340 100644
--- a/src/charselect.cpp
+++ b/src/charselect.cpp
@@ -7,6 +7,8 @@
void Courtroom::construct_char_select()
{
+ this->setWindowFlags( (this->windowFlags() | Qt::CustomizeWindowHint) & ~Qt::WindowMaximizeButtonHint);
+
ui_char_select_background = new AOImage(this, ao_app);
ui_char_buttons = new QWidget(ui_char_select_background);
@@ -72,10 +74,10 @@ void Courtroom::set_char_select()
if (f_charselect.width < 0 || f_charselect.height < 0) {
qDebug() << "W: did not find char_select width or height in "
"courtroom_design.ini!";
- this->resize(714, 668);
+ this->setFixedSize(714, 668);
}
else
- this->resize(f_charselect.width, f_charselect.height);
+ this->setFixedSize(f_charselect.width, f_charselect.height);
ui_char_select_background->resize(f_charselect.width, f_charselect.height);
ui_char_select_background->set_image("charselect_background");
diff --git a/src/courtroom.cpp b/src/courtroom.cpp
index 13a9a6b7..ec4e47b4 100644
--- a/src/courtroom.cpp
+++ b/src/courtroom.cpp
@@ -3,6 +3,9 @@
Courtroom::Courtroom(AOApplication *p_ao_app) : QMainWindow()
{
ao_app = p_ao_app;
+
+ this->setWindowFlags( (this->windowFlags() | Qt::CustomizeWindowHint) & ~Qt::WindowMaximizeButtonHint);
+
ao_app->initBASS();
qsrand(static_cast<uint>(QDateTime::currentMSecsSinceEpoch() / 1000));
@@ -242,7 +245,10 @@ Courtroom::Courtroom(AOApplication *p_ao_app) : QMainWindow()
ui_pair_list = new QListWidget(this);
ui_pair_offset_spinbox = new QSpinBox(this);
ui_pair_offset_spinbox->setRange(-100, 100);
- ui_pair_offset_spinbox->setSuffix(tr("% offset"));
+ ui_pair_offset_spinbox->setSuffix(tr("% x offset"));
+ ui_pair_vert_offset_spinbox = new QSpinBox(this);
+ ui_pair_vert_offset_spinbox->setRange(-100, 100);
+ ui_pair_vert_offset_spinbox->setSuffix(tr("% y offset"));
ui_pair_order_dropdown = new QComboBox(this);
ui_pair_order_dropdown->addItem(tr("To front"));
@@ -386,6 +392,8 @@ Courtroom::Courtroom(AOApplication *p_ao_app) : QMainWindow()
SLOT(on_pair_list_clicked(QModelIndex)));
connect(ui_pair_offset_spinbox, SIGNAL(valueChanged(int)), this,
SLOT(on_pair_offset_changed(int)));
+ connect(ui_pair_vert_offset_spinbox, SIGNAL(valueChanged(int)), this,
+ SLOT(on_pair_vert_offset_changed(int)));
connect(ui_pair_order_dropdown, SIGNAL(currentIndexChanged(int)), this,
SLOT(on_pair_order_dropdown_changed(int)));
@@ -446,13 +454,13 @@ void Courtroom::set_widgets()
if (f_courtroom.width < 0 || f_courtroom.height < 0) {
qDebug() << "W: did not find courtroom width or height in " << filename;
- this->resize(714, 668);
+ this->setFixedSize(714, 668);
}
else {
m_courtroom_width = f_courtroom.width;
m_courtroom_height = f_courtroom.height;
- this->resize(f_courtroom.width, f_courtroom.height);
+ this->setFixedSize(f_courtroom.width, f_courtroom.height);
}
set_fonts();
@@ -552,7 +560,11 @@ void Courtroom::set_widgets()
log_maximum_blocks = ao_app->get_max_log_size();
- bool regenerate = log_goes_downwards != ao_app->get_log_goes_downwards() || log_colors != ao_app->is_colorlog_enabled() || log_newline != ao_app->get_log_newline() || log_margin != ao_app->get_log_margin() || log_timestamp != ao_app->get_log_timestamp();
+ bool regenerate = log_goes_downwards != ao_app->get_log_goes_downwards() ||
+ log_colors != ao_app->is_colorlog_enabled() ||
+ log_newline != ao_app->get_log_newline() ||
+ log_margin != ao_app->get_log_margin() ||
+ log_timestamp != ao_app->get_log_timestamp();
log_goes_downwards = ao_app->get_log_goes_downwards();
log_colors = ao_app->is_colorlog_enabled();
log_newline = ao_app->get_log_newline();
@@ -563,7 +575,8 @@ void Courtroom::set_widgets()
set_size_and_pos(ui_ic_chatlog, "ic_chatlog");
ui_ic_chatlog->setFrameShape(QFrame::NoFrame);
- ui_ic_chatlog->setPlaceholderText(log_goes_downwards ? "▼ Log goes down ▼" : "▲ Log goes up ▲");
+ ui_ic_chatlog->setPlaceholderText(log_goes_downwards ? "▼ Log goes down ▼"
+ : "▲ Log goes up ▲");
set_size_and_pos(ui_ms_chatlog, "ms_chatlog");
ui_ms_chatlog->setFrameShape(QFrame::NoFrame);
@@ -581,12 +594,18 @@ void Courtroom::set_widgets()
set_size_and_pos(ui_pair_offset_spinbox, "pair_offset_spinbox");
ui_pair_offset_spinbox->hide();
ui_pair_offset_spinbox->setToolTip(
- tr("Change the percentage offset of your character's position from the "
+ tr("Change the horizontal percentage offset of your character's position from the "
+ "center of the screen."));
+
+ set_size_and_pos(ui_pair_vert_offset_spinbox, "pair_vert_offset_spinbox");
+ ui_pair_vert_offset_spinbox->hide();
+ ui_pair_vert_offset_spinbox->setToolTip(
+ tr("Change the vertical percentage offset of your character's position from the "
"center of the screen."));
ui_pair_order_dropdown->hide();
set_size_and_pos(ui_pair_order_dropdown, "pair_order_dropdown");
- ui_pair_offset_spinbox->setToolTip(
+ ui_pair_order_dropdown->setToolTip(
tr("Change the order of appearance for your character."));
set_size_and_pos(ui_pair_button, "pair_button");
@@ -705,6 +724,8 @@ void Courtroom::set_widgets()
"the original character folder."));
ui_sfx_remove->hide();
+ set_iniswap_dropdown();
+
set_size_and_pos(ui_effects_dropdown, "effects_dropdown");
ui_effects_dropdown->setInsertPolicy(QComboBox::InsertAtBottom);
ui_effects_dropdown->setToolTip(
@@ -1525,6 +1546,9 @@ void Courtroom::on_chat_return_pressed()
if ((anim_state < 3 || text_state < 2) && objection_state == 0)
return;
+ ui_ic_chat_message->blockSignals(true);
+ QTimer::singleShot(600, this,
+ [=] { ui_ic_chat_message->blockSignals(false); });
// MS#
// deskmod#
// pre-emote#
@@ -1586,13 +1610,11 @@ void Courtroom::on_chat_return_pressed()
int f_emote_mod = ao_app->get_emote_mod(current_char, current_emote);
// needed or else legacy won't understand what we're saying
- if (objection_state > 0) {
- if (ui_pre->isChecked()) {
- if (f_emote_mod == 4 || f_emote_mod == 5)
- f_emote_mod = 6;
- else
- f_emote_mod = 2;
- }
+ if (objection_state > 0 && ui_pre->isChecked()) {
+ if (f_emote_mod == 4 || f_emote_mod == 5)
+ f_emote_mod = 6;
+ else
+ f_emote_mod = 2;
}
else if (ui_pre->isChecked() && !ui_pre_non_interrupt->isChecked()) {
if (f_emote_mod == 0)
@@ -1684,7 +1706,7 @@ void Courtroom::on_chat_return_pressed()
packet_contents.append("-1");
}
// Send the offset as it's gonna be used regardless
- packet_contents.append(QString::number(char_offset));
+ packet_contents.append(QString::number(char_offset) + "&" + QString::number(char_vert_offset));
// Finally, we send over if we want our pres to not interrupt.
if (ui_pre_non_interrupt->isChecked() && ui_pre->isChecked()) {
@@ -1752,6 +1774,7 @@ void Courtroom::reset_ic()
ui_vp_chat_arrow->stop();
text_state = 0;
anim_state = 0;
+ evidence_presented = false;
ui_vp_objection->stop();
chat_tick_timer->stop();
ui_vp_evidence_display->reset();
@@ -1853,10 +1876,10 @@ void Courtroom::handle_chatmessage(QStringList *p_contents)
m_chatmessage[MESSAGE] = ""; // Turn it into true blankpost
}
- if (!m_chatmessage[MESSAGE].isEmpty() || ic_chatlog_history.isEmpty() || ic_chatlog_history.last().get_message() != "")
- {
+ if (!m_chatmessage[MESSAGE].isEmpty() || ic_chatlog_history.isEmpty() ||
+ ic_chatlog_history.last().get_message() != "") {
log_ic_text(f_charname, f_displayname, m_chatmessage[MESSAGE], "",
- m_chatmessage[TEXT_COLOR].toInt());
+ m_chatmessage[TEXT_COLOR].toInt());
append_ic_text(m_chatmessage[MESSAGE], f_displayname, "",
m_chatmessage[TEXT_COLOR].toInt());
}
@@ -2074,10 +2097,19 @@ void Courtroom::handle_chatmessage_2()
if (got_other_charid > -1) {
// If there is, show them!
ui_vp_sideplayer_char->show();
-
- int other_offset = m_chatmessage[OTHER_OFFSET].toInt();
+ QStringList other_offsets = m_chatmessage[OTHER_OFFSET].split("&");
+ int other_offset;
+ int other_offset_v;
+ if (other_offsets.length() <= 1) {
+ other_offset = m_chatmessage[OTHER_OFFSET].toInt();
+ other_offset_v = 0;
+ }
+ else {
+ other_offset = other_offsets[0].toInt();
+ other_offset_v = other_offsets[1].toInt();
+ }
ui_vp_sideplayer_char->move(ui_viewport->width() * other_offset / 100,
- 0);
+ ui_viewport->height() * other_offset_v / 100);
QStringList args = m_chatmessage[OTHER_CHARID].split("^");
if (args.size() >
@@ -2116,12 +2148,14 @@ void Courtroom::handle_chatmessage_2()
}
// Set ourselves according to SELF_OFFSET
- bool ok;
- int self_offset = m_chatmessage[SELF_OFFSET].toInt(&ok);
- if (ok)
- ui_vp_player_char->move(ui_viewport->width() * self_offset / 100, 0);
- else
- ui_vp_player_char->move(0, 0);
+ QStringList self_offsets = m_chatmessage[SELF_OFFSET].split("&");
+ int self_offset = self_offsets[0].toInt();
+ int self_offset_v;
+ if (self_offsets.length() <= 1)
+ self_offset_v = 0;
+ else
+ self_offset_v = self_offsets[1].toInt();
+ ui_vp_player_char->move(ui_viewport->width() * self_offset / 100, ui_viewport->height() * self_offset_v / 100);
switch (emote_mod) {
case 1:
@@ -2244,7 +2278,8 @@ void Courtroom::handle_chatmessage_3()
.isEmpty()) // Pure whitespace showname, get outta here.
f_showname = m_chatmessage[CHAR_NAME];
- if (f_evi_id > 0 && f_evi_id <= local_evidence_list.size()) {
+ if (f_evi_id > 0 && f_evi_id <= local_evidence_list.size() &&
+ !evidence_presented) {
// shifted by 1 because 0 is no evidence per legacy standards
QString f_image = local_evidence_list.at(f_evi_id - 1).image;
QString f_evi_name = local_evidence_list.at(f_evi_id - 1).name;
@@ -2254,9 +2289,12 @@ void Courtroom::handle_chatmessage_3()
ui_vp_evidence_display->show_evidence(f_image, is_left_side,
ui_sfx_slider->value());
- log_ic_text(m_chatmessage[CHAR_NAME], m_chatmessage[SHOWNAME], f_evi_name, tr("has presented evidence"),
- m_chatmessage[TEXT_COLOR].toInt());
+ log_ic_text(m_chatmessage[CHAR_NAME], m_chatmessage[SHOWNAME], f_evi_name,
+ tr("has presented evidence"),
+ m_chatmessage[TEXT_COLOR].toInt());
append_ic_text(f_evi_name, f_showname, tr("has presented evidence"));
+ evidence_presented = true; // we're done presenting evidence, and we
+ // don't want to do it twice
}
int emote_mod = m_chatmessage[EMOTE_MOD].toInt();
@@ -2561,10 +2599,9 @@ QString Courtroom::filter_ic_text(QString p_text, bool html, int target_pos,
}
void Courtroom::log_ic_text(QString p_name, QString p_showname,
- QString p_message, QString p_action, int p_color)
+ QString p_message, QString p_action, int p_color)
{
- chatlogpiece log_entry(p_name, p_showname, p_message, p_action,
- p_color);
+ chatlogpiece log_entry(p_name, p_showname, p_message, p_action, p_color);
ic_chatlog_history.append(log_entry);
if (ao_app->get_auto_logging_enabled())
ao_app->append_to_file(log_entry.get_full(), ao_app->log_filename, true);
@@ -2589,9 +2626,12 @@ void Courtroom::append_ic_text(QString p_text, QString p_name, QString p_action,
const QTextCursor old_cursor = ui_ic_chatlog->textCursor();
const int old_scrollbar_value = ui_ic_chatlog->verticalScrollBar()->value();
const bool need_newline = !ui_ic_chatlog->document()->isEmpty();
- const int scrollbar_target_value = log_goes_downwards ? ui_ic_chatlog->verticalScrollBar()->maximum() : ui_ic_chatlog->verticalScrollBar()->minimum();
+ const int scrollbar_target_value =
+ log_goes_downwards ? ui_ic_chatlog->verticalScrollBar()->maximum()
+ : ui_ic_chatlog->verticalScrollBar()->minimum();
- ui_ic_chatlog->moveCursor(log_goes_downwards ? QTextCursor::End : QTextCursor::Start);
+ ui_ic_chatlog->moveCursor(log_goes_downwards ? QTextCursor::End
+ : QTextCursor::Start);
// Only prepend with newline if log goes downwards
if (log_goes_downwards && need_newline) {
@@ -2600,17 +2640,24 @@ void Courtroom::append_ic_text(QString p_text, QString p_name, QString p_action,
// Timestamp if we're doing that meme
if (log_timestamp)
- ui_ic_chatlog->textCursor().insertText("[" + QDateTime::currentDateTime().toString("h:mm:ss AP") + "] ", normal);
+ ui_ic_chatlog->textCursor().insertText(
+ "[" + QDateTime::currentDateTime().toString("h:mm:ss AP") + "] ",
+ normal);
// Format the name of the actor
ui_ic_chatlog->textCursor().insertText(p_name, bold);
+ // Special case for stopping the music
+ if (p_action == tr("has stopped the music")) {
+ ui_ic_chatlog->textCursor().insertText(" " + p_action + ".", normal);
+ }
// If action not blank:
- if (p_action != "") {
+ else if (p_action != "") {
// Format the action in normal
ui_ic_chatlog->textCursor().insertText(" " + p_action, normal);
if (log_newline)
- // For some reason, we're forced to use <br> instead of the more sensible \n.
- // Why? Because \n is treated as a new Block instead of a soft newline within a paragraph!
+ // For some reason, we're forced to use <br> instead of the more sensible
+ // \n. Why? Because \n is treated as a new Block instead of a soft newline
+ // within a paragraph!
ui_ic_chatlog->textCursor().insertHtml("<br>");
else
ui_ic_chatlog->textCursor().insertText(": ", normal);
@@ -2619,16 +2666,19 @@ void Courtroom::append_ic_text(QString p_text, QString p_name, QString p_action,
}
else {
if (log_newline)
- // For some reason, we're forced to use <br> instead of the more sensible \n.
- // Why? Because \n is treated as a new Block instead of a soft newline within a paragraph!
+ // For some reason, we're forced to use <br> instead of the more sensible
+ // \n. Why? Because \n is treated as a new Block instead of a soft newline
+ // within a paragraph!
ui_ic_chatlog->textCursor().insertHtml("<br>");
else
ui_ic_chatlog->textCursor().insertText(": ", normal);
// Format the result according to html
if (log_colors)
- ui_ic_chatlog->textCursor().insertHtml(filter_ic_text(p_text, true, -1, color));
+ ui_ic_chatlog->textCursor().insertHtml(
+ filter_ic_text(p_text, true, -1, color));
else
- ui_ic_chatlog->textCursor().insertText(filter_ic_text(p_text, false), normal);
+ ui_ic_chatlog->textCursor().insertText(filter_ic_text(p_text, false),
+ normal);
}
// Only append with newline if log goes upwards
@@ -2639,7 +2689,8 @@ void Courtroom::append_ic_text(QString p_text, QString p_name, QString p_action,
// If we got too many blocks in the current log, delete some.
while (ui_ic_chatlog->document()->blockCount() > log_maximum_blocks &&
log_maximum_blocks > 0) {
- ui_ic_chatlog->moveCursor(log_goes_downwards ? QTextCursor::Start : QTextCursor::End);
+ ui_ic_chatlog->moveCursor(log_goes_downwards ? QTextCursor::Start
+ : QTextCursor::End);
ui_ic_chatlog->textCursor().select(QTextCursor::BlockUnderCursor);
ui_ic_chatlog->textCursor().removeSelectedText();
if (log_goes_downwards)
@@ -2649,7 +2700,8 @@ void Courtroom::append_ic_text(QString p_text, QString p_name, QString p_action,
}
// Finally, scroll the scrollbar to the correct position.
- if (old_cursor.hasSelection() || old_scrollbar_value != scrollbar_target_value) {
+ if (old_cursor.hasSelection() ||
+ old_scrollbar_value != scrollbar_target_value) {
// The user has selected text or scrolled away from the bottom: maintain
// position.
ui_ic_chatlog->setTextCursor(old_cursor);
@@ -2658,10 +2710,10 @@ void Courtroom::append_ic_text(QString p_text, QString p_name, QString p_action,
else {
// The user hasn't selected any text and the scrollbar is at the bottom:
// scroll to the bottom.
- ui_ic_chatlog->moveCursor(log_goes_downwards ? QTextCursor::End : QTextCursor::Start);
+ ui_ic_chatlog->moveCursor(log_goes_downwards ? QTextCursor::End
+ : QTextCursor::Start);
ui_ic_chatlog->verticalScrollBar()->setValue(
- log_goes_downwards ? ui_ic_chatlog->verticalScrollBar()->maximum()
- : 0);
+ log_goes_downwards ? ui_ic_chatlog->verticalScrollBar()->maximum() : 0);
}
}
@@ -3158,14 +3210,19 @@ void Courtroom::handle_song(QStringList *p_contents)
{
effect_flags = p_contents->at(5).toInt();
}
-
music_player->play(f_song, channel, looping, effect_flags);
- if (channel == 0)
- ui_music_name->setText(f_song_clear);
+ if (f_song == "~stop.mp3")
+ ui_music_name->setText(tr("None"));
+ else if (channel == 0) {
+ if (file_exists(ao_app->get_sfx_suffix(ao_app->get_music_path(f_song))))
+ ui_music_name->setText(f_song_clear);
+ else
+ ui_music_name->setText(tr("[MISSING] %1").arg(f_song_clear));
+ }
}
else {
QString str_char = char_list.at(n_char).name;
- QString str_show = char_list.at(n_char).name;
+ QString str_show = ao_app->get_showname(str_char);
if (p_contents->length() > 2) {
if (p_contents->at(2) != "") {
@@ -3187,13 +3244,25 @@ void Courtroom::handle_song(QStringList *p_contents)
}
if (!mute_map.value(n_char)) {
- log_ic_text(str_char, str_show, f_song, tr("has played a song"),
- m_chatmessage[TEXT_COLOR].toInt());
- append_ic_text(f_song_clear, str_show, tr("has played a song"));
-
+ if (f_song == "~stop.mp3") {
+ log_ic_text(str_char, str_show, "", tr("has stopped the music"),
+ m_chatmessage[TEXT_COLOR].toInt());
+ append_ic_text("", str_show, tr("has stopped the music"));
+ }
+ else {
+ log_ic_text(str_char, str_show, f_song, tr("has played a song"),
+ m_chatmessage[TEXT_COLOR].toInt());
+ append_ic_text(f_song_clear, str_show, tr("has played a song"));
+ }
music_player->play(f_song, channel, looping, effect_flags);
- if (channel == 0)
- ui_music_name->setText(f_song_clear);
+ if (f_song == "~stop.mp3")
+ ui_music_name->setText(tr("None"));
+ else if (channel == 0) {
+ if (file_exists(ao_app->get_sfx_suffix(ao_app->get_music_path(f_song))))
+ ui_music_name->setText(f_song_clear);
+ else
+ ui_music_name->setText(tr("[MISSING] %1").arg(f_song_clear));
+ }
}
}
}
@@ -3351,9 +3420,8 @@ void Courtroom::on_ooc_return_pressed()
if (ok) {
if (off >= -100 && off <= 100) {
char_offset = off;
- QString msg = tr("You have set your offset to ");
- msg.append(QString::number(off));
- msg.append("%.");
+ QString msg = tr("You have set your offset to %1%%.")
+ .arg(QString::number(off));
append_server_chatmessage("CLIENT", msg, "1");
}
else {
@@ -3367,6 +3435,30 @@ void Courtroom::on_ooc_return_pressed()
}
return;
}
+ else if (ooc_message.startsWith("/voffset")) {
+ ui_ooc_chat_message->clear();
+ ooc_message.remove(0, 8);
+
+ bool ok;
+ int off = ooc_message.toInt(&ok);
+ if (ok) {
+ if (off >= -100 && off <= 100) {
+ char_vert_offset = off;
+ QString msg = tr("You have set your vertical offset to %1%%.")
+ .arg(QString::number(off));
+ append_server_chatmessage("CLIENT", msg, "1");
+ }
+ else {
+ append_server_chatmessage(
+ "CLIENT", tr("Your vertical offset must be between -100% and 100%!"), "1");
+ }
+ }
+ else {
+ append_server_chatmessage("CLIENT",
+ tr("That vertical offset does not look like one."), "1");
+ }
+ return;
+ }
else if (ooc_message.startsWith("/switch_am")) {
append_server_chatmessage(
"CLIENT", tr("You switched your music and area list."), "1");
@@ -3908,7 +4000,7 @@ void Courtroom::set_effects_dropdown()
return;
}
- effectslist.prepend("None");
+ effectslist.prepend(tr("None"));
ui_effects_dropdown->show();
ui_effects_dropdown->addItems(effectslist);
@@ -4086,10 +4178,10 @@ void Courtroom::on_music_list_double_clicked(QTreeWidgetItem *p_item,
{
if (is_muted)
return;
-
+ if (p_item->parent() == nullptr) // i.e. we've clicked a category
+ return;
column = 1; // Column 1 is always the metadata (which we want)
QString p_song = p_item->text(column);
-
QStringList packet_contents;
packet_contents.append(p_song);
packet_contents.append(QString::number(m_cid));
@@ -4104,7 +4196,7 @@ void Courtroom::on_music_list_double_clicked(QTreeWidgetItem *p_item,
void Courtroom::on_music_list_context_menu_requested(const QPoint &pos)
{
QMenu *menu = new QMenu();
-
+ menu->addAction(QString(tr("Stop Current Song")), this, SLOT(music_stop()));
menu->addAction(QString(tr("Play Random Song")), this, SLOT(music_random()));
menu->addSeparator();
menu->addAction(QString(tr("Expand All Categories")), this,
@@ -4182,6 +4274,22 @@ void Courtroom::music_list_collapse_all()
ui_music_list->setCurrentItem(current);
}
+void Courtroom::music_stop()
+{ // send a fake music packet with a nonexistent song
+ if (is_muted) // this requires a special exception for "~stop.mp3" in
+ return; // tsuserver3, as it will otherwise reject songs not on
+ QStringList packet_contents; // its music list
+ packet_contents.append(
+ "~stop.mp3"); // this is our fake song, playing it triggers special code
+ packet_contents.append(QString::number(m_cid));
+ if ((!ui_ic_chat_name->text().isEmpty() && ao_app->cccc_ic_support_enabled) ||
+ ao_app->effects_enabled)
+ packet_contents.append(ui_ic_chat_name->text());
+ if (ao_app->effects_enabled)
+ packet_contents.append(QString::number(music_flags));
+ ao_app->send_server_packet(new AOPacket("MC", packet_contents), false);
+}
+
void Courtroom::on_area_list_double_clicked(QTreeWidgetItem *p_item, int column)
{
column = 0; // The metadata
@@ -4323,6 +4431,7 @@ void Courtroom::on_mute_clicked()
ui_mute_list->show();
ui_pair_list->hide();
ui_pair_offset_spinbox->hide();
+ ui_pair_vert_offset_spinbox->hide();
ui_pair_order_dropdown->hide();
ui_pair_button->set_image("pair_button");
ui_mute->set_image("mute_pressed");
@@ -4338,6 +4447,7 @@ void Courtroom::on_pair_clicked()
if (ui_pair_list->isHidden()) {
ui_pair_list->show();
ui_pair_offset_spinbox->show();
+ ui_pair_vert_offset_spinbox->show();
ui_pair_order_dropdown->show();
ui_mute_list->hide();
ui_mute->set_image("mute");
@@ -4346,6 +4456,7 @@ void Courtroom::on_pair_clicked()
else {
ui_pair_list->hide();
ui_pair_offset_spinbox->hide();
+ ui_pair_vert_offset_spinbox->hide();
ui_pair_order_dropdown->hide();
ui_pair_button->set_image("pair_button");
}
@@ -4502,6 +4613,8 @@ void Courtroom::on_log_limit_changed(int value) { log_maximum_blocks = value; }
void Courtroom::on_pair_offset_changed(int value) { char_offset = value; }
+void Courtroom::on_pair_vert_offset_changed(int value) { char_vert_offset = value; }
+
void Courtroom::on_witness_testimony_clicked()
{
if (is_muted)
@@ -4657,7 +4770,9 @@ void Courtroom::regenerate_ic_chatlog()
{
ui_ic_chatlog->clear();
foreach (chatlogpiece item, ic_chatlog_history) {
- append_ic_text(item.get_message(), ui_showname_enable->isChecked() ? item.get_showname() : item.get_name(),
+ append_ic_text(item.get_message(),
+ ui_showname_enable->isChecked() ? item.get_showname()
+ : item.get_name(),
item.get_action(), item.get_chat_color());
}
}
diff --git a/src/encryption_functions.cpp b/src/encryption_functions.cpp
deleted file mode 100644
index 6669fe15..00000000
--- a/src/encryption_functions.cpp
+++ /dev/null
@@ -1,58 +0,0 @@
-#include "encryption_functions.h"
-
-#include "hex_functions.h"
-
-QString fanta_encrypt(QString temp_input, unsigned int p_key)
-{
- // using standard stdlib types is actually easier here because of implicit
- // char<->int conversion which in turn makes encryption arithmetic easier
-
- unsigned int key = p_key;
- unsigned int C1 = 53761;
- unsigned int C2 = 32618;
-
- QVector<uint_fast8_t> temp_result;
- std::string input = temp_input.toUtf8().constData();
-
- for (unsigned int pos = 0; pos < input.size(); ++pos) {
- uint_fast8_t output = input.at(pos) ^ (key >> 8) % 256;
- temp_result.append(output);
- key = (temp_result.at(pos) + key) * C1 + C2;
- }
-
- std::string result = "";
-
- for (uint_fast8_t i_int : temp_result) {
- result += omni::int_to_hex(i_int);
- }
-
- QString final_result = QString::fromStdString(result);
-
- return final_result;
-}
-
-QString fanta_decrypt(QString temp_input, unsigned int key)
-{
- std::string input = temp_input.toUtf8().constData();
-
- QVector<unsigned int> unhexed_vector;
-
- for (unsigned int i = 0; i < input.length(); i += 2) {
- std::string byte = input.substr(i, 2);
- unsigned int hex_int = strtoul(byte.c_str(), nullptr, 16);
- unhexed_vector.append(hex_int);
- }
-
- unsigned int C1 = 53761;
- unsigned int C2 = 32618;
-
- std::string result = "";
-
- for (int pos = 0; pos < unhexed_vector.size(); ++pos) {
- unsigned char output = unhexed_vector.at(pos) ^ (key >> 8) % 256;
- result += output;
- key = (unhexed_vector.at(pos) + key) * C1 + C2;
- }
-
- return QString::fromStdString(result);
-}
diff --git a/src/hex_functions.cpp b/src/hex_functions.cpp
deleted file mode 100644
index 1e35718f..00000000
--- a/src/hex_functions.cpp
+++ /dev/null
@@ -1,17 +0,0 @@
-#include "hex_functions.h"
-
-namespace omni {
-std::string int_to_hex(unsigned int input)
-{
- if (input > 255)
- return "FF";
-
- std::stringstream stream;
- stream << std::setfill('0') << std::setw(sizeof(char) * 2) << std::hex
- << input;
- std::string result(stream.str());
- std::transform(result.begin(), result.end(), result.begin(), ::toupper);
-
- return result;
-}
-} // namespace omni
diff --git a/src/lobby.cpp b/src/lobby.cpp
index 093b0f7d..79a565a8 100644
--- a/src/lobby.cpp
+++ b/src/lobby.cpp
@@ -13,6 +13,7 @@ Lobby::Lobby(AOApplication *p_ao_app) : QMainWindow()
this->setWindowTitle(tr("Attorney Online 2"));
this->setWindowIcon(QIcon(":/logo.png"));
+ this->setWindowFlags( (this->windowFlags() | Qt::CustomizeWindowHint) & ~Qt::WindowMaximizeButtonHint);
ui_background = new AOImage(this, ao_app);
ui_public_servers = new AOButton(this, ao_app);
@@ -97,10 +98,10 @@ void Lobby::set_widgets()
"Did you download all resources correctly from tiny.cc/getao, "
"including the large 'base' folder?"));
- this->resize(517, 666);
+ this->setFixedSize(517, 666);
}
else {
- this->resize(f_lobby.width, f_lobby.height);
+ this->setFixedSize(f_lobby.width, f_lobby.height);
}
set_size_and_pos(ui_background, "lobby");
@@ -441,8 +442,9 @@ void Lobby::on_server_list_clicked(QTreeWidgetItem *p_item, int column)
// doubleclicked on an item in the serverlist so we'll connect right away
void Lobby::on_server_list_doubleclicked(QTreeWidgetItem *p_item, int column)
{
+ doubleclicked = true;
on_server_list_clicked(p_item, column);
- on_connect_released();
+ //on_connect_released();
}
void Lobby::on_server_search_edited(QString p_text)
diff --git a/src/packet_distribution.cpp b/src/packet_distribution.cpp
index e4e5d5c2..f7125797 100644
--- a/src/packet_distribution.cpp
+++ b/src/packet_distribution.cpp
@@ -2,7 +2,6 @@
#include "courtroom.h"
#include "debug_functions.h"
-#include "encryption_functions.h"
#include "hardware_functions.h"
#include "lobby.h"
#include "networkmanager.h"
@@ -120,16 +119,11 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
if (f_contents.size() == 0)
goto end;
- // you may ask where 322 comes from. that would be a good question.
- s_decryptor = fanta_decrypt(f_contents.at(0), 322).toUInt();
-
// default(legacy) values
- encryption_needed = true;
yellow_text_enabled = false;
prezoom_enabled = false;
flipping_enabled = false;
custom_objection_enabled = false;
- improved_loading_enabled = false;
desk_mod_enabled = false;
evidence_enabled = false;
cccc_ic_support_enabled = false;
@@ -140,10 +134,6 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
additive_enabled = false;
effects_enabled = false;
- // workaround for tsuserver4
- if (f_contents.at(0) == "NOENCRYPT")
- encryption_needed = false;
-
QString f_hdid;
f_hdid = get_hdid();
@@ -176,12 +166,10 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
}
}
else if (header == "FL") {
- // encryption_needed = true;
yellow_text_enabled = false;
prezoom_enabled = false;
flipping_enabled = false;
custom_objection_enabled = false;
- improved_loading_enabled = false;
desk_mod_enabled = false;
evidence_enabled = false;
cccc_ic_support_enabled = false;
@@ -199,10 +187,6 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
flipping_enabled = true;
if (f_packet.contains("customobjections", Qt::CaseInsensitive))
custom_objection_enabled = true;
- if (f_packet.contains("fastloading", Qt::CaseInsensitive))
- improved_loading_enabled = true;
- if (f_packet.contains("noencryption", Qt::CaseInsensitive))
- encryption_needed = false;
if (f_packet.contains("deskmod", Qt::CaseInsensitive))
desk_mod_enabled = true;
if (f_packet.contains("evidence", Qt::CaseInsensitive))
@@ -228,6 +212,11 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
w_lobby->set_player_count(f_contents.at(0).toInt(),
f_contents.at(1).toInt());
+
+ if (w_lobby->doubleclicked) {
+ send_server_packet(new AOPacket("askchaa#%"));
+ w_lobby->doubleclicked = false;
+ }
}
else if (header == "SI") {
if (f_contents.size() != 3)
@@ -283,11 +272,7 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
AOPacket *f_packet;
- if (improved_loading_enabled)
- f_packet = new AOPacket("RC#%");
- else
- f_packet = new AOPacket("askchar2#%");
-
+ f_packet = new AOPacket("RC#%");
send_server_packet(f_packet);
// Remove any characters not accepted in folder names for the server_name
@@ -308,152 +293,6 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
discord->state_server(server_name.toStdString(),
hash.result().toBase64().toStdString());
}
- else if (header == "CI") {
- if (!courtroom_constructed)
- goto end;
-
- for (int n_element = 0; n_element < f_contents.size(); n_element += 2) {
- if (f_contents.at(n_element).toInt() != loaded_chars)
- break;
-
- // this means we are on the last element and checking n + 1 element will
- // be game over so
- if (n_element == f_contents.size() - 1)
- break;
-
- QStringList sub_elements = f_contents.at(n_element + 1).split("&");
- if (sub_elements.size() < 2)
- break;
-
- char_type f_char;
- f_char.name = sub_elements.at(0);
- f_char.description = sub_elements.at(1);
- f_char.evidence_string = sub_elements.at(3);
- // temporary. the CharsCheck packet sets this properly
- f_char.taken = false;
-
- ++loaded_chars;
-
- w_lobby->set_loading_text(tr("Loading chars:\n%1/%2")
- .arg(QString::number(loaded_chars))
- .arg(QString::number(char_list_size)));
-
- w_courtroom->append_char(f_char);
-
- 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<double>(total_loading_size)) *
- 100);
- w_lobby->set_loading_value(loading_value);
- }
-
- if (improved_loading_enabled)
- send_server_packet(new AOPacket("RE#%"));
- else {
- QString next_packet_number =
- QString::number(((loaded_chars - 1) / 10) + 1);
- send_server_packet(new AOPacket("AN#" + next_packet_number + "#%"));
- }
- }
- else if (header == "EI") {
- if (!courtroom_constructed)
- goto end;
-
- // +1 because evidence starts at 1 rather than 0 for whatever reason
- // enjoy fanta
- if (f_contents.at(0).toInt() != loaded_evidence + 1)
- goto end;
-
- if (f_contents.size() < 2)
- goto end;
-
- QStringList sub_elements = f_contents.at(1).split("&");
- if (sub_elements.size() < 4)
- goto end;
-
- evi_type f_evi;
- f_evi.name = sub_elements.at(0);
- f_evi.description = sub_elements.at(1);
- // no idea what the number at position 2 is. probably an identifier?
- f_evi.image = sub_elements.at(3);
-
- ++loaded_evidence;
-
- w_lobby->set_loading_text(tr("Loading evidence:\n%1/%2")
- .arg(QString::number(loaded_evidence))
- .arg(QString::number(evidence_list_size)));
-
- w_courtroom->append_evidence(f_evi);
-
- 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<double>(total_loading_size)) *
- 100);
- w_lobby->set_loading_value(loading_value);
-
- QString next_packet_number = QString::number(loaded_evidence);
- send_server_packet(new AOPacket("AE#" + next_packet_number + "#%"));
- }
- else if (header == "EM") {
- if (!courtroom_constructed)
- goto end;
-
- bool musics_time = false;
- int areas = 0;
-
- for (int n_element = 0; n_element < f_contents.size(); n_element += 2) {
- if (f_contents.at(n_element).toInt() != loaded_music)
- break;
-
- if (n_element == f_contents.size() - 1)
- break;
-
- QString f_music = f_contents.at(n_element + 1);
-
- ++loaded_music;
-
- w_lobby->set_loading_text(tr("Loading music:\n%1/%2")
- .arg(QString::number(loaded_music))
- .arg(QString::number(music_list_size)));
-
- 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++;
- }
- }
-
- 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<double>(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 + "#%"));
- }
else if (header == "CharsCheck") {
if (!courtroom_constructed)
goto end;
@@ -750,19 +589,9 @@ void AOApplication::send_server_packet(AOPacket *p_packet, bool encoded)
QString f_packet = p_packet->to_string();
- if (encryption_needed) {
-#ifdef DEBUG_NETWORK
- qDebug() << "S(e):" << f_packet;
-#endif
-
- p_packet->encrypt_header(s_decryptor);
- f_packet = p_packet->to_string();
- }
- else {
#ifdef DEBUG_NETWORK
qDebug() << "S:" << f_packet;
#endif
- }
net_manager->ship_server_packet(f_packet);