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)
{
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;
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();
(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 ||
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 ||
}
else
TapeTogglePause(TAPE_TOGGLE_MANUAL);
+
+ game_undo_executed = FALSE;
+
break;
case GAME_CTRL_ID_PLAY:
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;
#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
byte last_action[MAX_PLAYERS];
boolean changed_action;
+ boolean collected_item;
};
struct GameInfo
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;
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;
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;
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;
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.
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