1
0
Fork 0
A320-family/Nasal/Effects/thunder-effects.nas
legoboyvdlp R 23dabc4b67 Formatting
2020-10-04 15:25:29 +01:00

85 lines
No EOL
3 KiB
Text

########### Thunder sounds (from c172p) ###################
var clamp = func(v, min, max) { v < min ? min : v > max ? max : v };
var speed_of_sound = func (t, re) {
# Compute speed of sound in m/s
#
# t = temperature in Celsius
# re = amount of water vapor in the air
# Compute virtual temperature using mixing ratio (amount of water vapor)
# Ratio of gas constants of dry air and water vapor: 287.058 / 461.5 = 0.622
var T = 273.15 + t;
var v_T = T * (1 + re/0.622)/(1 + re);
# Compute speed of sound using adiabatic index, gas constant of air,
# and virtual temperature in Kelvin.
return math.sqrt(1.4 * 287.058 * v_T);
};
var thunder_listener = func {
var thunderCalls = 0;
var lightning_pos_x = getprop("/environment/lightning/lightning-pos-x");
var lightning_pos_y = getprop("/environment/lightning/lightning-pos-y");
var lightning_distance = math.sqrt(math.pow(lightning_pos_x, 2) + math.pow(lightning_pos_y, 2));
# On the ground, thunder can be heard up to 16 km. Increase this value
# a bit because the aircraft is usually in the air.
if (lightning_distance > 20000)
return;
var t = getprop("/environment/temperature-degc");
var re = getprop("/environment/relative-humidity") / 100;
var delay_seconds = lightning_distance / speed_of_sound(t, re);
# Maximum volume at 5000 meter
var lightning_distance_norm = std.min(1.0, 1 / math.pow(lightning_distance / 5000.0, 2));
settimer(func {
var thunder1 = getprop("/sim/sound/thunder1");
var thunder2 = getprop("/sim/sound/thunder2");
var thunder3 = getprop("/sim/sound/thunder3");
var thunder4 = getprop("/sim/sound/thunder4");
var vol = getprop("/sim/current-view/internal");
if (!thunder1) {
thunderCalls = 1;
setprop("/sim/sound/dist-thunder1", lightning_distance_norm * vol * 1.75);
}
else if (!thunder2) {
thunderCalls = 2;
setprop("/sim/sound/dist-thunder2", lightning_distance_norm * vol * 1.75);
}
else if (!thunder3) {
thunderCalls = 3;
setprop("/sim/sound/dist-thunder3", lightning_distance_norm * vol * 1.75);
}
else if (!thunder4) {
thunderCalls = 4;
setprop("/sim/sound/dist-thunder4", lightning_distance_norm * vol * 1.75);
}
else
return;
# Play the sound (sound files are about 9 seconds)
play_thunder("thunder" ~ thunderCalls, 9.0, 0);
}, delay_seconds);
};
var play_thunder = func (name, timeout=0.1, delay=0) {
var sound_prop = "/sim/sound/" ~ name;
settimer(func {
# Play the sound
setprop(sound_prop, 1);
# Reset the property after timeout so that the sound can be
# played again.
settimer(func {
setprop(sound_prop, 0);
}, timeout);
}, delay);
};
setlistener("/environment/lightning/lightning-pos-y", thunder_listener);