X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ftape.c;h=38edafc59d6503b61e167c97f1ec16c1f8aadbe5;hb=3256486ac61f3b7e213973f5dd441e01197ae971;hp=f8e6a5e0594214d8f29f372d70023398113b04e2;hpb=d08e78f8f8fbad82d417ef27351676753c2c9fa3;p=rocksndiamonds.git diff --git a/src/tape.c b/src/tape.c index f8e6a5e0..38edafc5 100644 --- a/src/tape.c +++ b/src/tape.c @@ -637,11 +637,11 @@ static void TapeAppendRecording() void TapeHaltRecording() { - if (!tape.recording) - return; - tape.counter++; - tape.pos[tape.counter].delay = 0; + + // initialize delay for next tape entry (to be able to continue recording) + if (tape.counter < MAX_TAPE_LEN) + tape.pos[tape.counter].delay = 0; tape.length = tape.counter; tape.length_frames = GetTapeLengthFrames(); @@ -650,7 +650,8 @@ void TapeHaltRecording() void TapeStopRecording() { - TapeHaltRecording(); + if (tape.recording) + TapeHaltRecording(); tape.recording = FALSE; tape.pausing = FALSE; @@ -659,33 +660,10 @@ void TapeStopRecording() MapTapeEjectButton(); } -void TapeRecordAction(byte action_raw[MAX_PLAYERS]) +void TapeAddAction(byte action[MAX_PLAYERS]) { - byte action[MAX_PLAYERS]; int i; - 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) - { - for (i = 0; i < MAX_PLAYERS; i++) - if (tape.centered_player_nr_next == i || - tape.centered_player_nr_next == -1) - action[i] |= KEY_SET_FOCUS; - - tape.set_centered_player = FALSE; - } - if (tape.pos[tape.counter].delay > 0) /* already stored action */ { boolean changed_events = FALSE; @@ -712,6 +690,36 @@ void TapeRecordAction(byte action_raw[MAX_PLAYERS]) } } +void TapeRecordAction(byte action_raw[MAX_PLAYERS]) +{ + byte action[MAX_PLAYERS]; + int i; + + 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) + { + for (i = 0; i < MAX_PLAYERS; i++) + if (tape.centered_player_nr_next == i || + tape.centered_player_nr_next == -1) + action[i] |= KEY_SET_FOCUS; + + tape.set_centered_player = FALSE; + } + + TapeAddAction(action); +} + void TapeTogglePause(boolean toggle_mode) { if (tape.playing && tape.pausing && (toggle_mode & TAPE_TOGGLE_PLAY_PAUSE)) @@ -1066,7 +1074,10 @@ void TapeQuickLoad() void InsertSolutionTape() { - if (!fileExists(getSolutionTapeFilename(level_nr))) + boolean level_has_tape = (level.game_engine_type == GAME_ENGINE_TYPE_SP && + level.native_sp_level->demo.is_available); + + if (!fileExists(getSolutionTapeFilename(level_nr)) && !level_has_tape) { Request("No solution tape for this level!", REQ_CONFIRM); @@ -1391,7 +1402,7 @@ static void HandleTapeButtonsExt(int id) else { if (tape.changed) - SaveTapeChecked(tape.level_nr); + SaveTapeChecked(level_nr); TapeErase(); }