#include "cbase.h" #include "C_ASW_Computer_Area.h" #include "c_asw_marine.h" #include #include #include "c_asw_door.h" #include "asw_marine_profile.h" #include "c_asw_hack.h" #include "asw_util_shared.h" #include "igameevents.h" // memdbgon must be the last include file in a .cpp file!!! #include "tier0/memdbgon.h" IMPLEMENT_CLIENTCLASS_DT( C_ASW_Computer_Area, DT_ASW_Computer_Area, CASW_Computer_Area ) RecvPropInt (RECVINFO(m_iHackLevel)), RecvPropFloat (RECVINFO(m_fDownloadTime)), RecvPropBool (RECVINFO(m_bIsLocked)), RecvPropBool(RECVINFO(m_bIsInUse)), RecvPropBool(RECVINFO(m_bWaitingForInput)), RecvPropFloat(RECVINFO(m_fHackProgress)), RecvPropInt (RECVINFO(m_bIsLocked)), RecvPropFloat (RECVINFO(m_fHackProgress)), RecvPropEHandle( RECVINFO( m_hSecurityCam1 ) ), RecvPropEHandle( RECVINFO( m_hTurret1 ) ), RecvPropString( RECVINFO( m_MailFile ) ), RecvPropString( RECVINFO( m_NewsFile ) ), RecvPropString( RECVINFO( m_StocksSeed ) ), RecvPropString( RECVINFO( m_WeatherSeed ) ), RecvPropString( RECVINFO( m_PlantFile ) ), RecvPropString( RECVINFO( m_PDAName ) ), RecvPropString( RECVINFO( m_SecurityCamLabel1 ) ), RecvPropString( RECVINFO( m_SecurityCamLabel2 ) ), RecvPropString( RECVINFO( m_SecurityCamLabel3 ) ), RecvPropString( RECVINFO( m_TurretLabel1 ) ), RecvPropString( RECVINFO( m_TurretLabel2 ) ), RecvPropString( RECVINFO( m_TurretLabel3 ) ), RecvPropString( RECVINFO( m_DownloadObjectiveName ) ), RecvPropBool( RECVINFO(m_bDownloadedDocs) ), RecvPropBool (RECVINFO(m_bSecurityCam1Locked)), RecvPropBool (RECVINFO(m_bTurret1Locked)), RecvPropBool (RECVINFO(m_bMailFileLocked)), RecvPropBool (RECVINFO(m_bNewsFileLocked)), RecvPropBool (RECVINFO(m_bStocksFileLocked)), RecvPropBool (RECVINFO(m_bWeatherFileLocked)), RecvPropBool (RECVINFO(m_bPlantFileLocked)), END_RECV_TABLE() bool C_ASW_Computer_Area::s_bLoadedLockedIconTexture = false; int C_ASW_Computer_Area::s_nLockedIconTextureID = -1; bool C_ASW_Computer_Area::s_bLoadedOpenIconTexture = false; int C_ASW_Computer_Area::s_nOpenIconTextureID = -1; bool C_ASW_Computer_Area::s_bLoadedCloseIconTexture = false; int C_ASW_Computer_Area::s_nCloseIconTextureID = -1; bool C_ASW_Computer_Area::s_bLoadedUseIconTexture = false; int C_ASW_Computer_Area::s_nUseIconTextureID = -1; bool C_ASW_Computer_Area::s_bLoadedHackIconTexture = false; int C_ASW_Computer_Area::s_nHackIconTextureID = -1; bool C_ASW_Computer_Area::s_bLoadedUseIconPDA = false; int C_ASW_Computer_Area::s_nUseIconPDA = -1; C_ASW_Computer_Area::C_ASW_Computer_Area() { m_bOldWaitingForInput = false; m_iActiveCam = 1; // should be set serverside and networked down depending on which cam we're using? m_fLastPositiveSoundTime = 0; } C_ASW_Door* C_ASW_Computer_Area::GetDoor() { return dynamic_cast(GetUseTargetHandle().Get()); } // use icon textures int C_ASW_Computer_Area::GetLockedIconTextureID() { if (!s_bLoadedLockedIconTexture) { // load the portrait textures s_nLockedIconTextureID = vgui::surface()->CreateNewTextureID(); vgui::surface()->DrawSetTextureFile( s_nLockedIconTextureID, "vgui/swarm/UseIcons/PanelLocked", true, false); s_bLoadedLockedIconTexture = true; } return s_nLockedIconTextureID; } int C_ASW_Computer_Area::GetOpenIconTextureID() { if (!s_bLoadedOpenIconTexture) { // load the portrait textures s_nOpenIconTextureID = vgui::surface()->CreateNewTextureID(); vgui::surface()->DrawSetTextureFile( s_nOpenIconTextureID, "vgui/swarm/UseIcons/PanelUnlocked", true, false); s_bLoadedOpenIconTexture = true; } return s_nOpenIconTextureID; } int C_ASW_Computer_Area::GetCloseIconTextureID() { if (!s_bLoadedCloseIconTexture) { // load the portrait textures s_nCloseIconTextureID = vgui::surface()->CreateNewTextureID(); vgui::surface()->DrawSetTextureFile( s_nCloseIconTextureID, "vgui/swarm/UseIcons/PanelNoPower", true, false); s_bLoadedCloseIconTexture = true; } return s_nCloseIconTextureID; } int C_ASW_Computer_Area::GetUseIconTextureID() { if (!s_bLoadedUseIconTexture) { // load the portrait textures s_nUseIconTextureID = vgui::surface()->CreateNewTextureID(); vgui::surface()->DrawSetTextureFile( s_nUseIconTextureID, "vgui/swarm/UseIcons/PanelUnlocked", true, false); s_bLoadedUseIconTexture = true; } return s_nUseIconTextureID; } int C_ASW_Computer_Area::GetHackIconTextureID() { if (!s_bLoadedHackIconTexture) { // load the portrait textures s_nHackIconTextureID = vgui::surface()->CreateNewTextureID(); vgui::surface()->DrawSetTextureFile( s_nHackIconTextureID, "vgui/swarm/UseIcons/PanelLocked", true, false); s_bLoadedHackIconTexture = true; } return s_nHackIconTextureID; } int C_ASW_Computer_Area::GetUseIconPDATextureID() { if (!s_bLoadedUseIconPDA) { // load the portrait textures s_nUseIconTextureID = vgui::surface()->CreateNewTextureID(); vgui::surface()->DrawSetTextureFile( s_nUseIconTextureID, "vgui/swarm/UseIcons/UseIconPDA", true, false); s_bLoadedUseIconPDA = true; } return s_nUseIconTextureID; } int C_ASW_Computer_Area::GetNumMenuOptions() { int n=0; if (m_DownloadObjectiveName.Get()[0] != 0 && GetHackProgress() < 1.0f) n++; if (m_MailFile.Get()[0] != 0) n++; if (m_NewsFile.Get()[0] != 0) n++; if (m_StocksSeed.Get()[0] != 0) n++; if (m_WeatherSeed.Get()[0] != 0) n++; if (m_PlantFile.Get()[0] != 0) n++; if (m_hSecurityCam1.Get() != NULL) n++; if (m_hTurret1.Get() != NULL) n++; if (n > 6) // clamp it to 6 options, since that's all our UI supports n = 6; return n; } bool C_ASW_Computer_Area::GetUseAction(ASWUseAction &action, C_ASW_Marine *pUser) { CASW_Marine_Profile *pProfile = pUser->GetMarineProfile(); bool bTech = pProfile->CanHack(); action.UseIconRed = 255; action.UseIconGreen = 255; action.UseIconBlue = 255; action.bShowUseKey = true; action.iInventorySlot = -1; if (pUser->m_hCurrentHack.Get()) { // if we're a tech and we're on the 'access denied' screen, then change use icon to be an 'override' if (bTech && pUser->m_hCurrentHack->CanOverrideHack()) { action.iUseIconTexture = GetHackIconTextureID(); TryLocalize( "#asw_override_security", action.wszText, sizeof( action.wszText ) ); action.UseTarget = this; if (IsLocked()) action.fProgress = GetTumblerProgress(pUser); else action.fProgress = GetHackProgress(); } else { action.iUseIconTexture = GetHackIconTextureID(); TryLocalize( "#asw_log_off", action.wszText, sizeof( action.wszText ) ); action.UseTarget = this; if (IsLocked()) action.fProgress = GetTumblerProgress(pUser); else action.fProgress = GetHackProgress(); } } else { if (IsLocked()) { if (bTech) { action.iUseIconTexture = GetHackIconTextureID(); TryLocalize( "#asw_hack_comp", action.wszText, sizeof( action.wszText ) ); action.UseTarget = this; action.fProgress = GetHackProgress(); } else { action.iUseIconTexture = GetLockedIconTextureID(); TryLocalize( "#asw_requires_tech", action.wszText, sizeof( action.wszText ) ); action.UseTarget = this; action.fProgress = GetHackProgress(); } } else { action.iUseIconTexture = GetUseIconTextureID(); if ( IsPDA() ) { action.iUseIconTexture = GetUseIconPDATextureID(); TryLocalize( GetUseIconPDAText(), action.wszText, sizeof( action.wszText ) ); } else { TryLocalize( GetUseIconText(), action.wszText, sizeof( action.wszText ) ); } action.UseTarget = this; action.fProgress = -1; } } return true; } bool C_ASW_Computer_Area::IsPDA() { return m_PDAName.Get()[0] != 0; } float C_ASW_Computer_Area::GetTumblerProgress(C_ASW_Marine *pUser) { if (!pUser || !pUser->m_hCurrentHack.Get()) return 0; return pUser->m_hCurrentHack->GetTumblerProgress(); } void C_ASW_Computer_Area::PlayPositiveSound(C_ASW_Player *pHackingPlayer) { if (gpGlobals->curtime > m_fLastPositiveSoundTime + 0.6f) { m_fLastPositiveSoundTime = gpGlobals->curtime; CLocalPlayerFilter filter; C_BaseEntity::EmitSound( filter, entindex(), "ASWComputer.NumberAligned" ); } } void C_ASW_Computer_Area::PlayNegativeSound(C_ASW_Player *pHackingPlayer) { // none atm }