jedi-outcast/code/ff/ff_MultiCompound.cpp

201 lines
3.8 KiB
C++

#include "common_headers.h"
#ifdef _IMMERSION
////------------------
/// MultiCompound::Add
//----------------------
// Insert a single compound effect if it does not already exist.
// Only fails when parameter is NULL.
//
qboolean MultiCompound::Add( MultiEffect *effect )
{
return effect ? ( mSet.insert( effect ), qtrue ) : qfalse;
}
////------------------
/// MultiCompound::Add
//----------------------
// Merge set of compound effects with current set. NULL pointers are excluded.
// Returns false if set contains any NULL pointers.
//
qboolean MultiCompound::Add( Set &effect )
{
qboolean result = qtrue;
for
( Set::iterator itSet = effect.begin()
; itSet != effect.end()
; itSet++
){
result &= Add( *itSet );
}
return result;
}
////--------------------
/// MultiCompound::Start
//------------------------
// Analogous to CImmCompoundEffect::Start. Starts all contained compound effects.
// Returns false if any effect returns false.
//
qboolean MultiCompound::Start()
{
qboolean result = qtrue;
for
( Set::iterator itSet = mSet.begin()
; itSet != mSet.end()
; itSet++
){
result &= (*itSet)->Start();
}
return qboolean
( result
&& mSet.size() != 0
);
}
qboolean MultiCompound::IsPlaying()
{
for
( Set::iterator itSet = mSet.begin()
; itSet != mSet.end()
; itSet++
){
if ( !(*itSet)->IsPlaying() )
return qfalse;
}
return qtrue;
}
////----------------------------
/// MultiCompound::EnsurePlaying
//--------------------------------
// Starts any contained compound effects if they are not currently playing.
// Returns false if any effect returns false or any are playing.
//
qboolean MultiCompound::EnsurePlaying()
{
qboolean result = qtrue;
if ( !IsPlaying() )
{
for
( Set::iterator itSet = mSet.begin()
; itSet != mSet.end()
; itSet++
){
result &= (*itSet)->Start();
}
}
return qboolean
( result
&& mSet.size() != 0
);
}
////-------------------
/// MultiCompound::Stop
//-----------------------
// Analogous to CImmCompoundEffect::Stop. Stops all contained compound effects.
// Returns false if any effect returns false.
//
qboolean MultiCompound::Stop()
{
qboolean result = qtrue;
for
( Set::iterator itSet = mSet.begin()
; itSet != mSet.end()
; itSet++
){
result &= qboolean( (*itSet)->Stop() );
}
return qboolean
( result
&& mSet.size() != 0
);
}
////-----------------------------
/// MultiCompound::ChangeDuration
//---------------------------------
// Changes duration of all compounds.
// Returns false if any effect returns false.
//
qboolean MultiCompound::ChangeDuration( DWORD Duration )
{
qboolean result = qtrue;
for
( Set::iterator itSet = mSet.begin()
; itSet != mSet.end()
; itSet++
){
result &= (*itSet)->ChangeDuration( Duration );
}
return qboolean
( result
&& mSet.size() != 0
);
}
////-------------------------
/// MultiCompound::ChangeGain
//-----------------------------
// Changes gain of all compounds.
// Returns false if any effect returns false.
//
qboolean MultiCompound::ChangeGain( DWORD Gain )
{
qboolean result = qtrue;
for
( Set::iterator itSet = mSet.begin()
; itSet != mSet.end()
; itSet++
){
result &= (*itSet)->ChangeGain( Gain );
}
return qboolean
( result
&& mSet.size() != 0
);
}
////--------------------------
/// MultiCompound::operator ==
//------------------------------
// Returns qtrue if the sets are EXACTLY equal, including order. This is not good
// in general. (Fix me)
//
qboolean MultiCompound::operator == ( MultiCompound &compound )
{
Set &other = compound.mSet;
qboolean result = qfalse;
if ( mSet.size() == other.size() )
{
for
( Set::iterator itSet = mSet.begin(), itOther = other.begin()
; itSet != mSet.end()
//&& itOther != other.end() // assumed since mSet.size() == other.size()
&& (*itSet) == (*itOther)
; itSet++, itOther++
);
result = qboolean( itSet == mSet.end() );
}
return result;
}
#endif // _IMMERSION