added support for wrap-around levels in EM engine
authorHolger Schemel <info@artsoft.org>
Sun, 2 Feb 2020 16:18:35 +0000 (17:18 +0100)
committerHolger Schemel <info@artsoft.org>
Tue, 19 May 2020 16:12:58 +0000 (18:12 +0200)
src/game_em/convert.c
src/game_em/logic.c

index 65efdcc13f78f88ee89ed9a0851bb08e68620126..d25c4593eb4c1d1817f37382f5ac9c3b44d0f739 100644 (file)
@@ -945,6 +945,20 @@ void prepare_em_level(void)
   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 (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];
index d126415b774a3e8357a72a3189386f613a6b5cb7..616e80c1d37dfab726e327bc6e195f1bc4aec135 100644 (file)
@@ -6228,6 +6228,16 @@ void logic_1(void)
 
   for (i = 0; i < MAX_PLAYERS; i++)
   {
+    /* check for wrap-around movement */
+    if (ply[i].x < lev.left ||
+       ply[i].x > lev.right - 1)
+    {
+      ply[i].x = (ply[i].x < lev.left ? lev.right - 1 : lev.left);
+
+      game.centered_player_nr_next = i;
+      game.set_centered_player = TRUE;
+    }
+
     ply[i].oldx = ply[i].x;
     ply[i].oldy = ply[i].y;
     ply[i].anim = PLY_still;