Esempio n. 1
0
//---------------------------------------------------------------------------
long SoundSystem::playDigitalSample (unsigned long sampleId, Stuff::Vector3D pos, bool allowDupes)
{
	if (useSound && allowDupes || (!isPlayingSample(sampleId) && !allowDupes))
	{
		if (sampleId >= numSoundBites)
			return(-1);
			
		long ourChannel = findOpenChannel(1,SUPPORT_CHANNEL);
	
		if (ourChannel != -1)
		{
			float distanceVolume = 1.0f;
			float panVolume = 0.0f;
			if (eye && (pos.z != -9999.0f))
			{
				Stuff::Vector3D distance;
				distance.Subtract(eye->getPosition(),pos);
				float dist = distance.GetApproximateLength();
				if (dist < FALLOFF_DISTANCE)
					distanceVolume = (FALLOFF_DISTANCE - dist) / FALLOFF_DISTANCE;
				else
					return -1;		//Do not play sound.  TOO far away!!

				//Figure out where in stereo field to play.
				OppRotate(distance,eye->getRotation().y);

				panVolume = distance.x / (FALLOFF_DISTANCE * 0.5f);
				if (panVolume > 1.0f)
					panVolume = 1.0f;
				else if (panVolume < -1.0f)
					panVolume = -1.0f;
			}

			float vol = sounds[sampleId].volume * distanceVolume;
			if (vol > 1.0f)
				vol = 1.0f;
			else if (vol <= 0.0f)		//No VOlume.  DON't PLAY!
				return -1;

			gosAudio_SetChannelSlider(ourChannel,gosAudio_Panning, panVolume);
			gosAudio_SetChannelSlider(ourChannel,gosAudio_Volume, (digitalMasterVolume * vol * SFXVolume)) ;
			channelSampleId[ourChannel] = sampleId;
			channelInUse[ourChannel] = TRUE;
				
			if (sounds[sampleId].biteData && sounds[sampleId].resourceHandle)
			{
				gosAudio_AssignResourceToChannel( ourChannel, sounds[sampleId].resourceHandle );
				gosAudio_SetChannelPlayMode(ourChannel, gosAudio_PlayOnce);
			}
			
			return(ourChannel);
		}
	}

	return(-1);
}
Esempio n. 2
0
//---------------------------------------------------------------------
long CraterManager::addCrater (long craterType, Stuff::Vector3D &position, float rotation)
{
	if (!useNonWeaponEffects)
		return NO_ERR;

	//----------------------------------------------------------------
	bool drawMe = TRUE;

	if (drawMe)
	{
		craterList[currentCrater].craterShapeId = craterType;
		
		//-----------------------------------------------------------
		// Craters and foot prints are ON the terrain now.
		// Use Elevation Data to move them around.
		// Craters are always 32x32
		// Footprints and always 16x16
		// Rotation of 0 is south.
		float size = 16.0;
		if (craterList[currentCrater].craterShapeId > MAX_FOOTPRINTS)
		{
			size = 32.0;
		}
		
		craterList[currentCrater].position[0].x = -size;
		craterList[currentCrater].position[0].y = -size;
		craterList[currentCrater].position[0].z = 0.0f;

		craterList[currentCrater].position[1].x = size;
		craterList[currentCrater].position[1].y = -size;
		craterList[currentCrater].position[1].z = 0.0f;

		craterList[currentCrater].position[2].x = size;
		craterList[currentCrater].position[2].y = size;
		craterList[currentCrater].position[2].z = 0.0f;
		
		craterList[currentCrater].position[3].x = -size;
		craterList[currentCrater].position[3].y = size;
		craterList[currentCrater].position[3].z = 0.0f;
		
		float cRotation = rotation;

		OppRotate(craterList[currentCrater].position[0],cRotation);
		OppRotate(craterList[currentCrater].position[1],cRotation);
		OppRotate(craterList[currentCrater].position[2],cRotation);
		OppRotate(craterList[currentCrater].position[3],cRotation);
		
		craterList[currentCrater].position[0].Add(craterList[currentCrater].position[0],position);
		craterList[currentCrater].position[1].Add(craterList[currentCrater].position[1],position);
		craterList[currentCrater].position[2].Add(craterList[currentCrater].position[2],position);
		craterList[currentCrater].position[3].Add(craterList[currentCrater].position[3],position);
		
		craterList[currentCrater].position[0].z = land->getTerrainElevation(craterList[currentCrater].position[0]);
		craterList[currentCrater].position[1].z = land->getTerrainElevation(craterList[currentCrater].position[1]);
		craterList[currentCrater].position[2].z = land->getTerrainElevation(craterList[currentCrater].position[2]);
		craterList[currentCrater].position[3].z = land->getTerrainElevation(craterList[currentCrater].position[3]);
		
		currentCrater++;
		if (currentCrater == maxCraters)
		{
			currentCrater = 0;
		}
	}
	
	return(NO_ERR);
}