Merge branch 'NetHack-3.6.2'

This commit is contained in:
nhmall
2018-12-19 06:47:30 -05:00
8 changed files with 103 additions and 85 deletions

View File

@@ -1,17 +1,17 @@
/* NetHack 3.6 vault.c $NHDT-Date: 1544608469 2018/12/12 09:54:29 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.57 $ */
/* NetHack 3.6 vault.c $NHDT-Date: 1545217597 2018/12/19 11:06:37 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.58 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/*-Copyright (c) Robert Patrick Rankin, 2011. */
/* NetHack may be freely redistributed. See license for details. */
#include "hack.h"
STATIC_DCL struct monst *NDECL(findgd);
STATIC_DCL boolean FDECL(clear_fcorr, (struct monst *, BOOLEAN_P));
STATIC_DCL void FDECL(blackout, (int, int));
STATIC_DCL void FDECL(restfakecorr, (struct monst *));
STATIC_DCL void FDECL(parkguard, (struct monst *));
STATIC_DCL boolean FDECL(in_fcorridor, (struct monst *, int, int));
STATIC_DCL struct monst *NDECL(findgd);
STATIC_DCL boolean FDECL(find_guard_dest, (struct monst *, xchar *, xchar *));
STATIC_DCL void FDECL(move_gold, (struct obj *, int));
STATIC_DCL void FDECL(wallify_vault, (struct monst *));
STATIC_DCL void FDECL(gd_mv_monaway, (struct monst *, int, int));
@@ -232,6 +232,44 @@ char *array;
return '\0';
}
STATIC_OVL boolean
find_guard_dest(guard, rx, ry)
struct monst *guard;
xchar *rx, *ry;
{
register int x, y, dd, lx = 0, ly = 0;
for (dd = 2; (dd < ROWNO || dd < COLNO); dd++) {
for (y = u.uy - dd; y <= u.uy + dd; ly = y, y++) {
if (y < 0 || y > ROWNO - 1)
continue;
for (x = u.ux - dd; x <= u.ux + dd; lx = x, x++) {
if (y != u.uy - dd && y != u.uy + dd && x != u.ux - dd)
x = u.ux + dd;
if (x < 1 || x > COLNO - 1)
continue;
if (guard && ((x == guard->mx && y == guard->my)
|| (guard->isgd && in_fcorridor(guard, x, y))))
continue;
if (levl[x][y].typ == CORR) {
lx = (x < u.ux) ? x + 1 : (x > u.ux) ? x - 1 : x;
ly = (y < u.uy) ? y + 1 : (y > u.uy) ? y - 1 : y;
if (levl[lx][ly].typ != STONE && levl[lx][ly].typ != CORR)
goto incr_radius;
*rx = x;
*ry = y;
return TRUE;
}
}
}
incr_radius:
;
}
impossible("Not a single corridor on this level?");
tele();
return FALSE;
}
void
invault()
{
@@ -252,49 +290,14 @@ invault()
if (++u.uinvault % VAULT_GUARD_TIME == 0 && !guard) {
/* if time ok and no guard now. */
char buf[BUFSZ];
register int x, y, dd, gx, gy;
int lx = 0, ly = 0;
register int x, y, gx, gy;
xchar rx, ry;
long umoney;
/* first find the goal for the guard */
for (dd = 2; (dd < ROWNO || dd < COLNO); dd++) {
for (y = u.uy - dd; y <= u.uy + dd; ly = y, y++) {
if (y < 0 || y > ROWNO - 1)
continue;
for (x = u.ux - dd; x <= u.ux + dd; lx = x, x++) {
if (y != u.uy - dd && y != u.uy + dd && x != u.ux - dd)
x = u.ux + dd;
if (x < 1 || x > COLNO - 1)
continue;
if (levl[x][y].typ == CORR) {
if (x < u.ux)
lx = x + 1;
else if (x > u.ux)
lx = x - 1;
else
lx = x;
if (y < u.uy)
ly = y + 1;
else if (y > u.uy)
ly = y - 1;
else
ly = y;
if (levl[lx][ly].typ != STONE
&& levl[lx][ly].typ != CORR)
goto incr_radius;
goto fnd;
}
}
}
incr_radius:
;
}
impossible("Not a single corridor on this level??");
tele();
return;
fnd:
gx = x;
gy = y;
if (!find_guard_dest((struct monst *)0, &rx, &ry))
return;
gx = rx, gy = ry;
/* next find a good place for a door in the wall */
x = u.ux;
@@ -621,7 +624,7 @@ gd_move(grd)
register struct monst *grd;
{
int x, y, nx, ny, m, n;
int dx, dy, gx, gy, fci;
int dx, dy, gx = 0, gy = 0, fci;
uchar typ;
struct rm *crm;
struct fakecorridor *fcp;
@@ -705,7 +708,7 @@ register struct monst *grd;
levl[m][n].typ = egrd->fakecorr[0].ftyp;
newsym(m, n);
grd->mpeaceful = 0;
letknow:
letknow:
if (!cansee(grd->mx, grd->my) || !mon_visible(grd))
You_hear("%s.",
m_carrying(grd, TIN_WHISTLE)
@@ -848,10 +851,10 @@ register struct monst *grd;
goto proceed;
}
}
nextnxy:
nextnxy:
;
}
nextpos:
nextpos:
nx = x;
ny = y;
gx = egrd->gdx;
@@ -892,19 +895,30 @@ nextpos:
break;
}
crm->typ = CORR;
proceed:
proceed:
newspot = TRUE;
unblock_point(nx, ny); /* doesn't block light */
if (cansee(nx, ny))
newsym(nx, ny);
fcp = &(egrd->fakecorr[egrd->fcend]);
if (egrd->fcend++ == FCSIZ)
panic("fakecorr overflow");
fcp->fx = nx;
fcp->fy = ny;
fcp->ftyp = typ;
newpos:
if ((nx != gx || ny != gy) || (grd->mx != gx || grd->my != gy)) {
fcp = &(egrd->fakecorr[egrd->fcend]);
if (egrd->fcend++ == FCSIZ)
panic("fakecorr overflow");
fcp->fx = nx;
fcp->fy = ny;
fcp->ftyp = typ;
} else if (!egrd->gddone) {
/* We're stuck, so try to find a new destination. */
if (!find_guard_dest(grd, &egrd->gdx, &egrd->gdy)
|| (egrd->gdx == gx && egrd->gdy == gy)) {
pline("%s, confused, disappears.", Monnam(grd));
disappear_msg_seen = TRUE;
goto cleanup;
} else
goto nextpos;
}
newpos:
gd_mv_monaway(grd, nx, ny);
if (egrd->gddone) {
/* The following is a kludge. We need to keep */
@@ -916,7 +930,7 @@ newpos:
/* to avoid a check at the top of this function. */
/* At the end of the process, the guard is killed */
/* in restfakecorr(). */
cleanup:
cleanup:
x = grd->mx, y = grd->my;
see_guard = canspotmon(grd);
parkguard(grd); /* move to <0,0> */