void CStimResponseCollection::Restore(idRestoreGame *savefile)
{
	int num;

	savefile->ReadInt(num);
	m_Stims.SetNum(num);
	for (int i = 0; i < num; i++)
	{
		// Allocate a new stim class (according to the type info)
		int typeInt;
		savefile->ReadInt(typeInt);
		m_Stims[i] = CStimPtr(new CStim(NULL, static_cast<StimType>(typeInt), -1));
		m_Stims[i]->Restore(savefile);
	}

	savefile->ReadInt(num);
	m_Responses.SetNum(num);
	for (int i = 0; i < num; i++)
	{
		// Allocate a new response class (according to the type info)
		int typeInt;
		savefile->ReadInt(typeInt);
		m_Responses[i] = CResponsePtr(new CResponse(NULL, static_cast<StimType>(typeInt), -1));
		m_Responses[i]->Restore(savefile);
	}
}
CStimPtr CStimResponseCollection::GetStimByType( StimType type ) {
	for( int i = 0; i < m_Stims.Num(); ++i ) {
		if( m_Stims[i]->m_StimTypeId == type ) {
			return m_Stims[i];
		}
	}
	return CStimPtr();
}
CStimPtr CStimResponseCollection::CreateStim( idEntity *p_owner, StimType type ) {
	/*	grayman #3462 - undo the following change

		// grayman #2862 - don't create a visual stim for a door that's not marked shouldBeClosed

		if (( type == ST_VISUAL ) &&
			( idStr::Cmp( p_owner->spawnArgs.GetString("AIUse"), AIUSE_DOOR ) == 0 ) &&
			( !p_owner->spawnArgs.GetBool("shouldBeClosed","0" ) ) )
		{
			return CStimPtr(); // null result
		}
	 */
	// Increase the counter to the next ID
	gameLocal.m_HighestSRId++;
	DM_LOG( LC_STIM_RESPONSE, LT_DEBUG )LOGSTRING( "Creating Stim with ID: %d\r", gameLocal.m_HighestSRId );
	DM_LOG( LC_STIM_RESPONSE, LT_DEBUG )LOGSTRING( "Creating CStim\r" );
	return CStimPtr( new CStim( p_owner, type, gameLocal.m_HighestSRId ) );
}