/* ScummVM - Graphic Adventure Engine * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT * file distributed with this source distribution. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ /* * Copyright (C) 2006-2010 - Frictional Games * * This file is part of Penumbra Overture. */ #include "hpl1/penumbra-overture/IntroStory.h" #include "hpl1/penumbra-overture/ButtonHandler.h" #include "hpl1/penumbra-overture/GraphicsHelper.h" #include "hpl1/penumbra-overture/Init.h" #include "hpl1/penumbra-overture/MapHandler.h" ///////////////////////// // Image 00 #define kIntro_Image00_Start 0 #define kIntro_Image00_Mess2 1 ///////////////////////// // Image 01 #define kIntro_Image01_Start 100 #define kIntro_Image01_Mess2 101 #define kIntro_Image01_Mess3 102 #define kIntro_Image01_Mess4 103 ///////////////////////// // Image 02 #define kIntro_Image02_Start 200 #define kIntro_Image02_Mess2 201 #define kIntro_Image02_Mess3 202 #define kIntro_Image02_Mess4 203 #define kIntro_Image02_Mess5 204 ///////////////////////// // Image 03 #define kIntro_Image03_Start 300 #define kIntro_Image03_Mess2 301 #define kIntro_Image03_Mess3 302 #define kIntro_Image03_Mess4 303 #define kIntro_Image03_Mess5 304 ///////////////////////// // Image 04 #define kIntro_Image04_Start 400 #define kIntro_Image04_Mess2 401 //////////////////////// // Image 05 #define kIntro_Image05_Start 500 #define kIntro_Image05_Mess2 501 #define kIntro_Image05_Mess3 502 #define kIntro_Image05_Mess4 503 ////////////////////////////////////////////////////////////////////////// // INTRO IMAGE ////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------- cIntroImage::cIntroImage() { mvCameraPosition = cVector3f(0, 0, 1); mpTexture = NULL; mvVtxVec.resize(4); mlMaxPrevPos = 35; Reset(); } cIntroImage::~cIntroImage() { } //----------------------------------------------------------------------- void cIntroImage::MoveTo(const cVector3f &avPos, float afTime) { if (afTime == 0) { mvCameraPosition = avPos; mvPosStep = 0; mvFinalPos = avPos; } else { mfPosCount = afTime; mvFinalPos = avPos; mvPosStep = (avPos - mvCameraPosition) / afTime; } } //----------------------------------------------------------------------- void cIntroImage::FadeBrightnessTo(float afBrightness, float afTime) { if (afTime == 0) { mfFinalBrightness = afBrightness; mfBrightness = afBrightness; mfBrightnessStep = 0; } else { mfFinalBrightness = afBrightness; mfBrightnessStep = (mfFinalBrightness - mfBrightness) / afTime; } } //----------------------------------------------------------------------- void cIntroImage::FadeAlphaTo(float afAlpha, float afTime) { if (afTime == 0) { mfFinalAlpha = afAlpha; mfAlpha = afAlpha; mfAlphaStep = 0; mfPosCount = 0; } else { mfFinalAlpha = afAlpha; mfAlphaStep = (mfFinalAlpha - mfAlpha) / afTime; } } //----------------------------------------------------------------------- void cIntroImage::Reset() { mbActive = false; mfBrightness = 1; mfBrightnessStep = 0; mfFinalBrightness = 1; mfAlpha = 1; mfAlphaStep = 0; mfFinalAlpha = 1; mvCameraPosition = 0; mvFinalPos = 0; mvPosStep = 0; mfPosCount = 0; mvPosDistMul = 1; mlstPrevPos.clear(); } //----------------------------------------------------------------------- void cIntroImage::Update(float afTimeStep) { ///////////////////////////////// // Position if (mvCameraPosition != mvFinalPos) { cVector3f vStep = mvPosStep; cVector3f vDist = mvFinalPos - mvCameraPosition; if (mvPosDistMul.x > 0) vStep.x = cMath::Min(vStep.x, vDist.x * mvPosDistMul.x); if (mvPosDistMul.y > 0) vStep.y = cMath::Min(vStep.y, vDist.y * mvPosDistMul.y); if (mvPosDistMul.z > 0) vStep.z = cMath::Min(vStep.z, vDist.z * mvPosDistMul.z); mvCameraPosition += vStep * afTimeStep; // X if (mvPosStep.x > 0 && mvCameraPosition.x > mvFinalPos.x) mvCameraPosition.x = mvFinalPos.x; if (mvPosStep.x < 0 && mvCameraPosition.x < mvFinalPos.x) mvCameraPosition.x = mvFinalPos.x; // Y if (mvPosStep.y > 0 && mvCameraPosition.y > mvFinalPos.y) mvCameraPosition.y = mvFinalPos.y; if (mvPosStep.y < 0 && mvCameraPosition.y < mvFinalPos.y) mvCameraPosition.y = mvFinalPos.y; // Z if (mvPosStep.z > 0 && mvCameraPosition.z > mvFinalPos.z) mvCameraPosition.z = mvFinalPos.z; if (mvPosStep.z < 0 && mvCameraPosition.z < mvFinalPos.z) mvCameraPosition.z = mvFinalPos.z; mlstPrevPos.push_back(mvCameraPosition); if (mlstPrevPos.size() > 14) { mlstPrevPos.pop_front(); } } ///////////////////////////////// // Brightness if (mfBrightness != mfFinalBrightness) { mfBrightness += mfBrightnessStep * afTimeStep; if (mfBrightnessStep > 0 && mfBrightness >= mfFinalBrightness) { mfBrightness = mfFinalBrightness; } if (mfBrightnessStep < 0 && mfBrightness <= mfFinalBrightness) { mfBrightness = mfFinalBrightness; } } ///////////////////////////////// // Alpha if (mfAlpha != mfFinalAlpha) { mfAlpha += mfAlphaStep * afTimeStep; if (mfAlphaStep > 0 && mfAlpha >= mfFinalAlpha) { mfAlpha = mfFinalAlpha; } if (mfAlphaStep < 0 && mfAlpha <= mfFinalAlpha) { mfAlpha = mfFinalAlpha; } } } //----------------------------------------------------------------------- void cIntroImage::OnDraw() { cVector3f vCamDrawPos; if (mlstPrevPos.empty()) { vCamDrawPos = mvCameraPosition; } else { vCamDrawPos = cVector3f(0, 0, 0); tVector3fListIt it = mlstPrevPos.begin(); for (; it != mlstPrevPos.end(); ++it) { vCamDrawPos += *it; } vCamDrawPos = vCamDrawPos / (float)mlstPrevPos.size(); } ///////////////////////////////// // Set up position variables cVector3f vPos = cVector3f(-vCamDrawPos.x, -vCamDrawPos.y, 0); float fAlpha = mfAlpha; float fBrightness = cMath::Min(1.0f, mfBrightness); cVector2f vSize(1024, 784); vSize = vSize * (1 / vCamDrawPos.z); vPos = vPos * (1 / vCamDrawPos.z) + cVector3f(400, 300, 0); ; /////////////////////////// // Set up vertexes mvVtxVec[0] = cVertex(vPos + cVector3f(0, 0, 0), cVector2f(0, 0), cColor(fBrightness, fAlpha)); mvVtxVec[1] = cVertex(vPos + cVector3f(vSize.x, 0, 40), cVector2f(1, 0), cColor(fBrightness, fAlpha)); mvVtxVec[2] = cVertex(vPos + cVector3f(vSize.x, vSize.y, 40), cVector2f(1, 1), cColor(fBrightness, fAlpha)); mvVtxVec[3] = cVertex(vPos + cVector3f(0, vSize.y, 40), cVector2f(0, 1), cColor(fBrightness, fAlpha)); ////////////////////////// /// Draw mpLowGfx->SetTexture(0, mpTexture); mpLowGfx->SetBlendActive(true); mpLowGfx->SetBlendFunc(eBlendFunc_SrcAlpha, eBlendFunc_OneMinusSrcAlpha); mpLowGfx->DrawQuad(mvVtxVec); if (mfBrightness > 1) { float fWhite = mfBrightness - 1; mvVtxVec[0] = cVertex(cVector3f(0, 0, 0), cVector2f(0, 0), cColor(fWhite, 1)); mvVtxVec[1] = cVertex(cVector3f(800, 0, 40), cVector2f(1, 0), cColor(fWhite, 1)); mvVtxVec[2] = cVertex(cVector3f(800, 600, 40), cVector2f(1, 1), cColor(fWhite, 1)); mvVtxVec[3] = cVertex(cVector3f(0, 600, 40), cVector2f(0, 1), cColor(fWhite, 1)); mpLowGfx->SetTexture(0, NULL); mpLowGfx->SetBlendFunc(eBlendFunc_One, eBlendFunc_One); mpLowGfx->DrawQuad(mvVtxVec); } mpLowGfx->SetBlendActive(false); } //----------------------------------------------------------------------- ////////////////////////////////////////////////////////////////////////// // CONSTRUCTORS ////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------- cIntroStory::cIntroStory(cInit *apInit) : iUpdateable("StoryIntro") { mpInit = apInit; mpLowGfx = mpInit->mpGame->GetGraphics()->GetLowLevel(); mpTexManager = mpInit->mpGame->GetResources()->GetTextureManager(); mpSoundHandler = mpInit->mpGame->GetSound()->GetSoundHandler(); for (int i = 0; i < INTRO_IMAGE_NUM; ++i) { mvImages[i].mpLowGfx = mpLowGfx; mvImages[i].mpTexManager = mpTexManager; mvImages[i].mpInit = mpInit; mvImages[i].mpTexture = NULL; } mpBlackTexture = NULL; // Load font mpFont = mpInit->mpGame->GetResources()->GetFontManager()->CreateFontData("font_computer.fnt"); mfVoiceVol = 0.9f; Reset(); } //----------------------------------------------------------------------- cIntroStory::~cIntroStory(void) { } //----------------------------------------------------------------------- ////////////////////////////////////////////////////////////////////////// // PUBLIC METHODS ////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------- void cIntroStory::SetActive(bool abX) { if (mbActive == abX) return; mbActive = abX; msCentreText = _W(""); msMessage = _W(""); if (mbActive) { mpInit->mpGame->GetUpdater()->SetContainer("Intro"); mpInit->mpGame->GetScene()->SetDrawScene(false); mLastButtonState = mpInit->mpButtonHandler->GetState(); mpInit->mpButtonHandler->ChangeState(eButtonHandlerState_Intro); ////////////////////////////// // LoadImages for (int i = 0; i < INTRO_IMAGE_NUM; ++i) { mvImages[i].mpTexture = mpTexManager->Create2D("intro_image0" + cString::ToString(i + 1), false); if (mvImages[i].mpTexture == NULL) { error("Couldn't load an intro image"); } mvImages[i].mbActive = false; mvImages[i].mlstPrevPos.clear(); } mpBlackTexture = mpTexManager->Create2D("effect_black.bmp", false); mfTimerCount = 0.01f; mlNextStop = kIntro_Image00_Start; Update(1); mpInit->mpGame->ResetLogicTimer(); } else { // mpInit->mpGame->GetUpdater()->SetContainer("Default"); // mpInit->mpGame->GetScene()->SetDrawScene(true); // mpInit->mpButtonHandler->ChangeState(mLastButtonState); // Destroy images for (int i = 0; i < INTRO_IMAGE_NUM; ++i) { if (mvImages[i].mpTexture) mpTexManager->Destroy(mvImages[i].mpTexture); mvImages[i].mpTexture = NULL; mvImages[i].mbActive = false; } mpTexManager->Destroy(mpBlackTexture); mpBlackTexture = NULL; } } //----------------------------------------------------------------------- void cIntroStory::Update(float afTimeStep) { ////////////////////////////////////// /// Update Timer if (mfTimerCount > 0) { mfTimerCount -= afTimeStep; /// Update the image specific stuff if (mfTimerCount <= 0) { Image00(); if (mbSearchNext) Image01(); if (mbSearchNext) Image02(); if (mbSearchNext) Image03(); if (mbSearchNext) Image04(); if (mbSearchNext) Image05(); } } ////////////////////////////////////// /// Update the image specific stuff for (int i = 0; i < INTRO_IMAGE_NUM; ++i) { if (mvImages[i].mbActive) mvImages[i].Update(afTimeStep); } } //----------------------------------------------------------------------- void cIntroStory::Reset() { mbActive = false; mLastButtonState = eButtonHandlerState_Game; for (int i = 0; i < INTRO_IMAGE_NUM; ++i) mvImages[i].Reset(); } //----------------------------------------------------------------------- void cIntroStory::OnDraw() { cVector3f vPos = cVector3f(15, 526, 10); cVector2f vSize = 16; if (msCentreText != _W("")) { float fAlpha = mvImages[5].mfBrightness; mpFont->draw(cVector3f(400, 300, 2), 18, cColor(1, 1, 1, fAlpha), eFontAlign_Center, msCentreText); mpFont->draw(cVector3f(400 + 1, 300 + 1, 1), 18, cColor(0, fAlpha), eFontAlign_Center, msCentreText); mpFont->draw(cVector3f(400 - 1, 300 - 1, 1), 18, cColor(0, fAlpha), eFontAlign_Center, msCentreText); mpFont->draw(cVector3f(400 - 1, 300 + 1, 1), 18, cColor(0, fAlpha), eFontAlign_Center, msCentreText); mpFont->draw(cVector3f(400 + 1, 300 - 1, 1), 18, cColor(0, fAlpha), eFontAlign_Center, msCentreText); } // mpFont->DrawWordWrap(vPos + cVector3f(3,3,-1),760,21,vSize,cColor(1,0),eFontAlign_Left,msMessage); // mpFont->DrawWordWrap(vPos + cVector3f(-2,-2,-1),760,21,vSize,cColor(1,0),eFontAlign_Left,msMessage); if (mpInit->mbSubtitles) { mpFont->drawWordWrap(vPos, 760, 18, vSize, cColor(1, 1, 1, 1), eFontAlign_Left, msMessage); } } //----------------------------------------------------------------------- void cIntroStory::OnPostSceneDraw() { mpLowGfx->SetClearColor(cColor(0, 0, 0, 0)); mpLowGfx->ClearScreen(); mpLowGfx->SetDepthTestActive(false); mpLowGfx->PushMatrix(eMatrix_ModelView); mpLowGfx->SetIdentityMatrix(eMatrix_ModelView); mpLowGfx->SetOrthoProjection(mpLowGfx->GetVirtualSize(), -1000, 1000); for (int i = 0; i < INTRO_IMAGE_NUM; ++i) { if (mvImages[i].mbActive) mvImages[i].OnDraw(); } mpInit->mpGraphicsHelper->DrawTexture(mpBlackTexture, cVector3f(0, 0, 140), cVector2f(800, 75), cColor(1, 1)); mpInit->mpGraphicsHelper->DrawTexture(mpBlackTexture, cVector3f(0, 525, 140), cVector2f(800, 75), cColor(1, 1)); mpLowGfx->PopMatrix(eMatrix_ModelView); } //----------------------------------------------------------------------- void cIntroStory::SetMessage(const tWString &asMess) { msMessage = asMess; } //----------------------------------------------------------------------- void cIntroStory::Exit() { mpInit->mpGame->GetSound()->GetMusicHandler()->Stop(0.3f); mpSoundHandler->StopAll(eSoundDest_Gui); SetActive(false); // mpInit->mpGame->Exit(); // return; mpInit->mpGraphicsHelper->DrawLoadingScreen(""); mpInit->mpGame->GetUpdater()->SetContainer("Default"); mpInit->mpGame->GetScene()->SetDrawScene(true); mpInit->mpButtonHandler->ChangeState(mLastButtonState); mpInit->mpMapHandler->Load(mpInit->msStartMap, mpInit->msStartLink); } //----------------------------------------------------------------------- ////////////////////////////////////////////////////////////////////////// // PRIVATE METHODS ////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------- void cIntroStory::Image00() { mbSearchNext = false; switch (mlNextStop) { ////////////////////// // Start case kIntro_Image00_Start: { mvImages[5].mbActive = true; mvImages[5].FadeBrightnessTo(0, 0); mvImages[5].FadeBrightnessTo(1, 5); mvImages[5].mvCameraPosition = cVector3f(512, 384, 1.9f); mvImages[5].mvPosDistMul = 0.1f; mvImages[5].MoveTo(cVector3f(512, 384, 1.1f), 15); msCentreText = kTranslate("Intro", "00_01"); mfTimerCount = 5; mlNextStop = kIntro_Image00_Mess2; break; } case kIntro_Image00_Mess2: { mvImages[5].FadeBrightnessTo(0, 5); mfTimerCount = 5; mlNextStop = kIntro_Image01_Start; break; } default: mbSearchNext = true; break; } } void cIntroStory::Image01() { mbSearchNext = false; switch (mlNextStop) { ////////////////////// // Start case kIntro_Image01_Start: { msCentreText = _W(""); mvImages[5].mbActive = false; mvImages[0].mbActive = true; mvImages[0].FadeBrightnessTo(0, 0); mvImages[0].FadeBrightnessTo(1, 13); mvImages[0].mvCameraPosition = cVector3f(500, 597, 0.5f); mvImages[0].mvPosDistMul = 0.1f; mvImages[0].MoveTo(cVector3f(540, 392, 0.8f), 28); mfTimerCount = 5.99f; mlNextStop = kIntro_Image01_Mess2; // Sounds to synch to rest of it. mpSoundHandler->PlayStream("gui_intro_ambience1.ogg", false, 0.7f); mpSoundHandler->PlayStream("penumbra_music_E1_I.ogg", false, 0.65f); mpSoundHandler->PlayStream("intro_01_01.ogg", false, mfVoiceVol); SetMessage(kTranslate("Intro", "01_01")); break; } case kIntro_Image01_Mess2: { mfTimerCount = 8.1f; mlNextStop = kIntro_Image01_Mess3; // mpInit->mpGame->GetSound()->GetMusicHandler()->Play("music_story.ogg",0.55f,0.05f,false); mpSoundHandler->PlayStream("intro_01_02.ogg", false, mfVoiceVol); SetMessage(kTranslate("Intro", "01_02")); break; } case kIntro_Image01_Mess3: { mfTimerCount = 6.0f; mlNextStop = kIntro_Image01_Mess4; mvImages[0].MoveTo(cVector3f(540, 342, 1.2f), 22); mpSoundHandler->PlayStream("intro_01_03.ogg", false, mfVoiceVol); SetMessage(kTranslate("Intro", "01_03")); break; } case kIntro_Image01_Mess4: { mfTimerCount = 12.0f; mlNextStop = kIntro_Image02_Start; mpSoundHandler->PlayStream("intro_01_04.ogg", false, mfVoiceVol); SetMessage(kTranslate("Intro", "01_04")); break; } default: mbSearchNext = true; break; } } //----------------------------------------------------------------------- void cIntroStory::Image02() { mbSearchNext = false; switch (mlNextStop) { ////////////////////// // Start case kIntro_Image02_Start: { mvImages[1].mbActive = true; mvImages[1].FadeAlphaTo(0, 0); mvImages[1].FadeAlphaTo(1, 5); mvImages[1].mvCameraPosition = cVector3f(500, 637, 0.3f); mvImages[1].mvPosDistMul = 0.11f; mvImages[1].MoveTo(cVector3f(680, 492, 0.6f), 28); mfTimerCount = 11.7f; mlNextStop = kIntro_Image02_Mess2; mpSoundHandler->PlayStream("intro_02_01.ogg", false, mfVoiceVol); SetMessage(kTranslate("Intro", "02_01")); break; } case kIntro_Image02_Mess2: { mfTimerCount = 4.7f; mlNextStop = kIntro_Image02_Mess3; mvImages[1].MoveTo(cVector3f(540, 420, 1.3f), 31); mpSoundHandler->PlayStream("intro_02_02.ogg", false, mfVoiceVol); SetMessage(kTranslate("Intro", "02_02")); break; } case kIntro_Image02_Mess3: { mvImages[0].mbActive = false; mfTimerCount = 12.0f; mlNextStop = kIntro_Image03_Start; mvImages[1].MoveTo(cVector3f(540, 400, 2.0f), 25); mvImages[1].FadeBrightnessTo(0, 12); mpSoundHandler->PlayStream("intro_02_03.ogg", false, mfVoiceVol); SetMessage(kTranslate("Intro", "02_03")); break; } default: mbSearchNext = true; break; } } //----------------------------------------------------------------------- void cIntroStory::Image03() { mbSearchNext = false; switch (mlNextStop) { ////////////////////// // Start ////////////////////// case kIntro_Image03_Start: { mvImages[2].mbActive = true; mvImages[2].FadeAlphaTo(0, 0); mvImages[2].FadeAlphaTo(1, 5); mvImages[2].mvCameraPosition = cVector3f(630, 360, 0.5f); mvImages[2].mvPosDistMul = 0.1f; mvImages[2].mvPosDistMul.z = 0.1f; mvImages[2].MoveTo(cVector3f(530, 340, 0.8f), 15); mfTimerCount = 11.6f; mlNextStop = kIntro_Image03_Mess2; mpSoundHandler->PlayStream("intro_03_00.ogg", false, mfVoiceVol); SetMessage(kTranslate("Intro", "03_00")); break; } case kIntro_Image03_Mess2: { mvImages[1].mbActive = false; mfTimerCount = 10.3f; mlNextStop = kIntro_Image03_Mess3; mvImages[2].MoveTo(cVector3f(500, 300, 1.2f), 25); mpSoundHandler->PlayStream("intro_03_01.ogg", false, mfVoiceVol); SetMessage(kTranslate("Intro", "03_01")); break; } case kIntro_Image03_Mess3: { mfTimerCount = 9.5f; mlNextStop = kIntro_Image04_Start; mvImages[2].FadeBrightnessTo(0, 7.5f); mpSoundHandler->PlayStream("intro_03_02.ogg", false, mfVoiceVol); SetMessage(kTranslate("Intro", "03_02")); break; } case kIntro_Image03_Mess4: { Exit(); break; } default: mbSearchNext = true; break; } } //----------------------------------------------------------------------- void cIntroStory::Image04() { mbSearchNext = false; switch (mlNextStop) { ////////////////////// // Start case kIntro_Image04_Start: { // mvImages[2].mbActive = false; mvImages[3].mbActive = true; mvImages[3].FadeBrightnessTo(0, 0); mvImages[3].FadeBrightnessTo(1, 10); mvImages[3].mvCameraPosition = cVector3f(530, 330, 0.8f); mvImages[3].mvPosDistMul = 0.1f; mvImages[3].mvPosDistMul.z = 0.3f; mvImages[3].MoveTo(cVector3f(560, 430, 1.25f), 15); mfTimerCount = 4.5f; mlNextStop = kIntro_Image04_Mess2; mpSoundHandler->PlayStream("intro_04_01.ogg", false, mfVoiceVol); SetMessage(kTranslate("Intro", "04_01")); break; } case kIntro_Image04_Mess2: { mfTimerCount = 9.0f; mlNextStop = kIntro_Image05_Start; mpSoundHandler->PlayStream("intro_04_02.ogg", false, mfVoiceVol); SetMessage(kTranslate("Intro", "04_02")); break; } default: mbSearchNext = true; break; } } //----------------------------------------------------------------------- void cIntroStory::Image05() { mbSearchNext = false; switch (mlNextStop) { ////////////////////// // Start case kIntro_Image05_Start: { mvImages[4].mbActive = true; mvImages[4].FadeAlphaTo(0, 0); mvImages[4].FadeAlphaTo(1, 4); mvImages[4].mvCameraPosition = cVector3f(730, 330, 0.8f); mvImages[4].mvPosDistMul = 0.1f; mvImages[4].mvPosDistMul.z = 0.6f; mvImages[4].MoveTo(cVector3f(530, 480, 1.15f), 15); mfTimerCount = 4.0f; mlNextStop = kIntro_Image05_Mess2; // mpSoundHandler->PlayStream("intro_04_01.ogg",false,mfVoiceVol); // SetMessage(kTranslate("Intro","04_01")); break; } case kIntro_Image05_Mess2: { mvImages[3].mbActive = false; mfTimerCount = 11.0f; mlNextStop = kIntro_Image05_Mess3; mvImages[4].FadeBrightnessTo(0, 10); mpSoundHandler->PlayStream("intro_05_01.ogg", false, mfVoiceVol); SetMessage(kTranslate("Intro", "05_01")); break; } case kIntro_Image05_Mess3: { Exit(); break; } default: mbSearchNext = true; break; } } //-----------------------------------------------------------------------