400 lines
12 KiB
Plaintext
400 lines
12 KiB
Plaintext
|
#include maps\_utility;
|
|||
|
#include common_scripts\utility;
|
|||
|
#include maps\_anim;
|
|||
|
#include maps\_vehicle;
|
|||
|
#include maps\_specialops;
|
|||
|
#include maps\_slowmo_breach;
|
|||
|
|
|||
|
main()
|
|||
|
{
|
|||
|
level.so_compass_zoom = "close";
|
|||
|
|
|||
|
remove_triggers = getentarray( "redshirt_trigger", "targetname" );
|
|||
|
foreach( trigger in remove_triggers )
|
|||
|
trigger Delete();
|
|||
|
|
|||
|
add_start( "start_map", ::start_map );
|
|||
|
maps\oilrig::main();
|
|||
|
default_start( ::start_map );
|
|||
|
thread maps\oilrig::above_water_art_and_ambient_setup();
|
|||
|
thread maps\oilrig::killtrigger_ocean_on();
|
|||
|
|
|||
|
// use different spotlight in splitscreen.
|
|||
|
if ( issplitscreen() )
|
|||
|
level._effect[ "_attack_heli_spotlight" ] = LoadFX( "misc/spotlight_large" );
|
|||
|
}
|
|||
|
|
|||
|
start_map()
|
|||
|
{
|
|||
|
level endon( "special_op_terminated" );
|
|||
|
|
|||
|
/*-----------------------
|
|||
|
INITIALIZATION
|
|||
|
-------------------------*/
|
|||
|
level.hostagemanhandle = false;
|
|||
|
thread fade_challenge_in();
|
|||
|
thread enable_challenge_timer( "breaching_on", "barracks_cleared" );
|
|||
|
thread music_to_first_breach();
|
|||
|
thread music_to_top_deck();
|
|||
|
// thread music_end();
|
|||
|
thread breach_flags();
|
|||
|
thread maps\oilrig::c4_barrels();
|
|||
|
assert( isdefined( level.gameskill ) );
|
|||
|
switch( level.gameSkill )
|
|||
|
{
|
|||
|
case 0: // Easy
|
|||
|
case 1: gameskill_Regular(); break; // Regular
|
|||
|
case 2: gameskill_hardened(); break; // Hardened
|
|||
|
case 3: gameskill_veteran(); break; // Veteran
|
|||
|
}
|
|||
|
thread obj_main();
|
|||
|
|
|||
|
maps\_compass::setupMiniMap( "compass_map_oilrig_lvl_1" );
|
|||
|
array_thread( getentarray( "compassTriggers", "targetname" ), maps\oilrig::compass_triggers_think );
|
|||
|
|
|||
|
/*-----------------------
|
|||
|
FIRST BREACH
|
|||
|
-------------------------*/
|
|||
|
array_call( level.players,::SetMoveSpeedScale, 1 );
|
|||
|
level.playerspeed = undefined;
|
|||
|
|
|||
|
//"Sub Command: Civilian hostages hostages at your position, watch your fire."
|
|||
|
delaythread( 2,::radio_dialogue, "oilrig_sbc_civilhostages" );
|
|||
|
|
|||
|
battlechatter_on( "axis" );
|
|||
|
|
|||
|
/*-----------------------
|
|||
|
OPEN GATE, SOUND ALARMS
|
|||
|
-------------------------*/
|
|||
|
flag_wait( "upper_room_cleared" );
|
|||
|
|
|||
|
//"Sub Command: Hotel Six, hostages from lower decks are being extracted by Team 2. Proceed to the top deck ASAP to secure the rest, over."
|
|||
|
delaythread( 2,::radio_dialogue, "oilrig_sbc_gettolz" );
|
|||
|
|
|||
|
level.hostageNodes = getnodearray( "node_hostage_scaffolding", "targetname" );
|
|||
|
volume_ambush_room = getent( "volume_ambush_room", "script_noteworthy" );
|
|||
|
thread hostage_evac( volume_ambush_room );
|
|||
|
thread alarm();
|
|||
|
|
|||
|
wait 10;
|
|||
|
thread maps\oilrig::open_gate( undefined, true );
|
|||
|
thread maps\oilrig::spawn_trigger_dummy( "dummy_spawner_ballsout_intro" );
|
|||
|
thread maps\oilrig::spawn_trigger_dummy( "dummy_spawner_ballsout" );
|
|||
|
|
|||
|
flag_wait( "player_at_deck1_midpoint" );
|
|||
|
|
|||
|
/*-----------------------
|
|||
|
DECK 2 RAPPELERS
|
|||
|
-------------------------*/
|
|||
|
aSpawners = getentarray( "hostiles_rappel_deck2", "targetname" );
|
|||
|
flag_wait( "rappel_dudes_failsafe" );
|
|||
|
aHostiles = maps\oilrig::spawn_group_staggered( aSpawners );
|
|||
|
|
|||
|
/*-----------------------
|
|||
|
DECK 2 HELICOPTER
|
|||
|
-------------------------*/
|
|||
|
heli_enters_and_attacks();
|
|||
|
|
|||
|
/*-----------------------
|
|||
|
DECK 3
|
|||
|
-------------------------*/
|
|||
|
flag_wait( "player_at_stairs_to_top_deck" );
|
|||
|
thread maps\oilrig::deck3_firefight();
|
|||
|
|
|||
|
flag_wait( "smoke_firefight" );
|
|||
|
thread dialogue_thermal_hint();
|
|||
|
|
|||
|
flag_wait( "player_approaching_topdeck_building" );
|
|||
|
//***Sub Command Hotel Six, be advised, hostages have been confirmed at your location along with possible explosives, over.
|
|||
|
radio_dialogue( "oilrig_sbc_hostconfirmed" );
|
|||
|
|
|||
|
/*-----------------------
|
|||
|
FINAL BREACH
|
|||
|
-------------------------*/
|
|||
|
flag_wait( "top_deck_room_breached" );
|
|||
|
|
|||
|
|
|||
|
/*-----------------------
|
|||
|
LEVEL END
|
|||
|
-------------------------*/
|
|||
|
flag_wait( "barracks_cleared" );
|
|||
|
|
|||
|
wait( 2 );
|
|||
|
//***Sub Command Good job, Hotel Six. Marine reinforcements are inserting now to dismantle the SAM sites. Get your team ready for phase two of the operation. Out.
|
|||
|
// radio_dialogue( "oilrig_sbc_phase2" );
|
|||
|
|
|||
|
|
|||
|
// thread dialogue_end_chatter();
|
|||
|
thread fade_challenge_out();
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
dialogue_thermal_hint()
|
|||
|
{
|
|||
|
wait 2;
|
|||
|
|
|||
|
//Cpt. MacTavish All teams be advised: these guys are a step up - they're using thermal optics to see through the smoke.
|
|||
|
dialogue_array[0] = "oilrig_use_thermal_00";
|
|||
|
//Cpt. MacTavish If you've got thermal sights, now would be a good time! oilrig_nsl_pickoff tense, aggressive, under fire, a bit sarcastic
|
|||
|
dialogue_array[1] = "oilrig_find_thermal_00";
|
|||
|
|
|||
|
iRand = randomint( dialogue_array.size );
|
|||
|
radio_dialogue( dialogue_array[ iRand ] );
|
|||
|
}
|
|||
|
|
|||
|
heli_enters_and_attacks()
|
|||
|
{
|
|||
|
heliSpawner = getent( "heli_deck2", "targetname" );
|
|||
|
heliSpawner.origin = heliSpawner.origin + ( 0, 0, -250 );
|
|||
|
eHeli = spawn_vehicle_from_targetname_and_drive( "heli_deck2" );
|
|||
|
|
|||
|
eHeli endon( "death" );
|
|||
|
|
|||
|
foreach( eTurret in eHeli.mgturret )
|
|||
|
{
|
|||
|
eTurret turret_set_default_on_mode( "manual" );
|
|||
|
eTurret setMode( "manual" );
|
|||
|
}
|
|||
|
eHeli.dontWaitForPathEnd = true;
|
|||
|
thread maps\oilrig::heli_ramp_up_damage( eHeli );
|
|||
|
eHeli thread heli_intimidates_player();
|
|||
|
eHeli delaythread ( 3, maps\_attack_heli::heli_spotlight_on, "tag_barrel", true );
|
|||
|
thread track_if_player_is_shooting_at_intimidating_heli( eHeli );
|
|||
|
thread maps\oilrig::heli_kill_failsafe( eHeli );
|
|||
|
|
|||
|
flag_wait_either( "player_shoots_or_aims_rocket_at_intimidating_heli", "deck_2_heli_is_finished_intimidating" );
|
|||
|
eHeli = maps\_attack_heli::begin_attack_heli_behavior( eHeli );
|
|||
|
}
|
|||
|
|
|||
|
heli_intimidates_player()
|
|||
|
{
|
|||
|
wait( 5 );
|
|||
|
flag_set( "deck_2_heli_is_finished_intimidating" );
|
|||
|
}
|
|||
|
|
|||
|
track_if_player_is_shooting_at_intimidating_heli( eHeli )
|
|||
|
{
|
|||
|
level endon( "deck_2_heli_is_finished_intimidating" );
|
|||
|
level endon( "player_shoots_or_aims_rocket_at_intimidating_heli" );
|
|||
|
for ( ;; )
|
|||
|
{
|
|||
|
// this damage is done to self.health which isnt used to determine the helicopter's health, damageTaken is.
|
|||
|
eHeli waittill( "damage", damage, attacker, direction_vec, P, type );
|
|||
|
|
|||
|
if ( !isdefined( attacker ) || !isplayer( attacker ) )
|
|||
|
continue;
|
|||
|
else
|
|||
|
{
|
|||
|
flag_set( "player_shoots_or_aims_rocket_at_intimidating_heli" );
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
dialogue_end_chatter()
|
|||
|
{
|
|||
|
|
|||
|
//***Marine HQ Hunter Two-Two, this is Punisher Actual. GOPLAT secure. All EOD teams are cleared for landing.
|
|||
|
radio_dialogue( "oilrig_rmv_goplat" );
|
|||
|
|
|||
|
//***Marine 1 Roger Punisher, Hunter Two-Two copies all. military monotone, background flavor dialogue
|
|||
|
radio_dialogue( "oilrig_gm1_copies" );
|
|||
|
|
|||
|
//***F-15 Pilot Punisher this is Phoenix One-One, flight of two F-15s en route to grid 257221 for SEAD mission, requesting sitrep over
|
|||
|
radio_dialogue( "oilrig_f15_twof15s" );
|
|||
|
|
|||
|
//***Marine HQ Phoenix One-One, Punisher. Blue sky, I repeat blue sky. Come to heading two-four-zero and continue on course to target area. Good hunting. Over.
|
|||
|
radio_dialogue( "oilrig_rmv_bluesky" );
|
|||
|
|
|||
|
//***F-15 Pilot Phoenix One-One copies. Out.
|
|||
|
radio_dialogue( "oilrig_f15_copies" );
|
|||
|
|
|||
|
//***Marine HQ Punisher to all flights in vicinity of grid 255202, local airspace is secure. I repeat, local airspace is secure. Proceed on course to target area along Route November Two.
|
|||
|
radio_dialogue( "oilrig_rmv_localairspace" );
|
|||
|
|
|||
|
//***Marine 1 Punisher this Hunter Actual. Hunter Two-Two is moving to secure the SAM site at the southwest corner of main deck. Hunter Two-Three is proceeding towards the derrick building to disarm the explosives.
|
|||
|
radio_dialogue( "oilrig_gm1_hunteractual" );
|
|||
|
|
|||
|
//***Marine HQ Punisher copies all. We have eyes on two-two. They are arriving at the southwest SAM site<74> standby<62> standby<62>Site is secure, repeat site is secure.
|
|||
|
//radio_dialogue( "oilrig_rmv_standby" );
|
|||
|
|
|||
|
//***Marine HQ Punisher Actual to all strike teams - all SAM sites neutralized, repeat, all SAM sites have been neutralized. Blue sky in effect.
|
|||
|
radio_dialogue( "oilrig_rmv_samsitesneut" );
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
breach_flags()
|
|||
|
{
|
|||
|
level waittill( "breach_explosion" );
|
|||
|
flag_set( "upper_room_breached" );
|
|||
|
|
|||
|
wait( 2 );
|
|||
|
|
|||
|
level waittill( "breach_explosion" );
|
|||
|
flag_set( "top_deck_room_breached" );
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
alarm()
|
|||
|
{
|
|||
|
alarm_org = getent( "origin_alarm", "targetname" );
|
|||
|
alarm_org playloopsound( "emt_oilrig_alarm_alert" );
|
|||
|
wait( 20 );
|
|||
|
alarm_org stopLoopSound( "emt_oilrig_alarm_alert" );
|
|||
|
alarm_org delete();
|
|||
|
}
|
|||
|
|
|||
|
music_to_first_breach()
|
|||
|
{
|
|||
|
level endon( "upper_room_breached" );
|
|||
|
|
|||
|
music_alias = "so_assault_oilrig_sneak_music";
|
|||
|
music_time = musicLength( music_alias ) + 2;
|
|||
|
while ( !flag( "upper_room_breached" ) )
|
|||
|
{
|
|||
|
MusicPlayWrapper( music_alias );
|
|||
|
wait( music_time );
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
music_to_top_deck()
|
|||
|
{
|
|||
|
flag_wait( "upper_room_breached" );
|
|||
|
music_stop();
|
|||
|
flag_wait( "upper_room_cleared" );
|
|||
|
|
|||
|
level endon( "top_deck_room_breached" );
|
|||
|
|
|||
|
music_alias = "so_assault_oilrig_fight_music_01";
|
|||
|
music_time = musicLength( music_alias ) + 2;
|
|||
|
while ( !flag( "top_deck_room_breached" ) )
|
|||
|
{
|
|||
|
MusicPlayWrapper( "so_assault_oilrig_fight_music_01" );
|
|||
|
wait( music_time );
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
music_end()
|
|||
|
{
|
|||
|
flag_wait( "top_deck_room_breached" );
|
|||
|
music_stop();
|
|||
|
|
|||
|
flag_wait( "barracks_cleared" );
|
|||
|
musicstop();
|
|||
|
wait( .5 );
|
|||
|
MusicPlayWrapper( "so_assault_oilrig_victory_music" );
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
hostage_evac( eVolume )
|
|||
|
{
|
|||
|
level endon( "mission failed" );
|
|||
|
level endon( "missionfailed" );
|
|||
|
level endon( "player_shot_a_hostage" );
|
|||
|
aHostages = eVolume get_ai_touching_volume( "neutral" );
|
|||
|
if ( flag( "oilrig_mission_failed" ) )
|
|||
|
return;
|
|||
|
if ( flag( "missionfailed" ) )
|
|||
|
return;
|
|||
|
array_thread( aHostages, ::hostage_evac_think );
|
|||
|
thread AI_delete_when_out_of_sight( aHostages, 512 );
|
|||
|
}
|
|||
|
|
|||
|
hostage_evac_think()
|
|||
|
{
|
|||
|
level endon( "mission failed" );
|
|||
|
self endon( "death" );
|
|||
|
|
|||
|
while( !isdefined( self.breachfinished ) )
|
|||
|
wait( .1 );
|
|||
|
|
|||
|
while( self.breachfinished == false )
|
|||
|
wait( .1 );
|
|||
|
|
|||
|
wait( randomfloatrange( 1, 2 ) );
|
|||
|
eNode = level.hostageNodes[ 0 ];
|
|||
|
level.hostageNodes = array_remove( level.hostageNodes, eNode );
|
|||
|
|
|||
|
if ( !isdefined( self ) )
|
|||
|
return;
|
|||
|
|
|||
|
self notify( "stop_idle" );
|
|||
|
self setgoalnode( eNode );
|
|||
|
self.goalradius = 64;
|
|||
|
self.alertlevel = "alert";
|
|||
|
self waittill( "goal" );
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
gameskill_regular()
|
|||
|
{
|
|||
|
level.challenge_objective = &"SO_ASSAULT_OILRIG_OBJ_MAIN";
|
|||
|
}
|
|||
|
|
|||
|
gameskill_hardened()
|
|||
|
{
|
|||
|
level.challenge_objective = &"SO_ASSAULT_OILRIG_OBJ_MAIN";
|
|||
|
}
|
|||
|
|
|||
|
gameskill_veteran()
|
|||
|
{
|
|||
|
level.challenge_objective = &"SO_ASSAULT_OILRIG_OBJ_MAIN";
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
obj_main()
|
|||
|
{
|
|||
|
objective_number = 1;
|
|||
|
obj_positions = getentarray( "obj_breach2", "targetname" );
|
|||
|
|
|||
|
objective_add( objective_number, "current", level.challenge_objective );
|
|||
|
|
|||
|
assign_script_breachgroup_to_ents( obj_positions );
|
|||
|
|
|||
|
// find out which breaches should be added to the objective positions
|
|||
|
breach_indices = get_breach_indices_from_ents( obj_positions );
|
|||
|
|
|||
|
// add positions for these breaches
|
|||
|
objective_breach( objective_number, breach_indices[ 0 ], breach_indices[ 1 ], breach_indices[ 2 ], breach_indices[ 3 ] );
|
|||
|
|
|||
|
flag_wait( "upper_room_breached" );
|
|||
|
objective_clearAdditionalPositions( objective_number );
|
|||
|
Objective_SetPointerTextOverride( objective_number ); // clear the breached text
|
|||
|
|
|||
|
flag_wait( "upper_room_cleared" );
|
|||
|
obj_position = getent( "obj_explosives_locate_01", "targetname" );
|
|||
|
Objective_Position( objective_number, obj_position.origin );
|
|||
|
|
|||
|
flag_wait( "player_at_stairs_to_deck_2" );
|
|||
|
obj_position = getent( "obj_explosives_locate_01a", "targetname" );
|
|||
|
objective_position( objective_number, obj_position.origin );
|
|||
|
|
|||
|
flag_wait( "player_at_corener_of_deck2" );
|
|||
|
obj_position = getent( "obj_explosives_locate_02", "targetname" );
|
|||
|
objective_position( objective_number, obj_position.origin );
|
|||
|
|
|||
|
flag_wait( "player_at_stairs_to_top_deck" );
|
|||
|
|
|||
|
obj_positions = getentarray( "obj_breach3", "targetname" );
|
|||
|
assign_script_breachgroup_to_ents( obj_positions );
|
|||
|
|
|||
|
// find out which breaches should be added to the objective positions
|
|||
|
breach_indices = get_breach_indices_from_ents( obj_positions );
|
|||
|
|
|||
|
// add positions for these breaches
|
|||
|
objective_breach( objective_number, breach_indices[ 0 ], breach_indices[ 1 ], breach_indices[ 2 ], breach_indices[ 3 ] );
|
|||
|
|
|||
|
flag_wait( "top_deck_room_breached" );
|
|||
|
objective_clearAdditionalPositions( objective_number );
|
|||
|
|
|||
|
flag_wait( "barracks_cleared" );
|
|||
|
|
|||
|
wait( 1 );
|
|||
|
|
|||
|
objective_state( objective_number, "done" );
|
|||
|
}
|