Lua tests: generation of each object
Test generation of every object, both via des.object and obj.new. Expose FIRST_OBJECT and LAST_OBJECT numbers to lua. Add lua nh.int_to_objname, a function to convert integer value to object base name and class. Allow creating new nethack lua object by specifying id and class.
This commit is contained in:
25
src/sp_lev.c
25
src/sp_lev.c
@@ -117,9 +117,7 @@ staticfn int find_montype(lua_State *, const char *, int *);
|
||||
staticfn int get_table_montype(lua_State *, int *);
|
||||
staticfn lua_Integer get_table_int_or_random(lua_State *, const char *, int);
|
||||
staticfn int get_table_buc(lua_State *);
|
||||
staticfn int get_table_objclass(lua_State *);
|
||||
staticfn int find_objtype(lua_State *, const char *);
|
||||
staticfn int get_table_objtype(lua_State *);
|
||||
staticfn int find_objtype(lua_State *, const char *, char);
|
||||
staticfn const char *get_mkroom_name(int) NONNULL;
|
||||
staticfn int get_table_roomtype_opt(lua_State *, const char *, int);
|
||||
staticfn int get_table_traptype_opt(lua_State *, const char *, int);
|
||||
@@ -3443,7 +3441,7 @@ get_table_buc(lua_State *L)
|
||||
return curse_state;
|
||||
}
|
||||
|
||||
staticfn int
|
||||
int
|
||||
get_table_objclass(lua_State *L)
|
||||
{
|
||||
char *s = get_table_str_opt(L, "class", NULL);
|
||||
@@ -3455,13 +3453,14 @@ get_table_objclass(lua_State *L)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* find object otyp by text s (optionally considering oclass) */
|
||||
staticfn int
|
||||
find_objtype(lua_State *L, const char *s)
|
||||
find_objtype(lua_State *L, const char *s, char oclass)
|
||||
{
|
||||
if (s && *s) {
|
||||
int i;
|
||||
const char *objname;
|
||||
char class = 0;
|
||||
char class = def_char_to_objclass(oclass);
|
||||
|
||||
/* In objects.h, some item classes are defined without prefixes
|
||||
(such as "scroll of ") in their names, making some names (such
|
||||
@@ -3479,6 +3478,9 @@ find_objtype(lua_State *L, const char *s)
|
||||
{ NULL, 0 }
|
||||
};
|
||||
|
||||
if (class == MAXOCLASSES)
|
||||
class = 0;
|
||||
|
||||
if (strstri(s, " of ")) {
|
||||
for (i = 0; class_prefixes[i].prefix; i++) {
|
||||
const char *p = class_prefixes[i].prefix;
|
||||
@@ -3523,11 +3525,12 @@ find_objtype(lua_State *L, const char *s)
|
||||
return STRANGE_OBJECT;
|
||||
}
|
||||
|
||||
staticfn int
|
||||
int
|
||||
get_table_objtype(lua_State *L)
|
||||
{
|
||||
char *s = get_table_str_opt(L, "id", NULL);
|
||||
int ret = find_objtype(L, s);
|
||||
char oclass = get_table_objclass(L);
|
||||
int ret = find_objtype(L, s, oclass);
|
||||
|
||||
Free(s);
|
||||
return ret;
|
||||
@@ -3586,7 +3589,7 @@ lspo_object(lua_State *L)
|
||||
tmpobj.id = STRANGE_OBJECT;
|
||||
} else {
|
||||
tmpobj.class = -1;
|
||||
tmpobj.id = find_objtype(L, paramstr);
|
||||
tmpobj.id = find_objtype(L, paramstr, -1);
|
||||
}
|
||||
} else if (argc == 2 && lua_type(L, 1) == LUA_TSTRING
|
||||
&& lua_type(L, 2) == LUA_TTABLE) {
|
||||
@@ -3599,7 +3602,7 @@ lspo_object(lua_State *L)
|
||||
tmpobj.id = STRANGE_OBJECT;
|
||||
} else {
|
||||
tmpobj.class = -1;
|
||||
tmpobj.id = find_objtype(L, paramstr);
|
||||
tmpobj.id = find_objtype(L, paramstr, -1);
|
||||
}
|
||||
} else if (argc == 3 && lua_type(L, 2) == LUA_TNUMBER
|
||||
&& lua_type(L, 3) == LUA_TNUMBER) {
|
||||
@@ -3613,7 +3616,7 @@ lspo_object(lua_State *L)
|
||||
tmpobj.id = STRANGE_OBJECT;
|
||||
} else {
|
||||
tmpobj.class = -1;
|
||||
tmpobj.id = find_objtype(L, paramstr);
|
||||
tmpobj.id = find_objtype(L, paramstr, -1);
|
||||
}
|
||||
} else {
|
||||
lcheck_param_table(L);
|
||||
|
||||
Reference in New Issue
Block a user