added separate playfield and buffer sizes for EM engine caves
authorHolger Schemel <info@artsoft.org>
Wed, 29 Jan 2020 16:01:42 +0000 (17:01 +0100)
committerHolger Schemel <info@artsoft.org>
Tue, 19 May 2020 16:12:57 +0000 (18:12 +0200)
The cave playfield size (or just cave size) is the size of the visible
playfield (potentially containing an additional steelwall border, if
the level was converted from R'n'D format and does not contain a
steelwall border).

The cave buffer size is the size of the internal cave buffer (which
also contains surrounding internal game engine elements) that is used
by the EM game engine logic.

Currently the native cave structure has the same size as the internal
cave buffer; this should be changed.

src/files.c
src/game_em/convert.c
src/game_em/emerald.h
src/game_em/export.h
src/game_em/graphics.c
src/game_em/input.c
src/game_em/logic.c

index 7224337dd1f7e4af61cf95a05450bef276fb05e3..0c0f2f9b08ef1349c77fdc04feff1ae4fc3efff6 100644 (file)
@@ -3519,8 +3519,8 @@ static void CopyNativeLevel_RND_to_EM(struct LevelInfo *level)
   struct PLAYER **ply = level_em->ply;
   int i, j, x, y;
 
-  lev->width  = MIN(level->fieldx, EM_MAX_CAVE_WIDTH);
-  lev->height = MIN(level->fieldy, EM_MAX_CAVE_HEIGHT);
+  lev->width  = MIN(level->fieldx, EM_MAX_CAVE_BUFFER_WIDTH);
+  lev->height = MIN(level->fieldy, EM_MAX_CAVE_BUFFER_HEIGHT);
 
   lev->time_seconds     = level->time;
   lev->required_initial = level->gems_needed;
@@ -3574,8 +3574,8 @@ static void CopyNativeLevel_RND_to_EM(struct LevelInfo *level)
   map_android_clone_elements_RND_to_EM(level);
 
   // first fill the complete playfield with the default border element
-  for (y = 0; y < EM_MAX_CAVE_HEIGHT; y++)
-    for (x = 0; x < EM_MAX_CAVE_WIDTH; x++)
+  for (y = 0; y < EM_MAX_CAVE_BUFFER_HEIGHT; y++)
+    for (x = 0; x < EM_MAX_CAVE_BUFFER_WIDTH; x++)
       level_em->cave[x][y] = Zborder;
 
   if (BorderElement == EL_STEELWALL)
index dd2209009446fb5c04e021c40edc83a453cb4325..996f0d21a039b73f326557062fd03ba709cff540 100644 (file)
@@ -911,8 +911,8 @@ void convert_em_level(unsigned char *src, int file_version)
   }
 
   /* first fill the complete playfield with the default border element */
-  for (y = 0; y < CAVE_HEIGHT; y++)
-    for (x = 0; x < CAVE_WIDTH; x++)
+  for (y = 0; y < CAVE_BUFFER_HEIGHT; y++)
+    for (x = 0; x < CAVE_BUFFER_WIDTH; x++)
       native_em_level.cave[x][y] = Zborder;
 
   /* then copy the real level contents from level file into the playfield */
@@ -938,16 +938,16 @@ void prepare_em_level(void)
 
   /* reset all runtime variables to their initial values */
 
-  for (y = 0; y < CAVE_HEIGHT; y++)
-    for (x = 0; x < CAVE_WIDTH; x++)
+  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];
 
-  for (y = 0; y < CAVE_HEIGHT; y++)
-    for (x = 0; x < CAVE_WIDTH; x++)
+  for (y = 0; y < CAVE_BUFFER_HEIGHT; y++)
+    for (x = 0; x < CAVE_BUFFER_WIDTH; x++)
       lev.next[x][y] = lev.cave[x][y];
 
-  for (y = 0; y < CAVE_HEIGHT; y++)
-    for (x = 0; x < CAVE_WIDTH; x++)
+  for (y = 0; y < CAVE_BUFFER_HEIGHT; y++)
+    for (x = 0; x < CAVE_BUFFER_WIDTH; x++)
       lev.draw[x][y] = lev.cave[x][y];
 
   lev.time_initial = lev.time_seconds;
index 1cf3deffc07d50d5ab76af5f8b7f31234ed88c89..26032ff428c3486bdc6681c0a4618171e887a2ac 100644 (file)
@@ -51,9 +51,15 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 /* define these to use additional elements */
 #define EM_ENGINE_USE_ADDITIONAL_ELEMENTS
 
