diff --git a/doc/fixes3-7-0.txt b/doc/fixes3-7-0.txt index 7aff12fb6..c1c24371f 100644 --- a/doc/fixes3-7-0.txt +++ b/doc/fixes3-7-0.txt @@ -1515,6 +1515,8 @@ Fire and Frost Brand can be invoked for expert level fireball or cone of cold wielding Trollsbane grants hungerless regeneration hitting with Ogresmasher gives a higher chance of knockback Snickersnee can hit at a distance once per turn for free +the engraving pristine text field was not being appropriately populated during + level creation Fixes to 3.7.0-x General Problems Exposed Via git Repository diff --git a/include/extern.h b/include/extern.h index b3e2c0949..533523198 100644 --- a/include/extern.h +++ b/include/extern.h @@ -975,7 +975,7 @@ extern char *build_english_list(char *) NONNULLARG1; /* ### engrave.c ### */ -extern char *random_engraving(char *) NONNULLARG1; +extern char *random_engraving(char *, char *) NONNULLARG12; extern void wipeout_text(char *, int, unsigned) NONNULLARG1; extern boolean can_reach_floor(boolean); extern void cant_reach_floor(coordxy, coordxy, boolean, boolean); @@ -984,7 +984,7 @@ extern struct engr *sengr_at(const char *, coordxy, coordxy, boolean) NONNULLARG extern void u_wipe_engr(int); extern void wipe_engr_at(coordxy, coordxy, xint16, boolean); extern void read_engr_at(coordxy, coordxy); -extern void make_engr_at(coordxy, coordxy, const char *, long, int) NONNULLARG3; +extern void make_engr_at(coordxy, coordxy, const char *, const char *, long, int) NONNULLARG3; extern void del_engr_at(coordxy, coordxy); extern int freehand(void); extern int doengrave(void); diff --git a/src/engrave.c b/src/engrave.c index 9d598e341..226f6b30b 100644 --- a/src/engrave.c +++ b/src/engrave.c @@ -48,15 +48,16 @@ staticfn int engrave(void); staticfn const char *blengr(void); char * -random_engraving(char *outbuf) +random_engraving(char *outbuf, char *pristine_copy) { const char *rumor; /* a random engraving may come from the "rumors" file, or from the "engrave" file (formerly in an array here) */ - if (!rn2(4) || !(rumor = getrumor(0, outbuf, TRUE)) || !*rumor) - (void) get_rnd_text(ENGRAVEFILE, outbuf, rn2, MD_PAD_RUMORS); + if (!rn2(4) || !(rumor = getrumor(0, pristine_copy, TRUE)) || !*rumor) + (void) get_rnd_text(ENGRAVEFILE, pristine_copy, rn2, MD_PAD_RUMORS); + Strcpy(outbuf, pristine_copy); wipeout_text(outbuf, (int) (strlen(outbuf) / 4), 0); return outbuf; } @@ -391,13 +392,21 @@ void make_engr_at( coordxy x, coordxy y, const char *s, + const char *pristine_s, long e_time, int e_type) { int i; struct engr *ep; unsigned smem = Strlen(s) + 1; + boolean havepristine = FALSE; + if (pristine_s != NULL) { + unsigned prmem = Strlen(pristine_s) + 1; + if (prmem > smem) + smem = prmem; + havepristine = TRUE; + } if ((ep = engr_at(x, y)) != 0) del_engr(ep); @@ -412,6 +421,8 @@ make_engr_at( ep->engr_txt[pristine_text] = ep->engr_txt[remembered_text] + smem; for(i = 0; i < text_states; ++i) Strcpy(ep->engr_txt[i], s); + if (havepristine) + Strcpy(ep->engr_txt[pristine_text], pristine_s); if (!strcmp(s, "Elbereth")) { /* engraving "Elbereth": if done when making a level, it creates an old-style Elbereth that deters monsters when any objects are @@ -591,7 +602,7 @@ doengrave_sfx_item_WAN(struct _doengrave_ctx *de) if (de->oep) { if (!Blind) { de->type = (xint16) 0; /* random */ - (void) random_engraving(de->buf); + (void) random_engraving(de->buf, de->ebuf); } else { /* keep the same type so that feels don't change and only the text is altered, @@ -1036,7 +1047,7 @@ doengrave(void) if (*de->buf) { struct engr *tmp_ep; - make_engr_at(u.ux, u.uy, de->buf, svm.moves, de->type); + make_engr_at(u.ux, u.uy, de->buf, de->ebuf, svm.moves, de->type); tmp_ep = engr_at(u.ux, u.uy); if (!Blind) { if (tmp_ep != 0) { @@ -1422,7 +1433,7 @@ engrave(void) (void) strncat(buf, svc.context.engraving.nextc, min(space_left, endc - svc.context.engraving.nextc)); - make_engr_at(u.ux, u.uy, buf, svm.moves - gm.multi, + make_engr_at(u.ux, u.uy, buf, NULL, svm.moves - gm.multi, svc.context.engraving.type); oep = engr_at(u.ux, u.uy); if (oep) { @@ -1662,7 +1673,7 @@ make_grave(coordxy x, coordxy y, const char *str) del_engr_at(x, y); if (!str) str = get_rnd_text(EPITAPHFILE, buf, rn2, MD_PAD_RUMORS); - make_engr_at(x, y, str, 0L, HEADSTONE); + make_engr_at(x, y, str, NULL, 0L, HEADSTONE); return; } diff --git a/src/mklev.c b/src/mklev.c index bab79e46d..a455639c6 100644 --- a/src/mklev.c +++ b/src/mklev.c @@ -763,7 +763,7 @@ makeniche(int trap_type) ttmp->once = 1; if (trap_engravings[trap_type]) { make_engr_at(xx, yy - dy, - trap_engravings[trap_type], 0L, + trap_engravings[trap_type], NULL, 0L, DUST); wipe_engr_at(xx, yy - dy, 5, FALSE); /* age it a little */ @@ -1136,8 +1136,8 @@ fill_ordinary_room( /* maybe make some graffiti */ if (!rn2(27 + 3 * abs(depth(&u.uz)))) { - char buf[BUFSZ]; - const char *mesg = random_engraving(buf); + char buf[BUFSZ], pristinebuf[BUFSZ]; + const char *mesg = random_engraving(buf, pristinebuf); if (mesg) { do { @@ -1146,7 +1146,7 @@ fill_ordinary_room( y = pos.y; } while (levl[x][y].typ != ROOM && !rn2(40)); if (levl[x][y].typ == ROOM) - make_engr_at(x, y, mesg, 0L, MARK); + make_engr_at(x, y, mesg, pristinebuf, 0L, MARK); } } diff --git a/src/shknam.c b/src/shknam.c index 58a45ceea..ecf12f938 100644 --- a/src/shknam.c +++ b/src/shknam.c @@ -755,7 +755,7 @@ stock_room(int shp_indx, struct mkroom *sroom) else if (inside_shop(sx, sy - 1)) n++; Sprintf(buf, "Closed for inventory"); - make_engr_at(m, n, buf, 0L, DUST); + make_engr_at(m, n, buf, NULL, 0L, DUST); if (levl[m][n].typ != CORR && levl[m][n].typ != ROOM) levl[m][n].typ = (Is_special(&u.uz) || *in_rooms(m, n, 0)) ? ROOM : CORR; diff --git a/src/sp_lev.c b/src/sp_lev.c index e9064f10d..3bccc196c 100644 --- a/src/sp_lev.c +++ b/src/sp_lev.c @@ -3912,7 +3912,7 @@ lspo_engraving(lua_State *L) ecoord = SP_COORD_PACK(x, y); get_location_coord(&x, &y, DRY, gc.coder->croom, ecoord); - make_engr_at(x, y, txt, 0L, etyp); + make_engr_at(x, y, txt, NULL, 0L, etyp); Free(txt); ep = engr_at(x, y); if (ep) { diff --git a/src/zap.c b/src/zap.c index e1d199035..a6935402f 100644 --- a/src/zap.c +++ b/src/zap.c @@ -3628,7 +3628,7 @@ zap_map( ttmp = t_at(x, y); /* refresh in case trap was altered or is gone */ if (u.dz > 0) { /* zapping down */ - char ebuf[BUFSZ]; + char ebuf[BUFSZ], pristinebuf[BUFSZ], *etxt; struct engr *e = engr_at(x, y); /* subset of engraving effects; none sets `disclose' */ @@ -3637,7 +3637,8 @@ zap_map( case WAN_POLYMORPH: case SPE_POLYMORPH: del_engr(e); - make_engr_at(x, y, random_engraving(ebuf), svm.moves, 0); + etxt = random_engraving(ebuf, pristinebuf); + make_engr_at(x, y, etxt, pristinebuf, svm.moves, 0); break; case WAN_CANCELLATION: case SPE_CANCELLATION: