#include common_scripts\utility; #include maps\_utility; #include maps\_ac130; #include maps\co_ac130_code; #include maps\_hud_util; #include maps\_specialops; CONST_specop_difficulty = 50; // % of enemies seeking player's location, increased difficulty for spec op mission CONST_laser_hint_timeout = 25; // seconds main() { default_start( ::start_ac130 ); set_default_start( "ac130" ); add_start( "ac130", ::start_ac130, "[ac130] -> default gameplay" ); add_start( "so", ::start_specop, "[so] -> spec op gameplay" ); level.default_goalradius = 2048; level.default_goalheight = 512; setDvarIfUninitialized( "no_respawn", "1" ); setDvarIfUninitialized( "do_saves", "0" ); battlechatter_off( "allies" ); battlechatter_off( "axis" ); precacheLevelStuff(); vehicleScripts(); if ( level.console ) level.hint_text_size = 1.6; else level.hint_text_size = 1.2; precacheShader( "waypoint_targetneutral" ); precacheShader( "waypoint_checkpoint_neutral_a" ); precacheShader( "waypoint_checkpoint_neutral_b" ); precacheShader( "waypoint_checkpoint_neutral_c" ); precacheShader( "waypoint_checkpoint_neutral_d" ); precacheShader( "waypoint_checkpoint_neutral_e" ); // Checkpoint A: precachestring( &"CO_HUNTED_TIME_TILL_CHECKPOINT_A" ); // Checkpoint B: precachestring( &"CO_HUNTED_TIME_TILL_CHECKPOINT_B" ); // Checkpoint C: precachestring( &"CO_HUNTED_TIME_TILL_CHECKPOINT_C" ); // Checkpoint D: precachestring( &"CO_HUNTED_TIME_TILL_CHECKPOINT_D" ); // Reach targe in: precachestring( &"CO_HUNTED_CO_HUNTED_SPECOP_TIMER" ); // Cross the bridge in: precachestring( &"CO_HUNTED_TIME_TILL_EXPLOSION" ); // Mission failed. Enemy destroyed the bridge. precachestring( &"CO_HUNTED_TIMER_EXPIRED" ); // Mission failed. You ran out of time. precachestring( &"CO_HUNTED_EXPIRED_SPECOP" ); // Cross the bridge to safety before it is destroyed. precachestring( &"CO_HUNTED_OBJ_CROSS_BRIDGE" ); // Reach the checkpoint at the barn. precachestring( &"CO_HUNTED_OBJ_REACH_BARN" ); // Checkpoint A time expired. precachestring( &"CO_HUNTED_MISSED_CHECKPOINT_A" ); // Checkpoint B time expired. precachestring( &"CO_HUNTED_MISSED_CHECKPOINT_B" ); // Checkpoint C time expired. precachestring( &"CO_HUNTED_MISSED_CHECKPOINT_C" ); // Checkpoint D time expired. precachestring( &"CO_HUNTED_MISSED_CHECKPOINT_D" ); // Press ^3[{weapnext}]^7 to cycle through weapons. precachestring( &"AC130_HINT_CYCLE_WEAPONS" ); // Press ^3[{+actionslot 4}]^7 to use toggle laser targeting device. precachestring( &"CO_HUNTED_HINT_LASER" ); maps\_truck::main( "vehicle_pickup_roobars" ); level.weaponClipModels = []; level.weaponClipModels[ 0 ] = "weapon_ak47_clip"; level.weaponClipModels[ 1 ] = "weapon_m16_clip"; // player 1 is ac130 gunner in coop games //level.ac130gunner = level.player; maps\co_hunted_fx::main(); maps\co_hunted_precache::main(); maps\_load::main(); maps\_compass::setupMiniMap( "compass_map_hunted" ); // Press ^3[{weapnext}]^7 to cycle through weapons. add_hint_string( "ac130_changed_weapons", &"AC130_HINT_CYCLE_WEAPONS", ::ShouldBreakAC130HintPrint ); // Press ^3[{+actionslot 4}]^7 to use toggle laser targeting device. add_hint_string( "laser_hint", &"CO_HUNTED_HINT_LASER", ::ShouldBreakLaserHintPrint ); } gameplay_logic( gametype ) { if( !isdefined( gametype ) ) gametype = "default"; flag_init( "timer_expired" ); if( gametype != "specop" ) { level.alphaTeam = getEntArray( "alpha", "targetname" ); level.bravoTeam = getEntArray( "bravo", "targetname" ); array_thread( level.alphaTeam, ::set_thermal_LOD ); array_thread( level.bravoTeam, ::set_thermal_LOD ); } else { level.challenge_start_time = gettime(); thread fade_challenge_in(); array_call( GetSpawnerTeamArray( "allies" ), ::delete ); array_call( GetAIArray("allies"), ::delete ); } enemies = getspawnerteamarray( "axis" ); array_thread( enemies, ::add_spawn_function, ::set_thermal_LOD ); array_thread( enemies, ::add_spawn_function, ::kill_after_time, 60 ); //setsaveddvar( "r_lodBiasRigid", "10000" ); //setsaveddvar( "r_lodBiasSkinned", "10000" ); if ( is_coop() ) { maps\co_ac130_anim::main(); maps\co_ac130_snd::main(); level.ac130_flood_respawn = true; maps\_nightvision::main( level.players ); maps\_ac130::init();// pops up the menu and sets who level.ac130gunner is if( gametype != "specop" ) { // Add beacon effects to friendlies array_thread( level.alphaTeam, ::add_beacon_effect ); array_thread( level.bravoTeam, ::add_beacon_effect ); } if ( level.player == level.ac130gunner ) level.ground_player = level.player2; else level.ground_player = level.player; level.ground_player thread add_beacon_effect(); level.ground_player thread hint_timeout(); level.ground_player ent_flag_init( "player_used_laser" ); level.ground_player thread laser_targeting_device(); level.ground_player thread display_hint( "laser_hint" ); //array_thread( array_remove( level.players, level.ac130gunner ), ::add_beacon_effect ); //array_thread( array_remove( level.players, level.ac130gunner ), ::laser_targeting_device ); level.ground_player set_vision_set_player( "hunted", 0 ); move_ac130 = getentarray( "move_ac130", "targetname" ); array_thread( move_ac130, ::move_ac130_think ); level.ac130gunner laserForceOn(); //thread draw_ground_player_facing(); thread ac130_change_weapon_hint(); wait 0.1; flag_clear( "coop_revive" ); flag_set( "clear_to_engage" ); /*foreach ( player in level.players ) { player giveachievement( "AC_130_COOP" );// this should be a per - player function now that we support co - op }*/ } else { level.ground_player = level.player; maps\_nightvision::main(); level.player set_vision_set_player( "hunted", 0 ); } battlechatter_on( "allies" ); battlechatter_on( "axis" ); // Start saveGame( "levelstart", &"AUTOSAVE_LEVELSTART", "whatever", true ); level.timed = true; /*level.timed = false; gameskill_p1 = level.player get_player_gameskill(); gameskill_p2 = level.player2 get_player_gameskill(); if ( ( gameskill_p1 > 1 ) && ( gameskill_p2 > 1 ) ) level.timed = true; else level.timed = false; */ if( gametype != "specop" ) { // Make them invulnerable for now array_thread( level.alphaTeam, ::magic_bullet_shield ); //array_thread( level.bravoTeam, ::magic_bullet_shield ); } thread open_all_doors(); thread enemy_monitor(); if ( level.timed ) thread timer_start(); thread objective( gametype ); thread checkpoint_system( gametype ); delete_vehicle_nodes = getentarray( "delete_vehicle", "script_noteworthy" ); array_thread( delete_vehicle_nodes, ::delete_vehicle_think ); thread move_enemies_to_closest_goal_radius( gametype ); } // ****** Starts ****** // start_ac130() { thread gameplay_logic( "default" ); } start_specop() { thread gameplay_logic( "specop" ); } move_enemies_to_closest_goal_radius( gametype ) { level endon( "specop_challenge_completed" ); goals = getentarray( "enemy_goal_radius", "targetname" ); level.current_goal = getclosest( level.ground_player.origin, goals ); level.hunter_enemies = []; spawners = getspawnerarray(); array_thread( spawners, ::add_spawn_function, ::create_hunter_enemy ); if ( gametype == "specop" ) move_deadlier_hunters_to_new_goal( level.current_goal ); else move_hunters_to_new_goal( level.current_goal ); while ( 1 ) { closest_goal = getclosest( level.ground_player.origin, goals ); //only goal enemies to one of the players and assume they stay together if ( level.current_goal != closest_goal ) { level.current_goal = closest_goal; if ( gametype == "specop" ) move_deadlier_hunters_to_new_goal( closest_goal ); else move_hunters_to_new_goal( closest_goal ); } wait 1; } } create_hunter_enemy() { if ( self.team != "axis" ) return; level.hunter_enemies[ self.unique_id ] = self; self setgoalpos( level.current_goal.origin ); self waittill( "death" ); level.hunter_enemies[ self.unique_id ] = undefined; } move_hunters_to_new_goal( closest_goal ) { waittillframeend; //waittillframeend because you may be in the part of the frame that is before //the script has received the "death" notify but after the AI has died. foreach ( enemy in level.hunter_enemies ) enemy setgoalpos( closest_goal.origin ); } move_deadlier_hunters_to_new_goal( closest_goal ) { waittillframeend; //Sent half the enemies to player, and the other half to set goal, foreach ( enemy in level.hunter_enemies ) { if ( RandomInt( 100 ) < CONST_specop_difficulty ) enemy setgoalpos( closest_goal.origin ); else enemy setgoalentity( level.ground_player ); } } ShouldBreakAC130HintPrint() { return flag( "player_changed_weapons" ); } hint_timeout() { //self is ground player self.hint_timeout = CONST_laser_hint_timeout; // seconds while ( self.hint_timeout > -1 ) { self.hint_timeout--; wait 1; } } ShouldBreakLaserHintPrint() { if( !isdefined( level.ground_player ) ) return false; else if( isdefined( level.ground_player.hint_timeout ) && level.ground_player.hint_timeout <= 0 ) return true; else return level.ground_player ent_flag( "player_used_laser" ); } ac130_change_weapon_hint() { wait 12; if ( !flag( "player_changed_weapons" ) ) level.ac130gunner thread display_hint( "ac130_changed_weapons" ); // Press ^3[{weapnext}]^7 to cycle through weapons. //hintPrint_coop( &"AC130_HINT_CYCLE_WEAPONS" ); } hintPrint_coop( string ) { hint = hint_create( string, true, 0.8 ); wait 5; hint hint_delete(); } delete_vehicle_think() { while ( true ) { self waittill( "trigger", vehicle ); vehicle delete(); } } checkpoint_system( gametype ) { if( gametype == "default" ) { // Checkpoint A: // Checkpoint A time expired. checkpoint_logic( 60, "checkpoint_a", "waypoint_checkpoint_neutral_a", &"CO_HUNTED_TIME_TILL_CHECKPOINT_A", &"CO_HUNTED_MISSED_CHECKPOINT_A" ); // Checkpoint B: // Checkpoint B time expired. checkpoint_logic( 80, "checkpoint_b", "waypoint_checkpoint_neutral_b", &"CO_HUNTED_TIME_TILL_CHECKPOINT_B", &"CO_HUNTED_MISSED_CHECKPOINT_B" ); // Checkpoint C: // Checkpoint C time expired. checkpoint_logic( 110, "checkpoint_c", "waypoint_checkpoint_neutral_c", &"CO_HUNTED_TIME_TILL_CHECKPOINT_C", &"CO_HUNTED_MISSED_CHECKPOINT_C" ); // Checkpoint D: // Checkpoint D time expired. checkpoint_logic( 60, "checkpoint_d", "waypoint_checkpoint_neutral_d", &"CO_HUNTED_TIME_TILL_CHECKPOINT_D", &"CO_HUNTED_MISSED_CHECKPOINT_D" ); escape = getent( "escape_obj", "targetname" ); escape thread threeD_objective_hint( "waypoint_targetneutral" ); } else { specop_obj = getent( "checkpoint_b", "targetname" ); specop_obj thread threeD_objective_hint( "waypoint_targetneutral" ); } } checkpoint_logic( time, flag_name, shader, timer_string, timer_expired_string ) { checkpoint_origin = getent( flag_name, "targetname" ); checkpoint_origin thread threeD_objective_hint( shader, "kill_3d_checkpoint_icon" ); if ( level.timed ) thread checkpoint_timer_logic( time, timer_string, timer_expired_string ); thread waittill_checkpoint_hit( flag_name ); level waittill_either( "checkpoint_timer_expired", flag_name ); level notify( "kill_3d_checkpoint_icon" ); wait 1;// clear the old timer before starting the new one. return; } waittill_checkpoint_hit( flag_name ) { level endon( "checkpoint_timer_expired" ); flag_wait( flag_name ); if ( isdefined( level.checkpoint_timer ) ) level.checkpoint_timer destroy(); level notify( "kill_checkpoint_timer" ); /*if ( getdvar( "do_saves" ) == "1" ) thread autosave_by_name( "checkpoint" );*/ } checkpoint_timer_logic( iSeconds, sLabel, timer_expired_string ) { // destroy any previous timer just in case //killTimer(); level endon( "kill_checkpoint_timer" ); /*----------------------- TIMER SETUP -------------------------*/ level.hudTimerIndex = 20; level.checkpoint_timer = maps\_hud_util::get_countdown_hud( -250, 120 ); //duration = int((iSeconds * 1000) + 3000); //level.checkpoint_timer SetPulseFX( 30, duration, 700 );//something, decay start, decay duration level.checkpoint_timer.label = sLabel; level.checkpoint_timer settenthstimer( iSeconds ); /*----------------------- TIMER EXPIRED -------------------------*/ wait( iSeconds ); thread hint( timer_expired_string, 4 ); level notify( "checkpoint_timer_expired" ); level.checkpoint_timer destroy(); } move_ac130_think() { self waittill( "trigger" ); point = ( getent( self.target, "targetname" ) ).origin; thread movePlaneToPoint( point ); } open_all_doors() { /* doors = getentarray( "barn_main_door","targetname"); for ( i=0; i= level.enemy_force.size ) { if ( getdvar( "no_respawn" ) == "1" ) return; else level.selection = 0; } s_name = level.enemy_force[ level.selection ].name; s_number = level.selection; level.selection++ ; if ( level.enemy_force[ s_number ].type == "one_use_vehicle" ) { if ( level.enemy_force[ s_number ].drove ) return; vehicle = maps\_vehicle::spawn_vehicle_from_targetname_and_drive( s_name ); level.enemy_force[ s_number ].drove = true; return; } if ( level.enemy_force[ s_number ].type == "multi_use_vehicle" ) { vehicle = maps\_vehicle::spawn_vehicle_from_targetname_and_drive( s_name ); return; } //sound_selection = randomint ( level.dialog[ selection ].size ); //thread commander_dialog ( level.dialog[ selection ][ sound_selection ] ); enemy_spawners = getentarray( s_name, "targetname" ); for ( i = 0 ; i < enemy_spawners.size ; i++ ) guy = enemy_spawners[ i ] spawn_ai(); wait 1;// make sure the spawning is done before checking to see how many are spawned } enemy_monitor_loop() { while ( true ) { enemies = getaiarray( "axis" ); total = enemies.size; roaming = total; for ( i = 0 ; i < enemies.size ; i++ ) if ( isdefined( enemies[ i ].script_noteworthy ) ) if ( enemies[ i ].script_noteworthy == "defender" ) roaming -- ; println( " roaming/total: " + roaming + "/" + total ); if ( roaming < 13 ) spawn_enemy_group(); wait 1; } } //getvehiclenode("thenode","script_noteworthy" waittill ("trigger",vehicle); timer_start( gametype ) { dialogue_line = undefined; iSeconds = undefined; switch( level.gameSkill ) { case 0:// easy iSeconds = 260; //4min break; case 1:// regular iSeconds = 200; //3min break; case 2:// hardened iSeconds = 140; //2min break; case 3:// veteran iSeconds = 110; //1.5min break; } assert( isdefined( iSeconds ) ); // Reach target in: level thread bridge_timer_logic( iSeconds, &"CO_HUNTED_SPECOP_TIMER" ); } bridge_timer_logic( iSeconds, sLabel, bUseTick ) { if ( !isdefined( bUseTick ) ) bUseTick = false; // destroy any previous timer just in case killTimer(); level endon( "kill_timer" ); /*----------------------- TIMER SETUP -------------------------*/ level.hudTimerIndex = 20; level.timer = maps\_hud_util::get_countdown_hud( -250, 100 ); level.timer SetPulseFX( 30, 900000, 700 );// something, decay start, decay duration level.timer.label = sLabel; level.timer settenthstimer( iSeconds ); level.start_time = gettime(); /*----------------------- TIMER EXPIRED -------------------------*/ if ( bUseTick == true ) thread timer_tick(); wait( iSeconds ); flag_set( "timer_expired" ); level.timer destroy(); // Mission failed. Enemy destroyed the bridge. level thread mission_failed_out_of_time( &"CO_HUNTED_EXPIRED_SPECOP" ); } mission_failed_out_of_time( deadquote ) { level.player endon( "death" ); level endon( "kill_timer" ); // Mission failed. Enemy destroyed the bridge. //thread hint( &"CO_HUNTED_TIMER_EXPIRED", 4 ); level notify( "mission failed" ); level.player freezeControls( true ); //level.player thread player_death_effect(); //level.player thread play_sound_on_entity( "airplane_final_explosion" ); musicstop( 1 ); setDvar( "ui_deadquote", deadquote ); wait 3; maps\_utility::missionFailedWrapper(); level notify( "kill_timer" ); } player_death_effect() { player = level.player; playfx( level._effect[ "player_death_explosion" ], player.origin ); earthquake( 1, 1, level.player.origin, 100 ); } objective( gametype ) { if( gametype == "default" ) { escape = getent( "escape_obj", "targetname" ); // Cross the bridge to safety before it is destroyed. objective_add( 1, "active", &"CO_HUNTED_OBJ_CROSS_BRIDGE", escape.origin ); objective_current( 1 ); flag_wait( "escaped" ); objective_state( 1, "done" ); //commander_dialog ( "co_cf_cmd_command_out" ); //Nice work Charlie Four, command out. nextmission(); //setsaveddvar( "ui_nextMission", "0" ); //missionSuccess( level.script ); } if( gametype == "specop" ) { specop_barn = getent( "checkpoint_b", "targetname" ); // Reach the checkpoint at the barn. objective_add( 1, "active", &"CO_HUNTED_OBJ_REACH_BARN", specop_barn.origin ); objective_current( 1 ); flag_wait( "checkpoint_b" ); objective_state( 1, "done" ); level notify( "specop_challenge_completed" ); array_call( GetAIArray(), ::delete ); killTimer(); } } threeD_objective_hint( shader, destroyer_msg ) { self.icon = NewHudElem(); //self.icon SetShader( "waypoint_targetneutral", 1, 1 ); self.icon SetShader( shader, 1, 1 ); self.icon.alpha = .5; self.icon.color = ( 1, 1, 1 ); //comm_center.icon SetTargetEnt( comm_center ); origin = self getOrigin(); self.icon.x = origin[ 0 ]; self.icon.y = origin[ 1 ]; self.icon.z = origin[ 2 ]; self.icon SetWayPoint( false, true ); if ( isdefined( destroyer_msg ) ) { level waittill( destroyer_msg ); self.icon destroy(); } } timer_tick() { level endon( "stop_timer_tick" ); level endon( "kill_timer" ); while ( true ) { wait( 1 ); level.player thread play_sound_on_entity( "countdown_beep" ); level notify( "timer_tick" ); } } killTimer() { level notify( "kill_timer" ); if ( isdefined( level.timer ) ) level.timer destroy(); } kill_after_time( time ) { wait( time ); if ( isalive( self ) ) self kill(); } set_thermal_LOD() { self ThermalDrawEnable(); } /* hint( text, timeOut, double_line ) { if ( getdvar( "chaplincheat" ) == "1" ) return; clear_hints(); level endon( "clearing_hints" ); //add_hint_background( double_line ); level.hintElem = createFontString( "objective", level.hint_text_size ); level.hintElem.hidewheninmenu = true; level.hintElem setPoint( "TOP", undefined, 0, 110 ); level.hintElem.sort = 0.5; level.hintElem setText( text ); //level.hintElem endon ( "death" ); if ( isDefined( timeOut ) ) wait( timeOut ); else return; level.hintElem fadeOverTime( 0.5 ); level.hintElem.alpha = 0; wait( 0.5 ); clear_hints(); } clear_hints() { if ( isDefined( level.hintElem ) ) level.hintElem destroyElem(); if ( isDefined( level.iconElem ) ) level.iconElem destroyElem(); if ( isDefined( level.iconElem2 ) ) level.iconElem2 destroyElem(); if ( isDefined( level.iconElem3 ) ) level.iconElem3 destroyElem(); if ( isDefined( level.hintbackground ) ) level.hintbackground destroyElem(); level notify( "clearing_hints" ); } */ draw_ground_player_facing() { color = ( 1, 1, 1 ); while ( 1 ) { forward = AnglesToForward( level.ground_player.angles ); forwardfar = vector_multiply( forward, 200 ); forwardclose = vector_multiply( forward, 100 ); start = forwardclose + level.ground_player.origin; end = forwardfar + level.ground_player.origin; draw_arrow_ac130( start, end, color ); wait .05; } } draw_arrow_ac130( start, end, color ) { pts = []; angles = vectortoangles( start - end ); right = anglestoright( angles ); forward = anglestoforward( angles ); dist = distance( start, end ); arrow = []; range = 0.5; arrow[ 0 ] = start; arrow[ 1 ] = start + vector_multiply( right, dist * ( range ) ) + vector_multiply( forward, dist * - 0.2 ); arrow[ 2 ] = end; arrow[ 3 ] = start + vector_multiply( right, dist * ( -1 * range ) ) + vector_multiply( forward, dist * - 0.2 ); line( arrow[ 0 ], arrow[ 2 ], color, 1.0 ); line( arrow[ 2 ], arrow[ 1 ], color, 1.0 ); line( arrow[ 2 ], arrow[ 3 ], color, 1.0 ); }