1 /* NetHack 3.6 engrave.c $NHDT-Date: 1570318925 2019/10/05 23:42:05 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.75 $ */
2 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
3 /*-Copyright (c) Robert Patrick Rankin, 2012. */
4 /* NetHack may be freely redistributed. See license for details. */
6 /* JNetHack Copyright */
7 /* (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 */
8 /* For 3.4-, Copyright (c) SHIRAKATA Kentaro, 2002-2020 */
9 /* JNetHack may be freely redistributed. See license for details. */
14 STATIC_VAR NEARDATA struct engr *head_engr;
15 STATIC_DCL const char *NDECL(blengr);
18 random_engraving(outbuf)
23 /* a random engraving may come from the "rumors" file,
24 or from the "engrave" file (formerly in an array here) */
25 if (!rn2(4) || !(rumor = getrumor(0, outbuf, TRUE)) || !*rumor)
26 (void) get_rnd_text(ENGRAVEFILE, outbuf, rn2);
28 wipeout_text(outbuf, (int) (strlen(outbuf) / 4), 0);
32 /* Partial rubouts for engraving characters. -3. */
36 } rubouts[] = { { 'A', "^" },
85 /* degrade some of the characters in a string */
87 wipeout_text(engr, cnt, seed)
90 unsigned seed; /* for semi-controlled randomization */
97 int i, j, nxt, use_rubout, lth = (int) strlen(engr);
101 /* pick next character */
107 /* predictable; caller can reproduce the same sequence by
108 supplying the same arguments later, or a pseudo-random
109 sequence by varying any of them */
111 seed *= 31, seed %= (BUFSZ - 1);
112 use_rubout = seed & 3;
116 #else /*JP:
\93ú
\96{
\8cê
\82Ì
\8fê
\8d\87\82Íjrubout()
\82ð
\8eg
\82Á
\82Ä
\8fÁ
\82·*/
120 seed *= 31, seed %= (BUFSZ-1);
124 if(jrubout(engr, nxt, use_rubout, j)){
128 s = (unsigned char *)&engr[nxt];
133 /* rub out unreadable & small punctuation marks */
134 if (index("?.,'`-|_", *s)) {
142 for (i = 0; i < SIZE(rubouts); i++)
143 if (*s == rubouts[i].wipefrom) {
145 * Pick one of the substitutes at random.
148 j = rn2(strlen(rubouts[i].wipeto));
150 seed *= 31, seed %= (BUFSZ - 1);
151 j = seed % (strlen(rubouts[i].wipeto));
153 *s = rubouts[i].wipeto[j];
157 /* didn't pick rubout; use '?' for unreadable character */
158 if (i == SIZE(rubouts))
163 /* trim trailing spaces */
164 while (lth && engr[lth - 1] == ' ')
168 /* check whether hero can reach something at ground level */
170 can_reach_floor(check_pit)
177 /* Restricted/unskilled riders can't reach the floor */
178 if (u.usteed && P_SKILL(P_RIDING) < P_BASIC)
180 if (check_pit && !Flying
181 && (t = t_at(u.ux, u.uy)) != 0
182 && (uteetering_at_seen_pit(t) || uescaped_shaft(t)))
185 return (boolean) ((!Levitation || Is_airlevel(&u.uz)
186 || Is_waterlevel(&u.uz))
187 && (!u.uundetected || !is_hider(youmonst.data)
188 || u.umonnum == PM_TRAPPER));
191 /* give a message after caller has determined that hero can't reach */
193 cant_reach_floor(x, y, up, check_pit)
195 boolean up, check_pit;
198 You("can't reach the %s.",
200 : (check_pit && can_reach_floor(FALSE))
201 ? "bottom of the pit"
204 You("%s
\82É
\93Í
\82©
\82È
\82¢
\81D",
206 : (check_pit && can_reach_floor(FALSE))
207 ? "
\97\8e\82µ
\8c\8a\82Ì
\92ê"
216 register struct rm *lev = &levl[x][y];
218 if (x == u.ux && y == u.uy && u.uswallow && is_animal(u.ustuck->data))
223 else if (IS_AIR(lev->typ) && Is_airlevel(&u.uz))
228 else if (is_pool(x, y))
230 return (Underwater && !Is_waterlevel(&u.uz))
231 ? "bottom" : hliquid("water");
233 return (Underwater && !Is_waterlevel(&u.uz))
234 ? "
\90\85\82Ì
\92ê" : hliquid("
\90\85\92\86");
236 else if (is_ice(x, y))
241 else if (is_lava(x, y))
243 return hliquid("lava");
245 return hliquid("
\97n
\8aâ");
246 else if (lev->typ == DRAWBRIDGE_DOWN)
251 else if (IS_ALTAR(levl[x][y].typ))
256 else if (IS_GRAVE(levl[x][y].typ))
261 else if (IS_FOUNTAIN(levl[x][y].typ))
266 else if ((IS_ROOM(lev->typ) && !Is_earthlevel(&u.uz))
267 || IS_WALL(lev->typ) || IS_DOOR(lev->typ) || lev->typ == SDOOR)
283 register struct rm *lev = &levl[x][y];
286 /* other room types will no longer exist when we're interested --
287 * see check_special_room()
289 if (*in_rooms(x, y, VAULT))
291 what = "vault's ceiling";
293 what = "
\91q
\8cÉ
\82Ì
\93V
\88ä";
294 else if (*in_rooms(x, y, TEMPLE))
296 what = "temple's ceiling";
298 what = "
\8e\9b\89@
\82Ì
\93V
\88ä";
299 else if (*in_rooms(x, y, SHOPBASE))
301 what = "shop's ceiling";
303 what = "
\93X
\82Ì
\93V
\88ä";
304 else if (Is_waterlevel(&u.uz))
305 /* water plane has no surface; its air bubbles aren't below sky */
307 what = "water above";
309 what = "
\90\85\82Ì
\8fã
\95û";
310 else if (IS_AIR(lev->typ))
317 what = "water's surface";
320 else if ((IS_ROOM(lev->typ) && !Is_earthlevel(&u.uz))
321 || IS_WALL(lev->typ) || IS_DOOR(lev->typ) || lev->typ == SDOOR)
328 what = "rock cavern";
330 what = "
\93´
\8cA
\82Ì
\93V
\88ä";
339 register struct engr *ep = head_engr;
342 if (x == ep->engr_x && y == ep->engr_y)
346 return (struct engr *) 0;
349 /* Decide whether a particular string is engraved at a specified
350 * location; a case-insensitive substring match is used.
351 * Ignore headstones, in case the player names herself "Elbereth".
353 * If strict checking is requested, the word is only considered to be
354 * present if it is intact and is the entire content of the engraving.
357 sengr_at(s, x, y, strict)
362 register struct engr *ep = engr_at(x, y);
364 if (ep && ep->engr_type != HEADSTONE && ep->engr_time <= moves) {
365 return strict ? (fuzzymatch(ep->engr_txt, s, "", TRUE))
366 : (strstri(ep->engr_txt, s) != 0);
376 if (can_reach_floor(TRUE))
377 wipe_engr_at(u.ux, u.uy, cnt, FALSE);
381 wipe_engr_at(x, y, cnt, magical)
385 register struct engr *ep = engr_at(x, y);
387 /* Headstones are indelible */
388 if (ep && ep->engr_type != HEADSTONE) {
389 debugpline1("asked to erode %d characters", cnt);
390 if (ep->engr_type != BURN || is_ice(x, y) || (magical && !rn2(2))) {
391 if (ep->engr_type != DUST && ep->engr_type != ENGR_BLOOD) {
392 cnt = rn2(1 + 50 / (cnt + 1)) ? 0 : 1;
393 debugpline1("actually eroding %d characters", cnt);
395 wipeout_text(ep->engr_txt, (int) cnt, 0);
396 while (ep->engr_txt[0] == ' ')
398 if (!ep->engr_txt[0])
408 register struct engr *ep = engr_at(x, y);
411 /* Sensing an engraving does not require sight,
412 * nor does it necessarily imply comprehension (literacy).
414 if (ep && ep->engr_txt[0]) {
415 switch (ep->engr_type) {
420 pline("%s is written here in the %s.", Something,
421 is_ice(x, y) ? "frost" : "dust");
423 pline("
\89½
\82©
\82Ì
\95¶
\8e\9a\82ª%s
\82É
\8f\91\82¢
\82Ä
\82 \82é
\81D",
424 is_ice(x, y) ? "
\91\9a" : "
\82Ù
\82±
\82è");
430 if (!Blind || can_reach_floor(TRUE)) {
433 pline("%s is engraved here on the %s.", Something,
435 pline("
\89½
\82©
\82Ì
\95¶
\8e\9a\82ª%s
\82É
\8d\8f\82Ü
\82ê
\82Ä
\82¢
\82é
\81D",
440 if (!Blind || can_reach_floor(TRUE)) {
443 pline("Some text has been %s into the %s here.",
444 is_ice(x, y) ? "melted" : "burned", surface(x, y));
446 pline("
\89½
\82©
\82Ì
\95¶
\8e\9a\82ª%s%s
\82¢
\82é
\81D",
448 is_ice(x,y) ? "
\82É
\8d\8f\82Ü
\82ê
\82Ä" : "
\82É
\8fÄ
\82«
\95t
\82¯
\82ç
\82ê
\82Ä");
456 pline("There's some graffiti on the %s here.", surface(x, y));
458 pline("%s
\82É
\97\8e\8f\91\82ª
\82 \82é
\81D", surface(x,y));
462 /* "It's a message! Scrawled in blood!"
464 * "It says... `See you next Wednesday.'" -- Thriller
469 You_see("a message scrawled in blood here.");
471 You("
\8c\8c\95¶
\8e\9a\82ª
\82È
\82®
\82è
\8f\91\82«
\82³
\82ê
\82Ä
\82¢
\82é
\82Ì
\82ð
\8c©
\82Â
\82¯
\82½
\81D");
475 impossible("%s is written in a very strange way.", Something);
480 char *et, buf[BUFSZ];
481 int maxelen = (int) (sizeof buf
482 /* sizeof "literal" counts terminating \0 */
484 - sizeof "You feel the words: \"\".");
486 - sizeof "
\82 \82È
\82½
\82Í
\8e\9f\82Ì
\82æ
\82¤
\82É
\8a´
\82¶
\82½
\81F
\81u
\81v");
488 if ((int) strlen(ep->engr_txt) > maxelen) {
489 (void) strncpy(buf, ep->engr_txt, maxelen);
496 You("%s: \"%s\".", (Blind) ? "feel the words" : "read", et);
498 You("%s
\81F
\81u%s
\81v", (Blind) ? "
\8e\9f\82Ì
\82æ
\82¤
\82É
\8a´
\82¶
\82½" : "
\93Ç
\82ñ
\82¾", et);
506 make_engr_at(x, y, s, e_time, e_type)
513 unsigned smem = strlen(s) + 1;
515 if ((ep = engr_at(x, y)) != 0)
518 (void) memset((genericptr_t)ep, 0, smem + sizeof(struct engr));
519 ep->nxt_engr = head_engr;
523 ep->engr_txt = (char *) (ep + 1);
524 Strcpy(ep->engr_txt, s);
525 /* engraving Elbereth shows wisdom */
526 if (!in_mklev && !strcmp(s, "Elbereth"))
527 exercise(A_WIS, TRUE);
528 ep->engr_time = e_time;
529 ep->engr_type = e_type > 0 ? e_type : rnd(N_ENGRAVE - 1);
533 /* delete any engraving at location <x,y> */
538 register struct engr *ep = engr_at(x, y);
545 * freehand - returns true if player has a free hand
550 return (!uwep || !welded(uwep)
551 || (!bimanual(uwep) && (!uarms || !uarms->cursed)));
554 static NEARDATA const char styluses[] = { ALL_CLASSES, ALLOW_NONE,
555 TOOL_CLASS, WEAPON_CLASS,
556 WAND_CLASS, GEM_CLASS,
559 /* Mohs' Hardness Scale:
560 * 1 - Talc 6 - Orthoclase
561 * 2 - Gypsum 7 - Quartz
562 * 3 - Calcite 8 - Topaz
563 * 4 - Fluorite 9 - Corundum
564 * 5 - Apatite 10 - Diamond
566 * Since granite is an igneous rock hardness ~ 7, anything >= 8 should
567 * probably be able to scratch the rock.
568 * Devaluation of less hard gems is not easily possible because obj struct
569 * does not contain individual oc_cost currently. 7/91
571 * steel - 5-8.5 (usu. weapon)
572 * diamond - 10 * jade - 5-6 (nephrite)
573 * ruby - 9 (corundum) * turquoise - 5-6
574 * sapphire - 9 (corundum) * opal - 5-6
575 * topaz - 8 * glass - ~5.5
576 * emerald - 7.5-8 (beryl) * dilithium - 4-5??
577 * aquamarine - 7.5-8 (beryl) * iron - 4-5
578 * garnet - 7.25 (var. 6.5-8) * fluorite - 4
579 * agate - 7 (quartz) * brass - 3-4
580 * amethyst - 7 (quartz) * gold - 2.5-3
581 * jasper - 7 (quartz) * silver - 2.5-3
582 * onyx - 7 (quartz) * copper - 2.5-3
583 * moonstone - 6 (orthoclase) * amber - 2-2.5
586 /* return 1 if action took 1 (or more) moves, 0 if error or aborted */
590 boolean dengr = FALSE; /* TRUE if we wipe out the current engraving */
591 boolean doblind = FALSE; /* TRUE if engraving blinds the player */
592 boolean doknown = FALSE; /* TRUE if we identify the stylus */
593 boolean eow = FALSE; /* TRUE if we are overwriting oep */
594 boolean jello = FALSE; /* TRUE if we are engraving in slime */
595 boolean ptext = TRUE; /* TRUE if we must prompt for engrave text */
596 boolean teleengr = FALSE; /* TRUE if we move the old engraving */
597 boolean zapwand = FALSE; /* TRUE if we remove a wand charge */
598 xchar type = DUST; /* Type of engraving made */
599 xchar oetype = 0; /* will be set to type of current engraving */
600 char buf[BUFSZ]; /* Buffer for final/poly engraving text */
601 char ebuf[BUFSZ]; /* Buffer for initial engraving text */
602 char fbuf[BUFSZ]; /* Buffer for "your fingers" */
603 char qbuf[QBUFSZ]; /* Buffer for query text */
604 char post_engr_text[BUFSZ]; /* Text displayed after engraving prompt */
605 const char *everb; /* Present tense of engraving type */
606 const char *eloc; /* Where the engraving is (ie dust/floor/...) */
607 char *sp; /* Place holder for space count of engr text */
608 int len; /* # of nonspace chars of new engraving text */
609 int maxelen; /* Max allowable length of engraving text */
610 struct engr *oep = engr_at(u.ux, u.uy);
611 /* The current engraving */
612 struct obj *otmp; /* Object selected with which to engrave */
615 multi = 0; /* moves consumed */
616 nomovemsg = (char *) 0; /* occupation end message */
620 post_engr_text[0] = (char) 0;
623 oetype = oep->engr_type;
624 if (is_demon(youmonst.data) || youmonst.data->mlet == S_VAMPIRE)
627 /* Can the adventurer engrave at all? */
630 if (is_animal(u.ustuck->data)) {
632 pline("What would you write? \"Jonah was here\"?");
634 pline("
\89½
\82ð
\8f\91\82
\82ñ
\82¾
\82¢
\81H
\81u
\83\88\83i
\82Í
\82±
\82±
\82É
\82¢
\82é
\81v
\81H");
636 } else if (is_whirly(u.ustuck->data)) {
637 cant_reach_floor(u.ux, u.uy, FALSE, FALSE);
641 } else if (is_lava(u.ux, u.uy)) {
643 You_cant("write on the %s!", surface(u.ux, u.uy));
645 You("%s
\82É
\93Í
\82©
\82È
\82¢
\81D", surface(u.ux,u.uy));
647 } else if (is_pool(u.ux, u.uy) || IS_FOUNTAIN(levl[u.ux][u.uy].typ)) {
649 You_cant("write on the %s!", surface(u.ux, u.uy));
651 You("%s
\82É
\82Í
\8f\91\82¯
\82È
\82¢
\81I", surface(u.ux, u.uy));
654 if (Is_airlevel(&u.uz) || Is_waterlevel(&u.uz) /* in bubble */) {
656 You_cant("write in thin air!");
658 You("
\8bó
\92\86\82É
\82Í
\8f\91\82¯
\82È
\82¢
\81I");
660 } else if (!accessible(u.ux, u.uy)) {
661 /* stone, tree, wall, secret corridor, pool, lava, bars */
663 You_cant("write here.");
665 You_cant("
\82±
\82±
\82É
\82Í
\8f\91\82¯
\82È
\82¢
\81D");
668 if (cantwield(youmonst.data)) {
670 You_cant("even hold anything!");
672 You("
\89½
\82©
\82ð
\8e\9d\82Â
\82±
\82Æ
\82·
\82ç
\82Å
\82«
\82È
\82¢
\81I");
675 if (check_capacity((char *) 0))
678 /* One may write with finger, or weapon, or wand, or..., or...
679 * Edited by GAN 10/20/86 so as not to change weapon wielded.
682 otmp = getobj(styluses, "write with");
683 if (!otmp) /* otmp == zeroobj if fingers */
686 if (otmp == &zeroobj) {
688 Strcat(strcpy(fbuf, "your "), body_part(FINGERTIP));
690 Strcat(strcpy(fbuf, "
\82 \82È
\82½
\82Ì"), body_part(FINGERTIP));
693 writer = yname(otmp);
695 /* There's no reason you should be able to write with a wand
696 * while both your hands are tied up.
698 if (!freehand() && otmp != uwep && !otmp->owornmask) {
700 You("have no free %s to write with!", body_part(HAND));
702 pline("%s
\82Ì
\8e©
\97R
\82ª
\8cø
\82©
\82È
\82¢
\82Ì
\82Å
\8f\91\82¯
\82È
\82¢
\81I", body_part(HAND));
708 You("tickle %s with %s.", mon_nam(u.ustuck), writer);
710 You("%s
\82Å%s
\82ð
\82
\82·
\82®
\82Á
\82½
\81D", writer, mon_nam(u.ustuck));
712 Your("message dissolves...");
714 Your("
\83\81\83b
\83Z
\81[
\83W
\82Í
\8fÁ
\82¦
\82½
\81D
\81D
\81D");
717 if (otmp->oclass != WAND_CLASS && !can_reach_floor(TRUE)) {
718 cant_reach_floor(u.ux, u.uy, FALSE, TRUE);
721 if (IS_ALTAR(levl[u.ux][u.uy].typ)) {
723 You("make a motion towards the altar with %s.", writer);
725 You("%s
\82ð
\8eg
\82Á
\82Ä
\8dÕ
\92d
\82É
\8f\91\82±
\82¤
\82Æ
\82µ
\82½
\81D", writer);
726 altar_wrath(u.ux, u.uy);
729 if (IS_GRAVE(levl[u.ux][u.uy].typ)) {
730 if (otmp == &zeroobj) { /* using only finger */
732 You("would only make a small smudge on the %s.",
734 You("%s
\82ð
\8f
\82µ
\82æ
\82²
\82·
\82±
\82Æ
\82µ
\82©
\82Å
\82«
\82È
\82©
\82Á
\82½
\81D",
735 surface(u.ux, u.uy));
737 } else if (!levl[u.ux][u.uy].disturbed) {
739 You("disturb the undead!");
741 You("
\95s
\8e\80\82Ì
\8eÒ
\82Ì
\96°
\82è
\82ð
\96W
\82°
\82½
\81I");
742 levl[u.ux][u.uy].disturbed = 1;
743 (void) makemon(&mons[PM_GHOUL], u.ux, u.uy, NO_MM_FLAGS);
744 exercise(A_WIS, FALSE);
751 switch (otmp->oclass) {
759 /* "diamond" rings and others should work */
761 /* diamonds & other hard gems should work */
762 if (objects[otmp->otyp].oc_tough) {
768 if (is_boots(otmp)) {
773 /* Objects too large to engrave with */
777 You_cant("engrave with such a large object!");
779 pline("
\82»
\82ñ
\82È
\91å
\82«
\82È
\82à
\82Ì
\82ð
\8eg
\82Á
\82Ä
\95¶
\8e\9a\82ð
\8d\8f\82ß
\82È
\82¢
\81I");
782 /* Objects too silly to engrave with */
787 pline("%s would get %s.", Yname2(otmp),
788 is_ice(u.ux, u.uy) ? "all frosty" : "too dirty");
790 Your("%s
\82Í%s
\82È
\82Á
\82½
\81D", xname(otmp),
791 is_ice(u.ux,u.uy) ? "
\91\9a\82¾
\82ç
\82¯
\82É" : "
\89\98\82È
\82");
795 case RANDOM_CLASS: /* This should mean fingers */
798 /* The charge is removed from the wand before prompting for
799 * the engraving text, because all kinds of setup decisions
800 * and pre-engraving messages are based upon knowing what type
801 * of engraving the wand is going to do. Also, the player
802 * will have potentially seen "You wrest .." message, and
803 * therefore will know they are using a charge.
806 if (zappable(otmp)) {
808 if (otmp->cursed && !rn2(WAND_BACKFIRE_CHANCE)) {
809 wand_explode(otmp, 0);
813 if (!can_reach_floor(TRUE))
816 switch (otmp->otyp) {
822 case WAN_SECRET_DOOR_DETECTION:
823 case WAN_CREATE_MONSTER:
825 case WAN_ENLIGHTENMENT:
828 /* IMMEDIATE wands */
829 /* If wand is "IMMEDIATE", remember to affect the
830 * previous engraving even if turning to dust.
833 Strcpy(post_engr_text,
835 "The wand unsuccessfully fights your attempt to write!");
837 "
\82 \82È
\82½
\82ª
\8f\91\82±
\82¤
\82Æ
\82·
\82é
\82Æ
\8fñ
\82Í
\92ï
\8dR
\82µ
\82½
\81I");
839 case WAN_SLOW_MONSTER:
842 Sprintf(post_engr_text, "The bugs on the %s slow down!",
844 Sprintf(post_engr_text, "%s
\82Ì
\8fã
\82Ì
\92\8e\82Ì
\93®
\82«
\82ª
\92x
\82
\82È
\82Á
\82½
\81I",
845 surface(u.ux, u.uy));
848 case WAN_SPEED_MONSTER:
851 Sprintf(post_engr_text, "The bugs on the %s speed up!",
853 Sprintf(post_engr_text, "%s
\82Ì
\8fã
\82Ì
\92\8e\82Ì
\93®
\82«
\82ª
\91¬
\82
\82È
\82Á
\82½
\81I",
854 surface(u.ux, u.uy));
860 type = (xchar) 0; /* random */
861 (void) random_engraving(buf);
863 /* keep the same type so that feels don't
864 change and only the text is altered,
865 but you won't know anyway because
866 you're a _blind writer_ */
869 xcrypt(blengr(), buf);
875 case WAN_UNDEAD_TURNING:
881 case WAN_MAGIC_MISSILE:
884 Sprintf(post_engr_text,
886 "The %s is riddled by bullet holes!",
888 "%s
\82Í
\8eU
\92e
\82Å
\8d×
\82©
\82¢
\8c\8a\82¾
\82ç
\82¯
\82É
\82È
\82Á
\82½
\81I",
889 surface(u.ux, u.uy));
892 /* can't tell sleep from death - Eric Backus */
897 Sprintf(post_engr_text, "The bugs on the %s stop moving!",
899 Sprintf(post_engr_text, "%s
\82Ì
\8fã
\82Ì
\92\8e\82Ì
\93®
\82«
\82ª
\8e~
\82Ü
\82Á
\82½
\81I",
900 surface(u.ux, u.uy));
905 Strcpy(post_engr_text,
907 "A few ice cubes drop from the wand.");
909 "
\95X
\82Ì
\82©
\82¯
\82ç
\82ª
\8fñ
\82©
\82ç
\82±
\82Ú
\82ê
\97\8e\82¿
\82½
\81D");
910 if (!oep || (oep->engr_type != BURN))
913 case WAN_CANCELLATION:
914 case WAN_MAKE_INVISIBLE:
915 if (oep && oep->engr_type != HEADSTONE) {
918 pline_The("engraving on the %s vanishes!",
920 pline("%s
\82Ì
\8fã
\82Ì
\95¶
\8e\9a\82Í
\8fÁ
\82¦
\82½
\81I",
921 surface(u.ux, u.uy));
925 case WAN_TELEPORTATION:
926 if (oep && oep->engr_type != HEADSTONE) {
929 pline_The("engraving on the %s vanishes!",
931 pline("%s
\82Ì
\8fã
\82Ì
\95¶
\8e\9a\82Í
\8fÁ
\82¦
\82½
\81I",
932 surface(u.ux, u.uy));
936 /* type = ENGRAVE wands */
940 if (!objects[otmp->otyp].oc_name_known) {
943 pline("This %s is a wand of digging!", xname(otmp));
945 pline("
\82±
\82ê
\82Í
\8c\8a\8c@
\82è
\82Ì
\8fñ
\82¾
\81I");
949 Strcpy(post_engr_text,
951 ? "You hear drilling!" /* Deaf-aware */
953 ? "You feel tremors."
954 : IS_GRAVE(levl[u.ux][u.uy].typ)
955 ? "Chips fly out from the headstone."
957 ? "Ice chips fly up from the ice surface!"
958 : (level.locations[u.ux][u.uy].typ
960 ? "Splinters fly up from the bridge."
961 : "Gravel flies up from the floor.");
963 Strcpy(post_engr_text,
965 ? "
\8c\8a\82ª
\8aJ
\82
\89¹
\82ð
\95·
\82¢
\82½
\81I" /* Deaf-aware */
967 ? "
\90U
\93®
\82ð
\8a´
\82¶
\82½
\81D"
968 : IS_GRAVE(levl[u.ux][u.uy].typ)
969 ? "
\95æ
\90Î
\82©
\82ç
\94j
\95Ð
\82ª
\94ò
\82Ñ
\8eU
\82Á
\82½
\81D"
971 ? "
\95X
\82Ì
\95\
\96Ê
\82©
\82ç
\95X
\82Ì
\82©
\82¯
\82ç
\82ª
\94ò
\82Ñ
\8eU
\82Á
\82½
\81D"
972 : (level.locations[u.ux][u.uy].typ
974 ? "
\94j
\95Ð
\82ª
\8b´
\82©
\82ç
\95\91\82¢
\82 \82ª
\82Á
\82½
\81D"
975 : "
\8d»
\97\98\82ª
\8f°
\82©
\82ç
\94ò
\82Ñ
\8eU
\82Á
\82½
\81D");
978 /* type = BURN wands */
982 if (!objects[otmp->otyp].oc_name_known) {
985 pline("This %s is a wand of fire!", xname(otmp));
987 pline("
\82±
\82ê
\82Í
\89\8a\82Ì
\8fñ
\82¾
\81I");
991 Strcpy(post_engr_text, Blind ? "You feel the wand heat up."
992 : "Flames fly from the wand.");
994 Strcpy(post_engr_text, Blind ? "
\8fñ
\82ª
\92g
\82©
\82
\82È
\82Á
\82½
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81D"
995 : "
\89\8a\82ª
\8fñ
\82©
\82ç
\94ò
\82Ñ
\8eU
\82Á
\82½
\81D");
1001 if (!objects[otmp->otyp].oc_name_known) {
1004 pline("This %s is a wand of lightning!", xname(otmp));
1006 pline("
\82±
\82ê
\82Í
\97\8b\82Ì
\8fñ
\82¾
\81I");
1011 Strcpy(post_engr_text, "Lightning arcs from the wand.");
1013 Strcpy(post_engr_text, "
\89Î
\89Ô
\82ª
\8fñ
\82©
\82ç
\94ò
\82Ñ
\8eU
\82Á
\82½
\81D");
1017 Strcpy(post_engr_text, !Deaf
1018 ? "You hear crackling!" /* Deaf-aware */
1019 : "Your hair stands up!");
1021 Strcpy(post_engr_text, !Deaf
1022 ? "
\83p
\83`
\83p
\83`
\82Æ
\82¢
\82¤
\89¹
\82ð
\95·
\82¢
\82½
\81I" /* Deaf-aware */
1023 : "
\83]
\83b
\82Æ
\82µ
\82½
\81I");
1027 /* type = MARK wands */
1028 /* type = ENGR_BLOOD wands */
1030 } else { /* end if zappable */
1031 /* failing to wrest one last charge takes time */
1032 ptext = FALSE; /* use "early exit" below, return 1 */
1033 /* give feedback here if we won't be getting the
1034 "can't reach floor" message below */
1035 if (can_reach_floor(TRUE)) {
1036 /* cancelled wand turns to dust */
1039 /* empty wand just doesn't write */
1042 pline_The("wand is too worn out to engrave.");
1044 pline_The("
\8fñ
\82Í
\95¶
\8e\9a\82ð
\8d\8f\82Þ
\82É
\82Í
\8eg
\82¢
\82·
\82¬
\82Ä
\82¢
\82é
\81D");
1050 if (is_blade(otmp)) {
1051 if ((int) otmp->spe > -3)
1055 pline("%s too dull for engraving.", Yobjnam2(otmp, "are"));
1057 pline("%s
\82Í
\90n
\82ª
\83{
\83\8d\83{
\83\8d\82Å
\81C
\95¶
\8e\9a\82ð
\92¤
\82ê
\82È
\82¢
\81D", xname(otmp));
1062 if (otmp == ublindf) {
1065 "That is a bit difficult to engrave with, don't you think?");
1067 "
\82¿
\82å
\82Á
\82Æ
\82»
\82ê
\82Å
\92¤
\82é
\82Ì
\82Í
\91å
\95Ï
\82¾
\82ë
\82¤
\81C
\82»
\82¤
\8ev
\82í
\82È
\82¢
\81H");
1070 switch (otmp->otyp) {
1074 Your("marker has dried out.");
1076 Your("
\83}
\81[
\83J
\82Í
\8a£
\82«
\82«
\82Á
\82½
\81D");
1081 /* Can't really engrave with a towel */
1084 if (oep->engr_type == DUST
1085 || oep->engr_type == ENGR_BLOOD
1086 || oep->engr_type == MARK) {
1087 if (is_wet_towel(otmp))
1088 dry_a_towel(otmp, -1, TRUE);
1091 You("wipe out the message here.");
1093 You("
\83\81\83b
\83Z
\81[
\83W
\82ð
\90@
\82«
\82Æ
\82Á
\82½
\81D");
1096 pline("%s %s.", Yobjnam2(otmp, "get"),
1097 is_ice(u.ux, u.uy) ? "frosty" : "dusty");
1099 pline("%s
\82Í%s
\82É
\82È
\82Á
\82½
\81D", xname(otmp),
1100 is_ice(u.ux,u.uy) ? "
\91\9a\82¾
\82ç
\82¯" : "
\82Ù
\82±
\82è
\82Ü
\82Ý
\82ê");
1105 pline("%s can't wipe out this engraving.", Yname2(otmp));
1107 pline("
\82±
\82Ì
\95¶
\8e\9a\82Í%s
\82Å
\82Í
\90@
\82«
\82Æ
\82ê
\82È
\82¢
\81D", xname(otmp));
1110 pline("%s %s.", Yobjnam2(otmp, "get"),
1111 is_ice(u.ux, u.uy) ? "frosty" : "dusty");
1113 pline("%s
\82Í%s
\82É
\82È
\82Á
\82½
\81D", xname(otmp),
1114 is_ice(u.ux,u.uy) ? "
\91\9a\82¾
\82ç
\82¯" : "
\82Ù
\82±
\82è
\82Ü
\82Ý
\82ê");
1125 pline("Writing a poison pen letter??");
1127 pline("
\82Ó
\82Þ
\81D
\82±
\82ê
\82±
\82»
\96{
\93\96\82Ì
\93Å
\90ã
\82¾
\81D");
1132 impossible("You're engraving with an illegal object!");
1136 if (IS_GRAVE(levl[u.ux][u.uy].typ)) {
1137 if (type == ENGRAVE || type == 0) {
1140 /* ensures the "cannot wipe out" case */
1149 * End of implement setup
1152 /* Identify stylus */
1155 if (objects[otmp->otyp].oc_name_known)
1156 more_experienced(0, 10);
1160 oep = (struct engr *) 0;
1164 oep = (struct engr *) 0;
1166 /* Something has changed the engraving here */
1168 make_engr_at(u.ux, u.uy, buf, moves, type);
1171 pline_The("engraving now reads: \"%s\".", buf);
1173 pline("
\8d\8f\82Ü
\82ê
\82½
\95¶
\8e\9a\82ð
\93Ç
\82ñ
\82¾
\81F
\81u%s
\81v
\81D", buf);
1176 if (zapwand && (otmp->spe < 0)) {
1178 pline("%s %sturns to dust.", The(xname(otmp)),
1179 Blind ? "" : "glows violently, then ");
1181 pline("%s
\82Í%s
\82¿
\82è
\82Æ
\82È
\82Á
\82½
\81D", xname(otmp),
1182 Blind ? "" : "
\8c\83\82µ
\82
\8bP
\82«
\81C");
1184 if (!IS_GRAVE(levl[u.ux][u.uy].typ))
1187 "are not going to get anywhere trying to write in the %s with your dust.",
1188 is_ice(u.ux, u.uy) ? "frost" : "dust");
1191 "
\90o
\82Å%s
\82É
\89½
\82©
\8f\91\82±
\82¤
\82Æ
\82µ
\82½
\82ª
\81C
\82Å
\82«
\82È
\82©
\82Á
\82½
\81D",
1192 is_ice(u.ux,u.uy) ? "
\95X" : "
\82Ù
\82±
\82è");
1195 otmp = 0; /* wand is now gone */
1198 /* Early exit for some implements. */
1200 if (otmp && otmp->oclass == WAND_CLASS && !can_reach_floor(TRUE))
1201 cant_reach_floor(u.ux, u.uy, FALSE, TRUE);
1205 * Special effects should have deleted the current engraving (if
1209 register char c = 'n';
1211 /* Give player the choice to add to engraving. */
1212 if (type == HEADSTONE) {
1213 /* no choice, only append */
1215 } else if (type == oep->engr_type
1216 && (!Blind || oep->engr_type == BURN
1217 || oep->engr_type == ENGRAVE)) {
1219 c = yn_function("Do you want to add to the current engraving?",
1221 c = yn_function("
\89½
\82©
\8f\91\82«
\89Á
\82¦
\82Ü
\82·
\82©
\81H",
1229 if (c == 'n' || Blind) {
1230 if (oep->engr_type == DUST
1231 || oep->engr_type == ENGR_BLOOD
1232 || oep->engr_type == MARK) {
1235 You("wipe out the message that was %s here.",
1236 (oep->engr_type == DUST)
1237 ? "written in the dust"
1238 : (oep->engr_type == ENGR_BLOOD)
1239 ? "scrawled in blood"
1242 You("%s
\83\81\83b
\83Z
\81[
\83W
\82ð
\90@
\82«
\82Æ
\82Á
\82½
\81D",
1243 (oep->engr_type == DUST)
1244 ? "
\82Ù
\82±
\82è
\82É
\8f\91\82©
\82ê
\82Ä
\82¢
\82é"
1245 : (oep->engr_type == BLOOD)
1246 ? "
\8c\8c\95¶
\8e\9a\82Å
\82È
\82®
\82è
\8f\91\82«
\82³
\82ê
\82Ä
\82¢
\82é"
1247 : "
\8f\91\82©
\82ê
\82Ä
\82¢
\82é");
1250 oep = (struct engr *) 0;
1252 /* Don't delete engr until after we *know* we're engraving
1255 } else if (type == DUST || type == MARK || type == ENGR_BLOOD) {
1257 You("cannot wipe out the message that is %s the %s here.",
1258 oep->engr_type == BURN
1259 ? (is_ice(u.ux, u.uy) ? "melted into" : "burned into")
1261 surface(u.ux, u.uy));
1263 You("%s
\83\81\83b
\83Z
\81[
\83W
\82ð
\90@
\82«
\82Æ
\82ê
\82È
\82©
\82Á
\82½
\81D",
1264 oep->engr_type == BURN
1265 ? (is_ice(u.ux, u.uy) ? "
\8d\8f\82Ü
\82ê
\82Ä
\82¢
\82é" : "
\8fÄ
\82«
\95t
\82¯
\82ç
\82ê
\82Ä
\82¢
\82é")
1266 : "
\8d\8f\82Ü
\82ê
\82Ä
\82¢
\82é");
1269 } else if (type != oep->engr_type || c == 'n') {
1270 if (!Blind || can_reach_floor(TRUE))
1272 You("will overwrite the current message.");
1274 You("
\83\81\83b
\83Z
\81[
\83W
\82ð
\8fã
\8f\91\82«
\82µ
\82æ
\82¤
\82Æ
\82µ
\82½
\81D");
1280 eloc = surface(u.ux, u.uy);
1284 everb = (oep && !eow ? "add to the weird writing on"
1286 everb = (oep && !eow ? "
\8aï
\96
\82È
\95¶
\8e\9a\97ñ
\82É
\8f\91\82«
\89Á
\82¦
\82é"
1288 : "write strangely on");
1290 : "
\8aï
\96
\82È
\95¶
\8e\9a\97ñ
\82ð
\8f\91\82");
1294 everb = (oep && !eow ? "add to the writing in" : "write in");
1296 everb = (oep && !eow ? "
\8f\91\82«
\89Á
\82¦
\82é" : "
\8f\91\82");
1298 eloc = is_ice(u.ux, u.uy) ? "frost" : "dust";
1300 eloc = is_ice(u.ux,u.uy) ? "
\91\9a" : "
\82Ù
\82±
\82è";
1304 everb = (oep && !eow ? "add to the epitaph on" : "engrave on");
1306 everb = (oep && !eow ? "
\95æ
\94è
\96Á
\82ð
\8d\8f\82Ý
\89Á
\82¦
\82é" : "
\95æ
\94è
\96Á
\82ð
\8d\8f\82Þ");
1310 everb = (oep && !eow ? "add to the engraving in" : "engrave in");
1312 everb = (oep && !eow ? "
\8d\8f\82Ý
\89Á
\82¦
\82é" : "
\8d\8f\82Þ");
1316 everb = (oep && !eow
1317 ? (is_ice(u.ux, u.uy) ? "add to the text melted into"
1318 : "add to the text burned into")
1319 : (is_ice(u.ux, u.uy) ? "melt into" : "burn into"));
1321 everb = (oep && !eow
1322 ? ( is_ice(u.ux,u.uy) ? "
\8d\8f\82Ý
\89Á
\82¦
\82é"
1323 : "
\94R
\82¦
\82Ä
\82¢
\82é
\95¶
\8e\9a\82É
\8f\91\82«
\89Á
\82¦
\82é")
1324 : ( is_ice(u.ux,u.uy) ? "
\8d\8f\82Þ" : "
\8fÄ
\88ó
\82ð
\82¢
\82ê
\82é"));
1329 everb = (oep && !eow ? "add to the graffiti on" : "scribble on");
1331 everb = (oep && !eow ? "
\97\8e\8f\91\82É
\8f\91\82«
\89Á
\82¦
\82é" : "
\82Í
\82µ
\82è
\8f\91\82«
\82·
\82é");
1335 everb = (oep && !eow ? "add to the scrawl on" : "scrawl on");
1337 everb = (oep && !eow ? "
\82È
\82®
\82è
\8f\91\82«
\82É
\8f\91\82«
\89Á
\82¦
\82é" : "
\82È
\82®
\82è
\8f\91\82«
\82·
\82é");
1341 /* Tell adventurer what is going on */
1342 if (otmp != &zeroobj)
1344 You("%s the %s with %s.", everb, eloc, doname(otmp));
1346 You("%s
\82Å%s
\82É%s
\81D", doname(otmp), eloc, jpast(everb));
1349 You("%s the %s with your %s.", everb, eloc, body_part(FINGERTIP));
1351 You("%s
\82Å%s
\82É%s
\81D", body_part(FINGER), eloc, jpast(everb));
1354 /* Prompt for engraving! */
1356 Sprintf(qbuf, "What do you want to %s the %s here?", everb, eloc);
1358 Sprintf(qbuf,"%s
\82É
\89½
\82Æ%s
\82©
\81H", eloc, jpolite(everb));
1360 /* convert tabs to spaces and condense consecutive spaces to one */
1363 /* Count the actual # of chars engraved not including spaces */
1365 for (sp = ebuf; *sp; sp++)
1369 if (len == 0 || index(ebuf, '\033')) {
1373 pline("%s, then %s.", Tobjnam(otmp, "glow"),
1374 otense(otmp, "fade"));
1376 pline("%s
\82Í
\8bP
\82¢
\82½
\82ª
\81C
\82·
\82®
\82É
\8fÁ
\82¦
\82½
\81D", xname(otmp));
1385 /* A single `x' is the traditional signature of an illiterate person */
1386 if (len != 1 || (!index(ebuf, 'x') && !index(ebuf, 'X')))
1387 u.uconduct.literate++;
1389 /* Mix up engraving if surface or state of mind is unsound.
1390 Note: this won't add or remove any spaces. */
1391 for (sp = ebuf; *sp; sp++) {
1394 if (((type == DUST || type == ENGR_BLOOD) && !rn2(25))
1395 || (Blind && !rn2(11)) || (Confusion && !rn2(7))
1396 || (Stunned && !rn2(4)) || (Hallucination && !rn2(2)))
1398 *sp = ' ' + rnd(96 - 2); /* ASCII '!' thru '~'
1399 (excludes ' ' and DEL) */
1400 #else /*JP:
\93ú
\96{
\8cê
\82Å
\83\89\83\93\83_
\83\80\89» */
1402 if(is_kanji1(ebuf, sp-ebuf))
1404 else if(is_kanji2(ebuf, sp-ebuf))
1405 jrndm_replace(sp-1);
1407 *sp = '!' + rn2(93); /* ASCII-code only */
1412 /* Previous engraving is overwritten */
1415 oep = (struct engr *) 0;
1418 /* Figure out how long it took to engrave, and if player has
1419 * engraved too much.
1423 multi = -(len / 10);
1426 nomovemsg = "You finish your weird engraving.";
1428 nomovemsg = "
\82 \82È
\82½
\82Í
\8aï
\96
\82È
\8d\8f\82Ý
\82ð
\8fI
\82¦
\82½
\81D";
1431 multi = -(len / 10);
1434 nomovemsg = "You finish writing in the dust.";
1436 nomovemsg = "
\82 \82È
\82½
\82Í
\82Ù
\82±
\82è
\82É
\8f\91\82«
\8fI
\82¦
\82½
\81D";
1440 multi = -(len / 10);
1441 if (otmp->oclass == WEAPON_CLASS
1442 && (otmp->otyp != ATHAME || otmp->cursed)) {
1444 maxelen = ((otmp->spe + 3) * 2) + 1;
1445 /* -2 => 3, -1 => 5, 0 => 7, +1 => 9, +2 => 11
1446 * Note: this does not allow a +0 anything (except an athame)
1447 * to engrave "Elbereth" all at once.
1448 * However, you can engrave "Elb", then "ere", then "th".
1451 pline("%s dull.", Yobjnam2(otmp, "get"));
1453 Your("%s
\82Í
\90n
\82±
\82Ú
\82ê
\82µ
\82½
\81D", xname(otmp));
1454 costly_alteration(otmp, COST_DEGRD);
1455 if (len > maxelen) {
1459 otmp->spe -= len >> 1;
1461 otmp->spe -= 1; /* Prevent infinite engraving */
1462 } else if (otmp->oclass == RING_CLASS || otmp->oclass == GEM_CLASS) {
1467 nomovemsg = "You finish engraving.";
1469 nomovemsg = "
\82 \82È
\82½
\82Í
\8d\8f\82Ý
\8fI
\82¦
\82½
\81D";
1472 multi = -(len / 10);
1474 nomovemsg = is_ice(u.ux, u.uy)
1476 ? "You finish melting your message into the ice."
1478 ? "
\95X
\82Ö
\83\81\83b
\83Z
\81[
\83W
\82ð
\8d\8f\82Ý
\8fI
\82¦
\82½
\81D"
1480 : "You finish burning your message into the floor.";
1482 : "
\8f°
\82Ö
\83\81\83b
\83Z
\81[
\83W
\82ð
\8fÄ
\82«
\82¢
\82ê
\8fI
\82¦
\82½
\81D";
1485 multi = -(len / 10);
1486 if (otmp->otyp == MAGIC_MARKER) {
1487 maxelen = otmp->spe * 2; /* one charge / 2 letters */
1488 if (len > maxelen) {
1490 Your("marker dries out.");
1492 Your("
\83}
\81[
\83J
\82Í
\8a£
\82«
\82«
\82Á
\82½
\81D");
1494 multi = -(maxelen / 10);
1496 otmp->spe -= len >> 1;
1498 otmp->spe -= 1; /* Prevent infinite graffiti */
1502 nomovemsg = "You finish defacing the dungeon.";
1504 nomovemsg = "
\82 \82È
\82½
\82Í
\96À
\8b{
\82Ö
\82Ì
\97\8e\8f\91\82ð
\8f\91\82«
\8fI
\82¦
\82½
\81D";
1507 multi = -(len / 10);
1510 nomovemsg = "You finish scrawling.";
1512 nomovemsg = "
\82Í
\82µ
\82è
\8f\91\82«
\82ð
\8f\91\82«
\8fI
\82¦
\82½
\81D";
1516 /* Chop engraving down to size if necessary */
1517 if (len > maxelen) {
1518 for (sp = ebuf; maxelen && *sp; sp++)
1521 if (!maxelen && *sp) {
1522 #if 1 /*JP*//*
\8a¿
\8e\9a\82Ì1
\83o
\83C
\83g
\96Ú
\82¾
\82¯
\82ª
\8ec
\82ç
\82È
\82¢
\82æ
\82¤
\82É*/
1523 if(is_kanji2(ebuf, sp - ebuf))
1529 nomovemsg = "You cannot write any more.";
1531 nomovemsg = "
\82±
\82ê
\88È
\8fã
\89½
\82à
\8f\91\82¯
\82È
\82©
\82Á
\82½
\81D";
1533 You("are only able to write \"%s\".", ebuf);
1535 You("
\81u%s
\81v
\82Æ
\82Ü
\82Å
\82µ
\82©
\8f\91\82¯
\82È
\82©
\82Á
\82½
\81D", ebuf);
1539 if (oep) /* add to existing engraving */
1540 Strcpy(buf, oep->engr_txt);
1541 (void) strncat(buf, ebuf, BUFSZ - (int) strlen(buf) - 1);
1542 /* Put the engraving onto the map */
1543 make_engr_at(u.ux, u.uy, buf, moves - multi, type);
1545 if (post_engr_text[0])
1546 pline("%s", post_engr_text);
1547 if (doblind && !resists_blnd(&youmonst)) {
1549 You("are blinded by the flash!");
1551 You("
\82Ü
\82Î
\82ä
\82¢
\8cõ
\82Å
\96Ú
\82ª
\82
\82ç
\82ñ
\82¾
\81I");
1552 make_blinded((long) rnd(50), FALSE);
1554 Your1(vision_clears);
1559 /* while loading bones, clean up text which might accidentally
1560 or maliciously disrupt player's terminal when displayed */
1562 sanitize_engravings()
1566 for (ep = head_engr; ep; ep = ep->nxt_engr) {
1567 sanitize_name(ep->engr_txt);
1572 save_engravings(fd, mode)
1575 struct engr *ep, *ep2;
1576 unsigned no_more_engr = 0;
1578 for (ep = head_engr; ep; ep = ep2) {
1580 if (ep->engr_lth && ep->engr_txt[0] && perform_bwrite(mode)) {
1581 bwrite(fd, (genericptr_t) &ep->engr_lth, sizeof ep->engr_lth);
1582 bwrite(fd, (genericptr_t) ep, sizeof (struct engr) + ep->engr_lth);
1584 if (release_data(mode))
1587 if (perform_bwrite(mode))
1588 bwrite(fd, (genericptr_t) &no_more_engr, sizeof no_more_engr);
1589 if (release_data(mode))
1602 mread(fd, (genericptr_t) <h, sizeof lth);
1606 mread(fd, (genericptr_t) ep, sizeof (struct engr) + lth);
1607 ep->nxt_engr = head_engr;
1609 ep->engr_txt = (char *) (ep + 1); /* Andreas Bormann */
1610 /* Mark as finished for bones levels -- no problem for
1611 * normal levels as the player must have finished engraving
1612 * to be able to move again.
1614 ep->engr_time = moves;
1618 /* to support '#stats' wizard-mode command */
1620 engr_stats(hdrfmt, hdrbuf, count, size)
1627 Sprintf(hdrbuf, hdrfmt, (long) sizeof (struct engr));
1628 *count = *size = 0L;
1629 for (ep = head_engr; ep; ep = ep->nxt_engr) {
1631 *size += (long) sizeof *ep + (long) ep->engr_lth;
1637 register struct engr *ep;
1639 if (ep == head_engr) {
1640 head_engr = ep->nxt_engr;
1642 register struct engr *ept;
1644 for (ept = head_engr; ept; ept = ept->nxt_engr)
1645 if (ept->nxt_engr == ep) {
1646 ept->nxt_engr = ep->nxt_engr;
1650 impossible("Error in del_engr?");
1657 /* randomly relocate an engraving */
1662 int tx, ty, tryct = 200;
1667 tx = rn1(COLNO - 3, 2);
1669 } while (engr_at(tx, ty) || !goodpos(tx, ty, (struct monst *) 0, 0));
1675 /* Create a headstone at the given location.
1676 * The caller is responsible for newsym(x, y).
1679 make_grave(x, y, str)
1685 /* Can we put a grave here? */
1686 if ((levl[x][y].typ != ROOM && levl[x][y].typ != GRAVE) || t_at(x, y))
1688 /* Make the grave */
1689 levl[x][y].typ = GRAVE;
1690 /* Engrave the headstone */
1693 str = get_rnd_text(EPITAPHFILE, buf, rn2);
1694 make_engr_at(x, y, str, 0L, HEADSTONE);
1698 static const char blind_writing[][21] = {
1699 {0x44, 0x66, 0x6d, 0x69, 0x62, 0x65, 0x22, 0x45, 0x7b, 0x71,
1700 0x65, 0x6d, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1701 {0x51, 0x67, 0x60, 0x7a, 0x7f, 0x21, 0x40, 0x71, 0x6b, 0x71,
1702 0x6f, 0x67, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
1703 {0x49, 0x6d, 0x73, 0x69, 0x62, 0x65, 0x22, 0x4c, 0x61, 0x7c,
1704 0x6d, 0x67, 0x24, 0x42, 0x7f, 0x69, 0x6c, 0x77, 0x67, 0x7e, 0x00},
1705 {0x4b, 0x6d, 0x6c, 0x66, 0x30, 0x4c, 0x6b, 0x68, 0x7c, 0x7f,
1706 0x6f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
1707 {0x51, 0x67, 0x70, 0x7a, 0x7f, 0x6f, 0x67, 0x68, 0x64, 0x71,
1708 0x21, 0x4f, 0x6b, 0x6d, 0x7e, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00},
1709 {0x4c, 0x63, 0x76, 0x61, 0x71, 0x21, 0x48, 0x6b, 0x7b, 0x75,
1710 0x67, 0x63, 0x24, 0x45, 0x65, 0x6b, 0x6b, 0x65, 0x00, 0x00, 0x00},
1711 {0x4c, 0x67, 0x68, 0x6b, 0x78, 0x68, 0x6d, 0x76, 0x7a, 0x75,
1712 0x21, 0x4f, 0x71, 0x7a, 0x75, 0x6f, 0x77, 0x00, 0x00, 0x00, 0x00},
1713 {0x44, 0x66, 0x6d, 0x7c, 0x78, 0x21, 0x50, 0x65, 0x66, 0x65,
1714 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
1715 {0x44, 0x66, 0x73, 0x69, 0x62, 0x65, 0x22, 0x56, 0x7d, 0x63,
1716 0x69, 0x76, 0x6b, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
1719 STATIC_OVL const char *
1722 return blind_writing[rn2(SIZE(blind_writing))];