iw6-scripts/maps/_audio_ambient.gsc
2024-02-13 13:20:49 +01:00

278 lines
6.8 KiB
Plaintext

// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
init_ambient()
{
if ( isdefined( level._audio.ambient ) )
return;
level._audio.ambient = spawnstruct();
level._audio.ambient.thread_active = 0;
level._audio.ambient.current_zone = "";
level._audio.ambient.current = [];
level._audio.ambient.current["zone"] = [];
level._audio.ambient.elem_weights = [];
level._audio.ambient.cached_ambients = [];
level._audio.ambient.cached_elems = [];
level._audio.ambient.max_sound_ents = 15;
level._audio.ambient.sound_ents = [];
}
start_ambient_event_zone( var_0 )
{
start_ambient_event_internal( "zone", var_0 );
}
start_ambient_event_internal( var_0, var_1, var_2, var_3, var_4 )
{
maps\_audio_code::cache_ambient( var_1 );
if ( !isdefined( level._audio.ambient.cached_ambients[var_1] ) )
return;
level._audio.ambient.current_zone = var_1;
if ( !level._audio.ambient.thread_active )
level thread ambient_event_thread();
}
stop_ambient_event_zone( var_0, var_1 )
{
if ( var_0 == "" )
return;
if ( level._audio.ambient.current_zone == var_0 )
{
level._audio.ambient.current_zone = "";
fade_ambient_elems( var_0, var_1 );
}
}
stop_current_ambient()
{
if ( level._audio.ambient.current_zone == "" )
return;
stop_ambient_event_zone( level._audio.ambient.current_zone );
}
stop_all_ambient_events()
{
stop_ambient_event_zone( level._audio.ambient.current_zone );
}
fade_ambient_elems( var_0, var_1 )
{
if ( !isdefined( var_1 ) )
var_1 = 1;
foreach ( var_3 in level._audio.ambient.sound_ents )
{
if ( !isdefined( var_3.ambient ) || var_3.ambient != var_0 )
continue;
var_3 thread fade_ambient_elem_internal( var_1 );
}
}
fade_ambient_elem_internal( var_0 )
{
if ( isdefined( self.fading ) )
return;
self endon( "sounddone" );
self.fading = 1;
thread fade_ambient_elem_reset();
self scalevolume( 0.0, var_0 );
wait( var_0 );
self stopsounds();
self notify( "sounddone" );
}
fade_ambient_elem_reset()
{
self waittill( "sounddone" );
self scalevolume( 1 );
self.fading = undefined;
}
swap_ambient_event_zones( var_0, var_1, var_2, var_3 )
{
swap_ambient_event_zone_internal( var_0, var_1 );
swap_ambient_event_zone_internal( var_2, var_3 );
}
swap_ambient_event_zone_internal( var_0, var_1 )
{
if ( isdefined( var_0 ) && var_0 != "" && var_0 != "none" )
{
if ( var_1 == 0 )
stop_ambient_event_zone( var_0 );
else
start_ambient_event_zone( var_0 );
}
}
ambient_event_thread()
{
level endon( "stop_ambient_event_thread" );
var_0 = "";
level._audio.ambient.thread_active = 1;
for (;;)
{
var_1 = gettime();
if ( level._audio.ambient.current_zone != "" )
{
var_2 = level._audio.ambient.current_zone;
var_3 = level._audio.ambient.cached_ambients[var_2];
if ( isdefined( var_3.serialized ) )
{
if ( !isdefined( var_3.next_play_time ) )
var_3 set_next_play_time( 1 );
if ( var_3.next_play_time <= var_1 )
{
if ( var_3.events.size > 1 )
{
for ( var_4 = var_3 get_random_event(); var_4.elem == var_0; var_4 = var_3 get_random_event() )
wait 0.05;
}
else
var_4 = var_3.events[0];
play_ambient_elem( var_4, var_2 );
if ( level._audio.ambient.current_zone != "" )
{
var_0 = var_4.elem;
var_3 set_next_play_time( 1 );
}
}
}
else
{
foreach ( var_4 in var_3.events )
{
if ( !isdefined( var_4.next_play_time ) )
var_4 set_next_play_time();
if ( var_4.next_play_time <= var_1 )
{
level thread play_ambient_elem( var_4, var_2 );
var_4 set_next_play_time();
}
}
}
}
wait 0.05;
}
}
stop_ambient_event_thread()
{
level notify( "stop_ambient_event_thread" );
level._audio.ambient.thread_active = 0;
}
play_ambient_elem( var_0, var_1 )
{
var_2 = level._audio.ambient.cached_elems[var_0.elem];
play_ambient_elem_oneshot( var_2, var_1 );
}
play_ambient_elem_oneshot( var_0, var_1 )
{
var_2 = var_0["alias"];
var_3 = get_sound_ent();
if ( !isdefined( var_3 ) )
{
maps\_audio_code::debug_println( "^3play_ambient_elem_oneshot cannot play, out of sound ents" );
return;
}
maps\_audio_code::debug_println( "play_ambient_elem_oneshot -- ambient: \"" + var_1 + "\" alias: \"" + var_2 + "\"" );
var_3.ambient = var_1;
var_3.is_playing = 1;
var_4 = get_elem_position( var_0 );
var_3.origin = var_4 + level.player.origin;
var_3 playsound( var_2, "sounddone" );
var_3 waittill( "sounddone" );
wait 0.1;
var_3.ambient = undefined;
var_3.is_playing = 0;
}
get_elem_position( var_0 )
{
var_1 = randomfloatrange( var_0["range"][0], var_0["range"][1] );
var_2 = undefined;
if ( isdefined( var_0["cone"] ) )
var_2 = randomfloatrange( var_0["cone"][0], var_0["cone"][1] );
else
var_2 = randomfloatrange( 0, 360 );
var_3 = anglestoforward( ( 0, var_2, 0 ) ) * var_1;
return ( var_3[0], var_3[1], 0 );
}
set_next_play_time( var_0 )
{
if ( isdefined( var_0 ) )
var_1 = level._audio.ambient.cached_ambients[level._audio.ambient.current_zone].data;
else
var_1 = level._audio.ambient.cached_elems[self.elem];
var_2 = randomfloatrange( var_1["time"][0], var_1["time"][1] );
self.next_play_time = gettime() + var_2 * 1000;
}
get_random_event()
{
var_0 = 0;
foreach ( var_2 in self.events )
var_0 = var_0 + var_2.weight;
var_4 = randomfloat( var_0 );
var_5 = 0;
var_6 = undefined;
foreach ( var_2 in self.events )
{
var_5 = var_5 + var_2.weight;
if ( var_4 < var_5 )
{
var_6 = var_2;
break;
}
}
return var_6;
}
get_sound_ent()
{
foreach ( var_1 in level._audio.ambient.sound_ents )
{
if ( !var_1.is_playing )
return var_1;
}
if ( level._audio.ambient.sound_ents.size < level._audio.ambient.max_sound_ents )
{
var_1 = spawn( "script_origin", ( 0, 0, 0 ) );
var_1.is_playing = 0;
level._audio.ambient.sound_ents[level._audio.ambient.sound_ents.size] = var_1;
return var_1;
}
return undefined;
}