Split dungeon.lua level reading to separate function
This commit is contained in:
153
src/dungeon.c
153
src/dungeon.c
@@ -49,6 +49,8 @@ static int possible_places(int, boolean *, struct proto_dungeon *);
|
|||||||
static xint16 pick_level(boolean *, int);
|
static xint16 pick_level(boolean *, int);
|
||||||
static boolean place_level(int, struct proto_dungeon *);
|
static boolean place_level(int, struct proto_dungeon *);
|
||||||
static int get_dgn_flags(lua_State *);
|
static int get_dgn_flags(lua_State *);
|
||||||
|
static int get_dgn_align(lua_State *);
|
||||||
|
static void init_dungeon_levels(lua_State *, struct proto_dungeon *, int);
|
||||||
static boolean unplaced_floater(struct dungeon *);
|
static boolean unplaced_floater(struct dungeon *);
|
||||||
static boolean unreachable_level(d_level *, boolean);
|
static boolean unreachable_level(d_level *, boolean);
|
||||||
static void tport_menu(winid, char *, struct lchoice *, d_level *,
|
static void tport_menu(winid, char *, struct lchoice *, d_level *,
|
||||||
@@ -709,7 +711,7 @@ static struct level_map {
|
|||||||
{ X_GOAL, &nemesis_level },
|
{ X_GOAL, &nemesis_level },
|
||||||
{ "", (d_level *) 0 } };
|
{ "", (d_level *) 0 } };
|
||||||
|
|
||||||
int
|
static int
|
||||||
get_dgn_flags(lua_State *L)
|
get_dgn_flags(lua_State *L)
|
||||||
{
|
{
|
||||||
int dgn_flags = 0;
|
int dgn_flags = 0;
|
||||||
@@ -745,9 +747,8 @@ get_dgn_flags(lua_State *L)
|
|||||||
return dgn_flags;
|
return dgn_flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* initialize the "dungeon" structs */
|
static int
|
||||||
void
|
get_dgn_align(lua_State *L)
|
||||||
init_dungeons(void)
|
|
||||||
{
|
{
|
||||||
static const char *const dgnaligns[] = {
|
static const char *const dgnaligns[] = {
|
||||||
"unaligned", "noalign", "lawful", "neutral", "chaotic", NULL
|
"unaligned", "noalign", "lawful", "neutral", "chaotic", NULL
|
||||||
@@ -756,6 +757,83 @@ init_dungeons(void)
|
|||||||
D_ALIGN_NONE, D_ALIGN_NONE, D_ALIGN_LAWFUL,
|
D_ALIGN_NONE, D_ALIGN_NONE, D_ALIGN_LAWFUL,
|
||||||
D_ALIGN_NEUTRAL, D_ALIGN_CHAOTIC, D_ALIGN_NONE
|
D_ALIGN_NEUTRAL, D_ALIGN_CHAOTIC, D_ALIGN_NONE
|
||||||
};
|
};
|
||||||
|
|
||||||
|
int a = dgnaligns2i[get_table_option(L, "alignment",
|
||||||
|
"unaligned", dgnaligns)];
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
init_dungeon_levels(lua_State *L, struct proto_dungeon *pd, int dngidx)
|
||||||
|
{
|
||||||
|
char *lvl_name, *lvl_bonetag, *lvl_chain;
|
||||||
|
int lvl_base, lvl_range, lvl_nlevels, lvl_chance,
|
||||||
|
lvl_align, lvl_flags;
|
||||||
|
struct tmplevel *tmpl;
|
||||||
|
int bi, f, nlevels;
|
||||||
|
|
||||||
|
lua_len(L, -1);
|
||||||
|
nlevels = (int) lua_tointeger(L, -1);
|
||||||
|
pd->tmpdungeon[dngidx].levels = nlevels;
|
||||||
|
lua_pop(L, 1);
|
||||||
|
for (f = 0; f < nlevels; f++) {
|
||||||
|
lua_pushinteger(L, f + 1);
|
||||||
|
lua_gettable(L, -2);
|
||||||
|
if (lua_type(L, -1) == LUA_TTABLE) {
|
||||||
|
lvl_name = get_table_str(L, "name");
|
||||||
|
lvl_bonetag = get_table_str_opt(L, "bonetag", emptystr);
|
||||||
|
lvl_chain = get_table_str_opt(L, "chainlevel", NULL);
|
||||||
|
lvl_base = get_table_int(L, "base");
|
||||||
|
lvl_range = get_table_int_opt(L, "range", 0);
|
||||||
|
lvl_nlevels = get_table_int_opt(L, "nlevels", 0);
|
||||||
|
lvl_chance = get_table_int_opt(L, "chance", 100);
|
||||||
|
lvl_align = get_dgn_align(L);
|
||||||
|
lvl_flags = get_dgn_flags(L);
|
||||||
|
/* array index is offset by cumulative number of levels
|
||||||
|
defined for preceding branches (iterations of 'while'
|
||||||
|
loop we're inside, not branch connections below) */
|
||||||
|
tmpl = &pd->tmplevel[pd->n_levs + f];
|
||||||
|
|
||||||
|
debugpline4("LEVEL[%i]:%s,(%i,%i)",
|
||||||
|
f, lvl_name, lvl_base, lvl_range);
|
||||||
|
tmpl->name = lvl_name;
|
||||||
|
tmpl->chainlvl = lvl_chain;
|
||||||
|
tmpl->lev.base = lvl_base;
|
||||||
|
tmpl->lev.rand = lvl_range;
|
||||||
|
tmpl->chance = lvl_chance;
|
||||||
|
tmpl->rndlevs = lvl_nlevels;
|
||||||
|
tmpl->flags = lvl_flags | lvl_align;
|
||||||
|
tmpl->boneschar = *lvl_bonetag ? *lvl_bonetag : 0;
|
||||||
|
free(lvl_bonetag);
|
||||||
|
tmpl->chain = -1;
|
||||||
|
if (lvl_chain) {
|
||||||
|
debugpline1("CHAINLEVEL: %s", lvl_chain);
|
||||||
|
for (bi = 0; bi < pd->n_levs + f; bi++) {
|
||||||
|
debugpline2("checking(%i):%s",
|
||||||
|
bi, pd->tmplevel[bi].name);
|
||||||
|
if (!strcmp(pd->tmplevel[bi].name, lvl_chain)) {
|
||||||
|
tmpl->chain = bi;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (tmpl->chain == -1)
|
||||||
|
panic("Could not chain level %s to %s",
|
||||||
|
lvl_name, lvl_chain);
|
||||||
|
/* free(lvl_chain); -- recorded in pd.tmplevel[] */
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
panic("dungeon[%i].levels[%i] is not a hash", dngidx, f);
|
||||||
|
lua_pop(L, 1);
|
||||||
|
}
|
||||||
|
pd->n_levs += nlevels;
|
||||||
|
if (pd->n_levs > LEV_LIMIT)
|
||||||
|
panic("init_dungeon: too many special levels");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* initialize the "dungeon" structs */
|
||||||
|
void
|
||||||
|
init_dungeons(void)
|
||||||
|
{
|
||||||
lua_State *L;
|
lua_State *L;
|
||||||
register int i, cl = 0;
|
register int i, cl = 0;
|
||||||
register s_level *x;
|
register s_level *x;
|
||||||
@@ -842,8 +920,7 @@ init_dungeons(void)
|
|||||||
dgn_protoname = get_table_str_opt(L, "protofile", emptystr);
|
dgn_protoname = get_table_str_opt(L, "protofile", emptystr);
|
||||||
dgn_base = get_table_int(L, "base");
|
dgn_base = get_table_int(L, "base");
|
||||||
dgn_range = get_table_int_opt(L, "range", 0);
|
dgn_range = get_table_int_opt(L, "range", 0);
|
||||||
dgn_align = dgnaligns2i[get_table_option(L, "alignment",
|
dgn_align = get_dgn_align(L);
|
||||||
"unaligned", dgnaligns)];
|
|
||||||
dgn_entry = get_table_int_opt(L, "entry", 0);
|
dgn_entry = get_table_int_opt(L, "entry", 0);
|
||||||
dgn_chance = get_table_int_opt(L, "chance", 100);
|
dgn_chance = get_table_int_opt(L, "chance", 100);
|
||||||
dgn_flags = get_dgn_flags(L);
|
dgn_flags = get_dgn_flags(L);
|
||||||
@@ -868,69 +945,7 @@ init_dungeons(void)
|
|||||||
/* levels begin */
|
/* levels begin */
|
||||||
lua_getfield(L, -1, "levels");
|
lua_getfield(L, -1, "levels");
|
||||||
if (lua_type(L, -1) == LUA_TTABLE) {
|
if (lua_type(L, -1) == LUA_TTABLE) {
|
||||||
char *lvl_name, *lvl_bonetag, *lvl_chain;
|
init_dungeon_levels(L, &pd, i);
|
||||||
int lvl_base, lvl_range, lvl_nlevels, lvl_chance,
|
|
||||||
lvl_align, lvl_flags;
|
|
||||||
struct tmplevel *tmpl;
|
|
||||||
int bi, f, nlevels;
|
|
||||||
|
|
||||||
lua_len(L, -1);
|
|
||||||
nlevels = (int) lua_tointeger(L, -1);
|
|
||||||
pd.tmpdungeon[i].levels = nlevels;
|
|
||||||
lua_pop(L, 1);
|
|
||||||
for (f = 0; f < nlevels; f++) {
|
|
||||||
lua_pushinteger(L, f + 1);
|
|
||||||
lua_gettable(L, -2);
|
|
||||||
if (lua_type(L, -1) == LUA_TTABLE) {
|
|
||||||
lvl_name = get_table_str(L, "name");
|
|
||||||
lvl_bonetag = get_table_str_opt(L, "bonetag", emptystr);
|
|
||||||
lvl_chain = get_table_str_opt(L, "chainlevel", NULL);
|
|
||||||
lvl_base = get_table_int(L, "base");
|
|
||||||
lvl_range = get_table_int_opt(L, "range", 0);
|
|
||||||
lvl_nlevels = get_table_int_opt(L, "nlevels", 0);
|
|
||||||
lvl_chance = get_table_int_opt(L, "chance", 100);
|
|
||||||
lvl_align = dgnaligns2i[get_table_option(L, "alignment",
|
|
||||||
"unaligned", dgnaligns)];
|
|
||||||
lvl_flags = get_dgn_flags(L);
|
|
||||||
/* array index is offset by cumulative number of levels
|
|
||||||
defined for preceding branches (iterations of 'while'
|
|
||||||
loop we're inside, not branch connections below) */
|
|
||||||
tmpl = &pd.tmplevel[pd.n_levs + f];
|
|
||||||
|
|
||||||
debugpline4("LEVEL[%i]:%s,(%i,%i)",
|
|
||||||
f, lvl_name, lvl_base, lvl_range);
|
|
||||||
tmpl->name = lvl_name;
|
|
||||||
tmpl->chainlvl = lvl_chain;
|
|
||||||
tmpl->lev.base = lvl_base;
|
|
||||||
tmpl->lev.rand = lvl_range;
|
|
||||||
tmpl->chance = lvl_chance;
|
|
||||||
tmpl->rndlevs = lvl_nlevels;
|
|
||||||
tmpl->flags = lvl_flags | lvl_align;
|
|
||||||
tmpl->boneschar = *lvl_bonetag ? *lvl_bonetag : 0;
|
|
||||||
free(lvl_bonetag);
|
|
||||||
tmpl->chain = -1;
|
|
||||||
if (lvl_chain) {
|
|
||||||
debugpline1("CHAINLEVEL: %s", lvl_chain);
|
|
||||||
for (bi = 0; bi < pd.n_levs + f; bi++) {
|
|
||||||
debugpline2("checking(%i):%s",
|
|
||||||
bi, pd.tmplevel[bi].name);
|
|
||||||
if (!strcmp(pd.tmplevel[bi].name, lvl_chain)) {
|
|
||||||
tmpl->chain = bi;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (tmpl->chain == -1)
|
|
||||||
panic("Could not chain level %s to %s",
|
|
||||||
lvl_name, lvl_chain);
|
|
||||||
/* free(lvl_chain); -- recorded in pd.tmplevel[] */
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
panic("dungeon[%i].levels[%i] is not a hash", i, f);
|
|
||||||
lua_pop(L, 1);
|
|
||||||
}
|
|
||||||
pd.n_levs += nlevels;
|
|
||||||
if (pd.n_levs > LEV_LIMIT)
|
|
||||||
panic("init_dungeon: too many special levels");
|
|
||||||
} else if (lua_type(L, -1) != LUA_TNIL)
|
} else if (lua_type(L, -1) != LUA_TNIL)
|
||||||
panic("dungeon[%i].levels is not an array of hashes", i);
|
panic("dungeon[%i].levels is not an array of hashes", i);
|
||||||
lua_pop(L, 1);
|
lua_pop(L, 1);
|
||||||
|
|||||||
Reference in New Issue
Block a user