From: Pasi Kallinen Date: Sat, 12 Mar 2022 16:34:40 +0000 (+0200) Subject: Rolling boulder launch coordinates X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4be6fb0df989eed3789ce445c46d480321cfee94;p=nethack Rolling boulder launch coordinates Allow defining rolling boulder launching location in special level lua scripts: des.trap({ type="rolling boulder", coord={7, 5}, launchfrom={-2, -2} }); launchfrom is relative to the trap coord. --- diff --git a/doc/lua.adoc b/doc/lua.adoc index 9e1f71ef4..9b45c4419 100644 --- a/doc/lua.adoc +++ b/doc/lua.adoc @@ -741,13 +741,14 @@ Example: === trap -Create a trap. +Create a trap. The `launchfrom` is relative to the rolling boulder trap coord. Example: des.trap({ type = "hole", x = 1, y = 1 }); des.trap({ type = "hole", coord = {2, 2} }); des.trap({ type = "web", coord = {2, 2}, spider_on_web = false, seen = true }); + des.trap({ type = "rolling boulder", coord = {7, 5}, launchfrom = {-2, -2} }); des.trap("hole", 3, 4); des.trap("level teleport", {5, 8}); des.trap("rust") diff --git a/src/sp_lev.c b/src/sp_lev.c index 053bfcede..1073a4399 100644 --- a/src/sp_lev.c +++ b/src/sp_lev.c @@ -4123,6 +4123,16 @@ lspo_trap(lua_State *L) tmptrap.type = get_table_traptype_opt(L, "type", -1); tmptrap.spider_on_web = get_table_boolean_opt(L, "spider_on_web", 1); tmptrap.seen = get_table_boolean_opt(L, "seen", FALSE); + + lua_getfield(L, -1, "launchfrom"); + if (lua_type(L, -1) == LUA_TTABLE) { + int lx = -1, ly = -1; + + get_coord(L, -1, &lx, &ly); + lua_pop(L, 1); + g.launchplace.x = lx; + g.launchplace.y = ly; + } } if (tmptrap.type == NO_TRAP) @@ -4134,6 +4144,7 @@ lspo_trap(lua_State *L) tmptrap.coord = SP_COORD_PACK(x, y); create_trap(&tmptrap, g.coder->croom); + g.launchplace.x = g.launchplace.y = 0; return 0; } diff --git a/src/trap.c b/src/trap.c index e4a0ae63e..b49b6b83c 100644 --- a/src/trap.c +++ b/src/trap.c @@ -3030,6 +3030,14 @@ find_random_launch_coord(struct trap *ttmp, coord *cc) if (!ttmp || !cc) return FALSE; + bcc.x = ttmp->tx + g.launchplace.x; + bcc.y = ttmp->ty + g.launchplace.y; + if (isok(bcc.x, bcc.y) && linedup(ttmp->tx, ttmp->ty, bcc.x, bcc.y, 1)) { + cc->x = bcc.x; + cc->y = bcc.y; + return TRUE; + } + if (ttmp->ttyp == ROLLING_BOULDER_TRAP) mindist = 2; distance = rn1(5, 4); /* 4..8 away */