Add new level init type, swamp

Creates a "relaxed blockwise maze".
Make Juiblex's swamp use it.
This commit is contained in:
Pasi Kallinen
2020-02-25 18:53:06 +02:00
parent 04d15b099b
commit ccb00f59bc
4 changed files with 63 additions and 27 deletions

View File

@@ -27,6 +27,7 @@ static void NDECL(create_des_coder);
static void NDECL(solidify_map);
static void FDECL(lvlfill_maze_grid, (int, int, int, int, SCHAR_P));
static void FDECL(lvlfill_solid, (SCHAR_P, SCHAR_P));
static void FDECL(lvlfill_swamp, (SCHAR_P, SCHAR_P, SCHAR_P));
static void FDECL(flip_drawbridge_horizontal, (struct rm *));
static void FDECL(flip_drawbridge_vertical, (struct rm *));
static int FDECL(flip_encoded_direction_bits, (int, int));
@@ -215,6 +216,33 @@ schar lit;
}
}
static void
lvlfill_swamp(fg, bg, lit)
schar fg, bg, lit;
{
int x,y;
lvlfill_solid(bg, lit);
/* "relaxed blockwise maze" algorithm, Jamis Buck */
for (x = 2; x <= g.x_maze_max; x+=2)
for (y = 0; y <= g.y_maze_max; y+=2) {
int c = 0;
SET_TYPLIT(x, y, fg, lit);
if (levl[x+1][y].typ == bg) c++;
if (levl[x][y+1].typ == bg) c++;
if (levl[x+1][y+1].typ == bg) c++;
if (c == 3) {
switch (rn2(3)) {
case 0: SET_TYPLIT((x+1),y, fg, lit); break;
case 1: SET_TYPLIT(x, (y+1), fg, lit); break;
case 2: SET_TYPLIT((x+1),(y+1), fg, lit); break;
default: break;
}
}
}
}
static void
flip_drawbridge_horizontal(lev)
struct rm *lev;
@@ -2666,6 +2694,11 @@ lev_init *linit;
linit->icedpools = icedpools;
mkmap(linit);
break;
case LVLINIT_SWAMP:
if (linit->lit == -1)
linit->lit = rn2(2);
lvlfill_swamp(linit->fg, linit->bg, linit->lit);
break;
}
}
@@ -3302,10 +3335,11 @@ lspo_level_init(L)
lua_State *L;
{
static const char *const initstyles[] = {
"solidfill", "mazegrid", "rogue", "mines", NULL
"solidfill", "mazegrid", "rogue", "mines", "swamp", NULL
};
static const int initstyles2i[] = {
LVLINIT_SOLIDFILL, LVLINIT_MAZEGRID, LVLINIT_ROGUE, LVLINIT_MINES
LVLINIT_SOLIDFILL, LVLINIT_MAZEGRID, LVLINIT_ROGUE,
LVLINIT_MINES, LVLINIT_SWAMP, 0
};
lev_init init_lev;
@@ -3318,7 +3352,7 @@ lua_State *L;
init_lev.init_style
= initstyles2i[get_table_option(L, "style", "solidfill", initstyles)];
init_lev.fg = get_table_mapchr_opt(L, "fg", ROOM);
init_lev.bg = get_table_mapchr_opt(L, "bg", STONE);
init_lev.bg = get_table_mapchr_opt(L, "bg", INVALID_TYPE);
init_lev.smoothed = get_table_boolean_opt(L, "smoothed", 0);
init_lev.joined = get_table_boolean_opt(L, "joined", 0);
init_lev.lit = get_table_int_or_random(L, "lit", -1); /* TODO: allow lit=BOOL */
@@ -3327,6 +3361,9 @@ lua_State *L;
g.coder->lvl_is_joined = init_lev.joined;
if (init_lev.bg == INVALID_TYPE)
init_lev.bg = (init_lev.init_style == LVLINIT_SWAMP) ? MOAT : STONE;
splev_initlev(&init_lev);
return 0;