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;
17 #insert scripts\shared\shared.gsh;
18 #insert scripts\shared\version.gsh;
19 #insert scripts\mp\gametypes\fr.gsh;
49 #define FR_DEATH_PENALTY_SECONDS 5.0
50 #define FR_NUM_TRACKS 1
51 #define FR_SPAWN_Z_OFFSET 5.0
53 #define TUTORIAL_TEXT_HINT_TIME 4.0
55 #define HIGH_SCORE_COUNT 3
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" );
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" );
101 #precache( "fx", "ui/fx_fr_target_demat" );
102 #precache( "fx", "ui/fx_fr_target_impact" );
104 #precache( "menu", MENU_FREERUN_RESTART );
108 level.trackWeaponStats =
false;
131 level.scoreRoundWinBased = ( GetGametypeSetting(
"cumulativeRoundScores" ) == false );
132 level.teamScorePerKill = GetGametypeSetting(
"teamScorePerKill" );
133 level.teamScorePerDeath = GetGametypeSetting(
"teamScorePerDeath" );
134 level.teamScorePerHeadshot = GetGametypeSetting(
"teamScorePerHeadshot" );
140 level.postRoundTime = 0.5;
141 level.doEndgameScoreboard =
false;
148 if ( !IsDefined( level.fr_target_impact_fx ) )
150 level.fr_target_impact_fx =
"ui/fx_fr_target_impact";
152 if ( !IsDefined( level.fr_target_disable_fx ) )
154 level.fr_target_disable_fx =
"ui/fx_fr_target_demat";
156 if ( !IsDefined( level.fr_target_disable_sound ) )
158 level.fr_target_disable_sound =
"wpn_grenade_explode_default";
161 level.FRGame = SpawnStruct();
163 level.FRGame.activeTrackIndex = 0;
164 level.FRGame.tracks = [];
168 level.FRGame.tracks[i] = SpawnStruct();
170 level.FRGame.tracks[i].startTrigger = GetEnt(
"fr_start_0" + i,
"targetname" );
171 assert( IsDefined( level.FRGame.tracks[i].startTrigger ));
173 level.FRGame.tracks[i].goalTrigger = GetEnt(
"fr_end_0" + i,
"targetname" );
174 assert( IsDefined( level.FRGame.tracks[i].goalTrigger ));
176 level.FRGame.tracks[i].highScores = [];
179 level.FRGame.checkpointTriggers = GetEntArray(
"fr_checkpoint",
"targetname" );
180 assert( level.FRGame.checkpointTriggers.size );
191 if ( level.splitscreen )
206 setClientNameMode(
"auto_change");
208 level.useXCamsForEndGame =
false;
209 level.can_set_aar_stat =
false;
210 level.disableBehaviorTracker =
true;
211 level.disableStatTracking =
true;
216 level.spawnMins = ( 0, 0, 0 );
217 level.spawnMaxs = ( 0, 0, 0 );
219 foreach( team
in level.teams )
227 foreach( index, trigger
in level.FRGame.checkpointTriggers )
229 level.FRGame.checkpointTimes[index] = 0;
230 trigger.checkPointIndex = index;
235 foreach(
spawn in spawns )
237 dist = DistanceSquared(
spawn.origin, trigger.origin );
238 if ( dist < closest )
241 trigger.spawnPoint =
spawn;
245 assert( IsDefined( trigger.spawnPoint ));
249 assert( player_starts.size );
251 foreach(
track in level.FRGame.tracks )
254 foreach( start
in player_starts )
256 dist = DistanceSquared( start.origin,
track.startTrigger.origin );
257 if ( dist < closest )
260 track.playerStart = start;
264 assert( IsDefined(
track.playerStart ));
267 level.FRGame.deathTriggers = GetEntArray(
"fr_die",
"targetname" );
268 assert( level.FRGame.deathTriggers.size );
270 foreach( trigger
in level.FRGame.deathTriggers )
277 if(!IsDefined (level.freerun))
279 level.freerun =
true;
283 setMapCenter( level.mapCenter );
286 setDemoIntermissionPoint( spawnpoint.origin, spawnpoint.angles );
289 level.useStartSpawns =
false;
290 level.displayRoundEndText =
false;
294 level.displayRoundEndText =
true;
297 foreach( item
in level.pickup_items )
300 foreach( trigger
in level.FRGame.checkpointTriggers )
302 dist = DistanceSquared( item.origin, trigger.origin );
303 if ( dist < closest )
306 item.checkPoint = trigger;
309 assert( IsDefined( item.checkPoint ));
311 item.checkPoint.weapon = item.visuals[0].items[0].weapon;
312 item.checkPoint.weaponObject = item;
319 level.FRGame.trackIndex = GetFreerunTrackIndex( );
320 level.FRGame.mapUniqueId = GetMissionUniqueID( );
321 level.FRGame.mapVersion = GetMissionVersion( );
326 level waittill(
"game_ended");
343 self endon(
"disconnect");
347 self waittill(
"menuresponse", menu, response);
348 if ( response ==
"fr_restart" )
350 self playsoundtoplayer(
"uin_freerun_reset",
self );
361 if ( predictedSpawn )
365 if ( IsDefined(
self.FRInited ) )
372 self.FRInited =
true;
384 level.FRGame.lastPlayedFaultVOTime = 0;
386 self DisableWeaponCycling();
389 function on_player_damage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime )
391 if ( iDamage >=
self.health )
394 self.health =
self.maxHealth + 1;
404 self endon(
"disconnect" );
408 self.prev_origin =
self.origin;
409 self.prev_time = GetTime();
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 );
430 level notify(
"activate_track" );
433 if ( level.FRGame.tracks.size > 1 )
435 IPrintLn(
"Track " + trackIndex );
439 if ( !isdefined( level.FRGame.tutorials ) || !level.FRGame.tutorials )
442 self playlocalsound(
"vox_tuto_tutorial_sequence_27" );
445 level.FRGame.lastPlayedFaultVOCheckpoint = -1;
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;
453 level.FRGame.activeSpawnPoint.checkpointIndex = 0;
455 level.FRGame.faults = 0;
456 level.FRGame.userSpawns = 0;
457 level.FRGame.checkpointTimes = [];
458 foreach( index, trigger
in level.FRGame.checkpointTriggers )
460 level.FRGame.checkpointTimes[index] = 0;
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" );
483 self.respawn_position = undefined;
488 level.FRGame.activeTrack.startTrigger thread
watchStartRun(
self );
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;
503 self playsoundtoplayer(
"uin_freerun_start",
self );
510 self endon( endOnString );
513 level.FRGame.activeSpawnAngles = player.angles;
515 if ( level.FRGame.activeSpawnPoint !=
self )
517 level.FRGame.activeSpawnPoint =
self;
521 if ( IsDefined(
self.weaponObject) )
537 dt = curtime - player.prev_time;
539 frac = getfirsttouchfraction( player,
self, player.prev_origin, player.origin );
541 current_time = (curtime - level.FRGame.trackStartTime + (level.FRGame.bulletPenalty * 1000) + (level.FRGame.userSpawns * 5000) - level.FRGame.totalPausedTime);
543 return int(current_time - dt * ( 1 - frac ));
548 self waittill(
"trigger", player );
550 if ( IsPlayer( player ))
552 if ( level.FRGame.activeSpawnPoint !=
self )
554 checkpoint_index =
self.checkpointIndex;
561 if ( !IsDefined( level.FRGame.checkpointTimes[ checkpoint_index ] ) || level.FRGame.checkpointTimes[ checkpoint_index ] == 0 )
563 level.FRGame.checkpointTimes[ checkpoint_index ] = current_time;
569 if ( IsDefined( level.FRGame.activeTrack.fastestRunCheckpointTimes ) )
571 if ( IsDefined( level.FRGame.activeTrack.fastestRunCheckpointTimes[checkpoint_index] ) && level.FRGame.activeTrack.fastestRunCheckpointTimes[checkpoint_index] )
573 delta_time = current_time - level.FRGame.activeTrack.fastestRunCheckpointTimes[checkpoint_index];
575 if ( delta_time < 0 )
577 delta_time = -delta_time;
595 player playsoundtoplayer(
"uin_freerun_checkpoint", player );
606 self waittill(
"trigger", player );
608 if ( IsPlayer( player ))
617 active_track = level.FRGame.activeTrack;
624 if ( active_track.highScores.size > 0 )
626 for ( i = 0; i < active_track.highScores.size; i++ )
628 if ( (run_data.time < active_track.highScores[i].time) || (active_track.highScores[i].time == 0) )
632 ArrayInsert( active_track.highScores, run_data, i );
654 ArrayInsert( active_track.highScores, run_data, active_track.highScores.size );
668 level notify(
"watch_goal_trigger" );
669 level endon(
"watch_goal_trigger" );
671 self waittill(
"trigger", player );
673 if ( IsPlayer( player ))
675 player playsoundtoplayer(
"uin_freerun_finish", player );
681 tracksCompleted = player getDStat(
"freerunTracksCompleted" );
683 if ( tracksCompleted < level.FRGame.trackIndex )
685 player setDStat(
"freerunTracksCompleted", level.FRGame.trackIndex );
688 player RecordGameEvent(
"completion" );
690 player.respawn_position =
self.origin;
696 level notify(
"finished_track" );
699 if ( player IsHost() )
701 level notify(
"stop_tutorials");
703 level.FRGame.tutorials =
false;
704 SetLocalProfileVar(
"com_firsttime_freerun", 1 );
706 highest_track = GetLocalProfileInt(
"freerunHighestTrack" );
708 if ( highest_track < level.FRGame.trackIndex )
710 SetLocalProfileVar(
"freerunHighestTrack", level.FRGame.trackIndex );
718 player uploadleaderboards();
736 target_name =
self.weaponObject.visuals[0].target;
737 if ( !IsDefined(target_name) )
740 self.weaponObject.targetShotTime = 0;
741 self.weaponObject.targets = [];
742 self.weaponObject.target_visuals = [];
744 targets = GetEntArray( target_name,
"targetname" );
745 foreach( target
in targets )
747 if ( target.script_noteworthy ==
"fr_target" )
749 self.weaponObject.targets[
self.weaponObject.targets.size] = target;
751 if ( target.script_noteworthy ==
"fr_target_visual" )
753 self.weaponObject.target_visuals[
self.weaponObject.target_visuals.size] = target;
757 foreach ( target
in self.weaponObject.targets )
759 foreach( visual
in self.weaponObject.target_visuals )
761 if ( target.origin == visual.origin )
763 target.visual = visual;
768 foreach ( target
in self.weaponObject.targets )
770 target.blocker = GetEnt( target.target,
"targetname" );
771 if ( IsDefined( target.blocker ) )
773 if ( !isdefined( target.blocker.targetCount ) )
775 target.blocker.targetCount = 0;
776 target.blocker.activeTargetCount = 0;
779 target.blocker.targetCount++;
780 target.blocker.activeTargetCount++;
782 target.checkPoint =
self;
783 target.disabled =
false;
791 self endon(
"death" );
795 self waittill (
"damage",
damage, attacker, direction_vec, point, type, modelName, tagName, partName, weapon, iDFlags );
797 if ( level.FRGame.activeSpawnPoint !=
self.checkPoint )
800 if ( weapon == level.weaponBaseMeleeHeld )
808 PlayFx( level.fr_target_impact_fx, point, direction_vec );
809 weaponObject.targetShotTime = GetTime();
815 self.disabled =
true;
817 self.visual notsolid();
821 Playfx( level.fr_target_disable_fx,
self.origin );
822 PlaySoundAtPosition( level.fr_target_disable_sound,
self.origin );
827 self.activeTargetCount =
self.targetCount;
829 self.disabled =
false;
836 self.activeTargetCount--;
838 if (
self.activeTargetCount == 0 )
840 self.disabled =
true;
848 foreach ( target
in self.targets )
851 target.visual show();
852 target.visual solid();
853 target.disabled =
false;
859 foreach( trigger
in level.FRGame.checkpointTriggers )
861 if ( IsDefined( trigger.weaponObject ) )
870 current_time = GetTime();
871 fault_vo_interval = 20000;
873 if ( current_time - level.FRGame.lastPlayedFaultVOTime < fault_vo_interval )
876 if ( isdefined(
self.lastTutorialVOPlayed ) )
879 if ( level.FRGame.lastPlayedFaultVOCheckpoint == level.FRGame.activeSpawnPoint.checkpointIndex )
882 level.FRGame.lastPlayedFaultVOCheckpoint = level.FRGame.activeSpawnPoint.checkpointIndex;
883 level.FRGame.lastPlayedFaultVOTime = current_time;
884 self playlocalsound(
"vox_tuto_tutorial_fail" );
892 level.FRGame.faults++;
893 self RecordGameEvent(
"fault" );
895 self playsoundtoplayer(
"uin_freerun_reset",
self );
901 return self ActionSlotOneButtonPressed();
906 return self ActionSlotTwoButtonPressed();
911 return self ActionSlotFourButtonPressed();
916 return self ActionSlotThreeButtonPressed();
932 track_count = level.FRGame.tracks.size;
938 switch_track =
false;
948 curr_track_index = level.FRGame.activeTrackIndex;
956 curr_track_index = 0;
958 else if ( curr_track_index < 0 )
963 self playsoundtoplayer(
"uin_freerun_reset",
self );
981 level endon(
"activate_track" );
982 level endon(
"finished_track" );
995 level.FRGame.userSpawns++;
996 self RecordGameEvent(
"retry" );
998 self playsoundtoplayer(
"uin_freerun_reset",
self );
1016 if ( !IsDefined(level.FRGame.activespawnpoint) )
1019 if ( !IsDefined(level.FRGame.activespawnpoint.weaponobject) )
1022 grace_period = (weapon.fireTime * 4) * 1000;
1024 if ( (level.FRGame.activespawnpoint.weaponobject.targetShotTime + grace_period) >= GetTime() )
1027 foreach( target
in level.FRGame.activespawnpoint.weaponobject.targets )
1029 if ( !target.disabled )
1040 self endon(
"disconnect");
1044 self waittill(
"weapon_fired", weapon );
1046 if ( weapon == level.weaponBaseMeleeHeld )
1052 level.FRGame.bulletPenalty++;
1059 trace = BulletTrace( position + (0,0,10), position - (0,0,1000),
false, undefined );
1060 return trace[
"position"];
1065 level endon(
"activate_track" );
1067 self waittill(
"trigger", trigger_ent );
1069 if ( trigger_ent == player )
1082 self playsoundtoplayer(
"evt_freerun_respawn",
self );
1084 if ( IsDefined(
self.respawn_position ) )
1086 self SetOrigin(
self.respawn_position );
1087 self SetVelocity( (0,0,0) );
1089 else if ( IsDefined( level.FRGame.activeSpawnPoint.spawnPoint ))
1091 self SetOrigin( level.FRGame.activeSpawnPoint.spawnPoint.origin );
1092 self SetPlayerAngles( level.FRGame.activeSpawnPoint.spawnPoint.angles );
1093 self SetVelocity( (0,0,0) );
1098 spawn_origin = level.FRGame.activeSpawnLocation;
1101 self SetOrigin( spawn_origin );
1102 self SetPlayerAngles( level.FRGame.activeSpawnAngles );
1103 self SetVelocity( (0,0,0) );
1106 self setdoublejumpenergy( 1.0 );
1112 self TakeAllWeapons();
1115 self SetPerk(
"specialty_fallheight" );
1117 self GiveWeapon( level.weaponBaseMeleeHeld );
1118 self setSpawnWeapon( level.weaponBaseMeleeHeld );
1120 return level.weaponBaseMeleeHeld;
1125 self setDStat(
"freerunTrackTimes",
"track", trackIndex,
"topTimes", slot, stat, value );
1130 active_track = level.FRGame.activeTrack;
1132 self setDStat(
"freerunTrackTimes",
"track", level.FRGame.trackIndex,
"mapUniqueId", level.FRGame.mapUniqueId );
1133 self setDStat(
"freerunTrackTimes",
"track", level.FRGame.trackIndex,
"mapVersion", level.FRGame.mapVersion );
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 );
1146 level.FRGame.activeTrack.fastestRunCheckpointTimes = level.FRGame.checkpointTimes;
1148 for ( i = 0; i < level.FRGame.checkpointTriggers.size; i++ )
1150 self setDStat(
"freerunTrackTimes",
"track", level.FRGame.trackIndex,
"checkPointTimes",
"time", i, level.FRGame.checkpointTimes[i] );
1156 return (
self getDStat(
"freerunTrackTimes",
"track", trackIndex,
"topTimes", slot, stat ));
1161 score_set = SpawnStruct();
1163 score_set.time = time;
1164 score_set.faults = faults;
1165 score_set.retries = retries;
1166 score_set.bulletPenalty = bulletPenalty;
1183 for ( i = 0; i < level.FRGame.checkpointTriggers.size; i++ )
1185 level.FRGame.activeTrack.fastestRunCheckpointTimes[i] =
self getDStat(
"freerunTrackTimes",
"track", trackIndex,
"checkPointTimes",
"time", i );
1191 if ( isdefined(level.FRGame.activeTrack.statsRead) )
1194 mapId =
self getDStat(
"freerunTrackTimes",
"track", level.FRGame.trackIndex,
"mapUniqueId" );
1195 mapVersion =
self getDStat(
"freerunTrackTimes",
"track", level.FRGame.trackIndex,
"mapVersion" );
1197 if ( level.FRGame.mapUniqueId != mapId || level.FRGame.mapVersion != mapVersion )
1203 for ( i = 0; i < level.FRGame.checkpointTriggers.size; i++ )
1205 level.FRGame.activeTrack.fastestRunCheckpointTimes[i] = 0;
1217 level.FRGame.activeTrack.statsRead =
true;
1222 self endon(
"disconnect");
1223 self endon(
"death");
1225 keep_weapon = level.weaponNone;
1226 if ( isDefined(level.FRGame.activeSpawnPoint.weapon) && !only_default )
1228 keep_weapon = level.FRGame.activeSpawnPoint.weapon;
1233 self switchtoweaponimmediate(level.weaponBaseMeleeHeld);
1237 while (
self isswitchingweapons() )
1242 current_weapon =
self GetCurrentWeapon();
1244 if ( current_weapon != level.weaponBaseMeleeHeld && keep_weapon != current_weapon )
1246 self SwitchToWeapon(level.weaponBaseMeleeHeld);
1247 while(
self GetCurrentWeapon() != level.weaponBaseMeleeHeld )
1254 weaponsList =
self GetWeaponsList();
1255 foreach( weapon
in weaponsList )
1257 if ( weapon != level.weaponBaseMeleeHeld && keep_weapon != weapon )
1258 self TakeWeapon( weapon );
1266 if( start && !
IS_TRUE(player.musicStart) )
1268 mapname = GetDvarString(
"mapname" );
1270 player.musicStart =
true;
1275 player.musicStart =
false;
1285 if ( level.FRGame.tutorials )
1287 foreach( player
in level.players )
1296 if ( level.FRGame.tutorials )
1298 foreach( player
in level.players )
1307 if ( level.FRGame.tutorials )
1309 foreach( trigger
in level.FRGame.tutorialTriggers )
1311 trigger TriggerEnable(
true );
1320 if ( (!(
self IsHost()) || GetLocalProfileInt(
"com_firsttime_freerun" )) && !GetDvarInt(
"freerun_tutorial" ) )
1325 level.FRGame.tutorials =
true;
1329 foreach( trigger
in level.FRGame.tutorialTriggers )
1338 level.FRGame.tutorials =
false;
1340 level.FRGame.tutorialTriggers = GetEntArray(
"fr_tutorial",
"targetname" );
1342 level.FRGame.tutorialFunctions = [];
1349 level endon(
"stop_tutorials");
1353 self waittill(
"trigger", player );
1355 if ( IsPlayer( player ))
1358 self TriggerEnable(
false );
1365 self notify(
"stop_tutorial_when_restarting_track");
1366 self waittill(
"stop_tutorial_when_restarting_track");
1368 level waittill(
"activate_track" );
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]))
1386 level notify(
"playing_tutorial" );
1387 level endon(
"playing_tutorial" );
1393 [[level.FRGame.tutorialFunctions[tutorial]]]();
1399 if ( isdefined(
self.lastTutorialVOPlayed ) )
1401 self stopsound(
self.lastTutorialVOPlayed);
1402 self.lastTutorialVOPlayed = undefined;
1410 self.lastTutorialVOPlayed = aliasstring;
1411 self playsoundwithnotify( aliasstring,
"sounddone" );
1412 self waittill(
"sounddone");
1422 self.lastTutorialVOPlayed = aliasstring;
1423 self playsoundwithnotify( aliasstring,
"sounddone" );
1424 self waittill(
"sounddone");
1436 if ( isdefined( unlock_player ) )
1441 if (!isdefined(time) )
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;