sounded.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@1701 c06c8d41-db1a-0410-9941-cceddc491573
IVVTHLTTLOP5TSULXJWUSSXHOKYWVU3OWKYVK45A7RIB6V34MYQAC
LAGWU7UFZNUXOUC72BTQ7UU4Z7VHKBRGUUSJCH4C4J4OGLXS4F3QC
52W74WXL5XIH6YFJBQRVAO47YHCS3CPMUUZS4Q3AZ3HAPDWMT54AC
IIN7AVA6JYRBXH6ZYRR7BY7TV6PW7ANAQ2A3PD55FKBKKQFEEF2AC
56C44YMFHZ62GXAAOLYSLLGBVGRWXB53W2VI37Q26ZECEK2XG5SQC
WE3JT43OR4L6675GINGU4B3YDBMURJZHDDYY3VLHUJEBAKH2HYEAC
UBQTNLYGD3SNWMUNGWUPX7EXEGQXOXCFCPWIVWBFE7ID7DJLPFWAC
JDM27QE4HR52AYFSQE763BFF57ANOTF5MXKMO377PP5EXMN7SAOAC
W52PCSHX72WAMWKG6L4BPUBVMO6E72KYYBNKAA7554KNOTY6V7WQC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
ZJLJGSB2XSBQU42OFQMXL3EG4CXAQGOYAU6YTV2SAWZEJIPFH2CAC
34C4U6EQWERY75GZJKUCM5KVGU2OUICETS5LGZF6RMKMZT4R5SQAC
AUYQDKLMOG4FGH2T3LACX4TH632DPKVXBNV5VU6PIVUEWSIO4LQQC
WKTZHLOJ65WSK6FR5MF7RWGSMZ22T2D6LHB66FV3IPGXIBLYHHNAC
SDLKLUNFGVKDS55DDJZCBAVIB7NL3RRYPTACAY65SCUQKV6APFSAC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
7AMQN7MITMXBNVDAK5VOXTQ4TZIAOD6ZLOFJG7GQMBTY23Y2BKSAC
5UVDIVD4NSXA52U4QMQIVST3GSZJ2A2YZK3RUEXKPM43YVQ7LI5AC
5ASC3STDYCNLZFEBN6UTMUCGDETHBR2OCBZCF5VIAZ5RRWLOTDYQC
7KWDC7XFNMBLSUO2HISIROBINZBX5T67LJEEXTAORXW2YZ7VWFGAC
OP6CTAKWCAU64JXQ3USQYR5E5IFHQHNCACII5UMVRXUTZXJQOAZAC
74LQ7JXVLAFSHLI7LCBKFX47CNTYSKGUQSXNX5FCIUIGCC2JTR3QC
TR4NPGNO5QNNRJNVMNSUEO5QLT37HCXXDOBKXCB5XWXRQNAJ5SHAC
TV3ZC6WOZKSQQJQN26JIVKCHK6UK7WMDBYZDUYRWEAZ4JB4YVNAAC
BXXOYFMWNQY4TLLJBFYROSH43KO5F4JQTATU3ZEJNKGIJGOIQN4AC
KCHX2F3JFEWOZT3WMJVZAAQUU2QSZ5Q7RDCD7WUJ7VE65J52JFUQC
A3CO4KBFTFU3ZSHWRY2OPPX3MMTFV7OUCZGL7Q4Y2FU7JO4AP7MAC
KFJEFN377VIZ7OH2XCYOGCELNEGO4CIOOP7DNXEMX3LFKIKWXVTAC
JQFQX7IWSJ4TYWVUVXAFMCPSAN67PRMNECDQI5WMON2JFMQVVUEQC
MSQI3TH6T62JAXQGLL52QZCWAMC372TGB6ZNNRDGUGMJKBNNV2VAC
OYTCBRC7LE44EUVRZVYTOOVKQWJ6P6YE3FXTOGUTNKEMLNWPHKSQC
AUXHSGS4EFOPZ6TVZYWNVOUDO7NYKUKE3HBKGQQWTALSVFOE3HAAC
GACH6PWPGGUBEE7PFEPQMOZKSR7HTQGL2WLGF2AQPJD3FCCSKZNQC
CIPVRZGLOZHCERK6YPOBV3P2E4IAB4H6D5EHLRQE2O5E4P4VCBUAC
XY77S75KH5KV54MZVAPMUC64TVRE2QM2KVJAAGJGCIBGQEC5GUTQC
SCWXQW5H65OXUP2MEJ2MEEAVPSRJDT3RQGKYCMKVTORS2334PQSQC
ODNAIEJW732NG7USKQKCIP4R4DAEYXXJQX6LY7TIN32NKE75454QC
CVC5FFFLGVRR3KPYDNB6RF4FNACV3LI3HPSR4MCUNZ4C3FSQYBDAC
OVDIHWR5FEPTBZCTEAXNPB4MYP5NUNPQMC6UM4F6SC4EBGWH3DSQC
I5N4EIR6SCLLRGKRBUKW5FKUVYK62EA5DOWIAS5XFIHZQKMCXWBAC
SVUM62ARSXH6RUBFRWS6KAQC7PTNTMGSV2GPZJQQJ4GNEML2HBVQC
BTSXD3FLCF2AGPPV6FTHVK7BWBMRSPUBPZWGZRIFMVHLCUAEGILAC
6L4EP4ZRWWYLT55PD5KTTJON5J2JB5VV5MWNHF5VPZQZ5BKEYZ4QC
ILN2K6ASDZSMEHOPJ22IZLZJUO6DDGZTKAKXM3YXG6JZZHJNLX4AC
R6XS2HO5QX2FJUGL5UQQRNETKCMYWTUFPHPPS5SYWK3OQA4UDUQQC
}
//////////////////////////////////////////////////////////////////////////
// crawl_environment
void crawl_environment::add_marker(map_marker *marker)
{
markers.insert(dgn_pos_marker(marker->pos, marker));
}
void crawl_environment::remove_marker(map_marker *marker)
{
std::pair<dgn_marker_map::iterator, dgn_marker_map::iterator>
els = markers.equal_range(marker->pos);
for (dgn_marker_map::iterator i = els.first; i != els.second; ++i)
{
if (i->second == marker)
{
markers.erase(i);
break;
}
}
delete marker;
void crawl_environment::remove_markers_at(const coord_def &c)
{
std::pair<dgn_marker_map::iterator, dgn_marker_map::iterator>
els = markers.equal_range(c);
for (dgn_marker_map::iterator i = els.first; i != els.second; )
{
dgn_marker_map::iterator todel = i++;
delete todel->second;
markers.erase(todel);
}
}
map_marker *crawl_environment::find_marker(const coord_def &c,
map_marker_type type) const
{
std::pair<dgn_marker_map::const_iterator, dgn_marker_map::const_iterator>
els = markers.equal_range(c);
for (dgn_marker_map::const_iterator i = els.first; i != els.second; )
if (type == MAT_ANY || i->second->get_type() == type)
return (i->second);
return (NULL);
}
std::vector<map_marker*> crawl_environment::get_markers(const coord_def &c)
const
{
std::pair<dgn_marker_map::const_iterator, dgn_marker_map::const_iterator>
els = markers.equal_range(c);
std::vector<map_marker*> rmarkers;
for (dgn_marker_map::const_iterator i = els.first; i != els.second; )
rmarkers.push_back(i->second);
return (rmarkers);
}
void crawl_environment::clear_markers()
{
for (dgn_marker_map::iterator i = markers.begin(); i != markers.end(); ++i)
delete i->second;
markers.clear();
}
mpr("Buggy note passed: unknown note type");
// Return now, rather than give a "Buggy note passed" message
// for each note of the matching type in the note list.
return true;
mpr("Buggy note passed: unknown note type");
// Return now, rather than give a "Buggy note passed" message
// for each note of the matching type in the note list.
return true;
// NB - a return value of zero is not handled well by dungeon.cc (but there it is) 10mar2000 {dlb}
// Return value of zero forces dungeon.cc to regenerate the level, except
// for branch entry vaults where dungeon.cc just rejects the vault and
// places a vanilla entry.
struct map_feat_marker_spec : public map_transformer
{
int key;
dungeon_feature_type feat;
map_feat_marker_spec(int _key, dungeon_feature_type _feat)
: key(_key), feat(_feat) { }
std::string apply_transform(map_lines &map);
transform_type type() const;
std::string describe() const;
map_transformer *clone() const;
};
void release_transforms();
void clear_transforms();
template <typename V> void clear_vector(V &vect);
void vmirror_markers();
void hmirror_markers();
void rotate_markers(bool clock);
void vmirror_marker(map_marker *, int par);
void hmirror_marker(map_marker *, int par);
void rotate_marker(map_marker *, int par);
void translate_marker(void (map_lines::*xform)(map_marker *, int par),
int par = 0);
void map_lines::release_transforms()
template <typename V>
void map_lines::clear_vector(V &vect)
{
for (int i = 0, size = vect.size(); i < size; ++i)
delete vect[i];
vect.clear();
}
void map_lines::clear_transforms()
{
clear_vector(transforms);
}
void map_lines::clear_markers()
{
clear_vector(markers);
}
void map_lines::add_marker(map_marker *marker)
{
markers.push_back(marker);
}
std::string map_lines::add_feature_marker(const std::string &s)
{
std::string arg;
int key = 0, sep = 0;
std::string err = split_key_item(s, &key, &sep, &arg);
if (!err.empty())
return (err);
const dungeon_feature_type feat = dungeon_feature_by_name(arg);
if (feat == DNGN_UNSEEN)
return make_stringf("unknown feature: %s", arg.c_str());
transforms.push_back(new map_feat_marker_spec(key, feat));
return ("");
}
void map_lines::apply_markers(const coord_def &c)
for (int i = 0, size = transforms.size(); i < size; ++i)
delete transforms[i];
transforms.clear();
for (int i = 0, size = markers.size(); i < size; ++i)
{
markers[i]->pos += c;
env.add_marker(markers[i]);
}
// *not* clear_markers() since we've offloaded marker ownership to
// the crawl env.
markers.clear();
solid_checked = false;
void map_lines::translate_marker(
void (map_lines::*xform)(map_marker *, int),
int par)
{
for (int i = 0, size = markers.size(); i < size; ++i)
(this->*xform)(markers[i], par);
}
void map_lines::vmirror_marker(map_marker *marker, int)
{
marker->pos.y = height() - 1 - marker->pos.y;
}
void map_lines::hmirror_marker(map_marker *marker, int)
{
marker->pos.x = width() - 1 - marker->pos.x;
}
void map_lines::rotate_marker(map_marker *marker, int clockwise)
{
const coord_def c = marker->pos;
if (clockwise)
marker->pos = coord_def(width() - 1 - c.y, c.x);
else
marker->pos = coord_def(c.y, height() - 1 - c.x);
}
void map_lines::vmirror_markers()
{
translate_marker(&map_lines::vmirror_marker);
}
void map_lines::hmirror_markers()
{
translate_marker(&map_lines::hmirror_marker);
std::vector<coord_def> map_lines::find_glyph(int gly) const
{
std::vector<coord_def> points;
for (int y = height() - 1; y >= 0; --y)
{
for (int x = width() - 1; x >= 0; --x)
{
const coord_def c(x, y);
if ((*this)(c) == gly)
points.push_back(c);
}
}
return (points);
}
coord_def map_lines::find_first_glyph(int gly) const
{
for (int y = 0, h = height(); y < h; ++y)
{
for (int x = 0, w = width(); x < w; ++x)
{
const coord_def c(x, y);
if ((*this)(c) == gly)
return (c);
}
}
return coord_def(-1, -1);
}
}
//////////////////////////////////////////////////////////////////////////
// map_feat_marker_spec
std::string map_feat_marker_spec::apply_transform(map_lines &map)
{
std::vector<coord_def> positions = map.find_glyph(key);
if (positions.size() == 1)
{
map.add_marker(new map_feature_marker(positions[0], feat));
return ("");
}
else if (positions.empty())
return make_stringf("cant find key '%c' for marker", key);
else
return make_stringf("too many matches for key '%c' for marker", key);
}
map_transformer::transform_type map_feat_marker_spec::type() const
{
return (TT_MARKER);
}
std::string map_feat_marker_spec::describe() const
{
return map_feature_marker(coord_def(), feat).describe();
return (0);
}
static int dgn_marker(lua_State *ls)
{
MAP(ls, 1, map);
if (lua_gettop(ls) == 1)
return (0);
if (lua_isnil(ls, 2))
{
map->map.clear_markers();
return (0);
}
if (lua_isstring(ls, 2))
{
std::string err = map->map.add_feature_marker(luaL_checkstring(ls, 2));
if (!err.empty())
luaL_error(ls, err.c_str());
return (0);
}
const coord_def pos(luaL_checkint(ls, 2), luaL_checkint(ls, 3));
dungeon_feature_type feat = DNGN_UNSEEN;
if (lua_isnumber(ls, 4))
feat = static_cast<dungeon_feature_type>( luaL_checkint(ls, 4) );
else
feat = dungeon_feature_by_name( luaL_checkstring(ls, 4) );
map->map.add_marker( new map_feature_marker(pos, feat) );
}
const char *dngn_feature_names[] =
{
"unseen", "rock_wall", "stone_wall", "closed_door", "metal_wall",
"secret_door", "green_crystal_wall", "orcish_idol", "wax_wall",
"permarock_wall", "", "", "", "", "", "", "", "", "", "", "",
"silver_statue", "granite_statue", "orange_crystal_statue",
"statue_reserved_1", "statue_reserved_2", "", "", "", "", "", "", "", "",
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
"", "", "", "", "", "", "", "", "lava", "deep_water", "", "",
"shallow_water", "water_stuck", "floor", "exit_hell", "enter_hell",
"open_door", "", "", "", "", "trap_mechanical", "trap_magical", "trap_iii",
"undiscovered_trap", "", "enter_shop", "enter_labyrinth",
"stone_stairs_down_i", "stone_stairs_down_ii", "stone_stairs_down_iii",
"rock_stairs_down", "stone_stairs_up_i", "stone_stairs_up_ii",
"stone_stairs_up_iii", "rock_stairs_up", "", "", "enter_dis",
"enter_gehenna", "enter_cocytus", "enter_tartarus", "enter_abyss",
"exit_abyss", "stone_arch", "enter_pandemonium", "exit_pandemonium",
"transit_pandemonium", "", "", "", "builder_special_wall",
"builder_special_floor", "", "", "", "enter_orcish_mines", "enter_hive",
"enter_lair", "enter_slime_pits", "enter_vaults", "enter_crypt",
"enter_hall_of_blades", "enter_zot", "enter_temple", "enter_snake_pit",
"enter_elven_halls", "enter_tomb", "enter_swamp", "enter_shoals",
"enter_reserved_2", "enter_reserved_3", "enter_reserved_4", "", "", "",
"return_from_orcish_mines", "return_from_hive", "return_from_lair",
"return_from_slime_pits", "return_from_vaults", "return_from_crypt",
"return_from_hall_of_blades", "return_from_zot", "return_from_temple",
"return_from_snake_pit", "return_from_elven_halls", "return_from_tomb",
"return_from_swamp", "return_from_shoals", "return_reserved_2",
"return_reserved_3", "return_reserved_4", "", "", "", "", "", "", "", "",
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
"", "", "", "", "", "", "altar_zin", "altar_shining_one",
"altar_kikubaaqudgha", "altar_yredelemnul", "altar_xom", "altar_vehumet",
"altar_okawaru", "altar_makhleb", "altar_sif_muna", "altar_trog",
"altar_nemelex_xobeh", "altar_elyvilon", "altar_lugonu", "altar_beogh", "",
"", "", "", "", "", "blue_fountain", "dry_fountain_i",
"sparkling_fountain", "dry_fountain_ii", "dry_fountain_iii",
"dry_fountain_iv", "dry_fountain_v", "dry_fountain_vi", "dry_fountain_vii",
"dry_fountain_viii", "permadry_fountain"
};
dungeon_feature_type dungeon_feature_by_name(const std::string &name)
{
ASSERT(ARRAYSIZE(dngn_feature_names) == NUM_REAL_FEATURES);
if (name.empty())
return (DNGN_UNSEEN);
for (unsigned i = 0; i < ARRAYSIZE(dngn_feature_names); ++i)
if (dngn_feature_names[i] == name)
return static_cast<dungeon_feature_type>(i);
return (DNGN_UNSEEN);
}
const char *dungeon_feature_name(dungeon_feature_type rfeat)
{
const unsigned feat = rfeat;
if (feat >= ARRAYSIZE(dngn_feature_names))
return (NULL);
return dngn_feature_names[feat];
static int dgn_feature_number(lua_State *ls)
{
const std::string &name = luaL_checkstring(ls, 1);
PLUARET(number, dungeon_feature_by_name(name));
}
static int dgn_feature_name(lua_State *ls)
{
const unsigned feat = luaL_checkint(ls, 1);
PLUARET(string,
dungeon_feature_name(static_cast<dungeon_feature_type>(feat)));
}
if ( is_random_artefact(item) ||
is_unrandom_artefact(item) ||
is_fixed_artefact(item) )
return true;
if (fully_identified(item)
&& (is_random_artefact(item) ||
is_unrandom_artefact(item) ||
is_fixed_artefact(item)))
return (true);
for (int y = -1; y <= 1; ++y)
for (int x = -1; x <= 1; ++x)
{
if (!x && !y)
continue;
const int grid =
grd[count_x + x][count_y + y];
if (grid != DNGN_FLOOR
&& grid != DNGN_SECRET_DOOR
&& grid != DNGN_CLOSED_DOOR
&& grid != DNGN_OPEN_DOOR)
surround_grid = grid;
}
// this may generate faulty [][] values {dlb}
switch (surround_grid)
if (marker)
case DNGN_FLOOR:
grd[count_x][count_y] = DNGN_ENTER_DIS;
break;
case DNGN_LAVA:
grd[count_x][count_y] = DNGN_ENTER_GEHENNA;
break;
case DNGN_ROCK_WALL:
grd[count_x][count_y] = DNGN_ENTER_TARTARUS;
break;
case DNGN_DEEP_WATER:
grd[count_x][count_y] = DNGN_ENTER_COCYTUS;
break;
map_feature_marker *featm =
dynamic_cast<map_feature_marker*>(marker);
grd[count_x][count_y] = featm->feat;
env.remove_marker(marker);
public:
coord_def pos;
protected:
map_marker_type type;
typedef map_marker *(*marker_reader)(tagHeader &, map_marker_type);
static marker_reader readers[NUM_MAP_MARKER_TYPES];
};
class map_feature_marker : public map_marker
{
public:
map_feature_marker(const coord_def &pos = coord_def(0, 0),
dungeon_feature_type feat = DNGN_UNSEEN);
map_feature_marker(const map_feature_marker &other);
void write(tagHeader &) const;
void read(tagHeader &);
map_marker *clone() const;
std::string describe() const;
static map_marker *read(tagHeader &, map_marker_type);
public:
dungeon_feature_type feat;
};
}
////////////////////////////////////////////////////////////////////////
// Dungeon markers
map_marker::marker_reader
map_marker::readers[NUM_MAP_MARKER_TYPES] =
{
&map_feature_marker::read,
};
map_marker::map_marker(map_marker_type t, const coord_def &p)
: pos(p), type(t)
{
}
map_marker::~map_marker()
{
}
void map_marker::write(tagHeader &outf) const
{
marshallShort(outf, type);
marshallCoord(outf, pos);
void map_marker::read(tagHeader &inf)
{
// Don't read type! The type has to be read by someone who knows how
// to look up the unmarshall function.
unmarshallCoord(inf, pos);
}
map_marker *map_marker::read_marker(tagHeader &inf)
{
const map_marker_type type =
static_cast<map_marker_type>(unmarshallShort(inf));
return readers[type]? (*readers[type])(inf, type) : NULL;
}
////////////////////////////////////////////////////////////////////////////
// map_feature_marker
map_feature_marker::map_feature_marker(
const coord_def &p,
dungeon_feature_type _feat)
: map_marker(MAT_FEATURE, p), feat(_feat)
{
}
map_feature_marker::map_feature_marker(
const map_feature_marker &other)
: map_marker(MAT_FEATURE, other.pos), feat(other.feat)
{
}
void map_feature_marker::write(tagHeader &outf) const
{
this->map_marker::write(outf);
marshallShort(outf, feat);
}
void map_feature_marker::read(tagHeader &inf)
{
map_marker::read(inf);
feat = static_cast<dungeon_feature_type>(unmarshallShort(inf));
}
map_marker *map_feature_marker::read(tagHeader &inf, map_marker_type)
{
map_marker *mapf = new map_feature_marker();
mapf->read(inf);
return (mapf);
}
map_marker *map_feature_marker::clone() const
{
return new map_feature_marker(pos, feat);
}
std::string map_feature_marker::describe() const
{
return make_stringf("feature (%s)", dungeon_feature_name(feat));
}
#
# If modifying the Vestibule, ensure that:
#
# * The portal to Dis is surrounded by floor squares and nothing but floor
# squares.
# * The portal to Tartarus is surrounded only by floor, doors of any kind, and
# at least one rock wall.
# * The portal to Gehenna is surrounded by nothing but floor and at least one
# lava square.
# * The portal to Cocytus is surrounded by nothing but floor and at least one
# water square.
#
# If you don't do this, the portals will not be unbarred correctly when
# Geryon's horn is sounded.
syn keyword desDeclarator NAME: ORIENT: DEPTH: PLACE: MONS: FLAGS: default-depth: TAGS: CHANCE: ITEM: KFEAT: KMONS: KITEM:
syn keyword desDeclarator NAME: ORIENT: DEPTH: PLACE: MONS: FLAGS: default-depth: TAGS: CHANCE: ITEM: KFEAT: KMONS: KITEM: MARKER: