Also fixed several cases where secret doors would be described as rock walls regardless of their actual type, and gates are now described correctly as well. This means that viewing them also prints, e.g. "An open gate." or "A closed large door." without further information since there are no database entries for these specific cases. (Not the entries for simple doors are any more exhaustive.)
Fix 1910729: Yredelmnul's Drain Life not waking monsters, using ncampion's solution.
Also default greedy_explore to true. (FR 1911112)
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@3584 c06c8d41-db1a-0410-9941-cceddc491573
MFONX2CQ4V7HA5NSD6P5NDDBXYDSKIOCYUKRZXJ4ZER2OKJWT2HQC
LE6H6TP2M6KXREJG245JAKDNN6GKT6QSIZ5FJTLV3NYYX5GFKBCAC
TMYXSV5SAVYJQZH4KBMYCHZPKSTQIAAEQ6ZI67RYXAXYRBFJKT2QC
RT56MRPFK5ISZOZMZWTXYM4H25GSVKPL7RZ3RTSWVW2TZCD2U3CQC
DT6OBXKHMLODEFK6UOIYCR4EJSVJKGYWCM35BVM5SN55K2736QHQC
EOMCPVNQLX3IMLC46EAO67DPBH5KEG2FQTPBLGU62HIRWA3UQ7XQC
R22TTMI6WXWULC7ODKFF3QCB7MOTETQQ6IR4BUCUPOCQKQNCTT5AC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
PL6I2CMSTHY5ZHWVMIQE5YTM5S5VPKBNZM6QJVHZSSKOJGIJ5W4AC
SVY2PTCLXR3KNPQAWXVXTTGCC5DR334HOAKHYO3VDDRWM2BWMALAC
FSD7GIK3YLZXWLEH37BU6KV3IUCFGXPQL6IZ7H65YWNRBEKDBX5AC
K7SLUAS7TC2T6AG5HMZHVMD4ANGAI42FBSZTB6CTHLSGY2CRY4LQC
2H32CFFM2FNS63JJPNM2S6HMO543EX72GMPOU5GI6HTMQYPL6I3AC
TJISAZK5RWKXIIC5UTQNY4KT3UX3ASGBUQQNWZ7ZDULPRYFRZXQQC
3YK4G4IQBXW63HPGU5WRTV6L2FCMKAK4DOTCHFK2FNSB5B3Y3PVQC
F2ZJ55CL3T66DFM34BQWCJNHIT4XJFCGTWTA5KESV6NHWFLTGUYAC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
YHSVOROKPYS33Y4RYZRVZTE3G5LXOFX52HEDNLV6HIXOJYNOKH3QC
JEWGBHOQGDSWMLT4FZTQWUKTBJJWY5CSRAQQUOWIZ7U4QBJ6ZLBQC
UF4ODJOCV3ZL7DXRLLOFVWHUKKJX34FO4ZM6VJAWEJ3QVP3XZ2AAC
V6REAY6RCAG2QQ4BO54GHYOVTNCYHTLERJCIZJPSANXFBINZOTXAC
WL5WZXFJ6TONUQRSHUY4GQ5USU47ILWNN5X2JDQZO4CRJJZSRQIAC
RVST2QHYJ757ZHK4AUJ5NGPDZ44AD6RVFVXYPKQIBJXZBDNUCHXQC
}
// Find all connected cells containing ft, starting at d.
void _find_connected_identical(coord_def d, dungeon_feature_type ft,
std::set<coord_def>& out)
{
if (grd[d.x][d.y] != ft) return;
if (out.insert(d).second)
{
_find_connected_identical(coord_def(d.x+1, d.y), ft, out);
_find_connected_identical(coord_def(d.x-1, d.y), ft, out);
_find_connected_identical(coord_def(d.x, d.y+1), ft, out);
_find_connected_identical(coord_def(d.x, d.y-1), ft, out);
}
bool was_secret = (grd(pos) == DNGN_SECRET_DOOR);
dungeon_feature_type grid = grd(pos);
std::string noun = "door";
bool was_secret = false;
if (grid == DNGN_SECRET_DOOR)
{
grid = grid_secret_door_appearance(pos.x, pos.y);
grd(pos) = DNGN_OPEN_DOOR; // just a simple door, no gates etc.
if (was_secret && !see_grid(pos))
set_terrain_changed(pos);
grd(pos) = DNGN_OPEN_DOOR;
was_secret = true;
if (!see_grid(pos))
set_terrain_changed(pos);
}
else // maybe several connected doors -> gate
{
std::set<coord_def> all_door;
_find_connected_identical(pos, grd(pos), all_door);
noun = get_door_noun(all_door.size()).c_str();
for (std::set<coord_def>::iterator i = all_door.begin();
i != all_door.end(); ++i)
{
const coord_def& dc = *i;
grd[dc.x][dc.y] = DNGN_OPEN_DOOR;
}
}
if ( grid == DNGN_OPEN_DOOR || grid == DNGN_CLOSED_DOOR )
{
std::string desc = (grid == DNGN_OPEN_DOOR) ? "open " : "closed ";
std::set<coord_def> all_door;
_find_connected_identical(coord_def(mx, my), grd[mx][my], all_door);
desc += get_door_noun(all_door.size()).c_str();
if (bloody)
desc += ", spattered with blood";
return feature_do_grammar(dtype, add_stop, false, desc);
}
}
// Find all connected cells containing ft, starting at d.
static void _find_connected_identical(coord_def d, dungeon_feature_type ft,
std::set<coord_def>& out)
{
if (grd[d.x][d.y] != ft) return;
if (out.insert(d).second)
{
_find_connected_identical(coord_def(d.x+1, d.y), ft, out);
_find_connected_identical(coord_def(d.x-1, d.y), ft, out);
_find_connected_identical(coord_def(d.x, d.y+1), ft, out);
_find_connected_identical(coord_def(d.x, d.y-1), ft, out);
}
}
static std::string get_door_noun(int door_count)
{
switch (door_count)
{
case 0: return "buggy opening";
case 1: return "door";
case 2: return "large door";
case 3: return "gate";
default: return "huge gate";
}