Merge branch 'NetHack-3.6.2-beta01' into NetHack-3.6.2
This commit is contained in:
@@ -405,6 +405,15 @@ when engulfed while in a shop, dropping an item into the engulfer and then
|
|||||||
using ':' to look at current location could cause a crash
|
using ':' to look at current location could cause a crash
|
||||||
when items were on the floor just inside a shop's door where the shopkeeper
|
when items were on the floor just inside a shop's door where the shopkeeper
|
||||||
doesn't buy and sell stuff, those items showed a 'for sale' price
|
doesn't buy and sell stuff, those items showed a 'for sale' price
|
||||||
|
separate most of domove() into domove_core() and introduce a pair of global
|
||||||
|
variables that allow for assessment of domove_core() results in
|
||||||
|
domove() after one of the many return paths
|
||||||
|
new domove()-related global variables mentioned above also replace a couple
|
||||||
|
of booleans in rhack() that were used for similar upcoming action
|
||||||
|
identification
|
||||||
|
smudging of an engraving has been relocated and follows domove_core() and is
|
||||||
|
carried out only after a successful move attempt; your former
|
||||||
|
location and resulting location are both potentially impacted now
|
||||||
tty: turn off an optimization that is the suspected cause of Windows reported
|
tty: turn off an optimization that is the suspected cause of Windows reported
|
||||||
partial status lines following level changes
|
partial status lines following level changes
|
||||||
tty: ensure that current status fields are always copied to prior status
|
tty: ensure that current status fields are always copied to prior status
|
||||||
|
|||||||
@@ -272,6 +272,11 @@ E NEARDATA struct mvitals {
|
|||||||
uchar mvflags;
|
uchar mvflags;
|
||||||
} mvitals[NUMMONS];
|
} mvitals[NUMMONS];
|
||||||
|
|
||||||
|
E NEARDATA long domove_attempting;
|
||||||
|
E NEARDATA long domove_succeeded;
|
||||||
|
#define DOMOVE_WALK 0x00000001
|
||||||
|
#define DOMOVE_RUSH 0x00000002
|
||||||
|
|
||||||
E NEARDATA struct c_color_names {
|
E NEARDATA struct c_color_names {
|
||||||
const char *const c_black, *const c_amber, *const c_golden,
|
const char *const c_black, *const c_amber, *const c_golden,
|
||||||
*const c_light_blue, *const c_red, *const c_green, *const c_silver,
|
*const c_light_blue, *const c_red, *const c_green, *const c_silver,
|
||||||
|
|||||||
29
src/cmd.c
29
src/cmd.c
@@ -4538,7 +4538,7 @@ rhack(cmd)
|
|||||||
register char *cmd;
|
register char *cmd;
|
||||||
{
|
{
|
||||||
int spkey;
|
int spkey;
|
||||||
boolean do_walk, do_rush, prefix_seen, bad_command,
|
boolean prefix_seen, bad_command,
|
||||||
firsttime = (cmd == 0);
|
firsttime = (cmd == 0);
|
||||||
|
|
||||||
iflags.menu_requested = FALSE;
|
iflags.menu_requested = FALSE;
|
||||||
@@ -4569,7 +4569,7 @@ register char *cmd;
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* handle most movement commands */
|
/* handle most movement commands */
|
||||||
do_walk = do_rush = prefix_seen = FALSE;
|
prefix_seen = FALSE;
|
||||||
context.travel = context.travel1 = 0;
|
context.travel = context.travel1 = 0;
|
||||||
spkey = ch2spkeys(*cmd, NHKF_RUN, NHKF_CLICKLOOK);
|
spkey = ch2spkeys(*cmd, NHKF_RUN, NHKF_CLICKLOOK);
|
||||||
|
|
||||||
@@ -4577,7 +4577,7 @@ register char *cmd;
|
|||||||
case NHKF_RUSH:
|
case NHKF_RUSH:
|
||||||
if (movecmd(cmd[1])) {
|
if (movecmd(cmd[1])) {
|
||||||
context.run = 2;
|
context.run = 2;
|
||||||
do_rush = TRUE;
|
domove_attempting |= DOMOVE_RUSH;
|
||||||
} else
|
} else
|
||||||
prefix_seen = TRUE;
|
prefix_seen = TRUE;
|
||||||
break;
|
break;
|
||||||
@@ -4588,7 +4588,7 @@ register char *cmd;
|
|||||||
case NHKF_RUN:
|
case NHKF_RUN:
|
||||||
if (movecmd(lowc(cmd[1]))) {
|
if (movecmd(lowc(cmd[1]))) {
|
||||||
context.run = 3;
|
context.run = 3;
|
||||||
do_rush = TRUE;
|
domove_attempting |= DOMOVE_RUSH;
|
||||||
} else
|
} else
|
||||||
prefix_seen = TRUE;
|
prefix_seen = TRUE;
|
||||||
break;
|
break;
|
||||||
@@ -4604,7 +4604,7 @@ register char *cmd;
|
|||||||
case NHKF_FIGHT:
|
case NHKF_FIGHT:
|
||||||
if (movecmd(cmd[1])) {
|
if (movecmd(cmd[1])) {
|
||||||
context.forcefight = 1;
|
context.forcefight = 1;
|
||||||
do_walk = TRUE;
|
domove_attempting |= DOMOVE_WALK;
|
||||||
} else
|
} else
|
||||||
prefix_seen = TRUE;
|
prefix_seen = TRUE;
|
||||||
break;
|
break;
|
||||||
@@ -4613,7 +4613,7 @@ register char *cmd;
|
|||||||
context.run = 0;
|
context.run = 0;
|
||||||
context.nopick = 1;
|
context.nopick = 1;
|
||||||
if (!u.dz)
|
if (!u.dz)
|
||||||
do_walk = TRUE;
|
domove_attempting |= DOMOVE_WALK;
|
||||||
else
|
else
|
||||||
cmd[0] = cmd[1]; /* "m<" or "m>" */
|
cmd[0] = cmd[1]; /* "m<" or "m>" */
|
||||||
} else
|
} else
|
||||||
@@ -4623,7 +4623,7 @@ register char *cmd;
|
|||||||
if (movecmd(lowc(cmd[1]))) {
|
if (movecmd(lowc(cmd[1]))) {
|
||||||
context.run = 1;
|
context.run = 1;
|
||||||
context.nopick = 1;
|
context.nopick = 1;
|
||||||
do_rush = TRUE;
|
domove_attempting |= DOMOVE_RUSH;
|
||||||
} else
|
} else
|
||||||
prefix_seen = TRUE;
|
prefix_seen = TRUE;
|
||||||
break;
|
break;
|
||||||
@@ -4646,20 +4646,20 @@ register char *cmd;
|
|||||||
context.travel1 = 1;
|
context.travel1 = 1;
|
||||||
context.run = 8;
|
context.run = 8;
|
||||||
context.nopick = 1;
|
context.nopick = 1;
|
||||||
do_rush = TRUE;
|
domove_attempting |= DOMOVE_RUSH;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/*FALLTHRU*/
|
/*FALLTHRU*/
|
||||||
default:
|
default:
|
||||||
if (movecmd(*cmd)) { /* ordinary movement */
|
if (movecmd(*cmd)) { /* ordinary movement */
|
||||||
context.run = 0; /* only matters here if it was 8 */
|
context.run = 0; /* only matters here if it was 8 */
|
||||||
do_walk = TRUE;
|
domove_attempting |= DOMOVE_WALK;
|
||||||
} else if (movecmd(Cmd.num_pad ? unmeta(*cmd) : lowc(*cmd))) {
|
} else if (movecmd(Cmd.num_pad ? unmeta(*cmd) : lowc(*cmd))) {
|
||||||
context.run = 1;
|
context.run = 1;
|
||||||
do_rush = TRUE;
|
domove_attempting |= DOMOVE_RUSH;
|
||||||
} else if (movecmd(unctrl(*cmd))) {
|
} else if (movecmd(unctrl(*cmd))) {
|
||||||
context.run = 3;
|
context.run = 3;
|
||||||
do_rush = TRUE;
|
domove_attempting |= DOMOVE_RUSH;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -4677,7 +4677,8 @@ register char *cmd;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((do_walk || do_rush) && !context.travel && !dxdy_moveok()) {
|
if (((domove_attempting & (DOMOVE_RUSH | DOMOVE_WALK)) != 0L)
|
||||||
|
&& !context.travel && !dxdy_moveok()) {
|
||||||
/* trying to move diagonally as a grid bug;
|
/* trying to move diagonally as a grid bug;
|
||||||
this used to be treated by movecmd() as not being
|
this used to be treated by movecmd() as not being
|
||||||
a movement attempt, but that didn't provide for any
|
a movement attempt, but that didn't provide for any
|
||||||
@@ -4691,13 +4692,13 @@ register char *cmd;
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (do_walk) {
|
if ((domove_attempting & DOMOVE_WALK) != 0L) {
|
||||||
if (multi)
|
if (multi)
|
||||||
context.mv = TRUE;
|
context.mv = TRUE;
|
||||||
domove();
|
domove();
|
||||||
context.forcefight = 0;
|
context.forcefight = 0;
|
||||||
return;
|
return;
|
||||||
} else if (do_rush) {
|
} else if ((domove_attempting & DOMOVE_RUSH) != 0L) {
|
||||||
if (firsttime) {
|
if (firsttime) {
|
||||||
if (!multi)
|
if (!multi)
|
||||||
multi = max(COLNO, ROWNO);
|
multi = max(COLNO, ROWNO);
|
||||||
|
|||||||
@@ -214,6 +214,8 @@ NEARDATA struct monst *mydogs = (struct monst *) 0;
|
|||||||
NEARDATA struct monst *migrating_mons = (struct monst *) 0;
|
NEARDATA struct monst *migrating_mons = (struct monst *) 0;
|
||||||
|
|
||||||
NEARDATA struct mvitals mvitals[NUMMONS];
|
NEARDATA struct mvitals mvitals[NUMMONS];
|
||||||
|
NEARDATA long domove_attempting = 0L;
|
||||||
|
NEARDATA long domove_succeeded = 0L;
|
||||||
|
|
||||||
NEARDATA struct c_color_names c_color_names = {
|
NEARDATA struct c_color_names c_color_names = {
|
||||||
"black", "amber", "golden", "light blue", "red", "green",
|
"black", "amber", "golden", "light blue", "red", "green",
|
||||||
@@ -277,7 +279,7 @@ char *fqn_prefix[PREFIX_COUNT] = { (char *) 0, (char *) 0, (char *) 0,
|
|||||||
(char *) 0, (char *) 0, (char *) 0,
|
(char *) 0, (char *) 0, (char *) 0,
|
||||||
(char *) 0, (char *) 0, (char *) 0,
|
(char *) 0, (char *) 0, (char *) 0,
|
||||||
(char *) 0 };
|
(char *) 0 };
|
||||||
|
|
||||||
#ifdef PREFIXES_IN_USE
|
#ifdef PREFIXES_IN_USE
|
||||||
char *fqn_prefix_names[PREFIX_COUNT] = {
|
char *fqn_prefix_names[PREFIX_COUNT] = {
|
||||||
"hackdir", "leveldir", "savedir", "bonesdir", "datadir",
|
"hackdir", "leveldir", "savedir", "bonesdir", "datadir",
|
||||||
|
|||||||
34
src/hack.c
34
src/hack.c
@@ -16,6 +16,8 @@ STATIC_DCL boolean FDECL(trapmove, (int, int, struct trap *));
|
|||||||
STATIC_DCL struct monst *FDECL(monstinroom, (struct permonst *, int));
|
STATIC_DCL struct monst *FDECL(monstinroom, (struct permonst *, int));
|
||||||
STATIC_DCL boolean FDECL(doorless_door, (int, int));
|
STATIC_DCL boolean FDECL(doorless_door, (int, int));
|
||||||
STATIC_DCL void FDECL(move_update, (BOOLEAN_P));
|
STATIC_DCL void FDECL(move_update, (BOOLEAN_P));
|
||||||
|
STATIC_DCL void FDECL(maybe_smudge_engr, (int, int, int, int));
|
||||||
|
STATIC_DCL void NDECL(domove_core);
|
||||||
|
|
||||||
#define IS_SHOP(x) (rooms[x].rtype >= SHOPBASE)
|
#define IS_SHOP(x) (rooms[x].rtype >= SHOPBASE)
|
||||||
|
|
||||||
@@ -1329,6 +1331,19 @@ u_rooted()
|
|||||||
|
|
||||||
void
|
void
|
||||||
domove()
|
domove()
|
||||||
|
{
|
||||||
|
int ux1 = u.ux, uy1 = u.uy;
|
||||||
|
|
||||||
|
domove_succeeded = 0L;
|
||||||
|
domove_core();
|
||||||
|
/* domove_succeeded is available for making assessments now */
|
||||||
|
if ((domove_succeeded & (DOMOVE_RUSH | DOMOVE_WALK)) != 0)
|
||||||
|
maybe_smudge_engr(ux1, uy1, u.ux, u.uy);
|
||||||
|
domove_attempting = 0L;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
domove_core()
|
||||||
{
|
{
|
||||||
register struct monst *mtmp;
|
register struct monst *mtmp;
|
||||||
register struct rm *tmpr;
|
register struct rm *tmpr;
|
||||||
@@ -1341,8 +1356,6 @@ domove()
|
|||||||
int bc_control = 0; /* control for ball&chain */
|
int bc_control = 0; /* control for ball&chain */
|
||||||
boolean cause_delay = FALSE; /* dragging ball will skip a move */
|
boolean cause_delay = FALSE; /* dragging ball will skip a move */
|
||||||
|
|
||||||
u_wipe_engr(rnd(5));
|
|
||||||
|
|
||||||
if (context.travel) {
|
if (context.travel) {
|
||||||
if (!findtravelpath(FALSE))
|
if (!findtravelpath(FALSE))
|
||||||
(void) findtravelpath(TRUE);
|
(void) findtravelpath(TRUE);
|
||||||
@@ -1860,6 +1873,8 @@ domove()
|
|||||||
check_leash(u.ux0, u.uy0);
|
check_leash(u.ux0, u.uy0);
|
||||||
|
|
||||||
if (u.ux0 != u.ux || u.uy0 != u.uy) {
|
if (u.ux0 != u.ux || u.uy0 != u.uy) {
|
||||||
|
/* let caller know so that an evaluation may take place */
|
||||||
|
domove_succeeded |= (domove_attempting & (DOMOVE_RUSH | DOMOVE_WALK));
|
||||||
u.umoved = TRUE;
|
u.umoved = TRUE;
|
||||||
/* Clean old position -- vision_recalc() will print our new one. */
|
/* Clean old position -- vision_recalc() will print our new one. */
|
||||||
newsym(u.ux0, u.uy0);
|
newsym(u.ux0, u.uy0);
|
||||||
@@ -1899,6 +1914,21 @@ domove()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
maybe_smudge_engr(x1,y1,x2,y2)
|
||||||
|
int x1, y1, x2, y2;
|
||||||
|
{
|
||||||
|
struct engr *ep;
|
||||||
|
|
||||||
|
if (can_reach_floor(TRUE)) {
|
||||||
|
if ((ep = engr_at(x1, y1)) && ep->engr_type != HEADSTONE)
|
||||||
|
wipe_engr_at(x1, y1, rnd(5), FALSE);
|
||||||
|
if ((x2 != x1 || y2 != y1)
|
||||||
|
&& (ep = engr_at(x2, y2)) && ep->engr_type != HEADSTONE)
|
||||||
|
wipe_engr_at(x2, y2, rnd(5), FALSE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* combat increases metabolism */
|
/* combat increases metabolism */
|
||||||
boolean
|
boolean
|
||||||
overexertion()
|
overexertion()
|
||||||
|
|||||||
Reference in New Issue
Block a user