X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame_em%2Fconvert.c;h=17f709853ebef7e9625058eeb1508e59ad963d7c;hb=2851c280138444b53cf088e4e4f3e7ef8787022c;hp=d8157a695b748d521fb34d5969d7fa8a6a5a6fdc;hpb=afeec80878187293b10f7dcdd6ff3c094cc97e5d;p=rocksndiamonds.git diff --git a/src/game_em/convert.c b/src/game_em/convert.c index d8157a69..17f70985 100644 --- a/src/game_em/convert.c +++ b/src/game_em/convert.c @@ -11,8 +11,6 @@ #include "main_em.h" -#define ALLOW_ROLLING_SPRING - static unsigned char remap_v6[256] = { /* filter crap for v6 */ @@ -22,11 +20,7 @@ static unsigned char remap_v6[256] = 0,16,2,18, 36,37,37,37, 40,41,42,43, 44,45,128,128, 128,148,148, 148,45,45,45, 148,0,57,58, 59,60,61,62,63, -#ifdef ALLOW_ROLLING_SPRING 64,65,66,67, 68,69,69,71, 72,73,74,75, 118,75,75,75, -#else - 64,65,66,67, 68,69,69,69, 69,73,74,75, 118,75,75,75, -#endif 75,75,75,75, 75,153,153,153, 153,153,153,153, 153,153,153,153, 153,153,153,99, 100,68,68,68, 68,68,68,68, 68,118,118,118, 118,118,114,115, 131,118,118,119, 120,121,122,118, 118,118,118,118, @@ -517,6 +511,10 @@ int cleanup_em_level(unsigned char *src, int length, char *filename) * - introduced ALLOW_ROLLING_SPRING; if defined, do NOT turn rolling spring * into regular spring, because this breaks at least E.M.C. Mine 3, level 79 * (see comment directly above) + * + * 2020-01-19 + * - always use BAD_ROLL and ALLOW_ROLLING_SPRING code when converting caves + * (that is, always allow initial rolling objects in caves now) */ static unsigned short remap_emerald[256] = @@ -538,28 +536,19 @@ static unsigned short remap_emerald[256] = 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, -#ifdef ALLOW_ROLLING_SPRING Xexit_1, Xexit_2, Xexit_3, Xballoon, Xplant, Xspring, Xspring_fall, Xspring_w, Xspring_e, Xball_1, Xball_2, Xandroid, Xblank, Xandroid, Xandroid, Xandroid, -#else - Xexit_1, Xexit_2, Xexit_3, Xballoon, - Xplant, Xspring, Xspring, Xspring, - Xspring, Xball_1, Xball_2, Xandroid, - Xblank, Xandroid, Xandroid, Xandroid, -#endif Xandroid, Xandroid, Xandroid, Xandroid, Xandroid, Xblank, Xblank, Xblank, Xblank, Xblank, Xblank, Xblank, Xblank, Xblank, Xblank, Xblank, -#ifdef BAD_ROLL - Xblank, Xblank, Xblank, Xpush_spring_w, Xpush_spring_e, Xacid_1, Xacid_2, Xacid_3, Xacid_4, Xacid_5, Xacid_6, Xacid_7, @@ -570,20 +559,6 @@ static unsigned short remap_emerald[256] = Xpush_bomb_e, Xpush_stone_w, Xpush_stone_e, Xblank, Xblank, Xblank, Xblank, Xblank, -#else - - Xblank, Xblank, Xblank, Xspring, - Xspring, Xacid_1, Xacid_2, Xacid_3, - Xacid_4, Xacid_5, Xacid_6, Xacid_7, - Xacid_8, Xblank, Xblank, Xblank, - - Xblank, Xblank, Xnut, Xnut, - Xsteel_1, Xblank, Xblank, Xbomb, - Xbomb, Xstone, Xstone, Xblank, - Xblank, Xblank, Xblank, Xblank, - -#endif - Xblank, Xroundwall_1, Xgrass, Xsteel_1, Xwall_1, Xkey_1, Xkey_2, Xkey_3, Xkey_4, Xdoor_1, Xdoor_2, Xdoor_3, @@ -668,8 +643,8 @@ void convert_em_level(unsigned char *src, int file_version) 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; @@ -925,48 +900,6 @@ void convert_em_level(unsigned char *src, int file_version) lev.wheel_cnt_initial = lev.wheel_time; break; -#ifndef BAD_ROLL - case 0x63: /* spring roll left */ - src[temp - 1] = 0x45; - src[temp] = 0x80; - break; - - case 0x64: /* spring roll right */ - src[temp + 1] = 0x45; - src[temp] = 0x80; - break; - - case 0x72: /* nut roll left */ - src[temp - 1] = 0x25; - src[temp] = 0x80; - break; - - case 0x73: /* nut roll right */ - src[temp + 1] = 0x25; - src[temp] = 0x80; - break; - - case 0x77: /* bomb roll left */ - src[temp - 1] = 0x10; - src[temp] = 0x80; - break; - - case 0x78: /* bomb roll right */ - src[temp + 1] = 0x10; - src[temp] = 0x80; - break; - - case 0x79: /* stone roll left */ - src[temp - 1] = 0x00; - src[temp] = 0x80; - break; - - case 0x7A: /* stone roll right */ - src[temp + 1] = 0x00; - src[temp] = 0x80; - break; -#endif - case 0xA3: /* fake blank */ lev.lenses_cnt_initial = 9999; break; @@ -978,15 +911,15 @@ void convert_em_level(unsigned char *src, int file_version) } /* first fill the complete playfield with the default border element */ - for (y = 0; y < HEIGHT; y++) - for (x = 0; x < 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 */ @@ -1005,17 +938,34 @@ void prepare_em_level(void) /* reset all runtime variables to their initial values */ - for (y = 0; y < HEIGHT; y++) - for (x = 0; x < WIDTH; x++) - Cave[y][x] = native_em_level.cave[x][y]; + game_init_cave_buffers(); + + lev.left = CAVE_BUFFER_XOFFSET; + lev.top = CAVE_BUFFER_YOFFSET; + lev.right = lev.left + lev.width; + lev.bottom = lev.top + lev.height; + + /* 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 (y = 0; y < HEIGHT; y++) - for (x = 0; x < WIDTH; x++) - Next[y][x] = Cave[y][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 (y = 0; y < HEIGHT; y++) - for (x = 0; x < WIDTH; x++) - Draw[y][x] = Cave[y][x]; + 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; @@ -1056,7 +1006,7 @@ void prepare_em_level(void) 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; @@ -1088,7 +1038,9 @@ void prepare_em_level(void) native_em_level.cave[x][y] = Xblank; - Cave[y][x] = Next[y][x] = Draw[y][x] = 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; } } } @@ -1101,8 +1053,8 @@ void prepare_em_level(void) 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;