Moving clouds on the plane of air

Reusing the plane of water air bubbles code
This commit is contained in:
Pasi Kallinen
2015-03-31 11:46:46 +03:00
parent 19aeb91dc4
commit 9f605ed2b3
4 changed files with 191 additions and 162 deletions
+20 -20
View File
@@ -139,26 +139,26 @@ GEOMETRY:center,center
# This map has no visible outer boundary, and # This map has no visible outer boundary, and
# is all "air". # is all "air".
MAP MAP
AAAAAAAAAAAAAAAAAAAAAAAACCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAACCCCCCAAAAAAAACCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAACCAACCCCCAAAAAACCCCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAACCACCCCCCCAAAAACCCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAACCCCCCCCCCAAAAACCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAACCCCAAACCAAACCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAACCCCAAAAAACCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAACCCCCCCAAAACCACCCCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAACCCCAAAAAAACCACAACCCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCAACCCCCCCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAACCCCAAACCCCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAACACACCCCCAAACCCCCCCAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAACAACCCCCCCAAAACCCCCCCAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAACACCCCCCCCAAACCCCCCCCAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCCCCCCCCCAACCCCCCCCAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAACACCCCCCCCCCACCCCCCCCAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAACAACCCCCCCCCCCCCCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAACCCCCCAAACCCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAACCAAAAAACCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ENDMAP ENDMAP
# Use up and down regions to partition the level into three parts; # Use up and down regions to partition the level into three parts;
# teleportation can't cross from one part into another. # teleportation can't cross from one part into another.
+1 -1
View File
@@ -292,7 +292,7 @@ boolean resuming;
} }
restore_attrib(); restore_attrib();
/* underwater and waterlevel vision are done here */ /* underwater and waterlevel vision are done here */
if (Is_waterlevel(&u.uz)) if (Is_waterlevel(&u.uz) || Is_airlevel(&u.uz))
movebubbles(); movebubbles();
else if (Underwater) else if (Underwater)
under_water(0); under_water(0);
+1 -1
View File
@@ -1286,7 +1286,7 @@ boolean at_stairs, falling, portal;
} }
/* initial movement of bubbles just before vision_recalc */ /* initial movement of bubbles just before vision_recalc */
if (Is_waterlevel(&u.uz)) if (Is_waterlevel(&u.uz) || Is_airlevel(&u.uz))
movebubbles(); movebubbles();
if (level_info[new_ledger].flags & FORGOTTEN) { if (level_info[new_ledger].flags & FORGOTTEN) {
+37 -8
View File
@@ -344,7 +344,8 @@ fixup_special()
was_waterlevel = FALSE; was_waterlevel = FALSE;
u.uinwater = 0; u.uinwater = 0;
unsetup_waterlevel(); unsetup_waterlevel();
} else if (Is_waterlevel(&u.uz)) { }
if (Is_waterlevel(&u.uz) || Is_airlevel(&u.uz)) {
level.flags.hero_memory = 0; level.flags.hero_memory = 0;
was_waterlevel = TRUE; was_waterlevel = TRUE;
/* water level is an odd beast - it has to be set up /* water level is an odd beast - it has to be set up
@@ -922,11 +923,16 @@ movebubbles()
struct trap *btrap; struct trap *btrap;
static const struct rm water_pos = static const struct rm water_pos =
{ cmap_to_glyph(S_water), WATER, 0, 0, 0, 0, 0, 0, 0 }; { cmap_to_glyph(S_water), WATER, 0, 0, 0, 0, 0, 0, 0 };
static const struct rm air_pos =
{ cmap_to_glyph(S_cloud), AIR, 0, 0, 0, 1, 0, 0, 0 };
/* set up the portal the first time bubbles are moved */ /* set up the portal the first time bubbles are moved */
if (!wportal) set_wportal(); if (!wportal) set_wportal();
vision_recalc(2); vision_recalc(2);
if (Is_waterlevel(&u.uz)) {
/* keep attached ball&chain separate from bubble objects */ /* keep attached ball&chain separate from bubble objects */
if (Punished) unplacebc(); if (Punished) unplacebc();
@@ -1015,6 +1021,13 @@ movebubbles()
block_point(x,y); block_point(x,y);
} }
} }
} else if (Is_airlevel(&u.uz)) {
for (x = 0; x < COLNO; x++)
for (y = 0; y < ROWNO; y++) {
levl[x][y] = air_pos;
unblock_point(x,y);
}
}
/* /*
* Every second time traverse down. This is because otherwise * Every second time traverse down. This is because otherwise
@@ -1032,7 +1045,7 @@ movebubbles()
} }
/* put attached ball&chain back */ /* put attached ball&chain back */
if (Punished) placebc(); if (Is_waterlevel(&u.uz) && Punished) placebc();
vision_full_recalc = 1; vision_full_recalc = 1;
} }
@@ -1076,7 +1089,7 @@ int fd, mode;
{ {
register struct bubble *b; register struct bubble *b;
if (!Is_waterlevel(&u.uz)) return; if (!Is_waterlevel(&u.uz) && !Is_airlevel(&u.uz)) return;
if (perform_bwrite(mode)) { if (perform_bwrite(mode)) {
int n = 0; int n = 0;
@@ -1101,7 +1114,7 @@ register int fd;
register int i; register int i;
int n; int n;
if (!Is_waterlevel(&u.uz)) return; if (!Is_waterlevel(&u.uz) && !Is_airlevel(&u.uz)) return;
set_wportal(); set_wportal();
mread(fd,(genericptr_t)&n,sizeof(int)); mread(fd,(genericptr_t)&n,sizeof(int));
@@ -1177,6 +1190,7 @@ setup_waterlevel()
register int x, y; register int x, y;
register int xskip, yskip; register int xskip, yskip;
register int water_glyph = cmap_to_glyph(S_water); register int water_glyph = cmap_to_glyph(S_water);
register int air_glyph = cmap_to_glyph(S_air);
/* ouch, hardcoded... */ /* ouch, hardcoded... */
@@ -1189,12 +1203,18 @@ setup_waterlevel()
for (x = xmin; x <= xmax; x++) for (x = xmin; x <= xmax; x++)
for (y = ymin; y <= ymax; y++) for (y = ymin; y <= ymax; y++)
levl[x][y].glyph = water_glyph; levl[x][y].glyph = Is_waterlevel(&u.uz) ? water_glyph : air_glyph;
/* make bubbles */ /* make bubbles */
if (Is_waterlevel(&u.uz)) {
xskip = 10 + rn2(10); xskip = 10 + rn2(10);
yskip = 4 + rn2(4); yskip = 4 + rn2(4);
} else {
xskip = 6 + rn2(4);
yskip = 3 + rn2(3);
}
for (x = bxmin; x <= bxmax; x += xskip) for (x = bxmin; x <= bxmax; x += xskip)
for (y = bymin; y <= bymax; y += yskip) for (y = bymin; y <= bymax; y += yskip)
mk_bubble(x,y,rn2(7)); mk_bubble(x,y,rn2(7));
@@ -1280,6 +1300,8 @@ register boolean ini;
register int x, y, i, j, colli = 0; register int x, y, i, j, colli = 0;
struct container *cons, *ctemp; struct container *cons, *ctemp;
/* clouds move slowly */
if (!Is_airlevel(&u.uz) || !rn2(6)) {
/* move bubble */ /* move bubble */
if (dx < -1 || dx > 1 || dy < -1 || dy > 1) { if (dx < -1 || dx > 1 || dy < -1 || dy > 1) {
/* pline("mv_bubble: dx = %d, dy = %d", dx, dy); */ /* pline("mv_bubble: dx = %d, dy = %d", dx, dy); */
@@ -1323,17 +1345,24 @@ register boolean ini;
b->x += dx; b->x += dx;
b->y += dy; b->y += dy;
}
/* void positions inside bubble */ /* draw the bubbles */
for (i = 0, x = b->x; i < (int) b->bm[0]; i++, x++) for (i = 0, x = b->x; i < (int) b->bm[0]; i++, x++)
for (j = 0, y = b->y; j < (int) b->bm[1]; j++, y++) for (j = 0, y = b->y; j < (int) b->bm[1]; j++, y++)
if (b->bm[j + 2] & (1 << i)) { if (b->bm[j + 2] & (1 << i)) {
if (Is_waterlevel(&u.uz)) {
levl[x][y].typ = AIR; levl[x][y].typ = AIR;
levl[x][y].lit = 1; levl[x][y].lit = 1;
unblock_point(x,y); unblock_point(x,y);
} else if (Is_airlevel(&u.uz)) {
levl[x][y].typ = CLOUD;
levl[x][y].lit = 1;
block_point(x,y);
}
} }
if (Is_waterlevel(&u.uz)) {
/* replace contents of bubble */ /* replace contents of bubble */
for (cons = b->cons; cons; cons = ctemp) { for (cons = b->cons; cons; cons = ctemp) {
ctemp = cons->next; ctemp = cons->next;
@@ -1385,9 +1414,9 @@ register boolean ini;
free((genericptr_t)cons); free((genericptr_t)cons);
} }
b->cons = 0; b->cons = 0;
}
/* boing? */ /* boing? */
switch (colli) { switch (colli) {
case 1: b->dy = -b->dy; break; case 1: b->dy = -b->dy; break;
case 3: b->dy = -b->dy; /* fall through */ case 3: b->dy = -b->dy; /* fall through */