//----------------------------------------------------------------------------- // Purpose: Constructor //----------------------------------------------------------------------------- AnimationController::AnimationController(Panel *parent) : BaseClass(parent, NULL) { m_hSizePanel = 0; m_nScreenBounds[ 0 ] = m_nScreenBounds[ 1 ] = -1; m_nScreenBounds[ 2 ] = m_nScreenBounds[ 3 ] = -1; m_bAutoReloadScript = false; // always invisible SetVisible(false); SetProportional(true); // get the names of common types m_sPosition = g_ScriptSymbols.AddString("position"); m_sSize = g_ScriptSymbols.AddString("size"); m_sFgColor = g_ScriptSymbols.AddString("fgcolor"); m_sBgColor = g_ScriptSymbols.AddString("bgcolor"); m_sXPos = g_ScriptSymbols.AddString("xpos"); m_sYPos = g_ScriptSymbols.AddString("ypos"); m_sWide = g_ScriptSymbols.AddString("wide"); m_sTall = g_ScriptSymbols.AddString("tall"); m_flCurrentTime = 0.0f; }
void AddNewTranslation( const char *pOriginalMaterialName, const char *pNewMaterialName ) { NameTranslationLookup_t newEntry; newEntry.m_OriginalFileName = s_SymbolTable.AddString( pOriginalMaterialName ); newEntry.m_PatchFileName = s_SymbolTable.AddString( pNewMaterialName ); s_MapPatchedMatToOriginalMat.Insert( newEntry ); }
void LogPrecache( char const *soundname ) { if ( !m_bLogPrecache ) return; // Make sure we only show the message once if ( UTL_INVAL_SYMBOL != m_PrecachedScriptSounds.Find( soundname ) ) return; if (m_hPrecacheLogFile == FILESYSTEM_INVALID_HANDLE) { StartLog(); } m_PrecachedScriptSounds.AddString( soundname ); if (m_hPrecacheLogFile != FILESYSTEM_INVALID_HANDLE) { filesystem->Write("\"", 1, m_hPrecacheLogFile); filesystem->Write(soundname, Q_strlen(soundname), m_hPrecacheLogFile); filesystem->Write("\"\n", 2, m_hPrecacheLogFile); } else { Warning( "Disabling precache logging due to file i/o problem!!!\n" ); m_bLogPrecache = false; } }
//----------------------------------------------------------------------------- // Purpose: Sets which script file to use //----------------------------------------------------------------------------- bool AnimationController::SetScriptFile( VPANEL sizingPanel, const char *fileName, bool wipeAll /*=false*/ ) { m_hSizePanel = sizingPanel; if ( wipeAll ) { // clear the current script m_Sequences.RemoveAll(); m_ScriptFileNames.RemoveAll(); CancelAllAnimations(); } // Store off this filename for reloading later on (if we don't have it already) UtlSymId_t sFilename = g_ScriptSymbols.AddString( fileName ); if ( m_ScriptFileNames.Find( sFilename ) == m_ScriptFileNames.InvalidIndex() ) { m_ScriptFileNames.AddToTail( sFilename ); } UpdateScreenSize(); // load the new script file return LoadScriptFile( fileName ); }
//----------------------------------------------------------------------------- // Purpose: mark or add // Input : *pEntity - // Output : Returns true on success, false on failure. //----------------------------------------------------------------------------- bool CPrecacheOtherList::AddOrMarkPrecached( const char *pClassname ) { CUtlSymbol sym = m_list.Find( pClassname ); if ( sym.IsValid() ) return false; m_list.AddString( pClassname ); return true; }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void Button::SetReleasedSound(const char *sound) { if (sound) { m_sReleasedSoundName = g_ButtonSoundNames.AddString(sound); } else { m_sReleasedSoundName = UTL_INVAL_SYMBOL; } }
void CMod::SetGameDir( const char *dir ) { CUtlSymbol lookup; lookup = g_GameDirTable.Find( dir ); if ( lookup != UTL_INVAL_SYMBOL ) { gamedir = lookup; } else { gamedir = g_GameDirTable.AddString( dir ); } }
void WaveTrace( char const *wavname, char const *funcname ) { if ( IsX360() && !IsDebug() ) { return; } static CUtlSymbolTable s_WaveTrace; // Make sure we only show the message once if ( UTL_INVAL_SYMBOL == s_WaveTrace.Find( wavname ) ) { DevMsg( "%s directly referenced wave %s (should use game_sounds.txt system instead)\n", funcname, wavname ); s_WaveTrace.AddString( wavname ); } }
//----------------------------------------------------------------------------- // Purpose: Runs a custom command from code, not from a script file //----------------------------------------------------------------------------- void AnimationController::RunAnimationCommand(vgui::Panel *panel, const char *variable, float targetValue, float startDelaySeconds, float duration, Interpolators_e interpolator, float animParameter /* = 0 */ ) { // clear any previous animations of this variable UtlSymId_t var = g_ScriptSymbols.AddString(variable); RemoveQueuedAnimationByType(panel, var, UTL_INVAL_SYMBOL); // build a new animation AnimCmdAnimate_t animateCmd; memset(&animateCmd, 0, sizeof(animateCmd)); animateCmd.panel = 0; animateCmd.variable = var; animateCmd.target.a = targetValue; animateCmd.interpolationFunction = interpolator; animateCmd.interpolationParameter = animParameter; animateCmd.startTime = startDelaySeconds; animateCmd.duration = duration; // start immediately StartCmd_Animate(panel, 0, animateCmd); }
const char *GetOriginalMaterialNameForPatchedMaterial( const char *pPatchMaterialName ) { const char *pRetName = NULL; int id; NameTranslationLookup_t lookup; lookup.m_PatchFileName = s_SymbolTable.AddString( pPatchMaterialName ); do { id = s_MapPatchedMatToOriginalMat.Find( lookup ); if( id >= 0 ) { NameTranslationLookup_t &found = s_MapPatchedMatToOriginalMat[id]; lookup.m_PatchFileName = found.m_OriginalFileName; pRetName = s_SymbolTable.String( found.m_OriginalFileName ); } } while( id >= 0 ); if( !pRetName ) { // This isn't a patched material, so just return the original name. return pPatchMaterialName; } return pRetName; }
HSOUNDSCRIPTHANDLE PrecacheScriptSound( const char *soundname ) { int soundIndex = soundemitterbase->GetSoundIndex( soundname ); if ( !soundemitterbase->IsValidIndex( soundIndex ) ) { if ( Q_stristr( soundname, ".wav" ) || Q_strstr( soundname, ".mp3" ) ) { g_bPermitDirectSoundPrecache = true; CBaseEntity::PrecacheSound( soundname ); g_bPermitDirectSoundPrecache = false; return SOUNDEMITTER_INVALID_HANDLE; } #if !defined( CLIENT_DLL ) if ( soundname[ 0 ] ) { static CUtlSymbolTable s_PrecacheScriptSoundFailures; // Make sure we only show the message once if ( UTL_INVAL_SYMBOL == s_PrecacheScriptSoundFailures.Find( soundname ) ) { DevMsg( "PrecacheScriptSound '%s' failed, no such sound script entry\n", soundname ); s_PrecacheScriptSoundFailures.AddString( soundname ); } } #endif return (HSOUNDSCRIPTHANDLE)soundIndex; } #if !defined( CLIENT_DLL ) LogPrecache( soundname ); #endif InternalPrecacheWaves( soundIndex ); return (HSOUNDSCRIPTHANDLE)soundIndex; }
//----------------------------------------------------------------------------- // Purpose: // Input : *filename - //----------------------------------------------------------------------------- void CDecalEmitterSystem::LoadDecalsFromScript( char const *filename ) { KeyValues *kv = new KeyValues( filename ); Assert( kv ); if ( kv ) { KeyValues *translation = NULL; #ifndef _XBOX if ( kv->LoadFromFile( filesystem, filename ) ) #else if ( kv->LoadFromFile( filesystem, filename, "GAME" ) ) #endif { KeyValues *p = kv; while ( p ) { if ( p->GetFirstSubKey() ) { char const *keyname = p->GetName(); if ( !Q_stricmp( keyname, TRANSLATION_DATA_SECTION ) ) { translation = p; } else { DecalEntry entry; for ( KeyValues *sub = p->GetFirstSubKey(); sub != NULL; sub = sub->GetNextKey() ) { MEM_ALLOC_CREDIT(); DecalListEntry decal; decal.precache_index = -1; decal.name = m_DecalFileNames.AddString( sub->GetName() ); decal.weight = sub->GetFloat(); // Add to global list int idx = m_AllDecals.AddToTail( decal ); // Add index only to local list entry.indices.AddToTail( idx ); } // Add entry to main dictionary m_Decals.Insert( keyname, entry ); } } p = p->GetNextKey(); } } else { Msg( "CDecalEmitterSystem::LoadDecalsFromScript: Unable to load '%s'\n", filename ); } if ( !translation ) { Msg( "CDecalEmitterSystem::LoadDecalsFromScript: Script '%s' missing section '%s'\n", filename, TRANSLATION_DATA_SECTION ); } else { // Now parse game material to entry translation table for ( KeyValues *sub = translation->GetFirstSubKey(); sub != NULL; sub = sub->GetNextKey() ) { // Don't add NULL string to list if ( !Q_stricmp( sub->GetString(), "" ) ) continue; int idx = m_Decals.Find( sub->GetString() ); if ( idx != m_Decals.InvalidIndex() ) { m_GameMaterialTranslation.Insert( sub->GetName(), idx ); } else { Msg( "CDecalEmitterSystem::LoadDecalsFromScript: Translation for game material type '%s' references unknown decal '%s'\n", sub->GetName(), sub->GetString() ); } } } kv->deleteThis(); } }
//----------------------------------------------------------------------------- // Purpose: symbol table access (used for key names) //----------------------------------------------------------------------------- HKeySymbol CKeyValuesSystem::GetSymbolForString(const char *name) { return m_SymbolTable.AddString(name); }
//----------------------------------------------------------------------------- // Purpose: parses a script into sequences //----------------------------------------------------------------------------- bool AnimationController::ParseScriptFile(char *pMem, int length) { // get the scheme (for looking up color names) IScheme *scheme = vgui::scheme()->GetIScheme(GetScheme()); // get our screen size (for left/right/center alignment) int screenWide = m_nScreenBounds[ 2 ]; int screenTall = m_nScreenBounds[ 3 ]; // start by getting the first token char token[512]; pMem = ParseFile(pMem, token, NULL); while (token[0]) { bool bAccepted = true; // should be 'event' if (stricmp(token, "event")) { Warning("Couldn't parse script file: expected 'event', found '%s'\n", token); return false; } // get the event name pMem = ParseFile(pMem, token, NULL); if (strlen(token) < 1) { Warning("Couldn't parse script file: expected <event name>, found nothing\n"); return false; } int seqIndex; UtlSymId_t nameIndex = g_ScriptSymbols.AddString(token); // Create a new sequence seqIndex = m_Sequences.AddToTail(); AnimSequence_t &seq = m_Sequences[seqIndex]; seq.name = nameIndex; seq.duration = 0.0f; // get the open brace or a conditional pMem = ParseFile(pMem, token, NULL); if ( Q_stristr( token, "[$" ) ) { bAccepted = EvaluateConditional( token ); // now get the open brace pMem = ParseFile(pMem, token, NULL); } if (stricmp(token, "{")) { Warning("Couldn't parse script sequence '%s': expected '{', found '%s'\n", g_ScriptSymbols.String(seq.name), token); return false; } // walk the commands while (token && token[0]) { // get the command type pMem = ParseFile(pMem, token, NULL); // skip out when we hit the end of the sequence if (token[0] == '}') break; // create a new command int cmdIndex = seq.cmdList.AddToTail(); AnimCommand_t &animCmd = seq.cmdList[cmdIndex]; memset(&animCmd, 0, sizeof(animCmd)); if (!stricmp(token, "animate")) { animCmd.commandType = CMD_ANIMATE; // parse out the animation commands AnimCmdAnimate_t &cmdAnimate = animCmd.cmdData.animate; // panel to manipulate pMem = ParseFile(pMem, token, NULL); cmdAnimate.panel = g_ScriptSymbols.AddString(token); // variable to change pMem = ParseFile(pMem, token, NULL); cmdAnimate.variable = g_ScriptSymbols.AddString(token); // target value pMem = ParseFile(pMem, token, NULL); if (cmdAnimate.variable == m_sPosition) { // Get first token SetupPosition( cmdAnimate, &cmdAnimate.target.a, token, screenWide ); // Get second token from "token" char token2[32]; char *psz = ParseFile(token, token2, NULL); psz = ParseFile(psz, token2, NULL); psz = token2; // Position Y goes into ".b" SetupPosition( cmdAnimate, &cmdAnimate.target.b, psz, screenTall ); } else if ( cmdAnimate.variable == m_sXPos ) { // XPos and YPos both use target ".a" SetupPosition( cmdAnimate, &cmdAnimate.target.a, token, screenWide ); } else if ( cmdAnimate.variable == m_sYPos ) { // XPos and YPos both use target ".a" SetupPosition( cmdAnimate, &cmdAnimate.target.a, token, screenTall ); } else { // parse the floating point values right out if (0 == sscanf(token, "%f %f %f %f", &cmdAnimate.target.a, &cmdAnimate.target.b, &cmdAnimate.target.c, &cmdAnimate.target.d)) { // could be referencing a value in the scheme file, lookup Color col = scheme->GetColor(token, Color(0, 0, 0, 0)); cmdAnimate.target.a = col[0]; cmdAnimate.target.b = col[1]; cmdAnimate.target.c = col[2]; cmdAnimate.target.d = col[3]; } } // fix up scale if (cmdAnimate.variable == m_sSize) { if (IsProportional()) { cmdAnimate.target.a = static_cast<float>( vgui::scheme()->GetProportionalScaledValueEx(GetScheme(), cmdAnimate.target.a) ); cmdAnimate.target.b = static_cast<float>( vgui::scheme()->GetProportionalScaledValueEx(GetScheme(), cmdAnimate.target.b) ); } } else if (cmdAnimate.variable == m_sWide || cmdAnimate.variable == m_sTall ) { if (IsProportional()) { // Wide and tall both use.a cmdAnimate.target.a = static_cast<float>( vgui::scheme()->GetProportionalScaledValueEx(GetScheme(), cmdAnimate.target.a) ); } } // interpolation function pMem = ParseFile(pMem, token, NULL); if (!stricmp(token, "Accel")) { cmdAnimate.interpolationFunction = INTERPOLATOR_ACCEL; } else if (!stricmp(token, "Deaccel")) { cmdAnimate.interpolationFunction = INTERPOLATOR_DEACCEL; } else if ( !stricmp(token, "Spline")) { cmdAnimate.interpolationFunction = INTERPOLATOR_SIMPLESPLINE; } else if (!stricmp(token,"Pulse")) { cmdAnimate.interpolationFunction = INTERPOLATOR_PULSE; // frequencey pMem = ParseFile(pMem, token, NULL); cmdAnimate.interpolationParameter = (float)atof(token); } else if ( !stricmp( token, "Flicker")) { cmdAnimate.interpolationFunction = INTERPOLATOR_FLICKER; // noiseamount pMem = ParseFile(pMem, token, NULL); cmdAnimate.interpolationParameter = (float)atof(token); } else { cmdAnimate.interpolationFunction = INTERPOLATOR_LINEAR; } // start time pMem = ParseFile(pMem, token, NULL); cmdAnimate.startTime = (float)atof(token); // duration pMem = ParseFile(pMem, token, NULL); cmdAnimate.duration = (float)atof(token); // check max duration if (cmdAnimate.startTime + cmdAnimate.duration > seq.duration) { seq.duration = cmdAnimate.startTime + cmdAnimate.duration; } } else if (!stricmp(token, "runevent")) { animCmd.commandType = CMD_RUNEVENT; pMem = ParseFile(pMem, token, NULL); animCmd.cmdData.runEvent.event = g_ScriptSymbols.AddString(token); pMem = ParseFile(pMem, token, NULL); animCmd.cmdData.runEvent.timeDelay = (float)atof(token); } else if (!stricmp(token, "stopevent")) { animCmd.commandType = CMD_STOPEVENT; pMem = ParseFile(pMem, token, NULL); animCmd.cmdData.runEvent.event = g_ScriptSymbols.AddString(token); pMem = ParseFile(pMem, token, NULL); animCmd.cmdData.runEvent.timeDelay = (float)atof(token); } else if (!stricmp(token, "StopPanelAnimations")) { animCmd.commandType = CMD_STOPPANELANIMATIONS; pMem = ParseFile(pMem, token, NULL); animCmd.cmdData.runEvent.event = g_ScriptSymbols.AddString(token); pMem = ParseFile(pMem, token, NULL); animCmd.cmdData.runEvent.timeDelay = (float)atof(token); } else if (!stricmp(token, "stopanimation")) { animCmd.commandType = CMD_STOPANIMATION; pMem = ParseFile(pMem, token, NULL); animCmd.cmdData.runEvent.event = g_ScriptSymbols.AddString(token); pMem = ParseFile(pMem, token, NULL); animCmd.cmdData.runEvent.variable = g_ScriptSymbols.AddString(token); pMem = ParseFile(pMem, token, NULL); animCmd.cmdData.runEvent.timeDelay = (float)atof(token); } else if ( !stricmp( token, "SetFont" )) { animCmd.commandType = CMD_SETFONT; // Panel name pMem = ParseFile(pMem, token, NULL); animCmd.cmdData.runEvent.event = g_ScriptSymbols.AddString(token); // Font parameter pMem = ParseFile(pMem, token, NULL); animCmd.cmdData.runEvent.variable = g_ScriptSymbols.AddString(token); // Font name from scheme pMem = ParseFile(pMem, token, NULL); animCmd.cmdData.runEvent.variable2 = g_ScriptSymbols.AddString(token); // Set time pMem = ParseFile(pMem, token, NULL); animCmd.cmdData.runEvent.timeDelay = (float)atof(token); } else if ( !stricmp( token, "SetTexture" )) { animCmd.commandType = CMD_SETTEXTURE; // Panel name pMem = ParseFile(pMem, token, NULL); animCmd.cmdData.runEvent.event = g_ScriptSymbols.AddString(token); // Texture Id pMem = ParseFile(pMem, token, NULL); animCmd.cmdData.runEvent.variable = g_ScriptSymbols.AddString(token); // material name pMem = ParseFile(pMem, token, NULL); animCmd.cmdData.runEvent.variable2 = g_ScriptSymbols.AddString(token); // Set time pMem = ParseFile(pMem, token, NULL); animCmd.cmdData.runEvent.timeDelay = (float)atof(token); } else if ( !stricmp( token, "SetString" )) { animCmd.commandType = CMD_SETSTRING; // Panel name pMem = ParseFile(pMem, token, NULL); animCmd.cmdData.runEvent.event = g_ScriptSymbols.AddString(token); // String variable name pMem = ParseFile(pMem, token, NULL); animCmd.cmdData.runEvent.variable = g_ScriptSymbols.AddString(token); // String value to set pMem = ParseFile(pMem, token, NULL); animCmd.cmdData.runEvent.variable2 = g_ScriptSymbols.AddString(token); // Set time pMem = ParseFile(pMem, token, NULL); animCmd.cmdData.runEvent.timeDelay = (float)atof(token); } else { Warning("Couldn't parse script sequence '%s': expected <anim command>, found '%s'\n", g_ScriptSymbols.String(seq.name), token); return false; } // Look ahead one token for a conditional char *peek = ParseFile(pMem, token, NULL); if ( Q_stristr( token, "[$" ) ) { if ( !EvaluateConditional( token ) ) { seq.cmdList.Remove( cmdIndex ); } pMem = peek; } } if ( bAccepted ) { // Attempt to find a collision in the sequences, replacing the old one if found int seqIterator; for ( seqIterator = 0; seqIterator < m_Sequences.Count()-1; seqIterator++ ) { if ( m_Sequences[seqIterator].name == nameIndex ) { // Get rid of it, we're overriding it m_Sequences.Remove( seqIndex ); break; } } } else { // Dump the entire sequence m_Sequences.Remove( seqIndex ); } // get the next token, if any pMem = ParseFile(pMem, token, NULL); } return true; }
//----------------------------------------------------------------------------- // Purpose: Parse position including right edge and center adjustment out of a // token. This is relative to the screen //----------------------------------------------------------------------------- void AnimationController::SetupPosition( AnimCmdAnimate_t& cmd, float *output, char const *psz, int screendimension ) { bool r = false, c = false; int pos; if ( psz[0] == '(' ) { psz++; if ( Q_strstr( psz, ")" ) ) { char sz[ 256 ]; Q_strncpy( sz, psz, sizeof( sz ) ); char *colon = Q_strstr( sz, ":" ); if ( colon ) { *colon = 0; RelativeAlignment ra = LookupAlignment( sz ); colon++; char *panelName = colon; char *panelEnd = Q_strstr( panelName, ")" ); if ( panelEnd ) { *panelEnd = 0; if ( Q_strlen( panelName ) > 0 ) { // cmd.align.relativePosition = true; cmd.align.alignPanel = g_ScriptSymbols.AddString(panelName); cmd.align.alignment = ra; } } } psz = Q_strstr( psz, ")" ) + 1; } } else if (psz[0] == 'r' || psz[0] == 'R') { r = true; psz++; } else if (psz[0] == 'c' || psz[0] == 'C') { c = true; psz++; } // get the number pos = atoi(psz); // scale the values if (IsProportional()) { pos = vgui::scheme()->GetProportionalScaledValueEx( GetScheme(), pos ); } // adjust the positions if (r) { pos = screendimension - pos; } if (c) { pos = (screendimension / 2) + pos; } // set the value *output = static_cast<float>( pos ); }