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.
This commit is contained in:
@@ -559,6 +559,7 @@ E boolean FDECL(Is_botlevel, (d_level *));
|
|||||||
E boolean FDECL(Can_fall_thru, (d_level *));
|
E boolean FDECL(Can_fall_thru, (d_level *));
|
||||||
E boolean FDECL(Can_dig_down, (d_level *));
|
E boolean FDECL(Can_dig_down, (d_level *));
|
||||||
E boolean FDECL(Can_rise_up, (int,int,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_quest, (d_level *));
|
||||||
E boolean FDECL(In_mines, (d_level *));
|
E boolean FDECL(In_mines, (d_level *));
|
||||||
E branch *FDECL(dungeon_branch, (const char *));
|
E branch *FDECL(dungeon_branch, (const char *));
|
||||||
|
|||||||
+10
-9
@@ -792,24 +792,26 @@ toss_up(obj, hitsroof)
|
|||||||
struct obj *obj;
|
struct obj *obj;
|
||||||
boolean hitsroof;
|
boolean hitsroof;
|
||||||
{
|
{
|
||||||
const char *almost;
|
const char *action;
|
||||||
boolean petrifier = ((obj->otyp == EGG || obj->otyp == CORPSE) &&
|
boolean petrifier = ((obj->otyp == EGG || obj->otyp == CORPSE) &&
|
||||||
touch_petrifies(&mons[obj->corpsenm]));
|
touch_petrifies(&mons[obj->corpsenm]));
|
||||||
/* note: obj->quan == 1 */
|
/* 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)) {
|
if (breaktest(obj)) {
|
||||||
pline("%s hits the %s.", Doname2(obj), ceiling(u.ux, u.uy));
|
pline("%s hits the %s.", Doname2(obj), ceiling(u.ux, u.uy));
|
||||||
breakmsg(obj, !Blind);
|
breakmsg(obj, !Blind);
|
||||||
breakobj(obj, u.ux, u.uy, TRUE, TRUE);
|
breakobj(obj, u.ux, u.uy, TRUE, TRUE);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
almost = "";
|
action = "hits";
|
||||||
} else {
|
} else {
|
||||||
almost = " almost";
|
action = "almost hits";
|
||||||
}
|
}
|
||||||
pline("%s%s hits the %s, then falls back on top of your %s.",
|
pline("%s %s the %s, then falls back on top of your %s.",
|
||||||
Doname2(obj), almost, ceiling(u.ux,u.uy), body_part(HEAD));
|
Doname2(obj), action, ceiling(u.ux,u.uy), body_part(HEAD));
|
||||||
|
|
||||||
/* object now hits you */
|
/* object now hits you */
|
||||||
|
|
||||||
@@ -998,9 +1000,8 @@ boolean twoweap; /* used to restore twoweapon mode if wielded weapon returns */
|
|||||||
(void) encumber_msg();
|
(void) encumber_msg();
|
||||||
setuwep(obj);
|
setuwep(obj);
|
||||||
u.twoweap = twoweap;
|
u.twoweap = twoweap;
|
||||||
} else if (u.dz < 0 && !Is_airlevel(&u.uz) &&
|
} else if (u.dz < 0) {
|
||||||
!Underwater && !Is_waterlevel(&u.uz)) {
|
(void) toss_up(obj, rn2(5) && !Underwater);
|
||||||
(void) toss_up(obj, rn2(5));
|
|
||||||
#ifdef STEED
|
#ifdef STEED
|
||||||
} else if (u.dz > 0 && u.usteed &&
|
} else if (u.dz > 0 && u.usteed &&
|
||||||
obj->oclass == POTION_CLASS && rn2(6)) {
|
obj->oclass == POTION_CLASS && rn2(6)) {
|
||||||
|
|||||||
@@ -1271,6 +1271,14 @@ d_level *lev;
|
|||||||
sstairs.sx && sstairs.up));
|
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,
|
* It is expected that the second argument of get_level is a depth value,
|
||||||
* either supplied by the user (teleport control) or randomly generated.
|
* either supplied by the user (teleport control) or randomly generated.
|
||||||
|
|||||||
@@ -214,6 +214,9 @@ register int x, y;
|
|||||||
what = "temple's ceiling";
|
what = "temple's ceiling";
|
||||||
else if (*in_rooms(x,y,SHOPBASE))
|
else if (*in_rooms(x,y,SHOPBASE))
|
||||||
what = "shop's ceiling";
|
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))
|
else if (IS_AIR(lev->typ))
|
||||||
what = "sky";
|
what = "sky";
|
||||||
else if (Underwater)
|
else if (Underwater)
|
||||||
|
|||||||
Reference in New Issue
Block a user