removed unused image file for native Boulder Dash graphics
[rocksndiamonds.git] / src / game_mm / mm_game.c
index d66dbc846aa9d6fb7f6d7f52b1466c9df59de6bf..20592f1b25b268e4603d002773cd71a4cd2b0724 100644 (file)
@@ -1624,7 +1624,7 @@ void DrawLaser(int start_edge, int mode)
          continue;
 
 #if 0
-       Debug("game:mm:DrawLaser", "DL_LASER_ENABLED: i==%d: %d, %d",
+       Debug("game:mm:DrawLaser", "DL_LASER_ENABLED: i == %d: %d, %d",
              i, laser.beamer_edge[i], tmp_start_edge);
 #endif
 
@@ -1702,7 +1702,26 @@ static boolean HitElement(int element, int hit_mask)
        hit_mask == HIT_MASK_TOP ||
        hit_mask == HIT_MASK_BOTTOM)
     {
-      return HitReflectingWalls(element, hit_mask);
+      boolean hit_slope_corner_in_laser_direction =
+       ((hit_mask == HIT_MASK_LEFT   && (element == EL_DF_SLOPE_01 ||
+                                         element == EL_DF_SLOPE_02)) ||
+        (hit_mask == HIT_MASK_RIGHT  && (element == EL_DF_SLOPE_00 ||
+                                         element == EL_DF_SLOPE_03)) ||
+        (hit_mask == HIT_MASK_TOP    && (element == EL_DF_SLOPE_02 ||
+                                         element == EL_DF_SLOPE_03)) ||
+        (hit_mask == HIT_MASK_BOTTOM && (element == EL_DF_SLOPE_00 ||
+                                         element == EL_DF_SLOPE_01)));
+
+      boolean hit_slope_corner_in_laser_direction_double_checked =
+       (cross_x && cross_y &&
+        laser.current_angle == mirrored_angle &&
+        hit_slope_corner_in_laser_direction);
+
+      // check special case of laser hitting the corner of a slope and another
+      // element (either wall or another slope), following the diagonal side
+      // of the slope which has the same angle as the direction of the laser
+      if (!hit_slope_corner_in_laser_direction_double_checked)
+       return HitReflectingWalls(element, hit_mask);
     }
 
     // check if an edge was hit while crossing element borders
@@ -3270,7 +3289,7 @@ static void ContinueMoving_MM(int x, int y)
   int direction = MovDir[x][y];
   int dx = (direction == MV_LEFT ? -1 : direction == MV_RIGHT ? +1 : 0);
   int dy = (direction == MV_UP   ? -1 : direction == MV_DOWN  ? +1 : 0);
-  int horiz_move = (dx!=0);
+  int horiz_move = (dx != 0);
   int newx = x + dx, newy = y + dy;
   int step = (horiz_move ? dx : dy) * TILEX / 8;