E boolean FDECL(Can_fall_thru, (d_level *));
E boolean FDECL(Can_dig_down, (d_level *));
E boolean FDECL(Can_rise_up, (int,int,d_level *));
+E boolean FDECL(has_ceiling, (d_level *));
E boolean FDECL(In_quest, (d_level *));
E boolean FDECL(In_mines, (d_level *));
E branch *FDECL(dungeon_branch, (const char *));
struct obj *obj;
boolean hitsroof;
{
- const char *almost;
+ const char *action;
boolean petrifier = ((obj->otyp == EGG || obj->otyp == CORPSE) &&
touch_petrifies(&mons[obj->corpsenm]));
/* note: obj->quan == 1 */
- if (hitsroof) {
+ if (!has_ceiling(&u.uz)) {
+ action = "flies up into"; /* into "the sky" or "the water above" */
+ } else if (hitsroof) {
if (breaktest(obj)) {
pline("%s hits the %s.", Doname2(obj), ceiling(u.ux, u.uy));
breakmsg(obj, !Blind);
breakobj(obj, u.ux, u.uy, TRUE, TRUE);
return FALSE;
}
- almost = "";
+ action = "hits";
} else {
- almost = " almost";
+ action = "almost hits";
}
- pline("%s%s hits the %s, then falls back on top of your %s.",
- Doname2(obj), almost, ceiling(u.ux,u.uy), body_part(HEAD));
+ pline("%s %s the %s, then falls back on top of your %s.",
+ Doname2(obj), action, ceiling(u.ux,u.uy), body_part(HEAD));
/* object now hits you */
(void) encumber_msg();
setuwep(obj);
u.twoweap = twoweap;
- } else if (u.dz < 0 && !Is_airlevel(&u.uz) &&
- !Underwater && !Is_waterlevel(&u.uz)) {
- (void) toss_up(obj, rn2(5));
+ } else if (u.dz < 0) {
+ (void) toss_up(obj, rn2(5) && !Underwater);
#ifdef STEED
} else if (u.dz > 0 && u.usteed &&
obj->oclass == POTION_CLASS && rn2(6)) {
sstairs.sx && sstairs.up));
}
+boolean
+has_ceiling(lev)
+d_level *lev;
+{
+ /* [what about level 1 of the quest?] */
+ return (!Is_airlevel(lev) && !Is_waterlevel(lev));
+}
+
/*
* It is expected that the second argument of get_level is a depth value,
* either supplied by the user (teleport control) or randomly generated.
what = "temple's ceiling";
else if (*in_rooms(x,y,SHOPBASE))
what = "shop's ceiling";
+ else if (Is_waterlevel(&u.uz))
+ /* water plane has no surface; its air bubbles aren't below sky */
+ what = "water above";
else if (IS_AIR(lev->typ))
what = "sky";
else if (Underwater)