//--------------------------------------------------------------------------- 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); }
//--------------------------------------------------------------------- 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); }