Merge branch 'NetHack-3.6.2'
This commit is contained in:
@@ -286,6 +286,9 @@ while levitating inside a shop, throwing an unpaid item and having recoil move
|
||||
the shopkeeper and summon kops
|
||||
diluted potion of oil is less effective when filling lamps (adds less fuel)
|
||||
or burning (lasts less long) or exploding (inflicts less damage)
|
||||
apply fix from grunthack to prevent panic "fakecorr overflow" when vault guard
|
||||
couldn't figure out how to lead the hero from vault to civilization;
|
||||
fixes longstanding bug C343-23
|
||||
|
||||
|
||||
Fixes to Post-3.6.1 Problems that Were Exposed Via git Repository
|
||||
|
||||
@@ -405,6 +405,10 @@ typedef genericptr genericptr_t; /* (void *) or (char *) */
|
||||
#if __GNUC__ >= 3
|
||||
#define UNUSED __attribute__((unused))
|
||||
#define NORETURN __attribute__((noreturn))
|
||||
/* disable gcc's __attribute__((__warn_unused_result__)) since explicitly
|
||||
discarding the result by casting to (void) is not accepted as a 'use' */
|
||||
#define __warn_unused_result__ /*empty*/
|
||||
#define warn_unused_result /*empty*/
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
126
src/vault.c
126
src/vault.c
@@ -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> */
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
/* NetHack may be freely redistributed. See license for details. */
|
||||
|
||||
/*
|
||||
* System related functions for MSDOS, OS/2, TOS, and Windows NT
|
||||
* System related functions for MSDOS, OS/2, TOS
|
||||
*/
|
||||
|
||||
#define NEED_VARARGS
|
||||
@@ -28,7 +28,7 @@
|
||||
#define filesize filesize_nh
|
||||
#endif
|
||||
|
||||
#if defined(MICRO) || defined(WIN32) || defined(OS2)
|
||||
#if defined(MICRO) || defined(OS2)
|
||||
void FDECL(nethack_exit, (int));
|
||||
#else
|
||||
#define nethack_exit exit
|
||||
@@ -51,11 +51,7 @@ STATIC_DCL boolean NDECL(comspec_exists);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef WIN32
|
||||
extern int GUILaunched; /* from nttty.c */
|
||||
#endif
|
||||
|
||||
#if defined(MICRO) || defined(WIN32)
|
||||
#if defined(MICRO)
|
||||
|
||||
void
|
||||
flushout()
|
||||
@@ -391,7 +387,6 @@ char *name;
|
||||
return;
|
||||
}
|
||||
|
||||
#ifndef WIN32
|
||||
void
|
||||
getreturn(str)
|
||||
const char *str;
|
||||
@@ -420,7 +415,6 @@ VA_DECL(const char *, fmt)
|
||||
VA_END();
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Follow the PATH, trying to fopen the file.
|
||||
@@ -507,10 +501,8 @@ msexit()
|
||||
|
||||
flushout();
|
||||
#ifndef TOS
|
||||
#ifndef WIN32
|
||||
enable_ctrlP(); /* in case this wasn't done */
|
||||
#endif
|
||||
#endif
|
||||
#ifdef MFLOPPY
|
||||
if (ramdisk)
|
||||
copybones(TOPERM);
|
||||
@@ -526,18 +518,6 @@ msexit()
|
||||
if (colors_changed)
|
||||
restore_colors();
|
||||
#endif
|
||||
#endif
|
||||
#ifdef WIN32
|
||||
/* Only if we started from the GUI, not the command prompt,
|
||||
* we need to get one last return, so the score board does
|
||||
* not vanish instantly after being created.
|
||||
* GUILaunched is defined and set in nttty.c.
|
||||
*/
|
||||
synch_cursor();
|
||||
if (GUILaunched)
|
||||
getreturn("to end");
|
||||
synch_cursor();
|
||||
getreturn_enabled = TRUE;
|
||||
#endif
|
||||
wait_synch();
|
||||
return;
|
||||
|
||||
@@ -233,7 +233,7 @@ VOBJ24 = $(O)track.o $(O)trap.o $(O)u_init.o $(O)uhitm.o
|
||||
VOBJ25 = $(O)vault.o $(O)vis_tab.o $(O)vision.o $(O)weapon.o
|
||||
VOBJ26 = $(O)were.o $(O)wield.o $(O)windows.o $(O)wizard.o
|
||||
VOBJ27 = $(O)worm.o $(O)worn.o $(O)write.o $(O)zap.o
|
||||
VOBJ28 = $(O)win10.o $(O)safeproc.o $(O)windmain.o
|
||||
VOBJ28 =
|
||||
|
||||
DLBOBJ = $(O)dlb.o
|
||||
|
||||
@@ -248,7 +248,8 @@ CURSESOBJ= $(O)cursdial.o $(O)cursinit.o $(O)cursinvt.o $(O)cursmain.o \
|
||||
$(O)cursmesg.o $(O)cursmisc.o $(O)cursstat.o $(O)curswins.o
|
||||
!ENDIF
|
||||
|
||||
SOBJ = $(O)winnt.o $(O)pcsys.o $(SOUND) $(O)nhlan.o
|
||||
SOBJ = $(O)windmain.o $(O)winnt.o $(O)win10.o \
|
||||
$(O)safeproc.o $(O)nhlan.o $(SOUND)
|
||||
|
||||
OBJS = $(VOBJ01) $(VOBJ02) $(VOBJ03) $(VOBJ04) $(VOBJ05) \
|
||||
$(VOBJ06) $(VOBJ07) $(VOBJ08) $(VOBJ09) $(VOBJ10) \
|
||||
@@ -1511,8 +1512,6 @@ $(O)\curswins.c: $(WCURSES)\curswins.c $(WCURSES)\curswins.h $(INCL)\wincurs.h
|
||||
|
||||
$(O)tos.o: ..\sys\atari\tos.c $(HACK_H) $(INCL)\tcap.h
|
||||
@$(CC) $(cflagsBuild) -Fo$@ ..\sys\atari\tos.c
|
||||
$(O)pcsys.o: ..\sys\share\pcsys.c $(HACK_H)
|
||||
@$(CC) $(cflagsBuild) -Fo$@ ..\sys\share\pcsys.c
|
||||
$(O)pctty.o: ..\sys\share\pctty.c $(HACK_H)
|
||||
@$(CC) $(cflagsBuild) -Fo$@ ..\sys\share\pctty.c
|
||||
$(O)random.o: ..\sys\share\random.c $(HACK_H)
|
||||
|
||||
@@ -660,6 +660,26 @@ const char *window_opt;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Add a backslash to any name not ending in /, \ or : There must
|
||||
* be room for the \
|
||||
*/
|
||||
void
|
||||
append_slash(name)
|
||||
char *name;
|
||||
{
|
||||
char *ptr;
|
||||
|
||||
if (!*name)
|
||||
return;
|
||||
ptr = name + (strlen(name) - 1);
|
||||
if (*ptr != '\\' && *ptr != '/' && *ptr != ':') {
|
||||
*++ptr = '\\';
|
||||
*++ptr = '\0';
|
||||
}
|
||||
return;
|
||||
}
|
||||
#endif /* WIN32 */
|
||||
|
||||
/*winnt.c*/
|
||||
|
||||
@@ -151,7 +151,6 @@
|
||||
<ClCompile Include="$(SrcDir)zap.c" />
|
||||
<ClCompile Include="$(SysShareDir)cppregex.cpp" />
|
||||
<ClCompile Include="$(SysShareDir)nhlan.c" />
|
||||
<ClCompile Include="$(SysShareDir)pcsys.c" />
|
||||
<ClCompile Include="$(SysShareDir)random.c" />
|
||||
<ClCompile Include="$(SysWinntDir)ntsound.c" />
|
||||
<ClCompile Include="$(SysWinntDir)nttty.c" />
|
||||
|
||||
@@ -146,7 +146,6 @@
|
||||
<ClCompile Include="$(SrcDir)zap.c" />
|
||||
<ClCompile Include="$(SysShareDir)cppregex.cpp" />
|
||||
<ClCompile Include="$(SysShareDir)nhlan.c" />
|
||||
<ClCompile Include="$(SysShareDir)pcsys.c" />
|
||||
<ClCompile Include="$(SysShareDir)random.c" />
|
||||
<ClCompile Include="$(SysWinntDir)ntsound.c" />
|
||||
<ClCompile Include="$(SysWinntDir)stubs.c">
|
||||
|
||||
Reference in New Issue
Block a user