//-------------------------------------------------------------------------------------------------- // Name: SetActive // Desc: Sets active status //-------------------------------------------------------------------------------------------------- void CGameEffect::SetActive(bool isActive) { FX_ASSERT_MESSAGE(IsFlagSet(GAME_EFFECT_INITIALISED),"Effect changing active status without being initialised first"); FX_ASSERT_MESSAGE((IsFlagSet(GAME_EFFECT_RELEASED)==false),"Effect changing active status after being released"); SetFlag(GAME_EFFECT_ACTIVE,isActive); GAME_FX_SYSTEM.RegisterEffect(this); // Re-register effect with game effects system }//-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------- // Name: ~CGameEffect // Desc: Destructor //-------------------------------------------------------------------------------------------------- CGameEffect::~CGameEffect() { #if DEBUG_GAME_FX_SYSTEM // Output message if effect hasn't been released before being deleted const bool bEffectIsReleased = (m_flags & GAME_EFFECT_RELEASED) || // -> Needs to be released before deleted !(m_flags & GAME_EFFECT_INITIALISED) || // -> Except when not initialised (gEnv->IsEditor()); // -> Or the editor (memory safely released by editor) if(!bEffectIsReleased) { string dbgMessage = m_debugName + " being destroyed without being released first"; FX_ASSERT_MESSAGE(bEffectIsReleased,dbgMessage.c_str()); } #endif if(CGameEffectsSystem::Exists()) { GAME_FX_SYSTEM.UnRegisterEffect(this); // -> Effect should have been released and been unregistered, but to avoid // crashes call unregister here too } // Unregister as ViewSystem listener (for cut-scenes, ...) if (g_pGame) { IViewSystem *pViewSystem = g_pGame->GetIGameFramework()->GetIViewSystem(); if (pViewSystem) { pViewSystem->RemoveListener(this); } } }//-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------- // Name: UnRegisterEffect // Desc: UnRegisters effect from effect system //-------------------------------------------------------------------------------------------------- void GameSDKCGameEffectsSystem::UnRegisterEffect(GameSDKIGameEffect* effect) { FX_ASSERT_MESSAGE(m_isInitialised,"Game Effects System trying to unregister an effect without being initialised"); FX_ASSERT_MESSAGE(effect,"Trying to UnRegister a NULL effect"); if(effect && effect->IsFlagSet(GAME_EFFECT_REGISTERED)) { // If the effect is the next one to be updated, then point m_nextEffectToUpdate to the next effect after it if(effect == m_nextEffectToUpdate) { m_nextEffectToUpdate = m_nextEffectToUpdate->Next(); } if(effect->Prev()) { effect->Prev()->SetNext(effect->Next()); } else { if(m_effectsToUpdate == effect) { m_effectsToUpdate = effect->Next(); } else { FX_ASSERT_MESSAGE((m_effectsNotToUpdate == effect),"Effect isn't either updating list"); m_effectsNotToUpdate = effect->Next(); } } if(effect->Next()) { effect->Next()->SetPrev(effect->Prev()); } effect->SetNext(NULL); effect->SetPrev(NULL); effect->SetFlag(GAME_EFFECT_REGISTERED,false); } }//-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------- // Name: RegisterEffect // Desc: Registers effect with effect system //-------------------------------------------------------------------------------------------------- void GameSDKCGameEffectsSystem::RegisterEffect(GameSDKIGameEffect* effect) { FX_ASSERT_MESSAGE(m_isInitialised,"Game Effects System trying to register an effect without being initialised"); FX_ASSERT_MESSAGE(effect,"Trying to Register a NULL effect"); if(effect) { // If effect is registered, then unregister first if(effect->IsFlagSet(GAME_EFFECT_REGISTERED)) { UnRegisterEffect(effect); } // Add effect to effect list GameSDKIGameEffect** effectList = NULL; bool isActive = effect->IsFlagSet(GAME_EFFECT_ACTIVE); bool autoUpdatesWhenActive = effect->IsFlagSet(GAME_EFFECT_AUTO_UPDATES_WHEN_ACTIVE); bool autoUpdatesWhenNotActive = effect->IsFlagSet(GAME_EFFECT_AUTO_UPDATES_WHEN_NOT_ACTIVE); if((isActive && autoUpdatesWhenActive) || ((!isActive) && autoUpdatesWhenNotActive)) { effectList = &m_effectsToUpdate; } else { effectList = &m_effectsNotToUpdate; } if(*effectList) { (*effectList)->SetPrev(effect); effect->SetNext(*effectList); } (*effectList) = effect; effect->SetFlag(GAME_EFFECT_REGISTERED,true); } }//-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------- // Name: Destroy // Desc: Destroys effects system //-------------------------------------------------------------------------------------------------- void GameSDKCGameEffectsSystem::Destroy() { if(s_singletonInstance) { s_singletonInstance->AutoReleaseAndDeleteFlaggedEffects(s_singletonInstance->m_effectsToUpdate); s_singletonInstance->AutoReleaseAndDeleteFlaggedEffects(s_singletonInstance->m_effectsNotToUpdate); FX_ASSERT_MESSAGE( (s_singletonInstance->m_effectsToUpdate==NULL) && (s_singletonInstance->m_effectsNotToUpdate==NULL), "Game Effects System being destroyed even though game effects still exist!"); } SAFE_DELETE(s_singletonInstance); }//-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------- // Name: Initialise // Desc: Initialises cvar activation system from data // Uses the xml node name for the cvar, and activeValue attribute // eg <cl_fov activeValue="85"/> //-------------------------------------------------------------------------------------------------- void CCVarActivationSystem::Initialise(const IItemParamsNode* cvarListXmlNode) { if(cvarListXmlNode) { const IItemParamsNode* cvarXmlNode = NULL; SCVarParam* param = NULL; int cvarCount = cvarListXmlNode->GetChildCount(); m_cvarParam.resize(cvarCount); for(int i=0; i<cvarCount; i++) { param = &m_cvarParam[i]; cvarXmlNode = cvarListXmlNode->GetChild(i); param->cvar = gEnv->pConsole->GetCVar(cvarXmlNode->GetName()); FX_ASSERT_MESSAGE(param->cvar,"Failed to find a CVAR for a game effect"); cvarXmlNode->GetAttribute("activeValue",param->activeValue); param->originalValue = 0.0f; } } }//-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------- // Name: Update // Desc: Updates effects system and any effects registered in it's update list //-------------------------------------------------------------------------------------------------- void GameSDKCGameEffectsSystem::Update(float frameTime) { FX_ASSERT_MESSAGE(m_isInitialised,"Game Effects System trying to update without being initialised"); // Get pause state bool isPaused = false; IGame* pGame = gEnv->pGame; if(pGame) { IGameFramework* pGameFramework = pGame->GetIGameFramework(); if(pGameFramework) { isPaused = pGameFramework->IsGamePaused(); } } // Update effects if(m_effectsToUpdate) { GameSDKIGameEffect* effect = m_effectsToUpdate; while(effect) { m_nextEffectToUpdate = effect->Next(); if((!isPaused) || (effect->IsFlagSet(GAME_EFFECT_UPDATE_WHEN_PAUSED))) { SOFTCODE_RETRY(effect,effect->Update(frameTime)); } effect = m_nextEffectToUpdate; } } m_nextEffectToUpdate = NULL; #if DEBUG_GAME_FX_SYSTEM DrawDebugDisplay(); #endif }//-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------- // Name: Update // Desc: Updates game effect //-------------------------------------------------------------------------------------------------- void CGameEffect::Update(float frameTime) { FX_ASSERT_MESSAGE(IsFlagSet(GAME_EFFECT_INITIALISED),"Effect being updated without being initialised first"); FX_ASSERT_MESSAGE((IsFlagSet(GAME_EFFECT_RELEASED)==false),"Effect being updated after being released"); }//-------------------------------------------------------------------------------------------------