Frictional Games Forum (read-only)

Full Version: Ambient sounds
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
ok then... i have seen in some custom stories that people tend to forget to add some ambient sounds like a owl sound in a corner some wind in the back and some wood crakes at the bottom... does eny one knows how to do this? like in a ramdom or ramdom like why?
help please... eny one?
I have random ambient sounds in one of my earlier maps, it isn't HARD to do, but it is a fair bit of code the way I did it. There may be a simpler way, but here's how I did it:

In OnEnter and any checkpoints, I call a timer that calls a function that picks a random number 1-8 (the number of sounds I have it choosing from). Then, I have an if statement for each sound I want it to play corresponding to a particular number. So, if the random number happens to be 4, it will play the sound I designated to 4.

Does that makes sense?
If you want to create a pseudo-random effect, just slapping a few flicker lights (with no light) with a sound-play event and some decent delays might do the trick for simple ambient sounds. But lets say you want to get a real random selection there is a very simple way to do it using an array:
Code:
//Pick an index of snds at random\\
int r = RandInt(0,3);
string[] snds = {"ambience_wind_eerie.snt",
                      "ambience_sewer_drip.snt",
                      "ambience_voice.snt",
                      "ambience_cave.snt"};
string snd = snds[r];
//And play that sound!\\
AddDebugMessage(snd,false);
PlaySoundAtEntity("RandSnd",snd,"Player",0,false);
There is another way you could tackle this, which would perhaps offer a little more flexibility: For example if you wanted a bank of sounds that changed in size, and can be used, changed and the status stored across maps. To do this you would have to use SetGlobalVarString() (or Local if you don't care about the cross map thing), and set yourself up an array as follows:
Code:
//Use at the start of ya game.
AddGlobalVarString("snd0","ambience_wind_eerie.snt");
AddGlobalVarString("snd1","ambience_wind_eerie_no3d.snt");
AddGlobalVarString("snd2","ambience_sewer_drip.snt");
AddGlobalVarString("snd3","ambience_voice.snt");
AddGlobalVarString("snd4","ambience_cave.snt");
AddGlobalVarInt("sndx",4); //Index of the last sound you have.
How to select a sound becomes a little more tricky. As far as i am aware a toString() function isn't accessible, so you have to write you own. But then accessing is still just as easy:
Code:
void playsoundrandom()
{
//Pick an index of the variable size "array" snd.
int r = RandInt(0,GetGlobalVarInt("sndx"));
//If you get an error it is in ^ that or V that line\\
string snd = GetGlobalVarString("snd"+toString(r));
//And play!\\
AddDebugMessage(snd,false);
PlaySoundAtEntity("RandSnd",snd,"Player",0,false);
}

string toString(int value)
     { //Returns string representation of value\\
      string sign = ""; string output=""; int diff=0;
      if(value == 0) {return "0";} else if(value < 0) {value = -value; sign = "-";}
      while(value > 0) {
        diff = value; value /= 10; diff -= value * 10;    
        switch(diff) {
         case 0: {output = "0" + output; break;}
         case 1: {output = "1" + output; break;}
         case 2: {output = "2" + output; break;}
         case 3: {output = "3" + output; break;}
         case 4: {output = "4" + output; break;}
         case 5: {output = "5" + output; break;}
         case 6: {output = "6" + output; break;}
         case 7: {output = "7" + output; break;}
         case 8: {output = "8" + output; break;}
         case 9: {output = "9" + output; break;}
                     } }
       return sign+output;
     } //End of toString()\\
This is quite a little bit more effort obviously, but you have a good range of options there, though unless you are going for something really complex (cross map stuff), one of the top two ways should work a treat with a little tweaking. Remember that you can define arrays OUTSIDE OF FUNCTIONS to make them visible to all the functions for that script file:
Code:
string[] starts = {"hello","how","are","you"};
void function1()
{
AddDebugMessage(starts[0],false);
}
void function2()
{
AddDebugMessage(starts[1],false);
}