summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/message.cc
diff options
context:
space:
mode:
authorj-p-e-g <j-p-e-g@c06c8d41-db1a-0410-9941-cceddc491573>2009-02-27 21:05:46 +0000
committerj-p-e-g <j-p-e-g@c06c8d41-db1a-0410-9941-cceddc491573>2009-02-27 21:05:46 +0000
commitffd7b999da940618860de7ce6e786175bc9af184 (patch)
treec63ae48a90b609dfa7391acd60b39fb338544fc4 /crawl-ref/source/message.cc
parent6c3c530aa8b2d0d48c90e67d7dcac3681b405131 (diff)
downloadcrawl-ref-ffd7b999da940618860de7ce6e786175bc9af184.tar.gz
crawl-ref-ffd7b999da940618860de7ce6e786175bc9af184.zip
Implement a very basic attempt at message condensation: Store the most
recent message in prev_message and only output it when another non-matching message rolls in or the player gets a turn. Matching messages (must be identical and issued in direct succession, like is the case with the message history condensation) increase the counter, so you end up with messages like: You feel sick. The killer bee misses you. (x3) The killer bee stings you. The killer bee stings you but doesn't do any damage. The killer bee misses you. (x5) ...instead of the 11 lines it would have been in total. This behaviour is controlled by the same option as the condensation in the message history, msg_condense_repeats. There's definitely room for improvement. At the moment the bracketed information is written into the message itself, which will prevent further merging in the message history, or, probably worse, cause ugly double-merging like "The killer bee misses you. (x3) (x2)". git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@9262 c06c8d41-db1a-0410-9941-cceddc491573
Diffstat (limited to 'crawl-ref/source/message.cc')
-rw-r--r--crawl-ref/source/message.cc68
1 files changed, 60 insertions, 8 deletions
diff --git a/crawl-ref/source/message.cc b/crawl-ref/source/message.cc
index ffabd700a3..8f7c88c88b 100644
--- a/crawl-ref/source/message.cc
+++ b/crawl-ref/source/message.cc
@@ -56,6 +56,7 @@ public:
// Circular buffer for keeping past messages.
message_item Store_Message[ NUM_STORED_MESSAGES ]; // buffer of old messages
+message_item prev_message;
int Next_Message = 0; // end of messages
int Message_Line = 0; // line of next (previous?) message
@@ -65,7 +66,7 @@ static FILE* _msg_dump_file = NULL;
static bool suppress_messages = false;
static void base_mpr(const char *inf, msg_channel_type channel, int param,
- unsigned char colour);
+ unsigned char colour, bool check_previous_msg = true);
static unsigned char prepare_message(const std::string& imsg,
msg_channel_type channel,
int param);
@@ -660,11 +661,11 @@ static void mpr_store_messages(const std::string& message,
if (prev_message_num < 0)
prev_message_num = NUM_STORED_MESSAGES - 1;
- message_item &prev_message = Store_Message[prev_message_num];
+ message_item &prev_msg = Store_Message[prev_message_num];
- if (prev_message.repeats > 0 && prev_message.channel == channel
- && prev_message.param == param && prev_message.text == message
- && prev_message.colour == colour)
+ if (prev_msg.repeats > 0 && prev_msg.channel == channel
+ && prev_msg.param == param && prev_msg.text == message
+ && prev_msg.colour == colour)
{
prev_message.repeats++;
was_repeat = true;
@@ -750,14 +751,65 @@ static void handle_more(int colour)
}
}
-static void base_mpr(const char *inf, msg_channel_type channel, int param,
- unsigned char colour)
+// Output the previous message.
+// Needs to be called whenever the player gets a turn or needs to do
+// something, e.g. answer a prompt.
+void flush_prev_message()
{
- const std::string imsg = inf;
+ if (prev_message.text.empty())
+ return;
+
+ if (prev_message.repeats > 1)
+ {
+ snprintf(info, INFO_SIZE, "%s (x%d)",
+ prev_message.text.c_str(), prev_message.repeats);
+ prev_message.text = info;
+ }
+ base_mpr(prev_message.text.c_str(), prev_message.channel,
+ prev_message.param, prev_message.colour, false);
+ prev_message = message_item();
+}
+
+static void base_mpr(const char *inf, msg_channel_type channel, int param,
+ unsigned char colour, bool check_previous_msg)
+{
if (colour == MSGCOL_MUTED)
return;
+ const std::string imsg = inf;
+
+ if (check_previous_msg)
+ {
+ if (!prev_message.text.empty())
+ {
+ // If a message is identical to the previous one, increase the
+ // counter.
+ if (Options.msg_condense_repeats && prev_message.channel == channel
+ && prev_message.param == param && prev_message.text == imsg
+ && prev_message.colour == colour)
+ {
+ prev_message.repeats++;
+ return;
+ }
+ flush_prev_message();
+ }
+
+ // Always output prompts right away.
+ if (channel == MSGCH_PROMPT)
+ prev_message = message_item();
+ else
+ {
+ // Store other messages until later.
+ prev_message.text = imsg;
+ prev_message.channel = channel;
+ prev_message.param = param;
+ prev_message.colour = colour;
+ prev_message.repeats = 1;
+ return;
+ }
+ }
+
handle_more(colour);
if (need_prefix)