Some lua selection userdata code cleanup
This commit is contained in:
@@ -2585,7 +2585,7 @@ extern boolean pm_good_location(coordxy, coordxy, struct permonst *);
|
|||||||
extern void get_location_coord(coordxy *, coordxy *, int, struct mkroom *, long);
|
extern void get_location_coord(coordxy *, coordxy *, int, struct mkroom *, long);
|
||||||
extern void selection_setpoint(coordxy, coordxy, struct selectionvar *, int);
|
extern void selection_setpoint(coordxy, coordxy, struct selectionvar *, int);
|
||||||
extern struct selectionvar * selection_not(struct selectionvar *);
|
extern struct selectionvar * selection_not(struct selectionvar *);
|
||||||
extern void selection_filter_percent(struct selectionvar *, int);
|
extern struct selectionvar *selection_filter_percent(struct selectionvar *, int);
|
||||||
extern int selection_rndcoord(struct selectionvar *, coordxy *, coordxy *,
|
extern int selection_rndcoord(struct selectionvar *, coordxy *, coordxy *,
|
||||||
boolean);
|
boolean);
|
||||||
extern void selection_do_grow(struct selectionvar *, int);
|
extern void selection_do_grow(struct selectionvar *, int);
|
||||||
|
|||||||
67
src/nhlsel.c
67
src/nhlsel.c
@@ -5,6 +5,11 @@
|
|||||||
#include "hack.h"
|
#include "hack.h"
|
||||||
#include "sp_lev.h"
|
#include "sp_lev.h"
|
||||||
|
|
||||||
|
|
||||||
|
struct selectionvar *l_selection_check(lua_State *, int);
|
||||||
|
static struct selectionvar *l_selection_push_new(lua_State *);
|
||||||
|
static void l_selection_push_copy(lua_State *, struct selectionvar *);
|
||||||
|
|
||||||
/* lua_CFunction prototypes */
|
/* lua_CFunction prototypes */
|
||||||
static int l_selection_new(lua_State *);
|
static int l_selection_new(lua_State *);
|
||||||
static int l_selection_clone(lua_State *);
|
static int l_selection_clone(lua_State *);
|
||||||
@@ -80,8 +85,9 @@ l_selection_to(lua_State *L, int index)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* push a new selection into lua stack, return the selectionvar */
|
||||||
static struct selectionvar *
|
static struct selectionvar *
|
||||||
l_selection_push(lua_State *L)
|
l_selection_push_new(lua_State *L)
|
||||||
{
|
{
|
||||||
struct selectionvar *tmp = selection_new();
|
struct selectionvar *tmp = selection_new();
|
||||||
struct selectionvar
|
struct selectionvar
|
||||||
@@ -97,11 +103,26 @@ l_selection_push(lua_State *L)
|
|||||||
return sel;
|
return sel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* push a copy of selectionvar tmp to lua stack */
|
||||||
|
static void
|
||||||
|
l_selection_push_copy(lua_State *L, struct selectionvar *tmp)
|
||||||
|
{
|
||||||
|
struct selectionvar
|
||||||
|
*sel = (struct selectionvar *) lua_newuserdata(L, sizeof(struct selectionvar));
|
||||||
|
|
||||||
|
luaL_getmetatable(L, "selection");
|
||||||
|
lua_setmetatable(L, -2);
|
||||||
|
|
||||||
|
*sel = *tmp;
|
||||||
|
sel->map = dupstr(tmp->map);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* local sel = selection.new(); */
|
/* local sel = selection.new(); */
|
||||||
static int
|
static int
|
||||||
l_selection_new(lua_State *L)
|
l_selection_new(lua_State *L)
|
||||||
{
|
{
|
||||||
(void) l_selection_push(L);
|
(void) l_selection_push_new(L);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -230,7 +251,7 @@ l_selection_and(lua_State *L)
|
|||||||
int x,y;
|
int x,y;
|
||||||
struct selectionvar *sela = l_selection_check(L, 1);
|
struct selectionvar *sela = l_selection_check(L, 1);
|
||||||
struct selectionvar *selb = l_selection_check(L, 2);
|
struct selectionvar *selb = l_selection_check(L, 2);
|
||||||
struct selectionvar *selr = l_selection_push(L);
|
struct selectionvar *selr = l_selection_push_new(L);
|
||||||
|
|
||||||
for (x = 0; x < selr->wid; x++)
|
for (x = 0; x < selr->wid; x++)
|
||||||
for (y = 0; y < selr->hei; y++) {
|
for (y = 0; y < selr->hei; y++) {
|
||||||
@@ -250,7 +271,7 @@ l_selection_or(lua_State *L)
|
|||||||
int x,y;
|
int x,y;
|
||||||
struct selectionvar *sela = l_selection_check(L, 1);
|
struct selectionvar *sela = l_selection_check(L, 1);
|
||||||
struct selectionvar *selb = l_selection_check(L, 2);
|
struct selectionvar *selb = l_selection_check(L, 2);
|
||||||
struct selectionvar *selr = l_selection_push(L);
|
struct selectionvar *selr = l_selection_push_new(L);
|
||||||
|
|
||||||
for (x = 0; x < selr->wid; x++)
|
for (x = 0; x < selr->wid; x++)
|
||||||
for (y = 0; y < selr->hei; y++) {
|
for (y = 0; y < selr->hei; y++) {
|
||||||
@@ -270,7 +291,7 @@ l_selection_xor(lua_State *L)
|
|||||||
int x,y;
|
int x,y;
|
||||||
struct selectionvar *sela = l_selection_check(L, 1);
|
struct selectionvar *sela = l_selection_check(L, 1);
|
||||||
struct selectionvar *selb = l_selection_check(L, 2);
|
struct selectionvar *selb = l_selection_check(L, 2);
|
||||||
struct selectionvar *selr = l_selection_push(L);
|
struct selectionvar *selr = l_selection_push_new(L);
|
||||||
|
|
||||||
for (x = 0; x < selr->wid; x++)
|
for (x = 0; x < selr->wid; x++)
|
||||||
for (y = 0; y < selr->hei; y++) {
|
for (y = 0; y < selr->hei; y++) {
|
||||||
@@ -291,7 +312,7 @@ l_selection_sub(lua_State *L)
|
|||||||
int x,y;
|
int x,y;
|
||||||
struct selectionvar *sela = l_selection_check(L, 1);
|
struct selectionvar *sela = l_selection_check(L, 1);
|
||||||
struct selectionvar *selb = l_selection_check(L, 2);
|
struct selectionvar *selb = l_selection_check(L, 2);
|
||||||
struct selectionvar *selr = l_selection_push(L);
|
struct selectionvar *selr = l_selection_push_new(L);
|
||||||
|
|
||||||
for (x = 0; x < selr->wid; x++) {
|
for (x = 0; x < selr->wid; x++) {
|
||||||
for (y = 0; y < selr->hei; y++) {
|
for (y = 0; y < selr->hei; y++) {
|
||||||
@@ -311,15 +332,15 @@ l_selection_sub(lua_State *L)
|
|||||||
static int
|
static int
|
||||||
l_selection_filter_percent(lua_State *L)
|
l_selection_filter_percent(lua_State *L)
|
||||||
{
|
{
|
||||||
struct selectionvar *ret;
|
int argc = lua_gettop(L);
|
||||||
int p;
|
struct selectionvar *sel = l_selection_check(L, 1);
|
||||||
|
int p = (int) luaL_checkinteger(L, 2);
|
||||||
|
struct selectionvar *tmp;
|
||||||
|
|
||||||
(void) l_selection_check(L, 1);
|
tmp = selection_filter_percent(sel, p);
|
||||||
p = (int) luaL_checkinteger(L, 2);
|
lua_pop(L, argc);
|
||||||
lua_pop(L, 1);
|
l_selection_push_copy(L, tmp);
|
||||||
(void) l_selection_clone(L);
|
selection_free(tmp, TRUE);
|
||||||
ret = l_selection_check(L, 2);
|
|
||||||
selection_filter_percent(ret, p);
|
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@@ -538,23 +559,15 @@ l_selection_filter_mapchar(lua_State *L)
|
|||||||
char *mapchr = dupstr(luaL_checkstring(L, 2));
|
char *mapchr = dupstr(luaL_checkstring(L, 2));
|
||||||
coordxy typ = check_mapchr(mapchr);
|
coordxy typ = check_mapchr(mapchr);
|
||||||
int lit = (int) luaL_optinteger(L, 3, -2); /* TODO: special lit values */
|
int lit = (int) luaL_optinteger(L, 3, -2); /* TODO: special lit values */
|
||||||
struct selectionvar *tmp, *tmp2;
|
struct selectionvar *tmp;
|
||||||
|
|
||||||
if (typ == INVALID_TYPE)
|
if (typ == INVALID_TYPE)
|
||||||
nhl_error(L, "Erroneous map char");
|
nhl_error(L, "Erroneous map char");
|
||||||
|
|
||||||
if (argc > 1)
|
tmp = selection_filter_mapchar(sel, typ, lit);
|
||||||
lua_pop(L, argc - 1);
|
lua_pop(L, argc);
|
||||||
|
l_selection_push_copy(L, tmp);
|
||||||
tmp = l_selection_push(L);
|
selection_free(tmp, TRUE);
|
||||||
tmp2 = selection_filter_mapchar(sel, typ, lit);
|
|
||||||
|
|
||||||
free(tmp->map);
|
|
||||||
tmp->map = tmp2->map;
|
|
||||||
tmp2->map = NULL;
|
|
||||||
selection_free(tmp2, TRUE);
|
|
||||||
|
|
||||||
lua_remove(L, 1);
|
|
||||||
|
|
||||||
if (mapchr)
|
if (mapchr)
|
||||||
free(mapchr);
|
free(mapchr);
|
||||||
|
|||||||
13
src/sp_lev.c
13
src/sp_lev.c
@@ -4464,17 +4464,22 @@ selection_filter_mapchar(struct selectionvar* ov, xint16 typ, int lit)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
struct selectionvar *
|
||||||
selection_filter_percent(struct selectionvar* ov, int percent)
|
selection_filter_percent(struct selectionvar* ov, int percent)
|
||||||
{
|
{
|
||||||
int x, y;
|
int x, y;
|
||||||
|
struct selectionvar *ret;
|
||||||
|
|
||||||
if (!ov)
|
if (!ov)
|
||||||
return;
|
return NULL;
|
||||||
|
|
||||||
|
ret = selection_new();
|
||||||
|
|
||||||
for (x = 0; x < ov->wid; x++)
|
for (x = 0; x < ov->wid; x++)
|
||||||
for (y = 0; y < ov->hei; y++)
|
for (y = 0; y < ov->hei; y++)
|
||||||
if (selection_getpoint(x, y, ov) && (rn2(100) >= percent))
|
if (selection_getpoint(x, y, ov) && (rn2(100) < percent))
|
||||||
selection_setpoint(x, y, ov, 0);
|
selection_setpoint(x, y, ret, 1);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
|||||||
Reference in New Issue
Block a user