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_environmentvoid 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);elsemarker->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_specstd::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);elsereturn 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) );elsefeat = 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 markersmap_marker::marker_readermap_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_markermap_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: