From ff45a13c41aeeb995cb556c3f3b7f7be477fc214 Mon Sep 17 00:00:00 2001 From: Holger Schemel Date: Tue, 23 Feb 2016 08:44:25 +0100 Subject: [PATCH] added collecting-based engine snapshot mode to step/move-based modes --- src/game.c | 29 +++++++++++++++++++++++++++-- src/game.h | 3 +++ src/game_em/synchro_1.c | 4 ++++ src/game_sp/DoGameStuff.c | 4 ++++ src/screens.c | 9 +++++---- 5 files changed, 43 insertions(+), 6 deletions(-) diff --git a/src/game.c b/src/game.c index adc7f2d6..7f98027c 100644 --- a/src/game.c +++ b/src/game.c @@ -3040,11 +3040,14 @@ static void InitGameEngine() for (i = 0; i < MAX_PLAYERS; i++) game.snapshot.last_action[i] = 0; game.snapshot.changed_action = FALSE; + game.snapshot.collected_item = 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); + SNAPSHOT_MODE_EVERY_MOVE : + strEqual(setup.engine_snapshot_mode, STR_SNAPSHOT_MODE_EVERY_COLLECT) ? + SNAPSHOT_MODE_EVERY_COLLECT : SNAPSHOT_MODE_OFF); } int get_num_special_action(int element, int action_first, int action_last) @@ -9494,6 +9497,8 @@ static void ExecuteCustomElementAction(int x, int y, int element, int page) { local_player->gems_still_needed = action_arg_number_new; + game.snapshot.collected_item = TRUE; + game_panel_controls[GAME_PANEL_GEMS].value = local_player->gems_still_needed; @@ -13458,6 +13463,8 @@ static int DigField(struct PlayerInfo *player, if (local_player->gems_still_needed < 0) local_player->gems_still_needed = 0; + game.snapshot.collected_item = TRUE; + game_panel_controls[GAME_PANEL_GEMS].value = local_player->gems_still_needed; DisplayGameControlValues(); @@ -14752,9 +14759,12 @@ static boolean SaveEngineSnapshotToListExt(boolean initial_snapshot) (initial_snapshot || (game.snapshot.mode == SNAPSHOT_MODE_EVERY_STEP) || (game.snapshot.mode == SNAPSHOT_MODE_EVERY_MOVE && - game.snapshot.changed_action)); + game.snapshot.changed_action) || + (game.snapshot.mode == SNAPSHOT_MODE_EVERY_COLLECT && + game.snapshot.collected_item)); game.snapshot.changed_action = FALSE; + game.snapshot.collected_item = FALSE; if (game.snapshot.mode == SNAPSHOT_MODE_OFF || tape.quick_resume || @@ -15096,6 +15106,7 @@ void GameRedo(int steps) static void HandleGameButtonsExt(int id, int button) { + static boolean game_undo_executed = FALSE; int steps = BUTTON_STEPSIZE(button); boolean handle_game_buttons = (game_status == GAME_MODE_PLAYING || @@ -15130,6 +15141,9 @@ static void HandleGameButtonsExt(int id, int button) } else TapeTogglePause(TAPE_TOGGLE_MANUAL); + + game_undo_executed = FALSE; + break; case GAME_CTRL_ID_PLAY: @@ -15149,6 +15163,17 @@ static void HandleGameButtonsExt(int id, int button) break; case GAME_CTRL_ID_UNDO: + // Important: When using "save snapshot when collecting an item" mode, + // load last (current) snapshot for first "undo" after pressing "pause" + // (else the last-but-one snapshot would be loaded, because the snapshot + // pointer already points to the last snapshot when pressing "pause", + // which is fine for "every step/move" mode, but not for "every collect") + if (game.snapshot.mode == SNAPSHOT_MODE_EVERY_COLLECT && + !game_undo_executed) + steps--; + + game_undo_executed = TRUE; + GameUndo(steps); break; diff --git a/src/game.h b/src/game.h index 93ab629a..5e3bc7ef 100644 --- a/src/game.h +++ b/src/game.h @@ -31,11 +31,13 @@ #define STR_SNAPSHOT_MODE_OFF "off" #define STR_SNAPSHOT_MODE_EVERY_STEP "every_step" #define STR_SNAPSHOT_MODE_EVERY_MOVE "every_move" +#define STR_SNAPSHOT_MODE_EVERY_COLLECT "every_collect" #define STR_SNAPSHOT_MODE_DEFAULT STR_SNAPSHOT_MODE_OFF #define SNAPSHOT_MODE_OFF 0 #define SNAPSHOT_MODE_EVERY_STEP 1 #define SNAPSHOT_MODE_EVERY_MOVE 2 +#define SNAPSHOT_MODE_EVERY_COLLECT 3 #define SNAPSHOT_MODE_DEFAULT SNAPSHOT_MODE_OFF @@ -119,6 +121,7 @@ struct GameSnapshotInfo byte last_action[MAX_PLAYERS]; boolean changed_action; + boolean collected_item; }; struct GameInfo diff --git a/src/game_em/synchro_1.c b/src/game_em/synchro_1.c index 7b2e9c80..7852eb74 100644 --- a/src/game_em/synchro_1.c +++ b/src/game_em/synchro_1.c @@ -585,6 +585,7 @@ static boolean player_digfield(struct PLAYER *ply, int dx, int dy) play_element_sound(x, y, SAMPLE_collect, element); lev.score += lev.diamond_score; lev.required = lev.required < 3 ? 0 : lev.required - 3; + game.snapshot.collected_item = TRUE; ply->anim = SPR_walk + anim; ply->x = x; ply->y = y; @@ -597,6 +598,7 @@ static boolean player_digfield(struct PLAYER *ply, int dx, int dy) play_element_sound(x, y, SAMPLE_collect, element); lev.score += lev.emerald_score; lev.required = lev.required < 1 ? 0 : lev.required - 1; + game.snapshot.collected_item = TRUE; ply->anim = SPR_walk + anim; ply->x = x; ply->y = y; @@ -1108,6 +1110,7 @@ static boolean player_digfield(struct PLAYER *ply, int dx, int dy) play_element_sound(x, y, SAMPLE_collect, element); lev.score += lev.diamond_score; lev.required = lev.required < 3 ? 0 : lev.required - 3; + game.snapshot.collected_item = TRUE; ply->anim = SPR_walk + anim; break; @@ -1118,6 +1121,7 @@ static boolean player_digfield(struct PLAYER *ply, int dx, int dy) play_element_sound(x, y, SAMPLE_collect, element); lev.score += lev.emerald_score; lev.required = lev.required < 1 ? 0 : lev.required - 1; + game.snapshot.collected_item = TRUE; ply->anim = SPR_walk + anim; break; diff --git a/src/game_sp/DoGameStuff.c b/src/game_sp/DoGameStuff.c index 88434a90..7a7c1ac7 100644 --- a/src/game_sp/DoGameStuff.c +++ b/src/game_sp/DoGameStuff.c @@ -20,9 +20,13 @@ byte AnimationSubTable[SP_MAX_PLAYFIELD_SIZE]; void subDoGameStuff() { int si, cx, dx, bl; + int InfotronsNeeded_last = InfotronsNeeded; subAnimateMurphy(&MurphyPosIndex); // move Murphy in any direction + if (InfotronsNeeded != InfotronsNeeded_last) + game.snapshot.collected_item = TRUE; + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Build a database of locations and subs-to-call of animatable fields only: // Make a snapshot from the field before the animation cycle starts. diff --git a/src/screens.c b/src/screens.c index 7b5aaf9d..c45e9bad 100644 --- a/src/screens.c +++ b/src/screens.c @@ -326,11 +326,12 @@ static struct char *text; } snapshot_modes_list[] = { - { STR_SNAPSHOT_MODE_OFF, "Off" }, - { STR_SNAPSHOT_MODE_EVERY_STEP, "Every Step" }, - { STR_SNAPSHOT_MODE_EVERY_MOVE, "Every Move" }, + { STR_SNAPSHOT_MODE_OFF, "Off" }, + { STR_SNAPSHOT_MODE_EVERY_STEP, "Every Step" }, + { STR_SNAPSHOT_MODE_EVERY_MOVE, "Every Move" }, + { STR_SNAPSHOT_MODE_EVERY_COLLECT, "Every Collect" }, - { NULL, NULL }, + { NULL, NULL }, }; static struct -- 2.34.1