source-engine/game/client/swarm/c_asw_computer_area.cpp
2023-10-03 17:23:56 +03:00

275 lines
8.1 KiB
C++

#include "cbase.h"
#include "C_ASW_Computer_Area.h"
#include "c_asw_marine.h"
#include <vgui/ISurface.h>
#include <vgui_controls/Panel.h>
#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<C_ASW_Door*>(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
}