]> granicus.if.org Git - nethack/commitdiff
Unify special level c code for stairways
authorPasi Kallinen <paxed@alt.org>
Thu, 19 Mar 2020 19:23:55 +0000 (21:23 +0200)
committerPasi Kallinen <paxed@alt.org>
Thu, 19 Mar 2020 19:23:55 +0000 (21:23 +0200)
src/sp_lev.c

index abaeb7656584435cbd4529daa2b91b4bb8619521..f371a9d514bf66f141a15d6e5cb97914a2d8341d 100755 (executable)
@@ -88,6 +88,7 @@ static void FDECL(sel_set_wallify, (int, int, genericptr_t));
 #endif
 static void NDECL(spo_end_moninvent);
 static void NDECL(spo_pop_container);
+static int FDECL(l_create_stairway, (lua_State *, BOOLEAN_P));
 static void FDECL(spo_endroom, (struct sp_coder *));
 static void FDECL(l_table_getset_feature_flag, (lua_State *, int, int, const char *, int));
 static void FDECL(sel_set_ter, (int, int, genericptr_t));
@@ -3738,24 +3739,17 @@ struct sp_coder *coder UNUSED;
     update_croom();
 }
 
-/* stair("up"); */
-/* stair({ dir = "down" }); */
-/* stair({ dir = "down", x = 4, y = 7 }); */
-/* stair({ dir = "down", coord = {x,y} }); */
-/* stair("down", 4, 7); */
-/* TODO: stair(selection, "down"); */
-/* TODO: stair("up", {x,y}); */
-int
-lspo_stair(L)
+static int
+l_create_stairway(L, ladder)
 lua_State *L;
+boolean ladder;
 {
+    static const char *const stairdirs[] = { "down", "up", NULL };
+    static const int stairdirs2i[] = { 0, 1 };
     int argc = lua_gettop(L);
     xchar x = -1, y = -1;
     struct trap *badtrap;
 
-    static const char *const stairdirs[] = { "down", "up", NULL };
-    static const int stairdirs2i[] = { 0, 1 };
-
     long scoord;
     int ax = -1, ay = -1;
     int up;
@@ -3771,9 +3765,7 @@ lua_State *L;
         ay = luaL_checkinteger(L, 3);
     } else {
         lcheck_param_table(L);
-
         get_table_xy_or_coord(L, &ax, &ay);
-
         up = stairdirs2i[get_table_option(L, "dir", "down", stairdirs)];
     }
 
@@ -3788,12 +3780,39 @@ lua_State *L;
     get_location_coord(&x, &y, DRY, g.coder->croom, scoord);
     if ((badtrap = t_at(x, y)) != 0)
         deltrap(badtrap);
-    mkstairs(x, y, (char) up, g.coder->croom);
     SpLev_Map[x][y] = 1;
 
+    if (ladder) {
+        levl[x][y].typ = LADDER;
+        if (up) {
+            xupladder = x;
+            yupladder = y;
+            levl[x][y].ladder = LA_UP;
+        } else {
+            xdnladder = x;
+            ydnladder = y;
+            levl[x][y].ladder = LA_DOWN;
+        }
+    } else {
+        mkstairs(x, y, (char) up, g.coder->croom);
+    }
     return 0;
 }
 
+/* stair("up"); */
+/* stair({ dir = "down" }); */
+/* stair({ dir = "down", x = 4, y = 7 }); */
+/* stair({ dir = "down", coord = {x,y} }); */
+/* stair("down", 4, 7); */
+/* TODO: stair(selection, "down"); */
+/* TODO: stair("up", {x,y}); */
+int
+lspo_stair(L)
+lua_State *L;
+{
+    return l_create_stairway(L, FALSE);
+}
+
 /* ladder("down"); */
 /* ladder("up", 6,10); */
 /* ladder({ x=11, y=05, dir="down" }); */
@@ -3801,58 +3820,7 @@ int
 lspo_ladder(L)
 lua_State *L;
 {
-    static const char *const stairdirs[] = { "down", "up", NULL };
-    static const int stairdirs2i[] = { 0, 1 };
-    int argc = lua_gettop(L);
-    xchar x = -1, y = -1;
-    struct trap *badtrap;
-
-    long scoord;
-    int ax = -1, ay = -1;
-    int up;
-    int ltype = lua_type(L, 1);
-
-    create_des_coder();
-
-    if (argc == 1 && ltype == LUA_TSTRING) {
-        up = stairdirs2i[luaL_checkoption(L, 1, "down", stairdirs)];
-    } else if (argc == 3 && ltype == LUA_TSTRING) {
-        up = stairdirs2i[luaL_checkoption(L, 1, "down", stairdirs)];
-        ax = luaL_checkinteger(L, 2);
-        ay = luaL_checkinteger(L, 3);
-    } else {
-        lcheck_param_table(L);
-
-        get_table_xy_or_coord(L, &ax, &ay);
-
-        up = stairdirs2i[get_table_option(L, "dir", "down", stairdirs)];
-    }
-
-    x = ax;
-    y = ay;
-
-    if (x == -1 && y == -1)
-        scoord = SP_COORD_PACK_RANDOM(0);
-    else
-        scoord = SP_COORD_PACK(ax, ay);
-
-    get_location_coord(&x, &y, DRY, g.coder->croom, scoord);
-
-    if ((badtrap = t_at(x, y)) != 0)
-        deltrap(badtrap);
-    levl[x][y].typ = LADDER;
-    SpLev_Map[x][y] = 1;
-    if (up) {
-        xupladder = x;
-        yupladder = y;
-        levl[x][y].ladder = LA_UP;
-    } else {
-        xdnladder = x;
-        ydnladder = y;
-        levl[x][y].ladder = LA_DOWN;
-    }
-
-    return 0;
+    return l_create_stairway(L, TRUE);
 }
 
 /* grave(); */