summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCharles Otto <ottochar@gmail.com>2009-10-31 20:54:58 -0400
committerCharles Otto <ottochar@gmail.com>2009-10-31 20:55:48 -0400
commit16f4be755988dd1fb4b4918ab5c2e43fe721d4b9 (patch)
treec156cb9632048878e58ed0842ddeac2155565462
parentada7f5b32b5b783b272e744082865f6f506b5bd2 (diff)
downloadcrawl-ref-16f4be755988dd1fb4b4918ab5c2e43fe721d4b9.tar.gz
crawl-ref-16f4be755988dd1fb4b4918ab5c2e43fe721d4b9.zip
Fix bug [2874237] monster info display corruption
Examining monsters with ctrl-X can lead to message corruption if the title and body fields of the describe_info struct used by process_description take up lines than fit in the message area. This patch avoid the problem by allowing process_description to print just the title field if title + body would take up too many lines. Also make view_desc_proc start one line later since it seemed to be trying to print the first line it was given one line above where it should have been.
-rw-r--r--crawl-ref/source/describe.h30
-rw-r--r--crawl-ref/source/directn.cc6
2 files changed, 27 insertions, 9 deletions
diff --git a/crawl-ref/source/describe.h b/crawl-ref/source/describe.h
index 9e71c2a337..5751678335 100644
--- a/crawl-ref/source/describe.h
+++ b/crawl-ref/source/describe.h
@@ -136,22 +136,34 @@ inline void process_description(T &proc, const describe_info &inf)
std::string desc;
- if (inf.title.empty())
- desc = inf.body.str();
- else
- {
- desc = inf.title + "$$";
- desc += inf.body.str();
- }
-
- int num_lines = count_desc_lines(desc, line_width) + 1;
+ // How mnay lines is the title, we also seem to be adding 1 to
+ // start with.
+ int num_lines = count_desc_lines(inf.title, line_width) + 1;
+ int body_lines = count_desc_lines(inf.body.str(), line_width);
const int suffix_lines = count_desc_lines(inf.suffix, line_width);
const int prefix_lines = count_desc_lines(inf.prefix, line_width);
const int footer_lines = count_desc_lines(inf.footer, line_width)
+ (inf.footer.empty() ? 0 : 1);
const int quote_lines = count_desc_lines(inf.quote, line_width);
+ // Maybe skip the body if body + title would be too many lines
+ if(inf.title.empty())
+ {
+ desc = inf.body.str();
+ // There is a default 1 line addition for some reason
+ num_lines = body_lines + 1;
+ }
+ else if(body_lines + num_lines + 2 <= height)
+ {
+ desc = inf.title + "$$";
+ desc += inf.body.str();
+ // Got 2 lines from the two $s that weren't counted yet
+ num_lines += body_lines + 2;
+ }
+ else
+ desc = inf.title + "$";
+
// Prefer the footer over the suffix.
if (num_lines + suffix_lines + footer_lines <= height)
{
diff --git a/crawl-ref/source/directn.cc b/crawl-ref/source/directn.cc
index dfa9dfd251..7dc912ccba 100644
--- a/crawl-ref/source/directn.cc
+++ b/crawl-ref/source/directn.cc
@@ -456,6 +456,12 @@ static void _direction_again(dist& moves, targetting_type restricts,
class view_desc_proc
{
public:
+ view_desc_proc()
+ {
+ // This thing seems to be starting off 1 line above where it
+ // should be. -cao
+ nextline();
+ }
int width() { return crawl_view.msgsz.x; }
int height() { return crawl_view.msgsz.y; }
void print(const std::string &str) { cprintf("%s", str.c_str()); }