summary text for block messages (trunk only)

[Make use of recent message history changes.]

     Add support to makedefs and the core for including a line of summary
text with quest messages that don't use pline() delivery.  The multi-line
record structure of quest.txt begins each entry with %C and ends with %E.
makedefs now examines the %E lines looking for "[anything]" and adds that
to quest.dat where deliver_by_window() can find it.  The square brackets
are required in the input and intentionally carried along to the output.
putmsghistory() is used to put the summary text into the message history
buffer for use by ^P, without being displayed first.  (So this is a no-op
for interfaces which haven't implemented putmsghistory yet.  Maybe
genl_putmsghistory() should pass such text to pline() as a quick hack?)

     This adds a few summary lines to quest.txt so that the feature can
be tested.  Most of them were written by <Someone> nearly three years
ago.  I'm planning to add a couple of new control codes that'll allow some
of them to expand into shorter text.  (The one where the Archeologist
leader tells you that the nemesis stole the artifact so your mission is
to find the goal level, defeat the nemesis, and return with the artifact
ends up being roughly 160 characters long.)
This commit is contained in:
nethack.rankin
2009-04-06 02:50:41 +00:00
parent f468865494
commit a86187b398
5 changed files with 122 additions and 31 deletions

View File

@@ -59,7 +59,7 @@ All of the windows are boarded up, and there are objects scattered around
the entrance.
Strange forbidding shapes seem to be moving in the distance.
%E
%E [You arrive at %H, but all is not well.]
%Cp Arc 00002
Once again, you are back at %H.
%E
@@ -101,7 +101,7 @@ You have an odd feeling this may be the last time you ever come here.
"Finally you have returned, %p. You were always
my most promising student. Allow me to see if you are ready for the
most difficult task of your career."
%E
%E [You have returned, %p, to a difficult task.]
%Cp Arc 00016
"Again, %p, you stand before me.
Let me see if you have gained experience in the interim."
@@ -115,20 +115,20 @@ Are you finally ready for the task that must be accomplished?"
vain. Begone! Your tenure at this college has been revoked!
"You are a disgrace to the profession!"
%E
%E [%pC, you have failed us. Begone!]
%Cc Arc 00019
"%p, you are yet too inexperienced to undertake such a demanding
quest. A mere %r could not possibly face the rigors demanded and
survive. Go forth, and come here again when your adventures have further
taught you."
%E
%E [%pC, a mere %r is too inexperienced.]
%Cc Arc 00020
"%pC! I've heard that you've been using sloppy techniques. Your
results lately can hardly be called suitable for %ra!
"How could you have strayed from the %a path? Go from here, and come
back only when you have purified yourself."
%E
%E [%pC, you have strayed from the %a path. Purify yourself!]
%Cc Arc 00021
"Grave times have befallen the college, for %na has
stolen %o. Without it, the board of directors of
@@ -144,7 +144,7 @@ to me.
close this college.
"May the wisdom of %d be your guide."
%E
%E [%nC has stolen %o. Locate %i, defeat %n within, and return %o.]
%Cp Arc 00025
"Beware, for %n is powerful and cunning."
%E
@@ -182,7 +182,7 @@ A plain opens before you. Beyond the plain lies a foreboding edifice.
You have the feeling that you will soon find the entrance to
%i.
%E
%E [This foreboding edifice must hide the entrance to %i.]
%Cp Arc 00036
Once again, you are near the entrance to %i.
%E
@@ -191,7 +191,7 @@ A strange feeling washes over you, and you think back to things you
learned during the many lectures of %l.
You realize the feeling must be the presence of %o.
%E
%E [This strange feeling must be the presence of %o.]
%Cp Arc 00041
The familiar presence of %o is in the ether.
%E
@@ -200,14 +200,14 @@ The familiar presence of %o is in the ether.
%o, when your teacher, %l, has already failed.
"Come, try your best! I shall destroy you, and gnaw on your bones."
%E
%E [Come, %p, I shall destroy you!]
%Cc Arc 00051
"Again you try to best me, eh %p? Well, you shall fail again.
"You shall never recover %o.
"I shall bear your soul to the Plane of Origins for my master's pleasure."
%E
%E [Again you try to best me, %p? You shall never recover %o.]
%Cp Arc 00052
"You persist yet %p! Good. Now, you shall die!"
%E
@@ -250,7 +250,7 @@ falter!"
The power of %o flows through your body! You feel
as if you could now take on the Wizard of Yendor himself and win, but
you know you must return %o to %l.
%E
%E [The power of %o flows through your body! You must return it to %l.]
%Cp Arc 00080
The body of %n dissipates in a cloud of noxious fumes.
%E
@@ -266,18 +266,18 @@ Please take %o with you. You, %p, can
guard it now far better than I.
May the blessings of %d follow you and guard you."
%E
%E [%lC instructs you to guard %o from now on.]
# assumes Orb of Detection (glass object)
%Cc Arc 00082
"Careful, %p! %oC might break, and that would be
a tragic loss. You are its keeper now, and the time has come to
resume your search for the Amulet. %Z await your
return through the magic portal that brought you here."
%E
%E [Resume your search for the Amulet beyond the magic portal to %Z.]
%Cc Arc 00090
"Welcome back, %p. Have you progressed with your quest to
regain the Amulet of Yendor for %d?"
%E
%E [Have you progressed with your quest to regain the Amulet of Yendor for %d?]
%Cc Arc 00091
"Congratulations, %p. I wondered if anyone could prevail against
the Wizard and the minions of Moloch. Now, you must embark on one
@@ -288,7 +288,7 @@ There you must find the altar of %d and sacrifice the
Amulet on that altar to fulfill your destiny.
"Remember, your path now should always be upwards."
%E
%E [Take the Amulet to the Astral Plane and sacrifice it at the altar of %d.]
#
# Barbarian
#
@@ -3338,7 +3338,7 @@ from birth as the instrument of %d. You are destined
to recover the Amulet for your deity, or die in the
attempt. Your hour of destiny has come. For the sake
of us all: Go bravely with %d!
%E
%E [%dC has chosen you to recover the Amulet of Yendor.]
%Cp - 00002
You receive a faint telepathic message from %l:
Your help is urgently needed at %H!
@@ -3468,7 +3468,7 @@ you will never be able to enter the place where he who has the Amulet
resides.
Go now! You are banished from this place.
%E
%E [You are banished from %H for betraying your allegiance to %d.]
#
# TEST PATTERN
#

