Xblank, Xsand, Xsand, Xsand,
Xsand_stone, Xsand_stone, Xsand_stone, Xsand,
- Xstone, Xslidewall_ew, Xslidewall_ns, Xdynamite_1,
+ Xstone, Xslide_ew, Xslide_ns, Xdynamite_1,
Xdynamite_2, Xdynamite_3, Xdynamite_4, Xacid_s,
Xexit_1, Xexit_2, Xexit_3, Xballoon,
for (i = 0; i < 2; i++)
{
temp = src[0x830 + i * 2] << 8 | src[0x831 + i * 2];
- ply[i].x_initial = (temp & 63) + 1;
- ply[i].y_initial = (temp >> 6 & 31) + 1;
+ ply[i].x_initial = (temp & 63);
+ ply[i].y_initial = (temp >> 6 & 31);
}
temp = (src[0x834] << 8 | src[0x835]) * 28;
}
/* first fill the complete playfield with the default border element */
- for (y = 0; y < CAVE_BUFFER_HEIGHT; y++)
- for (x = 0; x < CAVE_BUFFER_WIDTH; x++)
+ for (y = 0; y < CAVE_HEIGHT; y++)
+ for (x = 0; x < CAVE_WIDTH; x++)
native_em_level.cave[x][y] = Zborder;
/* then copy the real level contents from level file into the playfield */
temp = 0;
for (y = 0; y < lev.height; y++)
for (x = 0; x < lev.width; x++)
- native_em_level.cave[x + 1][y + 1] =
+ native_em_level.cave[x][y] =
get_em_element(src[temp++], file_version);
/* at last, set the two players at their positions in the playfield */
/* reset all runtime variables to their initial values */
- for (y = 0; y < CAVE_BUFFER_HEIGHT; y++)
- for (x = 0; x < CAVE_BUFFER_WIDTH; x++)
- lev.cave[x][y] = native_em_level.cave[x][y];
+ game_init_cave_buffers();
- for (y = 0; y < CAVE_BUFFER_HEIGHT; y++)
- for (x = 0; x < CAVE_BUFFER_WIDTH; x++)
- lev.next[x][y] = lev.cave[x][y];
+ lev.left = CAVE_BUFFER_XOFFSET;
+ lev.top = CAVE_BUFFER_YOFFSET;
+ lev.right = lev.left + lev.width;
+ lev.bottom = lev.top + lev.height;
- for (y = 0; y < CAVE_BUFFER_HEIGHT; y++)
- for (x = 0; x < CAVE_BUFFER_WIDTH; x++)
- lev.draw[x][y] = lev.cave[x][y];
+ /* add linked cave buffer columns for wrap-around movement */
+ for (x = 0; x < lev.left; x++)
+ {
+ lev.cavecol[x] = lev.cavecol[lev.width + x];
+ lev.nextcol[x] = lev.nextcol[lev.width + x];
+ lev.drawcol[x] = lev.drawcol[lev.width + x];
+ lev.boomcol[x] = lev.boomcol[lev.width + x];
+
+ lev.cavecol[lev.right + x] = lev.cavecol[lev.left + x];
+ lev.nextcol[lev.right + x] = lev.nextcol[lev.left + x];
+ lev.drawcol[lev.right + x] = lev.drawcol[lev.left + x];
+ lev.boomcol[lev.right + x] = lev.boomcol[lev.left + x];
+ }
+
+ for (x = 0; x < lev.width; x++)
+ for (y = 0; y < lev.height; y++)
+ lev.cave[lev.left + x][lev.top + y] = native_em_level.cave[x][y];
+
+ for (x = lev.left; x < lev.right; x++)
+ for (y = lev.top; y < lev.bottom; y++)
+ lev.next[x][y] = lev.draw[x][y] = lev.cave[x][y];
lev.time_initial = lev.time_seconds;
lev.time = lev.time_initial;
ply[i].exists = 0;
ply[i].alive_initial = FALSE;
- if (ply[i].x_initial > 0 && ply[i].y_initial > 0)
+ if (ply[i].x_initial != -1 && ply[i].y_initial != -1)
{
ply[i].exists = 1;
native_em_level.cave[x][y] = Xblank;
- lev.cave[x][y] = lev.next[x][y] = lev.draw[x][y] = Xblank;
+ lev.cave[lev.left + x][lev.top + y] = Xblank;
+ lev.next[lev.left + x][lev.top + y] = Xblank;
+ lev.draw[lev.left + x][lev.top + y] = Xblank;
}
}
}
ply[i].dynamite_cnt = 0;
ply[i].keys = 0;
ply[i].anim = 0;
- ply[i].oldx = ply[i].x = ply[i].x_initial;
- ply[i].oldy = ply[i].y = ply[i].y_initial;
+ ply[i].oldx = ply[i].x = ply[i].x_initial + lev.left;
+ ply[i].oldy = ply[i].y = ply[i].y_initial + lev.top;
ply[i].last_move_dir = MV_NONE;
ply[i].joy_n = ply[i].joy_e = ply[i].joy_s = ply[i].joy_w = 0;
ply[i].joy_snap = ply[i].joy_drop = 0;