コード例 #1
0
ファイル: game_display.cpp プロジェクト: dodikk/iWesnoth
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();
}
コード例 #2
0
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();
}
コード例 #3
0
	void clear_chat_messages() { prune_chat_messages(true); }
コード例 #4
0
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();
}
コード例 #5
0
game_display::~game_display()
{
	// SDL_FreeSurface(minimap_);
	prune_chat_messages(true);
}