From: Holger Schemel Date: Sun, 29 Mar 2015 19:30:11 +0000 (+0200) Subject: added movement-based engine snapshot mode to step-based mode X-Git-Tag: 4.0.0.0-rc1~223 X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=commitdiff_plain;h=686d4883428879e2e882222a6579e376d9e4ac4c added movement-based engine snapshot mode to step-based mode --- diff --git a/src/game.c b/src/game.c index f35e89db..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(); } @@ -10686,7 +10692,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 +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) { @@ -14724,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() diff --git a/src/game.h b/src/game.h index 3f04c02e..ae0a1cc1 100644 --- a/src/game.h +++ b/src/game.h @@ -28,6 +28,10 @@ #define NUM_PANEL_ELEMENTS 8 #define NUM_PANEL_CE_SCORE 8 +#define SNAPSHOT_MODE_STEP 0 +#define SNAPSHOT_MODE_MOVE 1 + + struct GamePanelInfo { struct TextPosInfo level_number; @@ -101,6 +105,14 @@ struct GameButtonInfo struct XY sound_simple; }; +struct GameSnapshotInfo +{ + int mode; + + byte last_action[MAX_PLAYERS]; + boolean changed_action; +}; + struct GameInfo { /* values for control panel */ @@ -175,6 +187,9 @@ struct GameInfo /* values for random number generator initialization after snapshot */ unsigned int num_random_calls; + + /* values for game engine snapshot control */ + struct GameSnapshotInfo snapshot; }; struct PlayerInfo @@ -353,7 +368,7 @@ void FreeEngineSnapshotSingle(); void FreeEngineSnapshotList(); void LoadEngineSnapshotSingle(); void SaveEngineSnapshotSingle(); -void SaveEngineSnapshotToList(); +boolean SaveEngineSnapshotToList(); boolean CheckEngineSnapshot(); void CreateGameButtons(); diff --git a/src/tools.c b/src/tools.c index 7c063429..f9a2472c 100644 --- a/src/tools.c +++ b/src/tools.c @@ -7805,7 +7805,8 @@ void CheckSaveEngineSnapshot_EM(byte action[MAX_PLAYERS], int frame, { if (!player_was_waiting) { - SaveEngineSnapshotToList(); + if (!SaveEngineSnapshotToList()) + return; player_was_waiting = TRUE; } @@ -7819,13 +7820,14 @@ void CheckSaveEngineSnapshot_EM(byte action[MAX_PLAYERS], int frame, void CheckSaveEngineSnapshot_SP(boolean murphy_is_waiting, boolean murphy_is_dropping) { - static boolean player_was_waiting = FALSE; + static boolean player_was_waiting = TRUE; if (murphy_is_waiting) { if (!player_was_waiting) { - SaveEngineSnapshotToList(); + if (!SaveEngineSnapshotToList()) + return; player_was_waiting = TRUE; }