‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
_globallogic_audio.gsc
Go to the documentation of this file.
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;
7 
8 #insert scripts\shared\shared.gsh;
9 
10 #using scripts\mp\gametypes\_battlechatter;
11 #using scripts\mp\gametypes\_globallogic_audio;
12 #using scripts\mp\gametypes\_globallogic_utils;
13 
14 #using scripts\codescripts\struct;
15 
16 #using scripts\mp\_util;
17 
18 #namespace globallogic_audio;
19 
20 ‪REGISTER_SYSTEM( "globallogic_audio", &‪__init__, undefined )
21 
22 function ‪__init__()
23 {
25 
26  level.playLeaderDialogOnPlayer = &‪leader_dialog_on_player;
27  level.playEquipmentDestroyedOnPlayer = &‪play_equipment_destroyed_on_player;
28  level.playEquipmentHackedOnPlayer = &‪play_equipment_hacked_on_player;
29 }
30 
31 function ‪init()
32 {
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";
40 
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";
48 
49  level thread ‪post_match_snapshot_watcher();
50 
51  level.multipleDialogKeys = [];
52 
53  // Play 'multiple incoming' lines for these
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";
71 
72  // Skip these
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"] = "";
90 }
91 
92 function ‪set_leader_gametype_dialog( startGameDialogKey, startHcGameDialogKey, offenseOrderDialogKey, defenseOrderDialogKey )
93 {
94  level.leaderDialog = SpawnStruct();
95 
96  level.leaderDialog.startGameDialog = startGameDialogKey;
97  level.leaderDialog.startHcGameDialog = startHcGameDialogKey;
98 
99  level.leaderDialog.offenseOrderDialog = offenseOrderDialogKey;
100  level.leaderDialog.defenseOrderDialog = defenseOrderDialogKey;
101 }
102 
104 {
105  if ( ‪delay > 0 )
106  {
107  wait ‪delay;
108  }
109 
110  if ( !isdefined( winner ) || isPlayer( winner ) )
111  {
112  return;
113  }
114 
115  if ( isdefined( level.teams[ winner ] ) )
116  {
117  //thread sound::play_on_players( "mus_round_win"+"_"+level.teamPostfix[winner] );
118  //thread sound::play_on_players( "mus_round_loss"+"_"+level.teamPostfix[team] );
119  ‪leader_dialog( "roundEncourageWon", winner );
120  ‪leader_dialog_for_other_teams( "roundEncourageLost", winner );
121  }
122  else
123  {
124  foreach ( team in level.teams )
125  {
126  thread ‪sound::play_on_players( "mus_round_draw"+"_"+level.teamPostfix[team] );
127  }
128  ‪leader_dialog( "roundDraw" );
129  }
130 }
131 
132 
133 function ‪announce_game_winner( winner )
134 {
135  if( level.gametype == "fr" )
136  {
137  return;
138  }
139 
140  wait ( ‪battlechatter::mpdialog_value( "announceWinnerDelay", 0 ) );
141 
142  if ( level.teamBased )
143  {
144  if ( isdefined( level.teams[ winner ] ) )
145  {
146  ‪leader_dialog( "gameWon", winner );
147  ‪leader_dialog_for_other_teams( "gameLost", winner );
148  }
149  else
150  {
151  ‪leader_dialog( "gameDraw" );
152  }
153 
154  wait( ‪battlechatter::mpdialog_value( "commanderDialogBuffer", 0 ) );
155  }
156 
158 }
159 
160 function ‪flush_dialog()
161 {
162  foreach( player in level.players )
163  {
164  player ‪flush_dialog_on_player();
165  }
166 }
167 
169 {
170  self.leaderDialogQueue = [];
171  self.currentLeaderDialog = undefined;
172 
173  self.killstreakDialogQueue = [];
174  self.scorestreakDialogPlaying = false;
175 
176  self notify( "flush_dialog" );
177 }
178 
179 function ‪flush_killstreak_dialog_on_player( killstreakId )
180 {
181  if ( !isdefined( killstreakId ) )
182  {
183  return;
184  }
185 
186  for( i = self.killstreakDialogQueue.size - 1; i >=0; i-- )
187  {
188  if ( killstreakId === self.killstreakDialogQueue[i].killstreakId )
189  {
190  ArrayRemoveIndex( self.killstreakDialogQueue, i );
191  }
192  }
193 }
194 
195 function ‪killstreak_dialog_queued( dialogKey, killstreakType, killstreakId )
196 {
197  if ( !isdefined( dialogKey ) ||
198  !isdefined( killstreakType ) )
199  {
200  return;
201  }
202  if ( isdefined( self.currentKillstreakDialog ) )
203  {
204  if ( dialogKey === self.currentKillstreakDialog.dialogKey &&
205  killstreakType === self.currentKillstreakDialog.killstreakType &&
206  killstreakId === self.currentKillstreakDialog.killstreakId )
207  {
208  return true;
209  }
210  }
211 
212  for( i = 0; i < self.killstreakDialogQueue.size; i++ )
213  {
214  if ( dialogKey === self.killstreakDialogQueue[i].dialogKey &&
215  killstreakType === self.killstreakDialogQueue[i].killstreakType &&
216  killstreakType === self.killstreakDialogQueue[i].killstreakType )
217  {
218  return true;
219  }
220  }
221 
222  return false;
223 }
224 
225 function ‪flush_objective_dialog( objectiveKey )
226 {
227  foreach( player in level.players )
228  {
229  player ‪flush_objective_dialog_on_player( objectiveKey );
230  }
231 }
232 
233 function ‪flush_objective_dialog_on_player( objectiveKey )
234 {
235  if ( !isdefined( objectiveKey ) )
236  {
237  return;
238  }
239 
240  for( i = self.leaderDialogQueue.size - 1; i >=0; i-- )
241  {
242  if ( objectiveKey === self.leaderDialogQueue[i].objectiveKey )
243  {
244  ArrayRemoveIndex( self.leaderDialogQueue, i );
245  break; // There should never be more than one objective key of a given type
246  }
247  }
248 }
249 
250 function ‪flush_leader_dialog_key( dialogKey )
251 {
252  foreach ( player in level.players )
253  {
254  player ‪flush_leader_dialog_key_on_player( dialogKey );
255  }
256 }
257 
259 {
260  if ( !isdefined( dialogKey ) )
261  {
262  return;
263  }
264 
265  for( i = self.leaderDialogQueue.size - 1; i >=0; i-- )
266  {
267  if ( dialogKey === self.leaderDialogQueue[i].dialogKey )
268  {
269  ArrayRemoveIndex( self.leaderDialogQueue, i );
270  }
271  }
272 }
273 
274 function ‪play_taacom_dialog( dialogKey, killstreakType, killstreakId )
275 {
276  self ‪killstreak_dialog_on_player( dialogKey, killstreakType, killstreakId );
277 }
278 
279 function ‪killstreak_dialog_on_player( dialogKey, killstreakType, killstreakId, pilotIndex )
280 {
281  if ( !isdefined( dialogKey ) )
282  {
283  return;
284  }
285 
286  if ( !level.allowAnnouncer )
287  {
288  return;
289  }
290 
291  if ( level.gameEnded )
292  {
293  return;
294  }
295 
296  newDialog = SpawnStruct();
297 
298  newDialog.dialogKey = dialogKey;
299  newDialog.killstreakType = killstreakType;
300  newDialog.pilotIndex = pilotIndex;
301  newDialog.killstreakId = killstreakId;
302 
303  self.killstreakDialogQueue[self.killstreakDialogQueue.size] = newDialog;
304 
305  // Queue is already in motion
306  if ( self.killstreakDialogQueue.size > 1 || isdefined( self.currentKillstreakDialog ) )
307  {
308  return;
309  }
310 
311  // HACK: Don't start up the killstreak queue with taacom dialog while the player is speaking
312  // Keeps the request and arrival lines from getting jumbled up in quiet moments
313  if ( self.playingDialog === true && dialogKey == "arrive" )
314  {
315  self thread ‪wait_for_player_dialog();
316  }
317  else
318  {
319  self thread ‪play_next_killstreak_dialog();
320  }
321 }
322 
324 {
325  self endon( "disconnect" );
326  self endon( "flush_dialog" );
327  level endon( "game_ended" );
328 
329  while ( self.playingDialog )
330  {
331  wait( 0.5 );
332  }
333 
334  self thread ‪play_next_killstreak_dialog();
335 }
336 
338 {
339  self endon( "disconnect" );
340  self endon( "flush_dialog" );
341  level endon( "game_ended" );
342 
343  if ( self.killstreakDialogQueue.size == 0 )
344  {
345  self.currentKillstreakDialog = undefined;
346  return;
347  }
348 
349  nextDialog = self.killstreakDialogQueue[0];
350 
351  ArrayRemoveIndex( self.killstreakDialogQueue, 0 );
352 
353  if ( isdefined( self.pers["mptaacom"] ) )
354  {
355  taacomBundle = ‪struct::get_script_bundle( "mpdialog_taacom", self.pers["mptaacom"] );
356  }
357 
358  if ( isdefined( taacomBundle ) )
359  {
360  if ( isdefined( nextDialog.killstreakType ) )
361  {
362  if ( isdefined( nextDialog.pilotIndex ) )
363  {
364  pilotArray = taacomBundle.pilotBundles[nextDialog.killstreakType];
365 
366  if ( isdefined( pilotArray ) && nextDialog.pilotIndex < pilotArray.size )
367  {
368  killstreakBundle = ‪struct::get_script_bundle( "mpdialog_scorestreak", pilotArray[nextDialog.pilotIndex] );
369 
370  if ( isdefined( killstreakBundle ) )
371  {
372  dialogAlias = ‪globallogic_audio::get_dialog_bundle_alias( killstreakBundle, nextDialog.dialogKey );
373  }
374  }
375  }
376  else if ( isdefined( level.killstreaks[nextDialog.killstreakType] ) )
377  {
378  bundleName = GetStructField( taacomBundle, level.killstreaks[nextDialog.killstreakType].taacomDialogBundleKey );
379 
380  if ( isdefined( bundleName ) )
381  {
382  killstreakBundle = ‪struct::get_script_bundle( "mpdialog_scorestreak", bundleName );
383 
384  if ( isdefined( killstreakBundle ) )
385  {
386  dialogAlias = self ‪globallogic_audio::get_dialog_bundle_alias( killstreakBundle, nextDialog.dialogKey );
387  }
388  }
389  }
390  }
391  else
392  {
393  dialogAlias = self ‪globallogic_audio::get_dialog_bundle_alias( taacomBundle, nextDialog.dialogKey );
394  }
395  }
396 
397  if ( !isdefined( dialogAlias ) )
398  {
400  return;
401  }
402 
403  self playLocalSound( dialogAlias );
404 
405  self.currentKillstreakDialog = nextDialog;
406 
407  self thread ‪wait_next_killstreak_dialog();
408 }
409 
411 {
412  self endon( "disconnect" );
413  self endon( "flush_dialog" );
414  level endon( "game_ended" );
415 
416  wait ( ‪battlechatter::mpdialog_value( "killstreakDialogBuffer", 0 ) );
417 
418  self thread ‪play_next_killstreak_dialog();
419 }
420 
421 
422 function ‪leader_dialog_for_other_teams( dialogKey, skipTeam, objectiveKey, killstreakId, dialogBufferKey )
423 {
424  assert( isdefined( skipTeam ) );
425 
426  foreach( team in level.teams )
427  {
428  if ( team != skipTeam )
429  {
430  ‪leader_dialog( dialogKey, team, undefined, objectiveKey, killstreakId, dialogBufferKey );
431  }
432  }
433 }
434 
435 function ‪leader_dialog( dialogKey, team, excludeList, objectiveKey, killstreakId, dialogBufferKey )
436 {
437  assert( isdefined( level.players ) );
438 
439  foreach ( player in level.players )
440  {
441  if ( !isdefined( player.pers["team"] ) )
442  {
443  continue;
444  }
445 
446  if ( isdefined( team ) && team != player.pers["team"] )
447  {
448  continue;
449  }
450 
451  if ( isdefined( excludeList ) && ‪globallogic_utils::isExcluded( player, excludeList ) )
452  {
453  continue;
454  }
455 
456  player ‪leader_dialog_on_player( dialogKey, objectiveKey, killstreakId, dialogBufferKey );
457  }
458 }
459 
460 function ‪leader_dialog_on_player( dialogKey, objectiveKey, killstreakId, dialogBufferKey, introDialog )
461 {
462  if ( !isdefined( dialogKey ) )
463  {
464  return;
465  }
466 
467  if ( !level.allowAnnouncer )
468  {
469  return;
470  }
471 
472  if ( !‪IS_TRUE( self.playLeaderDialog ) && !‪IS_TRUE( introDialog ) )
473  {
474  return;
475  }
476 
477  self ‪flush_objective_dialog_on_player( objectiveKey );
478 
479  // Don't queue up the same objective dialog that is currently playing
480  if ( self.leaderDialogQueue.size == 0 &&
481  isdefined( self.currentLeaderDialog ) &&
482  isdefined( objectiveKey ) &&
483  self.currentLeaderDialog.objectiveKey === objectiveKey &&
484  self.currentLeaderDialog.dialogKey == dialogKey )
485  {
486  return;
487  }
488 
489  // Multiple enemy scorestreak conversion
490  if ( isdefined( killstreakId ) )
491  {
492  // Look for an already queued item
493  foreach( item in self.leaderDialogQueue )
494  {
495  if ( item.dialogKey == dialogKey )
496  {
497  item.killstreakIds[item.killstreakIds.size] = killstreakId;
498  return;
499  }
500  }
501 
502  // Flag the new item to play multiple if it's playing up against the current dialog
503  if ( self.leaderDialogQueue.size == 0 &&
504  isdefined( self.currentLeaderDialog ) &&
505  self.currentLeaderDialog.dialogKey == dialogKey )
506  {
507  // We're already playing a multiple so just skip this new one
508  if ( self.currentLeaderDialog.playMultiple === true )
509  {
510  return;
511  }
512 
513  playMultiple = true;
514  }
515  }
516 
517  newItem = SpawnStruct();
518 
519  newItem.priority = ‪dialogkey_priority( dialogKey );
520  newItem.dialogKey = dialogKey;
521  newItem.multipleDialogKey = level.multipleDialogKeys[dialogKey];
522  newItem.playMultiple = playMultiple;
523  newItem.objectiveKey = objectiveKey;
524 
525  if( isdefined( killstreakId ) )
526  {
527  newItem.killstreakIds = [];
528  newItem.killstreakIds[0] = killstreakId;
529  }
530 
531  newItem.dialogBufferKey = dialogBufferKey;
532  // TODO: Add Expiration time
533 
534  itemInserted = false;
535 
536  if ( isdefined( newItem.priority ) )
537  {
538  for ( i = 0; i < self.leaderDialogQueue.size; i++ )
539  {
540  // Lower number = higher priority
541  if ( isdefined( self.leaderDialogQueue[i].priority ) && self.leaderDialogQueue[i].priority <= newItem.priority )
542  {
543  continue;
544  }
545 
546  ArrayInsert( self.leaderDialogQueue, newItem, i );
547  itemInserted = true;
548  break;
549  }
550  }
551 
552  if ( !itemInserted )
553  {
554  self.leaderDialogQueue[self.leaderDialogQueue.size] = newItem;
555  }
556 
557  if ( isdefined( self.currentLeaderDialog ) )
558  {
559  return;
560  }
561 
562  self thread ‪play_next_leader_dialog();
563 }
564 
566 {
567  self endon( "disconnect" );
568  self endon( "flush_dialog" );
569  level endon( "game_ended" );
570 
571  if ( self.leaderDialogQueue.size == 0 )
572  {
573  self.currentLeaderDialog = undefined;
574  return;
575  }
576 
577  nextDialog = self.leaderDialogQueue[0];
578 
579  ArrayRemoveIndex( self.leaderDialogQueue, 0 );
580 
581  dialogKey = nextDialog.dialogKey;
582 
583  if ( isdefined( nextDialog.killstreakIds ) )
584  {
585  triggeredCount = 0;
586 
587  foreach( killstreakId in nextDialog.killstreakIds )
588  {
589  if( isdefined ( level.killstreaks_triggered[ killstreakId ] ) )
590  {
591  triggeredCount++;
592  }
593  }
594 
595  // No active scorestreaks for this item, don't play it
596  if ( triggeredCount == 0 )
597  {
598  self thread ‪play_next_leader_dialog();
599  return;
600  }
601  else if ( triggeredCount > 1 || nextDialog.playMultiple === true )
602  {
603  // Found more than one, or we want to play the multiple for some reason
604  if( isdefined( level.multipleDialogKeys[ dialogKey ] ) )
605  {
606  dialogKey = level.multipleDialogKeys[ dialogKey ];
607  }
608  }
609  }
610 
611  dialogAlias = self ‪get_commander_dialog_alias( dialogKey );
612 
613  if ( !isdefined( dialogAlias ) )
614  {
615  self thread ‪play_next_leader_dialog();
616  return;
617  }
618 
619  self playLocalSound( dialogAlias );
620 
621  nextDialog.playTime = GetTime();
622  self.currentLeaderDialog = nextDialog;
623 
624  // Get the provided buffer, default buffer, or 0
625  dialogBuffer = ‪battlechatter::mpdialog_value( nextDialog.dialogBufferKey, ‪battlechatter::mpdialog_value( "commanderDialogBuffer", 0 ) );
626 
627  self thread ‪wait_next_leader_dialog( dialogBuffer );
628 }
629 
630 function ‪wait_next_leader_dialog( dialogBuffer )
631 {
632  self endon( "disconnect" );
633  self endon( "flush_dialog" );
634  level endon( "game_ended" );
635 
636  wait ( dialogBuffer );
637 
638  self thread ‪play_next_leader_dialog();
639 }
640 
641 function ‪dialogkey_priority( dialogKey )
642 {
643  switch( dialogKey )
644  {
645  // Lethal enemy killstreaks
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":
655  case "enemyRaps":
656  case "enemyRapsMultiple":
657  case "enemyCombatRobot":
658  case "enemyCombatRobotMultiple":
659  case "enemyHelicopter":
660  case "enemyHelicopterMultiple":
661  case "enemySentinel":
662  case "enemySentinelMultiple":
663  case "enemyAiTank":
664  case "enemyAiTankMultiple":
665  case "enemyDart":
666  case "enemyDartMultiple":
667  case "enemyTurret":
668  case "enemyTurretMultiple":
669  case "enemyMicrowaveTurret":
670  case "enemyMicrowaveTurretMultiple":
671  case "enemyRcBomb":
672  case "enemyRcBombMultiple":
673  return 1;
674  // Score announcments
675  case "gameLosing":
676  case "gameWinning":
677  case "gameLeadLost":
678  case "gameLeadTaken":
679  case "nearWinning":
680  case "nearDrawing":
681  case "nearLosing":
682  case "roundEncourageLastPlayer":
683  return 1;
684  // Game Events
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":
700  case "domEnemyHasA":
701  case "domEnemyHasB":
702  case "domEnemyHasC":
703  case "domEnemySecuringA":
704  case "domEnemySecuringB":
705  case "domEnemySecuringC":
706  case "domEnemySecuredA":
707  case "domEnemySecuredB":
708  case "domEnemySecuredC":
709  case "kothCaptured":
710  case "kothContested":
711  case "kothLocated":
712  case "kothLost":
713  case "kothOnline":
714  case "kothSecured":
715  case "sfgStartAttack":
716  case "sfgStartDefend":
717  case "sfgStartTow":
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":
732  case "sfgWeReturn":
733  case "bombDefused":
734  case "bombPlanted":
735  case "bombFriendlyDropped":
736  case "bombFriendlyTaken":
737  case "bombEnemyTaken":
738  case "hubOnline":
739  case "hubOffline":
740  case "hubsOnline":
741  case "hubsOffline":
742  case "hubMoved":
743  case "hubsMoved":
744  case "uplOrders":
745  case "uplWeTake":
746  case "uplTheyTake":
747  case "uplTheyDrop":
748  case "uplWeDrop":
749  case "uplWeUplink":
750  case "uplTheyUplink":
751  case "uplWeUplinkRemote":
752  case "uplTheyUplinkRemote":
753  case "uplTransferred":
754  case "uplReset":
755  return 1;
756  }
757 
758  return undefined;
759 }
760 
761 // Commander callbacks
762 
764 {
765  self ‪play_taacom_dialog( "equipmentDestroyed" );
766 }
767 
769 {
770  self ‪play_taacom_dialog( "equipmentHacked" );
771 }
772 
773 // Alias Lookups
774 
775 function ‪get_commander_dialog_alias( dialogKey )
776 {
777  if ( !isdefined( self.pers["mpcommander"] ) )
778  {
779  return undefined;
780  }
781 
782  commanderBundle = ‪struct::get_script_bundle( "mpdialog_commander", self.pers["mpcommander"] );
783 
784  return ‪get_dialog_bundle_alias( commanderBundle, dialogKey );
785 }
786 
787 function ‪get_dialog_bundle_alias( dialogBundle, dialogKey )
788 {
789  if ( !isdefined( dialogBundle ) || !isdefined( dialogKey ) )
790  {
791  return undefined;
792  }
793 
794  dialogAlias = GetStructField( dialogBundle, dialogKey );
795 
796  if ( !isdefined( dialogAlias ) )
797  {
798  return;
799  }
800 
801  voicePrefix = GetStructField( dialogBundle, "voiceprefix" );
802 
803  if ( isdefined( voicePrefix ) )
804  {
805  dialogAlias = voicePrefix + dialogAlias;
806  }
807 
808  return dialogAlias;
809 }
810 
811 function ‪is_team_winning( checkTeam )
812 {
813  score = game["teamScores"][checkTeam];
814 
815  foreach ( team in level.teams )
816  {
817  if ( team != checkTeam )
818  {
819  if ( game["teamScores"][team] >= score )
820  {
821  return false;
822  }
823  }
824  }
825 
826  return true;
827 }
828 
830 {
831  foreach ( team in level.teams )
832  {
833  if ( ‪is_team_winning( team ) )
834  {
835  ‪leader_dialog( "gameWinning", team );
836  ‪leader_dialog_for_other_teams( "gameLosing", team );
837  return true;
838  }
839  }
840 
841  return false;
842 }
843 
844 
845 function ‪play_2d_on_team( alias, team )
846 {
847  assert( isdefined( level.players ) );
848 
849  for ( i = 0; i < level.players.size; i++ )
850  {
851  player = level.players[i];
852  if ( isdefined( player.pers["team"] ) && (player.pers["team"] == team ) )
853  {
854  player playLocalSound( alias );
855  }
856  }
857 }
858 
859 function ‪get_round_switch_dialog( switchType )
860 {
861  switch( switchType )
862  {
863  case "halftime":
864  return "roundHalftime";
865  case "overtime":
866  return "roundOvertime";
867  default:
868  return "roundSwitchSides";
869  }
870 }
871 //Eckert - does a 2 stage sound fade out during and after AAR
873 {
874  level waittill ( "game_ended" );
875  level ‪util::clientNotify( "pm" );
876  level waittill ( "sfade" );
877  level ‪util::clientNotify( "pmf" );
878 }
879 
881 {
882  level endon ( "game_ended" );
883 
884  level waittill ( "match_ending_soon" );
885 
887  {
888  if( level.teamBased )
889  {
891  {
892  ‪leader_dialog( "min_draw" );
893  }
894  }
895 
896  level waittill ( "match_ending_very_soon" );
897 
898  foreach ( team in level.teams )
899  {
900  ‪leader_dialog( "roundTimeWarning", team, undefined, undefined );
901  }
902  }
903  else
904  {
905  level waittill ( "match_ending_vox" );
906 
907  ‪leader_dialog( "roundTimeWarning" );
908  }
909 }
910 
911 /*------------------------------------------------------------------------------------------------------
912  *------------------------------------------------------------------------------------------------------
913  *----------------------------------------MUSIC SYSTEM SCRIPTS------------------------------------------
914  *------------------------------------------------------------------------------------------------------
915  *------------------------------------------------------------------------------------------------------
916  */
917 
918 /*
919  * spawnPreLoop
920  * spawnPreRise
921  * spawnFull
922  * spawnShort
923  * RandomOneshot
924  * timeOut
925  * roundEnd
926  * roundSwitch
927  * matchWin
928  * matchLose
929  * matchDraw
930  * silent*
931  * endgame
932  */
933 
935 {
936  level thread ‪sndMusicTimesOut();
937  level thread ‪sndMusicHalfway();
938  level thread ‪sndMusicTimeLimitWatcher();
939  level thread ‪sndMusicUnlock();
940 }
942 {
943  if( game[ "roundsplayed" ] == 0 )
944  {
945  game[ "musicSet" ] = randomintrange(1,8);
946  if( game[ "musicSet" ] <= 9 )
947  {
948  game[ "musicSet" ] = "0"+game[ "musicSet" ];
949  }
950  game[ "musicSet" ] = "_"+game[ "musicSet" ];
951 
952  if( ‪IS_TRUE(level.freerun))
953  {
954  game[ "musicSet" ] = "";
955  }
956  }
957 }
958 
960 {
961  level waittill( "game_ended" );
962 
963  unlockName = undefined;
964 
965  switch(game[ "musicSet" ])
966  {
967  case "_01":
968  unlockName = "mus_dystopia_intro";
969  break;
970  case "_02":
971  unlockName = "mus_filter_intro";
972  break;
973  case "_03":
974  unlockName = "mus_immersion_intro";
975  break;
976  case "_04":
977  unlockName = "mus_ruin_intro";
978  break;
979  case "_05":
980  unlockName = "mus_cod_bites_intro";
981  break;
982  }
983 
984  if( isdefined( unlockName ) )
985  {
986  level thread ‪audio::unlockFrontendMusic(unlockName);
987  }
988 }
989 
991 {
992  level endon( "game_ended" );
993  level endon( "musicEndingOverride" );
994 
995  level waittill ( "match_ending_very_soon" );
996 
997  if( isdefined( level.gametype ) && level.gametype == "sd" )
998  level thread ‪set_music_on_team( "timeOutQuiet" );
999  else
1000  level thread ‪set_music_on_team( "timeOut" );
1001 }
1003 {
1004  level endon( "game_ended" );
1005  level endon( "match_ending_soon" );
1006  level endon( "match_ending_very_soon" );
1007 
1008  level waittill( "sndMusicHalfway" );
1009 
1010  level thread ‪set_music_on_team( "underscore" );
1011 }
1013 {
1014  level endon( "game_ended" );
1015  level endon( "match_ending_soon" );
1016  level endon( "match_ending_very_soon" );
1017  level endon( "sndMusicHalfway" );
1018 
1019  if( !isdefined( level.timeLimit ) || level.timeLimit == 0 )
1020  return;
1021 
1022  halfway = (level.timeLimit*60)*.5;
1023 
1024  while(1)
1025  {
1026  timeLeft = ‪globallogic_utils::getTimeRemaining() / 1000;
1027  if( timeLeft <= halfway )
1028  {
1029  level notify( "sndMusicHalfway" );
1030  return;
1031  }
1032  wait(2);
1033  }
1034 }
1035 
1036 function ‪set_music_on_team( state, team = "both", wait_time = 0, save_state = false, return_state = false )
1037 {
1038  // Assert if there are no players
1039  assert( isdefined( level.players ) );
1040 
1041  foreach( player in level.players )
1042  {
1043  if ( team == "both" )
1044  {
1045  player thread ‪set_music_on_player( state, wait_time, save_state, return_state );
1046  }
1047  else if ( isdefined( player.pers["team"] ) && (player.pers["team"] == team ) )
1048  {
1049  player thread ‪set_music_on_player( state, wait_time, save_state, return_state );
1050  }
1051  }
1052 }
1053 function ‪set_music_on_player( state, wait_time = 0, save_state = false, return_state = false )
1054 {
1055  self endon( "disconnect" );
1056 
1057  assert( isplayer (self) );
1058 
1059  if ( !isdefined( state ) )
1060  {
1061  return;
1062  }
1063 
1064  if( !isdefined( game[ "musicSet" ] ) )
1065  {
1066  return;
1067  }
1068 
1069  music::setmusicstate( state+game[ "musicSet" ], self );
1070 }
1071 function ‪set_music_global( state, wait_time = 0, save_state = false, return_state = false )
1072 {
1073  if ( !isdefined( state ) )
1074  {
1075  return;
1076  }
1077 
1078  if( !isdefined( game[ "musicSet" ] ) )
1079  {
1080  return;
1081  }
1082 
1083  music::setmusicstate( state+game[ "musicSet" ] );
1084 }
‪leader_dialog_for_other_teams
‪function leader_dialog_for_other_teams(dialogKey, skipTeam, objectiveKey, killstreakId, dialogBufferKey)
Definition: _globallogic_audio.gsc:422
‪dialogkey_priority
‪function dialogkey_priority(dialogKey)
Definition: _globallogic_audio.gsc:641
‪announce_round_winner
‪function announce_round_winner(winner, delay)
Definition: _globallogic_audio.gsc:103
‪play_equipment_hacked_on_player
‪function play_equipment_hacked_on_player()
Definition: _globallogic_audio.gsc:768
‪set_music_on_player
‪function set_music_on_player(state, wait_time=0, save_state=false, return_state=false)
Definition: _globallogic_audio.gsc:1053
‪isOneRound
‪function isOneRound()
Definition: util_shared.gsc:3497
‪mpdialog_value
‪function mpdialog_value(mpdialogKey, defaultValue)
Definition: _battlechatter.gsc:253
‪wait_next_killstreak_dialog
‪function wait_next_killstreak_dialog()
Definition: _globallogic_audio.gsc:410
‪get_round_switch_dialog
‪function get_round_switch_dialog(switchType)
Definition: _globallogic_audio.gsc:859
‪getTimeRemaining
‪function getTimeRemaining()
Definition: _globallogic_utils.gsc:109
‪announce_team_is_winning
‪function announce_team_is_winning()
Definition: _globallogic_audio.gsc:829
‪get_dialog_bundle_alias
‪function get_dialog_bundle_alias(dialogBundle, dialogKey)
Definition: _globallogic_audio.gsc:787
‪on_start_gametype
‪function on_start_gametype(func, obj)
Definition: callbacks_shared.csc:285
‪sndMusicTimeLimitWatcher
‪function sndMusicTimeLimitWatcher()
Definition: _globallogic_audio.gsc:1012
‪isExcluded
‪function isExcluded(entity, entityList)
Definition: _globallogic_utils.gsc:470
‪isLastRound
‪function isLastRound()
Definition: util_shared.gsc:3513
‪sndMusicTimesOut
‪function sndMusicTimesOut()
Definition: _globallogic_audio.gsc:990
‪get_commander_dialog_alias
‪function get_commander_dialog_alias(dialogKey)
Definition: _globallogic_audio.gsc:775
‪__init__
‪function __init__()
Definition: _globallogic_audio.gsc:22
‪play_on_players
‪function play_on_players(sound, team)
Definition: sound_shared.gsc:257
‪announce_game_winner
‪function announce_game_winner(winner)
Definition: _globallogic_audio.gsc:133
‪IS_TRUE
‪#define IS_TRUE(__a)
Definition: shared.gsh:251
‪delay
‪function delay(time_or_notify, str_endon, func, arg1, arg2, arg3, arg4, arg5, arg6)
Definition: util_shared.csc:784
‪wait_for_player_dialog
‪function wait_for_player_dialog()
Definition: _globallogic_audio.gsc:323
‪set_music_on_team
‪function set_music_on_team(state, team="both", wait_time=0, save_state=false, return_state=false)
Definition: _globallogic_audio.gsc:1036
‪play_next_killstreak_dialog
‪function play_next_killstreak_dialog()
Definition: _globallogic_audio.gsc:337
‪killstreak_dialog_on_player
‪function killstreak_dialog_on_player(dialogKey, killstreakType, killstreakId, pilotIndex)
Definition: _globallogic_audio.gsc:279
‪flush_dialog_on_player
‪function flush_dialog_on_player()
Definition: _globallogic_audio.gsc:168
‪flush_leader_dialog_key
‪function flush_leader_dialog_key(dialogKey)
Definition: _globallogic_audio.gsc:250
‪sndMusicHalfway
‪function sndMusicHalfway()
Definition: _globallogic_audio.gsc:1002
‪flush_dialog
‪function flush_dialog()
Definition: _globallogic_audio.gsc:160
‪set_leader_gametype_dialog
‪function set_leader_gametype_dialog(startGameDialogKey, startHcGameDialogKey, offenseOrderDialogKey, defenseOrderDialogKey)
Definition: _globallogic_audio.gsc:92
‪is_team_winning
‪function is_team_winning(checkTeam)
Definition: _globallogic_audio.gsc:811
‪play_equipment_destroyed_on_player
‪function play_equipment_destroyed_on_player()
Definition: _globallogic_audio.gsc:763
‪flush_killstreak_dialog_on_player
‪function flush_killstreak_dialog_on_player(killstreakId)
Definition: _globallogic_audio.gsc:179
‪flush_leader_dialog_key_on_player
‪function flush_leader_dialog_key_on_player(dialogKey)
Definition: _globallogic_audio.gsc:258
‪set_music_global
‪function set_music_global(state, wait_time=0, save_state=false, return_state=false)
Definition: _globallogic_audio.gsc:1071
‪announcerController
‪function announcerController()
Definition: _globallogic_audio.gsc:880
‪init
‪function init()
Definition: _globallogic_audio.gsc:31
‪REGISTER_SYSTEM
‪#define REGISTER_SYSTEM(__sys, __func_init_preload, __reqs)
Definition: shared.gsh:204
‪flush_objective_dialog
‪function flush_objective_dialog(objectiveKey)
Definition: _globallogic_audio.gsc:225
‪wait_next_leader_dialog
‪function wait_next_leader_dialog(dialogBuffer)
Definition: _globallogic_audio.gsc:630
‪killstreak_dialog_queued
‪function killstreak_dialog_queued(dialogKey, killstreakType, killstreakId)
Definition: _globallogic_audio.gsc:195
‪sndMusicSetRandomizer
‪function sndMusicSetRandomizer()
Definition: _globallogic_audio.gsc:941
‪unlockFrontendMusic
‪function unlockFrontendMusic(unlockName, allplayers=true)
Definition: audio_shared.gsc:164
‪clientNotify
‪function clientNotify(event)
Definition: util_shared.gsc:1416
‪leader_dialog
‪function leader_dialog(dialogKey, team, excludeList, objectiveKey, killstreakId, dialogBufferKey)
Definition: _globallogic_audio.gsc:435
‪flush_objective_dialog_on_player
‪function flush_objective_dialog_on_player(objectiveKey)
Definition: _globallogic_audio.gsc:233
‪game_end_vox
‪function game_end_vox(winner)
Definition: _battlechatter.gsc:1614
‪get_script_bundle
‪function get_script_bundle(str_type, str_name)
Definition: struct.csc:45
‪play_taacom_dialog
‪function play_taacom_dialog(dialogKey, killstreakType, killstreakId)
Definition: _globallogic_audio.gsc:274
‪leader_dialog_on_player
‪function leader_dialog_on_player(dialogKey, objectiveKey, killstreakId, dialogBufferKey, introDialog)
Definition: _globallogic_audio.gsc:460
‪play_next_leader_dialog
‪function play_next_leader_dialog()
Definition: _globallogic_audio.gsc:565
‪play_2d_on_team
‪function play_2d_on_team(alias, team)
Definition: _globallogic_audio.gsc:845
‪post_match_snapshot_watcher
‪function post_match_snapshot_watcher()
Definition: _globallogic_audio.gsc:872
‪sndMusicUnlock
‪function sndMusicUnlock()
Definition: _globallogic_audio.gsc:959
‪sndMusicFunctions
‪function sndMusicFunctions()
Definition: _globallogic_audio.gsc:934