1 #using scripts\shared\callbacks_shared;
2 #using scripts\shared\music_shared;
3 #using scripts\shared\sound_shared;
4 #using scripts\shared\audio_shared;
5 #using scripts\shared\system_shared;
6 #using scripts\shared\util_shared;
8 #insert scripts\shared\shared.gsh;
10 #using scripts\mp\gametypes\_battlechatter;
11 #using scripts\mp\gametypes\_globallogic_audio;
12 #using scripts\mp\gametypes\_globallogic_utils;
14 #using scripts\codescripts\struct;
16 #using scripts\mp\_util;
18 #namespace globallogic_audio;
33 game[
"music"][
"defeat"] =
"mus_defeat";
34 game[
"music"][
"victory_spectator"] =
"mus_defeat";
35 game[
"music"][
"winning"] =
"mus_time_running_out_winning";
36 game[
"music"][
"losing"] =
"mus_time_running_out_losing";
37 game[
"music"][
"match_end"] =
"mus_match_end";
38 game[
"music"][
"victory_tie"] =
"mus_defeat";
39 game[
"music"][
"spawn_short"] =
"SPAWN_SHORT";
41 game[
"music"][
"suspense"] = [];
42 game[
"music"][
"suspense"][game[
"music"][
"suspense"].size] =
"mus_suspense_01";
43 game[
"music"][
"suspense"][game[
"music"][
"suspense"].size] =
"mus_suspense_02";
44 game[
"music"][
"suspense"][game[
"music"][
"suspense"].size] =
"mus_suspense_03";
45 game[
"music"][
"suspense"][game[
"music"][
"suspense"].size] =
"mus_suspense_04";
46 game[
"music"][
"suspense"][game[
"music"][
"suspense"].size] =
"mus_suspense_05";
47 game[
"music"][
"suspense"][game[
"music"][
"suspense"].size] =
"mus_suspense_06";
51 level.multipleDialogKeys = [];
54 level.multipleDialogKeys[
"enemyAiTank"] =
"enemyAiTankMultiple";
55 level.multipleDialogKeys[
"enemySupplyDrop"] =
"enemySupplyDropMultiple";
56 level.multipleDialogKeys[
"enemyCombatRobot"] =
"enemyCombatRobotMultiple";
57 level.multipleDialogKeys[
"enemyCounterUav"] =
"enemyCounterUavMultiple";
58 level.multipleDialogKeys[
"enemyDart"] =
"enemyDartMultiple";
59 level.multipleDialogKeys[
"enemyEmp"] =
"enemyEmpMultiple";
60 level.multipleDialogKeys[
"enemySentinel"] =
"enemySentinelMultiple";
61 level.multipleDialogKeys[
"enemyMicrowaveTurret"] =
"enemyMicrowaveTurretMultiple";
62 level.multipleDialogKeys[
"enemyRcBomb"] =
"enemyRcBombMultiple";
63 level.multipleDialogKeys[
"enemyPlaneMortar"] =
"enemyPlaneMortarMultiple";
64 level.multipleDialogKeys[
"enemyHelicopterGunner"] =
"enemyHelicopterGunnerMultiple";
65 level.multipleDialogKeys[
"enemyRaps"] =
"enemyRapsMultiple";
66 level.multipleDialogKeys[
"enemyDroneStrike"] =
"enemyDroneStrikeMultiple";
67 level.multipleDialogKeys[
"enemyTurret"] =
"enemyTurretMultiple";
68 level.multipleDialogKeys[
"enemyHelicopter"] =
"enemyHelicopterMultiple";
69 level.multipleDialogKeys[
"enemyUav"] =
"enemyUavMultiple";
70 level.multipleDialogKeys[
"enemySatellite"] =
"enemySatelliteMultiple";
73 level.multipleDialogKeys[
"friendlyAiTank"] =
"";
74 level.multipleDialogKeys[
"friendlySupplyDrop"] =
"";
75 level.multipleDialogKeys[
"friendlyCombatRobot"] =
"";
76 level.multipleDialogKeys[
"friendlyCounterUav"] =
"";
77 level.multipleDialogKeys[
"friendlyDart"] =
"";
78 level.multipleDialogKeys[
"friendlyEmp"] =
"";
79 level.multipleDialogKeys[
"friendlySentinel"] =
"";
80 level.multipleDialogKeys[
"friendlyMicrowaveTurret"] =
"";
81 level.multipleDialogKeys[
"friendlyRcBomb"] =
"";
82 level.multipleDialogKeys[
"friendlyPlaneMortar"] =
"";
83 level.multipleDialogKeys[
"friendlyHelicopterGunner"] =
"";
84 level.multipleDialogKeys[
"friendlyRaps"] =
"";
85 level.multipleDialogKeys[
"friendlyDroneStrike"] =
"";
86 level.multipleDialogKeys[
"friendlyTurret"] =
"";
87 level.multipleDialogKeys[
"friendlyHelicopter"] =
"";
88 level.multipleDialogKeys[
"friendlyUav"] =
"";
89 level.multipleDialogKeys[
"friendlySatellite"] =
"";
94 level.leaderDialog = SpawnStruct();
96 level.leaderDialog.startGameDialog = startGameDialogKey;
97 level.leaderDialog.startHcGameDialog = startHcGameDialogKey;
99 level.leaderDialog.offenseOrderDialog = offenseOrderDialogKey;
100 level.leaderDialog.defenseOrderDialog = defenseOrderDialogKey;
110 if ( !isdefined( winner ) || isPlayer( winner ) )
115 if ( isdefined( level.teams[ winner ] ) )
124 foreach ( team
in level.teams )
135 if( level.gametype ==
"fr" )
142 if ( level.teamBased )
144 if ( isdefined( level.teams[ winner ] ) )
162 foreach( player
in level.players )
170 self.leaderDialogQueue = [];
171 self.currentLeaderDialog = undefined;
173 self.killstreakDialogQueue = [];
174 self.scorestreakDialogPlaying =
false;
176 self notify(
"flush_dialog" );
181 if ( !isdefined( killstreakId ) )
186 for( i =
self.killstreakDialogQueue.size - 1; i >=0; i-- )
188 if ( killstreakId ===
self.killstreakDialogQueue[i].killstreakId )
190 ArrayRemoveIndex(
self.killstreakDialogQueue, i );
197 if ( !isdefined( dialogKey ) ||
198 !isdefined( killstreakType ) )
202 if ( isdefined(
self.currentKillstreakDialog ) )
204 if ( dialogKey ===
self.currentKillstreakDialog.dialogKey &&
205 killstreakType ===
self.currentKillstreakDialog.killstreakType &&
206 killstreakId ===
self.currentKillstreakDialog.killstreakId )
212 for( i = 0; i <
self.killstreakDialogQueue.size; i++ )
214 if ( dialogKey ===
self.killstreakDialogQueue[i].dialogKey &&
215 killstreakType ===
self.killstreakDialogQueue[i].killstreakType &&
216 killstreakType ===
self.killstreakDialogQueue[i].killstreakType )
227 foreach( player
in level.players )
235 if ( !isdefined( objectiveKey ) )
240 for( i =
self.leaderDialogQueue.size - 1; i >=0; i-- )
242 if ( objectiveKey ===
self.leaderDialogQueue[i].objectiveKey )
244 ArrayRemoveIndex(
self.leaderDialogQueue, i );
252 foreach ( player
in level.players )
260 if ( !isdefined( dialogKey ) )
265 for( i =
self.leaderDialogQueue.size - 1; i >=0; i-- )
267 if ( dialogKey ===
self.leaderDialogQueue[i].dialogKey )
269 ArrayRemoveIndex(
self.leaderDialogQueue, i );
281 if ( !isdefined( dialogKey ) )
286 if ( !level.allowAnnouncer )
291 if ( level.gameEnded )
296 newDialog = SpawnStruct();
298 newDialog.dialogKey = dialogKey;
299 newDialog.killstreakType = killstreakType;
300 newDialog.pilotIndex = pilotIndex;
301 newDialog.killstreakId = killstreakId;
303 self.killstreakDialogQueue[
self.killstreakDialogQueue.size] = newDialog;
306 if (
self.killstreakDialogQueue.size > 1 || isdefined(
self.currentKillstreakDialog ) )
313 if (
self.playingDialog ===
true && dialogKey ==
"arrive" )
325 self endon(
"disconnect" );
326 self endon(
"flush_dialog" );
327 level endon(
"game_ended" );
329 while (
self.playingDialog )
339 self endon(
"disconnect" );
340 self endon(
"flush_dialog" );
341 level endon(
"game_ended" );
343 if (
self.killstreakDialogQueue.size == 0 )
345 self.currentKillstreakDialog = undefined;
349 nextDialog =
self.killstreakDialogQueue[0];
351 ArrayRemoveIndex(
self.killstreakDialogQueue, 0 );
353 if ( isdefined(
self.pers[
"mptaacom"] ) )
358 if ( isdefined( taacomBundle ) )
360 if ( isdefined( nextDialog.killstreakType ) )
362 if ( isdefined( nextDialog.pilotIndex ) )
364 pilotArray = taacomBundle.pilotBundles[nextDialog.killstreakType];
366 if ( isdefined( pilotArray ) && nextDialog.pilotIndex < pilotArray.size )
370 if ( isdefined( killstreakBundle ) )
376 else if ( isdefined( level.killstreaks[nextDialog.killstreakType] ) )
378 bundleName = GetStructField( taacomBundle, level.killstreaks[nextDialog.killstreakType].taacomDialogBundleKey );
380 if ( isdefined( bundleName ) )
384 if ( isdefined( killstreakBundle ) )
397 if ( !isdefined( dialogAlias ) )
403 self playLocalSound( dialogAlias );
405 self.currentKillstreakDialog = nextDialog;
412 self endon(
"disconnect" );
413 self endon(
"flush_dialog" );
414 level endon(
"game_ended" );
424 assert( isdefined( skipTeam ) );
426 foreach( team
in level.teams )
428 if ( team != skipTeam )
430 leader_dialog( dialogKey, team, undefined, objectiveKey, killstreakId, dialogBufferKey );
435 function leader_dialog( dialogKey, team, excludeList, objectiveKey, killstreakId, dialogBufferKey )
437 assert( isdefined( level.players ) );
439 foreach ( player
in level.players )
441 if ( !isdefined( player.pers[
"team"] ) )
446 if ( isdefined( team ) && team != player.pers[
"team"] )
462 if ( !isdefined( dialogKey ) )
467 if ( !level.allowAnnouncer )
480 if (
self.leaderDialogQueue.size == 0 &&
481 isdefined(
self.currentLeaderDialog ) &&
482 isdefined( objectiveKey ) &&
483 self.currentLeaderDialog.objectiveKey === objectiveKey &&
484 self.currentLeaderDialog.dialogKey == dialogKey )
490 if ( isdefined( killstreakId ) )
493 foreach( item
in self.leaderDialogQueue )
495 if ( item.dialogKey == dialogKey )
497 item.killstreakIds[item.killstreakIds.size] = killstreakId;
503 if (
self.leaderDialogQueue.size == 0 &&
504 isdefined(
self.currentLeaderDialog ) &&
505 self.currentLeaderDialog.dialogKey == dialogKey )
508 if (
self.currentLeaderDialog.playMultiple ===
true )
517 newItem = SpawnStruct();
520 newItem.dialogKey = dialogKey;
521 newItem.multipleDialogKey = level.multipleDialogKeys[dialogKey];
522 newItem.playMultiple = playMultiple;
523 newItem.objectiveKey = objectiveKey;
525 if( isdefined( killstreakId ) )
527 newItem.killstreakIds = [];
528 newItem.killstreakIds[0] = killstreakId;
531 newItem.dialogBufferKey = dialogBufferKey;
534 itemInserted =
false;
536 if ( isdefined( newItem.priority ) )
538 for ( i = 0; i <
self.leaderDialogQueue.size; i++ )
541 if ( isdefined(
self.leaderDialogQueue[i].priority ) &&
self.leaderDialogQueue[i].priority <= newItem.priority )
546 ArrayInsert(
self.leaderDialogQueue, newItem, i );
554 self.leaderDialogQueue[
self.leaderDialogQueue.size] = newItem;
557 if ( isdefined(
self.currentLeaderDialog ) )
567 self endon(
"disconnect" );
568 self endon(
"flush_dialog" );
569 level endon(
"game_ended" );
571 if (
self.leaderDialogQueue.size == 0 )
573 self.currentLeaderDialog = undefined;
577 nextDialog =
self.leaderDialogQueue[0];
579 ArrayRemoveIndex(
self.leaderDialogQueue, 0 );
581 dialogKey = nextDialog.dialogKey;
583 if ( isdefined( nextDialog.killstreakIds ) )
587 foreach( killstreakId
in nextDialog.killstreakIds )
589 if( isdefined ( level.killstreaks_triggered[ killstreakId ] ) )
596 if ( triggeredCount == 0 )
601 else if ( triggeredCount > 1 || nextDialog.playMultiple ===
true )
604 if( isdefined( level.multipleDialogKeys[ dialogKey ] ) )
606 dialogKey = level.multipleDialogKeys[ dialogKey ];
613 if ( !isdefined( dialogAlias ) )
619 self playLocalSound( dialogAlias );
621 nextDialog.playTime = GetTime();
622 self.currentLeaderDialog = nextDialog;
632 self endon(
"disconnect" );
633 self endon(
"flush_dialog" );
634 level endon(
"game_ended" );
636 wait ( dialogBuffer );
646 case "enemyRemoteMissile":
647 case "enemyRemoteMissileMultiple":
648 case "enemyPlaneMortar":
649 case "enemyPlaneMortarMultiple":
650 case "enemyPlaneMortarUsed":
651 case "enemyDroneStrike":
652 case "enemyDroneStrikeMultiple":
653 case "enemyHelicopterGunner":
654 case "enemyHelicopterGunnerMultiple":
656 case "enemyRapsMultiple":
657 case "enemyCombatRobot":
658 case "enemyCombatRobotMultiple":
659 case "enemyHelicopter":
660 case "enemyHelicopterMultiple":
661 case "enemySentinel":
662 case "enemySentinelMultiple":
664 case "enemyAiTankMultiple":
666 case "enemyDartMultiple":
668 case "enemyTurretMultiple":
669 case "enemyMicrowaveTurret":
670 case "enemyMicrowaveTurretMultiple":
672 case "enemyRcBombMultiple":
678 case "gameLeadTaken":
682 case "roundEncourageLastPlayer":
685 case "ctfFriendlyFlagCaptured":
686 case "ctfFriendlyFlagDropped":
687 case "ctfFriendlyFlagReturned":
688 case "ctfFriendlyFlagTaken":
689 case "ctfEnemyFlagCaptured":
690 case "ctfEnemyFlagDropped":
691 case "ctfEnemyFlagReturned":
692 case "ctfEnemyFlagTaken":
693 case "domFriendlySecuringA":
694 case "domFriendlySecuringB":
695 case "domFriendlySecuringC":
696 case "domFriendlySecuredA":
697 case "domFriendlySecuredB":
698 case "domFriendlySecuredC":
699 case "domFriendlySecuredAll":
703 case "domEnemySecuringA":
704 case "domEnemySecuringB":
705 case "domEnemySecuringC":
706 case "domEnemySecuredA":
707 case "domEnemySecuredB":
708 case "domEnemySecuredC":
710 case "kothContested":
715 case "sfgStartAttack":
716 case "sfgStartDefend":
718 case "sfgStartHrAttack":
719 case "sfgStartHrDefend":
720 case "sfgRobotDisabledAttacker":
721 case "sfgRobotDisabledDefender":
722 case "sfgRobotUnderFire":
723 case "sfgRobotUnderFireNeutral":
724 case "sfgRobotNeedReboot":
725 case "sfgRobotRebootedAttacker":
726 case "sfgRobotRebootedDefender":
727 case "sfgRobotRebootedTowAttacker":
728 case "sfgRobotRebootedTowDefender":
729 case "sfgRobotCloseAttacker":
730 case "sfgRobotCloseDefender":
731 case "sfgTheyReturn":
735 case "bombFriendlyDropped":
736 case "bombFriendlyTaken":
737 case "bombEnemyTaken":
750 case "uplTheyUplink":
751 case "uplWeUplinkRemote":
752 case "uplTheyUplinkRemote":
753 case "uplTransferred":
777 if ( !isdefined(
self.pers[
"mpcommander"] ) )
789 if ( !isdefined( dialogBundle ) || !isdefined( dialogKey ) )
794 dialogAlias = GetStructField( dialogBundle, dialogKey );
796 if ( !isdefined( dialogAlias ) )
801 voicePrefix = GetStructField( dialogBundle,
"voiceprefix" );
803 if ( isdefined( voicePrefix ) )
805 dialogAlias = voicePrefix + dialogAlias;
813 score = game[
"teamScores"][checkTeam];
815 foreach ( team
in level.teams )
817 if ( team != checkTeam )
819 if ( game[
"teamScores"][team] >= score )
831 foreach ( team
in level.teams )
847 assert( isdefined( level.players ) );
849 for ( i = 0; i < level.players.size; i++ )
851 player = level.players[i];
852 if ( isdefined( player.pers[
"team"] ) && (player.pers[
"team"] == team ) )
854 player playLocalSound( alias );
864 return "roundHalftime";
866 return "roundOvertime";
868 return "roundSwitchSides";
874 level waittill (
"game_ended" );
876 level waittill (
"sfade" );
882 level endon (
"game_ended" );
884 level waittill (
"match_ending_soon" );
888 if( level.teamBased )
896 level waittill (
"match_ending_very_soon" );
898 foreach ( team
in level.teams )
905 level waittill (
"match_ending_vox" );
943 if( game[
"roundsplayed" ] == 0 )
945 game[
"musicSet" ] = randomintrange(1,8);
946 if( game[
"musicSet" ] <= 9 )
948 game[
"musicSet" ] =
"0"+game[
"musicSet" ];
950 game[
"musicSet" ] =
"_"+game[
"musicSet" ];
954 game[
"musicSet" ] =
"";
961 level waittill(
"game_ended" );
963 unlockName = undefined;
965 switch(game[
"musicSet" ])
968 unlockName =
"mus_dystopia_intro";
971 unlockName =
"mus_filter_intro";
974 unlockName =
"mus_immersion_intro";
977 unlockName =
"mus_ruin_intro";
980 unlockName =
"mus_cod_bites_intro";
984 if( isdefined( unlockName ) )
992 level endon(
"game_ended" );
993 level endon(
"musicEndingOverride" );
995 level waittill (
"match_ending_very_soon" );
997 if( isdefined( level.gametype ) && level.gametype ==
"sd" )
1004 level endon(
"game_ended" );
1005 level endon(
"match_ending_soon" );
1006 level endon(
"match_ending_very_soon" );
1008 level waittill(
"sndMusicHalfway" );
1014 level endon(
"game_ended" );
1015 level endon(
"match_ending_soon" );
1016 level endon(
"match_ending_very_soon" );
1017 level endon(
"sndMusicHalfway" );
1019 if( !isdefined( level.timeLimit ) || level.timeLimit == 0 )
1022 halfway = (level.timeLimit*60)*.5;
1027 if( timeLeft <= halfway )
1029 level notify(
"sndMusicHalfway" );
1036 function set_music_on_team( state, team =
"both", wait_time = 0, save_state =
false, return_state =
false )
1039 assert( isdefined( level.players ) );
1041 foreach( player
in level.players )
1043 if ( team ==
"both" )
1047 else if ( isdefined( player.pers[
"team"] ) && (player.pers[
"team"] == team ) )
1055 self endon(
"disconnect" );
1057 assert( isplayer (
self) );
1059 if ( !isdefined( state ) )
1064 if( !isdefined( game[
"musicSet" ] ) )
1069 music::setmusicstate( state+game[
"musicSet" ],
self );
1073 if ( !isdefined( state ) )
1078 if( !isdefined( game[
"musicSet" ] ) )
1083 music::setmusicstate( state+game[
"musicSet" ] );