boiii-scripts/mp/mp_arena_sound.csc
2023-04-13 17:30:38 +02:00

157 lines
13 KiB
Plaintext

#using scripts\codescripts\struct;
#using scripts\shared\clientfield_shared;
#using scripts\shared\array_shared;
function main()
{
clientfield::register( "world", "arena_announcer_line", 12000, 4, "int", &announcer_line_changed, false, false );
clientfield::register( "world", "arena_fighter", 12000, 2, "int", &fighter_changed, false, false );
clientfield::register( "world", "arena_fighter_line", 12000, 3, "int", &fighter_line_changed, false, false );
clientfield::register( "world", "arena_event", 12000, 3, "int", &event_changed, false, false );
level.arenaAnnouncerLine = 0;
level.arenaFighter = 0;
level.arenaFighterLine = 0;
level.arenaAncrIntro = [];
level.arenaAncrIntro[0] = "vox_ancr_introduce_yellow";
level.arenaAncrIntro[1] = "vox_ancr_introduce_blue";
level.arenaAncrIntro[2] = "vox_ancr_introduce_red";
level.arenaAncrLoser = [];
level.arenaAncrLoser[0] = "vox_ancr_loser_yellow";
level.arenaAncrLoser[1] = "vox_ancr_loser_blue";
level.arenaAncrLoser[2] = "vox_ancr_loser_red";
level.arenaAncrWinner = [];
level.arenaAncrWinner[0] = "vox_ancr_winner_yellow";
level.arenaAncrWinner[1] = "vox_ancr_winner_blue";
level.arenaAncrWinner[2] = "vox_ancr_winner_red";
level.arenaFighterIntro = [];
level.arenaFighterIntro[0] = "vox_ymec_introduce_yellow_resp";
level.arenaFighterIntro[1] = "vox_bmec_introduce_blue_resp";
level.arenaFighterIntro[2] = "vox_rmec_introduce_red_resp";
level.arenaFighterLoser = [];
level.arenaFighterLoser[0] = "vox_ymec_loser_yellow_resp";
level.arenaFighterLoser[1] = "vox_bmec_loser_blue_resp";
level.arenaFighterLoser[2] = "vox_rmec_loser_red_resp";
level.arenaFighterWinner = [];
level.arenaFighterWinner[0] = "vox_ymec_winner_yellow_resp";
level.arenaFighterWinner[1] = "vox_bmec_winner_blue_resp";
level.arenaFighterWinner[2] = "vox_rmec_winner_red_resp";
}
function announcer_line_changed( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
{
level.arenaAnnouncerLine = newVal;
}
function fighter_changed( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
{
level.arenaFighter = newVal;
}
function fighter_line_changed( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
{
level.arenaFighterLine = newVal;
}
function event_changed( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
{
// Don't trigger every time the clientfield changes, just when we advance
// This only works because we always play these events in this order
if ( newVal <= oldVal )
{
return;
}
{wait(.016);}; // Make sure the fighter fields are set
switch( newVal )
{
case 1:
play_line( localClientNum, "vox_ancr_welcome_welcome", level.arenaAnnouncerLine );
break;
case 2:
play_line( localClientNum, level.arenaAncrIntro[level.arenaFighter], level.arenaAnnouncerLine );
wait( 0.8 );
play_line( localClientNum, level.arenaFighterIntro[level.arenaFighter], level.arenaFighterLine );
break;
case 3:
play_line( localClientNum, level.arenaAncrLoser[level.arenaFighter], level.arenaAnnouncerLine );
wait( 0.8 );
play_line( localClientNum, level.arenaFighterLoser[level.arenaFighter], level.arenaFighterLine );
break;
case 4:
play_line( localClientNum, level.arenaAncrWinner[level.arenaFighter], level.arenaAnnouncerLine );
wait( 0.8 );
play_line( localClientNum, level.arenaFighterWinner[level.arenaFighter], level.arenaFighterLine );
break;
}
}
function play_line( localClientNum, alias, line )
{
fullAlias = alias + "_" + line;
playbackId = PlaySound( localClientNum, fullAlias, (1128,0,934) );
thread play_line_delayed_sfx( fullAlias, localClientNum );
if ( !isdefined( playbackId) || playbackId == 0 )
{
return;
}
length = GetKnownLength( playbackId );
while ( SoundPlaying( playbackId ) && !length )
{
wait 0.05;
length = GetKnownLength( playbackId );
}
playLength = MAX( 0, length - ( 3 * 1000 ) );
while ( SoundPlaying( playbackId ) && GetPlaybackTime( playbackId ) < playLength )
{
wait 0.05;
}
}
function play_line_delayed_sfx( fullAlias, localClientNum )
{
a_delayed_speaker [0] = spawn( localClientNum, (3100,1000,934) );
a_delayed_speaker [1] = spawn( localClientNum, (3100,-1000,934) );
a_delayed_speaker [2] = spawn( localClientNum, (-780,-2163,1300) );
a_delayed_speaker [3] = spawn( localClientNum, (-477,1760,1300) );
player = GetLocalPlayer( localClientNum );
a_delayed_speaker_sorted_distance = array::get_all_closest( player.origin, a_delayed_speaker );
wait 0.3;
PlaySound( localClientNum, fullAlias, a_delayed_speaker_sorted_distance[0].origin );
PlaySound( localClientNum, fullAlias, a_delayed_speaker_sorted_distance[2].origin );
wait 0.3;
PlaySound( localClientNum, fullAlias, a_delayed_speaker_sorted_distance[1].origin );
lastSoundPlayed = PlaySound( localClientNum, fullAlias, a_delayed_speaker_sorted_distance[3].origin );
while ( SoundPlaying( lastSoundPlayed ) )
{
wait 0.05;
}
array::thread_all( a_delayed_speaker, &struct::delete );
}