void game_display::pre_draw() { process_reachmap_changes(); /** * @todo FIXME: must modify changed, but best to do it at the * floating_label level */ prune_chat_messages(); }
void game_display::pre_draw() { if (resources::whiteboard) { resources::whiteboard->pre_draw(); } process_reachmap_changes(); /** * @todo FIXME: must modify changed, but best to do it at the * floating_label level */ prune_chat_messages(); }
void clear_chat_messages() { prune_chat_messages(true); }
void display_chat_manager::add_chat_message(const time_t& time, const std::string& speaker, int side, const std::string& message, events::chat_handler::MESSAGE_TYPE type, bool bell) { const bool whisper = speaker.find("whisper: ") == 0; std::string sender = speaker; if (whisper) { sender.assign(speaker, 9, speaker.size()); add_whisperer( sender ); } //remove disconnected user from whisperer std::string::size_type pos = message.find(" has disconnected"); if (pos != std::string::npos){ for(std::set<std::string>::const_iterator w = whisperers().begin(); w != whisperers().end(); ++w){ if (*w == message.substr(0,pos)) remove_whisperer(*w); } } if (!preferences::parse_should_show_lobby_join(sender, message)) return; if (preferences::is_ignored(sender)) return; preferences::parse_admin_authentication(sender, message); bool is_observer = false; { //TODO: Clean this block up somehow const game_board * board = dynamic_cast<const game_board*>(&my_disp_.get_disp_context()); if (board) { is_observer = board->is_observer(); } } if (bell) { if ((type == events::chat_handler::MESSAGE_PRIVATE && (!is_observer || whisper)) || utils::word_match(message, preferences::login())) { mp_ui_alerts::private_message(false, sender, message); } else if (preferences::is_friend(sender)) { mp_ui_alerts::friend_message(false, sender, message); } else if (sender == "server") { mp_ui_alerts::server_message(false, sender, message); } else { mp_ui_alerts::public_message(false, sender, message); } } bool action = false; std::string msg; if (message.compare(0,4,"/me ") == 0) { msg.assign(message, 4, message.size()); action = true; } else { msg = message; } try { // We've had a joker who send an invalid utf-8 message to crash clients // so now catch the exception and ignore the message. msg = my_disp_.video().faked() ? "" : font::word_wrap_text(msg,font::SIZE_NORMAL,my_disp_.map_outside_area().w*3/4); } catch (utf8::invalid_utf8_exception&) { ERR_NG << "Invalid utf-8 found, chat message is ignored." << std::endl; return; } int ypos = chat_message_x; for(std::vector<chat_message>::const_iterator m = chat_messages_.begin(); m != chat_messages_.end(); ++m) { ypos += std::max(font::get_floating_label_rect(m->handle).h, font::get_floating_label_rect(m->speaker_handle).h); } color_t speaker_color {255,255,255,SDL_ALPHA_OPAQUE}; if(side >= 1) { speaker_color = team::get_side_color_range(side).mid(); } color_t message_color = chat_message_color; std::stringstream str; std::stringstream message_str; if(type == events::chat_handler::MESSAGE_PUBLIC) { if(action) { str << "<" << speaker << " " << msg << ">"; message_color = speaker_color; message_str << " "; } else { if (!speaker.empty()) str << "<" << speaker << ">"; message_str << msg; } } else { if(action) { str << "*" << speaker << " " << msg << "*"; message_color = speaker_color; message_str << " "; } else { if (!speaker.empty()) str << "*" << speaker << "*"; message_str << msg; } } // Prepend message with timestamp. std::stringstream message_complete; message_complete << preferences::get_chat_timestamp(time) << str.str(); const SDL_Rect rect = my_disp_.map_outside_area(); font::floating_label spk_flabel(message_complete.str()); spk_flabel.set_font_size(font::SIZE_NORMAL); spk_flabel.set_color(speaker_color); spk_flabel.set_position(rect.x + chat_message_x, rect.y + ypos); spk_flabel.set_clip_rect(rect); spk_flabel.set_alignment(font::LEFT_ALIGN); spk_flabel.set_bg_color(chat_message_bg); spk_flabel.set_border_size(chat_message_border); spk_flabel.use_markup(false); int speaker_handle = font::add_floating_label(spk_flabel); font::floating_label msg_flabel(message_str.str()); msg_flabel.set_font_size(font::SIZE_NORMAL); msg_flabel.set_color(message_color); msg_flabel.set_position(rect.x + chat_message_x + font::get_floating_label_rect(speaker_handle).w, rect.y + ypos); msg_flabel.set_clip_rect(rect); msg_flabel.set_alignment(font::LEFT_ALIGN); msg_flabel.set_bg_color(chat_message_bg); msg_flabel.set_border_size(chat_message_border); msg_flabel.use_markup(false); int message_handle = font::add_floating_label(msg_flabel); chat_messages_.emplace_back(speaker_handle,message_handle); prune_chat_messages(); }
game_display::~game_display() { // SDL_FreeSurface(minimap_); prune_chat_messages(true); }