#include "pch.h" ////////////////////////////////////////////////////////////////////////////// // // Video Screen // ////////////////////////////////////////////////////////////////////////////// class VideoScreen : public Screen, public IEventSink, public IKeyboardInput { public: ///////////////////////////////////////////////////////////////////////////// // // Types // ///////////////////////////////////////////////////////////////////////////// class PickImage : public Image { private: VideoScreen* m_pobject; public: PickImage(VideoScreen* pobject) : m_pobject(pobject) { } MouseResult HitTest(IInputProvider* pprovider, const Point& point, bool bCaptured) { return MouseResultHit(); } MouseResult Button( IInputProvider* pprovider, const Point& point, int button, bool bCaptured, bool bInside, bool bDown ) { if (bDown) { m_pobject->Picked(); } return MouseResult(); } }; ///////////////////////////////////////////////////////////////////////////// // // Data members // ///////////////////////////////////////////////////////////////////////////// TRef m_pengine; TRef m_pwrapImageVideo; TRef m_pvideoImage; TRef m_pimage; TRef m_pkeyboardInputOldFocus; int m_indexVideo; bool m_bNextVideo; ZString m_strCD; ///////////////////////////////////////////////////////////////////////////// // // Constructor // ///////////////////////////////////////////////////////////////////////////// VideoScreen(Modeler* pmodeler, bool bIntroOnly) : m_pengine(pmodeler->GetEngine()), m_indexVideo(bIntroOnly ? 2 : -1), m_bNextVideo(false) { // // Load the location of the cd drive // HKEY hKey; if (ERROR_SUCCESS == ::RegCreateKeyEx(HKEY_LOCAL_MACHINE, ALLEGIANCE_REGISTRY_KEY_ROOT, 0, "", REG_OPTION_NON_VOLATILE, KEY_READ, NULL, &hKey, NULL)) { char buf[128]; DWORD dwSize = sizeof(buf); DWORD dwType = REG_SZ; ::RegQueryValueEx(hKey, "CDPath", NULL, &dwType, (BYTE*)buf, &dwSize); ::RegCloseKey(hKey); if (dwType == REG_SZ) { m_strCD = ZString(buf); m_strCD.ReplaceAll("\\", '/'); if (m_strCD[m_strCD.GetLength() - 1] != '/') { m_strCD += '/'; } } } // // Create the image hierarchy // m_pwrapImageVideo = new WrapImage(Image::GetEmpty()); m_pimage = new GroupImage( new PickImage(this), m_pwrapImageVideo ); m_pkeyboardInputOldFocus = GetWindow()->GetFocus(); GetWindow()->SetFocus(IKeyboardInput::CreateDelegate(this)); // // Start the first video // NextVideo(); } ///////////////////////////////////////////////////////////////////////////// // // Implementation methods // ///////////////////////////////////////////////////////////////////////////// void Dismiss() { GetWindow()->SetFocus(m_pkeyboardInputOldFocus); GetWindow()->screen(ScreenIDIntroScreen); } void NextVideo() { ZString str; m_indexVideo++; switch (m_indexVideo) { case 0: str = "msr_games.avi"; break; case 1: str = "logo1.avi"; break; case 2: str = "logo2.avi"; break; case 3: str = "intro.avi"; break; default: return; }; // // Load from the artpath first // m_pvideoImage = CreateVideoImage( m_pengine, GetWindow()->GetScreenRectValue(), GetModeler()->GetArtPath() + "/" + str ); if ( (m_pvideoImage == NULL || (!m_pvideoImage->IsValid())) && (!m_strCD.IsEmpty()) ) { m_pvideoImage = CreateVideoImage( m_pengine, GetWindow()->GetScreenRectValue(), m_strCD + str ); } if (!m_pvideoImage->IsValid()) { NextVideo(); } else { m_pwrapImageVideo->SetImage(m_pvideoImage); m_pvideoImage->GetEventSource()->AddSink(IEventSink::CreateDelegate(this)); } } bool OnEvent(IEventSource* pevent) { m_bNextVideo = true; return false; } void Picked() { NextVideo(); } ////////////////////////////////////////////////////////////////////////////// // // IKeyboardInput // ////////////////////////////////////////////////////////////////////////////// bool OnKey(IInputProvider* pprovider, const KeyState& ks, bool& fForceTranslate) { if (ks.bDown) { NextVideo(); } return false; } ////////////////////////////////////////////////////////////////////////////// // // Screen Methods // ////////////////////////////////////////////////////////////////////////////// Image* GetImage() { return m_pimage; } WinPoint GetSize() { return WinPoint(640, 480); } void OnFrame() { if (m_bNextVideo) { m_bNextVideo = false; NextVideo(); } if (m_indexVideo > 3) { Dismiss(); } } }; ////////////////////////////////////////////////////////////////////////////// // // Constructor // ////////////////////////////////////////////////////////////////////////////// TRef CreateVideoScreen(Modeler* pmodeler, bool bIntroOnly) { return new VideoScreen(pmodeler, bIntroOnly); }