X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fgame.c;h=49908daaae39c7970777a519d49da601eb039ae1;hb=d2b08e8601362bd9f1ade63c9bca892aab0e410e;hp=63eb94115bb5224ca532217187b45d973b69041a;hpb=4b722be68436ced0b7bb3eff61ed14d6c66df949;p=rocksndiamonds.git diff --git a/src/game.c b/src/game.c index 63eb9411..49908daa 100644 --- a/src/game.c +++ b/src/game.c @@ -3035,7 +3035,15 @@ static void InitGameEngine() game.scroll_delay_value = MIN(MAX(MIN_SCROLL_DELAY, game.scroll_delay_value), MAX_SCROLL_DELAY); - FreeEngineSnapshotList(); + /* ---------- 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); } int get_num_special_action(int element, int action_first, int action_last) @@ -3997,7 +4005,7 @@ void InitGame() game.restart_level = FALSE; - SaveEngineSnapshotToList(); + SaveEngineSnapshotToListInitial(); } void UpdateEngineValues(int actual_scroll_x, int actual_scroll_y) @@ -4425,6 +4433,9 @@ void GameEnd() { game_status = GAME_MODE_SCORES; + /* needed if different viewport properties defined for scores */ + ChangeViewportPropertiesIfNeeded(); + DrawHallOfFame(hi_pos); if (raise_level) @@ -10686,7 +10697,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 +10967,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) { @@ -11162,8 +11191,10 @@ void GameActions() } else { - GameActions_RND(); + GameActions_RND_Main(); } + + redraw_mask |= REDRAW_FIELD; } void GameActions_EM_Main() @@ -11198,6 +11229,13 @@ void GameActions_SP_Main() AdvanceFrameAndPlayerCounters(-1); /* advance counters for all players */ } +void GameActions_RND_Main() +{ + GameActions_RND(); + + BlitScreenToBitmap_RND(backbuffer); +} + void GameActions_RND() { int magic_wall_x = 0, magic_wall_y = 0; @@ -11776,16 +11814,16 @@ static boolean AllPlayersInVisibleScreen() void ScrollLevel(int dx, int dy) { - int softscroll_offset = (setup.soft_scrolling ? 2 * TILEX_VAR : 0); + int scroll_offset = 2 * TILEX_VAR; int x, y; BlitBitmap(drawto_field, drawto_field, - FX + TILEX_VAR * (dx == -1) - softscroll_offset, - FY + TILEY_VAR * (dy == -1) - softscroll_offset, - SXSIZE - TILEX_VAR * (dx != 0) + 2 * softscroll_offset, - SYSIZE - TILEY_VAR * (dy != 0) + 2 * softscroll_offset, - FX + TILEX_VAR * (dx == 1) - softscroll_offset, - FY + TILEY_VAR * (dy == 1) - softscroll_offset); + FX + TILEX_VAR * (dx == -1) - scroll_offset, + FY + TILEY_VAR * (dy == -1) - scroll_offset, + SXSIZE - TILEX_VAR * (dx != 0) + 2 * scroll_offset, + SYSIZE - TILEY_VAR * (dy != 0) + 2 * scroll_offset, + FX + TILEX_VAR * (dx == 1) - scroll_offset, + FY + TILEY_VAR * (dy == 1) - scroll_offset); if (dx != 0) { @@ -14610,10 +14648,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) @@ -14698,11 +14732,6 @@ ListNode *SaveEngineSnapshotBuffers() SaveSnapshotBuffer(&buffers, ARGS_ADDRESS_AND_SIZEOF(scroll_x)); SaveSnapshotBuffer(&buffers, ARGS_ADDRESS_AND_SIZEOF(scroll_y)); - /* save level identification information */ - - setString(&snapshot_level_identifier, leveldir_current->identifier); - snapshot_level_nr = level_nr; - #if 0 ListNode *node = engine_snapshot_list_rnd; int num_bytes = 0; @@ -14726,14 +14755,45 @@ void SaveEngineSnapshotSingle() /* finally save all snapshot buffers to single snapshot */ SaveSnapshotSingle(buffers); + + /* save level identification information */ + setString(&snapshot_level_identifier, leveldir_current->identifier); + snapshot_level_nr = level_nr; } -void SaveEngineSnapshotToList() +static boolean SaveEngineSnapshotToListExt(boolean initial_snapshot) { + boolean save_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 = FALSE; + + if (game.snapshot.mode == SNAPSHOT_MODE_OFF || + tape.quick_resume || + !save_snapshot) + return FALSE; + 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); } void LoadEngineSnapshotValues() @@ -14769,12 +14829,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 ---------------------------------------- */ @@ -14919,22 +14984,48 @@ void FreeGameButtons() FreeGadget(game_gadget[i]); } -void MapStopPlayButtons() +static void MapGameButtonsAtSamePosition(int id) { - UnmapGadget(game_gadget[GAME_CTRL_ID_UNDO]); - UnmapGadget(game_gadget[GAME_CTRL_ID_REDO]); + int i; - MapGadget(game_gadget[GAME_CTRL_ID_STOP]); - MapGadget(game_gadget[GAME_CTRL_ID_PLAY]); + for (i = 0; i < NUM_GAME_BUTTONS; i++) + if (i != id && + gamebutton_info[i].pos->x == gamebutton_info[id].pos->x && + gamebutton_info[i].pos->y == gamebutton_info[id].pos->y) + MapGadget(game_gadget[i]); +} + +static void UnmapGameButtonsAtSamePosition(int id) +{ + int i; + + for (i = 0; i < NUM_GAME_BUTTONS; i++) + if (i != id && + gamebutton_info[i].pos->x == gamebutton_info[id].pos->x && + gamebutton_info[i].pos->y == gamebutton_info[id].pos->y) + UnmapGadget(game_gadget[i]); } void MapUndoRedoButtons() { - UnmapGadget(game_gadget[GAME_CTRL_ID_STOP]); - UnmapGadget(game_gadget[GAME_CTRL_ID_PLAY]); + UnmapGameButtonsAtSamePosition(GAME_CTRL_ID_UNDO); + UnmapGameButtonsAtSamePosition(GAME_CTRL_ID_REDO); + UnmapGameButtonsAtSamePosition(GAME_CTRL_ID_PLAY); MapGadget(game_gadget[GAME_CTRL_ID_UNDO]); MapGadget(game_gadget[GAME_CTRL_ID_REDO]); + MapGadget(game_gadget[GAME_CTRL_ID_PLAY]); +} + +void UnmapUndoRedoButtons() +{ + UnmapGadget(game_gadget[GAME_CTRL_ID_UNDO]); + UnmapGadget(game_gadget[GAME_CTRL_ID_REDO]); + UnmapGadget(game_gadget[GAME_CTRL_ID_PLAY]); + + MapGameButtonsAtSamePosition(GAME_CTRL_ID_UNDO); + MapGameButtonsAtSamePosition(GAME_CTRL_ID_REDO); + MapGameButtonsAtSamePosition(GAME_CTRL_ID_PLAY); } void MapGameButtons() @@ -14943,7 +15034,8 @@ void MapGameButtons() for (i = 0; i < NUM_GAME_BUTTONS; i++) if (i != GAME_CTRL_ID_UNDO && - i != GAME_CTRL_ID_REDO) + i != GAME_CTRL_ID_REDO && + i != GAME_CTRL_ID_PLAY) MapGadget(game_gadget[i]); } @@ -14975,15 +15067,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 +15088,7 @@ void GameUndo(int steps) void GameRedo(int steps) { - if (!CheckEngineSnapshot()) + if (!CheckEngineSnapshotList()) return; LoadEngineSnapshot_Redo(steps); @@ -15050,10 +15145,7 @@ static void HandleGameButtonsExt(int id, int button) SendToServer_ContinuePlaying(); else #endif - { - tape.pausing = FALSE; - DrawVideoDisplay(VIDEO_STATE_PAUSE_OFF, 0); - } + TapeTogglePause(TAPE_TOGGLE_MANUAL); } break;