X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame.c;h=82931d3f3bc55fb9888fbc314604685c6ae700f9;hb=9fa601d400aa71f38fcdc19eaf107f42e0d2a2a3;hp=63eb94115bb5224ca532217187b45d973b69041a;hpb=4b722be68436ced0b7bb3eff61ed14d6c66df949;p=rocksndiamonds.git diff --git a/src/game.c b/src/game.c index 63eb9411..82931d3f 100644 --- a/src/game.c +++ b/src/game.c @@ -3035,6 +3035,16 @@ 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 = + (strEqual(setup.engine_snapshot_mode, STR_SNAPSHOT_MODE_EVERY_STEP) ? + SNAPSHOT_MODE_EVERY_STEP : + strEqual(setup.engine_snapshot_mode, STR_SNAPSHOT_MODE_EVERY_MOVE) ? + SNAPSHOT_MODE_EVERY_MOVE : SNAPSHOT_MODE_OFF); + FreeEngineSnapshotList(); } @@ -10686,7 +10696,8 @@ static void CheckSaveEngineSnapshot(struct PlayerInfo *player) (player->is_snapping && !player_was_snapping) || (player->is_dropping && !player_was_dropping)) { - SaveEngineSnapshotToList(); + if (!SaveEngineSnapshotToList()) + return; player_was_moving = FALSE; player_was_snapping = TRUE; @@ -10955,6 +10966,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) { @@ -14610,10 +14638,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) @@ -14728,12 +14752,25 @@ void SaveEngineSnapshotSingle() SaveSnapshotSingle(buffers); } -void SaveEngineSnapshotToList() +boolean SaveEngineSnapshotToList() { + boolean save_snapshot = + (FrameCounter == 0 || + (game.snapshot.mode == SNAPSHOT_MODE_EVERY_STEP) || + (game.snapshot.mode == SNAPSHOT_MODE_EVERY_MOVE && + game.snapshot.changed_action)); + + game.snapshot.changed_action = FALSE; + + if (game.snapshot.mode == SNAPSHOT_MODE_OFF || !save_snapshot) + return FALSE; + ListNode *buffers = SaveEngineSnapshotBuffers(); /* finally save all snapshot buffers to snapshot list */ SaveSnapshotToList(buffers); + + return TRUE; } void LoadEngineSnapshotValues() @@ -14769,12 +14806,17 @@ void LoadEngineSnapshot_Redo(int steps) LoadEngineSnapshotValues(); } -boolean CheckEngineSnapshot() +boolean CheckEngineSnapshotSingle() { return (strEqual(snapshot_level_identifier, leveldir_current->identifier) && snapshot_level_nr == level_nr); } +boolean CheckEngineSnapshotList() +{ + return CheckSnapshotList(); +} + /* ---------- new game button stuff ---------------------------------------- */ @@ -14975,15 +15017,18 @@ void GameUndoRedoExt() RedrawPlayfield(); UpdateAndDisplayGameControlValues(); + DrawCompleteVideoDisplay(); DrawVideoDisplay(VIDEO_STATE_TIME_ON, TapeTime); DrawVideoDisplay(VIDEO_STATE_FRAME_ON, FrameCounter); + DrawVideoDisplay((tape.single_step ? VIDEO_STATE_1STEP_ON : + VIDEO_STATE_1STEP_OFF), 0); BackToFront(); } void GameUndo(int steps) { - if (!CheckEngineSnapshot()) + if (!CheckEngineSnapshotList()) return; LoadEngineSnapshot_Undo(steps); @@ -14993,7 +15038,7 @@ void GameUndo(int steps) void GameRedo(int steps) { - if (!CheckEngineSnapshot()) + if (!CheckEngineSnapshotList()) return; LoadEngineSnapshot_Redo(steps);