Fix selection "random" grow direction, and other code cleanup
Noticed that when I set a selection to grow in a random direction, it instead grew in all directions, which is not what I wanted. Turns out the -1 random dir ended up being passed straight to the code which checks bitmasks, without any form of randomizing among directions. So this adds code to do that, and defines W_RANDOM as -1 rather than using a magic number. In the process I also noticed that specifying "random" as the wall for a door in a room made it rerandomize the direction every iteration of its loop, essentially rolling two rn2(4)s and only proceeding if they matched. That was pointless so I cleaned it up a bit. Also added safety checks in the form of an impossible for des.corridor() being called with "random" as either walldir, because this is not implemented currently. And lastly, I noticed that create_secret_door was entirely unused (secret door creation is handled in create_door), so I deleted it. The only behavior change caused by this is that the Valkyrie quest lava pools will be a little smaller, which is the only place grow is currently used. If it's desired to keep them the same, that should be changed to "all".
This commit is contained in:
committed by
Pasi Kallinen
parent
1483778e96
commit
cc04bf9d8f
@@ -2496,7 +2496,6 @@ extern void flip_level_rnd(int, boolean);
|
|||||||
extern boolean check_room(xchar *, xchar *, xchar *, xchar *, boolean);
|
extern boolean check_room(xchar *, xchar *, xchar *, xchar *, boolean);
|
||||||
extern boolean create_room(xchar, xchar, xchar, xchar, xchar, xchar, xchar,
|
extern boolean create_room(xchar, xchar, xchar, xchar, xchar, xchar, xchar,
|
||||||
xchar);
|
xchar);
|
||||||
extern void create_secret_door(struct mkroom *, xchar);
|
|
||||||
extern boolean dig_corridor(coord *, coord *, boolean, schar, schar);
|
extern boolean dig_corridor(coord *, coord *, boolean, schar, schar);
|
||||||
extern void fill_special_room(struct mkroom *);
|
extern void fill_special_room(struct mkroom *);
|
||||||
extern void wallify_map(int, int, int, int);
|
extern void wallify_map(int, int, int, int);
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
#define SP_LEV_H
|
#define SP_LEV_H
|
||||||
|
|
||||||
/* wall directions */
|
/* wall directions */
|
||||||
|
#define W_RANDOM -1
|
||||||
#define W_NORTH 1
|
#define W_NORTH 1
|
||||||
#define W_SOUTH 2
|
#define W_SOUTH 2
|
||||||
#define W_EAST 4
|
#define W_EAST 4
|
||||||
|
|||||||
@@ -507,7 +507,7 @@ l_selection_grow(lua_State *L)
|
|||||||
{
|
{
|
||||||
int argc = lua_gettop(L);
|
int argc = lua_gettop(L);
|
||||||
const char *const growdirs[] = { "all", "random", "north", "west", "east", "south", NULL };
|
const char *const growdirs[] = { "all", "random", "north", "west", "east", "south", NULL };
|
||||||
const int growdirs2i[] = { W_ANY, -1, W_NORTH, W_WEST, W_EAST, W_SOUTH, 0 };
|
const int growdirs2i[] = { W_ANY, W_RANDOM, W_NORTH, W_WEST, W_EAST, W_SOUTH, 0 };
|
||||||
|
|
||||||
struct selectionvar *sel = l_selection_check(L, 1);
|
struct selectionvar *sel = l_selection_check(L, 1);
|
||||||
int dir = growdirs2i[luaL_checkoption(L, 2, "all", growdirs)];
|
int dir = growdirs2i[luaL_checkoption(L, 2, "all", growdirs)];
|
||||||
|
|||||||
89
src/sp_lev.c
89
src/sp_lev.c
@@ -99,6 +99,7 @@ static void get_table_xy_or_coord(lua_State *, int *, int *);
|
|||||||
static int get_table_region(lua_State *, const char *, int *, int *, int *,
|
static int get_table_region(lua_State *, const char *, int *, int *, int *,
|
||||||
int *, boolean);
|
int *, boolean);
|
||||||
static void set_wallprop_in_selection(lua_State *, int);
|
static void set_wallprop_in_selection(lua_State *, int);
|
||||||
|
static xchar random_wdir(void);
|
||||||
static int floodfillchk_match_under(int, int);
|
static int floodfillchk_match_under(int, int);
|
||||||
static int floodfillchk_match_accessible(int, int);
|
static int floodfillchk_match_accessible(int, int);
|
||||||
static boolean sel_flood_havepoint(int, int, xchar *, xchar *, int);
|
static boolean sel_flood_havepoint(int, int, xchar *, xchar *, int);
|
||||||
@@ -1582,6 +1583,9 @@ create_door(room_door *dd, struct mkroom *broom)
|
|||||||
if (dd->secret == -1)
|
if (dd->secret == -1)
|
||||||
dd->secret = rn2(2);
|
dd->secret = rn2(2);
|
||||||
|
|
||||||
|
if (dd->wall == W_RANDOM)
|
||||||
|
dd->wall = W_ANY; /* speeds things up in the below loop */
|
||||||
|
|
||||||
if (dd->mask == -1) {
|
if (dd->mask == -1) {
|
||||||
/* is it a locked door, closed, or a doorway? */
|
/* is it a locked door, closed, or a doorway? */
|
||||||
if (!dd->secret) {
|
if (!dd->secret) {
|
||||||
@@ -1608,13 +1612,7 @@ create_door(room_door *dd, struct mkroom *broom)
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (trycnt = 0; trycnt < 100; ++trycnt) {
|
for (trycnt = 0; trycnt < 100; ++trycnt) {
|
||||||
int dwall, dpos;
|
int dwall = dd->wall, dpos = dd->pos;
|
||||||
|
|
||||||
dwall = dd->wall;
|
|
||||||
if (dwall == -1) /* The wall is RANDOM */
|
|
||||||
dwall = 1 << rn2(4);
|
|
||||||
|
|
||||||
dpos = dd->pos;
|
|
||||||
|
|
||||||
/* Convert wall and pos into an absolute coordinate! */
|
/* Convert wall and pos into an absolute coordinate! */
|
||||||
switch (rn2(4)) {
|
switch (rn2(4)) {
|
||||||
@@ -1670,54 +1668,6 @@ create_door(room_door *dd, struct mkroom *broom)
|
|||||||
levl[x][y].doormask = dd->mask;
|
levl[x][y].doormask = dd->mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Create a secret door in croom on any one of the specified walls.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
create_secret_door(
|
|
||||||
struct mkroom *croom,
|
|
||||||
xchar walls) /* any of W_NORTH | W_SOUTH | W_EAST | W_WEST (or W_ANY) */
|
|
||||||
{
|
|
||||||
xchar sx, sy; /* location of the secret door */
|
|
||||||
int count;
|
|
||||||
|
|
||||||
for (count = 0; count < 100; count++) {
|
|
||||||
sx = rn1(croom->hx - croom->lx + 1, croom->lx);
|
|
||||||
sy = rn1(croom->hy - croom->ly + 1, croom->ly);
|
|
||||||
|
|
||||||
switch (rn2(4)) {
|
|
||||||
case 0: /* top */
|
|
||||||
if (!(walls & W_NORTH))
|
|
||||||
continue;
|
|
||||||
sy = croom->ly - 1;
|
|
||||||
break;
|
|
||||||
case 1: /* bottom */
|
|
||||||
if (!(walls & W_SOUTH))
|
|
||||||
continue;
|
|
||||||
sy = croom->hy + 1;
|
|
||||||
break;
|
|
||||||
case 2: /* left */
|
|
||||||
if (!(walls & W_EAST))
|
|
||||||
continue;
|
|
||||||
sx = croom->lx - 1;
|
|
||||||
break;
|
|
||||||
case 3: /* right */
|
|
||||||
if (!(walls & W_WEST))
|
|
||||||
continue;
|
|
||||||
sx = croom->hx + 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (okdoor(sx, sy)) {
|
|
||||||
levl[sx][sy].typ = SDOOR;
|
|
||||||
levl[sx][sy].doormask = D_CLOSED;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impossible("couldn't create secret door on any walls 0x%x", walls);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create a trap in a room.
|
* Create a trap in a room.
|
||||||
*/
|
*/
|
||||||
@@ -2550,6 +2500,14 @@ create_corridor(corridor *c)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Safety railings - if there's ever a case where des.corridor() needs to be
|
||||||
|
* called with src/destwall="random", that logic first needs to be
|
||||||
|
* implemented in search_door. */
|
||||||
|
if (c->src.wall == W_ANY || c->src.wall == W_RANDOM
|
||||||
|
|| c->dest.wall == W_ANY || c->dest.wall == W_RANDOM) {
|
||||||
|
impossible("create_corridor to/from a random wall");
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (!search_door(&g.rooms[c->src.room], &org.x, &org.y, c->src.wall,
|
if (!search_door(&g.rooms[c->src.room], &org.x, &org.y, c->src.wall,
|
||||||
c->src.door))
|
c->src.door))
|
||||||
return;
|
return;
|
||||||
@@ -4208,7 +4166,7 @@ lspo_corridor(lua_State *L)
|
|||||||
"all", "random", "north", "west", "east", "south", NULL
|
"all", "random", "north", "west", "east", "south", NULL
|
||||||
};
|
};
|
||||||
static const int walldirs2i[] = {
|
static const int walldirs2i[] = {
|
||||||
W_ANY, -1, W_NORTH, W_WEST, W_EAST, W_SOUTH, 0
|
W_ANY, W_RANDOM, W_NORTH, W_WEST, W_EAST, W_SOUTH, 0
|
||||||
};
|
};
|
||||||
corridor tc;
|
corridor tc;
|
||||||
|
|
||||||
@@ -4398,6 +4356,14 @@ selection_rndcoord(struct selectionvar* ov, xchar *x, xchar *y, boolean removeit
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Choose a single random W_* direction. */
|
||||||
|
static xchar
|
||||||
|
random_wdir(void)
|
||||||
|
{
|
||||||
|
static const xchar wdirs[4] = { W_NORTH, W_SOUTH, W_EAST, W_WEST };
|
||||||
|
return wdirs[rn2(4)];
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
selection_do_grow(struct selectionvar* ov, int dir)
|
selection_do_grow(struct selectionvar* ov, int dir)
|
||||||
{
|
{
|
||||||
@@ -4407,6 +4373,9 @@ selection_do_grow(struct selectionvar* ov, int dir)
|
|||||||
if (!ov || !tmp)
|
if (!ov || !tmp)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (dir == W_RANDOM)
|
||||||
|
dir = random_wdir();
|
||||||
|
|
||||||
for (x = 1; x < ov->wid; x++)
|
for (x = 1; x < ov->wid; x++)
|
||||||
for (y = 0; y < ov->hei; y++) {
|
for (y = 0; y < ov->hei; y++) {
|
||||||
/* note: dir is a mask of multiple directions, but the only
|
/* note: dir is a mask of multiple directions, but the only
|
||||||
@@ -4909,6 +4878,8 @@ lspo_door(lua_State *L)
|
|||||||
static const char *const walldirs[] = {
|
static const char *const walldirs[] = {
|
||||||
"all", "random", "north", "west", "east", "south", NULL
|
"all", "random", "north", "west", "east", "south", NULL
|
||||||
};
|
};
|
||||||
|
/* Note that "random" is also W_ANY, because create_door just wants a
|
||||||
|
* mask of acceptable walls */
|
||||||
static const int walldirs2i[] = {
|
static const int walldirs2i[] = {
|
||||||
W_ANY, W_ANY, W_NORTH, W_WEST, W_EAST, W_SOUTH, 0
|
W_ANY, W_ANY, W_NORTH, W_WEST, W_EAST, W_SOUTH, 0
|
||||||
};
|
};
|
||||||
@@ -5723,7 +5694,7 @@ lspo_mazewalk(lua_State *L)
|
|||||||
static const char *const mwdirs[] = {
|
static const char *const mwdirs[] = {
|
||||||
"north", "south", "east", "west", "random", NULL
|
"north", "south", "east", "west", "random", NULL
|
||||||
};
|
};
|
||||||
static const int mwdirs2i[] = { W_NORTH, W_SOUTH, W_EAST, W_WEST, -1, -2 };
|
static const int mwdirs2i[] = { W_NORTH, W_SOUTH, W_EAST, W_WEST, W_RANDOM, -2 };
|
||||||
xchar x, y;
|
xchar x, y;
|
||||||
int mx, my;
|
int mx, my;
|
||||||
xchar ftyp = ROOM;
|
xchar ftyp = ROOM;
|
||||||
@@ -5759,8 +5730,8 @@ lspo_mazewalk(lua_State *L)
|
|||||||
ftyp = g.level.flags.corrmaze ? CORR : ROOM;
|
ftyp = g.level.flags.corrmaze ? CORR : ROOM;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dir == -1)
|
if (dir == W_RANDOM)
|
||||||
dir = mwdirs2i[rn2(4)];
|
dir = random_wdir();
|
||||||
|
|
||||||
/* don't use move() - it doesn't use W_NORTH, etc. */
|
/* don't use move() - it doesn't use W_NORTH, etc. */
|
||||||
switch (dir) {
|
switch (dir) {
|
||||||
|
|||||||
Reference in New Issue
Block a user