From: nethack.rankin Date: Tue, 4 Oct 2011 01:13:59 +0000 (+0000) Subject: dungeon ceiling (trunk only) X-Git-Tag: MOVE2GIT~166 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ae01610f0df23917b6e8f027c71055cf077ffde6;p=nethack dungeon ceiling (trunk only) The ceiling on the Plane of Water is always "water above", not "sky" when inside air bubbles and "water's surface" when outside. Also, support throwing things upwards on the planes of air and water and when underwater instead of silently dropping the missile in such cases. This is mainly groundwork for a tangential bit of a forthcoming levitation fix. --- 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)