-/* one border for Zborder elements, one border for steelwall, if needed */
-#define CAVE_WIDTH                     (MAX_PLAYFIELD_WIDTH  + 2 + 2)
-#define CAVE_HEIGHT                    (MAX_PLAYFIELD_HEIGHT + 2 + 2)
+/* with border for steelwall, if needed (when converted from R'n'D level) */
+#define CAVE_WIDTH                     (MAX_PLAYFIELD_WIDTH  + 2)
+#define CAVE_HEIGHT                    (MAX_PLAYFIELD_HEIGHT + 2)
+
+/* with border for Zborder elements (surrounding the visible playfield) */
+#define CAVE_BUFFER_XOFFSET            1
+#define CAVE_BUFFER_YOFFSET            1
+#define CAVE_BUFFER_WIDTH              (CAVE_WIDTH  + 2 * CAVE_BUFFER_XOFFSET)
+#define CAVE_BUFFER_HEIGHT             (CAVE_HEIGHT + 2 * CAVE_BUFFER_YOFFSET)
 
 /*
   -----------------------------------------------------------------------------
@@ -701,15 +707,15 @@ struct LEVEL
 
   int exit_x, exit_y;          /* kludge for playing player exit sound */
 
-  short cavebuf[CAVE_WIDTH][CAVE_HEIGHT];
-  short nextbuf[CAVE_WIDTH][CAVE_HEIGHT];
-  short drawbuf[CAVE_WIDTH][CAVE_HEIGHT];
-  short boombuf[CAVE_WIDTH][CAVE_HEIGHT];
+  short cavebuf[CAVE_BUFFER_WIDTH][CAVE_BUFFER_HEIGHT];
+  short nextbuf[CAVE_BUFFER_WIDTH][CAVE_BUFFER_HEIGHT];
+  short drawbuf[CAVE_BUFFER_WIDTH][CAVE_BUFFER_HEIGHT];
+  short boombuf[CAVE_BUFFER_WIDTH][CAVE_BUFFER_HEIGHT];
 
-  short *cavecol[CAVE_WIDTH];
-  short *nextcol[CAVE_WIDTH];
-  short *drawcol[CAVE_WIDTH];
-  short *boomcol[CAVE_WIDTH];
+  short *cavecol[CAVE_BUFFER_WIDTH];
+  short *nextcol[CAVE_BUFFER_WIDTH];
+  short *drawcol[CAVE_BUFFER_WIDTH];
+  short *boomcol[CAVE_BUFFER_WIDTH];
 
   short **cave;
   short **next;
index 9c0ff052e828810d0a782c9453610ec00ac4dcdb..5ba8c5ce2da1743cef9d611cce74fece1d985917 100644 (file)
@@ -12,8 +12,8 @@
 // constant definitions
 // ----------------------------------------------------------------------------
 
-#define EM_MAX_CAVE_WIDTH              CAVE_WIDTH
-#define EM_MAX_CAVE_HEIGHT             CAVE_HEIGHT
+#define EM_MAX_CAVE_BUFFER_WIDTH       CAVE_BUFFER_WIDTH
+#define EM_MAX_CAVE_BUFFER_HEIGHT      CAVE_BUFFER_HEIGHT
 
 
 // ----------------------------------------------------------------------------
@@ -44,7 +44,7 @@ struct LevelInfo_EM
 {
   int file_version;
 
-  short cave[CAVE_WIDTH][CAVE_HEIGHT];
+  short cave[CAVE_BUFFER_WIDTH][CAVE_BUFFER_HEIGHT];
 
   struct LEVEL *lev;
   struct PLAYER *ply[MAX_PLAYERS];
index c6c1d5428496dbe0b89699251ca694dfbe2a7e96..548b24db1c7e29680e687fa64fa1b9673665e04d 100644 (file)
@@ -300,8 +300,8 @@ static void animscreen(void)
   };
 
   if (!game.use_native_emc_graphics_engine)
-    for (y = 2; y < CAVE_HEIGHT - 2; y++)
-      for (x = 2; x < CAVE_WIDTH - 2; x++)
+    for (y = 2; y < CAVE_BUFFER_HEIGHT - 2; y++)
+      for (x = 2; x < CAVE_BUFFER_WIDTH - 2; x++)
        SetGfxAnimation_EM(&graphic_info_em_object[lev.draw[x][y]][frame],
                           lev.draw[x][y], 7 - frame, x - 2, y - 2);
 
@@ -326,8 +326,8 @@ static void animscreen(void)
          int yy = y + xy[i][1];
          int tile_next;
 
-         if (xx < 0 || xx >= CAVE_WIDTH ||
-             yy < 0 || yy >= CAVE_HEIGHT)
+         if (xx < 0 || xx >= CAVE_BUFFER_WIDTH ||
+             yy < 0 || yy >= CAVE_BUFFER_HEIGHT)
            continue;
 
          tile_next = lev.draw[xx][yy];
