From b7b9794839f9b7d1ecf9690a8bf87132f069d50c Mon Sep 17 00:00:00 2001 From: David Skoland Date: Mon, 6 Feb 2017 22:22:03 +0100 Subject: [PATCH] implemented sending IC messages --- aoapplication.h | 8 +- aoemotebutton.cpp | 48 +++++++- aoemotebutton.h | 18 ++- courtroom.cpp | 99 +++++++++++++++- courtroom.h | 12 ++ emotes.cpp | 81 ++++++++++++- text_file_functions.cpp | 247 +++++++++++++++++++++++++++++++++++++++- 7 files changed, 502 insertions(+), 11 deletions(-) diff --git a/aoapplication.h b/aoapplication.h index aeb9594..87dcc14 100644 --- a/aoapplication.h +++ b/aoapplication.h @@ -97,7 +97,13 @@ public: QString get_chat(QString p_char); int get_preanim_duration(QString p_char, QString p_emote); int get_text_delay(QString p_char, QString p_emote); - QString get_char_name(QString p_name); + QString get_char_name(QString p_char); + int get_emote_number(QString p_char); + QString get_emote(QString p_char, int p_emote); + QString get_pre_emote(QString p_char, int p_emote); + QString get_sfx_name(QString p_char, int p_emote); + int get_sfx_delay(QString p_char, int p_emote); + int get_emote_mod(QString p_char, int p_emote); private: const int RELEASE = 2; diff --git a/aoemotebutton.cpp b/aoemotebutton.cpp index 6cb99c7..142adb4 100644 --- a/aoemotebutton.cpp +++ b/aoemotebutton.cpp @@ -1,10 +1,54 @@ #include "aoemotebutton.h" +#include "file_functions.h" + AOEmoteButton::AOEmoteButton(QWidget *p_parent, AOApplication *p_ao_app, int p_x, int p_y) : QPushButton(p_parent) { - m_parent = p_parent; - m_ao_app = p_ao_app; + parent = p_parent; + ao_app = p_ao_app; this->move(p_x, p_y); this->resize(40, 40); + + connect(this, SIGNAL(clicked()), this, SLOT(on_clicked())); +} + +void AOEmoteButton::set_on(QString p_char, int p_emote) +{ + //+1 because programmatical emotes start on 0, while filesystem ones start on 1 + QString emotion_number = QString::number(p_emote + 1); + QString image_path = ao_app->get_character_path(p_char) + "emotions/button" + emotion_number + "_on.png"; + + if (file_exists(image_path)) + { + this->setText(""); + this->setStyleSheet("border-image:url(\"" + image_path + "\")"); + } + else + { + this->setText(emotion_number); + this->setStyleSheet("border-image:url(\"\")"); + } +} + +void AOEmoteButton::set_off(QString p_char, int p_emote) +{ + QString emotion_number = QString::number(p_emote + 1); + QString image_path = ao_app->get_character_path(p_char) + "emotions/button" + emotion_number + "_off.png"; + + if (file_exists(image_path)) + { + this->setText(""); + this->setStyleSheet("border-image:url(\"" + image_path + "\")"); + } + else + { + this->setText(emotion_number); + this->setStyleSheet("border-image:url(\"\")"); + } +} + +void AOEmoteButton::on_clicked() +{ + emote_clicked(m_id); } diff --git a/aoemotebutton.h b/aoemotebutton.h index 654972d..38888a7 100644 --- a/aoemotebutton.h +++ b/aoemotebutton.h @@ -12,9 +12,23 @@ class AOEmoteButton : public QPushButton public: AOEmoteButton(QWidget *p_parent, AOApplication *p_ao_app, int p_x, int p_y); + void set_on(QString p_char, int p_emote); + void set_off(QString p_char, int p_emote); + + void set_id(int p_id) {m_id = p_id;} + int get_id() {return m_id;} + private: - QWidget *m_parent; - AOApplication *m_ao_app; + QWidget *parent; + AOApplication *ao_app; + + int m_id = 0; + +signals: + void emote_clicked(int p_id); + +private slots: + void on_clicked(); }; #endif // AOEMOTEBUTTON_H diff --git a/courtroom.cpp b/courtroom.cpp index b706c47..30ec641 100644 --- a/courtroom.cpp +++ b/courtroom.cpp @@ -192,9 +192,16 @@ Courtroom::Courtroom(AOApplication *p_ao_app) : QMainWindow() connect(chat_tick_timer, SIGNAL(timeout()), this, SLOT(chat_tick())); + //emote signals are set in emotes.cpp + + connect(ui_ic_chat_message, SIGNAL(returnPressed()), this, SLOT(on_chat_return_pressed())); + connect(ui_ooc_chat_message, SIGNAL(returnPressed()), this, SLOT(on_ooc_return_pressed())); connect(ui_ooc_toggle, SIGNAL(clicked()), this, SLOT(on_ooc_toggle_clicked())); + connect(ui_emote_left, SIGNAL(clicked()), this, SLOT(on_emote_left_clicked())); + connect(ui_emote_right, SIGNAL(clicked()), this, SLOT(on_emote_right_clicked())); + connect(ui_witness_testimony, SIGNAL(clicked()), this, SLOT(on_witness_testimony_clicked())); connect(ui_cross_examination, SIGNAL(clicked()), this, SLOT(on_cross_examination_clicked())); @@ -503,8 +510,6 @@ void Courtroom::set_char_select_page() else chars_on_page = 90; - qDebug() << "chars_on_page: " << chars_on_page; - if (total_pages > current_char_page + 1) ui_char_select_right->show(); @@ -554,6 +559,7 @@ void Courtroom::enter_courtroom(int p_cid) current_char = f_char; current_emote_page = 0; + current_emote = 0; set_emote_page(); @@ -629,6 +635,92 @@ void Courtroom::append_server_chatmessage(QString f_message) } } +void Courtroom::on_chat_return_pressed() +{ + if (ui_ic_chat_message->text() == "") + return; + + //MS#chat# + //pre-emote# + //character# + //emote# + //message# + //side# + //sfx-name# + //emote_modifier# + //char_id# + //sfx_delay# + //objection_modifier# + //evidence# + //placeholder# + //realization# + //text_color#% + + QStringList packet_contents; + + packet_contents.append("chat"); + + packet_contents.append(ao_app->get_pre_emote(current_char, current_emote)); + + packet_contents.append(current_char); + + packet_contents.append(ao_app->get_emote(current_char, current_emote)); + + packet_contents.append(ui_ic_chat_message->text()); + + packet_contents.append(ao_app->get_char_side(current_char)); + + packet_contents.append(ao_app->get_sfx_name(current_char, current_emote)); + + packet_contents.append(QString::number(ao_app->get_emote_mod(current_char, current_emote))); + + packet_contents.append(QString::number(m_cid)); + + packet_contents.append(QString::number(ao_app->get_sfx_delay(current_char, current_emote))); + + QString f_obj_state; + + if ((objection_state > 3 && !ao_app->ao2_features) || + (objection_state < 0)) + f_obj_state = "0"; + else + f_obj_state = QString::number(objection_state); + + packet_contents.append(f_obj_state); + + //evidence. 0 for now + packet_contents.append("0"); + + QString f_flip; + + if (ao_app->ao2_features) + { + if (ui_flip->isChecked()) + f_flip = "1"; + else + f_flip = "0"; + } + else + f_flip = QString::number(m_cid); + + packet_contents.append(f_flip); + + packet_contents.append(QString::number(realization_state)); + + QString f_text_color; + + if (text_color < 0) + f_text_color = "0"; + else if (text_color > 4 && !ao_app->ao2_features) + f_text_color = "0"; + else + f_text_color = QString::number(text_color); + + packet_contents.append(f_text_color); + + ao_app->send_server_packet(new AOPacket("MS", packet_contents)); +} + void Courtroom::handle_chatmessage(QStringList *p_contents) { text_state = 0; @@ -639,6 +731,9 @@ void Courtroom::handle_chatmessage(QStringList *p_contents) m_chatmessage[n_string] = p_contents->at(n_string); } + if (m_chatmessage[MESSAGE] == ui_ic_chat_message->text()) + ui_ic_chat_message->clear(); + chatmessage_is_empty = m_chatmessage[MESSAGE] == " " || m_chatmessage[MESSAGE] == ""; QString f_message = m_chatmessage[CHAR_NAME] + ": " + m_chatmessage[MESSAGE] + '\n'; diff --git a/courtroom.h b/courtroom.h index 09200f3..8e880bf 100644 --- a/courtroom.h +++ b/courtroom.h @@ -123,6 +123,10 @@ private: //cid and this may differ in cases of ini-editing QString current_char = ""; + int objection_state = 0; + int realization_state = 0; + int text_color = 0; + int current_emote_page = 0; int current_emote = 0; const int max_emotes_on_page = 10; @@ -246,7 +250,15 @@ private slots: void chat_tick(); + void on_chat_return_pressed(); + void on_ooc_return_pressed(); + + void on_emote_clicked(int p_id); + + void on_emote_left_clicked(); + void on_emote_right_clicked(); + void on_ooc_toggle_clicked(); void on_witness_testimony_clicked(); diff --git a/emotes.cpp b/emotes.cpp index 71f9cb4..a77a300 100644 --- a/emotes.cpp +++ b/emotes.cpp @@ -2,6 +2,8 @@ #include "aoemotebutton.h" +#include + void Courtroom::construct_emotes() { //constructing emote button grid @@ -14,12 +16,18 @@ void Courtroom::construct_emotes() const int y_modifier{49}; int y_mod_count{0}; - for (int n = 0 ; n < 90 ; ++n) + for (int n = 0 ; n < 10 ; ++n) { int x_pos = base_x_pos + (x_modifier * x_mod_count); int y_pos = base_y_pos + (y_modifier * y_mod_count); - ui_emote_list.append(new AOEmoteButton(ui_emotes, ao_app, x_pos, y_pos)); + AOEmoteButton *f_emote = new AOEmoteButton(ui_emotes, ao_app, x_pos, y_pos); + + ui_emote_list.append(f_emote); + + f_emote->set_id(n); + + connect(f_emote, SIGNAL(emote_clicked(int)), this, SLOT(on_emote_clicked(int))); ++x_mod_count; @@ -34,6 +42,8 @@ void Courtroom::construct_emotes() void Courtroom::set_emote_page() { + int total_emotes = ao_app->get_emote_number(current_char); + ui_emote_left->hide(); ui_emote_right->hide(); @@ -42,4 +52,71 @@ void Courtroom::set_emote_page() i_button->hide(); } + int total_pages = total_emotes / 10; + int emotes_on_page = 0; + + if (total_emotes % 10 != 0) + { + ++total_pages; + //i. e. not on the last page + if (total_pages > current_emote_page + 1) + emotes_on_page = 10; + else + emotes_on_page = total_emotes % 10; + + } + else + emotes_on_page = 10; + + if (total_pages > current_emote_page + 1) + ui_emote_right->show(); + + if (current_emote_page > 0) + ui_emote_left->show(); + + for (int n_emote = 0 ; n_emote < emotes_on_page ; ++n_emote) + { + int n_real_emote = n_emote + current_emote_page * 10; + AOEmoteButton *f_emote = ui_emote_list.at(n_emote); + + if (n_real_emote == current_emote) + f_emote->set_on(current_char, n_real_emote); + else + f_emote->set_off(current_char, n_real_emote); + + f_emote->show(); + } + +} + +void Courtroom::on_emote_clicked(int p_id) +{ + current_emote = p_id + 10 * current_emote_page; + + for (int n_emote = 0 ; n_emote < 10 ; ++n_emote) + { + int n_real_emote = n_emote + current_emote_page * 10; + AOEmoteButton *f_emote = ui_emote_list.at(n_emote); + + if (n_real_emote == current_emote) + f_emote->set_on(current_char, n_real_emote); + else + f_emote->set_off(current_char, n_real_emote); + } + + //T0D0: check pre if it's a pre emote +} + +void Courtroom::on_emote_left_clicked() +{ + --current_emote_page; + + set_emote_page(); +} + +void Courtroom::on_emote_right_clicked() +{ + ++current_emote_page; + + set_emote_page(); } diff --git a/text_file_functions.cpp b/text_file_functions.cpp index 27c8dc6..26aa0d0 100644 --- a/text_file_functions.cpp +++ b/text_file_functions.cpp @@ -283,9 +283,9 @@ int AOApplication::get_text_delay(QString p_char, QString p_emote) return -1; } -QString AOApplication::get_char_name(QString p_name) +QString AOApplication::get_char_name(QString p_char) { - QString char_ini_path = get_character_path(p_name) + "char.ini"; + QString char_ini_path = get_character_path(p_char) + "char.ini"; QFile char_ini; @@ -316,3 +316,246 @@ QString AOApplication::get_char_name(QString p_name) return ""; } +int AOApplication::get_emote_number(QString p_char) +{ + 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 0; + } + + QTextStream in(&char_ini); + bool emotions_found = false; + + while(!in.atEnd()) + { + QString line = in.readLine(); + + if (line.startsWith("[SoundN]")) + return 0; + + if (line.startsWith("[Emotions]")) + emotions_found = true; + + if (!line.startsWith("number")) + continue; + + QStringList line_elements = line.split("="); + + if (line_elements.size() < 2) + continue; + + if (emotions_found) + return line_elements.at(1).trimmed().toInt(); + } + + return 0; +} + +QString AOApplication::get_pre_emote(QString p_char, int p_emote) +{ + 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 "normal"; + } + + QTextStream in(&char_ini); + bool emotions_found = false; + QString search_line = QString::number(p_emote + 1); + + while(!in.atEnd()) + { + QString line = in.readLine(); + + if (line.startsWith("[SoundN]")) + return "normal"; + + if (line.startsWith("[Emotions]")) + emotions_found = true; + + if (!line.startsWith(search_line)) + continue; + + QStringList line_elements = line.split("="); + + if (line_elements.size() < 4) + continue; + + if (emotions_found) + return line_elements.at(1).trimmed(); + } + + return "normal"; +} + +QString AOApplication::get_emote(QString p_char, int p_emote) +{ + 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 "normal"; + } + + QTextStream in(&char_ini); + bool emotions_found = false; + QString search_line = QString::number(p_emote + 1); + + while(!in.atEnd()) + { + QString line = in.readLine(); + + if (line.startsWith("[SoundN]")) + return "normal"; + + if (line.startsWith("[Emotions]")) + emotions_found = true; + + if (!line.startsWith(search_line)) + continue; + + QStringList line_elements = line.split("="); + + if (line_elements.size() < 4) + continue; + + if (emotions_found) + return line_elements.at(2).trimmed(); + } + + return "normal"; +} + +QString AOApplication::get_sfx_name(QString p_char, int p_emote) +{ + 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 "1"; + } + + QTextStream in(&char_ini); + bool soundn_found = false; + QString search_line = QString::number(p_emote + 1); + + while(!in.atEnd()) + { + QString line = in.readLine(); + + if (line.startsWith("[SoundT]")) + return "1"; + + if (line.startsWith("[SoundN]")) + soundn_found = true; + + if (!soundn_found) + continue; + + if (!line.startsWith(search_line)) + continue; + + QStringList line_elements = line.split("="); + + if (line_elements.size() < 2) + continue; + + + return line_elements.at(1).trimmed(); + } + + return "1"; +} + + +int AOApplication::get_sfx_delay(QString p_char, int p_emote) +{ + 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 0; + } + + QTextStream in(&char_ini); + bool soundt_found = false; + QString search_line = QString::number(p_emote + 1); + + while(!in.atEnd()) + { + QString line = in.readLine(); + + if (line.startsWith("[SoundT]")) + soundt_found = true; + + if (!soundt_found) + continue; + + if (!line.startsWith(search_line)) + continue; + + QStringList line_elements = line.split("="); + + if (line_elements.size() < 2) + continue; + + return line_elements.at(1).trimmed().toInt(); + } + + return 0; +} + +int AOApplication::get_emote_mod(QString p_char, int p_emote) +{ + 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 0; + } + + QTextStream in(&char_ini); + bool emotions_found = false; + QString search_line = QString::number(p_emote + 1); + + while(!in.atEnd()) + { + QString line = in.readLine(); + + if (line.startsWith("[SoundN]")) + return 0; + + if (line.startsWith("[Emotions]")) + emotions_found = true; + + if (!line.startsWith(search_line)) + continue; + + QStringList line_elements = line.split("="); + + if (line_elements.size() < 4) + continue; + + if (emotions_found) + return line_elements.at(3).trimmed().toInt(); + } + + return 0; +} + +