Merge branch 'copperwater-hallutraps-3.7' into copperwater-3.7

This commit is contained in:
nhmall
2019-12-19 18:37:02 -05:00
15 changed files with 89 additions and 58 deletions

View File

@@ -48,6 +48,7 @@ Platform- and/or Interface-Specific New Features
NetHack Community Patches (or Variation) Included NetHack Community Patches (or Variation) Included
------------------------------------------------- -------------------------------------------------
hallucinatory trap names from github pull request #174
autounlock feature originally from unnethack in github pull request #228 autounlock feature originally from unnethack in github pull request #228

View File

@@ -149,25 +149,21 @@
/* /*
* random_monster() * random_monster()
* random_object() * random_object()
* random_trap()
* *
* Respectively return a random monster, object, or trap number. * Respectively return a random monster or object.
*/ */
#define random_monster(rng) rng(NUMMONS) #define random_monster(rng) rng(NUMMONS)
#define random_object(rng) (rng(NUM_OBJECTS - 1) + 1) #define random_object(rng) (rng(NUM_OBJECTS - 1) + 1)
#define random_trap(rng) (rng(TRAPNUM - 1) + 1)
/* /*
* what_obj() * what_obj()
* what_mon() * what_mon()
* what_trap()
* *
* If hallucinating, choose a random object/monster, otherwise, use the one * If hallucinating, choose a random object/monster, otherwise, use the one
* given. Use the given rng to handle hallucination. * given. Use the given rng to handle hallucination.
*/ */
#define what_obj(obj, rng) (Hallucination ? random_object(rng) : obj) #define what_obj(obj, rng) (Hallucination ? random_object(rng) : obj)
#define what_mon(mon, rng) (Hallucination ? random_monster(rng) : mon) #define what_mon(mon, rng) (Hallucination ? random_monster(rng) : mon)
#define what_trap(trp, rng) (Hallucination ? random_trap(rng) : trp)
/* /*
* newsym_rn2 * newsym_rn2
@@ -338,8 +334,8 @@
#define explosion_to_glyph(expltype, idx) \ #define explosion_to_glyph(expltype, idx) \
((((expltype) * MAXEXPCHARS) + ((idx) - S_explode1)) + GLYPH_EXPLODE_OFF) ((((expltype) * MAXEXPCHARS) + ((idx) - S_explode1)) + GLYPH_EXPLODE_OFF)
#define trap_to_glyph(trap, rng) \ #define trap_to_glyph(trap) \
cmap_to_glyph(trap_to_defsym(what_trap((trap)->ttyp, rng))) cmap_to_glyph(trap_to_defsym((trap)->ttyp))
/* Not affected by hallucination. Gives a generic body for CORPSE */ /* Not affected by hallucination. Gives a generic body for CORPSE */
/* MRKR: ...and the generic statue */ /* MRKR: ...and the generic statue */

View File

@@ -2653,6 +2653,7 @@ E boolean FDECL(uescaped_shaft, (struct trap *));
E boolean NDECL(lava_effects); E boolean NDECL(lava_effects);
E void NDECL(sink_into_lava); E void NDECL(sink_into_lava);
E void NDECL(sokoban_guilt); E void NDECL(sokoban_guilt);
E const char * FDECL(trapname, (int, BOOLEAN_P));
/* ### u_init.c ### */ /* ### u_init.c ### */

View File

