rnd-20030809-2-src
authorHolger Schemel <info@artsoft.org>
Sat, 9 Aug 2003 01:20:02 +0000 (03:20 +0200)
committerHolger Schemel <info@artsoft.org>
Sat, 30 Aug 2014 08:43:10 +0000 (10:43 +0200)
src/conftime.h
src/game.c
src/init.c

index a28d19fe26c6fef0ef1ece4221c9ab5eb11151ef..6a9ce93cd4e5db34f915e6e776104aa6c37c9fcb 100644 (file)
@@ -1 +1 @@
-#define COMPILE_DATE_STRING "[2003-08-09 01:35]"
+#define COMPILE_DATE_STRING "[2003-08-09 03:13]"
index 461518830eff29fd78da568bfbbbabecf7fc90f3..7968b389573e613f29b98c94da0921db3427d02c 100644 (file)
@@ -1960,22 +1960,50 @@ void RelocatePlayer(int x, int y, int element)
     }
 
     RemoveField(player->jx, player->jy);
+    DrawLevelField(player->jx, player->jy);
   }
 
   InitPlayerField(x, y, element, TRUE);
 
   if (player == local_player)
   {
-    scroll_x = (local_player->jx < SBX_Left  + MIDPOSX ? SBX_Left :
-               local_player->jx > SBX_Right + MIDPOSX ? SBX_Right :
-               local_player->jx - MIDPOSX);
+    int scroll_xx = -999, scroll_yy = -999;
 
-    scroll_y = (local_player->jy < SBY_Upper + MIDPOSY ? SBY_Upper :
-               local_player->jy > SBY_Lower + MIDPOSY ? SBY_Lower :
-               local_player->jy - MIDPOSY);
-  }
+    while (scroll_xx != scroll_x || scroll_yy != scroll_y)
+    {
+      int dx = 0, dy = 0;
+      int fx = FX, fy = FY;
 
-  DrawLevel();
+      scroll_xx = (local_player->jx < SBX_Left  + MIDPOSX ? SBX_Left :
+                  local_player->jx > SBX_Right + MIDPOSX ? SBX_Right :
+                  local_player->jx - MIDPOSX);
+
+      scroll_yy = (local_player->jy < SBY_Upper + MIDPOSY ? SBY_Upper :
+                  local_player->jy > SBY_Lower + MIDPOSY ? SBY_Lower :
+                  local_player->jy - MIDPOSY);
+
+      dx = (scroll_xx < scroll_x ? +1 : scroll_xx > scroll_x ? -1 : 0);
+      dy = (scroll_yy < scroll_y ? +1 : scroll_yy > scroll_y ? -1 : 0);
+
+      scroll_x -= dx;
+      scroll_y -= dy;
+
+      fx += dx * TILEX / 2;
+      fy += dy * TILEY / 2;
+
+      ScrollLevel(dx, dy);
+      DrawAllPlayers();
+
+      /* scroll in to steps of half tile size to make things smoother */
+      BlitBitmap(drawto_field, window, fx, fy, SXSIZE, SYSIZE, SX, SY);
+      FlushDisplay();
+      Delay(GAME_FRAME_DELAY);
+
+      /* scroll second step to align at full tile size */
+      BackToFront();
+      Delay(GAME_FRAME_DELAY);
+    }
+  }
 }
 
 void Explode(int ex, int ey, int phase, int mode)
@@ -5295,6 +5323,9 @@ static void ChangeElementNowExt(int x, int y, int target_element)
   TestIfBadThingTouchesHero(x, y);
   TestIfPlayerTouchesCustomElement(x, y);
   TestIfElementTouchesCustomElement(x, y);
+
+  if (ELEM_IS_PLAYER(target_element))
+    RelocatePlayer(x, y, target_element);
 }
 
 static void ChangeElementNow(int x, int y, int element)
@@ -6188,24 +6219,24 @@ void ScrollLevel(int dx, int dy)
   int x, y;
 
   BlitBitmap(drawto_field, drawto_field,
-            FX + TILEX*(dx == -1) - softscroll_offset,
-            FY + TILEY*(dy == -1) - softscroll_offset,
-            SXSIZE - TILEX*(dx!=0) + 2*softscroll_offset,
-            SYSIZE - TILEY*(dy!=0) + 2*softscroll_offset,
-            FX + TILEX*(dx == 1) - softscroll_offset,
-            FY + TILEY*(dy == 1) - softscroll_offset);
+            FX + TILEX * (dx == -1) - softscroll_offset,
+            FY + TILEY * (dy == -1) - softscroll_offset,
+            SXSIZE - TILEX * (dx!=0) + 2 * softscroll_offset,
+            SYSIZE - TILEY * (dy!=0) + 2 * softscroll_offset,
+            FX + TILEX * (dx == 1) - softscroll_offset,
+            FY + TILEY * (dy == 1) - softscroll_offset);
 
   if (dx)
   {
     x = (dx == 1 ? BX1 : BX2);
-    for (y=BY1; y<=BY2; y++)
+    for (y=BY1; y <= BY2; y++)
       DrawScreenField(x, y);
   }
 
   if (dy)
   {
     y = (dy == 1 ? BY1 : BY2);
-    for (x=BX1; x<=BX2; x++)
+    for (x=BX1; x <= BX2; x++)
       DrawScreenField(x, y);
   }
 
index cde94b1265cf5c75a46d9947c5d81354a92b5d86..ce61ae8b3331b30b7e4832162540072262c0fdeb 100644 (file)
@@ -2778,7 +2778,8 @@ void InitElementPropertiesEngine(int engine_version)
                                     CAN_EXPLODE_IMPACT(i)));
 
     /* ---------- CAN_EXPLODE_3X3 ------------------------------------------ */
-    SET_PROPERTY(i, EP_CAN_EXPLODE_3X3, !CAN_EXPLODE_1X1(i));
+    SET_PROPERTY(i, EP_CAN_EXPLODE_3X3, (CAN_EXPLODE(i) &&
+                                        !CAN_EXPLODE_1X1(i)));
 
     /* ---------- CAN_BE_CRUMBLED ------------------------------------------ */
     SET_PROPERTY(i, EP_CAN_BE_CRUMBLED,