rnd-20030624-1-src
[rocksndiamonds.git] / src / game.c
index 4ea608c3ac6f45538768a1b56453e62c0a73db78..d0f7751bbbca9183bf1fed4ec03edb5008671678 100644 (file)
@@ -5010,7 +5010,12 @@ static void CheckPlayerElementChange(int x, int y, int element,
   if (!CAN_CHANGE(element) || !HAS_CHANGE_EVENT(element, trigger_event))
     return;
 
+#if 1
+  ChangeDelay[x][y] = 1;
+  ChangeElement(x, y);
+#else
   ChangeElementDoIt(x, y, element_info[element].change.successor);
+#endif
 }
 
 static void PlayerActions(struct PlayerInfo *player, byte player_action)
@@ -6366,6 +6371,7 @@ static boolean checkDiagonalPushing(struct PlayerInfo *player,
 int DigField(struct PlayerInfo *player,
             int x, int y, int real_dx, int real_dy, int mode)
 {
+  boolean use_spring_bug = (game.engine_version < VERSION_IDENT(2,2,0));
   int jx = player->jx, jy = player->jy;
   int dx = x - jx, dy = y - jy;
   int move_direction = (dx == -1 ? MV_LEFT :
@@ -6779,6 +6785,10 @@ int DigField(struct PlayerInfo *player,
       if (dy)
        return MF_NO_ACTION;
 
+      if (CAN_FALL(element) && IN_LEV_FIELD(x, y + 1) && IS_FREE(x, y + 1) &&
+         !(element == EL_SPRING && use_spring_bug))
+       return MF_NO_ACTION;
+
       player->Pushing = TRUE;
 
 #if 0
@@ -7195,6 +7205,9 @@ int DigField(struct PlayerInfo *player,
        if (CAN_FALL(element) && dy)
          return MF_NO_ACTION;
 
+       if (CAN_FALL(element) && IN_LEV_FIELD(x, y + 1) && IS_FREE(x, y + 1))
+         return MF_NO_ACTION;
+
        if (!player->Pushing &&
            game.engine_version >= RELEASE_IDENT(2,2,0,7))
          player->push_delay_value = GET_NEW_PUSH_DELAY(element);
@@ -7235,7 +7248,11 @@ int DigField(struct PlayerInfo *player,
        PlaySoundLevelElementAction(x, y, element, ACTION_PUSHING);
 
        CheckTriggeredElementChange(element, CE_OTHER_PUSHING);
+#if 1
+       CheckPlayerElementChange(x, y, element, CE_PUSHED_BY_PLAYER);
+#else
        CheckPlayerElementChange(x + dx, y + dy, element, CE_PUSHED_BY_PLAYER);
+#endif
 
        break;
       }