aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--aoapplication.h8
-rw-r--r--aoemotebutton.cpp48
-rw-r--r--aoemotebutton.h18
-rw-r--r--courtroom.cpp99
-rw-r--r--courtroom.h12
-rw-r--r--emotes.cpp81
-rw-r--r--text_file_functions.cpp247
7 files changed, 502 insertions, 11 deletions
diff --git a/aoapplication.h b/aoapplication.h
index aeb95940..87dcc149 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 6cb99c77..142adb40 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 654972da..38888a76 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 b706c47d..30ec6418 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 09200f39..8e880bff 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 71f9cb40..a77a3006 100644
--- a/emotes.cpp
+++ b/emotes.cpp
@@ -2,6 +2,8 @@
#include "aoemotebutton.h"
+#include <QDebug>
+
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 27c8dc6d..26aa0d04 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;
+}
+
+