diff --git a/include/extern.h b/include/extern.h index c7fd206e8..3ad7c4d27 100644 --- a/include/extern.h +++ b/include/extern.h @@ -559,6 +559,7 @@ E boolean FDECL(Is_botlevel, (d_level *)); 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 *)); diff --git a/src/dothrow.c b/src/dothrow.c index 7f6c63c99..dadb66603 100644 --- a/src/dothrow.c +++ b/src/dothrow.c @@ -792,24 +792,26 @@ toss_up(obj, hitsroof) 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 */ @@ -998,9 +1000,8 @@ boolean twoweap; /* used to restore twoweapon mode if wielded weapon returns */ (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)) { diff --git a/src/dungeon.c b/src/dungeon.c index b1e4ad955..98dc0e72f 100644 --- a/src/dungeon.c +++ b/src/dungeon.c @@ -1271,6 +1271,14 @@ d_level *lev; 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. diff --git a/src/engrave.c b/src/engrave.c index 704e6fa55..ee66ec300 100644 --- a/src/engrave.c +++ b/src/engrave.c @@ -214,6 +214,9 @@ register int x, y; 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)