priest/minion bits (trunk only)
Cleanup up a couple of priest and minion allocation/conversion bits. Also, restrict minion naming so that "guardian <foo>" is only applied when <foo> is an Angel. (That restores old behavior from before a change I made last October; it prevents the guardian Angel from being recognized while hallucinating. It probably affects slash'em too, where they have tame minions besides the astral level's guardian Angel.)
This commit is contained in:
@@ -1101,8 +1101,11 @@ register int mmflags;
|
||||
}
|
||||
/* it's possible to create an ordinary monster of some special
|
||||
types; make sure their extended data is initialized to
|
||||
something sensible (caller can override these settings) */
|
||||
if (mndx == PM_ALIGNED_PRIEST || (mndx == PM_ANGEL && !rn2(3))) {
|
||||
something sensible if caller hasn't specified MM_EPRI|MM_EMIN
|
||||
(when they're specified, caller intends to handle this itself) */
|
||||
if ((mndx == PM_ALIGNED_PRIEST || mndx == PM_HIGH_PRIEST) ?
|
||||
!(mmflags && (MM_EPRI|MM_EMIN)) :
|
||||
(mndx == PM_ANGEL && !(mmflags && MM_EMIN) && !rn2(3))) {
|
||||
struct emin *eminp;
|
||||
newemin(mtmp);
|
||||
eminp = EMIN(mtmp);
|
||||
|
||||
@@ -138,12 +138,11 @@ boolean talk;
|
||||
if (mnum == NON_PM) {
|
||||
mon = 0;
|
||||
} else if (mnum == PM_ANGEL) {
|
||||
mon = makemon(&mons[mnum], u.ux, u.uy, MM_EPRI|MM_EMIN);
|
||||
mon = makemon(&mons[mnum], u.ux, u.uy, MM_EMIN);
|
||||
if (mon) {
|
||||
mon->isminion = 1;
|
||||
EMIN(mon)->min_align = alignment;
|
||||
EMIN(mon)->renegade = FALSE;
|
||||
EPRI(mon)->shralign = alignment;
|
||||
}
|
||||
} else if (mnum != PM_SHOPKEEPER && mnum != PM_GUARD &&
|
||||
mnum != PM_ALIGNED_PRIEST && mnum != PM_HIGH_PRIEST) {
|
||||
|
||||
29
src/priest.c
29
src/priest.c
@@ -295,7 +295,7 @@ char *pname; /* caller-supplied output buffer */
|
||||
what = "priest";
|
||||
}
|
||||
} else {
|
||||
if (mon->mtame)
|
||||
if (mon->mtame && !strcmpi(what, "Angel"))
|
||||
Strcat(pname, "guardian ");
|
||||
}
|
||||
|
||||
@@ -561,10 +561,10 @@ boolean peaceful;
|
||||
register struct monst *roamer;
|
||||
register boolean coaligned = (u.ualign.type == alignment);
|
||||
|
||||
/* Angel's have the emin extension; aligned priests have the epri
|
||||
extension, we access it as if it were emin */
|
||||
#if 0 /* this was due to permonst's pxlth field which is now gone */
|
||||
if (ptr != &mons[PM_ALIGNED_PRIEST] && ptr != &mons[PM_ANGEL])
|
||||
return((struct monst *)0);
|
||||
#endif
|
||||
|
||||
if (MON_AT(x, y)) (void) rloc(m_at(x, y), FALSE); /* insurance */
|
||||
|
||||
@@ -690,6 +690,8 @@ angry_priest()
|
||||
struct rm *lev;
|
||||
|
||||
if ((priest = findpriest(temple_occupied(u.urooms))) != 0) {
|
||||
struct epri *eprip = EPRI(priest);
|
||||
|
||||
wakeup(priest);
|
||||
/*
|
||||
* If the altar has been destroyed or converted, let the
|
||||
@@ -698,20 +700,19 @@ angry_priest()
|
||||
* a fresh corpse nearby, the priest ought to have an
|
||||
* opportunity to try converting it back; maybe someday...)
|
||||
*/
|
||||
lev = &levl[EPRI(priest)->shrpos.x][EPRI(priest)->shrpos.y];
|
||||
lev = &levl[eprip->shrpos.x][eprip->shrpos.y];
|
||||
if (!IS_ALTAR(lev->typ) ||
|
||||
((aligntyp)Amask2align(lev->altarmask & AM_MASK) !=
|
||||
EPRI(priest)->shralign)) {
|
||||
if (EPRI(priest)) {
|
||||
if (!EMIN(priest)) newemin(priest);
|
||||
priest->ispriest = 0; /* roamer */
|
||||
/* but still aligned */
|
||||
priest->isminion = 1;
|
||||
EMIN(priest)->min_align = EPRI(priest)->shralign;
|
||||
}
|
||||
/* this used to overload EPRI's shroom field, which was then clobbered
|
||||
* but not since adding the separate mextra structure */
|
||||
eprip->shralign)) {
|
||||
if (!EMIN(priest)) newemin(priest);
|
||||
priest->ispriest = 0; /* now a roaming minion */
|
||||
priest->isminion = 1;
|
||||
EMIN(priest)->min_align = eprip->shralign;
|
||||
EMIN(priest)->renegade = FALSE;
|
||||
/* discard priest's memory of his former shrine;
|
||||
if we ever implement the re-conversion mentioned
|
||||
above, this will need to be removed */
|
||||
free_epri(priest);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user