85 lines
No EOL
3 KiB
Text
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); |