2018-01-05 19:21:07 +02:00
/*
* CPrologEpilogVideo . cpp , part of VCMI engine
*
* Authors : listed in file AUTHORS in main folder
*
* License : GNU General Public License v2 .0 or later
* Full text of license available in license . txt file , in main folder
*
*/
# include "StdInc.h"
# include "CPrologEpilogVideo.h"
# include "../CGameInfo.h"
# include "../CMusicHandler.h"
# include "../CVideoHandler.h"
2024-01-24 02:17:23 +02:00
# include "../gui/WindowHandler.h"
2018-01-05 19:21:07 +02:00
# include "../gui/CGuiHandler.h"
2024-01-24 02:17:23 +02:00
# include "../gui/FramerateManager.h"
2018-01-05 19:21:07 +02:00
# include "../widgets/TextControls.h"
2023-06-02 15:42:18 +02:00
# include "../render/Canvas.h"
2018-01-05 19:21:07 +02:00
2023-06-25 20:16:03 +02:00
CPrologEpilogVideo : : CPrologEpilogVideo ( CampaignScenarioPrologEpilog _spe , std : : function < void ( ) > callback )
2024-01-25 22:11:42 +02:00
: CWindowObject ( BORDERED ) , spe ( _spe ) , positionCounter ( 0 ) , voiceSoundHandle ( - 1 ) , videoSoundHandle ( - 1 ) , exitCb ( callback ) , elapsedTimeMilliseconds ( 0 )
2018-01-05 19:21:07 +02:00
{
OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE ;
2024-01-26 12:17:38 +02:00
addUsedEvents ( LCLICK | TIME ) ;
2018-01-05 19:21:07 +02:00
pos = center ( Rect ( 0 , 0 , 800 , 600 ) ) ;
updateShadow ( ) ;
2023-10-07 23:07:10 +02:00
auto audioData = CCS - > videoh - > getAudio ( spe . prologVideo ) ;
2024-05-02 15:45:46 +02:00
videoSoundHandle = CCS - > soundh - > playSound ( audioData , - 1 ) ;
2023-04-17 02:47:54 +02:00
CCS - > videoh - > open ( spe . prologVideo ) ;
2023-09-04 12:03:15 +02:00
CCS - > musich - > playMusic ( spe . prologMusic , true , true ) ;
2024-01-26 22:58:39 +02:00
voiceDurationMilliseconds = CCS - > soundh - > getSoundDurationMilliseconds ( spe . prologVoice ) ;
2023-09-11 14:11:16 +02:00
voiceSoundHandle = CCS - > soundh - > playSound ( spe . prologVoice ) ;
2023-09-11 14:44:07 +02:00
auto onVoiceStop = [ this ] ( )
{
voiceStopped = true ;
2024-01-25 21:49:59 +02:00
elapsedTimeMilliseconds = 0 ;
2023-09-11 14:44:07 +02:00
} ;
CCS - > soundh - > setCallback ( voiceSoundHandle , onVoiceStop ) ;
2018-01-05 19:21:07 +02:00
2023-09-28 00:10:28 +02:00
text = std : : make_shared < CMultiLineLabel > ( Rect ( 100 , 500 , 600 , 100 ) , EFonts : : FONT_BIG , ETextAlignment : : CENTER , Colors : : METALLIC_GOLD , spe . prologText . toString ( ) ) ;
2024-01-25 21:49:59 +02:00
text - > scrollTextTo ( - 50 ) ; // beginning of text in the vertical middle of black area
2018-01-05 19:21:07 +02:00
}
2024-01-25 21:49:59 +02:00
void CPrologEpilogVideo : : tick ( uint32_t msPassed )
2018-01-05 19:21:07 +02:00
{
2024-01-25 21:49:59 +02:00
elapsedTimeMilliseconds + = msPassed ;
2018-01-05 19:21:07 +02:00
2024-01-26 22:58:39 +02:00
const uint32_t speed = ( voiceDurationMilliseconds = = 0 ) ? 150 : ( voiceDurationMilliseconds / ( text - > textSize . y ) ) ;
2024-01-24 02:17:23 +02:00
2024-01-25 21:49:59 +02:00
if ( elapsedTimeMilliseconds > speed & & text - > textSize . y - 50 > positionCounter )
2024-01-24 02:17:23 +02:00
{
2018-01-05 19:21:07 +02:00
text - > scrollTextBy ( 1 ) ;
2024-01-25 21:49:59 +02:00
elapsedTimeMilliseconds - = speed ;
2024-01-24 02:17:23 +02:00
+ + positionCounter ;
}
2024-01-26 22:58:39 +02:00
else if ( elapsedTimeMilliseconds > ( voiceDurationMilliseconds = = 0 ? 8000 : 3000 ) & & voiceStopped ) // pause after completed scrolling (longer for intros missing voice)
2024-01-26 21:13:02 +02:00
clickPressed ( GH . getCursorPosition ( ) ) ;
2018-01-05 19:21:07 +02:00
}
2023-06-02 15:42:18 +02:00
void CPrologEpilogVideo : : show ( Canvas & to )
2018-01-05 19:21:07 +02:00
{
2023-06-02 15:42:18 +02:00
to . drawColor ( pos , Colors : : BLACK ) ;
2024-01-01 16:25:42 +02:00
//some videos are 800x600 in size while some are 800x400
CCS - > videoh - > update ( pos . x , pos . y + ( CCS - > videoh - > size ( ) . y = = 400 ? 100 : 0 ) , to . getInternalSurface ( ) , true , false ) ;
2018-01-05 19:21:07 +02:00
2024-01-26 21:13:02 +02:00
text - > showAll ( to ) ; // blit text over video, if needed
2018-01-05 19:21:07 +02:00
}
2023-07-08 13:33:04 +02:00
void CPrologEpilogVideo : : clickPressed ( const Point & cursorPosition )
2018-01-05 19:21:07 +02:00
{
2018-07-25 00:36:48 +02:00
close ( ) ;
2024-04-11 12:22:06 +02:00
CCS - > soundh - > resetCallback ( voiceSoundHandle ) ; // reset callback to avoid memory corruption since 'this' will be destroyed
2018-01-05 19:21:07 +02:00
CCS - > soundh - > stopSound ( voiceSoundHandle ) ;
2023-10-08 20:27:56 +02:00
CCS - > soundh - > stopSound ( videoSoundHandle ) ;
2024-01-24 00:45:31 +02:00
if ( exitCb )
exitCb ( ) ;
2018-01-05 19:21:07 +02:00
}