summaryrefslogtreecommitdiffstats
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
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
-rw-r--r--crawl-ref/docs/options_guide.txt10
-rw-r--r--crawl-ref/source/acr.cc8
-rw-r--r--crawl-ref/source/cio.cc1
-rw-r--r--crawl-ref/source/debug.cc16
-rw-r--r--crawl-ref/source/message.cc68
-rw-r--r--crawl-ref/source/message.h3
-rw-r--r--crawl-ref/source/view.cc2
7 files changed, 88 insertions, 20 deletions
diff --git a/crawl-ref/docs/options_guide.txt b/crawl-ref/docs/options_guide.txt
index 73346a7c9c..224d86d347 100644
--- a/crawl-ref/docs/options_guide.txt
+++ b/crawl-ref/docs/options_guide.txt
@@ -1398,10 +1398,12 @@ force_more_message = <list of regexes>
The syntax is identical to that of travel_stop_message (4-g).
msg_condense_repeats = true
- If the same message is repeated multiple times, then the Show
- Previous Message command (Ctrl-P) will condense them into one
- line indicating how many times it was repeated. For example:
- You hear a distant "Zot!" (x3)
+ If the same message is repeated multiple times during the same
+ turn, then it will be output in a condensed format indicating
+ how many times it was repeated. If the same output (including the
+ counter) is repeated over several turns, the Show Previous Message
+ command (Ctrl-P) will likewise condense them into one. For example:
+ The killer bee misses you. (x5)
4-k Missiles.
-----------------
diff --git a/crawl-ref/source/acr.cc b/crawl-ref/source/acr.cc
index 0d75164a24..3502c222c4 100644
--- a/crawl-ref/source/acr.cc
+++ b/crawl-ref/source/acr.cc
@@ -880,6 +880,7 @@ static void _input()
// Currently only set if Xom accidentally kills the player.
you.reset_escaped_death();
+ flush_prev_message();
if (crawl_state.is_replaying_keys() && crawl_state.is_repeating_cmd()
&& kbhit())
@@ -909,7 +910,7 @@ static void _input()
else if (player_feels_safe && you.level_type != LEVEL_ABYSS)
{
// We don't want those "Whew, it's safe to rest now" messages
- // when you were just cast into the Abyss. Right?
+ // if you were just cast into the Abyss. Right?
if (2 * you.hp < you.hp_max
|| 2 * you.magic_points < you.max_magic_points)
@@ -946,9 +947,10 @@ static void _input()
if (you.cannot_act())
{
if (crawl_state.repeat_cmd != CMD_WIZARD)
+ {
crawl_state.cancel_cmd_repeat("Cannot move, cancelling command "
"repetition.");
-
+ }
world_reacts();
return;
}
@@ -990,6 +992,8 @@ static void _input()
crawl_state.input_line_curr = 0;
{
+ flush_prev_message();
+
// Enable the cursor to read input. The cursor stays on while
// the command is being processed, so subsidiary prompts
// shouldn't need to turn it on explicitly.
diff --git a/crawl-ref/source/cio.cc b/crawl-ref/source/cio.cc
index d82edfcd83..f8ac4bb957 100644
--- a/crawl-ref/source/cio.cc
+++ b/crawl-ref/source/cio.cc
@@ -126,7 +126,6 @@ void get_input_line( char *const buff, int len )
std::string &line = crawl_state.input_line_strs[curr];
strcpy(buff, line.c_str());
-
return;
}
diff --git a/crawl-ref/source/debug.cc b/crawl-ref/source/debug.cc
index 27610c837e..903a3ca841 100644
--- a/crawl-ref/source/debug.cc
+++ b/crawl-ref/source/debug.cc
@@ -1592,13 +1592,16 @@ bool get_item_by_name(item_def *item, char* specs,
{
const char* prompt;
if (item->sub_type == POT_BLOOD)
+ {
prompt = "# turns away from coagulation? "
"[ENTER for fully fresh] ";
+ }
else
+ {
prompt = "# turns away from rotting? "
"[ENTER for fully fresh] ";
- int age =
- _debug_prompt_for_int(prompt, false);
+ }
+ int age = _debug_prompt_for_int(prompt, false);
if (age <= 0)
age = -1;
@@ -1766,7 +1769,7 @@ static void _tweak_randart(item_def &item)
{
case RAP_VAL_BOOL:
mprf(MSGCH_PROMPT, "Toggling %s to %s.", _prop_name[choice],
- props[choice] ? "off" : "on");
+ props[choice] ? "off" : "on", 1);
randart_set_property(item, static_cast<randart_prop_type>(choice),
!props[choice]);
break;
@@ -1820,11 +1823,15 @@ void wizard_tweak_object(void)
mpr( you.inv[item].name(DESC_INVENTORY_EQUIP).c_str() );
if (is_art)
+ {
mpr( "a - plus b - plus2 c - art props d - quantity "
"e - flags ESC - exit", MSGCH_PROMPT );
+ }
else
+ {
mpr( "a - plus b - plus2 c - special d - quantity "
"e - flags ESC - exit", MSGCH_PROMPT );
+ }
mpr( "Which field? ", MSGCH_PROMPT );
@@ -1908,7 +1915,8 @@ static bool _make_book_randart(item_def &book)
{
mpr("Make book fixed [t]heme or fixed [l]evel? ", MSGCH_PROMPT);
type = tolower(getch());
- } while (type != 't' && type != 'l');
+ }
+ while (type != 't' && type != 'l');
if (type == 'l')
return make_book_level_randart(book);
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)
diff --git a/crawl-ref/source/message.h b/crawl-ref/source/message.h
index 49830df41f..86474a585e 100644
--- a/crawl-ref/source/message.h
+++ b/crawl-ref/source/message.h
@@ -22,8 +22,9 @@
* misc - player - spell - spl-book - spells1 - spells2 -
* spells3
* *********************************************************************** */
-void mesclr( bool force = false );
+void mesclr(bool force = false);
+void flush_prev_message();
// last updated 12may2000 {dlb}
/* ***********************************************************************
diff --git a/crawl-ref/source/view.cc b/crawl-ref/source/view.cc
index adf8159188..37886423ce 100644
--- a/crawl-ref/source/view.cc
+++ b/crawl-ref/source/view.cc
@@ -5085,6 +5085,8 @@ static void _debug_pane_bounds()
//---------------------------------------------------------------
void viewwindow(bool draw_it, bool do_updates)
{
+ flush_prev_message();
+
#ifdef USE_TILE
std::vector<unsigned int> tileb(
crawl_view.viewsz.y * crawl_view.viewsz.x * 2);