rnd-20040117-2-src
authorHolger Schemel <info@artsoft.org>
Sat, 17 Jan 2004 15:15:36 +0000 (16:15 +0100)
committerHolger Schemel <info@artsoft.org>
Sat, 30 Aug 2014 08:45:26 +0000 (10:45 +0200)
src/conftime.h
src/editor.c
src/files.c
src/game.c
src/main.h

index 4339cf6ffb8d4aaca45b19d4a765ff7c3bb02db7..95c1f875058a238e4a965d589057afc006fd626b 100644 (file)
@@ -1 +1 @@
-#define COMPILE_DATE_STRING "[2004-01-17 14:58]"
+#define COMPILE_DATE_STRING "[2004-01-17 15:38]"
index 6dd5fd3fd62f502147301b1568c8e1b364a1b8c7..4877a8bcae69d56bdae6eb0a5c68518bfc001d0f 100644 (file)
@@ -1116,11 +1116,13 @@ static struct ValueTextInfo options_move_pattern[] =
 
 static struct ValueTextInfo options_move_direction[] =
 {
-  { MV_NO_MOVING,              "automatic"                     },
+  { MV_AUTOMATIC,              "automatic"                     },
   { MV_LEFT,                   "left"                          },
   { MV_RIGHT,                  "right"                         },
   { MV_UP,                     "up"                            },
   { MV_DOWN,                   "down"                          },
+  { MV_RANDOM,                 "random"                        },
+  { MV_PREVIOUS,               "previous"                      },
   { -1,                                NULL                            }
 };
 
index 5c1786f76778373e46d21cad3f44a45385231a03..c447bba91e40ccc220a9bd1e5506a8a3e66c01b8 100644 (file)
@@ -210,7 +210,7 @@ static void setLevelInfoToDefaults(struct LevelInfo *level)
       element_info[element].move_delay_random = 0;
 
       element_info[element].move_pattern = MV_ALL_DIRECTIONS;
-      element_info[element].move_direction_initial = MV_NO_MOVING;
+      element_info[element].move_direction_initial = MV_AUTOMATIC;
       element_info[element].move_stepsize = TILEX / 8;
       element_info[element].move_enter_element = EL_EMPTY_SPACE;
       element_info[element].move_leave_element = EL_EMPTY_SPACE;
