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.
154 lines
4.6 KiB
154 lines
4.6 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
//============================================================================= |
|
|
|
#include "stdafx.h" |
|
#include "scriplib.h" |
|
#include "choreoscene.h" |
|
#include "iscenetokenprocessor.h" |
|
#include "filesystem_tools.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 ); |
|
|
|
Warning( "%s", string ); |
|
} |
|
|
|
static CSceneTokenProcessor g_TokenProcessor; |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Normally implemented in cmdlib.cpp but we don't want that in Hammer. |
|
//----------------------------------------------------------------------------- |
|
char *ExpandPath (char *path) |
|
{ |
|
static char fullpath[ 512 ]; |
|
g_pFullFileSystem->RelativePathToFullPath( path, "GAME", fullpath, sizeof( fullpath ) ); |
|
return fullpath; |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// This is here because scriplib.cpp is included in this project but cmdlib.cpp |
|
// is not, but scriplib.cpp uses some stuff from cmdlib.cpp, same with |
|
// LoadFile and ExpandPath above. The only thing that currently uses this |
|
// is $include in scriptlib, if this function returns 0, $include will |
|
// behave the way it did before this change |
|
//----------------------------------------------------------------------------- |
|
int CmdLib_ExpandWithBasePaths( CUtlVector< CUtlString > &expandedPathList, const char *pszPath ) |
|
{ |
|
return 0; |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Normally implemented in cmdlib.cpp but we don't want that in Hammer. |
|
//----------------------------------------------------------------------------- |
|
int LoadFile( const char *filename, void **bufferptr ) |
|
{ |
|
FileHandle_t f = g_pFullFileSystem->Open( filename, "rb" ); |
|
if ( FILESYSTEM_INVALID_HANDLE != f ) |
|
{ |
|
int length = g_pFullFileSystem->Size( f ); |
|
void *buffer = malloc (length+1); |
|
((char *)buffer)[length] = 0; |
|
g_pFullFileSystem->Read( buffer, length, f ); |
|
g_pFullFileSystem->Close (f); |
|
*bufferptr = buffer; |
|
return length; |
|
} |
|
else |
|
{ |
|
*bufferptr = NULL; |
|
return 0; |
|
} |
|
} |
|
|
|
|
|
CChoreoScene* HammerLoadScene( const char *pFilename ) |
|
{ |
|
if ( g_pFullFileSystem->FileExists( pFilename ) ) |
|
{ |
|
LoadScriptFile( (char*)pFilename ); |
|
CChoreoScene *scene = ChoreoLoadScene( pFilename, NULL, &g_TokenProcessor, Msg ); |
|
return scene; |
|
} |
|
|
|
return NULL; |
|
} |
|
|
|
|
|
bool GetFirstSoundInScene( const char *pSceneFilename, char *pSoundName, int soundNameLen ) |
|
{ |
|
CChoreoScene *pScene = HammerLoadScene( pSceneFilename ); |
|
if ( !pScene ) |
|
return false; |
|
|
|
for ( int i = 0; i < pScene->GetNumEvents(); i++ ) |
|
{ |
|
CChoreoEvent *e = pScene->GetEvent( i ); |
|
if ( !e || e->GetType() != CChoreoEvent::SPEAK ) |
|
continue; |
|
|
|
const char *pParameters = e->GetParameters(); |
|
V_strncpy( pSoundName, pParameters, soundNameLen ); |
|
delete pScene; |
|
return true; |
|
} |
|
|
|
delete pScene; |
|
return false; |
|
} |