index 3883bbda97a3bf0fadaf3ecda9eb4f75dd1c6d9d..70106b1d85cdc6bd7e71a4176dc8fb121b442b92 100644 (file)
@@ -22,26 +22,26 @@ void game_init_vars(void)
 
   RandomEM = 1684108901;
 
-  for (y = 0; y < CAVE_HEIGHT; y++)
-    for (x = 0; x < CAVE_WIDTH; x++)
+  for (y = 0; y < CAVE_BUFFER_HEIGHT; y++)
+    for (x = 0; x < CAVE_BUFFER_WIDTH; x++)
       lev.cavebuf[x][y] = Zborder;
-  for (y = 0; y < CAVE_HEIGHT; y++)
-    for (x = 0; x < CAVE_WIDTH; x++)
+  for (y = 0; y < CAVE_BUFFER_HEIGHT; y++)
+    for (x = 0; x < CAVE_BUFFER_WIDTH; x++)
       lev.nextbuf[x][y] = Zborder;
-  for (y = 0; y < CAVE_HEIGHT; y++)
-    for (x = 0; x < CAVE_WIDTH; x++)
+  for (y = 0; y < CAVE_BUFFER_HEIGHT; y++)
+    for (x = 0; x < CAVE_BUFFER_WIDTH; x++)
       lev.drawbuf[x][y] = Zborder;
-  for (y = 0; y < CAVE_HEIGHT; y++)
-    for (x = 0; x < CAVE_WIDTH; x++)
+  for (y = 0; y < CAVE_BUFFER_HEIGHT; y++)
+    for (x = 0; x < CAVE_BUFFER_WIDTH; x++)
       lev.boombuf[x][y] = Xblank;
 
-  for (x = 0; x < CAVE_WIDTH; x++)
+  for (x = 0; x < CAVE_BUFFER_WIDTH; x++)
     lev.cavecol[x] = lev.cavebuf[x];
-  for (x = 0; x < CAVE_WIDTH; x++)
+  for (x = 0; x < CAVE_BUFFER_WIDTH; x++)
     lev.nextcol[x] = lev.nextbuf[x];
-  for (x = 0; x < CAVE_WIDTH; x++)
+  for (x = 0; x < CAVE_BUFFER_WIDTH; x++)
     lev.drawcol[x] = lev.drawbuf[x];
-  for (x = 0; x < CAVE_WIDTH; x++)
+  for (x = 0; x < CAVE_BUFFER_WIDTH; x++)
     lev.boomcol[x] = lev.boombuf[x];
 
   lev.cave = lev.cavecol;
index da397d56e98a1c38c23f508f26ea32b917b7c242..df027b63801af736538c29a95be9efd6956b3225 100644 (file)
@@ -6273,8 +6273,8 @@ void logic_2(void)
   seed = RandomEM;
   score = 0;
 
-  for (y = 1; y < CAVE_HEIGHT - 1; y++)
-    for (x = 0; x < CAVE_WIDTH; x++)
+  for (y = 1; y < CAVE_BUFFER_HEIGHT - 1; y++)
+    for (x = 0; x < CAVE_BUFFER_WIDTH; x++)
       handle_tile(x, y);
 
   if (ply[0].alive || ply[1].alive || ply[2].alive || ply[3].alive)
@@ -6334,8 +6334,8 @@ void logic_3(void)
 
   for (count = lev.amoeba_time; count--;)
   {
-    x = (random >> 10) % (CAVE_WIDTH - 2);
-    y = (random >> 20) % (CAVE_HEIGHT - 2);
+    x = (random >> 10) % (CAVE_BUFFER_WIDTH - 2);
+    y = (random >> 20) % (CAVE_BUFFER_HEIGHT - 2);
 
     Lamoeba(x, y);
 
@@ -6346,13 +6346,13 @@ void logic_3(void)
 
   /* handle explosions */
 
-  for (y = 1; y < CAVE_HEIGHT - 1; y++)
-    for (x = 1; x < CAVE_WIDTH - 1; x++)
+  for (y = 1; y < CAVE_BUFFER_HEIGHT - 1; y++)
+    for (x = 1; x < CAVE_BUFFER_WIDTH - 1; x++)
       Lexplode(x, y);
 
   /* triple buffering */
 
-  for (y = 0; y < CAVE_HEIGHT; y++)
-    for (x = 0; x < CAVE_WIDTH; x++)
+  for (y = 0; y < CAVE_BUFFER_HEIGHT; y++)
+    for (x = 0; x < CAVE_BUFFER_WIDTH; x++)
       next[x][y] = cave[x][y];
 }