git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@569 c06c8d41-db1a-0410-9941-cceddc491573
GACH6PWPGGUBEE7PFEPQMOZKSR7HTQGL2WLGF2AQPJD3FCCSKZNQC
43ZTEB57FU7KE5EVMYWZONNVJBZCGF3JEAJZIY25LC4LGE65PG5QC
PJDC24L7LXX6NZ7J5P7MNJJHAKQDJQEBV4CMDR4VSXLMWRIBMNKQC
SDLKLUNFGVKDS55DDJZCBAVIB7NL3RRYPTACAY65SCUQKV6APFSAC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
PTB7I4WQ3NTF7BE3O6WKXDSJD6QRWSZIEWPBSZGCJJZVNKT4OL5AC
5ASC3STDYCNLZFEBN6UTMUCGDETHBR2OCBZCF5VIAZ5RRWLOTDYQC
std::map<branch_type, level_id> stair_level;
std::map<level_pos, shop_type> shops_present;
std::map<level_pos, god_type> altars_present;
std::map<level_pos, portal_type> portals_present;
typedef std::map<branch_type, level_id> stair_map_type;
typedef std::map<level_pos, shop_type> shop_map_type;
typedef std::map<level_pos, god_type> altar_map_type;
typedef std::map<level_pos, portal_type> portal_map_type;
stair_map_type stair_level;
shop_map_type shops_present;
altar_map_type altars_present;
portal_map_type portals_present;
}
static int portal_to_feature(portal_type p)
{
switch ( p )
{
case PORTAL_LABYRINTH:
return DNGN_ENTER_LABYRINTH;
case PORTAL_HELL:
return DNGN_ENTER_HELL;
case PORTAL_ABYSS:
return DNGN_ENTER_ABYSS;
case PORTAL_PANDEMONIUM:
return DNGN_ENTER_PANDEMONIUM;
default:
return DNGN_FLOOR;
}
static altar_map_type get_notable_altars(const altar_map_type &altars)
{
altar_map_type notable_altars;
for ( altar_map_type::const_iterator na_iter = altars.begin();
na_iter != altars.end(); ++na_iter )
{
if (na_iter->first.id.branch != BRANCH_ECUMENICAL_TEMPLE)
notable_altars[na_iter->first] = na_iter->second;
}
return (notable_altars);
}
inline static std::string place_desc(const level_pos &pos)
{
return "[" + pos.id.describe(false, true) + "] ";
}
inline static std::string altar_description(god_type god)
{
return feature_description( altar_for_god(god) );
}
inline static std::string portal_description(portal_type portal)
{
return feature_description( portal_to_feature(portal) );
}
static void get_matching_altars(
const base_pattern &pattern, std::vector<stash_search_result> &results)
{
for ( altar_map_type::const_iterator na_iter = altars_present.begin();
na_iter != altars_present.end(); ++na_iter )
{
const std::string adesc =
altar_description(na_iter->second);
if (pattern.matches(place_desc(na_iter->first) + adesc))
{
stash_search_result sr;
sr.pos = na_iter->first;
sr.match = adesc;
results.push_back(sr);
}
}
}
static void get_matching_portals(
const base_pattern &pattern, std::vector<stash_search_result> &results)
{
for ( portal_map_type::const_iterator pl_iter = portals_present.begin();
pl_iter != portals_present.end(); ++pl_iter )
{
const std::string desc =
portal_description(pl_iter->second);
if (pattern.matches(place_desc(pl_iter->first) + desc + " [portal]"))
{
stash_search_result sr;
sr.pos = pl_iter->first;
sr.match = desc;
results.push_back(sr);
}
}
}
void get_matching_features(
const base_pattern &pattern, std::vector<stash_search_result> &results)
{
if (!pattern.valid())
return;
get_matching_altars(pattern, results);
get_matching_portals(pattern, results);
}
// no point in recording Temple altars
if ( you.where_are_you == BRANCH_ECUMENICAL_TEMPLE )
return;
// portable; no point in recording
if ( god == GOD_NEMELEX_XOBEH )
return;
}
void unnotice_altar()
{
const coord_def pos = { you.x_pos, you.y_pos };
const level_pos curpos(level_id::get_current_level_id(), pos);
// Hmm, what happens when erasing a nonexistent key directly?
if (altars_present.find(curpos) != altars_present.end())
altars_present.erase(curpos);