‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
fr.gsc
Go to the documentation of this file.
1 #using scripts\shared\gameobjects_shared;
2 #using scripts\shared\math_shared;
3 #using scripts\shared\util_shared;
4 #using scripts\shared\clientfield_shared;
5 #using scripts\shared\popups_shared;
6 #using scripts\shared\lui_shared;
7 #using scripts\shared\callbacks_shared;
8 #using scripts\shared\system_shared;
9 #using scripts\mp\_pickup_items;
10 #using scripts\mp\gametypes\_globallogic;
11 #using scripts\mp\gametypes\_globallogic_audio;
12 #using scripts\mp\gametypes\_globallogic_score;
13 #using scripts\mp\gametypes\_spawning;
14 #using scripts\mp\gametypes\_spawnlogic;
15 #using scripts\mp\_util;
16 
17 #insert scripts\shared\shared.gsh;
18 #insert scripts\shared\version.gsh;
19 #insert scripts\mp\gametypes\fr.gsh;
20 
21 /*
22  Freerun
23  Objective: Make it to the goal the fastest
24  Map ends: When player quits
25  Respawning: Instant
26 
27  Level requirements
28  ------------------
29  Spawnpoints:
30  classname mp_dm_spawn
31  All players spawn from these. The spawnpoint chosen is dependent on the current locations of enemies at the time of spawn.
32  Players generally spawn away from enemies.
33 
34  Spectator Spawnpoints:
35  classname mp_global_intermission
36  Spectators spawn from these and intermission is viewed from these positions.
37  Atleast one is required, any more and they are randomly chosen between.
38 */
39 
40 /*QUAKED mp_dm_spawn (1.0 0.5 0.0) (-16 -16 0) (16 16 72)
41 Players spawn away from enemies at one of these positions.*/
42 
43 /*
44  - down is reset to active checkpoint
45  - left/right change courses
46  - up is to reset to start of course/reset timer
47 */
48 
49 #define FR_DEATH_PENALTY_SECONDS 5.0
50 #define FR_NUM_TRACKS 1
51 #define FR_SPAWN_Z_OFFSET 5.0
52 
53 #define TUTORIAL_TEXT_HINT_TIME 4.0
54 
55 #define HIGH_SCORE_COUNT 3
56 
57 #precache( "string", "OBJECTIVES_FR" );
58 #precache( "string", "OBJECTIVES_FR_SCORE" );
59 #precache( "string", "OBJECTIVES_FR_HINT" );
60 #precache( "string", "OBJECTIVES_FR_NEW_RECORD" );
61 #precache( "string", "OBJECTIVES_FR_CHECKPOINT" );
62 #precache( "string", "OBJECTIVES_FR_FAULT" );
63 #precache( "string", "OBJECTIVES_FR_FAULTS" );
64 #precache( "string", "OBJECTIVES_FR_RETRY" );
65 #precache( "string", "OBJECTIVES_FR_RETRIES" );
66 
67 #precache( "string", "FREERUN_TUTORIAL_01" );
68 #precache( "string", "FREERUN_TUTORIAL_02" );
69 #precache( "string", "FREERUN_TUTORIAL_03" );
70 #precache( "string", "FREERUN_TUTORIAL_04" );
71 #precache( "string", "FREERUN_TUTORIAL_05" );
72 #precache( "string", "FREERUN_TUTORIAL_06" );
73 #precache( "string", "FREERUN_TUTORIAL_07" );
74 #precache( "string", "FREERUN_TUTORIAL_08" );
75 #precache( "string", "FREERUN_TUTORIAL_09" );
76 #precache( "string", "FREERUN_TUTORIAL_10" );
77 #precache( "string", "FREERUN_TUTORIAL_11" );
78 #precache( "string", "FREERUN_TUTORIAL_12" );
79 #precache( "string", "FREERUN_TUTORIAL_13" );
80 #precache( "string", "FREERUN_TUTORIAL_14" );
81 #precache( "string", "FREERUN_TUTORIAL_14a" );
82 #precache( "string", "FREERUN_TUTORIAL_15" );
83 #precache( "string", "FREERUN_TUTORIAL_16" );
84 #precache( "string", "FREERUN_TUTORIAL_17" );
85 #precache( "string", "FREERUN_TUTORIAL_18" );
86 #precache( "string", "FREERUN_TUTORIAL_19" );
87 #precache( "string", "FREERUN_TUTORIAL_20" );
88 #precache( "string", "FREERUN_TUTORIAL_21" );
89 #precache( "string", "FREERUN_TUTORIAL_22" );
90 #precache( "string", "FREERUN_TUTORIAL_22a" );
91 #precache( "string", "FREERUN_TUTORIAL_23" );
92 #precache( "string", "FREERUN_TUTORIAL_24" );
93 #precache( "string", "FREERUN_TUTORIAL_25" );
94 #precache( "string", "FREERUN_TUTORIAL_26" );
95 #precache( "string", "FREERUN_WELCOME" );
96 #precache( "string", "FREERUN_CHECKPOINT" );
97 #precache( "string", "FREERUN_BEST_TIME" );
98 #precache( "string", "FREERUN_COMPLETE" );
99 #precache( "string", "FREERUN_BEST_RUN" );
100 
101 #precache( "fx", "ui/fx_fr_target_demat" );
102 #precache( "fx", "ui/fx_fr_target_impact" );
103 
104 #precache( "menu", MENU_FREERUN_RESTART );
105 
106 function ‪main()
107 {
108  level.trackWeaponStats = false;
110 
111  ‪clientfield::register( "world", "freerun_state", ‪VERSION_SHIP, 3, "int" );
112  ‪clientfield::register( "world", "freerun_retries", ‪VERSION_SHIP, ‪FR_RETRIES_BITS, "int" );
113  ‪clientfield::register( "world", "freerun_faults", ‪VERSION_SHIP, ‪FR_FAULTS_BITS, "int" );
114  ‪clientfield::register( "world", "freerun_startTime", ‪VERSION_SHIP, ‪FR_TIME_BITS, "int" );
115  ‪clientfield::register( "world", "freerun_finishTime", ‪VERSION_SHIP, ‪FR_TIME_BITS, "int" );
116  ‪clientfield::register( "world", "freerun_bestTime", ‪VERSION_SHIP, ‪FR_TIME_BITS, "int" );
117  ‪clientfield::register( "world", "freerun_timeAdjustment", ‪VERSION_SHIP, ‪FR_TIME_BITS, "int" );
118  ‪clientfield::register( "world", "freerun_timeAdjustmentNegative", ‪VERSION_SHIP, 1, "int" );
119  ‪clientfield::register( "world", "freerun_bulletPenalty", ‪VERSION_SHIP, FR_BULLETPENALTY_BITS, "int" );
120  ‪clientfield::register( "world", "freerun_pausedTime", ‪VERSION_SHIP, ‪FR_TIME_BITS, "int" );
121  ‪clientfield::register( "world", "freerun_checkpointIndex", ‪VERSION_SHIP, 7, "int" );
122 
123  ‪util::registerTimeLimit( 0, 1440 );
124  ‪util::registerScoreLimit( 0, 50000 );
127  ‪util::registerNumLives( 0, 100 );
128 
129  ‪globallogic::registerFriendlyFireDelay( level.gameType, 0, 0, 1440 );
130 
131  level.scoreRoundWinBased = ( GetGametypeSetting( "cumulativeRoundScores" ) == false );
132  level.teamScorePerKill = GetGametypeSetting( "teamScorePerKill" );
133  level.teamScorePerDeath = GetGametypeSetting( "teamScorePerDeath" );
134  level.teamScorePerHeadshot = GetGametypeSetting( "teamScorePerHeadshot" );
135  level.onStartGameType =&‪onStartGameType;
136  level.onSpawnPlayer =&‪onSpawnPlayer;
137  level.giveCustomLoadout = &‪giveCustomLoadout;
138 
139  //level.skipGameEnd = 1;
140  level.postRoundTime = 0.5;
141  level.doEndgameScoreboard = false;
142 
144 
147 
148  if ( !IsDefined( level.fr_target_impact_fx ) )
149  {
150  level.fr_target_impact_fx = "ui/fx_fr_target_impact";
151  }
152  if ( !IsDefined( level.fr_target_disable_fx ) )
153  {
154  level.fr_target_disable_fx = "ui/fx_fr_target_demat";
155  }
156  if ( !IsDefined( level.fr_target_disable_sound ) )
157  {
158  level.fr_target_disable_sound = "wpn_grenade_explode_default";
159  }
160 
161  level.FRGame = SpawnStruct();
162 
163  level.FRGame.activeTrackIndex = 0;
164  level.FRGame.tracks = [];
165 
166  for ( i = 0; i < ‪FR_NUM_TRACKS; i++ )
167  {
168  level.FRGame.tracks[i] = SpawnStruct();
169 
170  level.FRGame.tracks[i].startTrigger = GetEnt( "fr_start_0" + i, "targetname" );
171  assert( IsDefined( level.FRGame.tracks[i].startTrigger ));
172 
173  level.FRGame.tracks[i].goalTrigger = GetEnt( "fr_end_0" + i, "targetname" );
174  assert( IsDefined( level.FRGame.tracks[i].goalTrigger ));
175 
176  level.FRGame.tracks[i].highScores = [];
177  }
178 
179  level.FRGame.checkpointTriggers = GetEntArray( "fr_checkpoint", "targetname" );
180  assert( level.FRGame.checkpointTriggers.size );
181 
182  // Sets the scoreboard columns and determines with data is sent across the network
183  ‪globallogic::setvisiblescoreboardcolumns( "pointstowin", "kills", "deaths", "headshots", "score" );
184 
185 }
186 
187 function ‪setupTeam( team )
188 {
189  ‪util::setObjectiveText( team, &"OBJECTIVES_FR" );
190 
191  if ( level.splitscreen )
192  {
193  ‪util::setObjectiveScoreText( team, &"OBJECTIVES_FR" );
194  }
195  else
196  {
197  ‪util::setObjectiveScoreText( team, &"OBJECTIVES_FR_SCORE" );
198  }
199  ‪util::setObjectiveHintText( team, &"OBJECTIVES_FR_SCORE" );
200 
201  ‪spawnlogic::add_spawn_points( team, "mp_dm_spawn" );
202 }
203 
205 {
206  setClientNameMode("auto_change");
207 
208  level.useXCamsForEndGame = false;
209  level.can_set_aar_stat = false;
210  level.disableBehaviorTracker = true;
211  level.disableStatTracking = true;
212 
213  // now that the game objects have been deleted place the influencers
215 
216  level.spawnMins = ( 0, 0, 0 );
217  level.spawnMaxs = ( 0, 0, 0 );
218 
219  foreach( team in level.teams )
220  {
221  ‪setupTeam( team );
222  }
223 
224  spawns = ‪spawnlogic::get_spawnpoint_array( "mp_dm_spawn" );
226 
227  foreach( index, trigger in level.FRGame.checkpointTriggers )
228  {
229  level.FRGame.checkpointTimes[index] = 0;
230  trigger.checkPointIndex = index;
231 
232  trigger thread ‪watchCheckpointTrigger();
233 
234  closest = 99999999;
235  foreach( ‪spawn in spawns )
236  {
237  dist = DistanceSquared( ‪spawn.origin, trigger.origin );
238  if ( dist < closest )
239  {
240  closest = dist;
241  trigger.spawnPoint = ‪spawn;
242  }
243  }
244 
245  assert( IsDefined( trigger.spawnPoint ));
246  }
247 
248  player_starts = ‪spawnlogic::_get_spawnpoint_array( "info_player_start" );
249  assert( player_starts.size );
250 
251  foreach( ‪track in level.FRGame.tracks )
252  {
253  closest = 99999999;
254  foreach( start in player_starts )
255  {
256  dist = DistanceSquared( start.origin, ‪track.startTrigger.origin );
257  if ( dist < closest )
258  {
259  closest = dist;
260  ‪track.playerStart = start;
261  }
262  }
263 
264  assert( IsDefined( ‪track.playerStart ));
265  }
266 
267  level.FRGame.deathTriggers = GetEntArray( "fr_die", "targetname" );
268  assert( level.FRGame.deathTriggers.size );
269 
270  foreach( trigger in level.FRGame.deathTriggers )
271  {
272  trigger thread ‪watchDeathTrigger();
273  }
274 
276 
277  if(!IsDefined (level.freerun)) // this keeps suspense music from the global mp system from playing
278  {
279  level.freerun = true;
280  }
281 
282  level.mapCenter = ‪math::find_box_center( level.spawnMins, level.spawnMaxs );
283  setMapCenter( level.mapCenter );
284 
286  setDemoIntermissionPoint( spawnpoint.origin, spawnpoint.angles );
287 
288  // use the new spawn logic from the start
289  level.useStartSpawns = false;
290  level.displayRoundEndText = false;
291 
292  if ( !‪util::isOneRound() )
293  {
294  level.displayRoundEndText = true;
295  }
296 
297  foreach( item in level.pickup_items )
298  {
299  closest = 99999999;
300  foreach( trigger in level.FRGame.checkpointTriggers )
301  {
302  dist = DistanceSquared( item.origin, trigger.origin );
303  if ( dist < closest )
304  {
305  closest = dist;
306  item.checkPoint = trigger;
307  }
308  }
309  assert( IsDefined( item.checkPoint ));
310 
311  item.checkPoint.weapon = item.visuals[0].items[0].weapon;
312  item.checkPoint.weaponObject = item;
313 
314  item.checkPoint ‪setup_weapon_targets();
315  }
316 
317  thread ‪watch_for_game_end();
318 
319  level.FRGame.trackIndex = GetFreerunTrackIndex( );
320  level.FRGame.mapUniqueId = GetMissionUniqueID( );
321  level.FRGame.mapVersion = GetMissionVersion( );
322 }
323 
325 {
326  level waittill("game_ended");
327 
328  if ( !‪end_game_state() )
329  {
330  level ‪clientfield::set( "freerun_finishTime", 0 );
331  }
332  self ‪stop_tutorial_vo();
333  level ‪clientfield::set( "freerun_state", ‪FR_STATE_QUIT );
334 }
335 
337 {
338  self thread ‪on_menu_response();
339 }
340 
342 {
343  self endon("disconnect");
344 
345  for(;;)
346  {
347  self waittill("menuresponse", menu, response);
348  if ( response == "fr_restart" )
349  {
350  self playsoundtoplayer( "uin_freerun_reset", self );
351  self thread ‪freerunMusic();
352  ‪activateTrack( level.FRGame.activeTrackIndex );
353  }
354  }
355 }
356 
357 function ‪onSpawnPlayer(predictedSpawn) // self == player
358 {
359  ‪spawning::onSpawnPlayer(predictedSpawn);
360 
361  if ( predictedSpawn )
362  return;
363 
364  // if we are here a second time its because the player died.
365  if ( IsDefined( self.FRInited ) )
366  {
367  self.body hide();
368  ‪faultDeath();
369  return;
370  }
371 
372  self.FRInited = true;
373 
374  self thread ‪activate_tutorial_mode();
375  self thread ‪activateTrack( level.FRGame.activeTrackIndex );
376  self thread ‪watchTrackSwitch();
377  self thread ‪watchWeaponFire();
378  self thread ‪freerunMusic();
379 
380  self thread ‪trackPlayerOrigin();
381 
382 // self.overridePlayerDamage = &on_player_damage;
383 
384  level.FRGame.lastPlayedFaultVOTime = 0;
385 
386  self DisableWeaponCycling();
387 }
388 
389 function ‪on_player_damage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime )
390 {
391  if ( iDamage >= self.health )
392  {
393  // damage function always applies at least 1 damage
394  self.health = self.maxHealth + 1;
395  ‪faultDeath();
396  return 0;
397  }
398 
399  return iDamage;
400 }
401 
403 {
404  self endon( "disconnect" );
405 
406  while( 1 )
407  {
408  self.prev_origin = self.origin;
409  self.prev_time = GetTime();
411  waittillframeend;
412  }
413 }
414 
415 function ‪readHighScores() // self == player
416 {
418 
420 }
421 
423 {
424  self FreerunSetHighScores( level.FRGame.activeTrack.highScores[0].time, level.FRGame.activeTrack.highScores[1].time, level.FRGame.activeTrack.highScores[2].time );
425  level ‪clientfield::set( "freerun_bestTime", level.FRGame.activeTrack.highScores[0].time );
426 }
427 
428 function ‪activateTrack( trackIndex ) // self == player
429 {
430  level notify( "activate_track" );
431 
432 /#
433  if ( level.FRGame.tracks.size > 1 )
434  {
435  IPrintLn( "Track " + trackIndex );
436  }
437 #/
438 
439  if ( !isdefined( level.FRGame.tutorials ) || !level.FRGame.tutorials )
440  {
441  // we are not doing tutorial mode so then play the main freerun vo
442  self playlocalsound( "vox_tuto_tutorial_sequence_27" );
443  }
444 
445  level.FRGame.lastPlayedFaultVOCheckpoint = -1;
446 
447  level.FRGame.activeTrackIndex = trackIndex;
448  level.FRGame.activeTrack = level.FRGame.tracks[trackIndex];
449  level.FRGame.activeSpawnPoint = level.FRGame.activeTrack.playerStart;
450  level.FRGame.activeSpawnLocation = level.FRGame.activeTrack.playerStart.origin;
451  level.FRGame.activeSpawnAngles = level.FRGame.activeTrack.playerStart.angles;
452  level.FRGame.activeTrack.goalTrigger thread ‪watchGoalTrigger();
453  level.FRGame.activeSpawnPoint.checkpointIndex = 0;
454 
455  level.FRGame.faults = 0;
456  level.FRGame.userSpawns = 0;
457  level.FRGame.checkpointTimes = [];
458  foreach( index, trigger in level.FRGame.checkpointTriggers )
459  {
460  level.FRGame.checkpointTimes[index] = 0;
461  }
462 
463  level ‪clientfield::set( "freerun_faults", 0 );
464  level ‪clientfield::set( "freerun_retries", 0 );
465  level ‪clientfield::set( "freerun_state", ‪FR_STATE_PRESTART );
466  level ‪clientfield::set( "freerun_bulletPenalty", 0 );
467  level ‪clientfield::set( "freerun_pausedTime", 0 );
468  level ‪clientfield::set( "freerun_checkpointIndex", 0 );
469 
470  self ‪readHighScores();
471 
472  self ‪giveCustomLoadout();
473  self SetOrigin( level.FRGame.activeTrack.playerStart.origin );
474  self SetPlayerAngles( level.FRGame.activeTrack.playerStart.angles );
475  self SetVelocity( (0,0,0) );
476  self RecordGameEvent( "start" );
477 
478  ResetGlass();
481 
482  self ‪unfreeze();
483  self.respawn_position = undefined;
484 
487 
488  level.FRGame.activeTrack.startTrigger thread ‪watchStartRun( self );
489 }
490 
491 function ‪startRun() // self == player
492 {
493  level.FRGame.totalPausedTime = 0;
494  level.FRGame.pausedAtTime = 0;
495  level.FRGame.bulletPenalty = 0;
496  level.FRGame.hasBeenPaused = false;
497  level.FRGame.trackStartTime = 0;
498  level.FRGame.trackStartTime = ‪get_current_track_time( self );
499 
500  level ‪clientfield::set( "freerun_startTime", level.FRGame.trackStartTime );
501  level ‪clientfield::set( "freerun_state", ‪FR_STATE_RUNNING );
502 
503  self playsoundtoplayer( "uin_freerun_start", self );
504 
505  self thread ‪watchUserRespawn();
506 }
507 
508 function ‪onCheckpointTrigger( player, endOnString ) // self == trigger
509 {
510  self endon( endOnString );
511 
512  level.FRGame.activeSpawnLocation = ‪getGroundPointForOrigin( player.origin );
513  level.FRGame.activeSpawnAngles = player.angles;
514 
515  if ( level.FRGame.activeSpawnPoint != self )
516  {
517  level.FRGame.activeSpawnPoint = self;
518 
519  player ‪take_all_player_weapons( false, false );
520 
521  if ( IsDefined(self.weaponObject) )
522  {
523  self.weaponObject ‪reset_targets();
524  self.weaponObject ‪pickup_items::respawn_pickup();
525  }
526  }
527 }
528 
529 function ‪leaveCheckpointTrigger( player ) // self == trigger
530 {
531  self thread ‪watchCheckpointTrigger();
532 }
533 
534 function ‪get_current_track_time( player ) // self == checkpoint trigger
535 {
536  curtime = GetTime();
537  dt = curtime - player.prev_time;
538 
539  frac = getfirsttouchfraction( player, self, player.prev_origin, player.origin );
540 
541  current_time = (curtime - level.FRGame.trackStartTime + (level.FRGame.bulletPenalty * 1000) + (level.FRGame.userSpawns * 5000) - level.FRGame.totalPausedTime);
542 
543  return int(current_time - dt * ( 1 - frac ));
544 }
545 
546 function ‪watchCheckpointTrigger() // self == checkpoint trigger
547 {
548  self waittill( "trigger", player );
549 
550  if ( IsPlayer( player ))
551  {
552  if ( level.FRGame.activeSpawnPoint != self )
553  {
554  checkpoint_index = self.checkpointIndex;
555 
556  current_time = ‪get_current_track_time( player );
557 
558  first_time = false;
559 
560  // make sure we dont double set this if they go backwards
561  if ( !IsDefined( level.FRGame.checkpointTimes[ checkpoint_index ] ) || level.FRGame.checkpointTimes[ checkpoint_index ] == 0 )
562  {
563  level.FRGame.checkpointTimes[ checkpoint_index ] = current_time;
564  first_time = true;
565  }
566 
567  if ( first_time )
568  {
569  if ( IsDefined( level.FRGame.activeTrack.fastestRunCheckpointTimes ) )
570  {
571  if ( IsDefined( level.FRGame.activeTrack.fastestRunCheckpointTimes[checkpoint_index] ) && level.FRGame.activeTrack.fastestRunCheckpointTimes[checkpoint_index] )
572  {
573  delta_time = current_time - level.FRGame.activeTrack.fastestRunCheckpointTimes[checkpoint_index];
574 
575  if ( delta_time < 0 )
576  {
577  delta_time = -delta_time;
578  ‪sign = 1;
579  }
580  else
581  {
582  ‪sign = 0;
583  }
584 
585  level ‪clientfield::set( "freerun_timeAdjustment", delta_time );
586  level ‪clientfield::set( "freerun_timeAdjustmentNegative", ‪sign );
587  }
588 
589 
590  }
591 
592  //Set the checkpoint index to one above the actual checkpoint index in order to update on the first checkpoint ( 0 ), as
593  //Clientfields can't handle negative numbers.
594  level ‪clientfield::set( "freerun_checkpointIndex", checkpoint_index + 1 );
595  player playsoundtoplayer( "uin_freerun_checkpoint", player );
596  }
597  }
599  }
600 }
601 
602 function ‪watchDeathTrigger() // self == death trigger
603 {
604  while( true )
605  {
606  self waittill( "trigger", player );
607 
608  if ( IsPlayer( player ))
609  {
610  player ‪faultDeath();
611  }
612  }
613 }
614 
616 {
617  active_track = level.FRGame.activeTrack;
618 
619  run_data = ‪create_high_score_struct( ‪get_current_track_time( player ), level.FRGame.faults, level.FRGame.userSpawns, level.FRGame.bulletPenalty );
620 
621  push_score = true;
622  new_record = false;
623 
624  if ( active_track.highScores.size > 0 )
625  {
626  for ( i = 0; i < active_track.highScores.size; i++ )
627  {
628  if ( (run_data.time < active_track.highScores[i].time) || (active_track.highScores[i].time == 0) )
629  {
630  push_score = false;
631 
632  ArrayInsert( active_track.highScores, run_data, i );
633 
634  if ( i == 0 )
635  {
636  new_record = true;
637  }
638 
639  if ( i < ‪HIGH_SCORE_COUNT )
640  {
641  player ‪write_high_scores_stats(i);
642  }
643  break;
644  }
645  }
646  }
647  else
648  {
649  new_record = true;
650  }
651 
652  if ( push_score )
653  {
654  ArrayInsert( active_track.highScores, run_data, active_track.highScores.size );
655  player ‪write_high_scores_stats( active_track.highScores.size - 1 );
656  }
657 
658  if ( new_record )
659  {
660  player ‪write_checkpoint_times();
661  }
662 
663  return new_record;
664 }
665 
666 function ‪watchGoalTrigger() // self == goal trigger
667 {
668  level notify( "watch_goal_trigger" );
669  level endon( "watch_goal_trigger" );
670 
671  self waittill( "trigger", player );
672 
673  if ( IsPlayer( player ))
674  {
675  player playsoundtoplayer( "uin_freerun_finish", player );
676 
677  player ‪take_all_player_weapons( true, false );
678 
679  new_record = ‪add_current_run_to_high_scores(player);
680 
681  tracksCompleted = player getDStat( "freerunTracksCompleted" );
682 
683  if ( tracksCompleted < level.FRGame.trackIndex )
684  {
685  player setDStat( "freerunTracksCompleted", level.FRGame.trackIndex );
686  }
687 
688  player RecordGameEvent( "completion" );
689 
690  player.respawn_position = self.origin;
691  player thread ‪freeze();
692  player thread ‪freerunMusic(false);
693  player ‪updateHighScores();
694  level ‪clientfield::set( "freerun_finishTime", ‪get_current_track_time( player ) );
695  level ‪clientfield::set( "freerun_state", ‪FR_STATE_FINISHED );
696  level notify( "finished_track" );
697 
698  // this profile setting will not work if someone can play on a remote server
699  if ( player IsHost() )
700  {
701  level notify("stop_tutorials");
703  level.FRGame.tutorials = false;
704  SetLocalProfileVar( "com_firsttime_freerun", 1 );
705 
706  highest_track = GetLocalProfileInt( "freerunHighestTrack" );
707 
708  if ( highest_track < level.FRGame.trackIndex )
709  {
710  SetLocalProfileVar( "freerunHighestTrack", level.FRGame.trackIndex );
711  }
712  }
713 
714 
715  wait(1.5);
716 
717  UploadStats();
718  player uploadleaderboards();
719 
720  level ‪clientfield::set( "freerun_state", ‪FR_STATE_DIALOG );
721  }
722 }
723 
724 function ‪freeze()
725 {
726  self ‪util::freeze_player_controls( true );
727 }
728 
729 function ‪unfreeze()
730 {
731  self ‪util::freeze_player_controls( false );
732 }
733 
734 function ‪setup_weapon_targets() // self == checkpoint
735 {
736  target_name = self.weaponObject.visuals[0].target;
737  if ( !IsDefined(target_name) )
738  return;
739 
740  self.weaponObject.targetShotTime = 0;
741  self.weaponObject.targets = [];
742  self.weaponObject.target_visuals = [];
743 
744  targets = GetEntArray( target_name, "targetname" );
745  foreach( target in targets )
746  {
747  if ( target.script_noteworthy == "fr_target" )
748  {
749  self.weaponObject.targets[self.weaponObject.targets.size] = target;
750  }
751  if ( target.script_noteworthy == "fr_target_visual" )
752  {
753  self.weaponObject.target_visuals[self.weaponObject.target_visuals.size] = target;
754  }
755  }
756 
757  foreach ( target in self.weaponObject.targets )
758  {
759  foreach( visual in self.weaponObject.target_visuals )
760  {
761  if ( target.origin == visual.origin )
762  {
763  target.visual = visual;
764  }
765  }
766  }
767 
768  foreach ( target in self.weaponObject.targets )
769  {
770  target.blocker = GetEnt( target.target, "targetname" );
771  if ( IsDefined( target.blocker ) )
772  {
773  if ( !isdefined( target.blocker.targetCount ) )
774  {
775  target.blocker.targetCount = 0;
776  target.blocker.activeTargetCount = 0;
777  }
778 
779  target.blocker.targetCount++;
780  target.blocker.activeTargetCount++;
781 
782  target.checkPoint = self;
783  target.disabled = false;
784  target thread ‪watch_target_trigger_thread(self.weaponObject);
785  }
786  }
787 }
788 
789 function ‪watch_target_trigger_thread( weaponObject )
790 {
791  self endon( "death" );
792 
793  while(1)
794  {
795  self waittill ( "damage", ‪damage, attacker, direction_vec, point, type, modelName, tagName, partName, weapon, iDFlags );
796 
797  if ( level.FRGame.activeSpawnPoint != self.checkPoint )
798  continue;
799 
800  if ( weapon == level.weaponBaseMeleeHeld )
801  continue;
802 
803  if ( self.disabled )
804  continue;
805 
806  self ‪turn_off_target(weapon);
807 
808  ‪PlayFx( level.fr_target_impact_fx, point, direction_vec );
809  weaponObject.targetShotTime = GetTime();
810  }
811 }
812 
813 function ‪turn_off_target(weapon)
814 {
815  self.disabled = true;
816  self.visual ghost(); // this will still stop bullet collision with ghost
817  self.visual notsolid();
818 
819  self.blocker ‪blocker_disable();
820 
821  Playfx( level.fr_target_disable_fx, self.origin );
822  PlaySoundAtPosition( level.fr_target_disable_sound, self.origin );
823 }
824 
826 {
827  self.activeTargetCount = self.targetCount;
828 
829  self.disabled = false;
830  self show();
831  self solid();
832 }
833 
835 {
836  self.activeTargetCount--;
837 
838  if ( self.activeTargetCount == 0 )
839  {
840  self.disabled = true;
841  self ghost();
842  self notsolid();
843  }
844 }
845 
847 {
848  foreach ( target in self.targets )
849  {
850  target.blocker ‪blocker_enable();
851  target.visual show();
852  target.visual solid();
853  target.disabled = false;
854  }
855 }
856 
858 {
859  foreach( trigger in level.FRGame.checkpointTriggers )
860  {
861  if ( IsDefined( trigger.weaponObject ) )
862  {
863  trigger.weaponObject ‪reset_targets();
864  }
865  }
866 }
867 
869 {
870  current_time = GetTime();
871  fault_vo_interval = 20000;
872 
873  if ( current_time - level.FRGame.lastPlayedFaultVOTime < fault_vo_interval )
874  return;
875 
876  if ( isdefined( self.lastTutorialVOPlayed ) )
877  return;
878 
879  if ( level.FRGame.lastPlayedFaultVOCheckpoint == level.FRGame.activeSpawnPoint.checkpointIndex )
880  return;
881 
882  level.FRGame.lastPlayedFaultVOCheckpoint = level.FRGame.activeSpawnPoint.checkpointIndex;
883  level.FRGame.lastPlayedFaultVOTime = current_time;
884  self playlocalsound( "vox_tuto_tutorial_fail" );
885 }
886 
887 function ‪faultDeath() // self == player
888 {
889  self ‪play_fault_VO();
890 
891  // do the fall deaths increase time in trials?
892  level.FRGame.faults++;
893  self RecordGameEvent( "fault" );
894  level ‪clientfield::set( "freerun_faults", level.FRGame.faults );
895  self playsoundtoplayer( "uin_freerun_reset", self );
897 }
898 
900 {
901  return self ActionSlotOneButtonPressed();
902 }
903 
905 {
906  return self ActionSlotTwoButtonPressed();
907 }
908 
910 {
911  return self ActionSlotFourButtonPressed();
912 }
913 
915 {
916  return self ActionSlotThreeButtonPressed();
917 }
918 
920 {
921  state = level ‪clientfield::get( "freerun_state" );
922  if ( state == ‪FR_STATE_FINISHED || state == ‪FR_STATE_QUIT || state == ‪FR_STATE_DIALOG )
923  {
924  return true;
925  }
926 
927  return false;
928 }
929 
930 function ‪watchTrackSwitch() // self == player
931 {
932  track_count = level.FRGame.tracks.size;
933 
934  while( true )
935  {
936  wait .05;
937 
938  switch_track = false;
939 
940  if ( ‪end_game_state() )
941  {
942  continue;
943  }
944 
945  if ( !switch_track && self ‪dpad_up_pressed())
946  {
947  switch_track = true;
948  curr_track_index = level.FRGame.activeTrackIndex;
949  self thread ‪freerunMusic();
950  }
951 
952  if ( switch_track )
953  {
954  if ( curr_track_index == ‪FR_NUM_TRACKS )
955  {
956  curr_track_index = 0;
957  }
958  else if ( curr_track_index < 0 )
959  {
960  curr_track_index = ‪FR_NUM_TRACKS - 1;
961  }
962 
963  self playsoundtoplayer( "uin_freerun_reset", self );
964  ‪activateTrack( curr_track_index );
965 
966  while ( true )
967  {
968  wait .05;
969 
970  if (!( self ‪dpad_right_pressed() || self ‪dpad_left_pressed() || self ‪dpad_up_pressed() ))
971  {
972  break;
973  }
974  }
975  }
976  }
977 }
978 
979 function ‪watchUserRespawn() // self == player
980 {
981  level endon( "activate_track" );
982  level endon( "finished_track" );
983 
984  while( true )
985  {
986  wait .05;
987 
988  if ( ‪end_game_state() )
989  {
990  continue;
991  }
992 
993  if ( self ‪dpad_down_pressed() )
994  {
995  level.FRGame.userSpawns++;
996  self RecordGameEvent( "retry" );
997  level ‪clientfield::set( "freerun_retries", level.FRGame.userSpawns );
998  self playsoundtoplayer( "uin_freerun_reset", self );
1000 
1001  while ( true )
1002  {
1003  wait .05;
1004 
1005  if (!( self ‪dpad_down_pressed() ))
1006  {
1007  break;
1008  }
1009  }
1010  }
1011  }
1012 }
1013 
1014 function ‪ignoreBulletsFired(weapon)
1015 {
1016  if ( !IsDefined(level.FRGame.activespawnpoint) )
1017  return false;
1018 
1019  if ( !IsDefined(level.FRGame.activespawnpoint.weaponobject) )
1020  return false;
1021 
1022  grace_period = (weapon.fireTime * 4) * 1000;
1023 
1024  if ( (level.FRGame.activespawnpoint.weaponobject.targetShotTime + grace_period) >= GetTime() )
1025  return true;
1026 
1027  foreach( target in level.FRGame.activespawnpoint.weaponobject.targets )
1028  {
1029  if ( !target.disabled )
1030  {
1031  return false;
1032  }
1033  }
1034 
1035  return true;
1036 }
1037 
1038 function ‪watchWeaponFire() // self == player
1039 {
1040  self endon("disconnect");
1041 
1042  while(1)
1043  {
1044  self waittill( "weapon_fired", weapon );
1045 
1046  if ( weapon == level.weaponBaseMeleeHeld )
1047  continue;
1048 
1049  if ( ‪ignoreBulletsFired(weapon) )
1050  continue;
1051 
1052  level.FRGame.bulletPenalty++;
1053  level ‪clientfield::set( "freerun_bulletPenalty", level.FRGame.bulletPenalty );
1054  }
1055 }
1056 
1057 function ‪getGroundPointForOrigin( position )
1058 {
1059  ‪trace = BulletTrace( position + (0,0,10), position - (0,0,1000), false, undefined );
1060  return ‪trace["position"];
1061 }
1062 
1063 function ‪watchStartRun( player ) // self == start trigger
1064 {
1065  level endon( "activate_track" );
1066 
1067  self waittill( "trigger", trigger_ent );
1068 
1069  if ( trigger_ent == player )
1070  {
1071  player ‪startRun();
1072  }
1073 }
1074 
1075 function ‪respawnAtActiveCheckpoint() // self == player
1076 {
1077  ResetGlass();
1081 
1082  self playsoundtoplayer( "evt_freerun_respawn", self );
1083 
1084  if ( IsDefined( self.respawn_position ) )
1085  {
1086  self SetOrigin( self.respawn_position );
1087  self SetVelocity( (0,0,0) );
1088  }
1089  else if ( IsDefined( level.FRGame.activeSpawnPoint.spawnPoint ))
1090  {
1091  self SetOrigin( level.FRGame.activeSpawnPoint.spawnPoint.origin );
1092  self SetPlayerAngles( level.FRGame.activeSpawnPoint.spawnPoint.angles );
1093  self SetVelocity( (0,0,0) );
1094  }
1095  else
1096  {
1097  // no spawn point for the track start triggers
1098  spawn_origin = level.FRGame.activeSpawnLocation;
1099  spawn_origin += ( 0,0, ‪FR_SPAWN_Z_OFFSET );
1100 
1101  self SetOrigin( spawn_origin );
1102  self SetPlayerAngles( level.FRGame.activeSpawnAngles );
1103  self SetVelocity( (0,0,0) );
1104  }
1105 
1106  self setdoublejumpenergy( 1.0 );
1107  self ‪take_all_player_weapons( true, true );
1108 }
1109 
1111 {
1112  self TakeAllWeapons();
1113  self clearPerks();
1114 
1115  self SetPerk( "specialty_fallheight" );
1116 
1117  self GiveWeapon( level.weaponBaseMeleeHeld );
1118  self setSpawnWeapon( level.weaponBaseMeleeHeld );
1119 
1120  return level.weaponBaseMeleeHeld;
1121 }
1122 
1123 function ‪set_high_score_stat( trackIndex, slot, stat, value )
1124 {
1125  self setDStat( "freerunTrackTimes", "track", trackIndex, "topTimes", slot, stat, value );
1126 }
1127 
1128 function ‪write_high_scores_stats(start_index)
1129 {
1130  active_track = level.FRGame.activeTrack;
1131 
1132  self setDStat( "freerunTrackTimes", "track", level.FRGame.trackIndex, "mapUniqueId", level.FRGame.mapUniqueId );
1133  self setDStat( "freerunTrackTimes", "track", level.FRGame.trackIndex, "mapVersion", level.FRGame.mapVersion );
1134 
1135  for ( slot = start_index; slot < ‪HIGH_SCORE_COUNT; slot++ )
1136  {
1137  ‪set_high_score_stat( level.FRGame.trackIndex, slot, "time", active_track.highScores[slot].time );
1138  ‪set_high_score_stat( level.FRGame.trackIndex, slot, "faults", active_track.highScores[slot].faults );
1139  ‪set_high_score_stat( level.FRGame.trackIndex, slot, "retries", active_track.highScores[slot].retries );
1140  ‪set_high_score_stat( level.FRGame.trackIndex, slot, "bulletPenalty", active_track.highScores[slot].bulletPenalty );
1141  }
1142 }
1143 
1145 {
1146  level.FRGame.activeTrack.fastestRunCheckpointTimes = level.FRGame.checkpointTimes;
1147 
1148  for ( i = 0; i < level.FRGame.checkpointTriggers.size; i++ )
1149  {
1150  self setDStat( "freerunTrackTimes", "track", level.FRGame.trackIndex, "checkPointTimes", "time", i, level.FRGame.checkpointTimes[i] );
1151  }
1152 }
1153 
1154 function ‪get_high_score_stat( trackIndex, slot, stat )
1155 {
1156  return (self getDStat( "freerunTrackTimes", "track", trackIndex, "topTimes", slot, stat ));
1157 }
1158 
1159 function ‪create_high_score_struct( time, faults, retries, bulletPenalty ) // self == player
1160 {
1161  score_set = SpawnStruct();
1162 
1163  score_set.time = time;
1164  score_set.faults = faults;
1165  score_set.retries = retries;
1166  score_set.bulletPenalty = bulletPenalty;
1167 
1168  return score_set;
1169 }
1170 
1171 function ‪get_stats_for_track( trackIndex, slot ) // self == player
1172 {
1173  time = self ‪get_high_score_stat( trackIndex, slot, "time" );
1174  faults = self ‪get_high_score_stat( trackIndex, slot, "faults" );
1175  retries = self ‪get_high_score_stat( trackIndex, slot, "retries" );
1176  bulletPenalty = self ‪get_high_score_stat( trackIndex, slot, "bulletPenalty" );
1177 
1178  return ‪create_high_score_struct( time, faults, retries, bulletPenalty);
1179 }
1180 
1181 function ‪get_checkpoint_times_for_track( trackIndex ) // self == player
1182 {
1183  for ( i = 0; i < level.FRGame.checkpointTriggers.size; i++ )
1184  {
1185  level.FRGame.activeTrack.fastestRunCheckpointTimes[i] = self getDStat( "freerunTrackTimes", "track", trackIndex, "checkPointTimes", "time", i );
1186  }
1187 }
1188 
1190 {
1191  if ( isdefined(level.FRGame.activeTrack.statsRead) )
1192  return;
1193 
1194  mapId = self getDStat( "freerunTrackTimes", "track", level.FRGame.trackIndex, "mapUniqueId" );
1195  mapVersion = self getDStat( "freerunTrackTimes", "track", level.FRGame.trackIndex, "mapVersion" );
1196 
1197  if ( level.FRGame.mapUniqueId != mapId || level.FRGame.mapVersion != mapVersion )
1198  {
1199  for( i = 0; i < ‪HIGH_SCORE_COUNT; i++ )
1200  {
1201  level.FRGame.activeTrack.highScores[i] = ‪create_high_score_struct( 0,0,0,0 );
1202  }
1203  for ( i = 0; i < level.FRGame.checkpointTriggers.size; i++ )
1204  {
1205  level.FRGame.activeTrack.fastestRunCheckpointTimes[i] = 0;
1206  }
1207  }
1208  else
1209  {
1210  for( i = 0; i < ‪HIGH_SCORE_COUNT; i++ )
1211  {
1212  level.FRGame.activeTrack.highScores[i] = ‪get_stats_for_track( level.FRGame.trackIndex, i );
1213  }
1214  ‪get_checkpoint_times_for_track(level.FRGame.trackIndex);
1215  }
1216 
1217  level.FRGame.activeTrack.statsRead = true;
1218 }
1219 
1220 function ‪take_all_player_weapons( only_default, immediate ) // self == player
1221 {
1222  self endon("disconnect");
1223  self endon("death");
1224 
1225  keep_weapon = level.weaponNone;
1226  if ( isDefined(level.FRGame.activeSpawnPoint.weapon) && !only_default )
1227  {
1228  keep_weapon = level.FRGame.activeSpawnPoint.weapon;
1229  }
1230 
1231  if ( immediate )
1232  {
1233  self switchtoweaponimmediate(level.weaponBaseMeleeHeld);
1234  }
1235  else
1236  {
1237  while ( self isswitchingweapons() )
1238  {
1239  wait(0.05);
1240  }
1241 
1242  current_weapon = self GetCurrentWeapon();
1243 
1244  if ( current_weapon != level.weaponBaseMeleeHeld && keep_weapon != current_weapon )
1245  {
1246  self SwitchToWeapon(level.weaponBaseMeleeHeld);
1247  while( self GetCurrentWeapon() != level.weaponBaseMeleeHeld )
1248  {
1249  wait(0.05);
1250  }
1251  }
1252  }
1253 
1254  weaponsList = self GetWeaponsList();
1255  foreach( weapon in weaponsList )
1256  {
1257  if ( weapon != level.weaponBaseMeleeHeld && keep_weapon != weapon )
1258  self TakeWeapon( weapon );
1259  }
1260 }
1261 
1262 function ‪freerunMusic(start=true)
1263 {
1264  player = self;
1265 
1266  if( start && !‪IS_TRUE(player.musicStart) )
1267  {
1268  mapname = GetDvarString( "mapname" );
1270  player.musicStart = true;
1271  }
1272  else if( !start )
1273  {
1274  player ‪globallogic_audio::set_music_on_player( "mp_freerun_finish" );
1275  player.musicStart = false;
1276  }
1277 }
1278 
1279 function ‪_tutorial_mode( b_tutorial_mode )
1280 {
1281 }
1282 
1284 {
1285  if ( level.FRGame.tutorials )
1286  {
1287  foreach( player in level.players )
1288  {
1289  player ‪_tutorial_mode( false );
1290  }
1291  }
1292 }
1293 
1295 {
1296  if ( level.FRGame.tutorials )
1297  {
1298  foreach( player in level.players )
1299  {
1300  player ‪_tutorial_mode( true );
1301  }
1302  }
1303 }
1304 
1306 {
1307  if ( level.FRGame.tutorials )
1308  {
1309  foreach( trigger in level.FRGame.tutorialTriggers )
1310  {
1311  trigger TriggerEnable( true );
1312  }
1313  }
1314 }
1315 
1317 {
1318  // profile var will be 0 if never run before
1319  // this profile setting will not work if someone can play on a remote server
1320  if ( (!(self IsHost()) || GetLocalProfileInt( "com_firsttime_freerun" )) && !GetDvarInt( "freerun_tutorial" ) )
1321  {
1322  return;
1323  }
1324 
1325  level.FRGame.tutorials = true;
1326 
1327  wait(1);
1328 
1329  foreach( trigger in level.FRGame.tutorialTriggers )
1330  {
1331  trigger thread ‪watchTutorialTrigger();
1332  }
1333 
1334 }
1335 
1337 {
1338  level.FRGame.tutorials = false;
1339 
1340  level.FRGame.tutorialTriggers = GetEntArray( "fr_tutorial", "targetname" );
1341 
1342  level.FRGame.tutorialFunctions = [];
1343 
1345 }
1346 
1348 {
1349  level endon("stop_tutorials");
1350 
1351  while( true )
1352  {
1353  self waittill( "trigger", player );
1354 
1355  if ( IsPlayer( player ))
1356  {
1357  player thread ‪start_tutorial(self.script_noteworthy);
1358  self TriggerEnable( false );
1359  }
1360  }
1361 }
1362 
1364 {
1365  self notify("stop_tutorial_when_restarting_track");
1366  self waittill("stop_tutorial_when_restarting_track");
1367 
1368  level waittill( "activate_track" );
1369 
1371  self ‪util::hide_hint_text(false);
1372 
1373  self ‪stop_tutorial_vo();
1374  self stopsounds();
1375 }
1376 
1377 function ‪start_tutorial( tutorial )
1378 {
1379  self endon("death");
1380  self endon("disconnect");
1381  level endon( "game_ended" );
1382  level endon( "activate_track" );
1383  if (!isdefined(level.FRGame.tutorialFunctions[tutorial]))
1384  return;
1385 
1386  level notify( "playing_tutorial" );
1387  level endon( "playing_tutorial" );
1388 
1390 
1392  wait( 0.5 );
1393  [[level.FRGame.tutorialFunctions[tutorial]]]();
1395 }
1396 
1398 {
1399  if ( isdefined( self.lastTutorialVOPlayed ) )
1400  {
1401  self stopsound(self.lastTutorialVOPlayed);
1402  self.lastTutorialVOPlayed = undefined;
1403  }
1404 }
1405 
1406 function ‪play_tutorial_vo( aliasstring )
1407 {
1408  self ‪stop_tutorial_vo();
1409 
1410  self.lastTutorialVOPlayed = aliasstring;
1411  self playsoundwithnotify( aliasstring, "sounddone" );
1412  self waittill( "sounddone");
1413  wait( 1.0 );
1414 }
1415 
1416 function ‪play_tutorial_vo_with_hint( aliasstring, text )
1417 {
1418  self ‪stop_tutorial_vo();
1419 
1420  self thread ‪_show_tutorial_hint_with_vo( text );
1421 
1422  self.lastTutorialVOPlayed = aliasstring;
1423  self playsoundwithnotify( aliasstring, "sounddone" );
1424  self waittill( "sounddone");
1425  wait( 1.0 );
1426 }
1427 
1428 function ‪_show_tutorial_hint_with_vo( text, time, unlock_player )
1429 {
1430  wait (0.5);
1431  ‪show_tutorial_hint( text, time, unlock_player );
1432 }
1433 
1434 function ‪show_tutorial_hint( text, time, unlock_player )
1435 {
1436  if ( isdefined( unlock_player ) )
1437  {
1439  }
1440 
1441  if (!isdefined(time) )
1442  {
1444  }
1445  self ‪util::show_hint_text( text, false, "activate_track", ‪TUTORIAL_TEXT_HINT_TIME);
1446  wait( ‪TUTORIAL_TEXT_HINT_TIME + 0.5);
1447 }
1448 
1450 {
1451  ‪show_tutorial_hint( text, time, true );
1452 }
1453 
1455 {
1456  level.FRGame.tutorialFunctions["tutorial_01"] = &‪tutorial_01;
1457  level.FRGame.tutorialFunctions["tutorial_02"] = &‪tutorial_02;
1458  level.FRGame.tutorialFunctions["tutorial_03"] = &‪tutorial_03;
1459  level.FRGame.tutorialFunctions["tutorial_06"] = &‪tutorial_06;
1460  level.FRGame.tutorialFunctions["tutorial_08"] = &‪tutorial_08;
1461  level.FRGame.tutorialFunctions["tutorial_09"] = &‪tutorial_09;
1462  level.FRGame.tutorialFunctions["tutorial_10"] = &‪tutorial_10;
1463  level.FRGame.tutorialFunctions["tutorial_10a"] = &‪tutorial_10a;
1464  level.FRGame.tutorialFunctions["tutorial_12"] = &‪tutorial_12;
1465  level.FRGame.tutorialFunctions["tutorial_12a"] = &‪tutorial_12a;
1466  level.FRGame.tutorialFunctions["tutorial_13"] = &‪tutorial_13;
1467  level.FRGame.tutorialFunctions["tutorial_14"] = &‪tutorial_14;
1468  level.FRGame.tutorialFunctions["tutorial_15"] = &‪tutorial_15;
1469  level.FRGame.tutorialFunctions["tutorial_16"] = &‪tutorial_16;
1470  level.FRGame.tutorialFunctions["tutorial_17"] = &‪tutorial_17;
1471  level.FRGame.tutorialFunctions["tutorial_17a"] = &‪tutorial_17a;
1472  level.FRGame.tutorialFunctions["tutorial_18"] = &‪tutorial_18;
1473  level.FRGame.tutorialFunctions["tutorial_19"] = &‪tutorial_19;
1474  level.FRGame.tutorialFunctions["tutorial_20"] = &‪tutorial_20;
1475 }
1476 
1477 function ‪tutorial_01()
1478 {
1479  self ‪play_tutorial_vo( "vox_tuto_tutorial_sequence_1" );
1480  self ‪play_tutorial_vo( "vox_tuto_tutorial_sequence_2" );
1481  self ‪play_tutorial_vo( "vox_tuto_tutorial_sequence_6" );
1482 }
1483 
1484 function ‪tutorial_02()
1485 {
1486  self ‪show_tutorial_hint_with_full_movement( &"FREERUN_TUTORIAL_02" );
1487 }
1488 
1489 function ‪tutorial_03()
1490 {
1491  self ‪show_tutorial_hint_with_full_movement( &"FREERUN_TUTORIAL_03" );
1492 }
1493 
1494 function ‪tutorial_06()
1495 {
1496  self thread ‪play_tutorial_vo( "vox_tuto_tutorial_sequence_11" );
1497  self ‪show_tutorial_hint_with_full_movement( &"FREERUN_TUTORIAL_09" );
1498 }
1499 
1500 function ‪tutorial_08()
1501 {
1502  self ‪show_tutorial_hint_with_full_movement( &"FREERUN_TUTORIAL_11" );
1503 }
1504 
1505 function ‪tutorial_09()
1506 {
1507  self ‪play_tutorial_vo_with_hint( "vox_tuto_tutorial_sequence_28", &"FREERUN_TUTORIAL_12" );
1508 }
1509 
1510 function ‪tutorial_10()
1511 {
1512  self ‪play_tutorial_vo( "vox_tuto_tutorial_sequence_10" );
1513 }
1514 
1516 {
1517  self ‪show_tutorial_hint_with_full_movement( &"FREERUN_TUTORIAL_13" );
1518 }
1519 
1520 function ‪tutorial_12()
1521 {
1522  self ‪play_tutorial_vo( "vox_tuto_tutorial_sequence_16" );
1523 }
1524 
1526 {
1527  self ‪show_tutorial_hint_with_full_movement( &"FREERUN_TUTORIAL_14" );
1528 }
1529 
1530 function ‪tutorial_13()
1531 {
1532  self ‪play_tutorial_vo_with_hint( "vox_tuto_tutorial_sequence_17", &"FREERUN_TUTORIAL_14a" );
1533  self ‪play_tutorial_vo( "vox_tuto_tutorial_sequence_18" );
1534  self ‪show_tutorial_hint_with_full_movement( &"FREERUN_TUTORIAL_16" );
1535 }
1536 
1537 function ‪tutorial_14()
1538 {
1539  self ‪play_tutorial_vo( "vox_tuto_tutorial_sequence_19" );
1540  self ‪show_tutorial_hint_with_full_movement( &"FREERUN_TUTORIAL_18" );
1541 }
1542 
1543 function ‪tutorial_15()
1544 {
1545  self ‪play_tutorial_vo( "vox_tuto_tutorial_sequence_20" );
1546 }
1547 
1548 function ‪tutorial_16()
1549 {
1550  self ‪play_tutorial_vo( "vox_tuto_tutorial_sequence_29" );
1551 }
1552 
1553 function ‪tutorial_17()
1554 {
1555  self ‪play_tutorial_vo( "vox_tuto_tutorial_sequence_21" );
1556 }
1557 
1559 {
1560  self ‪show_tutorial_hint_with_full_movement( &"FREERUN_TUTORIAL_22" );
1561 }
1562 
1563 
1564 function ‪tutorial_18()
1565 {
1566  self ‪play_tutorial_vo_with_hint( "vox_tuto_tutorial_sequence_23", &"FREERUN_TUTORIAL_23" );
1567  self ‪show_tutorial_hint_with_full_movement( &"FREERUN_TUTORIAL_22a" );
1568 }
1569 
1570 function ‪tutorial_19()
1571 {
1572  self ‪play_tutorial_vo( "vox_tuto_tutorial_sequence_25" );
1573 }
1574 
1575 function ‪tutorial_20()
1576 {
1577  self ‪play_tutorial_vo( "vox_tuto_tutorial_sequence_26" );
1578 }
‪setup_tutorial
‪function setup_tutorial()
Definition: fr.gsc:1336
‪FR_RETRIES_BITS
‪#define FR_RETRIES_BITS
Definition: fr.gsh:8
‪set_high_score_stat
‪function set_high_score_stat(trackIndex, slot, stat, value)
Definition: fr.gsc:1123
‪end_game_state
‪function end_game_state()
Definition: fr.gsc:919
‪respawn_pickup
‪function respawn_pickup()
Definition: _pickup_items.gsc:362
‪setObjectiveText
‪function setObjectiveText(team, text)
Definition: _util.gsc:585
‪reset_targets
‪function reset_targets()
Definition: fr.gsc:846
‪FR_STATE_QUIT
‪#define FR_STATE_QUIT
Definition: fr.gsh:5
‪dpad_right_pressed
‪function dpad_right_pressed()
Definition: fr.gsc:909
‪_show_tutorial_hint_with_vo
‪function _show_tutorial_hint_with_vo(text, time, unlock_player)
Definition: fr.gsc:1428
‪setvisiblescoreboardcolumns
‪function setvisiblescoreboardcolumns(col1, col2, col3, col4, col5)
Definition: _globallogic.gsc:545
‪show_tutorial_hint
‪function show_tutorial_hint(text, time, unlock_player)
Definition: fr.gsc:1434
‪get_high_score_stat
‪function get_high_score_stat(trackIndex, slot, stat)
Definition: fr.gsc:1154
‪tutorial_12
‪function tutorial_12()
Definition: fr.gsc:1520
‪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
‪updateAllSpawnPoints
‪function updateAllSpawnPoints()
Definition: _spawning.gsc:551
‪registerRoundWinLimit
‪function registerRoundWinLimit(minValue, maxValue)
Definition: _util.gsc:630
‪TUTORIAL_TEXT_HINT_TIME
‪#define TUTORIAL_TEXT_HINT_TIME
Definition: fr.gsc:53
‪blocker_disable
‪function blocker_disable()
Definition: fr.gsc:834
‪activate_tutorial_mode
‪function activate_tutorial_mode()
Definition: fr.gsc:1316
‪leaveCheckpointTrigger
‪function leaveCheckpointTrigger(player)
Definition: fr.gsc:529
‪register_allowed_gameobject
‪function register_allowed_gameobject(gameobject)
Definition: gameobjects_shared.gsc:67
‪readHighScores
‪function readHighScores()
Definition: fr.gsc:415
‪startRun
‪function startRun()
Definition: fr.gsc:491
‪watchUserRespawn
‪function watchUserRespawn()
Definition: fr.gsc:979
‪on_menu_response
‪function on_menu_response()
Definition: fr.gsc:341
‪find_box_center
‪function find_box_center(mins, maxs)
Definition: math_shared.gsc:86
‪tutorial_09
‪function tutorial_09()
Definition: fr.gsc:1505
‪get_top_scores_stats
‪function get_top_scores_stats()
Definition: fr.gsc:1189
‪sign
‪function sign(x)
Definition: math_shared.csc:164
‪HIGH_SCORE_COUNT
‪#define HIGH_SCORE_COUNT
Definition: fr.gsc:55
‪respawn_all_pickups
‪function respawn_all_pickups()
Definition: _pickup_items.gsc:374
‪play_tutorial_vo
‪function play_tutorial_vo(aliasstring)
Definition: fr.gsc:1406
‪reset_all_targets
‪function reset_all_targets()
Definition: fr.gsc:857
‪VERSION_SHIP
‪#define VERSION_SHIP
Definition: version.gsh:36
‪FR_STATE_PRESTART
‪#define FR_STATE_PRESTART
Definition: fr.gsh:1
‪stop_tutorial_when_restarting_track
‪function stop_tutorial_when_restarting_track()
Definition: fr.gsc:1363
‪enable_all_tutorial_triggers
‪function enable_all_tutorial_triggers()
Definition: fr.gsc:1305
‪dpad_down_pressed
‪function dpad_down_pressed()
Definition: fr.gsc:904
‪play_fault_VO
‪function play_fault_VO()
Definition: fr.gsc:868
‪trigger_thread
‪function trigger_thread(ent, on_enter_payload, on_exit_payload)
Definition: _util.gsc:515
‪tutorial_14
‪function tutorial_14()
Definition: fr.gsc:1537
‪watchStartRun
‪function watchStartRun(player)
Definition: fr.gsc:1063
‪onStartGameType
‪function onStartGameType()
Definition: fr.gsc:204
‪trace
‪function trace(from, to, target)
Definition: grapple.gsc:369
‪registerFriendlyFireDelay
‪function registerFriendlyFireDelay(dvarString, defaultValue, minValue, maxValue)
Definition: _globallogic.gsc:3917
‪FR_STATE_RUNNING
‪#define FR_STATE_RUNNING
Definition: fr.gsh:2
‪tutorial_16
‪function tutorial_16()
Definition: fr.gsc:1548
‪onSpawnPlayer
‪function onSpawnPlayer(predictedSpawn)
Definition: fr.gsc:357
‪trackPlayerOrigin
‪function trackPlayerOrigin()
Definition: fr.gsc:402
‪FR_STATE_FINISHED
‪#define FR_STATE_FINISHED
Definition: fr.gsh:3
‪freeze_player_controls
‪function freeze_player_controls(b_frozen=true)
Definition: util_shared.gsc:2474
‪spawn
‪function spawn(v_origin=(0, 0, 0), v_angles=(0, 0, 0))
Definition: struct.csc:23
‪FR_SPAWN_Z_OFFSET
‪#define FR_SPAWN_Z_OFFSET
Definition: fr.gsc:51
‪IS_TRUE
‪#define IS_TRUE(__a)
Definition: shared.gsh:251
‪setup_weapon_targets
‪function setup_weapon_targets()
Definition: fr.gsc:734
‪getGroundPointForOrigin
‪function getGroundPointForOrigin(position)
Definition: fr.gsc:1057
‪get
‪function get(kvp_value, kvp_key="targetname")
Definition: struct.csc:13
‪registerNumLives
‪function registerNumLives(minValue, maxValue, teamLivesMinValue, teamLivesMaxValue)
Definition: _util.gsc:664
‪registerScoreLimit
‪function registerScoreLimit(minValue, maxValue)
Definition: _util.gsc:638
‪_tutorial_mode
‪function _tutorial_mode(b_tutorial_mode)
Definition: fr.gsc:1279
‪create_high_score_struct
‪function create_high_score_struct(time, faults, retries, bulletPenalty)
Definition: fr.gsc:1159
‪add_spawn_points
‪function add_spawn_points(team, spawnPointName)
Definition: _spawnlogic.gsc:20
‪create_map_placed_influencers
‪function create_map_placed_influencers()
Definition: _spawning.gsc:522
‪track
‪function track(spot_to_track)
Definition: util_shared.gsc:238
‪tutorial_15
‪function tutorial_15()
Definition: fr.gsc:1543
‪tutorial_19
‪function tutorial_19()
Definition: fr.gsc:1570
‪updateHighScores
‪function updateHighScores()
Definition: fr.gsc:422
‪damage
‪function damage(trap)
Definition: _zm_trap_electric.gsc:116
‪setupTeam
‪function setupTeam(team)
Definition: fr.gsc:187
‪giveCustomLoadout
‪function giveCustomLoadout()
Definition: fr.gsc:1110
‪freerunMusic
‪function freerunMusic(start=true)
Definition: fr.gsc:1262
‪get_stats_for_track
‪function get_stats_for_track(trackIndex, slot)
Definition: fr.gsc:1171
‪tutorial_06
‪function tutorial_06()
Definition: fr.gsc:1494
‪dpad_up_pressed
‪function dpad_up_pressed()
Definition: fr.gsc:899
‪get_current_track_time
‪function get_current_track_time(player)
Definition: fr.gsc:534
‪activateTrack
‪function activateTrack(trackIndex)
Definition: fr.gsc:428
‪watchWeaponFire
‪function watchWeaponFire()
Definition: fr.gsc:1038
‪stop_tutorial_vo
‪function stop_tutorial_vo()
Definition: fr.gsc:1397
‪FR_TIME_BITS
‪#define FR_TIME_BITS
Definition: fr.gsh:10
‪main
‪function main()
Definition: fr.gsc:106
‪tutorial_12a
‪function tutorial_12a()
Definition: fr.gsc:1525
‪freeze
‪function freeze()
Definition: fr.gsc:724
‪ignoreBulletsFired
‪function ignoreBulletsFired(weapon)
Definition: fr.gsc:1014
‪watchTutorialTrigger
‪function watchTutorialTrigger()
Definition: fr.gsc:1347
‪respawnAtActiveCheckpoint
‪function respawnAtActiveCheckpoint()
Definition: fr.gsc:1075
‪put_players_in_tutorial_mode
‪function put_players_in_tutorial_mode()
Definition: fr.gsc:1294
‪show_hint_text
‪function show_hint_text(str_text_to_show, b_should_blink=false, str_turn_off_notify=HINT_TEXT_TURN_OFF_NOTIFY, n_display_time=HINT_TEXT_DISPLAY_TIME_DEFAULT)
Definition: _util.gsc:1042
‪get_spawnpoint_array
‪function get_spawnpoint_array(classname)
Definition: _spawnlogic.gsc:27
‪watchGoalTrigger
‪function watchGoalTrigger()
Definition: fr.gsc:666
‪on_player_damage
‪function on_player_damage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime)
Definition: fr.gsc:389
‪watch_for_game_end
‪function watch_for_game_end()
Definition: fr.gsc:324
‪setObjectiveHintText
‪function setObjectiveHintText(team, text)
Definition: _util.gsc:595
‪watch_target_trigger_thread
‪function watch_target_trigger_thread(weaponObject)
Definition: fr.gsc:789
‪FR_NUM_TRACKS
‪#define FR_NUM_TRACKS
Definition: fr.gsc:50
‪FR_FAULTS_BITS
‪#define FR_FAULTS_BITS
Definition: fr.gsh:9
‪_get_spawnpoint_array
‪function _get_spawnpoint_array(spawnpoint_name)
Definition: _spawnlogic.gsc:26
‪tutorial_02
‪function tutorial_02()
Definition: fr.gsc:1484
‪add_current_run_to_high_scores
‪function add_current_run_to_high_scores(player)
Definition: fr.gsc:615
‪tutorial_10
‪function tutorial_10()
Definition: fr.gsc:1510
‪tutorial_18
‪function tutorial_18()
Definition: fr.gsc:1564
‪onCheckpointTrigger
‪function onCheckpointTrigger(player, endOnString)
Definition: fr.gsc:508
‪unfreeze
‪function unfreeze()
Definition: fr.gsc:729
‪take_players_out_of_tutorial_mode
‪function take_players_out_of_tutorial_mode()
Definition: fr.gsc:1283
‪tutorial_20
‪function tutorial_20()
Definition: fr.gsc:1575
‪watchDeathTrigger
‪function watchDeathTrigger()
Definition: fr.gsc:602
‪start_tutorial
‪function start_tutorial(tutorial)
Definition: fr.gsc:1377
‪watchTrackSwitch
‪function watchTrackSwitch()
Definition: fr.gsc:930
‪registerRoundLimit
‪function registerRoundLimit(minValue, maxValue)
Definition: _util.gsc:622
‪dpad_left_pressed
‪function dpad_left_pressed()
Definition: fr.gsc:914
‪write_high_scores_stats
‪function write_high_scores_stats(start_index)
Definition: fr.gsc:1128
‪init
‪function init()
Definition: struct.csc:1
‪on_player_connect
‪function on_player_connect()
Definition: fr.gsc:336
‪write_checkpoint_times
‪function write_checkpoint_times()
Definition: fr.gsc:1144
‪get_checkpoint_times_for_track
‪function get_checkpoint_times_for_track(trackIndex)
Definition: fr.gsc:1181
‪set
‪function set(str_field_name, n_value)
Definition: clientfield_shared.gsc:34
‪tutorial_01
‪function tutorial_01()
Definition: fr.gsc:1477
‪tutorial_10a
‪function tutorial_10a()
Definition: fr.gsc:1515
‪tutorial_13
‪function tutorial_13()
Definition: fr.gsc:1530
‪tutorial_08
‪function tutorial_08()
Definition: fr.gsc:1500
‪setObjectiveScoreText
‪function setObjectiveScoreText(team, text)
Definition: _util.gsc:590
‪hide_hint_text
‪function hide_hint_text(b_fade_before_hiding=true)
Definition: _util.gsc:1084
‪faultDeath
‪function faultDeath()
Definition: fr.gsc:887
‪blocker_enable
‪function blocker_enable()
Definition: fr.gsc:825
‪FR_STATE_DIALOG
‪#define FR_STATE_DIALOG
Definition: fr.gsh:6
‪show_tutorial_hint_with_full_movement
‪function show_tutorial_hint_with_full_movement(text, time)
Definition: fr.gsc:1449
‪register
‪function register()
Definition: _ai_tank.gsc:126
‪tutorial_03
‪function tutorial_03()
Definition: fr.gsc:1489
‪turn_off_target
‪function turn_off_target(weapon)
Definition: fr.gsc:813
‪on_connect
‪function on_connect()
Definition: _arena.gsc:20
‪watchCheckpointTrigger
‪function watchCheckpointTrigger()
Definition: fr.gsc:546
‪registerTimeLimit
‪function registerTimeLimit(minValue, maxValue)
Definition: _util.gsc:655
‪play_tutorial_vo_with_hint
‪function play_tutorial_vo_with_hint(aliasstring, text)
Definition: fr.gsc:1416
‪tutorial_17
‪function tutorial_17()
Definition: fr.gsc:1553
‪get_random_intermission_point
‪function get_random_intermission_point()
Definition: _spawnlogic.gsc:54
‪register_tutorials
‪function register_tutorials()
Definition: fr.gsc:1454
‪tutorial_17a
‪function tutorial_17a()
Definition: fr.gsc:1558
‪take_all_player_weapons
‪function take_all_player_weapons(only_default, immediate)
Definition: fr.gsc:1220
‪WAIT_SERVER_FRAME
‪#define WAIT_SERVER_FRAME
Definition: shared.gsh:265
‪PlayFx
‪function PlayFx(name)
Definition: _counteruav.gsc:390