}
}
} 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);
- xedge = (boolean) (x < bxmin || x > bxmax);
- yedge = (boolean) (y < bymin || y > bymax);
+ /* 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);
+ }
+ }
}
}
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) &xmin, sizeof xmin);
- mread(fd, (genericptr_t) &ymin, sizeof ymin);
- mread(fd, (genericptr_t) &xmax, sizeof xmax);
- mread(fd, (genericptr_t) &ymax, sizeof ymax);
+ mread(fd, (genericptr_t) &g.xmin, sizeof g.xmin);
+ mread(fd, (genericptr_t) &g.ymin, sizeof g.ymin);
+ mread(fd, (genericptr_t) &g.xmax, sizeof g.xmax);
+ mread(fd, (genericptr_t) &g.ymax, sizeof g.ymax);
for (i = 0; i < n; i++) {
btmp = b;
b = (struct bubble *) alloc(sizeof *b);
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);
- xmin = 3;
- ymin = 1;
+ /* ouch, hardcoded... (file scope statics and used in bxmin,bymax,&c) */
- preprocessor: #if (20 > ROWNO-1) ymax=ROWNO-1 #else ymax=20 #endif */
- xmax = 78;
- xmax = min(xmax, (COLNO - 1) - 1);
- ymax = 20;
- ymax = min(ymax, (ROWNO - 1));
+ 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
-
- /* set hero's memory to water */
-
- 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;
++ 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));
+
+ /* 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;
+
+ /* 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);
struct bubble *b, *bb;
/* free bubbles */
-
- for (b = bbubbles; b; b = bb) {
+ for (b = g.bbubbles; b; b = bb) {
bb = b->next;
free((genericptr_t) b);
}
* 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 >= bxmax || y >= bymax)
+ if (x >= gbxmax || y >= gbymax)
return;
if (n >= SIZE(bmask)) {
impossible("n too large (mk_bubble)");