diff --git a/src/makemon.c b/src/makemon.c index ce988d409..a6f77b483 100644 --- a/src/makemon.c +++ b/src/makemon.c @@ -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); diff --git a/src/minion.c b/src/minion.c index 041fcafac..07b125b37 100644 --- a/src/minion.c +++ b/src/minion.c @@ -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) { diff --git a/src/priest.c b/src/priest.c index 5774547a9..55cae96d8 100644 --- a/src/priest.c +++ b/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); } } }