Also a little cleanup.
K73AS36BODJSSKMT2LRFDKS7BAMETNFLWHZEPQEZFM6KQB6KRA4AC RXYHE3C7R3EGCRZEJT2ZO4ALLRDR3HF66VHZZNF7TT3DFWZ6BJCQC MQ62OAMLGJVRW2QIL4PAZRAU6PC52ZVGY2FCOBIY6IWGQIHMU5CAC 3A5FX3Y4RPKWQEHKKXZKXZJ7RKV6RKWT7GTR4WFE5UBWKV2HT4RQC AUXHSGS4EFOPZ6TVZYWNVOUDO7NYKUKE3HBKGQQWTALSVFOE3HAAC YFJLINBBEHE7RBETTARSYNWSO6QJ6MSPXFMSPSH2742QFC3L55SQC LE5U6CTXEIETQN5GOVYF2K2VCISRXR3ULORXDKIKWYDVBG5GS3WAC TLA5UN6LZPXGKERI27EFY4HKIIU3VU5Y7ZU54WXL6ANBUV2VOTMQC 7IERR3KESLBDHEMGSFRYGA66PZBPGKPUGMFDCSFR3WDX7RXD5OTAC NKONHW4JNY6HP2M63MNPM3H64ZWSUNUT5FX2STW4KTS4AMXJXXVQC CPBVQFT7NWEYLYD34D5VYZIEOZ32YADXYTSFMS635YNXX4OFIZVAC JUCA26S3JSQFMZTBL7566ITHCOXXEFTFT7KDOWSUXA5JLZK5QJWAC RN242L3YZK35BFY7JRTCSYWD6FWDCRFUFDI7PKYFUCA2UPX6ZEAQC Q2NUCKXB4P7DHRXY764F5AMEJO436GV74AVVVOAVGNWKLMSVMDNQC T7CCGLOZ25B7BQKKGR6IA6LWBRKUWTXLTIRXUQ4YKQRVAA7AHZKQC #endif
/** Macros for processing object arguments.*/#define GETCOORD(c, p1, p2, boundfn) \coord_def c; \c.x = luaL_checkint(ls, p1); \c.y = luaL_checkint(ls, p2); \if (!boundfn(c)) \luaL_error( \ls, \make_stringf("Point (%d,%d) is out of bounds", \c.x, c.y).c_str()); \else ;#define COORDS(c, p1, p2) \GETCOORD(c, p1, p2, in_bounds)#define LEVEL(lev, br, pos) \const char *level_name = luaL_checkstring(ls, pos); \level_area_type lev = str_to_level_area_type(level_name); \if (lev == NUM_LEVEL_AREA_TYPES) \luaL_error(ls, "Expected level name"); \const char *branch_name = luaL_checkstring(ls, pos); \branch_type br = str_to_branch(branch_name); \if (lev == LEVEL_DUNGEON && br == NUM_BRANCHES) \luaL_error(ls, "Expected branch name");
#define MAP(ls, n, var) \map_def *var = *(map_def **) luaL_checkudata(ls, n, MAP_METATABLE)#define DEVENT(ls, n, var) \dgn_event *var = *(dgn_event **) luaL_checkudata(ls, n, DEVENT_METATABLE)#define MAPMARKER(ls, n, var) \map_marker *var = *(map_marker **) luaL_checkudata(ls, n, MAPMARK_METATABLE)/** Some shared helper functions.*/class map_lines;int dgn_map_add_transform(lua_State *ls,std::string (map_lines::*add)(const std::string &s));unsigned int get_tile_idx(lua_State *ls, int arg);#endif
}#ifdef USE_TILEstatic unsigned int _get_tile_idx(lua_State *ls, int arg){if (!lua_isstring(ls, arg)){luaL_argerror(ls, arg, "Expected string for tile name");return 0;}const char *tile_name = luaL_checkstring(ls, arg);unsigned int idx;if (!tile_dngn_index(tile_name, idx)){std::string error = "Couldn't find tile '";error += tile_name;error += "'";luaL_argerror(ls, arg, error.c_str());return 0;}return idx;
#define LEVEL(lev, br, pos) \const char *level_name = luaL_checkstring(ls, pos); \level_area_type lev = str_to_level_area_type(level_name); \if (lev == NUM_LEVEL_AREA_TYPES) \luaL_error(ls, "Expected level name"); \const char *branch_name = luaL_checkstring(ls, pos); \branch_type br = str_to_branch(branch_name); \if (lev == LEVEL_DUNGEON && br == NUM_BRANCHES) \luaL_error(ls, "Expected branch name");
}LUAFN(dgn_lev_floortile){#ifdef USE_TILELEVEL(lev, br, 1);tile_flavour flv;tile_default_flv(lev, br, flv);const char *tile_name = tile_dngn_name(flv.floor);PLUARET(string, tile_name);#elsePLUARET(string, "invalid");#endif}LUAFN(dgn_lev_rocktile){#ifdef USE_TILELEVEL(lev, br, 1);tile_flavour flv;tile_default_flv(lev, br, flv);const char *tile_name = tile_dngn_name(flv.wall);PLUARET(string, tile_name);#elsePLUARET(string, "invalid");#endif
LUAFN(dgn_lrocktile){MAP(ls, 1, map);#ifdef USE_TILEunsigned short tile = _get_tile_idx(ls, 2);map->rock_tile = tile;const char *tile_name = tile_dngn_name(tile);PLUARET(string, tile_name);#elseUNUSED(map);PLUARET(string, "invalid");#endif}LUAFN(dgn_lfloortile){MAP(ls, 1, map);#ifdef USE_TILEunsigned short tile = _get_tile_idx(ls, 2);map->floor_tile = tile;const char *tile_name = tile_dngn_name(tile);PLUARET(string, tile_name);#elseUNUSED(map);PLUARET(string, "invalid");#endif}LUAFN(dgn_change_rock_tile){#ifdef USE_TILEunsigned short tile = _get_tile_idx(ls, 1);if (tile)env.tile_default.wall = tile;const char *tile_name = tile_dngn_name(tile);PLUARET(string, tile_name);#elsePLUARET(string, "invalid");#endif}LUAFN(dgn_change_floor_tile){#ifdef USE_TILEunsigned short tile = _get_tile_idx(ls, 1);if (tile)env.tile_default.floor = tile;const char *tile_name = tile_dngn_name(tile);PLUARET(string, tile_name);#elsePLUARET(string, "invalid");#endif}LUAFN(dgn_ftile){#ifdef USE_TILEreturn dgn_map_add_transform(ls, &map_lines::add_floortile);#elsereturn 0;#endif}LUAFN(dgn_rtile){#ifdef USE_TILEreturn dgn_map_add_transform(ls, &map_lines::add_rocktile);#elsereturn 0;#endif}
{ "lrocktile", dgn_lrocktile },{ "lfloortile", dgn_lfloortile },{ "rtile", dgn_rtile },{ "ftile", dgn_ftile },{ "change_rock_tile", dgn_change_rock_tile },{ "change_floor_tile", dgn_change_floor_tile },{ "lev_floortile", dgn_lev_floortile },{ "lev_rocktile", dgn_lev_rocktile },
#define COORDS(c, p1, p2) \GETCOORD(c, p1, p2, in_bounds)#define MAP(ls, n, var) \map_def *var = *(map_def **) luaL_checkudata(ls, n, MAP_METATABLE)#define DEVENT(ls, n, var) \dgn_event *var = *(dgn_event **) luaL_checkudata(ls, n, DEVENT_METATABLE)#define MAPMARKER(ls, n, var) \map_marker *var = *(map_marker **) luaL_checkudata(ls, n, MAPMARK_METATABLE)