#include common_scripts\utility; #include maps\_hud_util; #include maps\_utility; #include maps\_anim; #include maps\_vehicle; #include maps\char_museum_code; #using_animtree( "generic_human" ); main() { level.GLOBAL_ANIM_SPEED = .65; level.guys = []; level.activeRoom = "none"; level.anim_ai = []; level.panic_guys = 0; level.pmc_alljuggernauts = true; flag_init( "do_museum_credits" ); flag_init( "panic_button" ); flag_init( "fade_from_black" ); flag_init( "looked_at_big_board" ); flag_init( "museum_ready" ); flag_init( "spawn_room1_civs" ); flag_init( "af_caves_done" ); flag_init( "dc_burning_done" ); flag_init( "airport_done" ); flag_init( "cliffhanger_done" ); flag_init( "favela_done" ); flag_init( "oilrig_done" ); flag_init( "estate_done" ); flag_init( "hostage_done" ); flag_init( "arcadia_done" ); flag_init( "trainer_done" ); switch( level.level_mode ) { case "free": //-> free roam default_start( ::start_free ); add_start( "free", ::start_free, "[free_roam]", ::museum_main ); setdvar( "start", "" ); break; case "credits_black": //-> coming from menu after never beating game maps\_credits::initcredits( "all" ); level.credits_speed = level.credits_speed * .75; default_start( ::start_black ); add_start( "black", ::start_black, "[black_credits]", ::black_main ); break; case "credits_1": //-> coming from af_chase maps\_credits::initcredits( "all" ); break; case "credits_2": //-> coming from menu after beating game maps\_credits::initcredits( "all" ); default_start( ::start_afcaves ); break; } add_start( "af_caves", ::start_afcaves, "[af_caves]", ::afcaves_main ); add_start( "dc_burning", ::start_dcburning, "[dc_burning]", ::dcburning_main ); add_start( "airport", ::start_airport, "[airport]", ::airport_main ); add_start( "cliffhanger", ::start_cliffhanger,"[cliffhanger]", ::cliffhanger_main ); add_start( "favela", ::start_favela, "[favela]", ::favela_main ); add_start( "hallway1", ::start_hallway1, "[hallway1]", ::hallway1_main ); add_start( "vehicles", ::start_vehicles, "[vehicles]", ::vehicles_main ); add_start( "hallway2", ::start_hallway2, "[hallway2]", ::hallway2_main ); add_start( "oilrig", ::start_oilrig, "[oilrig]", ::oilrig_main ); add_start( "estate", ::start_estate, "[estate]", ::estate_main ); add_start( "hostage", ::start_hostage, "[hostage]", ::hostage_main ); add_start( "trainer", ::start_trainer, "[trainer]", ::trainer_main ); add_start( "arcadia", ::start_arcadia, "[arcadia]", ::arcadia_main ); animscripts\dog\dog_init::initDogAnimations(); maps\char_museum_precache::main(); maps\char_museum_fx::main(); if( level.level_mode != "credits_1" ) { maps\_load::main(); //HAS TO COME AFTER _LOAD::MAIN() setSavedDvar( "sv_saveOnStartMap", false ); imagename = "levelshots / autosave / autosave_" + level.script + "start"; // string not found for AUTOSAVE_LEVELSTART SaveGame( "levelstart", &"AUTOSAVE_LEVELSTART", imagename, true ); maps\_load::set_player_viewhand_model( "viewhands_player_us_army" ); } maps\_drone_civilian::init(); maps\_drone_ai::init(); thread post_init(); } post_init() { if( level.level_mode == "credits_1" ) { flag_wait( "do_museum_credits" ); thread start_afcaves(); } maps\char_museum_anim::main(); thread sign_departure_status(); array_thread( getentarray( "c4barrelPacks", "script_noteworthy" ), ::c4_packs_think ); SetSavedDvar( "player_sprintUnlimited", "1" ); SetSavedDvar( "ui_hidemap", "1" ); level.friendlyFireDisabled = true; thread battlechatter_off(); } /************************************************************************************************************/ /* AF_CAVES */ /************************************************************************************************************/ afcaves_setup() { level.anim_ai[ "af_caves" ] = []; array_thread( getentarray( "ai_af_caves", "script_noteworthy" ), ::add_spawn_function, ::afcaves_ai_setup ); array_thread( getentarray( "ai_af_caves", "script_noteworthy" ), ::add_spawn_function, ::afcaves_ai_think ); } afcaves_main() { if( level.level_mode == "credits_1" ) { flag_wait( "do_museum_credits" ); flag_wait( "museum_ready" ); } array_thread( getentarray( "civ_af_caves_1", "script_noteworthy" ), ::add_spawn_function, ::afcaves_civ1_think ); thread afcaves_camera_think(); flag_wait( "af_caves_spawn_civs" ); array_thread( getentarray( "civ_af_caves_1", "script_noteworthy" ), ::spawn_ai, true ); flag_wait( "spawn_room1_civs" ); array_thread( getentarray( "civ_af_caves_2", "script_noteworthy" ), ::spawn_ai, true ); flag_wait( "af_caves_done" ); wait 1.25; array_thread( getentarray( "civ_af_caves_3", "script_noteworthy" ), ::delaythread, 1.25, ::spawn_ai, true ); camera_move( "camara_path_dc_burning", 25 ); } afcaves_camera_think() { flag_wait( "fade_from_black" ); node = getvehiclenode( "camara_path_af_caves", "targetname" ); level.camera vehicle_teleport( node.origin, node.angles ); level.camera thread vehicle_paths( node ); level.camera attachpath( node ); level.camera vehicle_setspeedimmediate( 0, 1000, 1000 ); wait .5; level.camera ResumeSpeed( .5 ); level.camera waittill( "reached_end_node" ); camera_move( "camara_path_af_caves2", 6.5 ); level.camera ResumeSpeed( .5 ); level.camera waittill( "reached_end_node" ); } afcaves_civ1_think() { guys = []; foreach( ai in level.anim_ai[ "af_caves" ] ) { switch( ai.animation ) { case "training_intro_foley_idle_talk_1": guys[ 0 ] = ai; break; case "afgan_caves_Price_rappel_idle": guys[ 1 ] = ai; break; case "casual_stand_v2_twitch_shift": guys[ 2 ] = ai; break; case "afchase_ending_shepherd_gun_monologue": guys[ 3 ] = ai; break; case "zodiac_trans_L2R": guys[ 4 ] = ai; break; case "casual_stand_v2_idle": guys[ 5 ] = ai; break; } } num = 0; while( num < 6 ) { wait .05; p1 = level.player.origin; p1 = ( p1[0], p1[1], 0 ); p2 = self.origin; p2 = ( p2[0], p2[1], 0 ); p3 = guys[ num ].origin; p3 = ( p3[0], p3[1], 0 ); dot = vectordot( vectornormalize( p3 - p1 ), vectornormalize( p2 - p1 ) ); if( dot < .999 ) continue; guys[ num ] ent_flag_set( "do_anim" ); num++; } flag_set( "spawn_room1_civs" ); } afcaves_ai_setup() { self ai_default_setup( "af_caves" ); node = self.anim_node; wait .05; switch( node.animation ) { case "afchase_ending_shepherd_gun_monologue": self.anim_speed = level.GLOBAL_ANIM_SPEED * 1.23; break; case "zodiac_trans_L2R": self.animtime = .28; self SetAnimTime( getanim_generic( node.animation ), self.animtime ); break; } } afcaves_ai_think() { self endon( "panic_button" ); self endon( "death" ); while( !self ent_flag_exist( "do_anim" ) ) wait .05; self ent_flag_wait( "do_anim" ); node = self.anim_node; self _setanim( getanim_generic( node.animation ), 1, 0, self.anim_speed ); switch( node.animation ) { case "zodiac_trans_L2R": self thread ai_zodiac_anims( node.animation ); break; case "afgan_caves_Price_rappel_idle": self thread ai_idle( node.animation ); break; case "training_intro_foley_idle_talk_1": self thread ai_loop_random( node.animation, "foley_talk" ); break; case "afchase_ending_shepherd_gun_monologue": if( isai( self ) ) ai_wait_current_anim(); else ai_wait_current_anim( .40 ); foreach( ent in level.anim_ai[ "af_caves" ] ) ent ent_flag_clear( "do_anim" ); flag_set( "af_caves_done" ); break; default: self thread ai_loop_random( node.animation, "casual_stand" ); break; } } ai_zodiac_anims( animation ) { self endon( "panic_button" ); self endon( "death" ); self endon( "do_anim" ); self.current_anim = getanim_generic( animation ); self thread ai_current_anim_stop(); self ai_next_anim( %zodiac_rightside_wave ); self ai_next_anim( %zodiac_trans_R2L ); self ai_next_anim( %zodiac_leftside_wave ); self ai_next_anim( %zodiac_trans_L2R ); } /************************************************************************************************************/ /* DC_BURNING */ /************************************************************************************************************/ dcburning_setup() { level.anim_ai[ "dc_burning" ] = []; array_thread( getentarray( "ai_dc_burning", "script_noteworthy" ), ::add_spawn_function, ::dcburning_ai_setup ); array_thread( getentarray( "ai_dc_burning", "script_noteworthy" ), ::add_spawn_function, ::dcburning_ai_think ); } dcburning_main() { thread dcburning_camera_think(); flag_wait( "dc_burning_go" ); wait 2; foreach( ent in level.anim_ai[ "dc_burning" ] ) ent ent_flag_set( "do_anim" ); array_thread( getentarray( "civ_dc_burning_1", "script_noteworthy" ), ::delaythread, 11, ::spawn_ai, true ); flag_wait( "dc_burning_done" ); array_thread( getentarray( "civ_dc_burning_2", "script_noteworthy" ), ::spawn_ai, true ); array_thread( getentarray( "room1_civ_talkers", "targetname" ), ::spawn_ai, true ); wait 2; array_thread( getentarray( "civ_dc_burning_3", "script_noteworthy" ), ::spawn_ai, true ); array_thread( getentarray( "civ_dc_burning_4", "script_noteworthy" ), ::delaythread, 1.25, ::spawn_ai, true ); camera_move( "camara_path_airport_mid", 35 ); level.camera ResumeSpeed( 5 ); wait 2; camera_move( "camara_path_airport", 45, 0 ); } dcburning_camera_think() { node = getvehiclenode( "camara_path_dc_burning", "targetname" ); level.camera vehicle_teleport( node.origin, node.angles ); level.camera thread vehicle_paths( node ); if( level.start_point == "dc_burning" ) { level.camera vehicle_teleport( node.origin, node.angles ); level.camera attachpath( node ); level.camera vehicle_setspeedimmediate( 0, 1000, 1000 ); } level.camera ResumeSpeed( .5 ); level.camera waittill( "reached_end_node" ); } dcburning_ai_setup() { self ai_default_setup( "dc_burning" ); node = self.anim_node; wait .05; switch( node.animation ) { case "training_pit_sitting_welcome": self.gun_remove = true; self gun_remove(); self.animtime = .6; self SetAnimTime( getanim_generic( node.animation ), self.animtime ); self.anim_speed = level.GLOBAL_ANIM_SPEED * 1.23; self.animplaybackrate = self.anim_speed; self.moveplaybackrate = self.anim_speed; //self SetAnimTime( getanim_generic( node.animation ), .25 ); //self dcburning_dunn_gun_setup( node ); break; case "training_intro_foley_begining": self.animtime = .64; self SetAnimTime( getanim_generic( node.animation ), self.animtime ); self.anim_speed = level.GLOBAL_ANIM_SPEED * 1.23; self.animplaybackrate = self.anim_speed; self.moveplaybackrate = self.anim_speed; break; case "civilian_sitting_talking_A_1": self.gun_remove = true; self gun_remove(); break; case "riotshield_idle": if( !isai( self ) ) self attach( "weapon_riot_shield", "TAG_WEAPON_LEFT" ); break; } } dcburning_ai_think() { self endon( "panic_button" ); self endon( "death" ); while( !self ent_flag_exist( "do_anim" ) ) wait .05; self ent_flag_wait( "do_anim" ); node = self.anim_node; self _setanim( getanim_generic( node.animation ), 1, 0, self.anim_speed ); switch( node.animation ) { case "training_pit_sitting_welcome": self thread dcburning_dunn( node.animation ); break; case "training_intro_foley_begining": self thread dcburning_foley( node.animation ); break; case "civilian_sitting_talking_A_1": self thread ai_idle( node.animation ); break; case "stinger_fire": self thread ai_loop_random( node.animation, "rpg" ); case "casual_crouch_idle": self thread ai_loop_random( node.animation, "casual_crouch" ); break; case "riotshield_idle": self thread ai_idle( node.animation ); break; default: self thread ai_loop_random( node.animation, "casual_stand" ); break; } } dcburning_dunn( animation ) { self endon( "panic_button" ); self endon( "death" ); self endon( "do_anim" ); self.current_anim = getanim_generic( animation ); self thread ai_current_anim_stop(); //self thread dcburning_dunn_gun( animation ); self ai_next_anim( %training_pit_open_case ); //this is important - dont take this out...its to make up for //a sleight frame diference between drone and AI logic where in //on the current_anim gets set one frame too late. percent = .41; delay = .1; wait delay; self ai_wait_current_anim( percent, delay * -1 ); thread dcburning_dunn_stop(); } dcburning_dunn_stop() { foreach( ent in level.anim_ai[ "dc_burning" ] ) ent ent_flag_clear( "do_anim" ); flag_set( "dc_burning_done" ); } #using_animtree( "script_model" ); dcburning_dunn_gun_setup( node ) { self.anim_gun = spawn( "script_model", ( 0, 0, 0 ) ); self.anim_gun setmodel( "viewmodel_desert_eagle" ); self.anim_gun.origin = node.origin; self.anim_gun.animname = "pit_gun"; self.anim_gun assign_animtree(); self.anim_gun set_start_pos( node.animation + "_gun", node.origin, node.angles ); self.anim_gun _setanim( self.anim_gun getanim( node.animation + "_gun" ), 1, 0, 0 ); } dcburning_dunn_gun( animation ) { self.anim_gun ent_flag_init( "do_anim" ); self.anim_gun ent_flag_set( "do_anim" ); self.anim_gun thread ai_current_anim_stop(); self.anim_gun _setanim( self.anim_gun getanim( animation + "_gun" ), 1, 0, self.anim_speed ); self.anim_gun.current_anim = self.anim_gun getanim( animation + "_gun" ); self.anim_gun ai_next_anim( %training_pit_open_case_gun ); } #using_animtree( "generic_human" ); dcburning_foley( animation ) { self endon( "panic_button" ); self endon( "death" ); self endon( "do_anim" ); self.current_anim = getanim_generic( animation ); self thread ai_current_anim_stop(); // self ai_next_anim( %training_intro_foley_turnaround_2 ); // self ai_next_anim( %training_intro_foley_idle_talk_1 ); self ai_next_anim( %training_intro_foley_end ); } /************************************************************************************************************/ /* AIRPORT */ /************************************************************************************************************/ airport_setup() { level.anim_ai[ "airport" ] = []; array_thread( getentarray( "ai_airport", "script_noteworthy" ), ::add_spawn_function, ::airport_ai_setup ); array_thread( getentarray( "ai_airport", "script_noteworthy" ), ::add_spawn_function, ::airport_ai_think ); } airport_main() { thread airport_camera_think(); flag_wait( "airport_go" ); thread flag_set_delayed( "looked_at_big_board", 3 ); wait 1.5; foreach( ent in level.anim_ai[ "airport" ] ) ent ent_flag_set( "do_anim" ); array_thread( getentarray( "civ_airport_1", "script_noteworthy" ), ::delaythread, 6.5, ::spawn_ai, true ); flag_wait( "airport_done" ); wait 1.5; array_thread( getentarray( "civ_airport_2", "script_noteworthy" ), ::delaythread, .5, ::spawn_ai, true ); array_thread( getentarray( "civ_airport_3", "script_noteworthy" ), ::delaythread, 2.5, ::spawn_ai, true ); camera_move( "camara_path_cliffhanger", 70 ); } airport_camera_think() { node = getvehiclenode( "camara_path_airport", "targetname" ); level.camera thread vehicle_paths( node ); if( level.start_point == "airport" ) { level.camera vehicle_teleport( node.origin, node.angles ); level.camera attachpath( node ); level.camera vehicle_setspeedimmediate( 0, 1000, 1000 ); } level.camera ResumeSpeed( .5 ); level.camera waittill( "reached_end_node" ); } airport_ai_setup() { self ai_default_setup( "airport" ); node = self.anim_node; wait .05; switch( node.animation ) { case "airport_elevator_sequence_guy1": case "airport_elevator_sequence_guy2": self.animtime = .25; self SetAnimTime( getanim_generic( node.animation ), self.animtime ); break; case "airport_security_guard_pillar_react_R": case "airport_security_civ_rush_guard": self thread give_beretta(); break; case "riotshield_bashB_attack": if( !isai( self ) ) { self attach( "weapon_riot_shield", "TAG_WEAPON_LEFT" ); } break; } } airport_ai_think() { self endon( "panic_button" ); self endon( "death" ); while( !self ent_flag_exist( "do_anim" ) ) wait .05; self ent_flag_wait( "do_anim" ); node = self.anim_node; self _setanim( getanim_generic( node.animation ), 1, 0, self.anim_speed ); switch( node.animation ) { case "airport_elevator_sequence_guy2": self ai_wait_current_anim( .42 ); foreach( ent in level.anim_ai[ "airport" ] ) ent ent_flag_clear( "do_anim" ); flag_set( "airport_done" ); break; case "airport_security_guard_pillar_react_R": case "airport_security_civ_rush_guard": self thread airport_security_guard(); break; case "casual_stand_v2_idle": self thread ai_loop_random( node.animation, "casual_stand" ); break; } } airport_security_guard() { self endon( "panic_button" ); self endon( "death" ); self endon( "do_anim" ); self ai_next_anim( %airport_security_guard_pillar_death_R ); } /************************************************************************************************************/ /* CLIFFHANGER */ /************************************************************************************************************/ cliffhanger_setup() { level.anim_ai[ "cliffhanger" ] = []; array_thread( getentarray( "ai_cliffhanger", "script_noteworthy" ), ::add_spawn_function, ::cliffhanger_ai_setup ); array_thread( getentarray( "ai_cliffhanger", "script_noteworthy" ), ::add_spawn_function, ::cliffhanger_ai_think ); } cliffhanger_main() { thread cliffhanger_camera_think(); flag_wait( "cliffhanger_go" ); wait 2; foreach( ent in level.anim_ai[ "cliffhanger" ] ) ent ent_flag_set( "do_anim" ); flag_wait( "cliffhanger_done" ); wait 1.5; array_thread( getentarray( "civ_favela_0", "script_noteworthy" ), ::delaythread, 0, ::spawn_ai, true ); array_thread( getentarray( "civ_favela_1", "script_noteworthy" ), ::delaythread, 1.5, ::spawn_ai, true ); camera_move( "camara_path_favela" ); } cliffhanger_camera_think() { node = getvehiclenode( "camara_path_cliffhanger", "targetname" ); level.camera vehicle_teleport( node.origin, node.angles ); level.camera thread vehicle_paths( node ); if( level.start_point == "cliffhanger" ) { level.camera vehicle_teleport( node.origin, node.angles ); level.camera attachpath( node ); level.camera vehicle_setspeedimmediate( 0, 1000, 1000 ); } level.camera ResumeSpeed( .5 ); level.camera waittill( "reached_end_node" ); } cliffhanger_ai_setup() { self ai_default_setup( "cliffhanger" ); node = self.anim_node; wait .05; switch( node.animation ) { case "killhouse_sas_price": self.gun_remove = true; self gun_remove(); self.animtime = .2; self SetAnimTime( getanim_generic( node.animation ), self.animtime ); break; case "killhouse_sas_1": case "killhouse_sas_2": case "killhouse_sas_3": self.animtime = .15; self SetAnimTime( getanim_generic( node.animation ), self.animtime ); break; default: self.animtime = .01; self SetAnimTime( getanim_generic( node.animation ), self.animtime ); break; } } cliffhanger_ai_think() { self endon( "panic_button" ); self endon( "death" ); while( !self ent_flag_exist( "do_anim" ) ) wait .05; self ent_flag_wait( "do_anim" ); node = self.anim_node; self _setanim( getanim_generic( node.animation ), 1, 0, self.anim_speed ); switch( node.animation ) { /* case "killhouse_sas_1": case "killhouse_sas_2": case "killhouse_sas_3":*/ case "killhouse_sas_price": self ai_wait_current_anim( .5 ); foreach( ent in level.anim_ai[ "cliffhanger" ] ) ent ent_flag_clear( "do_anim" ); flag_set( "cliffhanger_done" ); break; case "guardA_standing_cold_idle": case "guardB_standing_cold_idle": self thread ai_idle( node.animation ); break; case "casual_crouch_idle": self thread ai_loop_random( node.animation, "casual_crouch" ); break; case "casual_stand_v2_idle": self thread ai_loop_random( node.animation, "casual_stand" ); break; } } /************************************************************************************************************/ /* FAVELA */ /************************************************************************************************************/ favela_setup() { level.anim_ai[ "favela" ] = []; array_thread( getentarray( "ai_favela", "script_noteworthy" ), ::add_spawn_function, ::favela_ai_setup ); array_thread( getentarray( "ai_favela", "script_noteworthy" ), ::add_spawn_function, ::favela_ai_think ); } favela_main() { thread favela_camera_think(); flag_wait( "favela_go" ); wait 3; foreach( ent in level.anim_ai[ "favela" ] ) ent ent_flag_set( "do_anim" ); array_thread( getentarray( "civ_favela_3", "script_noteworthy" ), ::delaythread, 6, ::spawn_ai, true ); flag_wait( "favela_done" ); wait 1; array_thread( getentarray( "civ_hallway1_1", "script_noteworthy" ), ::delaythread, 0, ::spawn_ai, true ); camera_move( "camara_path_hallway1", 70 ); } favela_camera_think() { node = getvehiclenode( "camara_path_favela", "targetname" ); level.camera vehicle_teleport( node.origin, node.angles ); level.camera thread vehicle_paths( node ); if( level.start_point == "favela" ) { level.camera vehicle_teleport( node.origin, node.angles ); level.camera attachpath( node ); level.camera vehicle_setspeedimmediate( 0, 1000, 1000 ); } level.camera ResumeSpeed( .5 ); level.camera waittill( "reached_end_node" ); } favela_ai_setup() { self ai_default_setup( "favela" ); node = self.anim_node; switch( node.animation ) { case "airport_civ_in_line_15_B": self setanimtime( getanim_generic( node.animation ), .05 ); break; case "estate_ghost_radio": self set_anim_time( node, .09 ); break; case "invasion_vehicle_cover_dialogue_guy1": case "invasion_vehicle_cover_dialogue_guy2": self set_anim_time( node, .03 ); break; case "gulag_end_evac_soap": self.anim_speed = level.GLOBAL_ANIM_SPEED * .65; break; } } favela_ai_think() { self endon( "panic_button" ); self endon( "death" ); while( !self ent_flag_exist( "do_anim" ) ) wait .05; self ent_flag_wait( "do_anim" ); node = self.anim_node; self _setanim( getanim_generic( node.animation ), 1, 0, self.anim_speed ); switch( node.animation ) { case "gulag_end_evac_soap": link = spawn( "script_origin", self.origin ); self linkto( link ); self ai_wait_current_anim( .20 ); foreach( ent in level.anim_ai[ "favela" ] ) ent ent_flag_clear( "do_anim" ); flag_set( "favela_done" ); break; case "favela_chaotic_standcover_gunjamB": self thread ai_loop_random( node.animation, "favela_stand" ); break; case "favela_chaotic_crouchcover_grenadefireA": self thread ai_loop_random( node.animation, "favela_crouch" ); break; case "german_shepherd_attackidle": self thread ai_loop_dog( node.animation, "dog" ); break; } } /************************************************************************************************************/ /* HALLWAY 1 */ /************************************************************************************************************/ hallway1_main() { thread hallway1_camera_think(); array_thread( getentarray( "civ_hallway1_2", "script_noteworthy" ), ::delaythread, 0, ::spawn_ai, true ); flag_wait( "skip_vehicles" ); ai = get_living_ai_array( "civ_talkers", "script_noteworthy" ); array_call( ai, ::delete ); array_thread( getentarray( "room3_civ_talkers", "targetname" ), ::delaythread, .5, ::spawn_ai, true ); array_thread( getentarray( "civ_hallway1_3", "script_noteworthy" ), ::delaythread, 0, ::spawn_ai, true ); flag_wait( "hallway1_go" ); } hallway1_camera_think() { node = getvehiclenode( "camara_path_hallway1", "targetname" ); level.camera vehicle_teleport( node.origin, node.angles ); level.camera thread vehicle_paths( node ); if( level.start_point == "hallway1" ) { level.camera vehicle_teleport( node.origin, node.angles ); level.camera attachpath( node ); level.camera vehicle_setspeedimmediate( 0, 1000, 1000 ); } level.camera ResumeSpeed( 5 ); level.camera waittill( "reached_end_node" ); } /************************************************************************************************************/ /* VEHICLES */ /************************************************************************************************************/ vehicles_main() { array_thread( getentarray( "civ_vehicles_1", "script_noteworthy" ), ::delaythread, 10, ::spawn_ai, true ); thread vehicles_camera_think(); flag_wait( "vehicles_go" ); } vehicles_camera_think() { if( level.start_point == "vehicles" ) { node = getvehiclenode( "camara_path_vehicles", "targetname" ); level.camera vehicle_teleport( node.origin, node.angles ); level.camera thread vehicle_paths( node ); level.camera vehicle_teleport( node.origin, node.angles ); level.camera attachpath( node ); level.camera vehicle_setspeedimmediate( 0, 1000, 1000 ); level.camera ResumeSpeed( 2 ); } level.camera waittill( "reached_end_node" ); array_thread( getentarray( "civ_vehicles_2", "script_noteworthy" ), ::delaythread, 2, ::spawn_ai, true ); camera_move( "camara_path_vehicles2", 20, .25, .75 ); wait 1.5; array_thread( getentarray( "civ_vehicles_3", "script_noteworthy" ), ::delaythread, 3.5, ::spawn_ai, true ); array_thread( getentarray( "civ_vehicles_4", "script_noteworthy" ), ::delaythread, 10, ::spawn_ai, true ); camera_move( "camara_path_vehicles3", 20, .75, .25 ); level.camera ResumeSpeed( 2 ); level.camera waittill( "reached_end_node" ); } /************************************************************************************************************/ /* HALLWAY 2 */ /************************************************************************************************************/ hallway2_main() { thread hallway2_camera_think(); flag_wait( "skip_vehicles_to" ); ai = get_living_ai_array( "civ_talkers", "script_noteworthy" ); array_call( ai, ::delete ); array_thread( getentarray( "room2_civ_talkers", "targetname" ), ::delaythread, .5, ::spawn_ai, true ); array_thread( getentarray( "civ_hallway2_1", "script_noteworthy" ), ::delaythread, 0, ::spawn_ai, true ); flag_wait( "hallway2_go" ); } hallway2_camera_think() { if( level.start_point == "hallway2" ) { node = getvehiclenode( "camara_path_hallway2", "targetname" ); level.camera vehicle_teleport( node.origin, node.angles ); level.camera thread vehicle_paths( node ); level.camera vehicle_teleport( node.origin, node.angles ); level.camera attachpath( node ); level.camera vehicle_setspeedimmediate( 0, 1000, 1000 ); level.camera ResumeSpeed( 5 ); } level.camera waittill( "reached_end_node" ); } /************************************************************************************************************/ /* OILRIG */ /************************************************************************************************************/ oilrig_setup() { level.anim_ai[ "oilrig" ] = []; array_thread( getentarray( "ai_oilrig", "script_noteworthy" ), ::add_spawn_function, ::oilrig_ai_setup ); array_thread( getentarray( "ai_oilrig", "script_noteworthy" ), ::add_spawn_function, ::oilrig_ai_think ); } oilrig_main() { thread oilrig_camera_think(); flag_wait( "oilrig_go" ); wait 2; foreach( ent in level.anim_ai[ "oilrig" ] ) ent ent_flag_set( "do_anim" ); array_thread( getentarray( "civ_oilrig_1", "script_noteworthy" ), ::delaythread, 12, ::spawn_ai, true ); flag_wait( "oilrig_done" ); array_thread( getentarray( "civ_oilrig_2", "script_noteworthy" ), ::delaythread, 1.5, ::spawn_ai, true ); wait 1.75; camera_move( "camara_path_estate" ); } oilrig_camera_think() { if( level.start_point == "oilrig" ) { node = getvehiclenode( "camara_path_oilrig", "targetname" ); level.camera vehicle_teleport( node.origin, node.angles ); level.camera thread vehicle_paths( node ); level.camera vehicle_teleport( node.origin, node.angles ); level.camera attachpath( node ); level.camera vehicle_setspeedimmediate( 0, 1000, 1000 ); level.camera ResumeSpeed( .5 ); } level.camera waittill( "reached_end_node" ); } oilrig_ai_setup() { wait .1; self ai_default_setup( "oilrig" ); node = self.anim_node; } oilrig_ai_think() { self endon( "panic_button" ); self endon( "death" ); while( !self ent_flag_exist( "do_anim" ) ) wait .05; self ent_flag_wait( "do_anim" ); node = self.anim_node; self _setanim( getanim_generic( node.animation ), 1, 0, self.anim_speed ); switch( node.animation ) { case "roadkill_opening_foley": self ai_wait_current_anim( .73 ); foreach( ent in level.anim_ai[ "oilrig" ] ) ent ent_flag_clear( "do_anim" ); flag_set( "oilrig_done" ); break; case "roadkill_opening_shepherd": self ai_wait_current_anim( .83 ); foreach( ent in level.anim_ai[ "oilrig" ] ) ent ent_flag_clear( "do_anim" ); flag_set( "oilrig_done" ); break; case "oilrig_sub_B_idle_3": case "oilrig_sub_B_idle_4": self thread bubbles(); default: self thread ai_idle( node.animation ); break; } } /************************************************************************************************************/ /* ESTATE */ /************************************************************************************************************/ estate_setup() { level.anim_ai[ "estate" ] = []; array_thread( getentarray( "ai_estate", "script_noteworthy" ), ::add_spawn_function, ::estate_ai_setup ); array_thread( getentarray( "ai_estate", "script_noteworthy" ), ::add_spawn_function, ::estate_ai_think ); getent( "bh_node", "target" ) estate_struct_setup(); } estate_main() { thread estate_camera_think(); flag_wait( "estate_go" ); wait 2; foreach( ent in level.anim_ai[ "estate" ] ) ent ent_flag_set( "do_anim" ); array_thread( getentarray( "civ_estate_1", "script_noteworthy" ), ::delaythread, 6, ::spawn_ai, true ); flag_wait( "estate_done" ); wait 2; array_thread( getentarray( "civ_estate_2", "script_noteworthy" ), ::delaythread, 0, ::spawn_ai, true ); camera_move( "camara_path_hostage_mid", 55 ); level.camera ResumeSpeed( 5 ); wait 3.5; camera_move( "camara_path_hostage", 75, 0 ); } estate_camera_think() { node = getvehiclenode( "camara_path_estate", "targetname" ); level.camera vehicle_teleport( node.origin, node.angles ); level.camera thread vehicle_paths( node ); if( level.start_point == "estate" ) { level.camera vehicle_teleport( node.origin, node.angles ); level.camera attachpath( node ); level.camera vehicle_setspeedimmediate( 0, 1000, 1000 ); } level.camera ResumeSpeed( .5 ); level.camera waittill( "reached_end_node" ); } estate_ai_setup() { if( isdefined( self.target ) && self.target == "bh_ai_node" ) self estate_bh_setup(); self ai_default_setup( "estate" ); node = self.anim_node; switch( node.animation ) { case "bh_rope_drop_le": case "bh_6_drop": self.ragdoll_immediate = true; self.anim_speed = level.GLOBAL_ANIM_SPEED * .3; self set_anim_time( node, .765 ); break; case "roadkill_cover_spotter": case "roadkill_cover_soldier": case "roadkill_cover_active_soldier2": if( isai( self ) ) self.a.pose = "crouch"; break; } } estate_ai_think() { self endon( "panic_button" ); self endon( "death" ); while( !self ent_flag_exist( "do_anim" ) ) wait .05; self ent_flag_wait( "do_anim" ); node = self.anim_node; self _setanim( getanim_generic( node.animation ), 1, 0, self.anim_speed ); switch( node.animation ) { case "bh_rope_drop_le": case "bh_6_drop": self ai_wait_current_anim( .936 ); foreach( ent in level.anim_ai[ "estate" ] ) ent ent_flag_clear( "do_anim" ); flag_set( "estate_done" ); break; default: self thread ai_idle( node.animation ); break; } } estate_struct_setup() { helo = getent( self.target, "targetname" ); node = spawnstruct(); if( level.level_mode == "free" ) node.origin = helo GetTagOrigin( "TAG_DETACH" ) + (0,0,-10); else node.origin = helo GetTagOrigin( "TAG_DETACH" ); node.angles = helo GetTagangles( "TAG_DETACH" ); node.animation = "bh_6_drop"; node.targetname = "bh_ai_node"; if ( !isdefined( level.struct_class_names[ "targetname" ][ node.targetname ] ) ) level.struct_class_names[ "targetname" ][ node.targetname ] = []; size = level.struct_class_names[ "targetname" ][ node.targetname ].size; level.struct_class_names[ "targetname" ][ node.targetname ][ size ] = node; node = spawnstruct(); node.origin = helo GetTagOrigin( "TAG_FASTROPE_LE" ) + (0,0,.5);; node.angles = helo GetTagangles( "TAG_FASTROPE_LE" ); node.animation = "bh_rope_drop_le"; node.targetname = "bh_rope_node"; if ( !isdefined( level.struct_class_names[ "targetname" ][ node.targetname ] ) ) level.struct_class_names[ "targetname" ][ node.targetname ] = []; size = level.struct_class_names[ "targetname" ][ node.targetname ].size; level.struct_class_names[ "targetname" ][ node.targetname ][ size ] = node; self.target = "bh_ai_node"; } estate_bh_setup() { rope = spawn( "script_model", self.origin ); rope setmodel( "rope_test" ); rope.target = "bh_rope_node"; rope UseAnimTree( #animtree ); rope ent_flag_init( "do_anim" ); level.guys[ level.guys.size ] = rope; level.rope = rope; rope thread estate_ai_setup(); rope thread estate_ai_think(); } /************************************************************************************************************/ /* HOSTAGE */ /************************************************************************************************************/ hostage_setup() { level.anim_ai[ "hostage" ] = []; array_thread( getentarray( "ai_hostage", "script_noteworthy" ), ::add_spawn_function, ::hostage_ai_setup ); array_thread( getentarray( "ai_hostage", "script_noteworthy" ), ::add_spawn_function, ::hostage_ai_think ); } hostage_main() { if( level.start_point == "hostage" ) level waittill( "cam_hostage" ); thread hostage_camera_think(); flag_wait( "hostage_go" ); foreach( ent in level.anim_ai[ "hostage" ] ) ent ent_flag_set( "do_anim" ); array_thread( getentarray( "civ_hostage_1", "script_noteworthy" ), ::delaythread, 5, ::spawn_ai, true ); flag_wait( "hostage_done" ); wait 1; camera_move( "camara_path_trainer", 35 ); } hostage_camera_think() { node = getvehiclenode( "camara_path_hostage", "targetname" ); level.camera thread vehicle_paths( node ); level.camera ResumeSpeed( .5 ); level.camera waittill( "reached_end_node" ); } hostage_ai_setup() { self ai_default_setup( "hostage" ); node = self.anim_node; switch( node.animation ) { case "takedown_room1B_hostage": self.anim_mode = "gravity"; if( isai( self ) ) self.a.pose = "crouch"; case "takedown_room1B_soldier": self set_anim_time( node, .19 ); break; case "hostage_chair_dive": self.anim_mode = "gravity";//zonly_physics, nophysics, none gravity break; } } hostage_ai_think() { self endon( "panic_button" ); self endon( "death" ); while( !self ent_flag_exist( "do_anim" ) ) wait .05; self ent_flag_wait( "do_anim" ); node = self.anim_node; self _setanim( getanim_generic( node.animation ), 1, 0, self.anim_speed ); switch( node.animation ) { case "takedown_room1B_hostage": case "takedown_room1B_soldier": self thread hostage_pose( node.animation ); self ai_wait_current_anim( .74 ); foreach( ent in level.anim_ai[ "hostage" ] ) ent ent_flag_clear( "do_anim" ); flag_set( "hostage_done" ); break; case "hostage_chair_dive": self thread hostage_dive( node.animation ); break; default: self thread hostage_chair( node.animation ); break; } } hostage_pose( animation ) { self endon( "death" ); if( !isai( self ) ) return; self ai_wait_current_anim( .39 ); switch ( animation ) { case "takedown_room1B_hostage": self.a.pose = "prone"; break; case "takedown_room1B_soldier": self.a.pose = "crouch"; break; } } hostage_chair( animation ) { self endon( "death" ); self endon( "do_anim" ); self.current_anim = getanim_generic( animation ); self thread ai_current_anim_stop(); self ai_next_anim( %hostage_chair_twitch2 ); self ai_next_anim( %hostage_chair_twitch ); self ai_next_anim( %hostage_chair_idle ); } hostage_dive( animation ) { self endon( "death" ); self endon( "do_anim" ); self.current_anim = getanim_generic( animation ); self thread ai_current_anim_stop(); self ai_next_anim( %hostage_chair_ground_idle ); if( isai( self ) ) self.a.pose = "prone"; self ai_next_anim( %hostage_chair_ground_idle ); self ai_next_anim( %hostage_chair_ground_idle ); self ai_next_anim( %hostage_chair_ground_idle ); } /************************************************************************************************************/ /* TRAINER */ /************************************************************************************************************/ trainer_setup() { level.anim_ai[ "trainer" ] = []; array_thread( getentarray( "ai_trainer", "script_noteworthy" ), ::add_spawn_function, ::trainer_ai_setup ); array_thread( getentarray( "ai_trainer", "script_noteworthy" ), ::add_spawn_function, ::trainer_ai_think ); } trainer_main() { thread trainer_camera_think(); flag_wait( "trainer_go" ); wait 2.5; foreach( ent in level.anim_ai[ "trainer" ] ) ent ent_flag_set( "do_anim" ); flag_wait( "trainer_done" ); array_thread( getentarray( "civ_trainer_1", "script_noteworthy" ), ::delaythread, 0, ::spawn_ai, true ); wait 2; camera_move( "camara_path_arcadia" ); } trainer_camera_think() { node = getvehiclenode( "camara_path_trainer", "targetname" ); level.camera vehicle_teleport( node.origin, node.angles ); level.camera thread vehicle_paths( node ); if( level.start_point == "trainer" ) { level.camera vehicle_teleport( node.origin, node.angles ); level.camera attachpath( node ); level.camera vehicle_setspeedimmediate( 0, 1000, 1000 ); } level.camera ResumeSpeed( .5 ); level.camera waittill( "reached_end_node" ); } trainer_ai_setup() { self ai_default_setup( "trainer" ); node = self.anim_node; switch( node.animation ) { case "training_pushups_guy1": self.gun_remove = true; self gun_remove(); self.grenadeweapon = "fraggrenade"; self.grenadeammo = 0; self set_anim_time( node, .93 ); break; case "parabolic_leaning_guy_idle_training": self.grenadeweapon = "fraggrenade"; self.grenadeammo = 0; break; case "training_intro_translator_end": self.gun_remove = true; self gun_remove(); case "training_intro_trainee_1_end": case "training_intro_foley_end": self set_anim_time( node, .25 ); break; } } trainer_ai_think() { self endon( "panic_button" ); self endon( "death" ); while( !self ent_flag_exist( "do_anim" ) ) wait .05; self ent_flag_wait( "do_anim" ); node = self.anim_node; self _setanim( getanim_generic( node.animation ), 1, 0, self.anim_speed ); switch( node.animation ) { case "training_intro_trainee_1_end": case "training_intro_translator_end": case "training_intro_foley_end": self ai_wait_current_anim( .50 ); foreach( ent in level.anim_ai[ "trainer" ] ) ent ent_flag_clear( "do_anim" ); flag_set( "trainer_done" ); break; default: self thread ai_idle( node.animation ); break; } } /************************************************************************************************************/ /* ARCADIA */ /************************************************************************************************************/ arcadia_setup() { level.anim_ai[ "arcadia" ] = []; array_thread( getentarray( "ai_arcadia", "script_noteworthy" ), ::add_spawn_function, ::arcadia_ai_setup ); array_thread( getentarray( "ai_arcadia", "script_noteworthy" ), ::add_spawn_function, ::arcadia_ai_think ); } arcadia_main() { thread arcadia_camera_think(); flag_wait( "arcadia_go" ); wait 2; foreach( ent in level.anim_ai[ "arcadia" ] ) ent ent_flag_set( "do_anim" ); array_thread( getentarray( "civ_arcadia_1", "script_noteworthy" ), ::delaythread, 2.5, ::spawn_ai, true ); flag_wait( "arcadia_done" ); wait 1; level.black FadeOverTime( 3 ); level.black.alpha = 1; } arcadia_camera_think() { node = getvehiclenode( "camara_path_arcadia", "targetname" ); level.camera vehicle_teleport( node.origin, node.angles ); level.camera thread vehicle_paths( node ); if( level.start_point == "arcadia" ) { level.camera vehicle_teleport( node.origin, node.angles ); level.camera attachpath( node ); level.camera vehicle_setspeedimmediate( 0, 1000, 1000 ); } level.camera ResumeSpeed( .5 ); level.camera waittill( "reached_end_node" ); } arcadia_ai_setup() { switch( self.animation ) { case "coup_guard2_jeera": self.animtime = .35; self.animation = "coup_guard2_jeera"; break; case "coup_guard2_jeerb": self.animtime = .05; self.animation = "coup_guard2_jeera"; break; case "coup_guard2_jeerc": self.animtime = .85; self.animation = "coup_guard2_jeera"; break; case "coup_guard1_jeer": self.animtime = .6; self.animation = "coup_guard2_jeera"; break; } self ai_default_setup( "arcadia" ); node = self.anim_node; switch( self.animation ) { case "village_interrogationA_Price": case "village_interrogationA_Zak": self.gun_remove = true; self gun_remove(); self set_anim_time( node, .677 ); self.anim_speed = level.GLOBAL_ANIM_SPEED * .5; break; default: self set_anim_time( node, self.animtime ); break; } } arcadia_ai_think() { self endon( "panic_button" ); self endon( "death" ); while( !self ent_flag_exist( "do_anim" ) ) wait .05; self ent_flag_wait( "do_anim" ); node = self.anim_node; self _setanim( getanim_generic( node.animation ), 1, 0, self.anim_speed ); switch( node.animation ) { case "village_interrogationA_Zak": case "village_interrogationA_Price": self thread arcadia_pose( node.animation ); self ai_wait_current_anim( .97 ); foreach( ent in level.anim_ai[ "arcadia" ] ) ent ent_flag_clear( "do_anim" ); flag_set( "arcadia_done" ); break; default: self thread ai_idle( node.animation ); break; } } arcadia_pose( animation ) { self endon( "panic_button" ); self endon( "death" ); if( !isai( self ) ) return; switch( animation ) { case "village_interrogationA_Zak": self ai_wait_current_anim( .75 ); self.ragdoll_immediate = true; break; case "village_interrogationA_Price": self ai_wait_current_anim( .78 ); self.a.pose = "crouch"; break; } } /************************************************************************************************************/ /* BLACK CREDITS */ /************************************************************************************************************/ black_main() { thread maps\_credits::playCredits(); wait 263 - 6; thread music_stop( 4 ); wait 6; nextmission(); level waittill( "never" ); } /************************************************************************************************************/ /* MUSEUM FREE ROAM */ /************************************************************************************************************/ museum_main() { // black screen while we do things in the background blackscreen_start(); flag_wait( "museum_ready" ); // room 1 guys spawn initially room1trig = GetEnt( "room1", "script_noteworthy" ); room1trig spawn_museum_dudes(); thread maps\_introscreen::char_museum_intro(); set_console_status(); if( level.Console ) { if( level.ps3 ) wait 9.0; if( level.xenon ) wait 6.0; } else { wait 2; } array_call( level.players, ::freezecontrols, false ); blackscreen_fadeout( 1.5 ); level waittill( "never" ); } museum_room1_anim_go() { level notify( "new_room_anim_go" ); add_wait( ::flag_wait, "af_caves_go" ); add_func( ::do_anim, "af_caves" ); level add_abort( ::waittill_msg, "new_room_anim_go" ); thread do_wait(); add_wait( ::flag_wait, "dc_burning_go" ); add_func( ::do_anim, "dc_burning" ); level add_abort( ::waittill_msg, "new_room_anim_go" ); thread do_wait(); add_wait( ::flag_wait, "airport_go" ); add_func( ::do_anim, "airport" ); level add_abort( ::waittill_msg, "new_room_anim_go" ); thread do_wait(); add_wait( ::flag_wait, "cliffhanger_go" ); add_func( ::do_anim, "cliffhanger" ); level add_abort( ::waittill_msg, "new_room_anim_go" ); thread do_wait(); add_wait( ::flag_wait, "favela_go" ); add_func( ::do_anim, "favela" ); level add_abort( ::waittill_msg, "new_room_anim_go" ); thread do_wait(); } museum_room2_anim_go() { level notify( "new_room_anim_go" ); add_wait( ::flag_wait, "oilrig_go" ); add_func( ::do_anim, "oilrig" ); level add_abort( ::waittill_msg, "new_room_anim_go" ); thread do_wait(); add_wait( ::flag_wait, "estate_go" ); add_func( ::do_anim, "estate" ); level add_abort( ::waittill_msg, "new_room_anim_go" ); thread do_wait(); add_wait( ::flag_wait, "hostage_go" ); add_func( ::do_anim, "hostage" ); level add_abort( ::waittill_msg, "new_room_anim_go" ); thread do_wait(); add_wait( ::flag_wait, "arcadia_go" ); add_func( ::do_anim, "arcadia" ); level add_abort( ::waittill_msg, "new_room_anim_go" ); thread do_wait(); add_wait( ::flag_wait, "trainer_go" ); add_func( ::do_anim, "trainer" ); level add_abort( ::waittill_msg, "new_room_anim_go" ); thread do_wait(); } /************************************************************************************************************/ /* START POINTS */ /************************************************************************************************************/ start_common() { SetSavedDvar( "hud_drawHUD", "0" ); SetSavedDvar( "ammoCounterHide", "1" ); SetSavedDvar( "actionSlotsHide", "1" ); SetSavedDvar( "compass", "0" ); setsaveddvar( "g_friendlyNameDist", "0" ); setsaveddvar( "g_enteqDist", "0" ); trigger_off( "free_roam_look_ats", "targetname" ); sidebar = create_client_overlay_custom_size( "credits_side_bar", .45, 600, 480 ); sidebar.alignX = "left"; sidebar.horzAlign = "left"; sidebar.x = -280; level.black = create_client_overlay( "black", 1 ); if( level.level_mode != "credits_1" ) { player_lerp_eq(); thread music_loop( "af_chase_ending_credits" , 122, 1 ); } else level.black_overlay delaycall( .5, ::destroy ); level.player allowcrouch( false ); level.player allowprone( false ); level.player TakeAllWeapons(); add_global_spawn_function( "axis", ::museum_ai_think ); add_global_spawn_function( "allies", ::museum_ai_think ); add_global_spawn_function( "neutral", ::museum_ai_think ); level.camera = spawn_vehicle_from_targetname_and_drive( "credits_camera" ); level.player playerlinkto( level.camera, undefined, 1, 0,0,0,0,0 ); level.player delaycall( .1, ::freezecontrols, true ); noself_delaycall( 1, ::SetSavedDvar, "cg_fov", 45 ); spawntrigs = GetEntArray( "spawntrig", "targetname" ); array_thread( spawntrigs, ::spawner_trig_think ); ai_anim_setups(); thread end_credits(); } player_lerp_eq() { level.player SetEqLerp( .05, level.eq_main_track ); AmbientStop( .05 ); thread maps\_ambient::use_eq_settings( "fadeall_but_music", level.eq_mix_track ); thread maps\_ambient::blend_to_eq_track( level.eq_mix_track , .05 ); } ai_anim_setups() { array_thread( getentarray( "civ_talkers", "script_noteworthy" ), ::add_spawn_function, ::civ_talkers ); array_thread( getentarray( "room1", "targetname" ), ::set_diarama_ai ); array_thread( getentarray( "room2", "targetname" ), ::set_diarama_ai ); array_thread( getentarray( "civilians", "targetname" ), ::set_civilian_ai ); array_thread( getentarray( "civilians", "targetname" ), ::add_spawn_function, ::delete_civ_on_goal ); array_thread( getentarray( "civ_talkers", "script_noteworthy" ), ::set_civilian_ai ); afcaves_setup(); dcburning_setup(); airport_setup(); cliffhanger_setup(); favela_setup(); oilrig_setup(); estate_setup(); hostage_setup(); trainer_setup(); arcadia_setup(); thread flag_set_delayed( "museum_ready", .05 ); } start_free() { precachestring( &"CHAR_MUSEUM_LINE1" ); precachestring( &"CHAR_MUSEUM_LINE3" ); precachestring( &"CHAR_MUSEUM_LINE4" ); add_global_spawn_function( "axis", ::museum_ai_think ); add_global_spawn_function( "allies", ::museum_ai_think ); add_global_spawn_function( "neutral", ::museum_ai_think ); array_thread( level.players, ::museum_player_setup ); spawntrigs = GetEntArray( "spawntrig", "targetname" ); array_thread( spawntrigs, ::spawner_trig_think ); ai_anim_setups(); array_thread( getentarray( "panic_button", "targetname" ), ::panic_button ); } start_afcaves() { start_common(); flag_wait( "museum_ready" ); wait .05; room1trig = GetEnt( "room1", "script_noteworthy" ); room1trig spawn_museum_dudes(); } start_dcburning() { start_common(); flag_wait( "museum_ready" ); wait .05; room1trig = GetEnt( "room1", "script_noteworthy" ); room1trig spawn_museum_dudes(); } start_airport() { start_common(); flag_wait( "museum_ready" ); wait .05; room1trig = GetEnt( "room1", "script_noteworthy" ); room1trig spawn_museum_dudes(); array_thread( getentarray( "room1_civ_talkers", "targetname" ), ::spawn_ai, true ); } start_cliffhanger() { start_common(); flag_wait( "museum_ready" ); wait .05; room1trig = GetEnt( "room1", "script_noteworthy" ); room1trig spawn_museum_dudes(); array_thread( getentarray( "room1_civ_talkers", "targetname" ), ::spawn_ai, true ); } start_favela() { start_common(); flag_wait( "museum_ready" ); wait .05; room1trig = GetEnt( "room1", "script_noteworthy" ); room1trig spawn_museum_dudes(); array_thread( getentarray( "room1_civ_talkers", "targetname" ), ::spawn_ai, true ); } start_hallway1() { start_common(); flag_wait( "museum_ready" ); wait .05; room1trig = GetEnt( "room1", "script_noteworthy" ); room1trig spawn_museum_dudes(); array_thread( getentarray( "room1_civ_talkers", "targetname" ), ::spawn_ai, true ); } start_vehicles() { start_common(); flag_wait( "museum_ready" ); wait .05; array_thread( getentarray( "room3_civ_talkers", "targetname" ), ::spawn_ai, true ); } start_hallway2() { start_common(); flag_wait( "museum_ready" ); wait .05; } start_oilrig() { start_common(); flag_wait( "museum_ready" ); wait .05; room2trig = GetEnt( "room2", "script_noteworthy" ); room2trig spawn_museum_dudes(); array_thread( getentarray( "room2_civ_talkers", "targetname" ), ::spawn_ai, true ); } start_estate() { start_common(); flag_wait( "museum_ready" ); wait .05; room2trig = GetEnt( "room2", "script_noteworthy" ); room2trig spawn_museum_dudes(); array_thread( getentarray( "room2_civ_talkers", "targetname" ), ::spawn_ai, true ); } start_hostage() { start_common(); flag_wait( "museum_ready" ); wait .05; room2trig = GetEnt( "room2", "script_noteworthy" ); room2trig spawn_museum_dudes(); array_thread( getentarray( "room2_civ_talkers", "targetname" ), ::spawn_ai, true ); camera_move( "camara_path_hostage_mid", 500, 0, .05 ); level.camera ResumeSpeed( 5 ); wait 3.5; camera_move( "camara_path_hostage", 75, 0 ); level notify( "cam_hostage" ); } start_trainer() { start_common(); flag_wait( "museum_ready" ); wait .05; room2trig = GetEnt( "room2", "script_noteworthy" ); room2trig spawn_museum_dudes(); array_thread( getentarray( "room2_civ_talkers", "targetname" ), ::spawn_ai, true ); } start_arcadia() { start_common(); flag_wait( "museum_ready" ); wait .05; room2trig = GetEnt( "room2", "script_noteworthy" ); room2trig spawn_museum_dudes(); array_thread( getentarray( "room2_civ_talkers", "targetname" ), ::spawn_ai, true ); } start_black() { level.black = create_client_overlay( "black", 1 ); thread music_loop( "af_chase_ending_credits" , 122, 1 ); level.player SetEqLerp( .05, level.eq_main_track ); AmbientStop( .05 ); thread maps\_ambient::use_eq_settings( "fadeall_but_music", level.eq_mix_track ); thread maps\_ambient::blend_to_eq_track( level.eq_mix_track , .05 ); level.player allowcrouch( false ); level.player allowprone( false ); level.player TakeAllWeapons(); level.player DisableWeapons(); level.player FreezeControls( true ); } end_credits() { level.credits_speed = 25.5; thread maps\_credits::playCredits(); if( level.level_mode == "credits_1" ) wait 3.5; thread fade_from_black(); wait 290; //-> magic timing - do not change...change credit speed instead wait 28; //additional time after credits changes level.credits_speed = 4; flag_set( "atvi_credits_go" ); wait 20; thread music_stop( 4 ); wait 5; if( level.level_mode == "credits_1" ) flag_set( "af_chase_nextmission" ); else nextmission(); } fade_from_black() { wait 9; flag_set( "fade_from_black" ); wait 1; level.black FadeOverTime( 2 ); level.black.alpha = 0; }