From b9aabf33533765a3cd4755ba3a00a01bb1430015 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 25 Feb 2022 01:22:52 +0200 Subject: [PATCH] CHEWY: Switch the TV videos to the new video code This also adds handling for rewindable videos, which keep looping until the current dialog finishes. Furthermore, events are now correctly pushed to the engine code --- engines/chewy/r_event.cpp | 37 -------------- engines/chewy/rooms/room28.cpp | 2 +- engines/chewy/rooms/room39.cpp | 53 +++----------------- engines/chewy/rooms/room39.h | 4 +- engines/chewy/types.h | 2 +- engines/chewy/video/video_player.cpp | 72 +++++++++++++++++++++++----- engines/chewy/video/video_player.h | 5 +- 7 files changed, 72 insertions(+), 103 deletions(-) diff --git a/engines/chewy/r_event.cpp b/engines/chewy/r_event.cpp index 30e8af6ecd0..88e41b4bb37 100644 --- a/engines/chewy/r_event.cpp +++ b/engines/chewy/r_event.cpp @@ -958,43 +958,6 @@ void flic_cut(int16 nr) { _G(sndPlayer)->setLoopMode(_G(spieler).soundLoopMode); break; - case FCUT_032: - case FCUT_034: - case FCUT_035: - case FCUT_036: - case FCUT_037: - case FCUT_040: - // TV - if (nr != FCUT_036) - _G(flc)->set_custom_user_function(Room39::setup_func); - - do { -#ifndef NEW_VIDEO_CODE - _G(mem)->file->select_pool_item(_G(Ci).Handle, nr); - ret = _G(flc)->custom_play(&_G(Ci)); -#else - ret = g_engine->_video->playVideo(nr) ? 0 : -1; -#endif - SHOULD_QUIT_RETURN; - } while (_G(atds)->aad_get_status() != -1 && ret != -1); - - if (nr != FCUT_036) - _G(flc)->remove_custom_user_function(); - break; - - case FCUT_038: - case FCUT_039: - // TV -#ifndef NEW_VIDEO_CODE - _G(mem)->file->select_pool_item(_G(Ci).Handle, nr); - _G(flc)->set_custom_user_function(Room39::setup_func); - _G(flc)->custom_play(&_G(Ci)); - _G(flc)->remove_custom_user_function(); -#else - g_engine->_video->playVideo(nr); -#endif - break; - case FCUT_047: case FCUT_048: #ifndef NEW_VIDEO_CODE diff --git a/engines/chewy/rooms/room28.cpp b/engines/chewy/rooms/room28.cpp index 355060f5e0c..d3571c0e8b9 100644 --- a/engines/chewy/rooms/room28.cpp +++ b/engines/chewy/rooms/room28.cpp @@ -261,7 +261,7 @@ void Room28::set_pump() { load_chewy_taf(CHEWY_PUMPKIN); _G(spieler).R28ChewyPump = true; - if (_G(spieler).R39TransMensch) { + if (_G(spieler).R39TranslatorUsed) { _G(spieler).room_e_obj[69].Attribut = AUSGANG_OBEN; } else { _G(atds)->set_ats_str(209, 1, ATS_DATEI); diff --git a/engines/chewy/rooms/room39.cpp b/engines/chewy/rooms/room39.cpp index 43a9322cc3a..a1d9cd6d123 100644 --- a/engines/chewy/rooms/room39.cpp +++ b/engines/chewy/rooms/room39.cpp @@ -50,8 +50,6 @@ static const AniBlock ABLOCK29[2] = { { 9, 4, ANI_VOR, ANI_WAIT, 0 }, }; -bool Room39::_flag; - void Room39::entry() { if (!_G(spieler).R41Einbruch) { if (_G(spieler).R39HowardDa) { @@ -197,7 +195,7 @@ int16 Room39::use_tv() { set_tv(); cls_flag = true; - if (!_G(spieler).R39TransMensch) { + if (!_G(spieler).R39TranslatorUsed) { ani_nr = CH_TALK11; dia_nr = 78; } else if (!_G(spieler).R39TvKanal && _G(spieler).R39ClintNews < 3) { @@ -217,7 +215,7 @@ int16 Room39::use_tv() { action_flag = true; if (_G(spieler).R39TvOn) { start_spz_wait(CH_TRANS, 1, false, P_CHEWY); - _G(spieler).R39TransMensch = true; + _G(spieler).R39TranslatorUsed = true; _G(flags).NoPalAfterFlc = true; flic_cut(FCUT_041); _G(spieler).R39TvKanal = 0; @@ -248,7 +246,7 @@ int16 Room39::use_tv() { } else if (is_cur_inventar(RECORDER_INV) && _G(spieler).ChewyAni != CHEWY_ROCKER) { action_flag = true; if (_G(spieler).R39TvOn) { - if (_G(spieler).R39TransMensch) { + if (_G(spieler).R39TranslatorUsed) { start_spz(CH_TALK3, 255, ANI_VOR, P_CHEWY); start_aad_wait(98, -1); _G(spieler).PersonHide[P_CHEWY] = true; @@ -288,8 +286,6 @@ int16 Room39::use_tv() { } void Room39::look_tv(bool cls_mode) { - _flag = false; - if (_G(spieler).R39TvOn) { if (!_G(flags).AutoAniPlay) { _G(flags).AutoAniPlay = true; @@ -313,11 +309,9 @@ void Room39::look_tv(bool cls_mode) { _G(flags).NoPalAfterFlc = true; } - if (_G(spieler).R39TransMensch) { + if (_G(spieler).R39TranslatorUsed) { if (dia_nr != 85) start_aad(dia_nr, -1); - else - _flag = true; } flic_cut(flic_nr); @@ -329,7 +323,7 @@ void Room39::look_tv(bool cls_mode) { _G(out)->setPalette(_G(pal)); _G(flags).NoPalAfterFlc = false; - if (_G(spieler).R39TransMensch && dia_nr == 85) + if (_G(spieler).R39TranslatorUsed && dia_nr == 85) start_aad_wait(dia_nr, -1); } } @@ -351,7 +345,7 @@ void Room39::set_tv() { _G(det)->show_static_spr(_G(spieler).R39TvKanal + 4); } - if (_G(spieler).R39TransMensch) { + if (_G(spieler).R39TranslatorUsed) { _G(atds)->set_ats_str(229, TXT_MARK_LOOK, 2 + _G(spieler).R39TvKanal, ATS_DATEI); } else { _G(atds)->set_ats_str(229, TXT_MARK_LOOK, 1, ATS_DATEI); @@ -359,40 +353,5 @@ void Room39::set_tv() { } } -int16 Room39::setup_func(int16 frame) { - int16 action_ret = _G(in)->get_switch_code() == Common::KEYCODE_ESCAPE ? -1 : 0; - - if (_flag) { - switch (frame) { - case 121: - start_aad(599, -1); - break; - case 247: - start_aad(600, -1); - break; - case 267: - start_aad(601, 0); - break; - case 297: - _G(in)->_hotkey = 1; - break; - case 171: - case 266: - case 370: - _G(atds)->stop_aad(); - break; - default: - break; - } - } - - _G(atds)->print_aad(_G(spieler).scrollx, _G(spieler).scrolly); - - if (!_flag && _G(atds)->aad_get_status() == -1) - action_ret = -1; - - return action_ret; -} - } // namespace Rooms } // namespace Chewy diff --git a/engines/chewy/rooms/room39.h b/engines/chewy/rooms/room39.h index 516dcc34f29..cf4d5597ce3 100644 --- a/engines/chewy/rooms/room39.h +++ b/engines/chewy/rooms/room39.h @@ -27,7 +27,7 @@ namespace Rooms { class Room39 { private: - static bool _flag; + static bool _watchingGaspHorrorShow; static void ok(); static void set_tv(); @@ -38,8 +38,6 @@ public: static short use_howard(); static void talk_howard(); static void look_tv(bool cls_mode); - - static int16 setup_func(int16 frame); }; } // namespace Rooms diff --git a/engines/chewy/types.h b/engines/chewy/types.h index 9a0cbb4bc9e..7d753be66e0 100644 --- a/engines/chewy/types.h +++ b/engines/chewy/types.h @@ -172,7 +172,7 @@ struct SpielerFlags { bool R37HundScham : 1; bool R37Kloppe : 1; bool R37Mes : 1; - bool R39TransMensch : 1; + bool R39TranslatorUsed : 1; bool R39TvOn : 1; bool R39ScriptOk : 1; diff --git a/engines/chewy/video/video_player.cpp b/engines/chewy/video/video_player.cpp index d95b787d7f8..bdb91ca8d6a 100644 --- a/engines/chewy/video/video_player.cpp +++ b/engines/chewy/video/video_player.cpp @@ -21,6 +21,7 @@ #include "chewy/video/cfo_decoder.h" #include "chewy/video/video_player.h" +#include "chewy/events.h" #include "chewy/globals.h" #include "chewy/resource.h" #include "chewy/sound.h" @@ -71,26 +72,30 @@ bool VideoPlayer::playVideo(uint num, bool stopMusic) { byte *destP = (byte *)g_screen->getPixels(); Common::copy(srcP, srcP + (SCREEN_WIDTH * SCREEN_HEIGHT), destP); g_screen->markAllDirty(); - keepPlaying = handleCustom(num, curFrame); - curFrame = cfoDecoder->getCurFrame(); if (cfoDecoder->hasDirtyPalette()) g_system->getPaletteManager()->setPalette(cfoDecoder->getPalette(), 0, 256); //setScummVMPalette(cfoDecoder->getPalette(), 0, 256); + keepPlaying = handleCustom(num, curFrame, cfoDecoder); + curFrame = cfoDecoder->getCurFrame(); + g_screen->update(); } } - while (g_system->getEventManager()->pollEvent(event)) { - // FIXME: We ignore mouse events because the game checks - // for left mouse down, instead of up, so releasing the - // mouse button results in video skipping - if ((event.type == Common::EVENT_KEYDOWN && event.kbd.keycode == Common::KEYCODE_ESCAPE) /*|| event.type == Common::EVENT_LBUTTONUP*/) - skipVideo = true; - } + g_events->update(); - g_system->delayMillis(10); + // FIXME: We ignore mouse events because the game checks + // for left mouse down, instead of up, so releasing the + // mouse button results in video skipping + if (_G(in)->get_switch_code() == Common::KEYCODE_ESCAPE) + skipVideo = true; + + // Clear any pending keys + _G(in)->_hotkey = 0; + _G(kbinfo).key_code = '\0'; + _G(kbinfo).scan_code = 0; } cfoDecoder->close(); @@ -105,7 +110,7 @@ bool VideoPlayer::playVideo(uint num, bool stopMusic) { return !skipVideo; } -bool VideoPlayer::handleCustom(uint num, uint frame) { +bool VideoPlayer::handleCustom(uint num, uint frame, CfoDecoder *cfoDecoder) { switch (num) { case FCUT_004: // Room6::cut_serv1 @@ -134,11 +139,52 @@ bool VideoPlayer::handleCustom(uint num, uint frame) { start_aad(106, 0); } break; + case FCUT_032: + case FCUT_034: + case FCUT_035: + case FCUT_036: + case FCUT_037: + case FCUT_038: + case FCUT_039: + case FCUT_040: + // Room39::setup_func + if (!_G(spieler).R39TranslatorUsed) + return false; + + if (num == FCUT_034) { + switch (frame) { + case 121: + start_aad(599, -1); + break; + case 247: + start_aad(600, -1); + break; + case 267: + start_aad(601, 0); + break; + case 297: + _G(in)->_hotkey = 1; + break; + case 171: + case 266: + case 370: + _G(atds)->stop_aad(); + break; + default: + break; + } + } + + _G(atds)->print_aad(_G(spieler).scrollx, _G(spieler).scrolly); + + if (cfoDecoder->endOfVideo() && _G(atds)->aad_get_status() != -1) + cfoDecoder->rewind(); + break; case FCUT_094: - //Room87::proc3 + // Room87::proc3 return (frame >= 12) ? false : true; case FCUT_112: - //Room56::proc1 + // Room56::proc1 return (_G(in)->get_switch_code() == 1) ? false : true; default: return true; diff --git a/engines/chewy/video/video_player.h b/engines/chewy/video/video_player.h index c6e5d138e7b..e71e9435753 100644 --- a/engines/chewy/video/video_player.h +++ b/engines/chewy/video/video_player.h @@ -24,17 +24,20 @@ namespace Chewy { +class CfoDecoder; + class VideoPlayer { public: /** * @Plays a video file * @param num - the video file number + * @param stopMusic - stop music before starting the video * @return - true if played, false if skipped */ bool playVideo(uint num, bool stopMusic = true); private: - bool handleCustom(uint num, uint frame); + bool handleCustom(uint num, uint frame, CfoDecoder *cfoDecoder); }; } // End of namespace Chewy