X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fgame.c;h=5c1a641a68ce71aaa924e19d6ee0d82e6e57be59;hb=579c618038a8491b40bb739f43478b79a9d8c9c9;hp=9fe37cc551bb053b6536517d1809a297b6e6a1be;hpb=91601455766f1749465cd064b54b8158313c0d51;p=rocksndiamonds.git diff --git a/src/game.c b/src/game.c index 9fe37cc5..5c1a641a 100644 --- a/src/game.c +++ b/src/game.c @@ -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;