Merge branch 'NetHack-3.6.2-beta01' into NetHack-3.6.2
This commit is contained in:
+2089
-1957
File diff suppressed because it is too large
Load Diff
+63
-57
@@ -1,4 +1,4 @@
|
|||||||
/* NetHack 3.6 display.c $NHDT-Date: 1554045810 2019/03/31 15:23:30 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.99 $ */
|
/* NetHack 3.6 display.c $NHDT-Date: 1556835736 2019/05/02 22:22:16 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.101 $ */
|
||||||
/* Copyright (c) Dean Luick, with acknowledgements to Kevin Darcy */
|
/* Copyright (c) Dean Luick, with acknowledgements to Kevin Darcy */
|
||||||
/* and Dave Cohrs, 1990. */
|
/* and Dave Cohrs, 1990. */
|
||||||
/* NetHack may be freely redistributed. See license for details. */
|
/* NetHack may be freely redistributed. See license for details. */
|
||||||
@@ -37,9 +37,15 @@
|
|||||||
* background
|
* background
|
||||||
*
|
*
|
||||||
* If the location is out of sight, display in order:
|
* If the location is out of sight, display in order:
|
||||||
* sensed monsters (telepathy)
|
* sensed monsters (via telepathy or persistent detection)
|
||||||
|
* warning (partly-sensed monster shown as an abstraction)
|
||||||
* memory
|
* memory
|
||||||
*
|
*
|
||||||
|
* "Remembered, unseen monster" is handled like an object rather
|
||||||
|
* than a monster, and stays displayed whether or not it is in sight.
|
||||||
|
* It is removed when a visible or sensed or warned-of monster gets
|
||||||
|
* shown at its location or when searching or fighting reveals that
|
||||||
|
* no monster is there.
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* Here is a list of the major routines in this file to be used externally:
|
* Here is a list of the major routines in this file to be used externally:
|
||||||
@@ -309,9 +315,9 @@ register int x, y;
|
|||||||
if (!level.flags.hero_memory)
|
if (!level.flags.hero_memory)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if ((trap = t_at(x, y)) != 0 && trap->tseen && !covers_traps(x, y))
|
if ((trap = t_at(x, y)) != 0 && trap->tseen && !covers_traps(x, y)) {
|
||||||
map_trap(trap, 0);
|
map_trap(trap, 0);
|
||||||
else if (levl[x][y].seenv) {
|
} else if (levl[x][y].seenv) {
|
||||||
struct rm *lev = &levl[x][y];
|
struct rm *lev = &levl[x][y];
|
||||||
|
|
||||||
map_background(x, y, 0);
|
map_background(x, y, 0);
|
||||||
@@ -320,8 +326,9 @@ register int x, y;
|
|||||||
if (!lev->waslit && lev->glyph == cmap_to_glyph(S_room)
|
if (!lev->waslit && lev->glyph == cmap_to_glyph(S_room)
|
||||||
&& lev->typ == ROOM)
|
&& lev->typ == ROOM)
|
||||||
lev->glyph = cmap_to_glyph(S_stone);
|
lev->glyph = cmap_to_glyph(S_stone);
|
||||||
} else
|
} else {
|
||||||
levl[x][y].glyph = cmap_to_glyph(S_stone); /* default val */
|
levl[x][y].glyph = cmap_to_glyph(S_stone); /* default val */
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -332,7 +339,7 @@ register int x, y;
|
|||||||
*
|
*
|
||||||
* Internal to display.c, this is a #define for speed.
|
* Internal to display.c, this is a #define for speed.
|
||||||
*/
|
*/
|
||||||
#define _map_location(x, y, show) \
|
#define _map_location(x, y, show) \
|
||||||
{ \
|
{ \
|
||||||
register struct obj *obj; \
|
register struct obj *obj; \
|
||||||
register struct trap *trap; \
|
register struct trap *trap; \
|
||||||
@@ -440,8 +447,7 @@ xchar worm_tail; /* mon is actually a worm tail */
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If the mimic is unsuccessfully mimicing something, display the monster.
|
/* If mimic is unsuccessfully mimicing something, display the monster. */
|
||||||
*/
|
|
||||||
if (!mon_mimic || sensed) {
|
if (!mon_mimic || sensed) {
|
||||||
int num;
|
int num;
|
||||||
|
|
||||||
@@ -461,13 +467,13 @@ xchar worm_tail; /* mon is actually a worm tail */
|
|||||||
} else if (sightflags == DETECTED) {
|
} else if (sightflags == DETECTED) {
|
||||||
if (worm_tail)
|
if (worm_tail)
|
||||||
num = detected_monnum_to_glyph(
|
num = detected_monnum_to_glyph(
|
||||||
what_mon(PM_LONG_WORM_TAIL, rn2_on_display_rng));
|
what_mon(PM_LONG_WORM_TAIL, rn2_on_display_rng));
|
||||||
else
|
else
|
||||||
num = detected_mon_to_glyph(mon, rn2_on_display_rng);
|
num = detected_mon_to_glyph(mon, rn2_on_display_rng);
|
||||||
} else {
|
} else {
|
||||||
if (worm_tail)
|
if (worm_tail)
|
||||||
num = monnum_to_glyph(
|
num = monnum_to_glyph(
|
||||||
what_mon(PM_LONG_WORM_TAIL, rn2_on_display_rng));
|
what_mon(PM_LONG_WORM_TAIL, rn2_on_display_rng));
|
||||||
else
|
else
|
||||||
num = mon_to_glyph(mon, rn2_on_display_rng);
|
num = mon_to_glyph(mon, rn2_on_display_rng);
|
||||||
}
|
}
|
||||||
@@ -618,10 +624,9 @@ xchar x, y;
|
|||||||
* floor symbol.
|
* floor symbol.
|
||||||
*
|
*
|
||||||
* Similarly, if the hero digs a hole in a wall or feels a
|
* Similarly, if the hero digs a hole in a wall or feels a
|
||||||
* location
|
* location that used to contain an unseen monster. In these
|
||||||
* that used to contain an unseen monster. In these cases,
|
* cases, there's no reason to assume anything was underneath,
|
||||||
* there's no reason to assume anything was underneath, so
|
* so just show the appropriate floor symbol. If something was
|
||||||
* just show the appropriate floor symbol. If something was
|
|
||||||
* embedded in the wall, the glyph will probably already
|
* embedded in the wall, the glyph will probably already
|
||||||
* reflect that. Don't change the symbol in this case.
|
* reflect that. Don't change the symbol in this case.
|
||||||
*
|
*
|
||||||
@@ -860,7 +865,7 @@ register int x, y;
|
|||||||
else
|
else
|
||||||
goto show_mem;
|
goto show_mem;
|
||||||
} else {
|
} else {
|
||||||
show_mem:
|
show_mem:
|
||||||
show_glyph(x, y, lev->glyph);
|
show_glyph(x, y, lev->glyph);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -910,24 +915,22 @@ int x, y;
|
|||||||
* but explode() wants to delay].
|
* but explode() wants to delay].
|
||||||
*
|
*
|
||||||
* Call:
|
* Call:
|
||||||
* (DISP_BEAM, glyph) open, initialize glyph
|
* (DISP_BEAM, glyph) open, initialize glyph
|
||||||
* (DISP_FLASH, glyph) open, initialize glyph
|
* (DISP_FLASH, glyph) open, initialize glyph
|
||||||
* (DISP_ALWAYS, glyph) open, initialize glyph
|
* (DISP_ALWAYS, glyph) open, initialize glyph
|
||||||
* (DISP_CHANGE, glyph) change glyph
|
* (DISP_CHANGE, glyph) change glyph
|
||||||
* (DISP_END, 0) close & clean up (second argument doesn't
|
* (DISP_END, 0) close & clean up (2nd argument doesn't matter)
|
||||||
* matter)
|
* (DISP_FREEMEM, 0) only used to prevent memory leak during exit)
|
||||||
* (DISP_FREEMEM, 0) only used to prevent memory leak during
|
|
||||||
* exit)
|
|
||||||
* (x, y) display the glyph at the location
|
* (x, y) display the glyph at the location
|
||||||
*
|
*
|
||||||
* DISP_BEAM - Display the given glyph at each location, but do not erase
|
* DISP_BEAM - Display the given glyph at each location, but do not erase
|
||||||
* any until the close call.
|
* any until the close call.
|
||||||
* DISP_TETHER- Display a tether glyph at each location, and the tethered
|
* DISP_TETHER - Display a tether glyph at each location, and the tethered
|
||||||
* object at the farthest location, but do not erase any
|
* object at the farthest location, but do not erase any
|
||||||
* until the return trip or close.
|
* until the return trip or close.
|
||||||
* DISP_FLASH - Display the given glyph at each location, but erase the
|
* DISP_FLASH - Display the given glyph at each location, but erase the
|
||||||
* previous location's glyph.
|
* previous location's glyph.
|
||||||
* DISP_ALWAYS- Like DISP_FLASH, but vision is not taken into account.
|
* DISP_ALWAYS - Like DISP_FLASH, but vision is not taken into account.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define TMP_AT_MAX_GLYPHS (COLNO * 2)
|
#define TMP_AT_MAX_GLYPHS (COLNO * 2)
|
||||||
@@ -956,7 +959,7 @@ int x, y;
|
|||||||
if (!tglyph)
|
if (!tglyph)
|
||||||
tmp = &tgfirst;
|
tmp = &tgfirst;
|
||||||
else /* nested effect; we need dynamic memory */
|
else /* nested effect; we need dynamic memory */
|
||||||
tmp = (struct tmp_glyph *) alloc(sizeof(struct tmp_glyph));
|
tmp = (struct tmp_glyph *) alloc(sizeof *tmp);
|
||||||
tmp->prev = tglyph;
|
tmp->prev = tglyph;
|
||||||
tglyph = tmp;
|
tglyph = tmp;
|
||||||
tglyph->sidx = 0;
|
tglyph->sidx = 0;
|
||||||
@@ -1593,8 +1596,8 @@ int cursor_on_u;
|
|||||||
/* Prevent infinite loops on errors:
|
/* Prevent infinite loops on errors:
|
||||||
* flush_screen->print_glyph->impossible->pline->flush_screen
|
* flush_screen->print_glyph->impossible->pline->flush_screen
|
||||||
*/
|
*/
|
||||||
static boolean flushing = 0;
|
static int flushing = 0;
|
||||||
static boolean delay_flushing = 0;
|
static int delay_flushing = 0;
|
||||||
register int x, y;
|
register int x, y;
|
||||||
|
|
||||||
if (cursor_on_u == -1)
|
if (cursor_on_u == -1)
|
||||||
@@ -1611,6 +1614,7 @@ int cursor_on_u;
|
|||||||
|
|
||||||
for (y = 0; y < ROWNO; y++) {
|
for (y = 0; y < ROWNO; y++) {
|
||||||
register gbuf_entry *gptr = &gbuf[y][x = gbuf_start[y]];
|
register gbuf_entry *gptr = &gbuf[y][x = gbuf_start[y]];
|
||||||
|
|
||||||
for (; x <= gbuf_stop[y]; gptr++, x++)
|
for (; x <= gbuf_stop[y]; gptr++, x++)
|
||||||
if (gptr->new) {
|
if (gptr->new) {
|
||||||
print_glyph(WIN_MAP, x, y, gptr->glyph, get_bk_glyph(x, y));
|
print_glyph(WIN_MAP, x, y, gptr->glyph, get_bk_glyph(x, y));
|
||||||
@@ -1852,7 +1856,7 @@ xchar x, y;
|
|||||||
struct rm *lev = &levl[x][y];
|
struct rm *lev = &levl[x][y];
|
||||||
|
|
||||||
if (iflags.use_background_glyph && lev->seenv != 0
|
if (iflags.use_background_glyph && lev->seenv != 0
|
||||||
&& gbuf[y][x].glyph != cmap_to_glyph(S_stone)) {
|
&& gbuf[y][x].glyph != cmap_to_glyph(S_stone)) {
|
||||||
switch (lev->typ) {
|
switch (lev->typ) {
|
||||||
case SCORR:
|
case SCORR:
|
||||||
case STONE:
|
case STONE:
|
||||||
@@ -1903,10 +1907,8 @@ xchar x, y;
|
|||||||
return bkglyph;
|
return bkglyph;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------
|
/* ------------------------------------------------------------------------ */
|
||||||
*/
|
/* Wall Angle ------------------------------------------------------------- */
|
||||||
/* Wall Angle --------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef WA_VERBOSE
|
#ifdef WA_VERBOSE
|
||||||
|
|
||||||
@@ -1952,6 +1954,7 @@ check_pos(x, y, which)
|
|||||||
int x, y, which;
|
int x, y, which;
|
||||||
{
|
{
|
||||||
int type;
|
int type;
|
||||||
|
|
||||||
if (!isok(x, y))
|
if (!isok(x, y))
|
||||||
return which;
|
return which;
|
||||||
type = levl[x][y].typ;
|
type = levl[x][y].typ;
|
||||||
@@ -1986,8 +1989,11 @@ int x1, y1, x2, y2, x3, y3;
|
|||||||
{
|
{
|
||||||
int wmode, is_1, is_2, is_3;
|
int wmode, is_1, is_2, is_3;
|
||||||
|
|
||||||
|
#ifndef WA_VERBOSE
|
||||||
|
/* non-verbose more_than_one() doesn't use these */
|
||||||
nhUse(x0);
|
nhUse(x0);
|
||||||
nhUse(y0);
|
nhUse(y0);
|
||||||
|
#endif
|
||||||
|
|
||||||
is_1 = check_pos(x1, y1, WM_T_LONG);
|
is_1 = check_pos(x1, y1, WM_T_LONG);
|
||||||
is_2 = check_pos(x2, y2, WM_T_BL);
|
is_2 = check_pos(x2, y2, WM_T_BL);
|
||||||
@@ -2166,8 +2172,7 @@ set_wall_state()
|
|||||||
#endif /* WA_VERBOSE */
|
#endif /* WA_VERBOSE */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------
|
/* ------------------------------------------------------------------------ */
|
||||||
*/
|
|
||||||
/* This matrix is used here and in vision.c. */
|
/* This matrix is used here and in vision.c. */
|
||||||
unsigned char seenv_matrix[3][3] = { { SV2, SV1, SV0 },
|
unsigned char seenv_matrix[3][3] = { { SV2, SV1, SV0 },
|
||||||
{ SV3, SVALL, SV7 },
|
{ SV3, SVALL, SV7 },
|
||||||
@@ -2198,8 +2203,7 @@ int x0, y0, x1, y1; /* from, to; abs(x1-x0)==1 && abs(y0-y1)==1 */
|
|||||||
lev->seenv &= ~seenv_matrix[dy + 1][dx + 1];
|
lev->seenv &= ~seenv_matrix[dy + 1][dx + 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------
|
/* ------------------------------------------------------------------------ */
|
||||||
*/
|
|
||||||
|
|
||||||
/* T wall types, one for each row in wall_matrix[][]. */
|
/* T wall types, one for each row in wall_matrix[][]. */
|
||||||
#define T_d 0
|
#define T_d 0
|
||||||
@@ -2313,7 +2317,7 @@ struct rm *lev;
|
|||||||
goto do_twall;
|
goto do_twall;
|
||||||
case TDWALL:
|
case TDWALL:
|
||||||
row = wall_matrix[T_d];
|
row = wall_matrix[T_d];
|
||||||
do_twall:
|
do_twall:
|
||||||
switch (lev->wall_info & WM_MASK) {
|
switch (lev->wall_info & WM_MASK) {
|
||||||
case 0:
|
case 0:
|
||||||
if (seenv == SV4) {
|
if (seenv == SV4) {
|
||||||
@@ -2347,13 +2351,14 @@ struct rm *lev;
|
|||||||
break;
|
break;
|
||||||
case WM_T_BL:
|
case WM_T_BL:
|
||||||
#if 0 /* older method, fixed */
|
#if 0 /* older method, fixed */
|
||||||
if (only(seenv, SV4|SV5)) {
|
if (only(seenv, SV4 | SV5)) {
|
||||||
col = T_tlcorn;
|
col = T_tlcorn;
|
||||||
} else if ((seenv & (SV0|SV1|SV2))
|
} else if ((seenv & (SV0 | SV1 | SV2))
|
||||||
&& only(seenv, SV0|SV1|SV2|SV6|SV7)) {
|
&& only(seenv, SV0 | SV1 | SV2 | SV6 | SV7)) {
|
||||||
col = T_hwall;
|
col = T_hwall;
|
||||||
} else if ((seenv & SV3)
|
} else if ((seenv & SV3)
|
||||||
|| ((seenv & (SV0|SV1|SV2)) && (seenv & (SV4|SV5)))) {
|
|| ((seenv & (SV0 | SV1 | SV2))
|
||||||
|
&& (seenv & (SV4 | SV5)))) {
|
||||||
col = T_tdwall;
|
col = T_tdwall;
|
||||||
} else {
|
} else {
|
||||||
if (seenv != SV6)
|
if (seenv != SV6)
|
||||||
@@ -2373,13 +2378,14 @@ struct rm *lev;
|
|||||||
break;
|
break;
|
||||||
case WM_T_BR:
|
case WM_T_BR:
|
||||||
#if 0 /* older method, fixed */
|
#if 0 /* older method, fixed */
|
||||||
if (only(seenv, SV5|SV6)) {
|
if (only(seenv, SV5 | SV6)) {
|
||||||
col = T_trcorn;
|
col = T_trcorn;
|
||||||
} else if ((seenv & (SV0|SV1|SV2))
|
} else if ((seenv & (SV0 | SV1 | SV2))
|
||||||
&& only(seenv, SV0|SV1|SV2|SV3|SV4)) {
|
&& only(seenv, SV0 | SV1 | SV2 | SV3 | SV4)) {
|
||||||
col = T_hwall;
|
col = T_hwall;
|
||||||
} else if ((seenv & SV7)
|
} else if ((seenv & SV7)
|
||||||
|| ((seenv & (SV0|SV1|SV2)) && (seenv & (SV5|SV6)))) {
|
|| ((seenv & (SV0 | SV1 | SV2))
|
||||||
|
&& (seenv & (SV5 | SV6)))) {
|
||||||
col = T_tdwall;
|
col = T_tdwall;
|
||||||
} else {
|
} else {
|
||||||
if (seenv != SV4)
|
if (seenv != SV4)
|
||||||
@@ -2410,7 +2416,7 @@ struct rm *lev;
|
|||||||
case SDOOR:
|
case SDOOR:
|
||||||
if (lev->horizontal)
|
if (lev->horizontal)
|
||||||
goto horiz;
|
goto horiz;
|
||||||
/* fall through */
|
/*FALLTHRU*/
|
||||||
case VWALL:
|
case VWALL:
|
||||||
switch (lev->wall_info & WM_MASK) {
|
switch (lev->wall_info & WM_MASK) {
|
||||||
case 0:
|
case 0:
|
||||||
@@ -2431,7 +2437,7 @@ struct rm *lev;
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case HWALL:
|
case HWALL:
|
||||||
horiz:
|
horiz:
|
||||||
switch (lev->wall_info & WM_MASK) {
|
switch (lev->wall_info & WM_MASK) {
|
||||||
case 0:
|
case 0:
|
||||||
idx = seenv ? S_hwall : S_stone;
|
idx = seenv ? S_hwall : S_stone;
|
||||||
@@ -2522,10 +2528,10 @@ struct rm *lev;
|
|||||||
goto do_crwall;
|
goto do_crwall;
|
||||||
case WM_X_BR:
|
case WM_X_BR:
|
||||||
row = cross_matrix[C_br];
|
row = cross_matrix[C_br];
|
||||||
do_crwall:
|
do_crwall:
|
||||||
if (seenv == SV4)
|
if (seenv == SV4) {
|
||||||
idx = S_stone;
|
idx = S_stone;
|
||||||
else {
|
} else {
|
||||||
seenv = seenv & ~SV4; /* strip SV4 */
|
seenv = seenv & ~SV4; /* strip SV4 */
|
||||||
if (seenv == SV0) {
|
if (seenv == SV0) {
|
||||||
col = C_brcorn;
|
col = C_brcorn;
|
||||||
|
|||||||
Reference in New Issue
Block a user