/* Some altars are considered shrines, add a flag for that
for the altarmask field of struct rm. */
#define AM_SHRINE 0x08
+/* High altar on Astral plane or Moloch's sanctum */
+#define AM_SANCTUM 0x10
/* special level flags, gone by the time the level has been loaded */
-#define AM_SPLEV_CO 0x10 /* co-aligned: force alignment to match hero's */
-#define AM_SPLEV_NONCO 0x20 /* non-co-aligned: force alignment to not match */
-#define AM_SPLEV_RANDOM 0x40
+#define AM_SPLEV_CO 0x20 /* co-aligned: force alignment to match hero's */
+#define AM_SPLEV_NONCO 0x40 /* non-co-aligned: force alignment to not match */
+#define AM_SPLEV_RANDOM 0x80
#define Amask2align(x) \
((aligntyp) ((((x) & AM_MASK) == 0) ? A_NONE \
(((mon)->female == 0) ? GLYPH_PET_MALE_OFF : GLYPH_PET_FEM_OFF))
#define altar_to_glyph(amsk) \
- (((amsk & (AM_MASK | AM_SHRINE)) == AM_NONE) \
+ (((amsk & (AM_MASK | AM_SHRINE | AM_SANCTUM)) == AM_NONE) \
? (GLYPH_ALTAR_OFF + altar_unaligned) \
- : (((amsk & AM_SHRINE) == AM_SHRINE) \
- && (Is_astralevel(&u.uz) || Is_sanctum(&u.uz))) \
+ : ((amsk & AM_SANCTUM) == AM_SANCTUM) \
? (GLYPH_ALTAR_OFF + altar_other) \
: ((amsk & AM_MASK) == AM_CHAOTIC) \
? (GLYPH_ALTAR_OFF + altar_chaotic) \
cmap = S_sink; /* "sink" */
else if (IS_ALTAR(ltyp)) {
Sprintf(altbuf, "%saltar to %s (%s)",
- ((lev->altarmask & AM_SHRINE)
- && (Is_astralevel(&u.uz) || Is_sanctum(&u.uz)))
- ? "high "
- : "",
+ (lev->altarmask & AM_SANCTUM) ? "high " : "",
a_gname(),
align_str(Amask2align(lev->altarmask & ~AM_SHRINE)));
dfeature = altbuf;
pline_The("kitchen sink falls%s.", into_a_chasm);
goto do_pit;
case ALTAR:
+ amsk = altarmask_at(x, y);
/* always preserve the high altars */
- if (Is_astralevel(&u.uz) || Is_sanctum(&u.uz))
+ if ((amsk & AM_SANCTUM) != 0)
break;
- /* no need to check for high altar here; we've just
- excluded those */
- amsk = altarmask_at(x, y);
algn = Amask2align(amsk & AM_MASK);
if (cansee(x, y))
pline_The("%s altar falls%s.",
Sprintf(buf, "%s %saltar",
/* like endgame high priests, endgame high altars
are only recognizable when immediately adjacent */
- (Is_astralevel(&u.uz) && !next2u(x, y))
+ (Is_astralevel(&u.uz) && !next2u(x, y)
+ && (amsk & AM_SANCTUM))
? "aligned"
: align_str(algn),
- ((amsk & AM_SHRINE) != 0
- && (Is_astralevel(&u.uz) || Is_sanctum(&u.uz)))
- ? "high "
- : "");
+ (amsk & AM_SANCTUM) ? "high " : "");
break;
case S_ndoor:
if (is_drawbridge_wall(x, y) >= 0)
You("are not standing on an altar.");
return ECMD_OK;
}
- highaltar = ((Is_astralevel(&u.uz) || Is_sanctum(&u.uz))
- && (levl[u.ux][u.uy].altarmask & AM_SHRINE));
+ highaltar = (levl[u.ux][u.uy].altarmask & AM_SANCTUM);
otmp = floorfood("sacrifice", 1);
if (!otmp)
if (a->shrine) { /* Is it a shrine or sanctum? */
priestini(&u.uz, croom, x, y, (a->shrine > 1));
levl[x][y].altarmask |= AM_SHRINE;
+ if (a->shrine == 2) /* high altar or sanctum */
+ levl[x][y].altarmask |= AM_SANCTUM;
g.level.flags.has_temple = TRUE;
}
}