X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame.c;h=02861925e981cb2510b22c683f206a60cdef1afa;hb=686d4883428879e2e882222a6579e376d9e4ac4c;hp=c0153bdf452c0cdc55ada397285bbd9bd3681481;hpb=f6bcc10ce7b517f04eb5cddf01c9ec29ee729b7e;p=rocksndiamonds.git diff --git a/src/game.c b/src/game.c index c0153bdf..02861925 100644 --- a/src/game.c +++ b/src/game.c @@ -3035,6 +3035,12 @@ static void InitGameEngine() game.scroll_delay_value = MIN(MAX(MIN_SCROLL_DELAY, game.scroll_delay_value), MAX_SCROLL_DELAY); + /* ---------- initialize game engine snapshots ---------------------------- */ + for (i = 0; i < MAX_PLAYERS; i++) + game.snapshot.last_action[i] = 0; + game.snapshot.changed_action = FALSE; + game.snapshot.mode = SNAPSHOT_MODE_MOVE; + FreeEngineSnapshotList(); } @@ -10681,15 +10687,13 @@ static void CheckSaveEngineSnapshot(struct PlayerInfo *player) static boolean player_was_snapping = FALSE; static boolean player_was_dropping = FALSE; - if (!tape.recording) - return; - if ((!player->is_moving && player_was_moving) || (player->MovPos == 0 && player_was_moving) || (player->is_snapping && !player_was_snapping) || (player->is_dropping && !player_was_dropping)) { - SaveEngineSnapshotToList(); + if (!SaveEngineSnapshotToList()) + return; player_was_moving = FALSE; player_was_snapping = TRUE; @@ -10958,6 +10962,23 @@ void GameActions() byte tape_action[MAX_PLAYERS]; int i; + for (i = 0; i < MAX_PLAYERS; i++) + { + struct PlayerInfo *player = &stored_player[i]; + + // allow engine snapshot if movement attempt was stopped + if ((game.snapshot.last_action[i] & KEY_MOTION) != 0 && + (player->action & KEY_MOTION) == 0) + game.snapshot.changed_action = TRUE; + + // allow engine snapshot in case of snapping/dropping attempt + if ((game.snapshot.last_action[i] & KEY_BUTTON) == 0 && + (player->action & KEY_BUTTON) != 0) + game.snapshot.changed_action = TRUE; + + game.snapshot.last_action[i] = player->action; + } + /* detect endless loops, caused by custom element programming */ if (recursion_loop_detected && recursion_loop_depth == 0) { @@ -14613,10 +14634,6 @@ ListNode *SaveEngineSnapshotBuffers() { ListNode *buffers = NULL; - /* do not save snapshots from editor */ - if (level_editor_test_game) - return NULL; - /* copy some special values to a structure better suited for the snapshot */ if (level.game_engine_type == GAME_ENGINE_TYPE_RND) @@ -14731,12 +14748,25 @@ void SaveEngineSnapshotSingle() SaveSnapshotSingle(buffers); } -void SaveEngineSnapshotToList() +boolean SaveEngineSnapshotToList() { + boolean save_snapshot = + (FrameCounter == 0 || + (game.snapshot.mode == SNAPSHOT_MODE_STEP) || + (game.snapshot.mode == SNAPSHOT_MODE_MOVE && + game.snapshot.changed_action)); + + game.snapshot.changed_action = FALSE; + + if (!save_snapshot) + return FALSE; + ListNode *buffers = SaveEngineSnapshotBuffers(); /* finally save all snapshot buffers to snapshot list */ SaveSnapshotToList(buffers); + + return TRUE; } void LoadEngineSnapshotValues() @@ -14758,16 +14788,16 @@ void LoadEngineSnapshotSingle() LoadEngineSnapshotValues(); } -void LoadEngineSnapshot_Undo() +void LoadEngineSnapshot_Undo(int steps) { - LoadSnapshotFromList_Older(); + LoadSnapshotFromList_Older(steps); LoadEngineSnapshotValues(); } -void LoadEngineSnapshot_Redo() +void LoadEngineSnapshot_Redo(int steps) { - LoadSnapshotFromList_Newer(); + LoadSnapshotFromList_Newer(steps); LoadEngineSnapshotValues(); } @@ -14978,34 +15008,36 @@ void GameUndoRedoExt() RedrawPlayfield(); UpdateAndDisplayGameControlValues(); + DrawCompleteVideoDisplay(); DrawVideoDisplay(VIDEO_STATE_TIME_ON, TapeTime); DrawVideoDisplay(VIDEO_STATE_FRAME_ON, FrameCounter); BackToFront(); } -void GameUndo() +void GameUndo(int steps) { if (!CheckEngineSnapshot()) return; - LoadEngineSnapshot_Undo(); + LoadEngineSnapshot_Undo(steps); GameUndoRedoExt(); } -void GameRedo() +void GameRedo(int steps) { if (!CheckEngineSnapshot()) return; - LoadEngineSnapshot_Redo(); + LoadEngineSnapshot_Redo(steps); GameUndoRedoExt(); } -static void HandleGameButtonsExt(int id) +static void HandleGameButtonsExt(int id, int button) { + int steps = BUTTON_STEPSIZE(button); boolean handle_game_buttons = (game_status == GAME_MODE_PLAYING || (game_status == GAME_MODE_MAIN && tape.show_game_buttons)); @@ -15060,11 +15092,11 @@ static void HandleGameButtonsExt(int id) break; case GAME_CTRL_ID_UNDO: - GameUndo(); + GameUndo(steps); break; case GAME_CTRL_ID_REDO: - GameRedo(); + GameRedo(steps); break; case GAME_CTRL_ID_SAVE: @@ -15121,7 +15153,7 @@ static void HandleGameButtonsExt(int id) static void HandleGameButtons(struct GadgetInfo *gi) { - HandleGameButtonsExt(gi->custom_id); + HandleGameButtonsExt(gi->custom_id, gi->event.button); } void HandleSoundButtonKeys(Key key)