@@ -2516,7 +2516,7 @@ struct obj *otmp;
if (otmp == g.trapinfo.tobj && u.ux == g.trapinfo.tx if (otmp == g.trapinfo.tobj && u.ux == g.trapinfo.tx
&& u.uy == g.trapinfo.ty) { && u.uy == g.trapinfo.ty) {
You("resume setting %s%s.", shk_your(buf, otmp), You("resume setting %s%s.", shk_your(buf, otmp),
defsyms[trap_to_defsym(what_trap(ttyp, rn2))].explanation); trapname(ttyp, FALSE));
set_occupation(set_trap, occutext, 0); set_occupation(set_trap, occutext, 0);
return; return;
} }
@@ -2541,8 +2541,7 @@ struct obj *otmp;
chance = (rnl(10) > 5); chance = (rnl(10) > 5);
You("aren't very skilled at reaching from %s.", mon_nam(u.usteed)); You("aren't very skilled at reaching from %s.", mon_nam(u.usteed));
Sprintf(buf, "Continue your attempt to set %s?", Sprintf(buf, "Continue your attempt to set %s?",
the(defsyms[trap_to_defsym(what_trap(ttyp, rn2))] the(trapname(ttyp, FALSE)));
.explanation));
if (yn(buf) == 'y') { if (yn(buf) == 'y') {
if (chance) { if (chance) {
switch (ttyp) { switch (ttyp) {
@@ -2552,9 +2551,7 @@ struct obj *otmp;
break; break;
case BEAR_TRAP: /* drop it without arming it */ case BEAR_TRAP: /* drop it without arming it */
reset_trapset(); reset_trapset();
You("drop %s!", You("drop %s!", the(trapname(ttyp, FALSE)));
the(defsyms[trap_to_defsym(what_trap(ttyp, rn2))]
.explanation));
dropx(otmp); dropx(otmp);
return; return;
} }
@@ -2564,8 +2561,7 @@ struct obj *otmp;
return; return;
} }
} }
You("begin setting %s%s.", shk_your(buf, otmp), You("begin setting %s%s.", shk_your(buf, otmp), trapname(ttyp, FALSE));
defsyms[trap_to_defsym(what_trap(ttyp, rn2))].explanation);
set_occupation(set_trap, occutext, 0); set_occupation(set_trap, occutext, 0);
return; return;
} }
@@ -2596,8 +2592,7 @@ set_trap()
add_damage(u.ux, u.uy, 0L); /* schedule removal */ add_damage(u.ux, u.uy, 0L); /* schedule removal */
} }
if (!g.trapinfo.force_bungle) if (!g.trapinfo.force_bungle)
You("finish arming %s.", You("finish arming %s.", the(trapname(ttyp, FALSE)));
the(defsyms[trap_to_defsym(what_trap(ttyp, rn2))].explanation));
if (((otmp->cursed || Fumbling) && (rnl(10) > 5)) if (((otmp->cursed || Fumbling) && (rnl(10) > 5))
|| g.trapinfo.force_bungle) || g.trapinfo.force_bungle)
dotrap(ttmp, dotrap(ttmp,

View File

@@ -2513,7 +2513,7 @@ int final;
Strcpy(predicament, "trapped"); Strcpy(predicament, "trapped");
if ((t = t_at(u.ux, u.uy)) != 0) if ((t = t_at(u.ux, u.uy)) != 0)
Sprintf(eos(predicament), " in %s", Sprintf(eos(predicament), " in %s",
an(defsyms[trap_to_defsym(t->ttyp)].explanation)); an(trapname(t->ttyp, FALSE)));
} }
if (u.usteed) { /* not `Riding' here */ if (u.usteed) { /* not `Riding' here */
Sprintf(buf, "%s%s ", anchored ? "you and " : "", steedname); Sprintf(buf, "%s%s ", anchored ? "you and " : "", steedname);

View File

@@ -1612,7 +1612,6 @@ void
find_trap(trap) find_trap(trap)
struct trap *trap; struct trap *trap;
{ {
int tt = what_trap(trap->ttyp, rn2);
boolean cleared = FALSE; boolean cleared = FALSE;
trap->tseen = 1; trap->tseen = 1;
@@ -1623,8 +1622,7 @@ struct trap *trap;
behaviour might need a rework in the hallucination case behaviour might need a rework in the hallucination case
(e.g. to not prompt if any trap glyph appears on the square). */ (e.g. to not prompt if any trap glyph appears on the square). */
if (Hallucination || if (Hallucination ||
levl[trap->tx][trap->ty].glyph != levl[trap->tx][trap->ty].glyph != trap_to_glyph(trap)) {
trap_to_glyph(trap, rn2_on_display_rng)) {
/* There's too much clutter to see your find otherwise */ /* There's too much clutter to see your find otherwise */
cls(); cls();
map_trap(trap, 1); map_trap(trap, 1);
@@ -1632,7 +1630,7 @@ struct trap *trap;
cleared = TRUE; cleared = TRUE;
} }
You("find %s.", an(defsyms[trap_to_defsym(tt)].explanation)); You("find %s.", an(trapname(trap->ttyp, FALSE)));
if (cleared) { if (cleared) {
display_nhwindow(WIN_MAP, TRUE); /* wait */ display_nhwindow(WIN_MAP, TRUE); /* wait */
@@ -1871,7 +1869,7 @@ int default_glyph, which_subset;
|| glyph_is_invisible(glyph)) || glyph_is_invisible(glyph))
&& keep_traps && !covers_traps(x, y)) { && keep_traps && !covers_traps(x, y)) {
if ((t = t_at(x, y)) != 0 && t->tseen) if ((t = t_at(x, y)) != 0 && t->tseen)
glyph = trap_to_glyph(t, rn2_on_display_rng); glyph = trap_to_glyph(t);
} }
if ((glyph_is_object(glyph) && !keep_objs) if ((glyph_is_object(glyph) && !keep_objs)
|| (glyph_is_trap(glyph) && !keep_traps) || (glyph_is_trap(glyph) && !keep_traps)

View File

@@ -579,7 +579,7 @@ int ttyp;
if (ttyp != PIT && (!Can_dig_down(&u.uz) && !lev->candig)) { if (ttyp != PIT && (!Can_dig_down(&u.uz) && !lev->candig)) {
impossible("digactualhole: can't dig %s on this level.", impossible("digactualhole: can't dig %s on this level.",
defsyms[trap_to_defsym(ttyp)].explanation); trapname(ttyp, TRUE));
ttyp = PIT; ttyp = PIT;
} }

View File

@@ -229,7 +229,7 @@ register struct trap *trap;
register int show; register int show;
{ {
register int x = trap->tx, y = trap->ty; register int x = trap->tx, y = trap->ty;
register int glyph = trap_to_glyph(trap, newsym_rn2); register int glyph = trap_to_glyph(trap);
if (g.level.flags.hero_memory) if (g.level.flags.hero_memory)
levl[x][y].glyph = glyph; levl[x][y].glyph = glyph;

View File

@@ -756,8 +756,7 @@ int x, y;
return TRUE; return TRUE;
} else { } else {
if (ttmp->tseen) if (ttmp->tseen)
You("pass right over %s.", You("pass right over %s.", an(trapname(ttmp->ttyp, FALSE)));
an(defsyms[trap_to_defsym(ttmp->ttyp)].explanation));
} }
} }
if (--*range < 0) /* make sure our range never goes negative */ if (--*range < 0) /* make sure our range never goes negative */

View File

@@ -1499,10 +1499,8 @@ domove_core()
if (g.context.run >= 2) { if (g.context.run >= 2) {
if (iflags.mention_walls) { if (iflags.mention_walls) {
if (trap && trap->tseen) { if (trap && trap->tseen) {
int tt = what_trap(trap->ttyp, rn2_on_display_rng);
You("stop in front of %s.", You("stop in front of %s.",
an(defsyms[trap_to_defsym(tt)].explanation)); an(trapname(trap->ttyp, FALSE)));
} else if (is_pool_or_lava(x,y) && levl[x][y].seenv) { } else if (is_pool_or_lava(x,y) && levl[x][y].seenv) {
You("stop at the edge of the %s.", You("stop at the edge of the %s.",
hliquid(is_pool(x,y) ? "water" : "lava")); hliquid(is_pool(x,y) ? "water" : "lava"));
@@ -2758,10 +2756,9 @@ lookaround()
goto bcorr; /* if you must */ goto bcorr; /* if you must */
if (x == u.ux + u.dx && y == u.uy + u.dy) { if (x == u.ux + u.dx && y == u.uy + u.dy) {
if (iflags.mention_walls) { if (iflags.mention_walls) {
int tt = what_trap(trap->ttyp, rn2_on_display_rng);
You("stop in front of %s.", You("stop in front of %s.",
an(defsyms[trap_to_defsym(tt)].explanation)); an(trapname(trap->ttyp, FALSE)));
} }
goto stop; goto stop;
} }

View File

@@ -3422,8 +3422,7 @@ boolean picked_some;
return !!Blind; return !!Blind;
} }
if (!skip_objects && (trap = t_at(u.ux, u.uy)) && trap->tseen) if (!skip_objects && (trap = t_at(u.ux, u.uy)) && trap->tseen)
There("is %s here.", There("is %s here.", an(trapname(trap->ttyp, FALSE)));
an(defsyms[trap_to_defsym(trap->ttyp)].explanation));
otmp = g.level.objects[u.ux][u.uy]; otmp = g.level.objects[u.ux][u.uy];
dfeature = dfeature_at(u.ux, u.uy, fbuf2); dfeature = dfeature_at(u.ux, u.uy, fbuf2);

View File

@@ -3484,10 +3484,8 @@ struct obj *no_wish;
goto typfnd; goto typfnd;
} else if (trapped == 1 || *zp != '\0') { } else if (trapped == 1 || *zp != '\0') {
/* "trapped <foo>" or "<foo> trap" (actually "<foo>*") */ /* "trapped <foo>" or "<foo> trap" (actually "<foo>*") */
int idx = trap_to_defsym(beartrap ? BEAR_TRAP : LANDMINE);
/* use canonical trap spelling, skip object matching */ /* use canonical trap spelling, skip object matching */
Strcpy(bp, defsyms[idx].explanation); Strcpy(bp, trapname(beartrap ? BEAR_TRAP : LANDMINE, TRUE));
goto wiztrap; goto wiztrap;
} }
/* [no prefix or suffix; we're going to end up matching /* [no prefix or suffix; we're going to end up matching
@@ -3692,7 +3690,7 @@ struct obj *no_wish;
struct trap *t; struct trap *t;
const char *tname; const char *tname;
tname = defsyms[trap_to_defsym(trap)].explanation; tname = trapname(trap, TRUE);
if (strncmpi(tname, bp, strlen(tname))) if (strncmpi(tname, bp, strlen(tname)))
continue; continue;
/* found it; avoid stupid mistakes */ /* found it; avoid stupid mistakes */
@@ -3700,7 +3698,7 @@ struct obj *no_wish;
trap = ROCKTRAP; trap = ROCKTRAP;
if ((t = maketrap(x, y, trap)) != 0) { if ((t = maketrap(x, y, trap)) != 0) {
trap = t->ttyp; trap = t->ttyp;
tname = defsyms[trap_to_defsym(trap)].explanation; tname = trapname(trap, TRUE);
pline("%s%s.", An(tname), pline("%s%s.", An(tname),
(trap != MAGIC_PORTAL) ? "" : " to nowhere"); (trap != MAGIC_PORTAL) ? "" : " to nowhere");
} else } else

View File

@@ -305,8 +305,7 @@ int x, y;
/* newsym lets you know of the trap, so mention it here */ /* newsym lets you know of the trap, so mention it here */
if (tt == BEAR_TRAP || is_pit(tt) || tt == WEB) { if (tt == BEAR_TRAP || is_pit(tt) || tt == WEB) {
Sprintf(eos(buf), ", trapped in %s", Sprintf(eos(buf), ", trapped in %s", an(trapname(tt, FALSE)));
an(defsyms[trap_to_defsym(tt)].explanation));
t->tseen = 1; t->tseen = 1;
} }
} }
@@ -458,7 +457,7 @@ char *buf, *monbuf;
} else if (glyph_is_object(glyph)) { } else if (glyph_is_object(glyph)) {
look_at_object(buf, x, y, glyph); /* fill in buf[] */ look_at_object(buf, x, y, glyph); /* fill in buf[] */
} else if (glyph_is_trap(glyph)) { } else if (glyph_is_trap(glyph)) {
int tnum = what_trap(glyph_to_trap(glyph), rn2_on_display_rng); int tnum = glyph_to_trap(glyph);
/* Trap detection displays a bear trap at locations having /* Trap detection displays a bear trap at locations having
* a trapped door or trapped container or both. * a trapped door or trapped container or both.
@@ -470,7 +469,7 @@ char *buf, *monbuf;
else if (trapped_door_at(tnum, x, y)) else if (trapped_door_at(tnum, x, y))
Strcpy(buf, "trapped door"); /* not "trap door"... */ Strcpy(buf, "trapped door"); /* not "trap door"... */
else else
Strcpy(buf, defsyms[trap_to_defsym(tnum)].explanation); Strcpy(buf, trapname(tnum, FALSE));
} else if (glyph_is_warning(glyph)) { } else if (glyph_is_warning(glyph)) {
int warnindx = glyph_to_warning(glyph); int warnindx = glyph_to_warning(glyph);
@@ -1570,9 +1569,8 @@ doidtrap()
if (u.dz < 0 ? is_hole(tt) : tt == ROCKTRAP) if (u.dz < 0 ? is_hole(tt) : tt == ROCKTRAP)
break; break;
} }
tt = what_trap(tt, rn2_on_display_rng);
pline("That is %s%s%s.", pline("That is %s%s%s.",
an(defsyms[trap_to_defsym(tt)].explanation), an(trapname(tt, FALSE)),
!trap->madeby_u !trap->madeby_u
? "" ? ""
: (tt == WEB) : (tt == WEB)

View File

@@ -285,7 +285,7 @@ boolean force; /* Quietly force this animal */
struct trap *t = t_at(mtmp->mx, mtmp->my); struct trap *t = t_at(mtmp->mx, mtmp->my);
You_cant("mount %s while %s's trapped in %s.", mon_nam(mtmp), You_cant("mount %s while %s's trapped in %s.", mon_nam(mtmp),
mhe(mtmp), an(defsyms[trap_to_defsym(t->ttyp)].explanation)); mhe(mtmp), an(trapname(t->ttyp, FALSE)));
return (FALSE); return (FALSE);
} }

