fixed redrawing redefined graphics for steel or wooden grid in MM engine
[rocksndiamonds.git] / src / game_mm / mm_game.c
index d4a69181a3f608d0c19245d0ed5f13b053468bd7..c87bc90a0aa4afc22ab67372d9dd5599fe8c5f93 100644 (file)
@@ -809,6 +809,10 @@ static void GameOver_MM(int game_over_cause)
   game_mm.game_over = TRUE;
   game_mm.game_over_cause = game_over_cause;
 
+  // do not ask to play again if game was never actually played
+  if (!game.GamePlayed)
+    return;
+
   if (setup.ask_on_game_over)
     game.restart_game_message = (game_over_cause == GAME_OVER_BOMB ?
                                 "Bomb killed Mc Duffin! Play it again?" :
@@ -1049,12 +1053,21 @@ static void ScanLaser(void)
       break;
     }
 
-    if (hit_mask == HIT_MASK_DIAGONAL_1 || hit_mask == HIT_MASK_DIAGONAL_2)
+    // check if laser scan has hit two diagonally adjacent element corners
+    boolean diag_1 = ((hit_mask & HIT_MASK_DIAGONAL_1) == HIT_MASK_DIAGONAL_1);
+    boolean diag_2 = ((hit_mask & HIT_MASK_DIAGONAL_2) == HIT_MASK_DIAGONAL_2);
+
+    // check if laser scan has crossed element boundaries (not just mini tiles)
+    boolean cross_x = (LX / TILEX != (LX + 2) / TILEX);
+    boolean cross_y = (LY / TILEY != (LY + 2) / TILEY);
+
+    // handle special case of laser hitting two diagonally adjacent elements
+    // (with or without a third corner element behind these two elements)
+    if ((diag_1 || diag_2) && cross_x && cross_y)
     {
-      // we have hit two diagonally adjacent elements -- compare them
-      boolean dia_1 = (hit_mask == HIT_MASK_DIAGONAL_1);
+      // compare the two diagonally adjacent elements
       int xoffset = 2;
-      int yoffset = 2 * (dia_1 ? -1 : +1);
+      int yoffset = 2 * (diag_1 ? -1 : +1);
       int elx1 = (LX - xoffset) / TILEX;
       int ely1 = (LY + yoffset) / TILEY;
       int elx2 = (LX + xoffset) / TILEX;
@@ -1072,16 +1085,14 @@ static void ScanLaser(void)
       }
       else if (IS_WALL_AMOEBA(e1) || IS_WALL_AMOEBA(e2))
       {
-       if (IS_WALL_AMOEBA(e1) && IS_WALL_AMOEBA(e2))
-         use_element_1 = (RND(2) ? TRUE : FALSE);
-       else if (IS_WALL_AMOEBA(e1))
+       // if both tiles match, we can just select the first one
+       if (IS_WALL_AMOEBA(e1))
          use_element_1 = TRUE;
       }
       else if (IS_ABSORBING_BLOCK(e1) || IS_ABSORBING_BLOCK(e2))
       {
-       if (IS_ABSORBING_BLOCK(e1) && IS_ABSORBING_BLOCK(e2))
-         use_element_1 = (RND(2) ? TRUE : FALSE);
-       else if (IS_ABSORBING_BLOCK(e1))
+       // if both tiles match, we can just select the first one
+       if (IS_ABSORBING_BLOCK(e1))
          use_element_1 = TRUE;
       }
 
@@ -1995,10 +2006,16 @@ static boolean HitPolarizer(int element, int hit_mask)
   }
   else if (IS_GRID_STEEL(element))
   {
+    // may be required if graphics for steel grid redefined
+    AddDamagedField(ELX, ELY);
+
     return HitReflectingWalls(element, hit_mask);
   }
   else // IS_GRID_WOOD
   {
+    // may be required if graphics for wooden grid redefined
+    AddDamagedField(ELX, ELY);
+
     return HitAbsorbingWalls(element, hit_mask);
   }
 
@@ -2048,11 +2065,9 @@ static boolean HitBlock(int element, int hit_mask)
   if (element == EL_GATE_STONE || element == EL_GATE_WOOD)
   {
     int xs = XS / 2, ys = YS / 2;
-    int hit_mask_diagonal1 = HIT_MASK_TOPRIGHT | HIT_MASK_BOTTOMLEFT;
-    int hit_mask_diagonal2 = HIT_MASK_TOPLEFT | HIT_MASK_BOTTOMRIGHT;
 
-    if ((hit_mask & hit_mask_diagonal1) == hit_mask_diagonal1 ||
-       (hit_mask & hit_mask_diagonal2) == hit_mask_diagonal2)
+    if ((hit_mask & HIT_MASK_DIAGONAL_1) == HIT_MASK_DIAGONAL_1 ||
+       (hit_mask & HIT_MASK_DIAGONAL_2) == HIT_MASK_DIAGONAL_2)
     {
       laser.overloaded = (element == EL_GATE_STONE);
 
@@ -2091,11 +2106,9 @@ static boolean HitBlock(int element, int hit_mask)
   if (element == EL_BLOCK_STONE || element == EL_BLOCK_WOOD)
   {
     int xs = XS / 2, ys = YS / 2;
-    int hit_mask_diagonal1 = HIT_MASK_TOPRIGHT | HIT_MASK_BOTTOMLEFT;
-    int hit_mask_diagonal2 = HIT_MASK_TOPLEFT | HIT_MASK_BOTTOMRIGHT;
 
-    if ((hit_mask & hit_mask_diagonal1) == hit_mask_diagonal1 ||
-       (hit_mask & hit_mask_diagonal2) == hit_mask_diagonal2)
+    if ((hit_mask & HIT_MASK_DIAGONAL_1) == HIT_MASK_DIAGONAL_1 ||
+       (hit_mask & HIT_MASK_DIAGONAL_2) == HIT_MASK_DIAGONAL_2)
     {
       laser.overloaded = (element == EL_BLOCK_STONE);