XPIE6FG6SYZXNQFBRWUBJ3NR5Q6MOMRXAFW3WTKMSLMKKA55ZWCQC TZ7CKVWKLPJMYN736FWDIJJ3TZRFBF2LHF6QY2SEY6TMCE2VATMAC 754PQVFHYQER7P7NEHYNLQVOEALF6I23IQDNGNCOK5IV7OLAEXRQC O6QYS2KYXUXMODO3X4SYX7SPZE7AOIFT2XJZHRABMMQFEUN4UXLAC RXYHE3C7R3EGCRZEJT2ZO4ALLRDR3HF66VHZZNF7TT3DFWZ6BJCQC MQ62OAMLGJVRW2QIL4PAZRAU6PC52ZVGY2FCOBIY6IWGQIHMU5CAC A2JHMM2QW2Q5OZ4DY4N3VIT53SOPTI434NJB72XBMJD67YJRI4CQC 3A5FX3Y4RPKWQEHKKXZKXZJ7RKV6RKWT7GTR4WFE5UBWKV2HT4RQC K73AS36BODJSSKMT2LRFDKS7BAMETNFLWHZEPQEZFM6KQB6KRA4AC UL7XFKMUX3WIU4O2LZANK4ECJ654UZPDBFGNXUEYZYOLKBYBCG6AC X7MFMKQTNZ2IWBFVGS6WQV7NRNKJ3DWQAW2X7IQMFQQXW24AHPZQC AUXHSGS4EFOPZ6TVZYWNVOUDO7NYKUKE3HBKGQQWTALSVFOE3HAAC LE5U6CTXEIETQN5GOVYF2K2VCISRXR3ULORXDKIKWYDVBG5GS3WAC 3AKDLI4CTGZ2MUXGKJ5FRCBW75JLTGMR74JUHGRDCH4MPMMFGYOAC NKONHW4JNY6HP2M63MNPM3H64ZWSUNUT5FX2STW4KTS4AMXJXXVQC TLO257LZSB6ZO36STDUEWJBO2LETXFKTFGXELA6Y4BZBVAEIIINAC RGHXFBNIULRVRYLBGG5JZDMYVM2E2JJ2Y5KQPMU6PUS3V26G6ZXQC RPP2JHUJDTD7XFHCUPPRE7FX6JZBSTJ5IOBW37LN53IMGCO6DU3AC MT3256427VMCV4JUFWCN7ULY4KXSND5ZL5THDKYNWWYOXXR5DLIQC G7DNYFW745Q567EF3TPR2FCQ4ATPN236ON7X5TLYC7TEPZW3BAFAC UU5EKED2RA2U3CFZ3UEJQEWSWHQPEU7ZD4KH3I22IIVZFHD4Y67QC 44YRMW5JNVUBYX3M6UFQOPENNHGO7G2CRZ7SGPIIUTQGYWTRWENAC IVVTHLTTLOP5TSULXJWUSSXHOKYWVU3OWKYVK45A7RIB6V34MYQAC AFE345BJ7IX2YYYX3I5I6RYLXNWJCFE4WMH6F5JMIR6X7WUP75CAC TPZWAV3USKO7RX4IGHLZKVPRN36K33PJPSZYL6FZMX4XBHTYOQYAC J7VTRSN2BLWL7QJMHG73LBUOUL6WNNT2ZAVEDMGYB6SDX3L5GGYQC DKISJVKAJJK2SVZSXGJ37K5SOVTDARVX6RPK3MAKVNGC36Z4YAZQC QEEJFAETO6B2J4IWDIDCJ5UNIFNNHHG22IWF2CUJRTJJBNE47CWQC JZCODQCOUBBBPPR4TLOAPIB4BQLDY3ORTJXTWEQSUJVJ7DMK7FVAC BW3XFNOS6LDAQLHOZ6RXARCMKCY5JVLVDSXDSSAX4DSYM3FANQBAC ASLW3Z5PAVZSWJEMMMVZT226P44EKSAD47QS72JIFJESAI3RPN3AC UBQTNLYGD3SNWMUNGWUPX7EXEGQXOXCFCPWIVWBFE7ID7DJLPFWAC OYTCBRC7LE44EUVRZVYTOOVKQWJ6P6YE3FXTOGUTNKEMLNWPHKSQC 7Y5HSDFKA5TPLS2TWTRFMQVX6UXUDHXU5MUMXQSDFAIY4THQ3BIQC ED62QWGKBPORWVKDFOQRKJXEIWZVNGR3O4KWQBDSRNPT36AYOQYAC 23I5KJ245D43B6QYWS4TDQYJO2W2PKTDCLFBWPVAFDWS6L7NMGKQC TGJZXTUIAKCFZQJ54ZQEBGFBVZSJCAX6AWDRSH3TP7UJRLGUM5SAC LJPUO3NNFABVOQOBA5LUDNT2R5H4LMP6TPJBNVJ7VJBERCBYZIXQC TLA5UN6LZPXGKERI27EFY4HKIIU3VU5Y7ZU54WXL6ANBUV2VOTMQC G277QSURADDFZIIO5PIMBA4YWHYULQCEGNMNI6TLBWZXHQOOP6FAC T7CCGLOZ25B7BQKKGR6IA6LWBRKUWTXLTIRXUQ4YKQRVAA7AHZKQC HWTL2S7OVOJRJAAN66ZTT26HJDAOIW6RKAG5NFMNZJU63CTU2U5AC AUXVWXWIFSTWFA6VZXN2FMG7FQEKRZVV6MD32VQQ7J2RKCXHAVGAC K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC /** File: l_dgngrd.cc* Summary: Grid and dungeon_feature_type-related bindings.*/#include "AppHdr.h"#include "dlua.h"#include "l_libs.h"#include "directn.h"#include "terrain.h"const char *dngn_feature_names[] ={"unseen", "closed_door", "detected_secret_door", "secret_door","wax_wall", "metal_wall", "green_crystal_wall", "rock_wall", "stone_wall","permarock_wall","clear_rock_wall", "clear_stone_wall", "clear_permarock_wall", "trees","open_sea", "orcish_idol", "", "", "", "", "","granite_statue", "statue_reserved_1", "statue_reserved_2","", "", "", "", "", "", "", "","", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "","", "", "", "", "", "", "", "", "", "", "", "", "", "lava","deep_water", "", "", "shallow_water", "water_stuck", "floor","floor_special", "floor_reserved", "exit_hell", "enter_hell","open_door", "", "", "trap_mechanical", "trap_magical", "trap_natural","undiscovered_trap", "", "enter_shop", "enter_labyrinth","stone_stairs_down_i", "stone_stairs_down_ii","stone_stairs_down_iii", "escape_hatch_down", "stone_stairs_up_i","stone_stairs_up_ii", "stone_stairs_up_iii", "escape_hatch_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", "", "", "", "", "", "","", "", "", "", "", "", "", "enter_portal_vault", "exit_portal_vault","", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "","", "", "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", "altar_jiyva", "altar_feawn", "", "", "", "","fountain_blue", "fountain_sparkling", "fountain_blood","dry_fountain_blue", "dry_fountain_sparkling", "dry_fountain_blood","permadry_fountain", "abandoned_shop"};dungeon_feature_type dungeon_feature_by_name(const std::string &name){COMPILE_CHECK(ARRAYSZ(dngn_feature_names) == NUM_REAL_FEATURES, c1);if (name.empty())return (DNGN_UNSEEN);for (unsigned i = 0; i < ARRAYSZ(dngn_feature_names); ++i)if (dngn_feature_names[i] == name)return static_cast<dungeon_feature_type>(i);return (DNGN_UNSEEN);}std::vector<std::string> dungeon_feature_matches(const std::string &name){std::vector<std::string> matches;COMPILE_CHECK(ARRAYSZ(dngn_feature_names) == NUM_REAL_FEATURES, c1);if (name.empty())return (matches);for (unsigned i = 0; i < ARRAYSZ(dngn_feature_names); ++i)if (strstr(dngn_feature_names[i], name.c_str()))matches.push_back(dngn_feature_names[i]);return (matches);}const char *dungeon_feature_name(dungeon_feature_type rfeat){const unsigned feat = rfeat;if (feat >= ARRAYSZ(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)));}static dungeon_feature_type _get_lua_feature(lua_State *ls, int idx){dungeon_feature_type feat = (dungeon_feature_type)0;if (lua_isnumber(ls, idx))feat = (dungeon_feature_type)luaL_checkint(ls, idx);else if (lua_isstring(ls, idx))feat = dungeon_feature_by_name(luaL_checkstring(ls, idx));elseluaL_argerror(ls, idx, "Feature must be a string or a feature index.");return feat;}dungeon_feature_type check_lua_feature(lua_State *ls, int idx){const dungeon_feature_type f = _get_lua_feature(ls, idx);if (!f)luaL_argerror(ls, idx, "Invalid dungeon feature");return (f);}#define FEAT(f, pos) \dungeon_feature_type f = check_lua_feature(ls, pos)static int dgn_feature_desc(lua_State *ls){const dungeon_feature_type feat =static_cast<dungeon_feature_type>(luaL_checkint(ls, 1));const description_level_type dtype =lua_isnumber(ls, 2)?static_cast<description_level_type>(luaL_checkint(ls, 2)) :description_type_by_name(lua_tostring(ls, 2));const bool need_stop = lua_isboolean(ls, 3)? lua_toboolean(ls, 3) : false;const std::string s =feature_description(feat, NUM_TRAPS, false, dtype, need_stop);lua_pushstring(ls, s.c_str());return (1);}static int dgn_feature_desc_at(lua_State *ls){const description_level_type dtype =lua_isnumber(ls, 3)?static_cast<description_level_type>(luaL_checkint(ls, 3)) :description_type_by_name(lua_tostring(ls, 3));const bool need_stop = lua_isboolean(ls, 4)? lua_toboolean(ls, 4) : false;const std::string s =feature_description(coord_def(luaL_checkint(ls, 1),luaL_checkint(ls, 2)),false, dtype, need_stop);lua_pushstring(ls, s.c_str());return (1);}static int dgn_set_feature_desc_short(lua_State *ls){const std::string base_name = luaL_checkstring(ls, 1);const std::string desc = luaL_checkstring(ls, 2);if (base_name.empty()){luaL_argerror(ls, 1, "Base name can't be empty");return (0);}set_feature_desc_short(base_name, desc);return (0);}static int dgn_set_feature_desc_long(lua_State *ls){const std::string raw_name = luaL_checkstring(ls, 1);const std::string desc = luaL_checkstring(ls, 2);if (raw_name.empty()){luaL_argerror(ls, 1, "Raw name can't be empty");return (0);}set_feature_desc_long(raw_name, desc);return (0);}static int dgn_max_bounds(lua_State *ls){lua_pushnumber(ls, GXM);lua_pushnumber(ls, GYM);return (2);}static int dgn_grid(lua_State *ls){GETCOORD(c, 1, 2, map_bounds);if (!lua_isnone(ls, 3)){const dungeon_feature_type feat = _get_lua_feature(ls, 3);if (feat)grd(c) = feat;}PLUARET(number, grd(c));}// XXX: these two shouldn't be so different.LUARET1(_dgn_is_wall, boolean,feat_is_wall(static_cast<dungeon_feature_type>(luaL_checkint(ls, 1))))LUAFN(_dgn_is_opaque){COORDS(c, 1, 2);lua_pushboolean(ls, feat_is_opaque(grd(c)));return (1);}const struct luaL_reg dgn_grid_lib[] ={{ "feature_number", dgn_feature_number },{ "feature_name", dgn_feature_name },{ "feature_desc", dgn_feature_desc },{ "feature_desc_at", dgn_feature_desc_at },{ "set_feature_desc_short", dgn_set_feature_desc_short },{ "set_feature_desc_long", dgn_set_feature_desc_long },{ "grid", dgn_grid },{ "is_opaque", _dgn_is_opaque },{ "is_wall", _dgn_is_wall },{ "max_bounds", dgn_max_bounds },{ NULL, NULL }};
static dungeon_feature_type _get_lua_feature(lua_State *ls, int idx){dungeon_feature_type feat = (dungeon_feature_type)0;if (lua_isnumber(ls, idx))feat = (dungeon_feature_type)luaL_checkint(ls, idx);else if (lua_isstring(ls, idx))feat = dungeon_feature_by_name(luaL_checkstring(ls, idx));elseluaL_argerror(ls, idx, "Feature must be a string or a feature index.");return feat;}dungeon_feature_type check_lua_feature(lua_State *ls, int idx){const dungeon_feature_type f = _get_lua_feature(ls, idx);if (!f)luaL_argerror(ls, idx, "Invalid dungeon feature");return (f);}
}static int dgn_grid(lua_State *ls){GETCOORD(c, 1, 2, map_bounds);if (!lua_isnone(ls, 3)){const dungeon_feature_type feat = _get_lua_feature(ls, 3);if (feat)grd(c) = feat;}PLUARET(number, grd(c));
LUARET1(_dgn_is_wall, boolean,feat_is_wall(static_cast<dungeon_feature_type>(luaL_checkint(ls, 1))))static int dgn_max_bounds(lua_State *ls){lua_pushnumber(ls, GXM);lua_pushnumber(ls, GYM);return (2);}
const char *dngn_feature_names[] ={"unseen", "closed_door", "detected_secret_door", "secret_door","wax_wall", "metal_wall", "green_crystal_wall", "rock_wall", "stone_wall","permarock_wall","clear_rock_wall", "clear_stone_wall", "clear_permarock_wall", "trees","open_sea", "orcish_idol", "", "", "", "", "","granite_statue", "statue_reserved_1", "statue_reserved_2","", "", "", "", "", "", "", "","", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "","", "", "", "", "", "", "", "", "", "", "", "", "", "lava","deep_water", "", "", "shallow_water", "water_stuck", "floor","floor_special", "floor_reserved", "exit_hell", "enter_hell","open_door", "", "", "trap_mechanical", "trap_magical", "trap_natural","undiscovered_trap", "", "enter_shop", "enter_labyrinth","stone_stairs_down_i", "stone_stairs_down_ii","stone_stairs_down_iii", "escape_hatch_down", "stone_stairs_up_i","stone_stairs_up_ii", "stone_stairs_up_iii", "escape_hatch_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", "", "", "", "", "", "","", "", "", "", "", "", "", "enter_portal_vault", "exit_portal_vault","", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "","", "", "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", "altar_jiyva", "altar_feawn", "", "", "", "","fountain_blue", "fountain_sparkling", "fountain_blood","dry_fountain_blue", "dry_fountain_sparkling", "dry_fountain_blood","permadry_fountain", "abandoned_shop"};dungeon_feature_type dungeon_feature_by_name(const std::string &name){COMPILE_CHECK(ARRAYSZ(dngn_feature_names) == NUM_REAL_FEATURES, c1);if (name.empty())return (DNGN_UNSEEN);for (unsigned i = 0; i < ARRAYSZ(dngn_feature_names); ++i)if (dngn_feature_names[i] == name)return static_cast<dungeon_feature_type>(i);return (DNGN_UNSEEN);}std::vector<std::string> dungeon_feature_matches(const std::string &name){std::vector<std::string> matches;COMPILE_CHECK(ARRAYSZ(dngn_feature_names) == NUM_REAL_FEATURES, c1);if (name.empty())return (matches);for (unsigned i = 0; i < ARRAYSZ(dngn_feature_names); ++i)if (strstr(dngn_feature_names[i], name.c_str()))matches.push_back(dngn_feature_names[i]);return (matches);}const char *dungeon_feature_name(dungeon_feature_type rfeat){const unsigned feat = rfeat;if (feat >= ARRAYSZ(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)));}
}static int dgn_feature_desc(lua_State *ls){const dungeon_feature_type feat =static_cast<dungeon_feature_type>(luaL_checkint(ls, 1));const description_level_type dtype =lua_isnumber(ls, 2)?static_cast<description_level_type>(luaL_checkint(ls, 2)) :description_type_by_name(lua_tostring(ls, 2));const bool need_stop = lua_isboolean(ls, 3)? lua_toboolean(ls, 3) : false;const std::string s =feature_description(feat, NUM_TRAPS, false, dtype, need_stop);lua_pushstring(ls, s.c_str());return (1);}static int dgn_feature_desc_at(lua_State *ls){const description_level_type dtype =lua_isnumber(ls, 3)?static_cast<description_level_type>(luaL_checkint(ls, 3)) :description_type_by_name(lua_tostring(ls, 3));const bool need_stop = lua_isboolean(ls, 4)? lua_toboolean(ls, 4) : false;const std::string s =feature_description(coord_def(luaL_checkint(ls, 1),luaL_checkint(ls, 2)),false, dtype, need_stop);lua_pushstring(ls, s.c_str());return (1);
static int dgn_set_feature_desc_short(lua_State *ls){const std::string base_name = luaL_checkstring(ls, 1);const std::string desc = luaL_checkstring(ls, 2);if (base_name.empty()){luaL_argerror(ls, 1, "Base name can't be empty");return (0);}set_feature_desc_short(base_name, desc);return (0);}static int dgn_set_feature_desc_long(lua_State *ls){const std::string raw_name = luaL_checkstring(ls, 1);const std::string desc = luaL_checkstring(ls, 2);if (raw_name.empty()){luaL_argerror(ls, 1, "Raw name can't be empty");return (0);}set_feature_desc_long(raw_name, desc);return (0);}