View File

@@ -9,11 +9,16 @@
/* (i.e., num roles + 1) */
#define LEN_HDR 3 /* Maximum length of a category name */
/* quest text message buffer sizes; used to be hardcoded as 80 and 128, but
have been expanded to allow some slop for block message summary lines */
#define QTEXT_IN_SIZ 100 /* used by both nethack and makedefs */
#define QTEXT_OUTSIZ 200 /* used only by nethack */
struct qtmsg {
int msgnum;
char delivery;
long offset,
size;
size, summary_size;
};
#ifdef MAKEDEFS_C /***** MAKEDEFS *****/
@@ -37,6 +42,10 @@ struct qthdr {
#define END_NOT_IN_MSG "End record encountered before message - line %d\n"
#define TEXT_NOT_IN_MSG "Text encountered outside message - line %d\n"
#define UNREC_CREC "Unrecognized Control record at line %d\n"
#define MAL_SUM "Malformed summary in End record - line %d\n"
#define DUMB_SUM "Summary for single line message is useless - line %d\n"
#define CTRL_TRUNC "Control record truncated at line %d\n"
#define TEXT_TRUNC "Text record truncated at line %d\n"
#define OUT_OF_HEADERS "Too many message types (line %d)\nAdjust N_HDR in qtext.h and recompile.\n"
#define OUT_OF_MESSAGES "Too many messages in class (line %d)\nAdjust N_MSG in qtext.h and recompile.\n"

View File

@@ -29,7 +29,7 @@ STATIC_DCL void FDECL(deliver_by_pline, (struct qtmsg *));
STATIC_DCL void FDECL(deliver_by_window, (struct qtmsg *,int));
STATIC_DCL boolean FDECL(skip_pager, (BOOLEAN_P));
static char in_line[80], cvt_buf[64], out_line[128];
static char in_line[QTEXT_IN_SIZ], out_line[QTEXT_OUTSIZ], cvt_buf[64];
static struct qtlists qt_list;
static dlb *msg_file;
/* used by ldrname() and neminame(), then copied into cvt_buf */
@@ -366,7 +366,7 @@ struct qtmsg *qt_msg;
long size;
for (size = 0; size < qt_msg->size; size += (long)strlen(in_line)) {
(void) dlb_fgets(in_line, 80, msg_file);
(void) dlb_fgets(in_line, QTEXT_IN_SIZ, msg_file);
convert_line();
pline("%s", out_line);
}
@@ -382,12 +382,20 @@ int how;
winid datawin = create_nhwindow(how);
for (size = 0; size < qt_msg->size; size += (long)strlen(in_line)) {
(void) dlb_fgets(in_line, 80, msg_file);
(void) dlb_fgets(in_line, QTEXT_IN_SIZ, msg_file);
convert_line();
putstr(datawin, 0, out_line);
}
display_nhwindow(datawin, TRUE);
destroy_nhwindow(datawin);
/* block messages delivered by window aren't kept in message history
but can have a one-line summary which is put there for ^P recall */
if (qt_msg->summary_size) {
(void) dlb_fgets(in_line, QTEXT_IN_SIZ, msg_file);
convert_line();
putmsghistory(out_line, FALSE);
}
}
boolean

View File

@@ -181,6 +181,7 @@ static int FDECL(get_hdr, (char *));
static boolean FDECL(new_id, (char *));
static boolean FDECL(known_msg, (int,int));
static void FDECL(new_msg, (char *,int,int));
static char *FDECL(valid_qt_summary, (char *,BOOLEAN_P));
static void FDECL(do_qt_control, (char *));
static void FDECL(do_qt_text, (char *));
static void NDECL(adjust_qt_hdrs);
@@ -2011,12 +2012,60 @@ new_msg(s, num, id)
qt_msg = &(msg_hdr[num].qt_msg[msg_hdr[num].n_msg++]);
qt_msg->msgnum = id;
qt_msg->delivery = s[2];
qt_msg->offset = qt_msg->size = 0L;
qt_msg->offset = qt_msg->size = qt_msg->summary_size = 0L;
curr_msg = qt_msg;
}
}
/* check %E record for "[summary text]" that nethack can stuff into the
message history buffer when delivering text via window instead of pline */
static char *
valid_qt_summary(s, parsing)
char *s; /* end record: "%E" optionally followed by " [summary]" */
boolean parsing; /* curr_msg is valid iff this is True */
{
static char summary[BUFSZ];
char *p;
if (*s != '%' || *(s + 1) != 'E') return (char *)0;
if ((p = index(s, '[')) == 0) return (char *)0;
/* note: opening '[' and closing ']' will be retained in the output;
anything after ']' will be discarded by putting a newline there */
Strcpy(summary, p);
/* have an opening bracket; summary[] holds it and all text that follows */
p = eos(summary);
/* find closing bracket */
while (p > summary && *(p - 1) != ']') --p;
if (p == summary) {
/* we backed up all the way to the start without finding a bracket */
if (parsing) /* malformed summary */
Fprintf(stderr, MAL_SUM, qt_line);
} else if (p == summary + 1) {
; /* ignore empty [] */
} else { /* got something */
/* p points one spot past ']', usually to '\n';
we need to include the \n as part of the size */
if (parsing) {
/* during the writing pass we won't be able to recheck
delivery, so any useless summary for a pline mode
message has to be carried along to the output file */
if (curr_msg->delivery == 'p')
Fprintf(stderr, DUMB_SUM, qt_line);
/* +1 is for terminating newline */
curr_msg->summary_size = (long)(p - summary) + 1L;
} else {
/* caller is writing rather than just parsing;
force newline after the closing bracket */
Strcpy(p, "\n");
}
return summary;
}
return (char *)0;
}
static void
do_qt_control(s)
char *s;
@@ -2024,6 +2073,9 @@ do_qt_control(s)
char code[BUFSZ];
int num, id = 0;
if (!index(s, '\n'))
Fprintf(stderr, CTRL_TRUNC, qt_line);
switch(s[1]) {
case 'C': if(in_msg) {
@@ -2047,8 +2099,11 @@ do_qt_control(s)
case 'E': if(!in_msg) {
Fprintf(stderr, END_NOT_IN_MSG, qt_line);
break;
} else in_msg = FALSE;
} else {
/* sets curr_msg->summary_size if applicable */
(void) valid_qt_summary(s, TRUE);
in_msg = FALSE;
}
break;
default: Fprintf(stderr, UNREC_CREC, qt_line);
@@ -2062,7 +2117,10 @@ do_qt_text(s)
{
if (!in_msg) {
Fprintf(stderr, TEXT_NOT_IN_MSG, qt_line);
} else if (!index(s, '\n')) {
Fprintf(stderr, TEXT_TRUNC, qt_line);
}
curr_msg->size += strlen(s);
return;
}
@@ -2083,7 +2141,8 @@ adjust_qt_hdrs()
for(j = 0; j < msg_hdr[i].n_msg; j++) {
msg_hdr[i].qt_msg[j].offset = hdr_offset + count;
count += msg_hdr[i].qt_msg[j].size;
count += msg_hdr[i].qt_msg[j].size
+ msg_hdr[i].qt_msg[j].summary_size;
}
return;
}
@@ -2126,11 +2185,16 @@ put_qt_hdrs()
sizeof(struct qtmsg), msg_hdr[i].n_msg, ofp);
#ifdef DEBUG
{ int j;
for(j = 0; j < msg_hdr[i].n_msg; j++)
Fprintf(stderr, "msg %d @ %ld (%ld)\n",
for(j = 0; j < msg_hdr[i].n_msg; j++) {
Fprintf(stderr, "msg %d @ %ld (%ld)",
msg_hdr[i].qt_msg[j].msgnum,
msg_hdr[i].qt_msg[j].offset,
msg_hdr[i].qt_msg[j].size);
if (msg_hdr[i].qt_msg[j].summary_size)
Fprintf(stderr, " [%ld]",
msg_hdr[i].qt_msg[j].summary_size);
Fprintf(stderr, "\n");
}
}
#endif
}
@@ -2160,7 +2224,7 @@ do_questtxt()
qt_line = 0;
in_msg = FALSE;
while (fgets(in_line, 80, ifp) != 0) {
while (fgets(in_line, QTEXT_IN_SIZ, ifp) != 0) {
SpinCursor (3);
qt_line++;
@@ -2173,11 +2237,17 @@ do_questtxt()
in_msg = FALSE;
adjust_qt_hdrs();
put_qt_hdrs();
while (fgets(in_line, 80, ifp) != 0) {
while (fgets(in_line, QTEXT_IN_SIZ, ifp) != 0) {
if(qt_control(in_line)) {
char *summary_p = 0;
in_msg = (in_line[1] == 'C');
continue;
if (!in_msg) summary_p = valid_qt_summary(in_line, FALSE);
/* don't write anything unless we've got a summary */
if (!summary_p) continue;
/* we have summary text; replace raw %E record with it */
Strcpy(in_line, summary_p); /* (guaranteed to fit) */
} else if(qt_comment(in_line)) continue;
#ifdef DEBUG
Fprintf(stderr, "%ld: %s", ftell(stdout), in_line);

View File

@@ -701,7 +701,11 @@ boolean init;
* they come from a previous session and logically precede
* anything (like "Restoring save file...") that's happened now.
*
* Called with a null pointer to finish up.
* Called with a null pointer to finish up restoration.
*
* It's also called by the quest pager code when a block message
* has a one-line summary specified. We put that line directly
* message history for ^P recall without having displayed it.
*/
void
tty_putmsghistory(msg, restoring)