added support for levels larger than visible playfield in MM engine
[rocksndiamonds.git] / src / game_mm / mm_game.c
index d5142cf24f2c822fe04546efd1c0529882d12ea5..09c693c8ca75280e1428ccee923b7aa0bed4fe70 100644 (file)
@@ -830,8 +830,10 @@ static void AddLaserEdge(int lx, int ly)
 {
   int clx = dSX + lx;
   int cly = dSY + ly;
+  int sxsize = MAX(SXSIZE, lev_fieldx * TILEX);
+  int sysize = MAX(SYSIZE, lev_fieldy * TILEY);
 
-  if (clx < -2 || cly < -2 || clx >= SXSIZE + 2 || cly >= SYSIZE + 2)
+  if (clx < -2 || cly < -2 || clx >= sxsize + 2 || cly >= sysize + 2)
   {
     Warn("AddLaserEdge: out of bounds: %d, %d", lx, ly);
 
@@ -1058,15 +1060,15 @@ static void ScanLaser(void)
 #endif
 
     // hit something -- check out what it was
-    ELX = (LX + XS) / TILEX;
-    ELY = (LY + YS) / TILEY;
+    ELX = (LX + XS + TILEX) / TILEX - 1;  // ...+TILEX...-1 to get correct
+    ELY = (LY + YS + TILEY) / TILEY - 1;  // negative values!
 
 #if 0
     Debug("game:mm:ScanLaser", "hit_mask (1) == '%x' (%d, %d) (%d, %d)",
          hit_mask, LX, LY, ELX, ELY);
 #endif
 
-    if (!IN_LEV_FIELD(ELX, ELY) || !IN_PIX_FIELD(LX, LY))
+    if (!IN_LEV_FIELD(ELX, ELY))
     {
       element = EL_EMPTY;
       laser.dest_element = element;
@@ -2883,26 +2885,28 @@ static void TurnRound(int x, int y)
     int x, y;
   } move_xy[] =
   {
-    { 0, 0 },
-    {-1, 0 },
-    {+1, 0 },
-    { 0, 0 },
-    { 0, -1 },
-    { 0, 0 }, { 0, 0 }, { 0, 0 },
-    { 0, +1 }
+    {  0,  0 },
+    { -1,  0 },
+    { +1,  0 },
+    {  0,  0 },
+    {  0, -1 },
+    {  0,  0 }, { 0, 0 }, { 0, 0 },
+    {  0, +1 }
   };
   static struct
   {
     int left, right, back;
   } turn[] =
   {
-    { 0,       0,              0 },
+    { 0,       0,              0        },
     { MV_DOWN, MV_UP,          MV_RIGHT },
-    { MV_UP,   MV_DOWN,        MV_LEFT },
-    { 0,       0,              0 },
-    { MV_LEFT, MV_RIGHT,       MV_DOWN },
-    { 0,0,0 }, { 0,0,0 },      { 0,0,0 },
-    { MV_RIGHT,        MV_LEFT,        MV_UP }
+    { MV_UP,   MV_DOWN,        MV_LEFT  },
+    { 0,       0,              0        },
+    { MV_LEFT, MV_RIGHT,       MV_DOWN  },
+    { 0,       0,              0        },
+    { 0,       0,              0        },
+    { 0,       0,              0        },
+    { MV_RIGHT,        MV_LEFT,        MV_UP    }
   };
 
   int element = Tile[x][y];