/*
* Determine if a grid contains a chest
*/
-static s16b chest_check(int y, int x)
+static s16b chest_check(int y, int x, bool trapped)
{
cave_type *c_ptr = &cave[y][x];
/* Skip unknown chests XXX XXX */
/* if (!(o_ptr->marked & OM_FOUND)) continue; */
- /* Check for chest */
- if (o_ptr->tval == TV_CHEST) return (this_o_idx);
+ /* Check for non empty chest */
+ if ((o_ptr->tval == TV_CHEST) &&
+ (((!trapped) && (o_ptr->pval)) || /* non empty */
+ ((trapped) && (o_ptr->pval > 0)))) /* trapped only */
+ {
+ return (this_o_idx);
+ }
}
/* No chest */
int xx = px + ddx_ddd[d];
/* No (visible) chest is there */
- if ((o_idx = chest_check(yy, xx)) == 0) continue;
+ if ((o_idx = chest_check(yy, xx, FALSE)) == 0) continue;
/* Grab the object */
o_ptr = &o_list[o_idx];
feat = get_feat_mimic(c_ptr);
/* Check for chest */
- o_idx = chest_check(y, x);
+ o_idx = chest_check(y, x, FALSE);
/* Nothing useful */
if (!have_flag(f_info[feat].flags, FF_OPEN) && !o_idx)
feat = get_feat_mimic(c_ptr);
/* Check for chests */
- o_idx = chest_check(y, x);
+ o_idx = chest_check(y, x, TRUE);
/* Disarm a trap */
if (!is_trap(feat) && !o_idx)