boolean teleport_pet(struct monst * mtmp, boolean force_it) { struct obj *otmp; if (mtmp == u.usteed) return FALSE; if (mtmp->mleashed) { otmp = get_mleash(mtmp); if (!otmp) { impossible("%s is leashed, without a leash.", Monnam(mtmp)); goto release_it; } if (otmp->cursed && !force_it) { yelp(mtmp); return FALSE; } else { pline("Your leash goes slack."); release_it: m_unleash(mtmp, FALSE); return TRUE; } } return TRUE; }
void abuse_dog(struct monst *mtmp) { if (!mtmp->mtame) return; if (Aggravate_monster || Conflict) mtmp->mtame /= 2; else mtmp->mtame--; if (mtmp->mtame && !mtmp->isminion) EDOG(mtmp)->abuse++; if (!mtmp->mtame && mtmp->mleashed) m_unleash(mtmp, TRUE); /* don't make a sound if pet is in the middle of leaving the level */ /* newsym isn't necessary in this case either */ if (mtmp->mx != COLNO) { if (mtmp->mtame && rn2(mtmp->mtame)) yelp(mtmp); else growl(mtmp); /* give them a moment's worry */ if (!mtmp->mtame && mtmp->dlevel == level) newsym(mtmp->mx, mtmp->my); } }
static bool clear_fcorr(struct monst *grd, bool forceshow) { int fcx, fcy, fcbeg; struct monst *mtmp; if (!on_level(&(EGD(grd)->gdlevel), &u.uz)) return true; while ((fcbeg = EGD(grd)->fcbeg) < EGD(grd)->fcend) { fcx = EGD(grd)->fakecorr[fcbeg].fx; fcy = EGD(grd)->fakecorr[fcbeg].fy; if ((grd->mhp <= 0 || !in_fcorridor(grd, u.ux, u.uy)) && EGD(grd)->gddone) forceshow = true; if ((u.ux == fcx && u.uy == fcy && grd->mhp > 0) || (!forceshow && couldsee(fcx, fcy)) || (Punished && !carried(uball) && uball->ox == fcx && uball->oy == fcy)) return false; if ((mtmp = m_at(fcx, fcy)) != 0) { if (mtmp->isgd) return (false); else if (!in_fcorridor(grd, u.ux, u.uy)) { if (mtmp->mtame) yelp(mtmp); (void)rloc(mtmp, false); } } levl[fcx][fcy].typ = EGD(grd)->fakecorr[fcbeg].ftyp; map_location(fcx, fcy, 1); /* bypass vision */ if (!ACCESSIBLE(levl[fcx][fcy].typ)) block_point(fcx, fcy); EGD(grd)->fcbeg++; } if (grd->mhp <= 0) { pline_The("corridor disappears."); if (IS_ROCK(levl[u.ux][u.uy].typ)) You("are encased in rock."); } return (true); }
static void wallify_vault(struct monst *grd) { int x, y, typ; int vlt = EGD(grd)->vroom; char tmp_viz; signed char lox = rooms[vlt].lx - 1, hix = rooms[vlt].hx + 1, loy = rooms[vlt].ly - 1, hiy = rooms[vlt].hy + 1; struct monst *mon; struct obj *gold; struct trap *trap; bool fixed = false; bool movedgold = false; for (x = lox; x <= hix; x++) { for (y = loy; y <= hiy; y++) { /* if not on the room boundary, skip ahead */ if (x != lox && x != hix && y != loy && y != hiy) continue; if (!IS_WALL(levl[x][y].typ) && !in_fcorridor(grd, x, y)) { if ((mon = m_at(x, y)) != 0 && mon != grd) { if (mon->mtame) yelp(mon); (void)rloc(mon, false); } if ((gold = g_at(x, y)) != 0) { move_gold(gold, EGD(grd)->vroom); movedgold = true; } if ((trap = t_at(x, y)) != 0) deltrap(trap); if (x == lox) typ = (y == loy) ? TLCORNER : (y == hiy) ? BLCORNER : VWALL; else if (x == hix) typ = (y == loy) ? TRCORNER : (y == hiy) ? BRCORNER : VWALL; else /* not left or right side, must be top or bottom */ typ = HWALL; levl[x][y].typ = typ; levl[x][y].flags = 0; /* * hack: player knows walls are restored because of the * message, below, so show this on the screen. */ tmp_viz = viz_array[y][x]; viz_array[y][x] = IN_SIGHT | COULD_SEE; newsym(x, y); viz_array[y][x] = tmp_viz; block_point(x, y); fixed = true; } } } if (movedgold || fixed) { if (in_fcorridor(grd, grd->mx, grd->my) || cansee(grd->mx, grd->my)) { char name[BUFSZ]; g_monnam(name, BUFSZ, grd); pline_The("%s whispers an incantation.", name); } else { You_hear("a distant chant."); } if (movedgold) pline("A mysterious force moves the gold into the vault."); if (fixed) pline_The("damaged vault's walls are magically restored!"); } }
static void wallify_vault(struct monst *grd) { int x, y, typ; int vlt = EGD(grd)->vroom; char tmp_viz; xchar lox = level->rooms[vlt].lx - 1, hix = level->rooms[vlt].hx + 1, loy = level->rooms[vlt].ly - 1, hiy = level->rooms[vlt].hy + 1; struct monst *mon; struct obj *gold; struct trap *trap; boolean fixed = FALSE; boolean movedgold = FALSE; for (x = lox; x <= hix; x++) for (y = loy; y <= hiy; y++) { /* if not on the room boundary, skip ahead */ if (x != lox && x != hix && y != loy && y != hiy) continue; if (!IS_WALL(level->locations[x][y].typ) && !in_fcorridor(grd, x, y)) { if ((mon = m_at(level, x, y)) != 0 && mon != grd) { if (mon->mtame) yelp(mon); rloc(mon, FALSE); } if ((gold = gold_at(level, x, y)) != 0) { move_gold(gold, EGD(grd)->vroom); movedgold = TRUE; } if ((trap = t_at(level, x, y)) != 0) deltrap(level, trap); if (x == lox) typ = (y == loy) ? TLCORNER : (y == hiy) ? BLCORNER : VWALL; else if (x == hix) typ = (y == loy) ? TRCORNER : (y == hiy) ? BRCORNER : VWALL; else /* not left or right side, must be top or bottom */ typ = HWALL; level->locations[x][y].typ = typ; level->locations[x][y].doormask = 0; /* * hack: player knows walls are restored because of the * message, below, so show this on the screen. */ tmp_viz = viz_array[y][x]; viz_array[y][x] = IN_SIGHT | COULD_SEE; newsym(x, y); viz_array[y][x] = tmp_viz; block_point(x, y); fixed = TRUE; } } if (movedgold || fixed) { if (mon_visible(grd)) pline("%s whispers an incantation.", Monnam(grd)); else You_hear("a %s chant.", in_fcorridor(grd, grd->mx, grd->my) ? "nearby" : "distant"); if (movedgold) pline("A mysterious force moves the gold into the vault."); if (fixed) pline("The damaged vault's walls are magically restored!"); } }
static boolean clear_fcorr(struct monst *grd, boolean forceshow) { int fcx, fcy, fcbeg, oldtyp; struct monst *mtmp; boolean showmsg = FALSE; if (!on_level(&(EGD(grd)->gdlevel), &u.uz)) return TRUE; while ((fcbeg = EGD(grd)->fcbeg) < EGD(grd)->fcend) { fcx = EGD(grd)->fakecorr[fcbeg].fx; fcy = EGD(grd)->fakecorr[fcbeg].fy; if ((grd->mhp <= 0 || !in_fcorridor(grd, u.ux, u.uy)) && EGD(grd)->gddone) forceshow = TRUE; if ((u.ux == fcx && u.uy == fcy && grd->mhp > 0) || (!forceshow && couldsee(fcx, fcy))) return FALSE; if ((Punished && !carried(uball) && uball->ox == fcx && uball->oy == fcy)) { unplacebc(); placebc(); } if ((mtmp = m_at(level, fcx, fcy)) != 0) { if (mtmp->isgd) return FALSE; else if (!in_fcorridor(grd, u.ux, u.uy)) { if (mtmp->mtame) yelp(mtmp); rloc(mtmp, FALSE); } } oldtyp = level->locations[fcx][fcy].typ; level->locations[fcx][fcy].typ = EGD(grd)->fakecorr[fcbeg].ftyp; if (!ACCESSIBLE(level->locations[fcx][fcy].typ) && ACCESSIBLE(oldtyp)) { struct trap *t = t_at(level, fcx, fcy); if (couldsee(fcx, fcy)) showmsg = TRUE; if (t) deltrap(level, t); level->locations[fcx][fcy].lit = FALSE; block_point(fcx, fcy); } map_location(fcx, fcy, 1, FALSE); /* bypass vision */ EGD(grd)->fcbeg++; } if (grd->mhp <= 0) { if (showmsg) { if (!Blind) pline("The corridor disappears."); else pline("You feel claustrophobic."); } if (IS_ROCK(level->locations[u.ux][u.uy].typ)) pline("You are encased in rock."); } return TRUE; }