#include "cbase.h" #include "asw_vgui_computer_splash.h" #include "asw_vgui_computer_frame.h" #include "vgui/ISurface.h" #include "c_asw_hack_computer.h" #include #include #include #include "vgui/ILocalize.h" #include "c_asw_computer_area.h" // memdbgon must be the last include file in a .cpp file!!! #include "tier0/memdbgon.h" #define ASW_COMPUTER_GLITCH_INTERVAL 0.01f CASW_VGUI_Computer_Splash::CASW_VGUI_Computer_Splash( vgui::Panel *pParent, const char *pElementName, C_ASW_Hack_Computer* pHackComputer ) : vgui::Panel( pParent, pElementName ), CASW_VGUI_Ingame_Panel(), m_pHackComputer( pHackComputer ) { m_pLogoImage = new vgui::ImagePanel(this, "SplashImage"); m_pLogoGlitchImage = new vgui::ImagePanel(this, "SplashImage"); if (IsPDA()) { m_pSynTekLabel = new vgui::Label(this, "SynTekHeader", ""); m_pSloganLabel = new vgui::Label(this, "SloganLabel", g_pVGuiLocalize->Find("#asw_SynTekPDA")); if (m_pHackComputer && m_pHackComputer->GetComputerArea()) { // set the label based on PDA name char namebuffer[64]; Q_snprintf(namebuffer, sizeof(namebuffer), "%s", m_pHackComputer->GetComputerArea()->m_PDAName.Get()); wchar_t wnamebuffer[64]; g_pVGuiLocalize->ConvertANSIToUnicode(namebuffer, wnamebuffer, sizeof( wnamebuffer )); wchar_t wbuffer[256]; g_pVGuiLocalize->ConstructString( wbuffer, sizeof(wbuffer), g_pVGuiLocalize->Find("#asw_SynTekAccount"), 1, wnamebuffer); m_pSynTekLabel->SetText(wbuffer); } } else { m_pSynTekLabel = new vgui::Label(this, "SynTekHeader", g_pVGuiLocalize->Find("#asw_SynTekMegacorp")); m_pSloganLabel = new vgui::Label(this, "SloganLabel", ""); switch (random->RandomInt(0,4)) { case 0: m_pSloganLabel->SetText("#asw_SynTekSlogan1"); break; case 1: m_pSloganLabel->SetText("#asw_SynTekSlogan2"); break; case 2: m_pSloganLabel->SetText("#asw_SynTekSlogan3"); break; case 3: m_pSloganLabel->SetText("#asw_SynTekSlogan4"); break; default: m_pSloganLabel->SetText("#asw_SynTekSlogan5"); break; } } char buffer[1024]; for (int i=0;iSetText(buffer); } // todo: fill in line X with the marine's name m_fLastThinkTime = gpGlobals->curtime; m_fNextGlitchTime= gpGlobals->curtime; m_fShowGlitchTime = 0; m_fSoundTime = gpGlobals->curtime + 0.2f; m_bPlayedSound = false; m_fSlideOutTime = gpGlobals->curtime + 2.2f; //m_fSlideOutTime = gpGlobals->curtime + 0.2f; // shortcut? m_bSlidOut = false; m_iNumLines = 0; m_fStartScrollingTime = gpGlobals->curtime + 0.7f; //m_fStartScrollingTime = gpGlobals->curtime + 0.1f; // shortcut m_fFadeScrollerOutTime = 0; m_bSetAlpha = false; } CASW_VGUI_Computer_Splash::~CASW_VGUI_Computer_Splash() { if (IsPDA()) C_BaseEntity::StopSound( -1 /*SOUND_FROM_LOCAL_PLAYER*/, CHAN_STATIC, "ASWComputer.SyntekPDA" ); else C_BaseEntity::StopSound( -1 /*SOUND_FROM_LOCAL_PLAYER*/, CHAN_STATIC, "ASWComputer.Startup" ); } void CASW_VGUI_Computer_Splash::PerformLayout() { m_fScale = ScreenHeight() / 768.0f; int w = GetParent()->GetWide(); int h = GetParent()->GetTall(); SetWide(w); SetTall(h); SetPos(ScreenWidth()*0.5f - w*0.5f, ScreenHeight()*0.5f - h*0.5f); m_pLogoImage->SetShouldScaleImage(true); m_pLogoImage->SetPos(w*0.25f,h*0.15f); m_pLogoImage->SetSize(w*0.5f, h*0.5f); m_pLogoImage->SetImage("swarm/Computer/SynTekLogo2"); m_pLogoImage->SetZPos(160); m_pLogoGlitchImage->SetShouldScaleImage(true); m_pLogoGlitchImage->SetPos(w*0.25f,h*0.25f); m_pLogoGlitchImage->SetSize(w*0.5f, h*0.5f); m_pLogoGlitchImage->SetImage("swarm/Computer/SynTekLogo2"); m_pLogoGlitchImage->SetZPos(159); m_pSloganLabel->SetSize(w, h * 0.2f); m_pSloganLabel->SetContentAlignment(vgui::Label::a_center); m_pSloganLabel->SetPos(0, h*0.75f); m_pSloganLabel->SetZPos(160); m_pSynTekLabel->SetSize(w, h * 0.2f); m_pSynTekLabel->SetContentAlignment(vgui::Label::a_center); m_pSynTekLabel->SetPos(0, h*0.65f); m_pSynTekLabel->SetZPos(160); for (int i=0;iSetSize(w, h * 0.2f); m_pScrollLine[i]->SetContentAlignment(vgui::Label::a_northwest); } if (m_bSlidOut) { m_pLogoImage->SetBounds( w*0.05f, h*0.05f, w*0.13f, h*0.13f); m_pSynTekLabel->SetPos(0, 0); } SetZPos(161); } void CASW_VGUI_Computer_Splash::ASWInit() { m_pLogoImage->SetAlpha(0); vgui::GetAnimationController()->RunAnimationCommand(m_pLogoImage, "Alpha", 255, 0.3f, 1.7f, vgui::AnimationController::INTERPOLATOR_LINEAR); m_pLogoGlitchImage->SetAlpha(0); SetPaintBackgroundType(0); SetPaintBackgroundEnabled(false); SetBgColor( Color(0,0,0,0) ); SetAlpha(255); m_pSloganLabel->SetAlpha(0); vgui::GetAnimationController()->RunAnimationCommand(m_pSloganLabel, "Alpha", 255, 0.8f, 1.7f, vgui::AnimationController::INTERPOLATOR_LINEAR); m_pSynTekLabel->SetAlpha(0); vgui::GetAnimationController()->RunAnimationCommand(m_pSynTekLabel, "Alpha", 255, 0.3f, 1.7f, vgui::AnimationController::INTERPOLATOR_LINEAR); } void CASW_VGUI_Computer_Splash::ApplySchemeSettings(vgui::IScheme *pScheme) { BaseClass::ApplySchemeSettings(pScheme); SetPaintBackgroundType(0); SetPaintBackgroundEnabled(false); SetBgColor( Color(0,0,0,0) ); SetMouseInputEnabled(true); if (!m_bSetAlpha) { m_pLogoImage->SetAlpha(0); vgui::GetAnimationController()->RunAnimationCommand(m_pLogoImage, "Alpha", 255, 0.9f, 1.7f, vgui::AnimationController::INTERPOLATOR_LINEAR); m_pLogoGlitchImage->SetAlpha(0); m_pSloganLabel->SetAlpha(0); vgui::GetAnimationController()->RunAnimationCommand(m_pSloganLabel, "Alpha", 255, 0.9f, 1.7f, vgui::AnimationController::INTERPOLATOR_LINEAR); m_pSynTekLabel->SetAlpha(0); vgui::GetAnimationController()->RunAnimationCommand(m_pSynTekLabel, "Alpha", 255, 0.9f, 1.7f, vgui::AnimationController::INTERPOLATOR_LINEAR); } vgui::HFont SloganFont = pScheme->GetFont( "CleanHUD", IsProportional() ); m_pSloganLabel->SetFont(SloganFont); m_pSloganLabel->SetFgColor(Color(255,255,255,255)); vgui::HFont HeaderFont = pScheme->GetFont( "DefaultLarge", IsProportional() ); m_pSynTekLabel->SetFont(HeaderFont); m_pSynTekLabel->SetFgColor(Color(255,255,255,255)); vgui::HFont ScrollerFont = pScheme->GetFont( "Courier", IsProportional() ); for (int i=0;iSetFont(ScrollerFont); m_pScrollLine[i]->SetFgColor(Color(19,21,41,255)); m_pScrollLine[i]->SetAlpha(0); // it's okay for these to be hidden if player changes res and this gets called again } if (m_bSlidOut) { m_pSloganLabel->SetAlpha(0); m_pLogoGlitchImage->SetAlpha(0); } m_bSetAlpha = true; } bool CASW_VGUI_Computer_Splash::IsPDA() { if (m_pHackComputer && m_pHackComputer->GetComputerArea()) return m_pHackComputer->GetComputerArea()->IsPDA(); return false; } #define ASW_SPLASH_SCROLL_INTERVAL 0.03f void CASW_VGUI_Computer_Splash::OnThink() { if (!m_bPlayedSound && m_fSoundTime <= gpGlobals->curtime) { CLocalPlayerFilter filter; if (IsPDA()) C_BaseEntity::EmitSound( filter, -1 /*SOUND_FROM_LOCAL_PLAYER*/, "ASWComputer.SyntekPDA" ); else C_BaseEntity::EmitSound( filter, -1 /*SOUND_FROM_LOCAL_PLAYER*/, "ASWComputer.Startup" ); m_bPlayedSound = true; } int x,y,w,t; GetBounds(x,y,w,t); if (!m_bSlidOut && m_fSlideOutTime <= gpGlobals->curtime) { m_bSlidOut = true; // slide/fade out our elements vgui::GetAnimationController()->RunAnimationCommand(m_pLogoImage, "xpos", w*0.05f, 0.0f, 0.8f, vgui::AnimationController::INTERPOLATOR_LINEAR); vgui::GetAnimationController()->RunAnimationCommand(m_pLogoImage, "ypos", t*0.05f, 0.0f, 0.8f, vgui::AnimationController::INTERPOLATOR_LINEAR); vgui::GetAnimationController()->RunAnimationCommand(m_pLogoImage, "wide", w*0.13f, 0.0f, 0.8f, vgui::AnimationController::INTERPOLATOR_LINEAR); vgui::GetAnimationController()->RunAnimationCommand(m_pLogoImage, "tall", t*0.13f, 0.0f, 0.8f, vgui::AnimationController::INTERPOLATOR_LINEAR); vgui::GetAnimationController()->RunAnimationCommand(m_pSynTekLabel, "ypos", 0, 0.0f, 0.8f, vgui::AnimationController::INTERPOLATOR_LINEAR); vgui::GetAnimationController()->RunAnimationCommand(m_pSloganLabel, "Alpha", 0, 0.0f, 0.4f, vgui::AnimationController::INTERPOLATOR_LINEAR); } if (m_iNumLines < ASW_SPLASH_SCROLL_LINES && m_fStartScrollingTime <= gpGlobals->curtime) { m_iNumLines++; //m_iNumLines = clamp(((gpGlobals->curtime - m_fStartScrollingTime) / ASW_SPLASH_SCROLL_INTERVAL) + 1, 0, ASW_SPLASH_SCROLL_LINES); if (m_iNumLines == ASW_SPLASH_SCROLL_LINES) m_fFadeScrollerOutTime = gpGlobals->curtime + 0.8f; float font_tall = vgui::surface()->GetFontTall(m_pScrollLine[0]->GetFont()); for (int i=0;iSetAlpha(128); m_pScrollLine[i]->SetPos(0.02f * w, t - ((m_iNumLines - i) * font_tall + 0.02f * w)); } m_fStartScrollingTime = gpGlobals->curtime + ASW_SPLASH_SCROLL_INTERVAL * (random->RandomInt(1,5)); } if (m_fFadeScrollerOutTime != 0 && gpGlobals->curtime >= m_fFadeScrollerOutTime) { m_fFadeScrollerOutTime = 0; for (int i=0;iRunAnimationCommand(m_pScrollLine[i], "Alpha", 0, 0.0f, 0.4f, vgui::AnimationController::INTERPOLATOR_LINEAR); } // notify the main frame we're done CASW_VGUI_Computer_Frame *pFrame = dynamic_cast(GetParent()); if (pFrame && !IsPDA()) pFrame->SplashFinished(); } m_pLogoImage->GetBounds(x,y,w,t); // make our glitch less bright if (m_bSlidOut || gpGlobals->curtime > m_fShowGlitchTime) { m_pLogoGlitchImage->SetAlpha(0); if (gpGlobals->curtime > m_fNextGlitchTime) { if (random->RandomFloat() < 0.03f) m_fShowGlitchTime = gpGlobals->curtime + 0.4f; m_fNextGlitchTime += ASW_COMPUTER_GLITCH_INTERVAL; } } else { m_pLogoGlitchImage->SetAlpha(m_pLogoImage->GetAlpha() * 0.07f); // scale it randomly if (gpGlobals->curtime > m_fNextGlitchTime) { float x_scale = random->RandomFloat(0.7f, 1.3f); float y_scale = random->RandomFloat(0.7f, 1.3f); m_pLogoGlitchImage->SetSize(w * x_scale, t * y_scale); m_pLogoGlitchImage->SetPos(x - w * 0.5f * x_scale + w * 0.5f, y - t * 0.5f * y_scale + t * 0.5f); m_fNextGlitchTime += ASW_COMPUTER_GLITCH_INTERVAL; } } //float deltatime = gpGlobals->curtime - m_fLastThinkTime; m_fLastThinkTime = gpGlobals->curtime; } void CASW_VGUI_Computer_Splash::SetHidden(bool bHidden) { if (bHidden && GetAlpha() > 0) { vgui::GetAnimationController()->RunAnimationCommand(this, "Alpha", 0, 0, 0.7f, vgui::AnimationController::INTERPOLATOR_LINEAR); } else if (!bHidden && GetAlpha() <= 0) { vgui::GetAnimationController()->RunAnimationCommand(this, "Alpha", 255, 0, 0.7f, vgui::AnimationController::INTERPOLATOR_LINEAR); } }