X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Fgame.c;h=3d2f055f27c88415dccb499d83d65932ad8a5f1e;hp=e0e44eb4a1bb3e13c7396b283b20a604ea2c561c;hb=567cfcb396e3fc031a25362b747dd0a5a096b4ec;hpb=37dc6b231b7e6cd2aeab259ebe52be365b7f3c17 diff --git a/src/game.c b/src/game.c index e0e44eb4..3d2f055f 100644 --- a/src/game.c +++ b/src/game.c @@ -3049,6 +3049,7 @@ static void InitGameEngine() SNAPSHOT_MODE_EVERY_MOVE : strEqual(setup.engine_snapshot_mode, STR_SNAPSHOT_MODE_EVERY_COLLECT) ? SNAPSHOT_MODE_EVERY_COLLECT : SNAPSHOT_MODE_OFF); + game.snapshot.save_snapshot = FALSE; } int get_num_special_action(int element, int action_first, int action_last) @@ -4036,13 +4037,24 @@ void InitGame() SaveEngineSnapshotToListInitial(); } -void UpdateEngineValues(int actual_scroll_x, int actual_scroll_y) +void UpdateEngineValues(int actual_scroll_x, int actual_scroll_y, + int actual_player_x, int actual_player_y) { /* this is used for non-R'n'D game engines to update certain engine values */ + if (level.game_engine_type == GAME_ENGINE_TYPE_EM) + { + actual_player_x = correctLevelPosX_EM(actual_player_x); + actual_player_y = correctLevelPosY_EM(actual_player_y); + } + /* needed to determine if sounds are played within the visible screen area */ scroll_x = actual_scroll_x; scroll_y = actual_scroll_y; + + /* needed to get player position for "follow finger" playing input method */ + local_player->jx = actual_player_x; + local_player->jy = actual_player_y; } void InitMovDir(int x, int y) @@ -10698,7 +10710,7 @@ static void CheckSaveEngineSnapshot(struct PlayerInfo *player) (player->is_snapping && !player->was_snapping) || (player->is_dropping && !player->was_dropping)) { - if (!SaveEngineSnapshotToList()) + if (!CheckSaveEngineSnapshotToList()) return; player->was_moving = FALSE; @@ -10959,7 +10971,7 @@ void StartGameActions(boolean init_network_game, boolean record_tape, InitGame(); } -void GameActions() +void GameActionsExt() { #if 0 static unsigned int game_frame_delay = 0; @@ -11238,6 +11250,24 @@ void GameActions() } } +static void GameActions_CheckSaveEngineSnapshot() +{ + if (!game.snapshot.save_snapshot) + return; + + // clear flag for saving snapshot _before_ saving snapshot + game.snapshot.save_snapshot = FALSE; + + SaveEngineSnapshotToList(); +} + +void GameActions() +{ + GameActionsExt(); + + GameActions_CheckSaveEngineSnapshot(); +} + void GameActions_EM_Main() { byte effective_action[MAX_PLAYERS]; @@ -14770,11 +14800,10 @@ void SaveEngineSnapshotSingle() snapshot_level_nr = level_nr; } -static boolean SaveEngineSnapshotToListExt(boolean initial_snapshot) +boolean CheckSaveEngineSnapshotToList() { boolean save_snapshot = - (initial_snapshot || - (game.snapshot.mode == SNAPSHOT_MODE_EVERY_STEP) || + ((game.snapshot.mode == SNAPSHOT_MODE_EVERY_STEP) || (game.snapshot.mode == SNAPSHOT_MODE_EVERY_MOVE && game.snapshot.changed_action) || (game.snapshot.mode == SNAPSHOT_MODE_EVERY_COLLECT && @@ -14782,30 +14811,28 @@ static boolean SaveEngineSnapshotToListExt(boolean initial_snapshot) game.snapshot.changed_action = FALSE; game.snapshot.collected_item = FALSE; + game.snapshot.save_snapshot = save_snapshot; + return save_snapshot; +} + +void SaveEngineSnapshotToList() +{ if (game.snapshot.mode == SNAPSHOT_MODE_OFF || - tape.quick_resume || - !save_snapshot) - return FALSE; + tape.quick_resume) + return; ListNode *buffers = SaveEngineSnapshotBuffers(); /* finally save all snapshot buffers to snapshot list */ SaveSnapshotToList(buffers); - - return TRUE; -} - -boolean SaveEngineSnapshotToList() -{ - return SaveEngineSnapshotToListExt(FALSE); } void SaveEngineSnapshotToListInitial() { FreeEngineSnapshotList(); - SaveEngineSnapshotToListExt(TRUE); + SaveEngineSnapshotToList(); } void LoadEngineSnapshotValues()