guardian corpse, statue animation follow-up
- fix ring of protection from shape changers causing real monster to be created. - add ability to get the character class monster from genus() or the species. - use the character class monster when animating guardian corpses.
This commit is contained in:
@@ -1098,7 +1098,7 @@ E struct mkroom *FDECL(search_special, (SCHAR_P));
|
|||||||
/* ### mon.c ### */
|
/* ### mon.c ### */
|
||||||
|
|
||||||
E int FDECL(undead_to_corpse, (int));
|
E int FDECL(undead_to_corpse, (int));
|
||||||
E int FDECL(genus, (int));
|
E int FDECL(genus, (int,int));
|
||||||
E int FDECL(pm_to_cham, (int));
|
E int FDECL(pm_to_cham, (int));
|
||||||
E int FDECL(minliquid, (struct monst *));
|
E int FDECL(minliquid, (struct monst *));
|
||||||
E int NDECL(movemon);
|
E int NDECL(movemon);
|
||||||
|
|||||||
35
src/mon.c
35
src/mon.c
@@ -86,30 +86,31 @@ int mndx;
|
|||||||
|
|
||||||
/* Convert the monster index of some monsters (such as quest guardians)
|
/* Convert the monster index of some monsters (such as quest guardians)
|
||||||
* to their generic species type.
|
* to their generic species type.
|
||||||
|
*
|
||||||
|
* Return associated character class monster, rather than species
|
||||||
|
* if mode is 1.
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
genus(mndx)
|
genus(mndx, mode)
|
||||||
int mndx;
|
int mndx, mode;
|
||||||
{
|
{
|
||||||
switch (mndx) {
|
switch (mndx) {
|
||||||
/* Quest guardians */
|
/* Quest guardians */
|
||||||
case PM_STUDENT:
|
case PM_STUDENT: mndx = mode ? PM_VALKYRIE : PM_HUMAN; break;
|
||||||
case PM_CHIEFTAIN:
|
case PM_CHIEFTAIN: mndx = mode ? PM_BARBARIAN : PM_HUMAN; break;
|
||||||
case PM_NEANDERTHAL:
|
case PM_NEANDERTHAL: mndx = mode ? PM_CAVEMAN : PM_HUMAN; break;
|
||||||
case PM_ATTENDANT:
|
case PM_ATTENDANT: mndx = mode ? PM_HEALER : PM_HUMAN; break;
|
||||||
case PM_PAGE:
|
case PM_PAGE: mndx = mode ? PM_KNIGHT : PM_HUMAN; break;
|
||||||
case PM_ABBOT:
|
case PM_ABBOT: mndx = mode ? PM_MONK : PM_HUMAN; break;
|
||||||
case PM_ACOLYTE:
|
case PM_ACOLYTE: mndx = mode ? PM_PRIEST : PM_HUMAN; break;
|
||||||
case PM_HUNTER:
|
case PM_HUNTER: mndx = mode ? PM_RANGER : PM_HUMAN; break;
|
||||||
case PM_THUG:
|
case PM_THUG: mndx = mode ? PM_ROGUE : PM_HUMAN; break;
|
||||||
case PM_ROSHI:
|
case PM_ROSHI: mndx = mode ? PM_SAMURAI : PM_HUMAN; break;
|
||||||
#ifdef TOURIST
|
#ifdef TOURIST
|
||||||
case PM_GUIDE:
|
case PM_GUIDE: mndx = mode ? PM_TOURIST : PM_HUMAN; break;
|
||||||
#endif
|
#endif
|
||||||
case PM_WARRIOR:
|
case PM_APPRENTICE: mndx = mode ? PM_WIZARD : PM_HUMAN; break;
|
||||||
case PM_APPRENTICE:
|
case PM_WARRIOR: mndx = mode ? PM_VALKYRIE : PM_HUMAN; break;
|
||||||
mndx = PM_HUMAN;
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
if (mndx >= LOW_PM && mndx < NUMMONS) {
|
if (mndx >= LOW_PM && mndx < NUMMONS) {
|
||||||
struct permonst *ptr = &mons[mndx];
|
struct permonst *ptr = &mons[mndx];
|
||||||
|
|||||||
@@ -2560,7 +2560,7 @@ typfnd:
|
|||||||
or of ordinary one being forced to such */
|
or of ordinary one being forced to such */
|
||||||
if (otmp->timed) obj_stop_timers(otmp);
|
if (otmp->timed) obj_stop_timers(otmp);
|
||||||
if (mons[mntmp].msound == MS_GUARDIAN)
|
if (mons[mntmp].msound == MS_GUARDIAN)
|
||||||
otmp->corpsenm = genus(mntmp);
|
otmp->corpsenm = genus(mntmp,1);
|
||||||
else
|
else
|
||||||
otmp->corpsenm = mntmp;
|
otmp->corpsenm = mntmp;
|
||||||
start_corpse_timeout(otmp);
|
start_corpse_timeout(otmp);
|
||||||
|
|||||||
@@ -438,7 +438,7 @@ register struct monst *mtmp;
|
|||||||
/* Make sure its your role's quest quardian; adjust if not */
|
/* Make sure its your role's quest quardian; adjust if not */
|
||||||
if (ptr->msound == MS_GUARDIAN && ptr != &mons[urole.guardnum]) {
|
if (ptr->msound == MS_GUARDIAN && ptr != &mons[urole.guardnum]) {
|
||||||
int mndx = monsndx(ptr);
|
int mndx = monsndx(ptr);
|
||||||
ptr = &mons[genus(mndx)];
|
ptr = &mons[genus(mndx,1)];
|
||||||
}
|
}
|
||||||
|
|
||||||
/* be sure to do this before talking; the monster might teleport away, in
|
/* be sure to do this before talking; the monster might teleport away, in
|
||||||
|
|||||||
11
src/trap.c
11
src/trap.c
@@ -444,7 +444,16 @@ int *fail_reason;
|
|||||||
*/
|
*/
|
||||||
mon = makemon(&mons[PM_DOPPELGANGER], x, y,
|
mon = makemon(&mons[PM_DOPPELGANGER], x, y,
|
||||||
NO_MINVENT|MM_NOCOUNTBIRTH|MM_ADJACENTOK);
|
NO_MINVENT|MM_NOCOUNTBIRTH|MM_ADJACENTOK);
|
||||||
if (mon) (void) newcham(mon, mptr, FALSE, FALSE);
|
if (mon) {
|
||||||
|
/* makemon() will set mon->cham to
|
||||||
|
* CHAM_ORDINARY if hero is wearing
|
||||||
|
* ring of protection from shape changers
|
||||||
|
* when makemon() is called, so we have to
|
||||||
|
* check the field before calling newcham().
|
||||||
|
*/
|
||||||
|
if (mon->cham == CHAM_DOPPELGANGER)
|
||||||
|
(void) newcham(mon, mptr, FALSE, FALSE);
|
||||||
|
}
|
||||||
} else
|
} else
|
||||||
mon = makemon(mptr, x, y, (cause == ANIMATE_SPELL) ?
|
mon = makemon(mptr, x, y, (cause == ANIMATE_SPELL) ?
|
||||||
(NO_MINVENT | MM_ADJACENTOK) : NO_MINVENT);
|
(NO_MINVENT | MM_ADJACENTOK) : NO_MINVENT);
|
||||||
|
|||||||
Reference in New Issue
Block a user