include more skill information in ^X output when dual-wielding
item-using monsters will zap wand of undead turning at corpse-wielding hero
when the corpse is harmful
+boiling a pool or fountain now creates a temporary cloud of steam
Platform- and/or Interface-Specific New Features
if (yn("Dry up fountain?") == 'n')
return;
}
+ /* FIXME: sight-blocking clouds should use block_point() when
+ being created and unblock_point() when going away, then this
+ glyph hackery wouldn't be necessary */
+ if (cansee(x, y)) {
+ int glyph = glyph_at(x, y);
+
+ if (!glyph_is_cmap(glyph) || glyph_to_cmap(glyph) != S_cloud)
+ pline_The("fountain dries up!");
+ }
/* replace the fountain with ordinary floor */
levl[x][y].typ = ROOM, levl[x][y].flags = 0;
levl[x][y].blessedftn = 0;
- if (cansee(x, y))
- pline_The("fountain dries up!");
+ g.level.flags.nfountains--;
/* The location is seen if the hero/monster is invisible
or felt if the hero is blind. */
newsym(x, y);
- g.level.flags.nfountains--;
if (isyou && in_town(x, y))
(void) angry_guards(FALSE);
}
continue;
if (MON_AT(i, j) && inside_region(reg, i, j))
add_mon_to_reg(reg, g.level.monsters[i][j]);
- if (reg->visible && cansee(i, j))
- newsym(i, j);
+ if (reg->visible) {
+ /*block_point(i, j);*/
+ if (cansee(i, j))
+ newsym(i, j);
+ }
}
/* Check for player now... */
if (inside_region(reg, u.ux, u.uy))
if (reg->visible)
for (x = reg->bounding_box.lx; x <= reg->bounding_box.hx; x++)
for (y = reg->bounding_box.ly; y <= reg->bounding_box.hy; y++)
- if (isok(x, y) && inside_region(reg, x, y) && cansee(x, y))
- newsym(x, y);
+ if (isok(x, y) && inside_region(reg, x, y)) {
+ /*if (!sobj_at(BOULDER, x, y))
+ unblock_point(x, y);*/
+ if (cansee(x, y))
+ newsym(x, y);
+ }
free_region(reg);
}
register int i;
for (i = 0; i < g.n_regions; i++)
- if (!g.regions[i]->attach_2_u && inside_region(g.regions[i], u.ux, u.uy))
+ if (!g.regions[i]->attach_2_u
+ && inside_region(g.regions[i], u.ux, u.uy))
set_hero_inside(g.regions[i]);
else
clear_hero_inside(g.regions[i]);
return TRUE; /* OK, it's gone, you can free it! */
}
+/* returns True if p2 is killed by region p1, False otherwise */
boolean
inside_gas_cloud(p1, p2)
genericptr_t p1;
genericptr_t p2;
{
- NhRegion *reg;
- struct monst *mtmp;
- int dam;
+ NhRegion *reg = (NhRegion *) p1;
+ struct monst *mtmp = (struct monst *) p2;
+ int dam = reg->arg.a_int;
/*
* Gas clouds can't be targetted at water locations, but they can
* start next to water and spread over it.
*/
- reg = (NhRegion *) p1;
- dam = reg->arg.a_int;
- if (p2 == (genericptr_t) 0) { /* This means *YOU* Bozo! */
+ if (dam < 1)
+ return FALSE; /* if no damage then there's nothing to do here... */
+
+ if (!mtmp) { /* hero is indicated by Null rather than by &youmonst */
if (m_poisongas_ok(&g.youmonst) == M_POISONGAS_OK)
return FALSE;
if (!Blind) {
if (is_ice(x, y)) {
melt_ice(x, y, (char *) 0);
} else if (is_pool(x, y)) {
+ boolean on_water_level = Is_waterlevel(&u.uz);
const char *msgtxt = (!Deaf)
- ? "You hear hissing gas." /* Deaf-aware */
- : (type >= 0)
- ? "That seemed remarkably uneventful."
- : (const char *) 0;
-
- if (lev->typ != POOL) { /* MOAT or DRAWBRIDGE_UP */
- if (see_it)
+ ? "You hear hissing gas." /* Deaf-aware */
+ : (type >= 0)
+ ? "That seemed remarkably uneventful."
+ : (char *) 0;
+
+ /* don't create steam clouds on Plane of Water; air bubble
+ movement and gas regions don't understand each other */
+ if (!on_water_level)
+ create_gas_cloud(x, y, rnd(3), 0); /* radius 1..3, no damg */
+
+ if (lev->typ != POOL) { /* MOAT or DRAWBRIDGE_UP or WATER */
+ if (on_water_level)
+ msgtxt = (see_it || !Deaf) ? "Some water boils." : 0;
+ else if (see_it)
msgtxt = "Some water evaporates.";
} else {
rangemod -= 3;
lev->typ = ROOM, lev->flags = 0;
t = maketrap(x, y, PIT);
- if (t)
- t->tseen = 1;
+ /*if (t) -- this was before the vapor cloud was added --
+ t->tseen = 1;*/
if (see_it)
msgtxt = "The water evaporates.";
}
if (lev->typ == ROOM)
newsym(x, y);
} else if (IS_FOUNTAIN(lev->typ)) {
+ create_gas_cloud(x, y, rnd(2), 0); /* radius 1..2, no damage */
if (see_it)
pline("Steam billows from the fountain.");
rangemod -= 1;