Merge branch 'NetHack-3.6.2'
This commit is contained in:
+1
-1
@@ -174,7 +174,7 @@ E boolean NDECL(status_hilite_menu);
|
|||||||
/* ### cmd.c ### */
|
/* ### cmd.c ### */
|
||||||
|
|
||||||
E char NDECL(randomkey);
|
E char NDECL(randomkey);
|
||||||
E void FDECL(random_response, (char * buf, int size));
|
E void FDECL(random_response, (char *, int));
|
||||||
E int NDECL(doconduct);
|
E int NDECL(doconduct);
|
||||||
E int NDECL(domonability);
|
E int NDECL(domonability);
|
||||||
E char FDECL(cmd_from_func, (int NDECL((*))));
|
E char FDECL(cmd_from_func, (int NDECL((*))));
|
||||||
|
|||||||
+38
-21
@@ -1,4 +1,4 @@
|
|||||||
/* NetHack 3.6 uhitm.c $NHDT-Date: 1543892215 2018/12/04 02:56:55 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.195 $ */
|
/* NetHack 3.6 uhitm.c $NHDT-Date: 1544840256 2018/12/15 02:17:36 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.196 $ */
|
||||||
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
|
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
|
||||||
/*-Copyright (c) Robert Patrick Rankin, 2012. */
|
/*-Copyright (c) Robert Patrick Rankin, 2012. */
|
||||||
/* NetHack may be freely redistributed. See license for details. */
|
/* NetHack may be freely redistributed. See license for details. */
|
||||||
@@ -101,7 +101,7 @@ attack_checks(mtmp, wep)
|
|||||||
register struct monst *mtmp;
|
register struct monst *mtmp;
|
||||||
struct obj *wep; /* uwep for attack(), null for kick_monster() */
|
struct obj *wep; /* uwep for attack(), null for kick_monster() */
|
||||||
{
|
{
|
||||||
char qbuf[QBUFSZ];
|
int glyph;
|
||||||
|
|
||||||
/* if you're close enough to attack, alert any waiting monster */
|
/* if you're close enough to attack, alert any waiting monster */
|
||||||
mtmp->mstrategy &= ~STRAT_WAITMASK;
|
mtmp->mstrategy &= ~STRAT_WAITMASK;
|
||||||
@@ -124,6 +124,12 @@ struct obj *wep; /* uwep for attack(), null for kick_monster() */
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* cache the shown glyph;
|
||||||
|
cases which might change it (by placing or removing
|
||||||
|
'rembered, unseen monster' glyph or revealing a mimic)
|
||||||
|
always return without further reference to this */
|
||||||
|
glyph = glyph_at(bhitpos.x, bhitpos.y);
|
||||||
|
|
||||||
/* Put up an invisible monster marker, but with exceptions for
|
/* Put up an invisible monster marker, but with exceptions for
|
||||||
* monsters that hide and monsters you've been warned about.
|
* monsters that hide and monsters you've been warned about.
|
||||||
* The former already prints a warning message and
|
* The former already prints a warning message and
|
||||||
@@ -132,8 +138,8 @@ struct obj *wep; /* uwep for attack(), null for kick_monster() */
|
|||||||
* happening two turns in a row. The latter shows a glyph on
|
* happening two turns in a row. The latter shows a glyph on
|
||||||
* the screen, so you know something is there.
|
* the screen, so you know something is there.
|
||||||
*/
|
*/
|
||||||
if (!canspotmon(mtmp) && !glyph_is_warning(glyph_at(bhitpos.x, bhitpos.y))
|
if (!canspotmon(mtmp)
|
||||||
&& !glyph_is_invisible(levl[bhitpos.x][bhitpos.y].glyph)
|
&& !glyph_is_warning(glyph) && !glyph_is_invisible(glyph)
|
||||||
&& !(!Blind && mtmp->mundetected && hides_under(mtmp->data))) {
|
&& !(!Blind && mtmp->mundetected && hides_under(mtmp->data))) {
|
||||||
pline("Wait! There's %s there you can't see!", something);
|
pline("Wait! There's %s there you can't see!", something);
|
||||||
map_invisible(bhitpos.x, bhitpos.y);
|
map_invisible(bhitpos.x, bhitpos.y);
|
||||||
@@ -146,17 +152,23 @@ struct obj *wep; /* uwep for attack(), null for kick_monster() */
|
|||||||
if (!u.ustuck && !mtmp->mflee && dmgtype(mtmp->data, AD_STCK))
|
if (!u.ustuck && !mtmp->mflee && dmgtype(mtmp->data, AD_STCK))
|
||||||
u.ustuck = mtmp;
|
u.ustuck = mtmp;
|
||||||
}
|
}
|
||||||
|
/* #H7329 - if hero is on engraved "Elbereth", this will end up
|
||||||
|
* assessing an alignment penalty and removing the engraving
|
||||||
|
* even though no attack actually occurs. Since it also angers
|
||||||
|
* peacefuls, we're operating as if an attack attempt did occur
|
||||||
|
* and the Elbereth behavior is consistent.
|
||||||
|
*/
|
||||||
wakeup(mtmp, TRUE); /* always necessary; also un-mimics mimics */
|
wakeup(mtmp, TRUE); /* always necessary; also un-mimics mimics */
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mtmp->m_ap_type && !Protection_from_shape_changers && !sensemon(mtmp)
|
if (mtmp->m_ap_type && !Protection_from_shape_changers && !sensemon(mtmp)
|
||||||
&& !glyph_is_warning(glyph_at(bhitpos.x, bhitpos.y))) {
|
&& !glyph_is_warning(glyph)) {
|
||||||
/* If a hidden mimic was in a square where a player remembers
|
/* If a hidden mimic was in a square where a player remembers
|
||||||
* some (probably different) unseen monster, the player is in
|
* some (probably different) unseen monster, the player is in
|
||||||
* luck--he attacks it even though it's hidden.
|
* luck--he attacks it even though it's hidden.
|
||||||
*/
|
*/
|
||||||
if (glyph_is_invisible(levl[mtmp->mx][mtmp->my].glyph)) {
|
if (glyph_is_invisible(glyph)) {
|
||||||
seemimic(mtmp);
|
seemimic(mtmp);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
@@ -165,11 +177,11 @@ struct obj *wep; /* uwep for attack(), null for kick_monster() */
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (mtmp->mundetected && !canseemon(mtmp)
|
if (mtmp->mundetected && !canseemon(mtmp)
|
||||||
&& !glyph_is_warning(glyph_at(bhitpos.x, bhitpos.y))
|
&& !glyph_is_warning(glyph)
|
||||||
&& (hides_under(mtmp->data) || mtmp->data->mlet == S_EEL)) {
|
&& (hides_under(mtmp->data) || mtmp->data->mlet == S_EEL)) {
|
||||||
mtmp->mundetected = mtmp->msleeping = 0;
|
mtmp->mundetected = mtmp->msleeping = 0;
|
||||||
newsym(mtmp->mx, mtmp->my);
|
newsym(mtmp->mx, mtmp->my);
|
||||||
if (glyph_is_invisible(levl[mtmp->mx][mtmp->my].glyph)) {
|
if (glyph_is_invisible(glyph)) {
|
||||||
seemimic(mtmp);
|
seemimic(mtmp);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
@@ -197,14 +209,16 @@ struct obj *wep; /* uwep for attack(), null for kick_monster() */
|
|||||||
wakeup(mtmp, TRUE);
|
wakeup(mtmp, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (flags.confirm && mtmp->mpeaceful && !Confusion && !Hallucination
|
if (flags.confirm && mtmp->mpeaceful
|
||||||
&& !Stunned) {
|
&& !Confusion && !Hallucination && !Stunned) {
|
||||||
/* Intelligent chaotic weapons (Stormbringer) want blood */
|
/* Intelligent chaotic weapons (Stormbringer) want blood */
|
||||||
if (wep && wep->oartifact == ART_STORMBRINGER) {
|
if (wep && wep->oartifact == ART_STORMBRINGER) {
|
||||||
override_confirmation = TRUE;
|
override_confirmation = TRUE;
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
if (canspotmon(mtmp)) {
|
if (canspotmon(mtmp)) {
|
||||||
|
char qbuf[QBUFSZ];
|
||||||
|
|
||||||
Sprintf(qbuf, "Really attack %s?", mon_nam(mtmp));
|
Sprintf(qbuf, "Really attack %s?", mon_nam(mtmp));
|
||||||
if (!paranoid_query(ParanoidHit, qbuf)) {
|
if (!paranoid_query(ParanoidHit, qbuf)) {
|
||||||
context.move = 0;
|
context.move = 0;
|
||||||
@@ -329,23 +343,26 @@ register struct monst *mtmp;
|
|||||||
/* Intelligent chaotic weapons (Stormbringer) want blood */
|
/* Intelligent chaotic weapons (Stormbringer) want blood */
|
||||||
if (is_safepet(mtmp) && !context.forcefight) {
|
if (is_safepet(mtmp) && !context.forcefight) {
|
||||||
if (!uwep || uwep->oartifact != ART_STORMBRINGER) {
|
if (!uwep || uwep->oartifact != ART_STORMBRINGER) {
|
||||||
/* there are some additional considerations: this won't work
|
/* There are some additional considerations: this won't work
|
||||||
* if in a shop or Punished or you miss a random roll or
|
* if in a shop or Punished or you miss a random roll or
|
||||||
* if you can walk thru walls and your pet cannot (KAA) or
|
* if you can walk thru walls and your pet cannot (KAA) or
|
||||||
* if your pet is a long worm (unless someone does better).
|
* if your pet is a long worm with a tail.
|
||||||
* there's also a chance of displacing a "frozen" monster.
|
* There's also a chance of displacing a "frozen" monster:
|
||||||
* sleeping monsters might magically walk in their sleep.
|
* sleeping monsters might magically walk in their sleep.
|
||||||
*/
|
*/
|
||||||
boolean foo = (Punished || !rn2(7) || is_longworm(mtmp->data)),
|
boolean foo = (Punished || !rn2(7)
|
||||||
|
|| (is_longworm(mtmp->data) && mtmp->wormno)),
|
||||||
inshop = FALSE;
|
inshop = FALSE;
|
||||||
char *p;
|
char *p;
|
||||||
|
|
||||||
for (p = in_rooms(mtmp->mx, mtmp->my, SHOPBASE); *p; p++)
|
/* only check for in-shop if don't already have reason to stop */
|
||||||
if (tended_shop(&rooms[*p - ROOMOFFSET])) {
|
if (!foo) {
|
||||||
inshop = TRUE;
|
for (p = in_rooms(mtmp->mx, mtmp->my, SHOPBASE); *p; p++)
|
||||||
break;
|
if (tended_shop(&rooms[*p - ROOMOFFSET])) {
|
||||||
}
|
inshop = TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (inshop || foo || (IS_ROCK(levl[u.ux][u.uy].typ)
|
if (inshop || foo || (IS_ROCK(levl[u.ux][u.uy].typ)
|
||||||
&& !passes_walls(mtmp->data))) {
|
&& !passes_walls(mtmp->data))) {
|
||||||
char buf[BUFSZ];
|
char buf[BUFSZ];
|
||||||
@@ -895,7 +912,7 @@ int dieroll;
|
|||||||
if (resists_ston(mon))
|
if (resists_ston(mon))
|
||||||
break;
|
break;
|
||||||
/* note: hp may be <= 0 even if munstoned==TRUE */
|
/* note: hp may be <= 0 even if munstoned==TRUE */
|
||||||
return (boolean) (!DEADMONSTER(mon));
|
return (boolean) !DEADMONSTER(mon);
|
||||||
#if 0
|
#if 0
|
||||||
} else if (touch_petrifies(mdat)) {
|
} else if (touch_petrifies(mdat)) {
|
||||||
; /* maybe turn the corpse into a statue? */
|
; /* maybe turn the corpse into a statue? */
|
||||||
|
|||||||
@@ -3942,7 +3942,7 @@ break;
|
|||||||
case 240:
|
case 240:
|
||||||
{
|
{
|
||||||
add_opvars(splev, "ii",
|
add_opvars(splev, "ii",
|
||||||
VA_PASS2((int) 1, SP_O_V_TRAPPED));
|
VA_PASS2((int) (yyvsp[0].i), SP_O_V_TRAPPED));
|
||||||
yyval.i = 0x0400;
|
yyval.i = 0x0400;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|||||||
+5
-38
@@ -9,15 +9,15 @@
|
|||||||
#include "wintty.h"
|
#include "wintty.h"
|
||||||
|
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#if defined(WIN32) || defined(MSDOS)
|
#if defined(MSDOS)
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(WIN32) || defined(MSDOS)
|
#if defined(MSDOS)
|
||||||
extern char orgdir[];
|
extern char orgdir[];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(WIN32) && defined(TTY_GRAPHICS)
|
#if defined(TTY_GRAPHICS)
|
||||||
extern void NDECL(backsp);
|
extern void NDECL(backsp);
|
||||||
extern void NDECL(clear_screen);
|
extern void NDECL(clear_screen);
|
||||||
#endif
|
#endif
|
||||||
@@ -49,7 +49,7 @@ int fd;
|
|||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
#if (defined(MICRO) || defined(WIN32)) && !defined(NO_FSTAT)
|
#if (defined(MICRO)) && !defined(NO_FSTAT)
|
||||||
if(fstat(fd, &buf)) {
|
if(fstat(fd, &buf)) {
|
||||||
if(moves > 1) pline("Cannot get status of saved level? ");
|
if(moves > 1) pline("Cannot get status of saved level? ");
|
||||||
else pline("Cannot get status of saved game.");
|
else pline("Cannot get status of saved game.");
|
||||||
@@ -126,28 +126,7 @@ getlock()
|
|||||||
#if defined(CHDIR) && !defined(NOCWD_ASSUMPTIONS)
|
#if defined(CHDIR) && !defined(NOCWD_ASSUMPTIONS)
|
||||||
chdirx(orgdir, 0);
|
chdirx(orgdir, 0);
|
||||||
#endif
|
#endif
|
||||||
#if defined(WIN32) || defined(HOLD_LOCKFILE_OPEN)
|
|
||||||
#if defined(HOLD_LOCKFILE_OPEN)
|
|
||||||
if (errno == EACCES) {
|
|
||||||
#define OOPS_BUFSZ 512
|
|
||||||
char oops[OOPS_BUFSZ];
|
|
||||||
Strcpy(
|
|
||||||
oops,
|
|
||||||
"\nThere are files from a game in progress under your name.");
|
|
||||||
Strcat(oops, "\nThe files are locked or inaccessible.");
|
|
||||||
Strcat(oops, " Is the other game still running?\n");
|
|
||||||
if (strlen(fq_lock) < ((OOPS_BUFSZ - 16) - strlen(oops)))
|
|
||||||
Sprintf(eos(oops), "Cannot open %s", fq_lock);
|
|
||||||
Strcat(oops, "\n");
|
|
||||||
unlock_file(HLOCK);
|
|
||||||
error(oops);
|
|
||||||
} else
|
|
||||||
#endif
|
|
||||||
error("Bad directory or name: %s\n%s\n", fq_lock,
|
|
||||||
strerror(errno));
|
|
||||||
#else
|
|
||||||
perror(fq_lock);
|
perror(fq_lock);
|
||||||
#endif
|
|
||||||
unlock_file(HLOCK);
|
unlock_file(HLOCK);
|
||||||
error("Cannot open %s", fq_lock);
|
error("Cannot open %s", fq_lock);
|
||||||
}
|
}
|
||||||
@@ -197,10 +176,6 @@ getlock()
|
|||||||
if (c == 'y' || c == 'Y')
|
if (c == 'y' || c == 'Y')
|
||||||
#ifndef SELF_RECOVER
|
#ifndef SELF_RECOVER
|
||||||
if (eraseoldlocks()) {
|
if (eraseoldlocks()) {
|
||||||
#if defined(WIN32) && defined(TTY_GRAPHICS)
|
|
||||||
if (WINDOWPORT("tty"))
|
|
||||||
clear_screen(); /* display gets fouled up otherwise */
|
|
||||||
#endif
|
|
||||||
goto gotlock;
|
goto gotlock;
|
||||||
} else {
|
} else {
|
||||||
unlock_file(HLOCK);
|
unlock_file(HLOCK);
|
||||||
@@ -211,7 +186,7 @@ getlock()
|
|||||||
}
|
}
|
||||||
#else /*SELF_RECOVER*/
|
#else /*SELF_RECOVER*/
|
||||||
if (recover_savefile()) {
|
if (recover_savefile()) {
|
||||||
#if defined(WIN32) && defined(TTY_GRAPHICS)
|
#if defined(TTY_GRAPHICS)
|
||||||
if (WINDOWPORT("tty"))
|
if (WINDOWPORT("tty"))
|
||||||
clear_screen(); /* display gets fouled up otherwise */
|
clear_screen(); /* display gets fouled up otherwise */
|
||||||
#endif
|
#endif
|
||||||
@@ -241,13 +216,7 @@ gotlock:
|
|||||||
#if defined(CHDIR) && !defined(NOCWD_ASSUMPTIONS)
|
#if defined(CHDIR) && !defined(NOCWD_ASSUMPTIONS)
|
||||||
chdirx(orgdir, 0);
|
chdirx(orgdir, 0);
|
||||||
#endif
|
#endif
|
||||||
#if defined(WIN32)
|
|
||||||
error("cannot creat file (%s.)\n%s\n%s\"%s\" exists?\n", fq_lock,
|
|
||||||
strerror(ern), " Are you sure that the directory",
|
|
||||||
fqn_prefix[LEVELPREFIX]);
|
|
||||||
#else
|
|
||||||
error("cannot creat file (%s.)", fq_lock);
|
error("cannot creat file (%s.)", fq_lock);
|
||||||
#endif
|
|
||||||
} else {
|
} else {
|
||||||
if (write(fd, (char *) &hackpid, sizeof(hackpid))
|
if (write(fd, (char *) &hackpid, sizeof(hackpid))
|
||||||
!= sizeof(hackpid)) {
|
!= sizeof(hackpid)) {
|
||||||
@@ -270,7 +239,6 @@ gotlock:
|
|||||||
}
|
}
|
||||||
#endif /* PC_LOCKING */
|
#endif /* PC_LOCKING */
|
||||||
|
|
||||||
#ifndef WIN32
|
|
||||||
void
|
void
|
||||||
regularize(s)
|
regularize(s)
|
||||||
/*
|
/*
|
||||||
@@ -290,7 +258,6 @@ register char *s;
|
|||||||
*lp == '|' || *lp >= 127 || (*lp >= '[' && *lp <= ']'))
|
*lp == '|' || *lp >= 127 || (*lp >= '[' && *lp <= ']'))
|
||||||
*lp = '_';
|
*lp = '_';
|
||||||
}
|
}
|
||||||
#endif /* WIN32 */
|
|
||||||
|
|
||||||
#ifdef __EMX__
|
#ifdef __EMX__
|
||||||
void
|
void
|
||||||
|
|||||||
@@ -248,8 +248,7 @@ 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
|
$(O)cursmesg.o $(O)cursmisc.o $(O)cursstat.o $(O)curswins.o
|
||||||
!ENDIF
|
!ENDIF
|
||||||
|
|
||||||
SOBJ = $(O)winnt.o $(O)pcsys.o $(O)pcunix.o \
|
SOBJ = $(O)winnt.o $(O)pcsys.o $(SOUND) $(O)nhlan.o
|
||||||
$(SOUND) $(O)nhlan.o
|
|
||||||
|
|
||||||
OBJS = $(VOBJ01) $(VOBJ02) $(VOBJ03) $(VOBJ04) $(VOBJ05) \
|
OBJS = $(VOBJ01) $(VOBJ02) $(VOBJ03) $(VOBJ04) $(VOBJ05) \
|
||||||
$(VOBJ06) $(VOBJ07) $(VOBJ08) $(VOBJ09) $(VOBJ10) \
|
$(VOBJ06) $(VOBJ07) $(VOBJ08) $(VOBJ09) $(VOBJ10) \
|
||||||
@@ -1511,14 +1510,10 @@ $(O)\curswins.c: $(WCURSES)\curswins.c $(WCURSES)\curswins.h $(INCL)\wincurs.h
|
|||||||
|
|
||||||
$(O)tos.o: ..\sys\atari\tos.c $(HACK_H) $(INCL)\tcap.h
|
$(O)tos.o: ..\sys\atari\tos.c $(HACK_H) $(INCL)\tcap.h
|
||||||
@$(CC) $(cflagsBuild) -Fo$@ ..\sys\atari\tos.c
|
@$(CC) $(cflagsBuild) -Fo$@ ..\sys\atari\tos.c
|
||||||
$(O)pcmain.o: ..\sys\share\pcmain.c $(HACK_H) $(INCL)\dlb.h
|
|
||||||
@$(CC) $(cflagsBuild) -Fo$@ ..\sys\share\pcmain.c
|
|
||||||
$(O)pcsys.o: ..\sys\share\pcsys.c $(HACK_H)
|
$(O)pcsys.o: ..\sys\share\pcsys.c $(HACK_H)
|
||||||
@$(CC) $(cflagsBuild) -Fo$@ ..\sys\share\pcsys.c
|
@$(CC) $(cflagsBuild) -Fo$@ ..\sys\share\pcsys.c
|
||||||
$(O)pctty.o: ..\sys\share\pctty.c $(HACK_H)
|
$(O)pctty.o: ..\sys\share\pctty.c $(HACK_H)
|
||||||
@$(CC) $(cflagsBuild) -Fo$@ ..\sys\share\pctty.c
|
@$(CC) $(cflagsBuild) -Fo$@ ..\sys\share\pctty.c
|
||||||
$(O)pcunix.o: ..\sys\share\pcunix.c $(HACK_H)
|
|
||||||
@$(CC) $(cflagsBuild) -Fo$@ ..\sys\share\pcunix.c
|
|
||||||
$(O)random.o: ..\sys\share\random.c $(HACK_H)
|
$(O)random.o: ..\sys\share\random.c $(HACK_H)
|
||||||
@$(CC) $(cflagsBuild) -Fo$@ ..\sys\share\random.c
|
@$(CC) $(cflagsBuild) -Fo$@ ..\sys\share\random.c
|
||||||
$(O)ioctl.o: ..\sys\share\ioctl.c $(HACK_H) $(INCL)\tcap.h
|
$(O)ioctl.o: ..\sys\share\ioctl.c $(HACK_H) $(INCL)\tcap.h
|
||||||
|
|||||||
+198
-1
@@ -9,6 +9,11 @@
|
|||||||
#include "dlb.h"
|
#include "dlb.h"
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <sys\stat.h>
|
#include <sys\stat.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
#include "wintty.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#if !defined(SAFEPROCS)
|
#if !defined(SAFEPROCS)
|
||||||
#error You must #define SAFEPROCS to build windmain.c
|
#error You must #define SAFEPROCS to build windmain.c
|
||||||
@@ -26,8 +31,15 @@ E char chosen_windowtype[WINTYPELEN]; /* flag.h */
|
|||||||
#if defined(MSWIN_GRAPHICS)
|
#if defined(MSWIN_GRAPHICS)
|
||||||
E void NDECL(mswin_destroy_reg);
|
E void NDECL(mswin_destroy_reg);
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef TTY_GRAPHICS
|
||||||
|
extern void NDECL(backsp);
|
||||||
|
extern void NDECL(clear_screen);
|
||||||
|
#endif
|
||||||
#undef E
|
#undef E
|
||||||
|
|
||||||
|
#ifdef PC_LOCKING
|
||||||
|
static int NDECL(eraseoldlocks);
|
||||||
|
#endif
|
||||||
int NDECL(windows_nhgetch);
|
int NDECL(windows_nhgetch);
|
||||||
void NDECL(windows_nhbell);
|
void NDECL(windows_nhbell);
|
||||||
int FDECL(windows_nh_poskey, (int *, int *, int *));
|
int FDECL(windows_nh_poskey, (int *, int *, int *));
|
||||||
@@ -45,6 +57,14 @@ HANDLE hStdOut;
|
|||||||
#if defined(MSWIN_GRAPHICS)
|
#if defined(MSWIN_GRAPHICS)
|
||||||
char default_window_sys[] = "mswin";
|
char default_window_sys[] = "mswin";
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef WANT_GETHDATE
|
||||||
|
static struct stat hbuf;
|
||||||
|
#endif
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#if defined(WIN32) || defined(MSDOS)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern char orgdir[];
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* __MINGW32__ Note
|
* __MINGW32__ Note
|
||||||
@@ -724,4 +744,181 @@ char *outbuf;
|
|||||||
Strcpy(outbuf, "\033");
|
Strcpy(outbuf, "\033");
|
||||||
}
|
}
|
||||||
|
|
||||||
/*pcmain.c*/
|
#ifdef PC_LOCKING
|
||||||
|
static int
|
||||||
|
eraseoldlocks()
|
||||||
|
{
|
||||||
|
register int i;
|
||||||
|
|
||||||
|
/* cannot use maxledgerno() here, because we need to find a lock name
|
||||||
|
* before starting everything (including the dungeon initialization
|
||||||
|
* that sets astral_level, needed for maxledgerno()) up
|
||||||
|
*/
|
||||||
|
for (i = 1; i <= MAXDUNGEON * MAXLEVEL + 1; i++) {
|
||||||
|
/* try to remove all */
|
||||||
|
set_levelfile_name(lock, i);
|
||||||
|
(void) unlink(fqname(lock, LEVELPREFIX, 0));
|
||||||
|
}
|
||||||
|
set_levelfile_name(lock, 0);
|
||||||
|
#ifdef HOLD_LOCKFILE_OPEN
|
||||||
|
really_close();
|
||||||
|
#endif
|
||||||
|
if (unlink(fqname(lock, LEVELPREFIX, 0)))
|
||||||
|
return 0; /* cannot remove it */
|
||||||
|
return (1); /* success! */
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
getlock()
|
||||||
|
{
|
||||||
|
register int fd, c, ci, ct, ern;
|
||||||
|
int fcmask = FCMASK;
|
||||||
|
char tbuf[BUFSZ];
|
||||||
|
const char *fq_lock;
|
||||||
|
#define OOPS_BUFSZ 512
|
||||||
|
char oops[OOPS_BUFSZ];
|
||||||
|
|
||||||
|
/* we ignore QUIT and INT at this point */
|
||||||
|
if (!lock_file(HLOCK, LOCKPREFIX, 10)) {
|
||||||
|
wait_synch();
|
||||||
|
#if defined(CHDIR) && !defined(NOCWD_ASSUMPTIONS)
|
||||||
|
chdirx(orgdir, 0);
|
||||||
|
#endif
|
||||||
|
error("Quitting.");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* regularize(lock); */ /* already done in pcmain */
|
||||||
|
Sprintf(tbuf, "%s", fqname(lock, LEVELPREFIX, 0));
|
||||||
|
set_levelfile_name(lock, 0);
|
||||||
|
fq_lock = fqname(lock, LEVELPREFIX, 1);
|
||||||
|
if ((fd = open(fq_lock, 0)) == -1) {
|
||||||
|
if (errno == ENOENT)
|
||||||
|
goto gotlock; /* no such file */
|
||||||
|
#if defined(CHDIR) && !defined(NOCWD_ASSUMPTIONS)
|
||||||
|
chdirx(orgdir, 0);
|
||||||
|
#endif
|
||||||
|
#if defined(HOLD_LOCKFILE_OPEN)
|
||||||
|
if (errno == EACCES) {
|
||||||
|
Strcpy(
|
||||||
|
oops,
|
||||||
|
"\nThere are files from a game in progress under your name.");
|
||||||
|
Strcat(oops, "\nThe files are locked or inaccessible.");
|
||||||
|
Strcat(oops, " Is the other game still running?\n");
|
||||||
|
if (strlen(fq_lock) < ((OOPS_BUFSZ - 16) - strlen(oops)))
|
||||||
|
Sprintf(eos(oops), "Cannot open %s", fq_lock);
|
||||||
|
Strcat(oops, "\n");
|
||||||
|
unlock_file(HLOCK);
|
||||||
|
raw_print(oops);
|
||||||
|
} else
|
||||||
|
#endif
|
||||||
|
error("Bad directory or name: %s\n%s\n", fq_lock,
|
||||||
|
strerror(errno));
|
||||||
|
unlock_file(HLOCK);
|
||||||
|
Sprintf(oops, "Cannot open %s", fq_lock);
|
||||||
|
raw_print(oops);
|
||||||
|
nethack_exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
(void) nhclose(fd);
|
||||||
|
|
||||||
|
if (iflags.window_inited || WINDOWPORT("curses")) {
|
||||||
|
#ifdef SELF_RECOVER
|
||||||
|
c = yn("There are files from a game in progress under your name. "
|
||||||
|
"Recover?");
|
||||||
|
#else
|
||||||
|
pline("There is already a game in progress under your name.");
|
||||||
|
pline("You may be able to use \"recover %s\" to get it back.\n",
|
||||||
|
tbuf);
|
||||||
|
c = yn("Do you want to destroy the old game?");
|
||||||
|
#endif
|
||||||
|
} else {
|
||||||
|
c = 'n';
|
||||||
|
ct = 0;
|
||||||
|
#ifdef SELF_RECOVER
|
||||||
|
raw_print("There are files from a game in progress under your name. "
|
||||||
|
"Recover? [yn]");
|
||||||
|
#else
|
||||||
|
raw_print("\nThere is already a game in progress under your name.\n");
|
||||||
|
raw_print("If this is unexpected, you may be able to use \n");
|
||||||
|
raw_print("\"recover %s\" to get it back.", tbuf);
|
||||||
|
raw_print("\nDo you want to destroy the old game? [yn] ");
|
||||||
|
#endif
|
||||||
|
while ((ci = nhgetch()) != '\n') {
|
||||||
|
if (ct > 0) {
|
||||||
|
raw_print("\b \b");
|
||||||
|
ct = 0;
|
||||||
|
c = 'n';
|
||||||
|
}
|
||||||
|
if (ci == 'y' || ci == 'n' || ci == 'Y' || ci == 'N') {
|
||||||
|
ct = 1;
|
||||||
|
c = ci;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (c == 'y' || c == 'Y')
|
||||||
|
#ifndef SELF_RECOVER
|
||||||
|
if (eraseoldlocks()) {
|
||||||
|
if (WINDOWPORT("tty"))
|
||||||
|
clear_screen(); /* display gets fouled up otherwise */
|
||||||
|
goto gotlock;
|
||||||
|
} else {
|
||||||
|
unlock_file(HLOCK);
|
||||||
|
#if defined(CHDIR) && !defined(NOCWD_ASSUMPTIONS)
|
||||||
|
chdirx(orgdir, 0);
|
||||||
|
#endif
|
||||||
|
raw_print("Couldn't destroy old game.");
|
||||||
|
}
|
||||||
|
#else /*SELF_RECOVER*/
|
||||||
|
if (recover_savefile()) {
|
||||||
|
if (WINDOWPORT("tty"))
|
||||||
|
clear_screen(); /* display gets fouled up otherwise */
|
||||||
|
goto gotlock;
|
||||||
|
} else {
|
||||||
|
unlock_file(HLOCK);
|
||||||
|
#if defined(CHDIR) && !defined(NOCWD_ASSUMPTIONS)
|
||||||
|
chdirx(orgdir, 0);
|
||||||
|
#endif
|
||||||
|
raw_print("Couldn't recover old game.");
|
||||||
|
}
|
||||||
|
#endif /*SELF_RECOVER*/
|
||||||
|
else {
|
||||||
|
unlock_file(HLOCK);
|
||||||
|
#if defined(CHDIR) && !defined(NOCWD_ASSUMPTIONS)
|
||||||
|
chdirx(orgdir, 0);
|
||||||
|
#endif
|
||||||
|
Sprintf(oops, "%s", "Cannot start a new game.");
|
||||||
|
raw_print(oops);
|
||||||
|
}
|
||||||
|
|
||||||
|
gotlock:
|
||||||
|
fd = creat(fq_lock, fcmask);
|
||||||
|
if (fd == -1)
|
||||||
|
ern = errno;
|
||||||
|
unlock_file(HLOCK);
|
||||||
|
if (fd == -1) {
|
||||||
|
#if defined(CHDIR) && !defined(NOCWD_ASSUMPTIONS)
|
||||||
|
chdirx(orgdir, 0);
|
||||||
|
#endif
|
||||||
|
Sprintf(oops, "cannot creat file (%s.)\n%s\n%s\"%s\" exists?\n", fq_lock,
|
||||||
|
strerror(ern), " Are you sure that the directory",
|
||||||
|
fqn_prefix[LEVELPREFIX]);
|
||||||
|
raw_print(oops);
|
||||||
|
} else {
|
||||||
|
if (write(fd, (char *) &hackpid, sizeof(hackpid))
|
||||||
|
!= sizeof(hackpid)) {
|
||||||
|
#if defined(CHDIR) && !defined(NOCWD_ASSUMPTIONS)
|
||||||
|
chdirx(orgdir, 0);
|
||||||
|
#endif
|
||||||
|
error("cannot write lock (%s)", fq_lock);
|
||||||
|
}
|
||||||
|
if (nhclose(fd) == -1) {
|
||||||
|
#if defined(CHDIR) && !defined(NOCWD_ASSUMPTIONS)
|
||||||
|
chdirx(orgdir, 0);
|
||||||
|
#endif
|
||||||
|
error("cannot close lock (%s)", fq_lock);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* PC_LOCKING */
|
||||||
|
|
||||||
|
/*windmain.c*/
|
||||||
|
|||||||
+1
-1
@@ -1698,7 +1698,7 @@ object_info : CURSE_TYPE
|
|||||||
| TRAPPED_STATE
|
| TRAPPED_STATE
|
||||||
{
|
{
|
||||||
add_opvars(splev, "ii",
|
add_opvars(splev, "ii",
|
||||||
VA_PASS2((int) 1, SP_O_V_TRAPPED));
|
VA_PASS2((int) $1, SP_O_V_TRAPPED));
|
||||||
$$ = 0x0400;
|
$$ = 0x0400;
|
||||||
}
|
}
|
||||||
| RECHARGED_ID ':' integer_or_var
|
| RECHARGED_ID ':' integer_or_var
|
||||||
|
|||||||
@@ -164,6 +164,7 @@ curses_character_input_dialog(const char *prompt, const char *choices,
|
|||||||
CHAR_P def)
|
CHAR_P def)
|
||||||
{
|
{
|
||||||
WINDOW *askwin = NULL;
|
WINDOW *askwin = NULL;
|
||||||
|
WINDOW *message_window;
|
||||||
int answer, count, maxwidth, map_height, map_width;
|
int answer, count, maxwidth, map_height, map_width;
|
||||||
char *linestr;
|
char *linestr;
|
||||||
char askstr[BUFSZ + QBUFSZ];
|
char askstr[BUFSZ + QBUFSZ];
|
||||||
@@ -180,6 +181,9 @@ curses_character_input_dialog(const char *prompt, const char *choices,
|
|||||||
map_width = term_cols;
|
map_width = term_cols;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef PDCURSES
|
||||||
|
message_window = curses_get_nhwin(MESSAGE_WIN);
|
||||||
|
#endif
|
||||||
maxwidth = map_width - 2;
|
maxwidth = map_width - 2;
|
||||||
|
|
||||||
if (choices != NULL) {
|
if (choices != NULL) {
|
||||||
@@ -241,8 +245,11 @@ curses_character_input_dialog(const char *prompt, const char *choices,
|
|||||||
/*curses_stupid_hack = 0; */
|
/*curses_stupid_hack = 0; */
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
|
#ifdef PDCURSES
|
||||||
|
answer = wgetch(message_window);
|
||||||
|
#else
|
||||||
answer = getch();
|
answer = getch();
|
||||||
|
#endif
|
||||||
if (answer == ERR) {
|
if (answer == ERR) {
|
||||||
answer = def;
|
answer = def;
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -619,7 +619,13 @@ raw_print(str) -- Print directly to a screen, or otherwise guarantee that
|
|||||||
void
|
void
|
||||||
curses_raw_print(const char *str)
|
curses_raw_print(const char *str)
|
||||||
{
|
{
|
||||||
|
#ifdef PDCURSES
|
||||||
|
WINDOW *win = curses_get_nhwin(MESSAGE_WIN);
|
||||||
|
|
||||||
|
curses_message_win_puts(str, FALSE);
|
||||||
|
#else
|
||||||
puts(str);
|
puts(str);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -143,7 +143,7 @@ curses_block(boolean noscroll)
|
|||||||
{
|
{
|
||||||
int height, width, ret = 0;
|
int height, width, ret = 0;
|
||||||
WINDOW *win = curses_get_nhwin(MESSAGE_WIN);
|
WINDOW *win = curses_get_nhwin(MESSAGE_WIN);
|
||||||
char *resp = " \n\033"; /* space, enter, esc */
|
char *resp = " \r\n\033"; /* space, enter, esc */
|
||||||
|
|
||||||
|
|
||||||
curses_get_window_size(MESSAGE_WIN, &height, &width);
|
curses_get_window_size(MESSAGE_WIN, &height, &width);
|
||||||
@@ -429,7 +429,11 @@ curses_message_win_getline(const char *prompt, char *answer, int buffer)
|
|||||||
wmove(win, my, mx);
|
wmove(win, my, mx);
|
||||||
curs_set(1);
|
curs_set(1);
|
||||||
wrefresh(win);
|
wrefresh(win);
|
||||||
|
#ifdef PDCURSES
|
||||||
|
ch = wgetch(win);
|
||||||
|
#else
|
||||||
ch = getch();
|
ch = getch();
|
||||||
|
#endif
|
||||||
curs_set(0);
|
curs_set(0);
|
||||||
switch(ch) {
|
switch(ch) {
|
||||||
case '\033': /* DOESCAPE */
|
case '\033': /* DOESCAPE */
|
||||||
|
|||||||
+19
-20
@@ -1,4 +1,4 @@
|
|||||||
/* NetHack 3.6 wintty.c $NHDT-Date: 1526909614 2018/05/21 13:33:34 $ $NHDT-Branch: NetHack-3.6.2 $:$NHDT-Revision: 1.167 $ */
|
/* NetHack 3.6 wintty.c $NHDT-Date: 1544842261 2018/12/15 02:51:01 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.188 $ */
|
||||||
/* Copyright (c) David Cohrs, 1991 */
|
/* Copyright (c) David Cohrs, 1991 */
|
||||||
/* NetHack may be freely redistributed. See license for details. */
|
/* NetHack may be freely redistributed. See license for details. */
|
||||||
|
|
||||||
@@ -3512,31 +3512,30 @@ static struct tty_status_fields
|
|||||||
static int hpbar_percent, hpbar_color;
|
static int hpbar_percent, hpbar_color;
|
||||||
static struct condition_t {
|
static struct condition_t {
|
||||||
long mask;
|
long mask;
|
||||||
const char *text[3]; /* 3: potential display values, progressively
|
const char *text[3]; /* 3: potential display vals, progressively shorter */
|
||||||
* smaller */
|
|
||||||
} conditions[] = {
|
} conditions[] = {
|
||||||
/* The sequence order of these matters */
|
/* The sequence order of these matters */
|
||||||
{ BL_MASK_STONE, {"Stone", "Ston", "Sto"}},
|
{ BL_MASK_STONE, { "Stone", "Ston", "Sto" } },
|
||||||
{ BL_MASK_SLIME, {"Slime", "Slim", "Slm"}},
|
{ BL_MASK_SLIME, { "Slime", "Slim", "Slm" } },
|
||||||
{ BL_MASK_STRNGL, {"Strngl", "Stngl", "Str"}},
|
{ BL_MASK_STRNGL, { "Strngl", "Stngl", "Str" } },
|
||||||
{ BL_MASK_FOODPOIS, {"FoodPois", "Fpois", "Poi"}},
|
{ BL_MASK_FOODPOIS, { "FoodPois", "Fpois", "Poi" } },
|
||||||
{ BL_MASK_TERMILL, {"TermIll" , "Ill", "Ill"}},
|
{ BL_MASK_TERMILL, { "TermIll" , "Ill", "Ill" } },
|
||||||
{ BL_MASK_BLIND, {"Blind", "Blnd", "Bl"}},
|
{ BL_MASK_BLIND, { "Blind", "Blnd", "Bl" } },
|
||||||
{ BL_MASK_DEAF, {"Deaf", "Def", "Df"}},
|
{ BL_MASK_DEAF, { "Deaf", "Def", "Df" } },
|
||||||
{ BL_MASK_STUN, {"Stun", "Stun", "St"}},
|
{ BL_MASK_STUN, { "Stun", "Stun", "St" } },
|
||||||
{ BL_MASK_CONF, {"Conf", "Cnf", "Cn"}},
|
{ BL_MASK_CONF, { "Conf", "Cnf", "Cf" } },
|
||||||
{ BL_MASK_HALLU, {"Hallu", "Hal", "Ha"}},
|
{ BL_MASK_HALLU, { "Hallu", "Hal", "Hl" } },
|
||||||
{ BL_MASK_LEV, {"Lev", "Lev", "Lv"}},
|
{ BL_MASK_LEV, { "Lev", "Lev", "Lv" } },
|
||||||
{ BL_MASK_FLY, {"Fly", "Fly", "Fl"}},
|
{ BL_MASK_FLY, { "Fly", "Fly", "Fl" } },
|
||||||
{ BL_MASK_RIDE, {"Ride", "Rid", "Ri"}},
|
{ BL_MASK_RIDE, { "Ride", "Rid", "Rd" } },
|
||||||
};
|
};
|
||||||
static const char *encvals[3][6] = {
|
static const char *encvals[3][6] = {
|
||||||
{ "", "Burdened", "Stressed", "Strained", "Overtaxed", "Overloaded"},
|
{ "", "Burdened", "Stressed", "Strained", "Overtaxed", "Overloaded" },
|
||||||
{ "", "Burden", "Stress", "Strain", "Overtax", "Overload" },
|
{ "", "Burden", "Stress", "Strain", "Overtax", "Overload" },
|
||||||
{ "", "Brd", "Strs", "Strn", "Ovtx", "Ovld" }
|
{ "", "Brd", "Strs", "Strn", "Ovtx", "Ovld" }
|
||||||
};
|
};
|
||||||
#define MAX_PER_ROW 15
|
#define MAX_PER_ROW 15
|
||||||
static enum statusfields fieldorder[2][MAX_PER_ROW] = { /* 2: two status lines */
|
static enum statusfields fieldorder[2][MAX_PER_ROW] = { /* 2: 2 status lines */
|
||||||
{ BL_TITLE, BL_STR, BL_DX, BL_CO, BL_IN, BL_WI, BL_CH, BL_ALIGN,
|
{ BL_TITLE, BL_STR, BL_DX, BL_CO, BL_IN, BL_WI, BL_CH, BL_ALIGN,
|
||||||
BL_SCORE, BL_FLUSH, BL_FLUSH, BL_FLUSH, BL_FLUSH, BL_FLUSH,
|
BL_SCORE, BL_FLUSH, BL_FLUSH, BL_FLUSH, BL_FLUSH, BL_FLUSH,
|
||||||
BL_FLUSH },
|
BL_FLUSH },
|
||||||
|
|||||||
@@ -152,7 +152,6 @@
|
|||||||
<ClCompile Include="$(SysShareDir)cppregex.cpp" />
|
<ClCompile Include="$(SysShareDir)cppregex.cpp" />
|
||||||
<ClCompile Include="$(SysShareDir)nhlan.c" />
|
<ClCompile Include="$(SysShareDir)nhlan.c" />
|
||||||
<ClCompile Include="$(SysShareDir)pcsys.c" />
|
<ClCompile Include="$(SysShareDir)pcsys.c" />
|
||||||
<ClCompile Include="$(SysShareDir)pcunix.c" />
|
|
||||||
<ClCompile Include="$(SysShareDir)random.c" />
|
<ClCompile Include="$(SysShareDir)random.c" />
|
||||||
<ClCompile Include="$(SysWinntDir)ntsound.c" />
|
<ClCompile Include="$(SysWinntDir)ntsound.c" />
|
||||||
<ClCompile Include="$(SysWinntDir)nttty.c" />
|
<ClCompile Include="$(SysWinntDir)nttty.c" />
|
||||||
|
|||||||
@@ -147,7 +147,6 @@
|
|||||||
<ClCompile Include="$(SysShareDir)cppregex.cpp" />
|
<ClCompile Include="$(SysShareDir)cppregex.cpp" />
|
||||||
<ClCompile Include="$(SysShareDir)nhlan.c" />
|
<ClCompile Include="$(SysShareDir)nhlan.c" />
|
||||||
<ClCompile Include="$(SysShareDir)pcsys.c" />
|
<ClCompile Include="$(SysShareDir)pcsys.c" />
|
||||||
<ClCompile Include="$(SysShareDir)pcunix.c" />
|
|
||||||
<ClCompile Include="$(SysShareDir)random.c" />
|
<ClCompile Include="$(SysShareDir)random.c" />
|
||||||
<ClCompile Include="$(SysWinntDir)ntsound.c" />
|
<ClCompile Include="$(SysWinntDir)ntsound.c" />
|
||||||
<ClCompile Include="$(SysWinntDir)stubs.c">
|
<ClCompile Include="$(SysWinntDir)stubs.c">
|
||||||
|
|||||||
Reference in New Issue
Block a user