Dual characters on screen Part 2.

- UI option to change pairup.
- Fixed a bug on the prosecution side.
- Dual characters now allow for iniswapped characters.
- Zooming now doesn't stay on the field, instead, the game defaults to
the last emote.
This commit is contained in:
Cerapter 2018-09-03 12:55:57 +02:00
parent 739142f8dd
commit 22e0cb8e1a
5 changed files with 140 additions and 18 deletions

View File

@ -119,6 +119,12 @@ Courtroom::Courtroom(AOApplication *p_ao_app) : QMainWindow()
//ui_area_list = new QListWidget(this);
ui_music_list = new QListWidget(this);
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("% offset");
ui_pair_button = new AOButton(this, ao_app);
ui_ic_chat_name = new QLineEdit(this);
ui_ic_chat_name->setFrame(false);
ui_ic_chat_name->setPlaceholderText("Showname");
@ -310,6 +316,10 @@ Courtroom::Courtroom(AOApplication *p_ao_app) : QMainWindow()
connect(ui_showname_enable, SIGNAL(clicked()), this, SLOT(on_showname_enable_clicked()));
connect(ui_pair_button, SIGNAL(clicked()), this, SLOT(on_pair_clicked()));
connect(ui_pair_list, SIGNAL(clicked(QModelIndex)), this, SLOT(on_pair_list_clicked(QModelIndex)));
connect(ui_pair_offset_spinbox, SIGNAL(valueChanged(int)), this, SLOT(on_pair_offset_changed(int)));
connect(ui_evidence_button, SIGNAL(clicked()), this, SLOT(on_evidence_button_clicked()));
set_widgets();
@ -341,6 +351,21 @@ void Courtroom::set_mute_list()
}
}
void Courtroom::set_pair_list()
{
QStringList sorted_pair_list;
for (char_type i_char : char_list)
sorted_pair_list.append(i_char.name);
sorted_pair_list.sort();
for (QString i_name : sorted_pair_list)
{
ui_pair_list->addItem(i_name);
}
}
void Courtroom::set_widgets()
{
blip_rate = ao_app->read_blip_rate();
@ -430,6 +455,13 @@ void Courtroom::set_widgets()
set_size_and_pos(ui_mute_list, "mute_list");
ui_mute_list->hide();
set_size_and_pos(ui_pair_list, "pair_list");
ui_pair_list->hide();
set_size_and_pos(ui_pair_offset_spinbox, "pair_offset_spinbox");
ui_pair_offset_spinbox->hide();
set_size_and_pos(ui_pair_button, "pair_button");
ui_pair_button->set_image("pair_button.png");
//set_size_and_pos(ui_area_list, "area_list");
//ui_area_list->setStyleSheet("background-color: rgba(0, 0, 0, 0);");
@ -697,6 +729,7 @@ void Courtroom::done_received()
set_char_select_page();
set_mute_list();
set_pair_list();
set_char_select();
@ -1009,7 +1042,8 @@ void Courtroom::on_chat_return_pressed()
}
// If there is someone this user would like to appear with.
if (other_charid > -1)
// And said someone is not ourselves!
if (other_charid > -1 && other_charid != m_cid)
{
// First, we'll add a filler in case we haven't set an IC showname.
if (ui_ic_chat_name->text().isEmpty())
@ -1285,7 +1319,7 @@ void Courtroom::handle_chatmessage_2()
{
vert2_offset = -1 * hor2_offset / 20;
}
ui_vp_sideplayer_char->move(ui_viewport->width() * hor2_offset, ui_viewport->height() * vert2_offset);
ui_vp_sideplayer_char->move(ui_viewport->width() * hor2_offset / 100, ui_viewport->height() * vert2_offset / 100);
// Finally, we reorder them based on who is more to the right.
if (hor2_offset <= hor_offset)
@ -1303,9 +1337,28 @@ void Courtroom::handle_chatmessage_2()
}
else
{
// In every other case, the talker is on top.
// In every other case, the person more to the left is on top.
// With one exception, hlp.
// These cases also don't move the characters down.
int hor_offset = m_chatmessage[SELF_OFFSET].toInt();
ui_vp_player_char->move(ui_viewport->width() * hor_offset / 100, 0);
// We do the same with the second character.
int hor2_offset = m_chatmessage[OTHER_OFFSET].toInt();
ui_vp_sideplayer_char->move(ui_viewport->width() * hor2_offset / 100, 0);
// Finally, we reorder them based on who is more to the left.
// The person more to the left is more in the front.
if (hor2_offset >= hor_offset)
{
ui_vp_sideplayer_char->raise();
ui_vp_player_char->raise();
}
else
{
ui_vp_player_char->raise();
ui_vp_sideplayer_char->raise();
}
ui_vp_desk->raise();
ui_vp_legacy_desk->raise();
}
@ -1314,7 +1367,7 @@ void Courtroom::handle_chatmessage_2()
ui_vp_sideplayer_char->set_flipped(true);
else
ui_vp_sideplayer_char->set_flipped(false);
ui_vp_sideplayer_char->play_idle(char_list.at(got_other_charid).name, m_chatmessage[OTHER_EMOTE]);
ui_vp_sideplayer_char->play_idle(m_chatmessage[OTHER_NAME], m_chatmessage[OTHER_EMOTE]);
}
else
{
@ -1366,6 +1419,7 @@ void Courtroom::handle_chatmessage_3()
{
ui_vp_desk->hide();
ui_vp_legacy_desk->hide();
ui_vp_sideplayer_char->hide(); // Hide the second character if we're zooming!
if (side == "pro" ||
side == "hlp" ||
@ -2599,25 +2653,51 @@ void Courtroom::on_mute_list_clicked(QModelIndex p_index)
mute_map.insert(f_cid, true);
f_item->setText(real_char + " [x]");
}
}
void Courtroom::on_pair_list_clicked(QModelIndex p_index)
{
QListWidgetItem *f_item = ui_pair_list->item(p_index.row());
QString f_char = f_item->text();
QString real_char;
/*
if (f_char.endsWith(" [x]"))
{
real_char = f_char.left(f_char.size() - 4);
mute_map.remove(real_char);
mute_map.insert(real_char, false);
f_item->setText(real_char);
}
else
{
real_char = f_char;
mute_map.remove(real_char);
mute_map.insert(real_char, true);
f_item->setText(real_char + " [x]");
int f_cid = -1;
for (int n_char = 0 ; n_char < char_list.size() ; n_char++)
{
if (char_list.at(n_char).name == real_char)
f_cid = n_char;
}
*/
if (f_cid < 0 || f_cid >= char_list.size())
{
qDebug() << "W: " << real_char << " not present in char_list";
return;
}
other_charid = f_cid;
// Redo the character list.
QStringList sorted_pair_list;
for (char_type i_char : char_list)
sorted_pair_list.append(i_char.name);
sorted_pair_list.sort();
for (int i = 0; i < ui_pair_list->count(); i++) {
ui_pair_list->item(i)->setText(sorted_pair_list.at(i));
}
f_item->setText(real_char + " [x]");
}
void Courtroom::on_music_list_double_clicked(QModelIndex p_model)
@ -2738,6 +2818,9 @@ void Courtroom::on_mute_clicked()
if (ui_mute_list->isHidden())
{
ui_mute_list->show();
ui_pair_list->hide();
ui_pair_offset_spinbox->hide();
ui_pair_button->set_image("pair_button.png");
ui_mute->set_image("mute_pressed.png");
}
else
@ -2747,6 +2830,24 @@ void Courtroom::on_mute_clicked()
}
}
void Courtroom::on_pair_clicked()
{
if (ui_pair_list->isHidden())
{
ui_pair_list->show();
ui_pair_offset_spinbox->show();
ui_mute_list->hide();
ui_mute->set_image("mute.png");
ui_pair_button->set_image("pair_button_pressed.png");
}
else
{
ui_pair_list->hide();
ui_pair_offset_spinbox->hide();
ui_pair_button->set_image("pair_button.png");
}
}
void Courtroom::on_defense_minus_clicked()
{
int f_state = defense_bar_state - 1;
@ -2809,6 +2910,11 @@ void Courtroom::on_log_limit_changed(int value)
log_maximum_blocks = value;
}
void Courtroom::on_pair_offset_changed(int value)
{
offset_with_pair = value;
}
void Courtroom::on_witness_testimony_clicked()
{
if (is_muted)

View File

@ -85,6 +85,9 @@ public:
//sets the local mute list based on characters available on the server
void set_mute_list();
// Sets the local pair list based on the characters available on the server.
void set_pair_list();
//sets desk and bg based on pos in chatmessage
void set_scene();
@ -246,7 +249,7 @@ private:
//every time point in char.inis times this equals the final time
const int time_mod = 40;
static const int chatmessage_size = 21;
static const int chatmessage_size = 22;
QString m_chatmessage[chatmessage_size];
bool chatmessage_is_empty = false;
@ -350,6 +353,10 @@ private:
QListWidget *ui_area_list;
QListWidget *ui_music_list;
AOButton *ui_pair_button;
QListWidget *ui_pair_list;
QSpinBox *ui_pair_offset_spinbox;
QLineEdit *ui_ic_chat_message;
QLineEdit *ui_ic_chat_name;
@ -487,6 +494,7 @@ private slots:
void chat_tick();
void on_mute_list_clicked(QModelIndex p_index);
void on_pair_list_clicked(QModelIndex p_index);
void on_chat_return_pressed();
@ -525,6 +533,7 @@ private slots:
void on_realization_clicked();
void on_mute_clicked();
void on_pair_clicked();
void on_defense_minus_clicked();
void on_defense_plus_clicked();
@ -538,6 +547,7 @@ private slots:
void on_blip_slider_moved(int p_value);
void on_log_limit_changed(int value);
void on_pair_offset_changed(int value);
void on_ooc_toggle_clicked();

View File

@ -95,6 +95,7 @@ enum CHAT_MESSAGE
TEXT_COLOR,
SHOWNAME,
OTHER_CHARID,
OTHER_NAME,
OTHER_EMOTE,
SELF_OFFSET,
OTHER_OFFSET,

View File

@ -420,11 +420,14 @@ class AOProtocol(asyncio.Protocol):
# and an other offset.
self.client.charid_pair = charid_pair
self.client.offset_pair = offset_pair
if anim_type not in (5, 6):
self.client.last_sprite = anim
self.client.flip = flip
self.client.claimed_folder = folder
other_offset = 0
other_emote = ''
other_flip = 0
other_folder = ''
confirmed = False
if charid_pair > -1:
@ -434,6 +437,7 @@ class AOProtocol(asyncio.Protocol):
other_offset = target.offset_pair
other_emote = target.last_sprite
other_flip = target.flip
other_folder = target.claimed_folder
break
if not confirmed:
@ -442,7 +446,7 @@ class AOProtocol(asyncio.Protocol):
self.client.area.send_command('MS', msg_type, pre, folder, anim, msg, pos, sfx, anim_type, cid,
sfx_delay, button, self.client.evi_list[evidence], flip, ding, color, showname,
charid_pair, other_emote, offset_pair, other_offset, other_flip)
charid_pair, other_folder, other_emote, offset_pair, other_offset, other_flip)
self.client.area.set_next_msg_delay(len(msg))
logger.log_server('[IC][{}][{}]{}'.format(self.client.area.abbreviation, self.client.get_char_name(), msg), self.client)

View File

@ -63,6 +63,7 @@ class ClientManager:
self.offset_pair = 0
self.last_sprite = ''
self.flip = 0
self.claimed_folder = ''
#flood-guard stuff
self.mus_counter = 0