View File

@@ -923,14 +923,14 @@ unsigned trflags;
*/ */
pline("Air currents pull you down into %s %s!", pline("Air currents pull you down into %s %s!",
a_your[trap->madeby_u], a_your[trap->madeby_u],
defsyms[trap_to_defsym(ttype)].explanation); trapname(ttype, TRUE)); /* do force "pit" while hallucinating */
/* then proceed to normal trap effect */ /* then proceed to normal trap effect */
} else if (already_seen && !forcetrap) { } else if (already_seen && !forcetrap) {
if ((Levitation || (Flying && !plunged)) if ((Levitation || (Flying && !plunged))
&& (is_pit(ttype) || ttype == HOLE || ttype == BEAR_TRAP)) { && (is_pit(ttype) || ttype == HOLE || ttype == BEAR_TRAP)) {
You("%s over %s %s.", Levitation ? "float" : "fly", You("%s over %s %s.", Levitation ? "float" : "fly",
a_your[trap->madeby_u], a_your[trap->madeby_u],
defsyms[trap_to_defsym(ttype)].explanation); trapname(ttype, FALSE));
return; return;
} }
if (!Fumbling && ttype != MAGIC_PORTAL && ttype != VIBRATING_SQUARE if (!Fumbling && ttype != MAGIC_PORTAL && ttype != VIBRATING_SQUARE
@@ -941,7 +941,7 @@ unsigned trflags;
You("escape %s %s.", (ttype == ARROW_TRAP && !trap->madeby_u) You("escape %s %s.", (ttype == ARROW_TRAP && !trap->madeby_u)
? "an" ? "an"
: a_your[trap->madeby_u], : a_your[trap->madeby_u],
defsyms[trap_to_defsym(ttype)].explanation); trapname(ttype, FALSE));
return; return;
} }
} }
@@ -1290,7 +1290,7 @@ unsigned trflags;
if (!Can_fall_thru(&u.uz)) { if (!Can_fall_thru(&u.uz)) {
seetrap(trap); /* normally done in fall_through */ seetrap(trap); /* normally done in fall_through */
impossible("dotrap: %ss cannot exist on this level.", impossible("dotrap: %ss cannot exist on this level.",
defsyms[trap_to_defsym(ttype)].explanation); trapname(ttype, TRUE));
break; /* don't activate it after all */ break; /* don't activate it after all */
} }
fall_through(TRUE, (trflags & TOOKPLUNGE)); fall_through(TRUE, (trflags & TOOKPLUNGE));
@@ -2465,7 +2465,7 @@ register struct monst *mtmp;
case TRAPDOOR: case TRAPDOOR:
if (!Can_fall_thru(&u.uz)) { if (!Can_fall_thru(&u.uz)) {
impossible("mintrap: %ss cannot exist on this level.", impossible("mintrap: %ss cannot exist on this level.",
defsyms[trap_to_defsym(tt)].explanation); trapname(tt, TRUE));
break; /* don't activate it after all */ break; /* don't activate it after all */
} }
if (is_flyer(mptr) || is_floater(mptr) || mptr == &mons[PM_WUMPUS] if (is_flyer(mptr) || is_floater(mptr) || mptr == &mons[PM_WUMPUS]
@@ -4051,8 +4051,7 @@ boolean force_failure;
if ((g.invent && (inv_weight() + weight_cap() > 600)) if ((g.invent && (inv_weight() + weight_cap() > 600))
|| bigmonst(g.youmonst.data)) { || bigmonst(g.youmonst.data)) {
/* don't allow untrap if they can't get thru to it */ /* don't allow untrap if they can't get thru to it */
You("are unable to reach the %s!", You("are unable to reach the %s!", trapname(ttype, FALSE));
defsyms[trap_to_defsym(ttype)].explanation);
return 0; return 0;
} }
} }
@@ -4061,8 +4060,7 @@ boolean force_failure;
if (u.usteed && P_SKILL(P_RIDING) < P_BASIC) if (u.usteed && P_SKILL(P_RIDING) < P_BASIC)
rider_cant_reach(); rider_cant_reach();
else else
You("are unable to reach the %s!", You("are unable to reach the %s!", trapname(ttype, FALSE));
defsyms[trap_to_defsym(ttype)].explanation);
return 0; return 0;
} }
@@ -4102,7 +4100,7 @@ boolean force_failure;
} else { } else {
pline("%s %s is difficult to %s.", pline("%s %s is difficult to %s.",
ttmp->madeby_u ? "Your" : under_u ? "This" : "That", ttmp->madeby_u ? "Your" : under_u ? "This" : "That",
defsyms[trap_to_defsym(ttype)].explanation, trapname(ttype, FALSE),
(ttype == WEB) ? "remove" : "disarm"); (ttype == WEB) ? "remove" : "disarm");
} }
return 1; return 1;
@@ -4381,7 +4379,7 @@ boolean force;
ttmp = t_at(x, y); ttmp = t_at(x, y);
if (ttmp && !ttmp->tseen) if (ttmp && !ttmp->tseen)
ttmp = 0; ttmp = 0;
trapdescr = ttmp ? defsyms[trap_to_defsym(ttmp->ttyp)].explanation : 0; trapdescr = ttmp ? trapname(ttmp->ttyp, FALSE) : 0;
here = (x == u.ux && y == u.uy); /* !u.dx && !u.dy */ here = (x == u.ux && y == u.uy); /* !u.dx && !u.dy */
if (here) /* are there are one or more containers here? */ if (here) /* are there are one or more containers here? */
@@ -4641,7 +4639,7 @@ boolean *noticed; /* set to true iff hero notices the effect; */
} }
if (!trapdescr) if (!trapdescr)
trapdescr = defsyms[trap_to_defsym(t->ttyp)].explanation; trapdescr = trapname(t->ttyp, FALSE);
if (!which) if (!which)
which = t->tseen ? the_your[t->madeby_u] which = t->tseen ? the_your[t->madeby_u]
: index(vowels, *trapdescr) ? "an" : "a"; : index(vowels, *trapdescr) ? "an" : "a";
@@ -5452,4 +5450,55 @@ maybe_finish_sokoban()
} }
} }
/* Return the string name of the trap type passed in, unless the player is
* hallucinating, in which case return a random or hallucinatory trap name.
* If the second argument is true, return the correct trap name even when
* hallucinating (for things like wizard mode wishing for traps and impossible
* calls).
* Originally I had intended for messages like "You begin setting the bear trap"
* to override as well, but the context in those bits of code indicated that it
* was meant to take a random name if the hero was hallucinating.
*/
const char *
trapname(ttyp, override)
int ttyp;
boolean override;
{
const char * halu_trapnames[] = {
/* riffs on actual nethack traps */
"bottomless pit", "polymorphism trap", "devil teleporter",
"falling boulder trap", "anti-anti-magic field", "weeping gas trap",
"queasy board", "electrified web", "owlbear trap", "sand mine",
/* some traps found in nethack variants */
"death trap", "disintegration trap", "ice trap", "monochrome trap",
/* plausible real-life traps */
"axeblade trap", "pool of boiling oil", "pool of quicksand",
"field of caltrops", "buzzsaw trap", "spiked floor", "revolving wall",
"uneven floor", "finger trap", "jack-in-a-box", "yellow snow",
"booby trap", "rat trap", "poisoned nail", "snare", "whirlpool",
"trip wire",
/* sci-fi */
"negative space", "tensor field", "singularity", "imperial fleet",
"black hole", "thermal detonator", "event horizon",
"entoptic phenomenon",
/* miscellaneous suggestions */
"sweet-smelling gas vent", "phone booth", "exploding runes",
"never-ending elevator", "slime pit", "warp zone", "illusory floor",
"pile of poo", "honey trap", "tourist trap"
};
int total_names = TRAPNUM + SIZE(halu_trapnames);
int nameidx = rn2_on_display_rng(total_names);
if (override || !Hallucination) {
return defsyms[trap_to_defsym(ttyp)].explanation;
}
if (nameidx < TRAPNUM) {
/* random but real trap name */
return defsyms[trap_to_defsym(nameidx)].explanation;
}
else {
nameidx -= TRAPNUM;
return halu_trapnames[nameidx];
}
}
/*trap.c*/ /*trap.c*/