diff --git a/include/display.h b/include/display.h index abede528d..9da288d67 100644 --- a/include/display.h +++ b/include/display.h @@ -215,13 +215,13 @@ #define display_self() \ show_glyph(u.ux, u.uy, \ - maybe_display_usteed((youmonst.m_ap_type == M_AP_NOTHING) \ + maybe_display_usteed((U_AP_TYPE == M_AP_NOTHING) \ ? hero_glyph \ - : (youmonst.m_ap_type == M_AP_FURNITURE) \ + : (U_AP_TYPE == M_AP_FURNITURE) \ ? cmap_to_glyph(youmonst.mappearance) \ - : (youmonst.m_ap_type == M_AP_OBJECT) \ + : (U_AP_TYPE == M_AP_OBJECT) \ ? objnum_to_glyph(youmonst.mappearance) \ - /* else M_AP_MONSTER */ \ + /* else U_AP_TYPE == M_AP_MONSTER */ \ : monnum_to_glyph(youmonst.mappearance))) /* diff --git a/include/monst.h b/include/monst.h index dde983205..9a0b4f243 100644 --- a/include/monst.h +++ b/include/monst.h @@ -47,9 +47,16 @@ enum m_ap_types { M_AP_NOTHING = 0, /* mappearance unused--monster appears as itself */ M_AP_FURNITURE = 1, /* stairs, a door, an altar, etc. */ M_AP_OBJECT = 2, /* an object */ - M_AP_MONSTER = 3 /* a monster; mostly used for cloned Wizard */ + M_AP_MONSTER = 3, /* a monster; mostly used for cloned Wizard */ }; +#define M_AP_TYPMASK 0x7 +#define M_AP_F_DKNOWN 0x8 +#define U_AP_TYPE (youmonst.m_ap_type & M_AP_TYPMASK) +#define U_AP_FLAG (youmonst.m_ap_type & ~M_AP_TYPMASK) +#define M_AP_TYPE(m) ((m)->m_ap_type & M_AP_TYPMASK) +#define M_AP_FLAG(m) ((m)->m_ap_type & ~M_AP_TYPMASK) + struct monst { struct monst *nmon; struct permonst *data; @@ -170,15 +177,15 @@ struct monst { /* mimic appearances that block vision/light */ #define is_lightblocker_mappear(mon) \ (is_obj_mappear(mon, BOULDER) \ - || ((mon)->m_ap_type == M_AP_FURNITURE \ + || (M_AP_TYPE(mon) == M_AP_FURNITURE \ && ((mon)->mappearance == S_hcdoor \ || (mon)->mappearance == S_vcdoor \ || (mon)->mappearance < S_ndoor /* = walls */ \ || (mon)->mappearance == S_tree))) -#define is_door_mappear(mon) ((mon)->m_ap_type == M_AP_FURNITURE \ +#define is_door_mappear(mon) (M_AP_TYPE(mon) == M_AP_FURNITURE \ && ((mon)->mappearance == S_hcdoor \ || (mon)->mappearance == S_vcdoor)) -#define is_obj_mappear(mon,otyp) ((mon)->m_ap_type == M_AP_OBJECT \ +#define is_obj_mappear(mon,otyp) (M_AP_TYPE(mon) == M_AP_OBJECT \ && (mon)->mappearance == (otyp)) #endif /* MONST_H */ diff --git a/src/apply.c b/src/apply.c index fdb5fa4a1..998d4ddec 100644 --- a/src/apply.c +++ b/src/apply.c @@ -384,7 +384,7 @@ register struct obj *obj; } else if (mtmp->mappearance) { const char *what = "thing"; - switch (mtmp->m_ap_type) { + switch (M_AP_TYPE(mtmp)) { case M_AP_OBJECT: what = simple_typename(mtmp->mappearance); break; @@ -486,7 +486,7 @@ struct obj *obj; } /* mimic must be revealed before we know whether it actually moves because line-of-sight may change */ - if (mtmp->m_ap_type) + if (M_AP_TYPE(mtmp)) seemimic(mtmp); omx = mtmp->mx, omy = mtmp->my; mnexto(mtmp); @@ -2109,7 +2109,7 @@ long timeout; and_vanish[0] = '\0'; if ((mtmp->minvis && !See_invisible) || (mtmp->data->mlet == S_MIMIC - && mtmp->m_ap_type != M_AP_NOTHING)) + && M_AP_TYPE(mtmp) != M_AP_NOTHING)) suppress_see = TRUE; if (mtmp->mundetected) { @@ -2840,7 +2840,7 @@ struct obj *obj; } wakeup(mtmp, TRUE); } else { - if (mtmp->m_ap_type && !Protection_from_shape_changers + if (M_AP_TYPE(mtmp) && !Protection_from_shape_changers && !sensemon(mtmp)) stumble_onto_mimic(mtmp); else diff --git a/src/cmd.c b/src/cmd.c index c3166bd6a..34444a483 100644 --- a/src/cmd.c +++ b/src/cmd.c @@ -2272,7 +2272,7 @@ int final; : surface(u.ux, u.uy)); /* catchall; shouldn't happen */ you_are(buf, from_what(WWALKING)); } - if (Upolyd && (u.uundetected || youmonst.m_ap_type != M_AP_NOTHING)) + if (Upolyd && (u.uundetected || U_AP_TYPE != M_AP_NOTHING)) youhiding(TRUE, final); /* internal troubles, mostly in the order that prayer ranks them */ @@ -3094,16 +3094,16 @@ int msgflag; /* for variant message phrasing */ char *bp, buf[BUFSZ]; Strcpy(buf, "hiding"); - if (youmonst.m_ap_type != M_AP_NOTHING) { + if (U_AP_TYPE != M_AP_NOTHING) { /* mimic; hero is only able to mimic a strange object or gold or hallucinatory alternative to gold, so we skip the details for the hypothetical furniture and monster cases */ bp = eos(strcpy(buf, "mimicking")); - if (youmonst.m_ap_type == M_AP_OBJECT) { + if (U_AP_TYPE == M_AP_OBJECT) { Sprintf(bp, " %s", an(simple_typename(youmonst.mappearance))); - } else if (youmonst.m_ap_type == M_AP_FURNITURE) { + } else if (U_AP_TYPE == M_AP_FURNITURE) { Strcpy(bp, " something"); - } else if (youmonst.m_ap_type == M_AP_MONSTER) { + } else if (U_AP_TYPE == M_AP_MONSTER) { Strcpy(bp, " someone"); } else { ; /* something unexpected; leave 'buf' as-is */ diff --git a/src/detect.c b/src/detect.c index 3a25d45fb..45271687d 100644 --- a/src/detect.c +++ b/src/detect.c @@ -655,7 +655,7 @@ int class; /* an object class, 0 for all */ if (do_dknown) do_dknown_of(obj); } - if ((is_cursed && mtmp->m_ap_type == M_AP_OBJECT + if ((is_cursed && M_AP_TYPE(mtmp) == M_AP_OBJECT && (!class || class == objects[mtmp->mappearance].oc_class)) || (findgold(mtmp->minvent) && (!class || class == COIN_CLASS))) { ct++; @@ -730,7 +730,7 @@ int class; /* an object class, 0 for all */ break; } /* Allow a mimic to override the detected objects it is carrying. */ - if (is_cursed && mtmp->m_ap_type == M_AP_OBJECT + if (is_cursed && M_AP_TYPE(mtmp) == M_AP_OBJECT && (!class || class == objects[mtmp->mappearance].oc_class)) { struct obj temp; @@ -1469,7 +1469,7 @@ genericptr_t num; (*(int *) num)++; } } else if ((mtmp = m_at(zx, zy)) != 0) { - if (mtmp->m_ap_type) { + if (M_AP_TYPE(mtmp)) { seemimic(mtmp); (*(int *) num)++; } @@ -1633,7 +1633,7 @@ boolean via_warning; if (via_warning && !warning_of(mtmp)) return -1; - if (mtmp->m_ap_type) { + if (M_AP_TYPE(mtmp)) { seemimic(mtmp); found_something = TRUE; } else if (!canspotmon(mtmp)) { @@ -1862,7 +1862,7 @@ int default_glyph, which_subset; /* look for a mimic here posing as furniture; if we don't find one, we'll have to fake it */ if ((mtmp = m_at(x, y)) != 0 - && mtmp->m_ap_type == M_AP_FURNITURE) { + && M_AP_TYPE(mtmp) == M_AP_FURNITURE) { glyph = cmap_to_glyph(mtmp->mappearance); } else { /* we have a topology type but we want a screen diff --git a/src/display.c b/src/display.c index d8abb384e..e44793895 100644 --- a/src/display.c +++ b/src/display.c @@ -377,7 +377,7 @@ int sightflags; /* 1 if the monster is physically seen; 2 if detected using Detect_monsters */ xchar worm_tail; /* mon is actually a worm tail */ { - boolean mon_mimic = (mon->m_ap_type != M_AP_NOTHING); + boolean mon_mimic = (M_AP_TYPE(mon) != M_AP_NOTHING); int sensed = (mon_mimic && (Protection_from_shape_changers || sensemon(mon))); /* @@ -388,7 +388,7 @@ xchar worm_tail; /* mon is actually a worm tail */ */ if (mon_mimic && (sightflags == PHYSICALLY_SEEN)) { - switch (mon->m_ap_type) { + switch (M_AP_TYPE(mon)) { default: impossible("display_monster: bad m_ap_type value [ = %d ]", (int) mon->m_ap_type); diff --git a/src/do_name.c b/src/do_name.c index 4f6bdbebd..6dd8d5a1e 100644 --- a/src/do_name.c +++ b/src/do_name.c @@ -1149,8 +1149,8 @@ do_mname() if (!mtmp || (!sensemon(mtmp) && (!(cansee(cx, cy) || see_with_infrared(mtmp)) - || mtmp->mundetected || mtmp->m_ap_type == M_AP_FURNITURE - || mtmp->m_ap_type == M_AP_OBJECT + || mtmp->mundetected || M_AP_TYPE(mtmp) == M_AP_FURNITURE + || M_AP_TYPE(mtmp) == M_AP_OBJECT || (mtmp->minvis && !See_invisible)))) { pline("I see no monster there."); return; diff --git a/src/dogmove.c b/src/dogmove.c index 604877103..552da454b 100644 --- a/src/dogmove.c +++ b/src/dogmove.c @@ -1361,7 +1361,7 @@ finish_meating(mtmp) struct monst *mtmp; { mtmp->meating = 0; - if (mtmp->m_ap_type && mtmp->mappearance && mtmp->cham == NON_PM) { + if (M_AP_TYPE(mtmp) && mtmp->mappearance && mtmp->cham == NON_PM) { /* was eating a mimic and now appearance needs resetting */ mtmp->m_ap_type = 0; mtmp->mappearance = 0; @@ -1415,15 +1415,15 @@ struct monst *mtmp; newsym(mtmp->mx, mtmp->my); You("%s %s %sappear%s where %s was!", cansee(mtmp->mx, mtmp->my) ? "see" : "sense that", - (mtmp->m_ap_type == M_AP_FURNITURE) + (M_AP_TYPE(mtmp) == M_AP_FURNITURE) ? an(defsyms[mtmp->mappearance].explanation) - : (mtmp->m_ap_type == M_AP_OBJECT + : (M_AP_TYPE(mtmp) == M_AP_OBJECT && OBJ_DESCR(objects[mtmp->mappearance])) ? an(OBJ_DESCR(objects[mtmp->mappearance])) - : (mtmp->m_ap_type == M_AP_OBJECT + : (M_AP_TYPE(mtmp) == M_AP_OBJECT && OBJ_NAME(objects[mtmp->mappearance])) ? an(OBJ_NAME(objects[mtmp->mappearance])) - : (mtmp->m_ap_type == M_AP_MONSTER) + : (M_AP_TYPE(mtmp) == M_AP_MONSTER) ? an(mons[mtmp->mappearance].mname) : something, cansee(mtmp->mx, mtmp->my) ? "" : "has ", diff --git a/src/dokick.c b/src/dokick.c index e06bc285f..55df097e5 100644 --- a/src/dokick.c +++ b/src/dokick.c @@ -63,7 +63,7 @@ boolean clumsy; return; } - if (mon->m_ap_type) + if (M_AP_TYPE(mon)) seemimic(mon); check_caitiff(mon); @@ -166,8 +166,8 @@ xchar x, y; /* reveal hidden target even if kick ends up missing (note: being hidden doesn't affect chance to hit so neither does this reveal) */ if (mon->mundetected - || (mon->m_ap_type && mon->m_ap_type != M_AP_MONSTER)) { - if (mon->m_ap_type) + || (M_AP_TYPE(mon) && M_AP_TYPE(mon) != M_AP_MONSTER)) { + if (M_AP_TYPE(mon)) seemimic(mon); mon->mundetected = 0; if (!canspotmon(mon)) diff --git a/src/dothrow.c b/src/dothrow.c index 7a83cdd33..1da7d0dca 100644 --- a/src/dothrow.c +++ b/src/dothrow.c @@ -1487,7 +1487,7 @@ boolean maybe_wakeup; An attentive player will still notice that this is different from an arrow just landing short of any target (no message in that case), so will realize that there is a valid target here anyway. */ - if (!canseemon(mon) || (mon->m_ap_type && mon->m_ap_type != M_AP_MONSTER)) + if (!canseemon(mon) || (M_AP_TYPE(mon) && M_AP_TYPE(mon) != M_AP_MONSTER)) pline("%s %s.", The(missile), otense(obj, "miss")); else miss(missile, mon); diff --git a/src/dungeon.c b/src/dungeon.c index 10ae01277..08722645b 100644 --- a/src/dungeon.c +++ b/src/dungeon.c @@ -2516,7 +2516,7 @@ recalc_mapseen() if (ltyp == DRAWBRIDGE_UP) ltyp = db_under_typ(levl[x][y].drawbridgemask); if ((mtmp = m_at(x, y)) != 0 - && mtmp->m_ap_type == M_AP_FURNITURE && canseemon(mtmp)) + && M_AP_TYPE(mtmp) == M_AP_FURNITURE && canseemon(mtmp)) ltyp = cmap_to_type(mtmp->mappearance); lastseentyp[x][y] = ltyp; } diff --git a/src/eat.c b/src/eat.c index 94a86568a..4dd3a0a31 100644 --- a/src/eat.c +++ b/src/eat.c @@ -161,7 +161,7 @@ eatmdone(VOID_ARGS) free((genericptr_t) eatmbuf), eatmbuf = 0; } /* update display */ - if (youmonst.m_ap_type) { + if (U_AP_TYPE) { youmonst.m_ap_type = M_AP_NOTHING; newsym(u.ux, u.uy); } diff --git a/src/end.c b/src/end.c index 080fb729c..73860ace4 100644 --- a/src/end.c +++ b/src/end.c @@ -421,7 +421,7 @@ int how; ? &mons[mtmp->cham] : mptr); boolean distorted = (boolean) (Hallucination && canspotmon(mtmp)), - mimicker = (mtmp->m_ap_type == M_AP_MONSTER), + mimicker = (M_AP_TYPE(mtmp) == M_AP_MONSTER), imitator = (mptr != champtr || mimicker); You((how == STONING) ? "turn to stone..." : "die..."); diff --git a/src/hack.c b/src/hack.c index ddb4a5f05..d84dd353d 100644 --- a/src/hack.c +++ b/src/hack.c @@ -1533,8 +1533,8 @@ domove_core() /* It's fine to displace pets, though */ /* We should never get here if forcefight */ if (context.run && ((!Blind && mon_visible(mtmp) - && ((mtmp->m_ap_type != M_AP_FURNITURE - && mtmp->m_ap_type != M_AP_OBJECT) + && ((M_AP_TYPE(mtmp) != M_AP_FURNITURE + && M_AP_TYPE(mtmp) != M_AP_OBJECT) || Protection_from_shape_changers)) || sensemon(mtmp))) { nomul(0); @@ -1574,7 +1574,7 @@ domove_core() */ if (context.nopick && !context.travel && (canspotmon(mtmp) || glyph_is_invisible(levl[x][y].glyph))) { - if (mtmp->m_ap_type && !Protection_from_shape_changers + if (M_AP_TYPE(mtmp) && !Protection_from_shape_changers && !sensemon(mtmp)) stumble_onto_mimic(mtmp); else if (mtmp->mpeaceful && !Hallucination) @@ -1762,7 +1762,7 @@ domove_core() cancel the swap below (we can ignore steed mx,my here) */ u.ux = u.ux0, u.uy = u.uy0; mtmp->mundetected = 0; - if (mtmp->m_ap_type) + if (M_AP_TYPE(mtmp)) seemimic(mtmp); else if (!mtmp->mtame) newsym(mtmp->mx, mtmp->my); @@ -1866,8 +1866,8 @@ domove_core() * imitating something that doesn't move. We could extend this * to non-moving monsters... */ - if ((u.dx || u.dy) && (youmonst.m_ap_type == M_AP_OBJECT - || youmonst.m_ap_type == M_AP_FURNITURE)) + if ((u.dx || u.dy) && (U_AP_TYPE == M_AP_OBJECT + || U_AP_TYPE == M_AP_FURNITURE)) youmonst.m_ap_type = M_AP_NOTHING; check_leash(u.ux0, u.uy0); @@ -2655,8 +2655,8 @@ lookaround() continue; if ((mtmp = m_at(x, y)) != 0 - && mtmp->m_ap_type != M_AP_FURNITURE - && mtmp->m_ap_type != M_AP_OBJECT + && M_AP_TYPE(mtmp) != M_AP_FURNITURE + && M_AP_TYPE(mtmp) != M_AP_OBJECT && (!mtmp->minvis || See_invisible) && !mtmp->mundetected) { if ((context.run != 1 && !mtmp->mtame) || (x == u.ux + u.dx && y == u.uy + u.dy @@ -2838,8 +2838,8 @@ monster_nearby() for (y = u.uy - 1; y <= u.uy + 1; y++) { if (!isok(x, y) || (x == u.ux && y == u.uy)) continue; - if ((mtmp = m_at(x, y)) && mtmp->m_ap_type != M_AP_FURNITURE - && mtmp->m_ap_type != M_AP_OBJECT + if ((mtmp = m_at(x, y)) && M_AP_TYPE(mtmp) != M_AP_FURNITURE + && M_AP_TYPE(mtmp) != M_AP_OBJECT && (!mtmp->mpeaceful || Hallucination) && (!is_hider(mtmp->data) || !mtmp->mundetected) && !noattacks(mtmp->data) && mtmp->mcanmove diff --git a/src/lock.c b/src/lock.c index 3e2337351..270ab1866 100644 --- a/src/lock.c +++ b/src/lock.c @@ -453,8 +453,8 @@ struct obj *pick; door = &levl[cc.x][cc.y]; mtmp = m_at(cc.x, cc.y); - if (mtmp && canseemon(mtmp) && mtmp->m_ap_type != M_AP_FURNITURE - && mtmp->m_ap_type != M_AP_OBJECT) { + if (mtmp && canseemon(mtmp) && M_AP_TYPE(mtmp) != M_AP_FURNITURE + && M_AP_TYPE(mtmp) != M_AP_OBJECT) { if (picktyp == CREDIT_CARD && (mtmp->isshk || mtmp->data == &mons[PM_ORACLE])) verbalize("No checks, no credit, no problem."); @@ -745,8 +745,8 @@ boolean quietly; { register struct monst *mtmp = m_at(x, y); - if (mtmp && mtmp->m_ap_type != M_AP_FURNITURE) { - if (mtmp->m_ap_type == M_AP_OBJECT) + if (mtmp && M_AP_TYPE(mtmp) != M_AP_FURNITURE) { + if (M_AP_TYPE(mtmp) == M_AP_OBJECT) goto objhere; if (!quietly) { if ((mtmp->mx != x) || (mtmp->my != y)) { diff --git a/src/mhitm.c b/src/mhitm.c index 3a95815f7..a2d0c6659 100644 --- a/src/mhitm.c +++ b/src/mhitm.c @@ -94,9 +94,9 @@ struct attack *mattk; map_invisible(magr->mx, magr->my); if (!canspotmon(mdef)) map_invisible(mdef->mx, mdef->my); - if (mdef->m_ap_type) + if (M_AP_TYPE(mdef)) seemimic(mdef); - if (magr->m_ap_type) + if (M_AP_TYPE(magr)) seemimic(magr); fmt = (could_seduce(magr, mdef, mattk) && !magr->mcan) ? "%s pretends to be friendly to" @@ -225,7 +225,7 @@ boolean quietly; /* undetected monster becomes un-hidden if it is displaced */ if (mdef->mundetected) mdef->mundetected = 0; - if (mdef->m_ap_type && mdef->m_ap_type != M_AP_MONSTER) + if (M_AP_TYPE(mdef) && M_AP_TYPE(mdef) != M_AP_MONSTER) seemimic(mdef); /* wake up the displaced defender */ mdef->msleeping = 0; @@ -543,9 +543,9 @@ struct attack *mattk; map_invisible(magr->mx, magr->my); if (!canspotmon(mdef)) map_invisible(mdef->mx, mdef->my); - if (mdef->m_ap_type) + if (M_AP_TYPE(mdef)) seemimic(mdef); - if (magr->m_ap_type) + if (M_AP_TYPE(magr)) seemimic(magr); if ((compat = could_seduce(magr, mdef, mattk)) && !magr->mcan) { Sprintf(buf, "%s %s", Monnam(magr), @@ -599,7 +599,7 @@ struct attack *mattk; if (vis) { if (mdef->data->mlet == S_MIMIC - && mdef->m_ap_type != M_AP_NOTHING) + && M_AP_TYPE(mdef) != M_AP_NOTHING) seemimic(mdef); Sprintf(buf, "%s gazes at", Monnam(magr)); pline("%s %s...", buf, diff --git a/src/mhitu.c b/src/mhitu.c index 25f10b660..fb44227c1 100644 --- a/src/mhitu.c +++ b/src/mhitu.c @@ -525,7 +525,7 @@ register struct monst *mtmp; } /* hero might be a mimic, concealed via #monster */ - if (youmonst.data->mlet == S_MIMIC && youmonst.m_ap_type && !range2 + if (youmonst.data->mlet == S_MIMIC && U_AP_TYPE && !range2 && foundyou && !u.uswallow) { boolean sticky = sticks(youmonst.data); @@ -545,7 +545,7 @@ register struct monst *mtmp; } /* non-mimic hero might be mimicking an object after eating m corpse */ - if (youmonst.m_ap_type == M_AP_OBJECT && !range2 && foundyou + if (U_AP_TYPE == M_AP_OBJECT && !range2 && foundyou && !u.uswallow) { if (!canspotmon(mtmp)) map_invisible(mtmp->mx, mtmp->my); diff --git a/src/mon.c b/src/mon.c index 11113b7e8..7dc5f7c48 100644 --- a/src/mon.c +++ b/src/mon.c @@ -799,8 +799,8 @@ movemon() /* unwatched mimics and piercers may hide again [MRS] */ if (restrap(mtmp)) continue; - if (mtmp->m_ap_type == M_AP_FURNITURE - || mtmp->m_ap_type == M_AP_OBJECT) + if (M_AP_TYPE(mtmp) == M_AP_FURNITURE + || M_AP_TYPE(mtmp) == M_AP_OBJECT) continue; if (mtmp->mundetected) continue; @@ -1682,7 +1682,7 @@ struct monst **monst_list; /* &migrating_mons or &mydogs or null */ clone can continue imitating some other monster form); also, might be imitating a boulder so need line-of-sight unblocking */ mon->mundetected = 0; - if (mon->m_ap_type && mon->m_ap_type != M_AP_MONSTER) + if (M_AP_TYPE(mon) && M_AP_TYPE(mon) != M_AP_MONSTER) seemimic(mon); } @@ -1821,7 +1821,7 @@ struct permonst *mptr; /* reflects mtmp->data _prior_ to mtmp's death */ } if (emits_light(mptr)) del_light_source(LS_MONSTER, monst_to_any(mtmp)); - if (mtmp->m_ap_type) + if (M_AP_TYPE(mtmp)) seemimic(mtmp); if (onmap) newsym(mtmp->mx, mtmp->my); @@ -2870,7 +2870,7 @@ register struct monst *mtmp; boolean via_attack; { mtmp->msleeping = 0; - if (mtmp->m_ap_type) { + if (M_AP_TYPE(mtmp)) { seemimic(mtmp); } else if (context.forcefight && !context.mon_moving && mtmp->mundetected) { @@ -2958,7 +2958,7 @@ rescham() } if (is_were(mtmp->data) && mtmp->data->mlet != S_HUMAN) new_were(mtmp); - if (mtmp->m_ap_type && cansee(mtmp->mx, mtmp->my)) { + if (M_AP_TYPE(mtmp) && cansee(mtmp->mx, mtmp->my)) { seemimic(mtmp); /* we pretend that the mimic doesn't know that it has been unmasked */ @@ -3015,7 +3015,7 @@ register struct monst *mtmp; { struct trap *t; - if (mtmp->mcan || mtmp->m_ap_type || cansee(mtmp->mx, mtmp->my) + if (mtmp->mcan || M_AP_TYPE(mtmp) || cansee(mtmp->mx, mtmp->my) || rn2(3) || mtmp == u.ustuck /* can't hide while trapped except in pits */ || (mtmp->mtrapped && (t = t_at(mtmp->mx, mtmp->my)) != 0 @@ -3076,7 +3076,7 @@ struct monst *mon; boolean hider_under = hides_under(mon->data) || mon->data->mlet == S_EEL; if ((is_hider(mon->data) || hider_under) - && !(mon->mundetected || mon->m_ap_type)) { + && !(mon->mundetected || M_AP_TYPE(mon))) { xchar x = mon->mx, y = mon->my; char save_viz = viz_array[y][x]; @@ -3085,7 +3085,7 @@ struct monst *mon; if (is_hider(mon->data)) (void) restrap(mon); /* try again if mimic missed its 1/3 chance to hide */ - if (mon->data->mlet == S_MIMIC && !mon->m_ap_type) + if (mon->data->mlet == S_MIMIC && !M_AP_TYPE(mon)) (void) restrap(mon); if (hider_under) (void) hideunder(mon); @@ -3551,7 +3551,7 @@ boolean msg; /* "The oldmon turns into a newmon!" */ wormgone(mtmp); place_monster(mtmp, mtmp->mx, mtmp->my); } - if (mtmp->m_ap_type && mdat->mlet != S_MIMIC) + if (M_AP_TYPE(mtmp) && mdat->mlet != S_MIMIC) seemimic(mtmp); /* revert to normal monster */ /* (this code used to try to adjust the monster's health based on @@ -3940,7 +3940,7 @@ short otyp; { short ap = mtmp->mappearance; - switch (mtmp->m_ap_type) { + switch (M_AP_TYPE(mtmp)) { case M_AP_NOTHING: case M_AP_FURNITURE: case M_AP_MONSTER: diff --git a/src/monmove.c b/src/monmove.c index 305ba4cbb..942124c28 100644 --- a/src/monmove.c +++ b/src/monmove.c @@ -231,8 +231,8 @@ register struct monst *mtmp; || mtmp->data->mlet == S_LEPRECHAUN) || !rn2(50)) && (Aggravate_monster || (mtmp->data->mlet == S_DOG || mtmp->data->mlet == S_HUMAN) - || (!rn2(7) && mtmp->m_ap_type != M_AP_FURNITURE - && mtmp->m_ap_type != M_AP_OBJECT))) { + || (!rn2(7) && M_AP_TYPE(mtmp) != M_AP_FURNITURE + && M_AP_TYPE(mtmp) != M_AP_OBJECT))) { mtmp->msleeping = 0; return 1; } @@ -289,8 +289,8 @@ boolean fleemsg; mtmp->mfleetim = (unsigned) min(fleetime, 127); } if (!mtmp->mflee && fleemsg && canseemon(mtmp) - && mtmp->m_ap_type != M_AP_FURNITURE - && mtmp->m_ap_type != M_AP_OBJECT) { + && M_AP_TYPE(mtmp) != M_AP_FURNITURE + && M_AP_TYPE(mtmp) != M_AP_OBJECT) { /* unfortunately we can't distinguish between temporary sleep and temporary paralysis, so both conditions receive the same alternate message */ diff --git a/src/mthrowu.c b/src/mthrowu.c index 862c6cca1..d10d2f1f1 100644 --- a/src/mthrowu.c +++ b/src/mthrowu.c @@ -313,7 +313,7 @@ boolean verbose; /* give message(s) even when you can't see what happened */ struct obj *mon_launcher = archer ? MON_WEP(archer) : NULL; notonhead = (bhitpos.x != mtmp->mx || bhitpos.y != mtmp->my); - ismimic = mtmp->m_ap_type && mtmp->m_ap_type != M_AP_MONSTER; + ismimic = M_AP_TYPE(mtmp) && M_AP_TYPE(mtmp) != M_AP_MONSTER; vis = cansee(bhitpos.x, bhitpos.y); tmp = 5 + find_mac(mtmp) + omon_adj(mtmp, otmp, FALSE); @@ -1073,8 +1073,8 @@ register struct monst *mtmp; /* hero concealment usually trumps monst awareness of being lined up */ if (Upolyd && rn2(25) - && (u.uundetected || (youmonst.m_ap_type != M_AP_NOTHING - && youmonst.m_ap_type != M_AP_MONSTER))) + && (u.uundetected || (U_AP_TYPE != M_AP_NOTHING + && U_AP_TYPE != M_AP_MONSTER))) return FALSE; ignore_boulders = (throws_rocks(mtmp->data) diff --git a/src/objnam.c b/src/objnam.c index af2365f55..06efd9bda 100644 --- a/src/objnam.c +++ b/src/objnam.c @@ -4111,7 +4111,7 @@ const char * mimic_obj_name(mtmp) struct monst *mtmp; { - if (mtmp->m_ap_type == M_AP_OBJECT) { + if (M_AP_TYPE(mtmp) == M_AP_OBJECT) { if (mtmp->mappearance == GOLD_PIECE) return "gold"; if (mtmp->mappearance != STRANGE_OBJECT) diff --git a/src/pager.c b/src/pager.c index 8833a21bb..5ca886df6 100644 --- a/src/pager.c +++ b/src/pager.c @@ -89,7 +89,7 @@ char *outbuf; mons[u.umonnum].mname, plname); if (u.usteed) Sprintf(eos(outbuf), ", mounted on %s", y_monnam(u.usteed)); - if (u.uundetected || (Upolyd && youmonst.m_ap_type)) + if (u.uundetected || (Upolyd && U_AP_TYPE)) mhidden_description(&youmonst, FALSE, eos(outbuf)); return outbuf; } @@ -109,12 +109,12 @@ char *outbuf; : glyph_at(x, y); *outbuf = '\0'; - if (mon->m_ap_type == M_AP_FURNITURE - || mon->m_ap_type == M_AP_OBJECT) { + if (M_AP_TYPE(mon) == M_AP_FURNITURE + || M_AP_TYPE(mon) == M_AP_OBJECT) { Strcpy(outbuf, ", mimicking "); - if (mon->m_ap_type == M_AP_FURNITURE) { + if (M_AP_TYPE(mon) == M_AP_FURNITURE) { Strcat(outbuf, an(defsyms[mon->mappearance].explanation)); - } else if (mon->m_ap_type == M_AP_OBJECT + } else if (M_AP_TYPE(mon) == M_AP_OBJECT /* remembered glyph, not glyph_at() which is 'mon' */ && glyph_is_object(glyph)) { objfrommap: @@ -130,7 +130,7 @@ char *outbuf; } else { Strcat(outbuf, something); } - } else if (mon->m_ap_type == M_AP_MONSTER) { + } else if (M_AP_TYPE(mon) == M_AP_MONSTER) { if (altmon) Sprintf(outbuf, ", masquerading as %s", an(mons[mon->mappearance].mname)); @@ -160,7 +160,7 @@ object_from_map(glyph, x, y, obj_p) int glyph, x, y; struct obj **obj_p; { - boolean fakeobj = FALSE; + boolean fakeobj = FALSE, mimic_obj = FALSE; struct monst *mtmp; struct obj *otmp; int glyphotyp = glyph_to_obj(glyph); @@ -174,9 +174,10 @@ struct obj **obj_p; /* there might be a mimic here posing as an object */ mtmp = m_at(x, y); - if (mtmp && is_obj_mappear(mtmp, (unsigned) glyphotyp)) + if (mtmp && is_obj_mappear(mtmp, (unsigned) glyphotyp)) { otmp = 0; - else + mimic_obj = TRUE; + } else mtmp = 0; if (!otmp || otmp->otyp != glyphotyp) { @@ -214,7 +215,11 @@ struct obj **obj_p; /* terrain mode views what's already known, doesn't learn new stuff */ && !iflags.terrainmode) /* so don't set dknown when in terrain mode */ otmp->dknown = 1; /* if a pile, clearly see the top item only */ - + if (fakeobj && mtmp && mimic_obj && + (otmp->dknown || (M_AP_FLAG(mtmp) & M_AP_F_DKNOWN))) { + mtmp->m_ap_type |= M_AP_F_DKNOWN; + otmp->dknown = 1; + } *obj_p = otmp; return fakeobj; /* when True, caller needs to dealloc *obj_p */ } @@ -299,7 +304,7 @@ int x, y; /* we know the hero sees a monster at this location, but if it's shown due to persistant monster detection he might remember something else */ - if (mtmp->mundetected || mtmp->m_ap_type) + if (mtmp->mundetected || M_AP_TYPE(mtmp)) mhidden_description(mtmp, FALSE, eos(buf)); if (monbuf) { diff --git a/src/polyself.c b/src/polyself.c index c30ac6583..8ed827906 100644 --- a/src/polyself.c +++ b/src/polyself.c @@ -162,7 +162,7 @@ polyman(fmt, arg) const char *fmt, *arg; { boolean sticky = (sticks(youmonst.data) && u.ustuck && !u.uswallow), - was_mimicking = (youmonst.m_ap_type == M_AP_OBJECT); + was_mimicking = (U_AP_TYPE == M_AP_OBJECT); boolean was_blind = !!Blind; if (Upolyd) { @@ -625,7 +625,7 @@ int mntmp; } /* if stuck mimicking gold, stop immediately */ - if (multi < 0 && youmonst.m_ap_type == M_AP_OBJECT + if (multi < 0 && U_AP_TYPE == M_AP_OBJECT && youmonst.data->mlet != S_MIMIC) unmul(""); /* if becoming a non-mimic, stop mimicking anything */ @@ -1323,8 +1323,8 @@ dogaze() pline("%s seems not to notice your gaze.", Monnam(mtmp)); } else if (mtmp->minvis && !See_invisible) { You_cant("see where to gaze at %s.", Monnam(mtmp)); - } else if (mtmp->m_ap_type == M_AP_FURNITURE - || mtmp->m_ap_type == M_AP_OBJECT) { + } else if (M_AP_TYPE(mtmp) == M_AP_FURNITURE + || M_AP_TYPE(mtmp) == M_AP_OBJECT) { looked--; continue; } else if (flags.safe_dog && mtmp->mtame && !Confusion) { @@ -1432,7 +1432,7 @@ dohide() : (humanoid(u.ustuck->data) ? "holding someone" : "holding that creature")); if (u.uundetected - || (ismimic && youmonst.m_ap_type != M_AP_NOTHING)) { + || (ismimic && U_AP_TYPE != M_AP_NOTHING)) { u.uundetected = 0; youmonst.m_ap_type = M_AP_NOTHING; newsym(u.ux, u.uy); @@ -1470,7 +1470,7 @@ dohide() * else make youhiding() give smarter messages at such spots. */ - if (u.uundetected || (ismimic && youmonst.m_ap_type != M_AP_NOTHING)) { + if (u.uundetected || (ismimic && U_AP_TYPE != M_AP_NOTHING)) { youhiding(FALSE, 1); /* "you are already hiding" */ return 0; } diff --git a/src/shk.c b/src/shk.c index 1817d9bec..d5ad782bd 100644 --- a/src/shk.c +++ b/src/shk.c @@ -517,8 +517,8 @@ deserted_shop(enterstring) continue; if ((mtmp = m_at(x, y)) != 0) { ++n; - if (sensemon(mtmp) || ((mtmp->m_ap_type == M_AP_NOTHING - || mtmp->m_ap_type == M_AP_MONSTER) + if (sensemon(mtmp) || ((M_AP_TYPE(mtmp) == M_AP_NOTHING + || M_AP_TYPE(mtmp) == M_AP_MONSTER) && canseemon(mtmp))) ++m; } diff --git a/src/sounds.c b/src/sounds.c index 7d4c0be63..505a10e56 100644 --- a/src/sounds.c +++ b/src/sounds.c @@ -1059,8 +1059,8 @@ dochat() return 0; } - if (!mtmp || mtmp->mundetected || mtmp->m_ap_type == M_AP_FURNITURE - || mtmp->m_ap_type == M_AP_OBJECT) + if (!mtmp || mtmp->mundetected || M_AP_TYPE(mtmp) == M_AP_FURNITURE + || M_AP_TYPE(mtmp) == M_AP_OBJECT) return 0; /* sleeping monsters won't talk, except priests (who wake up) */ diff --git a/src/steed.c b/src/steed.c index feede89c5..f7ad61024 100644 --- a/src/steed.c +++ b/src/steed.c @@ -238,8 +238,8 @@ boolean force; /* Quietly force this animal */ /* Can the player reach and see the monster? */ if (!mtmp || (!force && ((Blind && !Blind_telepat) || mtmp->mundetected - || mtmp->m_ap_type == M_AP_FURNITURE - || mtmp->m_ap_type == M_AP_OBJECT))) { + || M_AP_TYPE(mtmp) == M_AP_FURNITURE + || M_AP_TYPE(mtmp) == M_AP_OBJECT))) { pline("I see nobody there."); return (FALSE); } diff --git a/src/trap.c b/src/trap.c index f422241a6..02d1030ef 100644 --- a/src/trap.c +++ b/src/trap.c @@ -632,7 +632,7 @@ int *fail_reason; if (has_oname(statue) && !unique_corpstat(mon->data)) mon = christen_monst(mon, ONAME(statue)); /* mimic statue becomes seen mimic; other hiders won't be hidden */ - if (mon->m_ap_type) + if (M_AP_TYPE(mon)) seemimic(mon); else mon->mundetected = FALSE; @@ -4444,8 +4444,8 @@ boolean force; return 1; } if ((mtmp = m_at(x, y)) != 0 - && (mtmp->m_ap_type == M_AP_FURNITURE - || mtmp->m_ap_type == M_AP_OBJECT)) { + && (M_AP_TYPE(mtmp) == M_AP_FURNITURE + || M_AP_TYPE(mtmp) == M_AP_OBJECT)) { stumble_onto_mimic(mtmp); return 1; } diff --git a/src/uhitm.c b/src/uhitm.c index a02bc80f4..b354d5d7a 100644 --- a/src/uhitm.c +++ b/src/uhitm.c @@ -146,7 +146,7 @@ struct obj *wep; /* uwep for attack(), null for kick_monster() */ /* if it was an invisible mimic, treat it as if we stumbled * onto a visible mimic */ - if (mtmp->m_ap_type && !Protection_from_shape_changers + if (M_AP_TYPE(mtmp) && !Protection_from_shape_changers /* applied pole-arm attack is too far to get stuck */ && distu(mtmp->mx, mtmp->my) <= 2) { if (!u.ustuck && !mtmp->mflee && dmgtype(mtmp->data, AD_STCK)) @@ -162,7 +162,7 @@ struct obj *wep; /* uwep for attack(), null for kick_monster() */ return TRUE; } - if (mtmp->m_ap_type && !Protection_from_shape_changers && !sensemon(mtmp) + if (M_AP_TYPE(mtmp) && !Protection_from_shape_changers && !sensemon(mtmp) && !glyph_is_warning(glyph)) { /* If a hidden mimic was in a square where a player remembers * some (probably different) unseen monster, the player is in @@ -204,7 +204,7 @@ struct obj *wep; /* uwep for attack(), null for kick_monster() */ * make sure to wake up a monster from the above cases if the * hero can sense that the monster is there. */ - if ((mtmp->mundetected || mtmp->m_ap_type) && sensemon(mtmp)) { + if ((mtmp->mundetected || M_AP_TYPE(mtmp)) && sensemon(mtmp)) { mtmp->mundetected = 0; wakeup(mtmp, TRUE); } @@ -2993,7 +2993,7 @@ struct monst *mtmp; if (Blind) { if (!Blind_telepat) what = generic; /* with default fmt */ - else if (mtmp->m_ap_type == M_AP_MONSTER) + else if (M_AP_TYPE(mtmp) == M_AP_MONSTER) what = a_monnam(mtmp); /* differs from what was sensed */ } else { int glyph = levl[u.ux + u.dx][u.uy + u.dy].glyph; diff --git a/src/vault.c b/src/vault.c index 0e86803da..7340ba2a4 100644 --- a/src/vault.c +++ b/src/vault.c @@ -412,8 +412,8 @@ invault() mongone(guard); return; } - if (youmonst.m_ap_type == M_AP_OBJECT || u.uundetected) { - if (youmonst.m_ap_type == M_AP_OBJECT + if (U_AP_TYPE == M_AP_OBJECT || u.uundetected) { + if (U_AP_TYPE == M_AP_OBJECT && youmonst.mappearance != GOLD_PIECE) if (!Deaf) verbalize("Hey! Who left that %s in here?", diff --git a/src/zap.c b/src/zap.c index 755f83c76..a9350eb4f 100644 --- a/src/zap.c +++ b/src/zap.c @@ -144,7 +144,7 @@ struct obj *otmp; const char *zap_type_text = "spell"; struct obj *obj; boolean disguised_mimic = (mtmp->data->mlet == S_MIMIC - && mtmp->m_ap_type != M_AP_NOTHING); + && M_AP_TYPE(mtmp) != M_AP_NOTHING); if (u.uswallow && mtmp == u.ustuck) reveal_invis = FALSE; @@ -461,7 +461,7 @@ struct obj *otmp; m_respond(mtmp); if (mtmp->isshk && !*u.ushops) hot_pursuit(mtmp); - } else if (mtmp->m_ap_type) + } else if (M_AP_TYPE(mtmp)) seemimic(mtmp); /* might unblock if mimicing a boulder/door */ } /* note: bhitpos won't be set if swallowed, but that's okay since @@ -826,7 +826,7 @@ boolean by_hero; mtmp->mundetected = 0; newsym(mtmp->mx, mtmp->my); } - if (mtmp->m_ap_type) + if (M_AP_TYPE(mtmp)) seemimic(mtmp); one_of = (corpse->quan > 1L); @@ -2755,7 +2755,7 @@ boolean youattack, allow_cancel_kill, self_cancel; } else { mdef->mcan = 1; /* force shapeshifter into its base form */ - if (mdef->m_ap_type != M_AP_NOTHING) + if (M_AP_TYPE(mdef) != M_AP_NOTHING) seemimic(mdef); /* [not 'else if'; chameleon might have been hiding as a mimic] */ if (mdef->cham >= LOW_PM) {