You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
285 lines
6.2 KiB
285 lines
6.2 KiB
5 years ago
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||
|
//
|
||
|
// Purpose:
|
||
|
//
|
||
|
//=============================================================================//
|
||
|
#include "cbase.h"
|
||
|
#include "vcdfile.h"
|
||
|
#include "soundentry.h"
|
||
|
#include "choreoscene.h"
|
||
|
#include "scriplib.h"
|
||
|
#include "cmdlib.h"
|
||
|
#include "iscenetokenprocessor.h"
|
||
|
#include "choreoevent.h"
|
||
|
#include "scene.h"
|
||
|
#include "project.h"
|
||
|
#include "workspacemanager.h"
|
||
|
#include "workspacebrowser.h"
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: Helper to scene module for parsing the .vcd file
|
||
|
//-----------------------------------------------------------------------------
|
||
|
class CSceneTokenProcessor : public ISceneTokenProcessor
|
||
|
{
|
||
|
public:
|
||
|
const char *CurrentToken( void );
|
||
|
bool GetToken( bool crossline );
|
||
|
bool TokenAvailable( void );
|
||
|
void Error( const char *fmt, ... );
|
||
|
};
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
// Output : const
|
||
|
//-----------------------------------------------------------------------------
|
||
|
const char *CSceneTokenProcessor::CurrentToken( void )
|
||
|
{
|
||
|
return token;
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
// Input : crossline -
|
||
|
// Output : Returns true on success, false on failure.
|
||
|
//-----------------------------------------------------------------------------
|
||
|
bool CSceneTokenProcessor::GetToken( bool crossline )
|
||
|
{
|
||
|
return ::GetToken( crossline ) ? true : false;
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
// Output : Returns true on success, false on failure.
|
||
|
//-----------------------------------------------------------------------------
|
||
|
bool CSceneTokenProcessor::TokenAvailable( void )
|
||
|
{
|
||
|
return ::TokenAvailable() ? true : false;
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
// Input : *fmt -
|
||
|
// ... -
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CSceneTokenProcessor::Error( const char *fmt, ... )
|
||
|
{
|
||
|
char string[ 2048 ];
|
||
|
va_list argptr;
|
||
|
va_start( argptr, fmt );
|
||
|
vsprintf( string, fmt, argptr );
|
||
|
va_end( argptr );
|
||
|
|
||
|
Con_ColorPrintf( ERROR_R, ERROR_G, ERROR_B, string );
|
||
|
::Error( string );
|
||
|
}
|
||
|
|
||
|
static CSceneTokenProcessor g_TokenProcessor;
|
||
|
ISceneTokenProcessor *tokenprocessor = &g_TokenProcessor;
|
||
|
|
||
|
CVCDFile::CVCDFile( CScene *scene, char const *filename ) : m_pOwner( scene )
|
||
|
{
|
||
|
Q_strncpy( m_szName, filename, sizeof( m_szName ) );
|
||
|
|
||
|
m_pScene = LoadScene( filename );
|
||
|
LoadSoundsFromScene( m_pScene );
|
||
|
|
||
|
m_pszComments = NULL;
|
||
|
}
|
||
|
|
||
|
CVCDFile::~CVCDFile()
|
||
|
{
|
||
|
while ( m_Sounds.Count() > 0 )
|
||
|
{
|
||
|
CSoundEntry *p = m_Sounds[ 0 ];
|
||
|
m_Sounds.Remove( 0 );
|
||
|
delete p;
|
||
|
}
|
||
|
delete[] m_pszComments;
|
||
|
}
|
||
|
|
||
|
CScene *CVCDFile::GetOwnerScene()
|
||
|
{
|
||
|
return m_pOwner;
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
// Input : *filename -
|
||
|
// Output : CChoreoScene
|
||
|
//-----------------------------------------------------------------------------
|
||
|
CChoreoScene *CVCDFile::LoadScene( char const *filename )
|
||
|
{
|
||
|
if ( filesystem->FileExists( filename ) )
|
||
|
{
|
||
|
char fullpath[ 512 ];
|
||
|
filesystem->RelativePathToFullPath( filename, "GAME", fullpath, sizeof( fullpath ) );
|
||
|
LoadScriptFile( fullpath );
|
||
|
CChoreoScene *scene = ChoreoLoadScene( filename, this, &g_TokenProcessor, Con_Printf );
|
||
|
return scene;
|
||
|
}
|
||
|
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
void CVCDFile::LoadSoundsFromScene( CChoreoScene *scene )
|
||
|
{
|
||
|
if ( !scene )
|
||
|
return;
|
||
|
|
||
|
CChoreoEvent *e;
|
||
|
|
||
|
int c = scene->GetNumEvents();
|
||
|
for ( int i = 0; i < c; i++ )
|
||
|
{
|
||
|
e = scene->GetEvent( i );
|
||
|
if ( !e )
|
||
|
continue;
|
||
|
|
||
|
if ( e->GetType() != CChoreoEvent::SPEAK )
|
||
|
continue;
|
||
|
|
||
|
CSoundEntry *se = new CSoundEntry( this, e->GetParameters() );
|
||
|
m_Sounds.AddToTail( se );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
char const *CVCDFile::GetName() const
|
||
|
{
|
||
|
return m_szName;
|
||
|
}
|
||
|
|
||
|
char const *CVCDFile::GetComments()
|
||
|
{
|
||
|
return m_pszComments ? m_pszComments : "";
|
||
|
}
|
||
|
|
||
|
void CVCDFile::SetComments( char const *comments )
|
||
|
{
|
||
|
delete[] m_pszComments;
|
||
|
m_pszComments = V_strdup( comments );
|
||
|
|
||
|
if ( GetOwnerScene() )
|
||
|
{
|
||
|
if ( GetOwnerScene()->GetOwnerProject() )
|
||
|
{
|
||
|
GetOwnerScene()->GetOwnerProject()->SetDirty( true );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int CVCDFile::GetSoundEntryCount() const
|
||
|
{
|
||
|
return m_Sounds.Count();
|
||
|
}
|
||
|
|
||
|
CSoundEntry *CVCDFile::GetSoundEntry( int index )
|
||
|
{
|
||
|
if ( index < 0 || index >= m_Sounds.Count() )
|
||
|
return NULL;
|
||
|
return m_Sounds[ index ];
|
||
|
}
|
||
|
|
||
|
void CVCDFile::ValidateTree( mxTreeView *tree, mxTreeViewItem* parent )
|
||
|
{
|
||
|
CUtlVector< mxTreeViewItem * > m_KnownItems;
|
||
|
|
||
|
int c = GetSoundEntryCount();
|
||
|
CSoundEntry *sound;
|
||
|
for ( int i = 0; i < c; i++ )
|
||
|
{
|
||
|
sound = GetSoundEntry( i );
|
||
|
if ( !sound )
|
||
|
continue;
|
||
|
|
||
|
char sz[ 256 ];
|
||
|
Q_snprintf( sz, sizeof( sz ), "\"%s\" : script %s", sound->GetName(), sound->GetScriptFile() );
|
||
|
|
||
|
mxTreeViewItem *spot = sound->FindItem( tree, parent );
|
||
|
if ( !spot )
|
||
|
{
|
||
|
spot = tree->add( parent, sz );
|
||
|
}
|
||
|
|
||
|
m_KnownItems.AddToTail( spot );
|
||
|
|
||
|
sound->SetOrdinal( i );
|
||
|
|
||
|
tree->setLabel( spot, sz );
|
||
|
|
||
|
tree->setImages( spot, sound->GetIconIndex(), sound->GetIconIndex() );
|
||
|
tree->setUserData( spot, sound );
|
||
|
|
||
|
sound->ValidateTree( tree, spot );
|
||
|
}
|
||
|
|
||
|
mxTreeViewItem *start = tree->getFirstChild( parent );
|
||
|
while ( start )
|
||
|
{
|
||
|
mxTreeViewItem *next = tree->getNextChild( start );
|
||
|
|
||
|
if ( m_KnownItems.Find( start ) == m_KnownItems.InvalidIndex() )
|
||
|
{
|
||
|
tree->remove( start );
|
||
|
}
|
||
|
|
||
|
start = next;
|
||
|
}
|
||
|
|
||
|
tree->sortTree( parent, true, CWorkspaceBrowser::CompareFunc, 0 );
|
||
|
}
|
||
|
|
||
|
void CVCDFile::Checkout(bool updatestateicons /*= true*/)
|
||
|
{
|
||
|
VSS_Checkout( GetName(), updatestateicons );
|
||
|
}
|
||
|
|
||
|
void CVCDFile::Checkin(bool updatestateicons /*= true*/)
|
||
|
{
|
||
|
VSS_Checkin( GetName(), updatestateicons );
|
||
|
}
|
||
|
|
||
|
|
||
|
bool CVCDFile::IsCheckedOut() const
|
||
|
{
|
||
|
return filesystem->IsFileWritable( GetName() );
|
||
|
}
|
||
|
|
||
|
int CVCDFile::GetIconIndex() const
|
||
|
{
|
||
|
if ( IsCheckedOut() )
|
||
|
{
|
||
|
return IMAGE_VCD_CHECKEDOUT;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return IMAGE_VCD;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CVCDFile::MoveChildUp( ITreeItem *child )
|
||
|
{
|
||
|
}
|
||
|
|
||
|
void CVCDFile::MoveChildDown( ITreeItem *child )
|
||
|
{
|
||
|
}
|
||
|
|
||
|
void CVCDFile::SetDirty( bool dirty )
|
||
|
{
|
||
|
if ( GetOwnerScene() )
|
||
|
{
|
||
|
GetOwnerScene()->SetDirty( dirty );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
bool CVCDFile::IsChildFirst( ITreeItem *child )
|
||
|
{
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
bool CVCDFile::IsChildLast( ITreeItem *child )
|
||
|
{
|
||
|
return false;
|
||
|
}
|