implemented sending IC messages

This commit is contained in:
David Skoland 2017-02-06 22:22:03 +01:00
parent ea09ad9dfc
commit b7b9794839
7 changed files with 502 additions and 11 deletions

View File

@ -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;

View File

@ -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);
}

View File

@ -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

View File

@ -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';

View File

@ -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();

View File

@ -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();
}

View File

@ -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;
}