index ecf2ca0ffaf8088a75e31e0e76a671895c0fee69..dfad329ef9c2b2e64d5df8fb4e1a4c6986edd595 100644 (file)
@@ -1723,23 +1723,36 @@ void InitMovDir(int x, int y)
     default:
       if (IS_CUSTOM_ELEMENT(element))
       {
-       if (element_info[element].move_direction_initial != MV_NO_MOVING)
-         MovDir[x][y] = element_info[element].move_direction_initial;
-       else if (element_info[element].move_pattern == MV_ALL_DIRECTIONS ||
-                element_info[element].move_pattern == MV_TURNING_LEFT ||
-                element_info[element].move_pattern == MV_TURNING_RIGHT ||
-                element_info[element].move_pattern == MV_TURNING_LEFT_RIGHT ||
-                element_info[element].move_pattern == MV_TURNING_RIGHT_LEFT ||
-                element_info[element].move_pattern == MV_TURNING_RANDOM)
+       struct ElementInfo *ei = &element_info[element];
+       int move_direction_initial = ei->move_direction_initial;
+       int move_pattern = ei->move_pattern;
+
+       if (move_direction_initial == MV_PREVIOUS)
+       {
+         if (MovDir[x][y] != MV_NO_MOVING)
+           return;
+
+         move_direction_initial = MV_AUTOMATIC;
+       }
+
+       if (move_direction_initial & MV_ANY_DIRECTION)
+         MovDir[x][y] = move_direction_initial;
+       else if (move_direction_initial == MV_RANDOM ||
+                move_pattern == MV_ALL_DIRECTIONS ||
+                move_pattern == MV_TURNING_LEFT ||
+                move_pattern == MV_TURNING_RIGHT ||
+                move_pattern == MV_TURNING_LEFT_RIGHT ||
+                move_pattern == MV_TURNING_RIGHT_LEFT ||
+                move_pattern == MV_TURNING_RANDOM)
          MovDir[x][y] = 1 << RND(4);
-       else if (element_info[element].move_pattern == MV_HORIZONTAL)
+       else if (move_pattern == MV_HORIZONTAL)
          MovDir[x][y] = (RND(2) ? MV_LEFT : MV_RIGHT);
-       else if (element_info[element].move_pattern == MV_VERTICAL)
+       else if (move_pattern == MV_VERTICAL)
          MovDir[x][y] = (RND(2) ? MV_UP : MV_DOWN);
-       else if (element_info[element].move_pattern & MV_ANY_DIRECTION)
+       else if (move_pattern & MV_ANY_DIRECTION)
          MovDir[x][y] = element_info[element].move_pattern;
-       else if (element_info[element].move_pattern == MV_ALONG_LEFT_SIDE ||
-                element_info[element].move_pattern == MV_ALONG_RIGHT_SIDE)
+       else if (move_pattern == MV_ALONG_LEFT_SIDE ||
+                move_pattern == MV_ALONG_RIGHT_SIDE)
        {
          for (i = 0; i < 4; i++)
          {
@@ -1748,7 +1761,7 @@ void InitMovDir(int x, int y)
 
            if (!IN_LEV_FIELD(x1, y1) || !IS_FREE(x1, y1))
            {
-             if (element_info[element].move_pattern == MV_ALONG_RIGHT_SIDE)
+             if (move_pattern == MV_ALONG_RIGHT_SIDE)
                MovDir[x][y] = direction[0][i];
              else
                MovDir[x][y] = direction[1][i];
@@ -6126,6 +6139,8 @@ static void ChangeActiveTrap(int x, int y)
 
 static void ChangeElementNowExt(int x, int y, int target_element)
 {
+  int previous_move_direction = MovDir[x][y];
+
   /* check if element under player changes from accessible to unaccessible
      (needed for special case of dropping element which then changes) */
   if (IS_PLAYER(x, y) && !PLAYER_PROTECTED(x, y) &&
@@ -6143,6 +6158,9 @@ static void ChangeElementNowExt(int x, int y, int target_element)
   ResetGfxAnimation(x, y);
   ResetRandomAnimationValue(x, y);
 
+  if (element_info[Feld[x][y]].move_direction_initial == MV_PREVIOUS)
+    MovDir[x][y] = previous_move_direction;
+
   InitField(x, y, FALSE);
   if (CAN_MOVE(Feld[x][y]))
     InitMovDir(x, y);
@@ -9386,7 +9404,7 @@ boolean DropElement(struct PlayerInfo *player)
     int move_stepsize = element_info[new_element].move_stepsize;
     int direction, dx, dy, nextx, nexty;
 
-    if (element_info[new_element].move_direction_initial == MV_NO_MOVING)
+    if (element_info[new_element].move_direction_initial == MV_AUTOMATIC)
       MovDir[jx][jy] = player->MovDir;
 
     direction = MovDir[jx][jy];
index 734db18fa75853fcb6ab66d4e945739329f93f1b..64cd7bdcf44b7210aca3f4fa88d57ae36a1b6fa5 100644 (file)
 #define MV_BIT_TURNING_LEFT_RIGHT 14
 #define MV_BIT_TURNING_RIGHT_LEFT 15
 #define MV_BIT_TURNING_RANDOM  16
+#define MV_BIT_PREVIOUS                17
 
 /* values for special move patterns for custom elements */
 #define MV_HORIZONTAL          (MV_LEFT | MV_RIGHT)
 #define MV_VERTICAL            (MV_UP | MV_DOWN)
 #define MV_ALL_DIRECTIONS      (MV_HORIZONTAL | MV_VERTICAL)
 #define MV_ANY_DIRECTION       (MV_ALL_DIRECTIONS)
+#define MV_RANDOM              (MV_ALL_DIRECTIONS)
+#define MV_AUTOMATIC           (MV_NO_MOVING)
 #define MV_TOWARDS_PLAYER      (1 << MV_BIT_TOWARDS_PLAYER)
 #define MV_AWAY_FROM_PLAYER    (1 << MV_BIT_AWAY_FROM_PLAYER)
 #define MV_ALONG_LEFT_SIDE     (1 << MV_BIT_ALONG_LEFT_SIDE)
 #define MV_TURNING_LEFT_RIGHT  (1 << MV_BIT_TURNING_LEFT_RIGHT)
 #define MV_TURNING_RIGHT_LEFT  (1 << MV_BIT_TURNING_RIGHT_LEFT)
 #define MV_TURNING_RANDOM      (1 << MV_BIT_TURNING_RANDOM)
+#define MV_PREVIOUS            (1 << MV_BIT_PREVIOUS)
 
 /* values for slippery property for custom elements */
 #define SLIPPERY_ANY_RANDOM    0