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_TILE
static 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_TILE
LEVEL(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);
#else
PLUARET(string, "invalid");
#endif
}
LUAFN(dgn_lev_rocktile)
{
#ifdef USE_TILE
LEVEL(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);
#else
PLUARET(string, "invalid");
#endif
LUAFN(dgn_lrocktile)
{
MAP(ls, 1, map);
#ifdef USE_TILE
unsigned short tile = _get_tile_idx(ls, 2);
map->rock_tile = tile;
const char *tile_name = tile_dngn_name(tile);
PLUARET(string, tile_name);
#else
UNUSED(map);
PLUARET(string, "invalid");
#endif
}
LUAFN(dgn_lfloortile)
{
MAP(ls, 1, map);
#ifdef USE_TILE
unsigned short tile = _get_tile_idx(ls, 2);
map->floor_tile = tile;
const char *tile_name = tile_dngn_name(tile);
PLUARET(string, tile_name);
#else
UNUSED(map);
PLUARET(string, "invalid");
#endif
}
LUAFN(dgn_change_rock_tile)
{
#ifdef USE_TILE
unsigned 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);
#else
PLUARET(string, "invalid");
#endif
}
LUAFN(dgn_change_floor_tile)
{
#ifdef USE_TILE
unsigned 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);
#else
PLUARET(string, "invalid");
#endif
}
LUAFN(dgn_ftile)
{
#ifdef USE_TILE
return dgn_map_add_transform(ls, &map_lines::add_floortile);
#else
return 0;
#endif
}
LUAFN(dgn_rtile)
{
#ifdef USE_TILE
return dgn_map_add_transform(ls, &map_lines::add_rocktile);
#else
return 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)