Merge branch 'NetHack-3.6'
This commit is contained in:
+55
-23
@@ -1,4 +1,4 @@
|
||||
/* NetHack 3.6 mkmaze.c $NHDT-Date: 1559227829 2019/05/30 14:50:29 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.72 $ */
|
||||
/* NetHack 3.6 mkmaze.c $NHDT-Date: 1559299316 2019/05/31 10:41:56 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.73 $ */
|
||||
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
|
||||
/*-Copyright (c) Pasi Kallinen, 2018. */
|
||||
/* NetHack may be freely redistributed. See license for details. */
|
||||
@@ -1483,10 +1483,22 @@ movebubbles()
|
||||
}
|
||||
}
|
||||
} else if (Is_airlevel(&u.uz)) {
|
||||
for (x = 0; x < COLNO; x++)
|
||||
for (y = 0; y < ROWNO; y++) {
|
||||
boolean xedge, yedge;
|
||||
|
||||
for (x = 1; x <= (COLNO - 1); x++)
|
||||
for (y = 0; y <= (ROWNO - 1); y++) {
|
||||
levl[x][y] = air_pos;
|
||||
unblock_point(x, y);
|
||||
/* all air or all cloud around the perimeter of the Air
|
||||
level tends to look strange; break up the pattern */
|
||||
xedge = (boolean) (x < gbxmin || x > gbxmax);
|
||||
yedge = (boolean) (y < gbymin || y > gbymax);
|
||||
if (xedge || yedge) {
|
||||
if (!rn2(xedge ? 3 : 5)) {
|
||||
levl[x][y].typ = CLOUD;
|
||||
block_point(x, y);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1579,6 +1591,14 @@ int fd;
|
||||
if (!Is_waterlevel(&u.uz) && !Is_airlevel(&u.uz))
|
||||
return;
|
||||
|
||||
if (fd == -1) { /* special handling for restore in goto_level() */
|
||||
if (!wizard)
|
||||
impossible("restore_waterlevel: returning to %s?",
|
||||
Is_waterlevel(&u.uz) ? "Water" : "Air");
|
||||
setup_waterlevel();
|
||||
return;
|
||||
}
|
||||
|
||||
set_wportal();
|
||||
mread(fd, (genericptr_t) &n, sizeof n);
|
||||
mread(fd, (genericptr_t) &g.xmin, sizeof g.xmin);
|
||||
@@ -1645,26 +1665,37 @@ set_wportal()
|
||||
STATIC_OVL void
|
||||
setup_waterlevel()
|
||||
{
|
||||
int x, y;
|
||||
int xskip, yskip;
|
||||
int water_glyph = cmap_to_glyph(S_water),
|
||||
air_glyph = cmap_to_glyph(S_air);
|
||||
int x, y, xskip, yskip, typ, glyph;
|
||||
|
||||
/* ouch, hardcoded... */
|
||||
if (!Is_waterlevel(&u.uz) && !Is_airlevel(&u.uz))
|
||||
panic("setup_waterlevel(): [%d:%d] neither 'Water' nor 'Air'",
|
||||
(int) u.uz.dnum, (int) u.uz.dlevel);
|
||||
|
||||
/* ouch, hardcoded... (file scope statics and used in bxmin,bymax,&c) */
|
||||
g.xmin = 3;
|
||||
g.ymin = 1;
|
||||
/* use separate statements so that compiler won't complain about min()
|
||||
comparing two constants; the alternative is to do this in the
|
||||
preprocessor: #if (20 > ROWNO-1) g.ymax=ROWNO-1 #else g.ymax=20 #endif */
|
||||
g.xmax = 78;
|
||||
g.xmax = min(g.xmax, (COLNO - 1) - 1);
|
||||
g.ymax = 20;
|
||||
g.ymax = min(g.ymax, (ROWNO - 1));
|
||||
|
||||
/* set hero's memory to water */
|
||||
/* entire level is remembered as one glyph and any unspecified portion
|
||||
should default to level's base element rather than to usual stone */
|
||||
glyph = cmap_to_glyph(Is_waterlevel(&u.uz) ? S_water : S_air);
|
||||
typ = Is_waterlevel(&u.uz) ? WATER : AIR;
|
||||
|
||||
for (x = g.xmin; x <= g.xmax; x++)
|
||||
for (y = g.ymin; y <= g.ymax; y++)
|
||||
levl[x][y].glyph = Is_waterlevel(&u.uz) ? water_glyph : air_glyph;
|
||||
/* set unspecified terrain (stone) and hero's memory to water or air */
|
||||
for (x = 1; x <= COLNO - 1; x++)
|
||||
for (y = 0; y <= ROWNO - 1; y++) {
|
||||
levl[x][y].glyph = glyph;
|
||||
if (levl[x][y].typ == STONE)
|
||||
levl[x][y].typ = typ;
|
||||
}
|
||||
|
||||
/* make bubbles */
|
||||
|
||||
if (Is_waterlevel(&u.uz)) {
|
||||
xskip = 10 + rn2(10);
|
||||
yskip = 4 + rn2(4);
|
||||
@@ -1684,7 +1715,6 @@ unsetup_waterlevel()
|
||||
struct bubble *b, *bb;
|
||||
|
||||
/* free bubbles */
|
||||
|
||||
for (b = g.bbubbles; b; b = bb) {
|
||||
bb = b->next;
|
||||
free((genericptr_t) b);
|
||||
@@ -1703,14 +1733,15 @@ int x, y, n;
|
||||
* in situ, either. The first two elements tell the dimensions of
|
||||
* the bubble's bounding box.
|
||||
*/
|
||||
static uchar bm2[] = { 2, 1, 0x3 },
|
||||
bm3[] = { 3, 2, 0x7, 0x7 },
|
||||
bm4[] = { 4, 3, 0x6, 0xf, 0x6 },
|
||||
bm5[] = { 5, 3, 0xe, 0x1f, 0xe },
|
||||
bm6[] = { 6, 4, 0x1e, 0x3f, 0x3f, 0x1e },
|
||||
bm7[] = { 7, 4, 0x3e, 0x7f, 0x7f, 0x3e },
|
||||
bm8[] = { 8, 4, 0x7e, 0xff, 0xff, 0x7e },
|
||||
*bmask[] = { bm2, bm3, bm4, bm5, bm6, bm7, bm8 };
|
||||
static const uchar
|
||||
bm2[] = { 2, 1, 0x3 },
|
||||
bm3[] = { 3, 2, 0x7, 0x7 },
|
||||
bm4[] = { 4, 3, 0x6, 0xf, 0x6 },
|
||||
bm5[] = { 5, 3, 0xe, 0x1f, 0xe },
|
||||
bm6[] = { 6, 4, 0x1e, 0x3f, 0x3f, 0x1e },
|
||||
bm7[] = { 7, 4, 0x3e, 0x7f, 0x7f, 0x3e },
|
||||
bm8[] = { 8, 4, 0x7e, 0xff, 0xff, 0x7e },
|
||||
*const bmask[] = { bm2, bm3, bm4, bm5, bm6, bm7, bm8 };
|
||||
struct bubble *b;
|
||||
|
||||
if (x >= gbxmax || y >= gbymax)
|
||||
@@ -1901,7 +1932,8 @@ boolean ini;
|
||||
b->dy = -b->dy;
|
||||
break;
|
||||
case 3:
|
||||
b->dy = -b->dy; /* fall through */
|
||||
b->dy = -b->dy;
|
||||
/*FALLTHRU*/
|
||||
case 2:
|
||||
b->dx = -b->dx;
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user