123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520 |
- #ifdef PRECOMPILEDHEADERS
- #include "JA2 All.h"
- #include "Intro.h"
- #include "Cinematics.h"
- #else
- #include "sgp.h"
- #include "sys globals.h"
- #include "sysutil.h"
- #include "vobject_blitters.h"
- #include "wcheck.h"
- #include "cursors.h"
- #include "font control.h"
- #include "cursor control.h"
- #include "render dirty.h"
- #include "GameScreen.h"
- #include "Text.h"
- #include "Utilities.h"
- #include "WordWrap.h"
- #include "Font Control.h"
- #include "text.h"
- #include "Multi Language Graphic Utils.h"
- #include "Line.h"
- #include "Intro.h"
- #include "Cinematics.h"
- #endif
- extern STR16 gzIntroScreen[];
- extern HVSURFACE ghFrameBuffer;
- enum
- {
- INTRO_TXT__CANT_FIND_INTRO,
- };
- //ddd
- //ggg
- BOOLEAN gfIntroScreenEntry;
- BOOLEAN gfIntroScreenExit;
- UINT32 guiIntroExitScreen = INTRO_SCREEN;
- extern BOOLEAN gfDoneWithSplashScreen;
- SMKFLIC *gpSmackFlic = NULL;
- #define SMKINTRO_FIRST_VIDEO 255
- #define SMKINTRO_NO_VIDEO -1
- //enums for the various smacker files
- enum
- {
- SMKINTRO_REBEL_CRDT,
- SMKINTRO_OMERTA,
- SMKINTRO_PRAGUE_CRDT,
- SMKINTRO_PRAGUE,
- //there are no more videos shown for the begining
- SMKINTRO_END_END_SPEECH_MIGUEL,
- SMKINTRO_END_END_SPEECH_NO_MIGUEL,
- SMKINTRO_END_HELI_FLYBY,
- SMKINTRO_END_SKYRIDER_HELICOPTER,
- SMKINTRO_END_NOSKYRIDER_HELICOPTER,
- SMKINTRO_SPLASH_SCREEN,
- SMKINTRO_SPLASH_TALONSOFT,
- //there are no more videos shown for the endgame
- SMKINTRO_LAST_END_GAME,
- };
- INT32 giCurrentIntroBeingPlayed = SMKINTRO_NO_VIDEO;
- CHAR *gpzSmackerFileNames[] =
- {
- //begining of the game
- "INTRO\\Rebel_cr.smk",
- "INTRO\\Omerta.smk",
- "INTRO\\Prague_cr.smk",
- "INTRO\\Prague.smk",
- //endgame
- "INTRO\\Throne_Mig.smk",
- "INTRO\\Throne_NoMig.smk",
- "INTRO\\Heli_FlyBy.smk",
- "INTRO\\Heli_Sky.smk",
- "INTRO\\Heli_NoSky.smk",
- "INTRO\\SplashScreen.smk",
- "INTRO\\TalonSoftid_endhold.smk",
- };
- //enums used for when the intro screen can come up, either begining game intro, or end game cinematic
- INT8 gbIntroScreenMode=-1;
- extern void CDromEjectionErrorMessageBoxCallBack( UINT8 bExitValue );
- void GetIntroScreenUserInput();
- BOOLEAN EnterIntroScreen();
- void RenderIntroScreen();
- void ExitIntroScreen();
- void HandleIntroScreen();
- void PrepareToExitIntroScreen();
- INT32 GetNextIntroVideo( UINT32 uiCurrentVideo );
- void StartPlayingIntroFlic( INT32 iIndexOfFlicToPlay );
- void DisplaySirtechSplashScreen();
- //ppp
- UINT32 IntroScreenInit( void )
- {
- //Set so next time we come in, we can set up
- gfIntroScreenEntry = TRUE;
- return( 1 );
- }
- UINT32 IntroScreenShutdown( void )
- {
- return( 1 );
- }
- UINT32 IntroScreenHandle( void )
- {
- if( gfIntroScreenEntry )
- {
- EnterIntroScreen();
- gfIntroScreenEntry = FALSE;
- gfIntroScreenExit = FALSE;
- InvalidateRegion( 0, 0, 640, 480 );
- }
- RestoreBackgroundRects();
- GetIntroScreenUserInput();
- HandleIntroScreen();
- ExecuteBaseDirtyRectQueue();
- EndFrameBufferRender();
- if( gfIntroScreenExit )
- {
- ExitIntroScreen();
- gfIntroScreenExit = FALSE;
- gfIntroScreenEntry = TRUE;
- }
- return( guiIntroExitScreen );
- }
- BOOLEAN EnterIntroScreen()
- {
- INT32 iFirstVideoID = -1;
- ClearMainMenu();
- SetCurrentCursorFromDatabase( VIDEO_NO_CURSOR );
- // Don't play music....
- SetMusicMode( MUSIC_NONE );
- #ifdef JA2BETAVERSION
- if( FileExists( "..\\NoIntro.txt" ) )
- {
- PrepareToExitIntroScreen();
- return( TRUE );
- }
- #endif
- //if the library doesnt exist, exit
- if( !IsLibraryOpened( LIBRARY_INTRO ) )
- {
- PrepareToExitIntroScreen();
- return( TRUE );
- }
- //initialize smacker
- SmkInitialize( ghWindow, 640, 480);
- //get the index opf the first video to watch
- iFirstVideoID = GetNextIntroVideo( SMKINTRO_FIRST_VIDEO );
- if( iFirstVideoID != -1 )
- {
- StartPlayingIntroFlic( iFirstVideoID );
- guiIntroExitScreen = INTRO_SCREEN;
- }
- //Got no intro video, exit
- else
- {
- PrepareToExitIntroScreen();
- }
-
- return( TRUE );
- }
- void RenderIntroScreen()
- {
- }
- void ExitIntroScreen()
- {
- //shutdown smaker
- SmkShutdown();
- }
- void HandleIntroScreen()
- {
- BOOLEAN fFlicStillPlaying = FALSE;
- //if we are exiting this screen, this frame, dont update the screen
- if( gfIntroScreenExit )
- return;
- //handle smaker each frame
- fFlicStillPlaying = SmkPollFlics();
- //if the flic is not playing
- if( !fFlicStillPlaying )
- {
- INT32 iNextVideoToPlay = -1;
- iNextVideoToPlay = GetNextIntroVideo( giCurrentIntroBeingPlayed );
- if( iNextVideoToPlay != -1 )
- {
- StartPlayingIntroFlic( iNextVideoToPlay );
- }
- else
- {
- PrepareToExitIntroScreen();
- giCurrentIntroBeingPlayed = -1;
- }
- }
- InvalidateScreen();
- }
- void GetIntroScreenUserInput()
- {
- InputAtom Event;
- POINT MousePos;
- GetCursorPos(&MousePos);
- while( DequeueEvent( &Event ) )
- {
- // HOOK INTO MOUSE HOOKS
- switch( Event.usEvent)
- {
- case LEFT_BUTTON_DOWN:
- MouseSystemHook(LEFT_BUTTON_DOWN, (INT16)MousePos.x, (INT16)MousePos.y,_LeftButtonDown, _RightButtonDown);
- break;
- case LEFT_BUTTON_UP:
- MouseSystemHook(LEFT_BUTTON_UP, (INT16)MousePos.x, (INT16)MousePos.y ,_LeftButtonDown, _RightButtonDown);
- break;
- case RIGHT_BUTTON_DOWN:
- MouseSystemHook(RIGHT_BUTTON_DOWN, (INT16)MousePos.x, (INT16)MousePos.y,_LeftButtonDown, _RightButtonDown);
- break;
- case RIGHT_BUTTON_UP:
- MouseSystemHook(RIGHT_BUTTON_UP, (INT16)MousePos.x, (INT16)MousePos.y,_LeftButtonDown, _RightButtonDown);
- break;
- case RIGHT_BUTTON_REPEAT:
- MouseSystemHook(RIGHT_BUTTON_REPEAT, (INT16)MousePos.x, (INT16)MousePos.y,_LeftButtonDown, _RightButtonDown);
- break;
- case LEFT_BUTTON_REPEAT:
- MouseSystemHook(LEFT_BUTTON_REPEAT, (INT16)MousePos.x, (INT16)MousePos.y,_LeftButtonDown, _RightButtonDown);
- break;
- }
- if( Event.usEvent == KEY_UP )
- {
- switch( Event.usParam )
- {
- case ESC:
- PrepareToExitIntroScreen();
- break;
- case SPACE:
- SmkCloseFlic( gpSmackFlic );
- break;
- #ifdef JA2TESTVERSION
- case 'r':
- break;
- case 'i':
- InvalidateRegion( 0, 0, 640, 480 );
- break;
- #endif
- }
- }
- }
- // if the user presses either mouse button
- if( gfLeftButtonState || gfRightButtonState )
- {
- //advance to the next flic
- SmkCloseFlic( gpSmackFlic );
- }
- }
- void PrepareToExitIntroScreen()
- {
- //if its the intro at the begining of the game
- if( gbIntroScreenMode == INTRO_BEGINING )
- {
- //go to the init screen
- guiIntroExitScreen = INIT_SCREEN;
- }
- else if( gbIntroScreenMode == INTRO_SPLASH )
- {
- //display a logo when exiting
- DisplaySirtechSplashScreen();
- gfDoneWithSplashScreen = TRUE;
- guiIntroExitScreen = INIT_SCREEN;
- }
- else
- {
- //We want to reinitialize the game
- ReStartingGame();
- // guiIntroExitScreen = MAINMENU_SCREEN;
- guiIntroExitScreen = CREDIT_SCREEN;
- }
- gfIntroScreenExit = TRUE;
- }
- INT32 GetNextIntroVideo( UINT32 uiCurrentVideo )
- {
- INT32 iStringToUse = -1;
- //switch on whether it is the beginging or the end game video
- switch( gbIntroScreenMode )
- {
- //the video at the begining of the game
- case INTRO_BEGINING:
- {
- switch( uiCurrentVideo )
- {
- case SMKINTRO_FIRST_VIDEO:
- iStringToUse = SMKINTRO_REBEL_CRDT;
- break;
- case SMKINTRO_REBEL_CRDT:
- iStringToUse = SMKINTRO_OMERTA;
- break;
- case SMKINTRO_OMERTA:
- iStringToUse = SMKINTRO_PRAGUE_CRDT;
- break;
- case SMKINTRO_PRAGUE_CRDT:
- iStringToUse = SMKINTRO_PRAGUE;
- break;
- case SMKINTRO_PRAGUE:
- iStringToUse = -1;
- break;
- // case SMKINTRO_LAST_INTRO:
- // iStringToUse = -1;
- // break;
- }
- }
- break;
- //end game
- case INTRO_ENDING:
- {
- switch( uiCurrentVideo )
- {
- case SMKINTRO_FIRST_VIDEO:
- //if Miguel is dead, play the flic with out him in it
- if( gMercProfiles[ MIGUEL ].bMercStatus == MERC_IS_DEAD )
- iStringToUse = SMKINTRO_END_END_SPEECH_NO_MIGUEL;
- else
- iStringToUse = SMKINTRO_END_END_SPEECH_MIGUEL;
- break;
- case SMKINTRO_END_END_SPEECH_MIGUEL:
- case SMKINTRO_END_END_SPEECH_NO_MIGUEL:
- iStringToUse = SMKINTRO_END_HELI_FLYBY;
- break;
- //if SkyRider is dead, play the flic without him
- case SMKINTRO_END_HELI_FLYBY:
- if( gMercProfiles[ SKYRIDER ].bMercStatus == MERC_IS_DEAD )
- iStringToUse = SMKINTRO_END_NOSKYRIDER_HELICOPTER;
- else
- iStringToUse = SMKINTRO_END_SKYRIDER_HELICOPTER;
- break;
- }
- }
- break;
- case INTRO_SPLASH:
- switch( uiCurrentVideo )
- {
- case SMKINTRO_FIRST_VIDEO:
- iStringToUse = SMKINTRO_SPLASH_SCREEN;
- break;
- case SMKINTRO_SPLASH_SCREEN:
- //iStringToUse = SMKINTRO_SPLASH_TALONSOFT;
- break;
- }
- break;
- }
- return( iStringToUse );
- }
- void StartPlayingIntroFlic( INT32 iIndexOfFlicToPlay )
- {
- if( iIndexOfFlicToPlay != -1 )
- {
- //start playing a flic
- gpSmackFlic = SmkPlayFlic( gpzSmackerFileNames[ iIndexOfFlicToPlay ], 0, 0, TRUE );
- if( gpSmackFlic != NULL )
- {
- giCurrentIntroBeingPlayed = iIndexOfFlicToPlay;
- }
- else
- {
- //do a check
- #ifdef JA2BETAVERSION
- PrepareToExitIntroScreen();
- #else
- DoScreenIndependantMessageBox( gzIntroScreen[INTRO_TXT__CANT_FIND_INTRO], MSG_BOX_FLAG_OK, CDromEjectionErrorMessageBoxCallBack );
- #endif
- }
- }
- }
- void SetIntroType( INT8 bIntroType )
- {
- if( bIntroType == INTRO_BEGINING )
- {
- gbIntroScreenMode = INTRO_BEGINING;
- }
- else if( bIntroType == INTRO_ENDING )
- {
- gbIntroScreenMode = INTRO_ENDING;
- }
- else if( bIntroType == INTRO_SPLASH )
- {
- gbIntroScreenMode = INTRO_SPLASH;
- }
- }
- void DisplaySirtechSplashScreen()
- {
- HVOBJECT hPixHandle;
- VOBJECT_DESC VObjectDesc;
- UINT32 uiLogoID;
- UINT32 uiDestPitchBYTES;
- UINT8 *pDestBuf;
- // JA3Gold: do nothing until we have a graphic to replace Talonsoft's
- //return;
- // CLEAR THE FRAME BUFFER
- pDestBuf = LockVideoSurface( FRAME_BUFFER, &uiDestPitchBYTES );
- memset(pDestBuf, 0, SCREEN_HEIGHT * uiDestPitchBYTES );
- UnLockVideoSurface( FRAME_BUFFER );
- memset( &VObjectDesc, 0, sizeof( VOBJECT_DESC ) );
- VObjectDesc.fCreateFlags=VOBJECT_CREATE_FROMFILE;
- FilenameForBPP("INTERFACE\\SirtechSplash.sti", VObjectDesc.ImageFile);
- // FilenameForBPP("INTERFACE\\TShold.sti", VObjectDesc.ImageFile);
- if( !AddVideoObject(&VObjectDesc, &uiLogoID) )
- {
- AssertMsg( 0, String( "Failed to load %s", VObjectDesc.ImageFile ) );
- return;
- }
- GetVideoObject(&hPixHandle, uiLogoID);
- BltVideoObject(FRAME_BUFFER, hPixHandle, 0,0, 0, VO_BLT_SRCTRANSPARENCY,NULL);
- DeleteVideoObjectFromIndex(uiLogoID);
- InvalidateScreen();
- RefreshScreen( NULL );
- }
|