changed move speed for some elements for older game engine versions
[rocksndiamonds.git] / src / game.c
index 9fe37cc551bb053b6536517d1809a297b6e6a1be..5c1a641a68ce71aaa924e19d6ee0d82e6e57be59 100644 (file)
@@ -2844,6 +2844,37 @@ static void InitGameEngine(void)
   // set flags for bugs and changes according to active game engine version
   // --------------------------------------------------------------------------
 
+  /*
+    Summary of bugfix/change:
+    Fixed move speed of elements entering or leaving magic wall.
+
+    Fixed/changed in version:
+    2.0.1
+
+    Description:
+    Before 2.0.1, move speed of elements entering or leaving magic wall was
+    twice as fast as it is now.
+    Since 2.0.1, this is set to a lower value by using move_stepsize_list[].
+
+    Affected levels/tapes:
+    The first condition is generally needed for all levels/tapes before version
+    2.0.1, which might use the old behaviour before it was changed; known tapes
+    that are affected: Tape 014 from the level set "rnd_conor_mancone".
+    The second condition is an exception from the above case and is needed for
+    the special case of tapes recorded with game (not engine!) version 2.0.1 or
+    above, but before it was known that this change would break tapes like the
+    above and was fixed in 4.1.4.2, so that the changed behaviour was active
+    although the engine version while recording maybe was before 2.0.1. There
+    are a lot of tapes that are affected by this exception, like tape 006 from
+    the level set "rnd_conor_mancone".
+  */
+
+  boolean use_old_move_stepsize_for_magic_wall =
+    (game.engine_version < VERSION_IDENT(2,0,1,0) &&
+     !(tape.playing &&
+       tape.game_version >= VERSION_IDENT(2,0,1,0) &&
+       tape.game_version <  VERSION_IDENT(4,1,4,2)));
+
   /*
     Summary of bugfix/change:
     Fixed handling for custom elements that change when pushed by the player.
@@ -3181,6 +3212,16 @@ static void InitGameEngine(void)
     int e = move_stepsize_list[i].element;
 
     element_info[e].move_stepsize = move_stepsize_list[i].move_stepsize;
+
+    // set move stepsize value for certain elements for older engine versions
+    if (use_old_move_stepsize_for_magic_wall)
+    {
+      if (e == EL_MAGIC_WALL_FILLING ||
+         e == EL_MAGIC_WALL_EMPTYING ||
+         e == EL_BD_MAGIC_WALL_FILLING ||
+         e == EL_BD_MAGIC_WALL_EMPTYING)
+       element_info[e].move_stepsize *= 2;
+    }
   }
 
   // ---------- initialize collect score --------------------------------------
@@ -3280,14 +3321,18 @@ static void InitGameEngine(void)
   if (level.game_engine_type == GAME_ENGINE_TYPE_SP)
     level.time = 0;
 
-  // ---------- initialize mask for handling game action events ---------------
+  // ---------- initialize flags for handling game actions --------------------
 
-  // set game action events mask to default value
-  game.event_mask = GAME_EVENTS_DEFAULT;
+  // set flags for game actions to default values
+  game.use_key_actions = TRUE;
+  game.use_mouse_actions = FALSE;
 
   // when using Mirror Magic game engine, handle mouse events only
   if (level.game_engine_type == GAME_ENGINE_TYPE_MM)
-    game.event_mask = GAME_EVENTS_MOUSE;
+  {
+    game.use_key_actions = FALSE;
+    game.use_mouse_actions = TRUE;
+  }
 
   // check for custom elements with mouse click events
   if (level.game_engine_type == GAME_ENGINE_TYPE_RND)
@@ -3300,7 +3345,7 @@ static void InitGameEngine(void)
          HAS_CHANGE_EVENT(element, CE_PRESSED_BY_MOUSE) ||
          HAS_CHANGE_EVENT(element, CE_MOUSE_CLICKED_ON_X) ||
          HAS_CHANGE_EVENT(element, CE_MOUSE_PRESSED_ON_X))
-       game.event_mask = GAME_EVENTS_KEYS | GAME_EVENTS_MOUSE;
+       game.use_mouse_actions = TRUE;
     }
   }
 }
@@ -3415,9 +3460,12 @@ void InitGame(void)
   InitGameEngine();
   InitGameControlValues();
 
-  // initialize tape action events from game when recording tape
+  // initialize tape actions from game when recording tape
   if (tape.recording)
-    tape.event_mask = game.event_mask;
+  {
+    tape.use_key_actions   = game.use_key_actions;
+    tape.use_mouse_actions = game.use_mouse_actions;
+  }
 
   // don't play tapes over network
   network_playing = (network.enabled && !tape.playing);
@@ -11176,7 +11224,7 @@ static byte PlayerActions(struct PlayerInfo *player, byte player_action)
 static void SetMouseActionFromTapeAction(struct MouseActionInfo *mouse_action,
                                         byte *tape_action)
 {
-  if (!(tape.event_mask & GAME_EVENTS_MOUSE))
+  if (!tape.use_mouse_actions)
     return;
 
   mouse_action->lx     = tape_action[TAPE_ACTION_LX];
@@ -11187,7 +11235,7 @@ static void SetMouseActionFromTapeAction(struct MouseActionInfo *mouse_action,
 static void SetTapeActionFromMouseAction(byte *tape_action,
                                         struct MouseActionInfo *mouse_action)
 {
-  if (!(tape.event_mask & GAME_EVENTS_MOUSE))
+  if (!tape.use_mouse_actions)
     return;
 
   tape_action[TAPE_ACTION_LX]     = mouse_action->lx;