aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCrystalwarrior <varsash@gmail.com>2021-04-20 02:38:42 +0300
committerCrystalwarrior <varsash@gmail.com>2021-04-20 02:38:42 +0300
commit1edb5d9ae199d7b4512b862e994e4f5b89decb7c (patch)
tree99e7d52165b4af731c1f07846493ccfff0ef8408
parente36ac916a96a285e20e0f31308e52b97a595f92a (diff)
Add support for narrator chat (??!!) which does not affect the state of IC in any way, rather the only thing it affects is the IC chat box. INSANELY useful for GMs to play sound effects, talk over the situation, etc. without causing the IC viewport to reset.
Stress-tested with preanims, non-interrupting preanims, idle chat, talking chat, evidence presenting
-rw-r--r--src/courtroom.cpp123
1 files changed, 70 insertions, 53 deletions
diff --git a/src/courtroom.cpp b/src/courtroom.cpp
index 9fe84416..2314c995 100644
--- a/src/courtroom.cpp
+++ b/src/courtroom.cpp
@@ -2231,6 +2231,7 @@ bool Courtroom::handle_objection()
sfx_player->clear(); // Objection played! Cut all sfx.
return true;
}
+ if (m_chatmessage[EMOTE] != "")
display_character();
return false;
}
@@ -2389,22 +2390,31 @@ void Courtroom::handle_ic_message()
// Update the chatbox information
initialize_chatbox();
- // Display our own character
- display_character();
+ int emote_mod = m_chatmessage[EMOTE_MOD].toInt();
+ bool immediate = m_chatmessage[IMMEDIATE].toInt() == 1;
+ if (m_chatmessage[EMOTE] != "") {
+ // Display our own character
+ display_character();
- // Reset the pair character
- ui_vp_sideplayer_char->stop();
- ui_vp_sideplayer_char->move(0, 0);
+ // Reset the pair character
+ ui_vp_sideplayer_char->stop();
+ ui_vp_sideplayer_char->move(0, 0);
- // If the emote_mod is not zooming
- int emote_mod = m_chatmessage[EMOTE_MOD].toInt();
- if (emote_mod != 5 && emote_mod != 6) {
- // Display the pair character
- display_pair_character(m_chatmessage[OTHER_CHARID], m_chatmessage[OTHER_OFFSET]);
- }
+ // If the emote_mod is not zooming
+ if (emote_mod != 5 && emote_mod != 6) {
+ // Display the pair character
+ display_pair_character(m_chatmessage[OTHER_CHARID], m_chatmessage[OTHER_OFFSET]);
+ }
- // Parse the emote_mod part of the chat message
- handle_emote_mod(m_chatmessage[EMOTE_MOD].toInt(), m_chatmessage[IMMEDIATE].toInt() == 1);
+ // Parse the emote_mod part of the chat message
+ handle_emote_mod(emote_mod, immediate);
+ }
+ else
+ {
+ start_chat_ticking();
+ if (emote_mod == 1 || emote_mod == 2 || emote_mod == 6 || immediate)
+ play_sfx();
+ }
// if we have instant objections disabled, and queue is not empty, check if next message after this is an objection.
if (!ao_app->is_instant_objection_enabled() && chatmessage_queue.size() > 0)
@@ -3300,26 +3310,31 @@ void Courtroom::chat_tick()
if (tick_pos >= f_message.size()) {
text_state = 2;
- if (anim_state < 3) {
- QStringList c_paths = {
- ao_app->get_image_suffix(ao_app->get_character_path(m_chatmessage[CHAR_NAME], "(c)" + m_chatmessage[EMOTE])),
- ao_app->get_image_suffix(ao_app->get_character_path(m_chatmessage[CHAR_NAME], "(c)/" + m_chatmessage[EMOTE]))
- };
- // if there is a (c) animation for this emote and we haven't played it already
- if (file_exists(ui_vp_player_char->find_image(c_paths)) &&(!c_played)) {
- anim_state = 5;
- ui_vp_player_char->set_play_once(true);
- filename = "(c)" + m_chatmessage[EMOTE];
- c_played = true;
- }
- else {
- anim_state = 3;
- ui_vp_player_char->set_play_once(false);
- filename = "(a)" + m_chatmessage[EMOTE];
+ // Check if we're a narrator msg
+ if (m_chatmessage[EMOTE] != "") {
+ if (anim_state < 3) {
+ QStringList c_paths = {
+ ao_app->get_image_suffix(ao_app->get_character_path(m_chatmessage[CHAR_NAME], "(c)" + m_chatmessage[EMOTE])),
+ ao_app->get_image_suffix(ao_app->get_character_path(m_chatmessage[CHAR_NAME], "(c)/" + m_chatmessage[EMOTE]))
+ };
+ // if there is a (c) animation for this emote and we haven't played it already
+ if (file_exists(ui_vp_player_char->find_image(c_paths)) &&(!c_played)) {
+ anim_state = 5;
+ ui_vp_player_char->set_play_once(true);
+ filename = "(c)" + m_chatmessage[EMOTE];
+ c_played = true;
+ }
+ else {
+ anim_state = 3;
+ ui_vp_player_char->set_play_once(false);
+ filename = "(a)" + m_chatmessage[EMOTE];
+ }
+ ui_vp_player_char->load_image(filename, m_chatmessage[CHAR_NAME], 0,
+ false);
}
- ui_vp_player_char->load_image(filename, m_chatmessage[CHAR_NAME], 0,
- false);
}
+ else // We're a narrator msg
+ anim_state = 3;
QString f_char;
QString f_custom_theme;
if (ao_app->is_customchat_enabled()) {
@@ -3520,28 +3535,30 @@ void Courtroom::chat_tick()
msg_delay = qMin(max_delay, msg_delay * punctuation_modifier);
}
- // If this color is talking
- if (color_is_talking && anim_state != 2 &&
- anim_state <
- 4) // Set it to talking as we're not on that already (though we have
- // to avoid interrupting a non-interrupted preanim)
- {
- ui_vp_player_char->stop();
- ui_vp_player_char->set_play_once(false);
- filename = "(b)" + m_chatmessage[EMOTE];
- ui_vp_player_char->load_image(filename, m_chatmessage[CHAR_NAME], 0,
- false);
- anim_state = 2;
- }
- else if (!color_is_talking && anim_state < 3 &&
- anim_state != 3) // Set it to idle as we're not on that already
- {
- ui_vp_player_char->stop();
- ui_vp_player_char->set_play_once(false);
- filename = "(a)" + m_chatmessage[EMOTE];
- ui_vp_player_char->load_image(filename, m_chatmessage[CHAR_NAME], 0,
- false);
- anim_state = 3;
+ if (m_chatmessage[EMOTE] != "") {
+ // If this color is talking
+ if (color_is_talking && anim_state != 2 &&
+ anim_state <
+ 4) // Set it to talking as we're not on that already (though we have
+ // to avoid interrupting a non-interrupted preanim)
+ {
+ ui_vp_player_char->stop();
+ ui_vp_player_char->set_play_once(false);
+ filename = "(b)" + m_chatmessage[EMOTE];
+ ui_vp_player_char->load_image(filename, m_chatmessage[CHAR_NAME], 0,
+ false);
+ anim_state = 2;
+ }
+ else if (!color_is_talking && anim_state < 3 &&
+ anim_state != 3) // Set it to idle as we're not on that already
+ {
+ ui_vp_player_char->stop();
+ ui_vp_player_char->set_play_once(false);
+ filename = "(a)" + m_chatmessage[EMOTE];
+ ui_vp_player_char->load_image(filename, m_chatmessage[CHAR_NAME], 0,
+ false);
+ anim_state = 3;
+ }
}
// Continue ticking
chat_tick_timer->start(msg_delay);