X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ftape.c;h=55c414fd1b0233982caae45c2600d0489208762b;hb=ede9654611727236d92fb50575bb937231acff71;hp=0fef94eb6afd84fdea646903465a29b690c2861b;hpb=3534d01a0c0c2693d3e1d55c6c0944e2b43ed9ce;p=rocksndiamonds.git diff --git a/src/tape.c b/src/tape.c index 0fef94eb..55c414fd 100644 --- a/src/tape.c +++ b/src/tape.c @@ -37,6 +37,7 @@ /* forward declaration for internal use */ static void HandleTapeButtons(struct GadgetInfo *); static void TapeStopWarpForward(); +static float GetTapeLengthSecondsFloat(); static struct GadgetInfo *tape_gadget[NUM_TAPE_BUTTONS]; @@ -484,11 +485,13 @@ void PrintTapeReplayProgress(boolean replay_finished) } else { + float tape_length_seconds = GetTapeLengthSecondsFloat(); + PrintNoLog("\r"); Print("Level %03d [%02d:%02d]: (%02d:%02d.%03d / %.2f %%) - %s.\n", level_nr, tape.length_seconds / 60, tape.length_seconds % 60, counter_seconds / 60, counter_seconds % 60, counter % 1000, - (float)counter / tape.length_seconds / 10, + (float)counter / tape_length_seconds / 10, tape.auto_play_level_solved ? "solved" : "NOT SOLVED"); counter_last = -1; @@ -541,6 +544,8 @@ void TapeErase() tape.centered_player_nr_next = -1; tape.set_centered_player = FALSE; + + tape.use_mouse = (level.game_engine_type == GAME_ENGINE_TYPE_MM); } static void TapeRewind() @@ -637,9 +642,6 @@ static void TapeAppendRecording() void TapeHaltRecording() { - if (!tape.recording) - return; - tape.counter++; // initialize delay for next tape entry (to be able to continue recording) @@ -653,7 +655,8 @@ void TapeHaltRecording() void TapeStopRecording() { - TapeHaltRecording(); + if (tape.recording) + TapeHaltRecording(); tape.recording = FALSE; tape.pausing = FALSE; @@ -662,7 +665,7 @@ void TapeStopRecording() MapTapeEjectButton(); } -void TapeAddAction(byte action[MAX_PLAYERS]) +boolean TapeAddAction(byte action[MAX_PLAYERS]) { int i; @@ -676,6 +679,9 @@ void TapeAddAction(byte action[MAX_PLAYERS]) if (changed_events || tape.pos[tape.counter].delay >= 255) { + if (tape.counter >= MAX_TAPE_LEN - 1) + return FALSE; + tape.counter++; tape.pos[tape.counter].delay = 0; } @@ -690,6 +696,8 @@ void TapeAddAction(byte action[MAX_PLAYERS]) tape.pos[tape.counter].delay++; } + + return TRUE; } void TapeRecordAction(byte action_raw[MAX_PLAYERS]) @@ -700,16 +708,10 @@ void TapeRecordAction(byte action_raw[MAX_PLAYERS]) if (!tape.recording) /* (record action even when tape is paused) */ return; - if (tape.counter >= MAX_TAPE_LEN - 1) - { - TapeStopRecording(); - return; - } - for (i = 0; i < MAX_PLAYERS; i++) action[i] = action_raw[i]; - if (tape.set_centered_player) + if (!tape.use_mouse && tape.set_centered_player) { for (i = 0; i < MAX_PLAYERS; i++) if (tape.centered_player_nr_next == i || @@ -719,7 +721,8 @@ void TapeRecordAction(byte action_raw[MAX_PLAYERS]) tape.set_centered_player = FALSE; } - TapeAddAction(action); + if (!TapeAddAction(action)) + TapeStopRecording(); } void TapeTogglePause(boolean toggle_mode) @@ -886,16 +889,19 @@ byte *TapePlayAction() tape.set_centered_player = FALSE; tape.centered_player_nr_next = -999; - for (i = 0; i < MAX_PLAYERS; i++) + if (!tape.use_mouse) { - if (action[i] & KEY_SET_FOCUS) + for (i = 0; i < MAX_PLAYERS; i++) { - tape.set_centered_player = TRUE; - tape.centered_player_nr_next = - (tape.centered_player_nr_next == -999 ? i : -1); - } + if (action[i] & KEY_SET_FOCUS) + { + tape.set_centered_player = TRUE; + tape.centered_player_nr_next = + (tape.centered_player_nr_next == -999 ? i : -1); + } - action[i] &= ~KEY_SET_FOCUS; + action[i] &= ~KEY_SET_FOCUS; + } } tape.delay_played++; @@ -913,6 +919,9 @@ byte *TapePlayAction() void TapeStop() { + if (tape.pausing) + TapeTogglePause(TAPE_TOGGLE_MANUAL); + TapeStopRecording(); TapeStopPlaying(); @@ -945,6 +954,11 @@ unsigned int GetTapeLengthSeconds() return (GetTapeLengthFrames() * GAME_FRAME_DELAY / 1000); } +static float GetTapeLengthSecondsFloat() +{ + return ((float)GetTapeLengthFrames() * GAME_FRAME_DELAY / 1000); +} + static void TapeStartWarpForward(int mode) { tape.fast_forward = (mode & AUTOPLAY_FFWD);