#include common_scripts\utility; #include maps\_hud_util; #include maps\_utility; #include maps\_underwater; #include maps\_vehicle; #include maps\jake_tools; #include maps\_anim; #include maps\_slowmo_breach; main() { if ( getdvar( "r_reflectionProbeGenerate" ) == "1" ) return; SetDvar( "breach_debug", "0" ); setdvar( "breach_weapons", "1" ); //setsaveddvar( "thermalBlurFactorScope", 300 ); setdvar( "breach_requires_friendlies_in_position", "0" ); //setdvar( "breach_friendlies", "1" ); setdvar( "hostage_missionfail", "1" ); initPrecache(); /*----------------------- LEVEL VARIABLES -------------------------*/ level.squadsize = 3; level.droneCallbackThread = ::AI_drone_think; //level.c4roomWeaponCleaners = []; setDvarIfUninitialized( "oilrig_debug", "0" ); level.goodFriendlyDistanceFromPlayerSquared = 512 * 512; level.oilrigStealth = false; level.pipesDamage = false; level.c4first = false; level.underwater = false; level.totalHostages = 6; level.spawnerCallbackThread = ::AI_think; level.EnemyHeli = undefined; level.C4locations = []; level.C4locationsIndex = 0; level.aColornodeTriggers = []; level.c4ToPlant = 3; level.hostages = 8; level.dronedeathanims = []; level.cosine[ "25" ] = cos( 25 ); level.cosine[ "35" ] = cos( 35 ); level.cosine[ "45" ] = cos( 45 ); level.cosine[ "60" ] = cos( 60 ); level.stealthDistanceSquared = 512 * 512; trigs = getentarray( "trigger_multiple", "classname" ); foreach ( trigger in trigs ) { if ( ( isdefined( trigger.script_noteworthy ) ) && ( getsubstr( trigger.script_noteworthy, 0, 10 ) == "colornodes" ) ) level.aColornodeTriggers = array_add( level.aColornodeTriggers, trigger ); } /*----------------------- STARTS -------------------------*/ // debug add_start( "debug", ::start_debug, "debug" ); // underwater add_start( "underwater", ::start_underwater, "underwater" ); // surface add_start( "surface", ::start_surface, "surface" ); // rig add_start( "rig", ::start_rig, "rig" ); // deck add_start( "deck1", ::start_deck1, "deck1" ); // heli add_start( "heli", ::start_heli, "ambush" ); // deck2 add_start( "deck2", ::start_deck2, "deck2" ); // deck3 add_start( "deck3", ::start_deck3, "deck3" ); // escape add_start( "escape", ::start_escape, "escape" ); default_start( ::start_default ); /*----------------------- SUPPORT SCRIPTS -------------------------*/ level.weaponClipModels = []; level.weaponClipModels[0] = "weapon_g36_clip"; level.weaponClipModels[1] = "weapon_mini_uzi_clip"; level.weaponClipModels[2] = "weapon_mp5_clip"; level.weaponClipModels[3] = "weapon_g3_clip"; level.weaponClipModels[4] = "weapon_ump45_clip"; level.weaponClipModels[5] = "weapon_m16_clip"; level.weaponClipModels[6] = "weapon_fn2000_clip"; level.weaponClipModels[7] = "weapon_kriss_clip"; level.weaponClipModels[8] = "weapon_rpd_clip"; level.weaponClipModels[9] = "weapon_ak74u_clip"; level.weaponClipModels[10] = "weapon_ak47_tactical_clip"; level.weaponClipModels[11] = "weapon_dragunov_clip"; level.weaponClipModels[12] = "weapon_saw_clip"; level.weaponClipModels[13] = "weapon_famas_clip"; maps\_c4::main(); maps\_drone_civilian::init(); maps\_attack_heli::preLoad(); //maps\_submarine_nuclear::main( "vehicle_submarine_nuclear" ); //maps\_submarine_sdv::main( "vehicle_submarine_sdv" ); maps\oilrig_precache::main(); maps\createart\oilrig_fog::main(); maps\oilrig_fx::main(); maps\createfx\oilrig_audio::main(); maps\_load::main(); //maps\_nightvision::main(); maps\_stinger::init(); maps\_slowmo_breach::slowmo_breach_init(); maps\oilrig_anim::main(); level thread maps\oilrig_amb::main(); maps\_slowmo_breach::add_breach_func( ::first_breach ); /*----------------------- FLAGS -------------------------*/ flag_init( "sdv_01_passing" ); flag_init( "oilrig_mission_failed" ); flag_init( "player_attached_to_sdv" ); flag_init( "difficulty_initialized" ); flag_init( "player_broke_stealth" ); flag_init( "heli_safezones_setup" ); flag_init( "intro_anim_sequence_starting" ); flag_init( "open_dds_door" ); flag_init( "sdv_02_at_end_of_path" ); flag_init( "sdv_01_at_end_of_path" ); flag_init( "player_is_surfacing" ); flag_init( "player_is_done_swimming" ); flag_init( "start_underwater_heli" ); //objectives flag_init( "obj_stealthkill_given" ); flag_init( "obj_stealthkill_complete" ); flag_init( "obj_hostages_secure_given" ); flag_init( "obj_hostages_secure_complete" ); flag_init( "obj_c4_ambush_plant_given" ); flag_init( "obj_c4_ambush_plant_complete" ); flag_init( "obj_ambush_given" ); flag_init( "obj_ambush_complete" ); flag_init( "obj_explosives_locate_given" ); flag_init( "obj_explosives_locate_complete" ); flag_init( "player_has_started_planting_c4" ); flag_init( "obj_escape_given" ); flag_init( "obj_escape_complete" ); //underwater flag_init( "player_approaching_oilrig_legs" ); flag_init( "player_breaks_surface" ); flag_init( "player_slitting_throat" ); //surface flag_init( "player_pulled_halfway_out_of_water" ); flag_init( "player_looking_at_gear_friendlies" ); flag_init( "enemy_lull_in_conversation" ); flag_init( "player_looking_at_grate_guard" ); flag_init( "start_surface_sequences" ); flag_init( "player_in_position_for_stealth_kill" ); flag_init( "player_performing_underwater_kill" ); flag_init( "player_ready_to_be_helped_from_water" ); flag_init( "player_looking_at_floating_body" ); flag_init( "player_starting_stealth_kill" ); flag_init( "player_done_being_helped_from_water" ); flag_init( "lower_decks_closed_off" ); //lower breach flag_init( "player_dealing_with_rail" ); flag_init( "player_looking_at_railing" ); flag_init( "railing_patroller_dead" ); flag_init( "lower_room_breached" ); flag_init( "start_nagging_to_go_to_deck1" ); flag_init( "heli_flyby_finished" ); //upper breach flag_init( "upper_room_breached" ); //ambush flag_init( "trig_prisoner_sequence_failsafe" ); flag_init( "friendlies_had_to_plant_C4" ); flag_init( "ambush_c4_triggered" ); flag_init( "ambush_enemies_spawned" ); flag_init( "ambush_enemies_alerted" ); flag_init( "ambush_enemies_alerted_prematurely" ); flag_init( "ambush_enemies_approaching" ); flag_init( "ambush_gate_opened" ); flag_init( "enemies_discovered_bodies" ); //helo //flag_init( "ambush_helo_approaching" ); //deck 2 flag_init( "deck_2_heli_is_finished_intimidating" ); flag_init( "player_shoots_or_aims_rocket_at_intimidating_heli" ); //deck3n flag_init( "zodiacs_evaced" ); //top deck flag_init( "need_to_check_axis_death" ); flag_init( "done_with_smoke_dialogue" ); flag_init( "heli_not_killed_in_time" ); flag_init( "smoke_thrown" ); flag_init( "stop_smoke" ); flag_init( "smoke_firefight" ); flag_init( "top_deck_room_breached" ); flag_init( "player_detonated_explosives" ); flag_init( "derrick_room_getting_breached" ); flag_init( "player_got_deck3_autosave" ); flag_init( "left_deck3_dudes_spawned" ); //escape flag_init( "player_on_board_littlebird" ); flag_init( "littlebird_escape_lifted_off" ); flag_init( "littlebird_escape_spawned" ); flag_init( "sub_comes_through_ice" ); flag_init( "littlebird_escape_moving" ); flag_init( "escape_littlebird_landed" ); battlechatter_off( "allies" ); battlechatter_off( "axis" ); /*----------------------- GLOBAL THREADS -------------------------*/ array_thread( getentarray( "redshirt_trigger", "targetname" ), ::redshirt_trigger_think ); array_thread( getentarray( "compassTriggers", "targetname" ), ::compass_triggers_think ); setSavedDvar( "r_specularColorScale", "1.4" ); thread init_air_vehicle_flags(); level.playerCQBSpeed = 0.8; level.playerWaterSpeed = 0.1; level.playerSpeed = level.playerCQBSpeed; level.player set_speed( level.playerCQBSpeed ); thread level_think(); thread init_difficulty(); disable_color_trigs(); thread hideAll(); fx_management(); heli_targetnames = []; heli_targetnames[ 0 ] = "heli_ambush"; heli_targetnames[ 1 ] = "heli_deck2"; heli_targetnames[ 2 ] = "heli_patrol_02"; thread vehicle_heli_setup( heli_targetnames ); createthreatbiasgroup( "player" ); createthreatbiasgroup( "ignored" ); createthreatbiasgroup( "oblivious" ); level.player setthreatbiasgroup( "player" ); setignoremegroup( "allies", "oblivious" ); // oblivious ignore allies setignoremegroup( "axis", "oblivious" ); // oblivious ignore axis setignoremegroup( "player", "oblivious" ); // oblivious ignore player setignoremegroup( "oblivious", "allies" ); // allies ignore oblivious setignoremegroup( "oblivious", "axis" ); // axis ignore oblivious setignoremegroup( "oblivious", "oblivious" ); // oblivious ignore oblivious /*----------------------- SPAWNER THREADS -------------------------*/ array_thread( getentarray( "hostiles_ambush", "targetname" ), ::add_spawn_function, ::ambush_patroller_think ); //array_thread( getentarray( "seeker", "script_noteworthy" ), ::add_spawn_function, ::ai_seekers_think ); array_thread( getentarray( "patroller", "script_noteworthy" ), ::add_spawn_function, ::ai_patroller_think ); array_thread( getentarray( "rappel", "script_noteworthy" ), ::add_spawn_function, ::ai_rappel_think ); array_thread( getentarray( "army", "script_noteworthy" ), ::add_spawn_function, ::AI_army_think ); array_spawn_function_noteworthy( "turret_guys", ::AI_turret_guys_think ); array_spawn_function_noteworthy( "left_deck3_dudes", ::AI_left_deck3_dudes_think ); array_thread( getvehiclenodearray( "plane_sound", "script_noteworthy" ), maps\_mig29::plane_sound_node ); thread player_death(); if ( is_specialop() ) { DDS = getentarray( "sub_dds_01", "targetname" ); DoorDDS = getentarray( "dds_door_01", "targetname" ); array_thread( DDS,::hide_entity ); array_thread( DoorDDS,::hide_entity ); DDS = getentarray( "sub_dds_02", "targetname" ); DoorDDS = getentarray( "dds_door_02", "targetname" ); array_thread( DDS,::hide_entity ); array_thread( DoorDDS,::hide_entity ); } } player_death() { level.player waittill( "death", attacker ); if ( ( isdefined( attacker ) ) && ( attacker.code_classname == "misc_turret" ) ) { if ( isSubStr( attacker.model, "little_bird" ) ) { level notify( "new_quote_string" ); setDvar( "ui_deadquote", &"OILRIG_MISSIONFAIL_HELI_DEATH" ); } } } /**************************************************************************** START FUNCTIONS ****************************************************************************/ start_default() { //AA_intro_init(); //start_debug(); start_underwater(); //start_surface(); //start_rig(); //start_deck1(); //start_heli(); //start_deck2(); //start_deck3(); //start_escape(); } start_debug() { thread above_water_art_and_ambient_setup(); initFriendlies( "Rig" ); thread maps\_slowmo_breach::delete_breach( 0 ); thread maps\_slowmo_breach::delete_breach( 1 ); thread maps\_slowmo_breach::delete_breach( 2 ); thread maps\_slowmo_breach::delete_breach( 3 ); thread maps\_slowmo_breach::delete_breach( 4 ); thread maps\_slowmo_breach::delete_breach( 5 ); thread open_gate( true ); level.player set_speed( 1 ); eNodeIntro = getent( "org_stealth_kill", "targetname" ); eSDV_02 = SDV_spawn( "02", eNodeIntro ); eSDV_02.origin = level.player.origin + ( 0, 0, 100 ); eSDV_02 thread maps\oilrig_fx::sdv02_fx(); wait( 3 ); eNodeIntro anim_first_frame_solo( eSDV_02, "intro_sequence" ); } start_underwater() { AA_intro_init(); } start_surface() { flag_init( "sdv_01_arriving" ); flag_set( "sdv_01_arriving" ); killtrigger_ocean_off(); flag_set( "player_is_done_swimming" ); flag_set( "player_breaks_surface" ); eNode = getent( "org_stealth_kill", "targetname" ); grate_enemies_setup(); //spawn the guards that will get killed level.player setorigin( eNode.origin + ( 0, -65, 0 ) ); level.player setplayerangles( eNode.angles ); level.player disableweapons(); thread player_breaks_surface(); thread start_surface_notifies(); wait( 0.05 ); underwater_friendly_setup(); thread AA_surface_init(); } start_surface_notifies() { wait( 1 ); i = 0; aArray = array_merge( level.sdvSquad01, level.sdvSquad02 ); while ( 1 < 100 ) { wait( 0.05 ); foreach ( guy in aArray ) guy notify( "finished_swim_animation" ); i++; } } start_rig( bDontSpawnFriendlies ) { initFriendlies( "Rig", bDontSpawnFriendlies ); thread music_surface_to_first_breach(); flag_set( "player_slitting_throat" ); flag_set( "player_ready_to_be_helped_from_water" ); thread AA_rig_init(); thread killtrigger_ocean_on(); } start_deck1() { thread killtrigger_ocean_on(); thread above_water_art_and_ambient_setup(); triggersEnable( "colornodes_deck1", "script_noteworthy", true ); initFriendlies( "Deck1" ); thread AA_deck1_init(); door_deck1 = getent( "door_deck1", "targetname" ); door_deck1 open_door_deck1(); door_deck1_opposite = getent( "door_deck1_opposite", "targetname" ); door_deck1_opposite open_door_deck1_opposite(); MusicPlayWrapper( "oilrig_suspense_01_music_alt" ); flag_set( "player_ready_to_be_helped_from_water" ); flag_set( "obj_hostages_secure_given" ); flag_set( "player_at_lower_breach" ); flag_set( "railing_patroller_dead" ); flag_set( "lower_room_breached" ); flag_set( "lower_room_cleared" ); thread obj_hostages_secure(); } start_heli() { thread killtrigger_ocean_on(); thread above_water_art_and_ambient_setup(); initFriendlies( "Heli" ); thread maps\_slowmo_breach::delete_breach( 0 ); thread maps\_slowmo_breach::delete_breach( 1 ); thread maps\_slowmo_breach::delete_breach( 2 ); thread maps\_slowmo_breach::delete_breach( 3 ); thread open_gate( true ); MusicPlayWrapper( "oilrig_fight_music_01" ); thread AA_heli_init(); level.player set_speed( 1 ); battlechatter_on( "axis" ); battlechatter_on( "allies" ); flag_set( "player_ready_to_be_helped_from_water" ); } start_deck2() { thread killtrigger_ocean_on(); //flag_set( "heli_ambush_shot_down" ); flag_set( "player_at_stairs_to_deck_2" ); flag_set( "player_approaching_deck_2" ); triggersEnable( "colornodes_deck2", "script_noteworthy", true ); thread above_water_art_and_ambient_setup(); initFriendlies( "Deck2" ); thread AA_deck2_init(); level.player set_speed( 1 ); battlechatter_on( "axis" ); battlechatter_on( "allies" ); flag_set( "player_ready_to_be_helped_from_water" ); } start_deck3() { thread killtrigger_ocean_on(); flag_set( "player_at_stairs_to_top_deck" ); thread above_water_art_and_ambient_setup(); initFriendlies( "Deck3" ); thread AA_deck3_init(); level.player set_speed( 1 ); battlechatter_on( "axis" ); battlechatter_on( "allies" ); flag_set( "player_ready_to_be_helped_from_water" ); flag_set( "obj_explosives_locate_given" ); thread obj_explosives_locate(); } start_escape() { thread maps\_slowmo_breach::delete_breach( 0 ); thread maps\_slowmo_breach::delete_breach( 1 ); thread maps\_slowmo_breach::delete_breach( 2 ); thread maps\_slowmo_breach::delete_breach( 3 ); thread maps\_slowmo_breach::delete_breach( 4 ); thread maps\_slowmo_breach::delete_breach( 5 ); thread open_gate( true ); thread killtrigger_ocean_on(); thread above_water_art_and_ambient_setup(); initFriendlies( "Escape" ); flag_set( "barracks_cleared" ); level.player set_speed( 1 ); thread AA_escape_init(); flag_set( "player_ready_to_be_helped_from_water" ); thread c4_barrels(); wait( .5 ); level notify( "A door in breach group 300 has been activated." ); } above_water_art_and_ambient_setup() { Ambientstop(); thread maps\_utility::set_ambient( "ambient_oilrig_test_ext1" ); thread vision_set_fog_changes( "oilrig_exterior_deck0", 0 ); /* DOF disabled because of fx issues level.dofDefault[ "nearStart" ] = 1; level.dofDefault[ "nearEnd" ] = 1; level.dofDefault[ "farStart" ] = 500; level.dofDefault[ "farEnd" ] = 500; level.dofDefault[ "nearBlur" ] = 4.5; level.dofDefault[ "farBlur" ] = .05; level.player maps\_art::setDefaultDepthOfField(); */ //emitters //eNodeIntro thread play_loop_sound_on_entity( "drips_under_grate_loop" ); } below_water_art_and_ambient_setup( bUseRigApproachFog ) { Ambientstop(); thread maps\_utility::set_ambient( "amb_underwater_test1v1" ); if ( isdefined( bUseRigApproachFog ) ) { vision_set_fog_changes( "oilrig_underwater", 0 ); thread underwater_fog_approaching_rig( 0 ); } else { thread vision_set_fog_changes( "oilrig_underwater", 0 ); } /* DOF disabled because of fx issues level.dofDefault[ "nearStart" ] = 0; level.dofDefault[ "nearEnd" ] = 31; level.dofDefault[ "farStart" ] = 154; level.dofDefault[ "farEnd" ] = 2100; level.dofDefault[ "nearBlur" ] = 5; level.dofDefault[ "farBlur" ] = 5; level.player maps\_art::setDefaultDepthOfField(); */ } /**************************************************************************** UNDERWATER INTRO ****************************************************************************/ AA_intro_init() { enableforcedsunshadows(); thread maps\_utility::set_ambient( "amb_underwater_test1v1" ); //thread underwater_slowview(); level.underwater = true; killtrigger_ocean_off(); //thread heli_patrol(); thread underwater_friendly_setup(); thread music_underwater(); thread underwater_sequence(); thread dialogue_underwater(); thread grate_enemies_setup(); thread player_breaks_surface(); flag_wait( "start_surface_sequences" ); thread AA_surface_init(); } underwater_sequence() { //thread maps\_utility::set_ambient( "amb_underwater_test1v1" ); thread underwater_set_culldist( 0, 20000 ); underwater_box = getent( "underwater_box", "targetname" ); underwater_box show(); eNodeIntro = getent( "org_stealth_kill", "targetname" ); assert( isdefined( eNodeIntro ) ); //wait(.5); //SetSavedDvar( "hud_gasMaskOverlay", 1 ); black_overlay = create_client_overlay( "black", 1 ); black_overlay.sort = 1000; black_overlay.foreground = false; //thread maps\_utility::set_ambient( "amb_underwater_test1v1" ); /*----------------------- UNDERWATER FOG/VISON/FX -------------------------*/ thread underwater_hud_enable( true ); thread enablePlayerWeapons( false ); below_water_art_and_ambient_setup(); /*----------------------- SETUP SUBS & SDVS -------------------------*/ eSub_01 = submarine_spawn( "01", eNodeIntro ); eSub_02 = submarine_spawn( "02", eNodeIntro ); eSub_02 thread submarine_rumble(); eSDV_01 = SDV_spawn( "01", eNodeIntro ); eSDV_02 = SDV_spawn( "02", eNodeIntro ); eSub_01 thread maps\oilrig_fx::submarine01_fx(); eSub_02 thread maps\oilrig_fx::submarine02_fx(); eSDV_01 thread maps\oilrig_fx::sdv01_fx(); eSDV_02 thread maps\oilrig_fx::sdv02_fx(); // eSDV_01 thread maps\oilrig_fx:: underwater_ambient_fx(); aIntroVehicles = []; aIntroVehicles[ 0 ] = eSub_01; aIntroVehicles[ 1 ] = eSub_02; aIntroVehicles[ 2 ] = eSDV_01; aIntroVehicles[ 3 ] = eSDV_02; eNodeIntro anim_first_frame( aIntroVehicles, "intro_sequence" ); wait( 1 ); /*----------------------- SETUP PLAYER -------------------------*/ level.player thread player_sdv_think( eSDV_01, eNodeIntro ); /*----------------------- SETUP FRIENDLIES -------------------------*/ wait( .5 ); array_thread( level.sdvSquad01, ::friendly_sdv_think, eSDV_01, eNodeIntro ); array_thread( level.sdvSquad02, ::friendly_sdv_think, eSDV_02, eNodeIntro ); wait( 1 ); /*----------------------- DISABLE ALL FX IN TOP AND MID DECKS -------------------------*/ array_thread( level.effects_mid_decks, ::pauseEffect ); array_thread( level.effects_top_deck, ::pauseEffect ); /*----------------------- DOOR OPENS -------------------------*/ flag_wait( "player_attached_to_sdv" ); array_thread( level.players, ::player_scuba); flag_wait( "open_dds_door" ); black_overlay fadeOverTime( 5 ); black_overlay.alpha = 0; eSub_01.DoorDDS unlink(); eSub_01.DoorDDS dds_door_open(); wait( 1 ); level.player PlayRumbleOnEntity( "light_3s" ); wait( 3.5 ); /*----------------------- ALL ACTORS START MOVING -------------------------*/ flag_set( "intro_anim_sequence_starting" ); eNodeIntro anim_single( aIntroVehicles, "intro_sequence" ); flag_wait( "sdv_01_passing" ); /*----------------------- TRANSITION TO THICKER FOG -------------------------*/ //cherub wants to transition to a thicker fog after you pass the USS Dallas thread underwater_fog_approaching_rig( 5 ); //thread underwater_set_culldist( 10, 10000 ); //eSub_01.DDS.water delete(); /*----------------------- PLAYER SWIMMING UP -------------------------*/ flag_wait( "sdv_01_arriving" ); thread underwater_set_culldist( 3, 3000 ); /*----------------------- PLAYER BEING HELPED OUT -------------------------*/ flag_wait( "player_ready_to_be_helped_from_water" ); thread underwater_set_culldist( 0, 0 ); eSub_01.body delete(); eSub_01.prop delete(); eSub_01.DDS delete(); eSub_01.DoorDDS delete(); eSub_01.DoorDDS.eDoorSeal delete(); foreach( part in eSub_01.aDDSparts ) part delete(); eSub_01 delete(); eSub_02.body delete(); eSub_02.prop delete(); eSub_02.DDS delete(); eSub_02.DoorDDS delete(); eSub_02 delete(); eSDV_01 delete(); eSDV_02 delete(); underwater_box hide(); iceberg = getent( "iceberg", "targetname" ); iceberg hide(); } underwater_slowview() { level endon( "player_breaks_surface" ); while( !flag( "player_breaks_surface" ) ) { level.player shellshock( "slowview", .1 ); wait( .1 ); } } underwater_friendly_setup() { /*----------------------- SETUP RIG FRIENDLIES AND HIDE THEM -------------------------*/ initFriendlies( "Rig", false, true ); array_call( level.friendlies, ::hide ); /*----------------------- SETUP SUBMARINE FRIENDLIES -------------------------*/ level.sdvSquad01 = []; level.sdvSquad01[ 0 ] = spawn_script_noteworthy( "sdv01_pilot" ); level.sdvSquad01[ 0 ].animname = "sdv01_pilot"; level.sdvSquad01[ 1 ] = spawn_script_noteworthy( "sdv01_copilot" ); level.sdvSquad01[ 1 ].animname = "sdv01_copilot"; level.sdvSquad01[ 2 ] = spawn_script_noteworthy( "sdv01_swimmer1" ); level.sdvSquad01[ 2 ].animname = "sdv01_swimmer1"; level.sdvSquad02 = []; level.sdvSquad02[ 0 ] = spawn_script_noteworthy( "sdv02_pilot" ); level.sdvSquad02[ 0 ].animname = "sdv02_pilot"; level.sdvSquad02[ 1 ] = spawn_script_noteworthy( "sdv02_copilot" ); level.sdvSquad02[ 1 ].animname = "sdv02_copilot"; level.sdvSquad02[ 2 ] = spawn_script_noteworthy( "sdv02_swimmer1" ); level.sdvSquad02[ 2 ].animname = "sdv02_swimmer1"; level.sdvSquad02[ 3 ] = spawn_script_noteworthy( "sdv02_swimmer2" ); level.sdvSquad02[ 3 ].animname = "sdv02_swimmer2"; array_thread( level.sdvSquad02, maps\_underwater::friendly_bubbles ); array_thread( level.sdvSquad01, maps\_underwater::friendly_bubbles ); flag_wait( "sdv_01_arriving" ); wait( 5 ); level.sdvSquad02[ 0 ] maps\_underwater::friendly_bubbles_stop(); flag_wait( "player_breaks_surface" ); array_thread( level.sdvSquad02, maps\_underwater::friendly_bubbles_stop ); array_thread( level.sdvSquad01, maps\_underwater::friendly_bubbles_stop ); } grate_enemies_setup() { //create a dupe node since we will be stopping idles early on this one eNodeIntro = getent( "org_stealth_kill", "targetname" ); level.eNodeIntroDuplicate = spawn( "script_origin", eNodeIntro.origin ); level.eNodeIntroDuplicate.origin = eNodeIntro.origin; level.eNodeIntroDuplicate.angles = eNodeIntro.angles; level.hostile_stealthkill_player = spawn_targetname( "hostile_stealthkill_player" ); level.hostile_stealthkill_friendly = spawn_targetname( "hostile_stealthkill_friendly" ); level.hostile_stealthkill_player.animname = "hostile_stealthkill_player"; level.hostile_stealthkill_friendly.animname = "hostile_stealthkill_friendly"; level.hostile_stealthkill_player thread grate_enemies_wait_to_be_killed(); level.hostile_stealthkill_friendly thread grate_enemies_wait_to_be_killed(); level.eNodeIntroDuplicate thread delete_on_flag( "lower_room_breached" ); } delete_on_flag( flag ) { self endon( "death" ); flag_wait( flag ); if( isdefined( self ) ) self delete(); } grate_enemies_wait_to_be_killed() { self.ignoreme = true; level.eNodeIntroDuplicate thread anim_loop_solo( self, "grate_idle", "stop_idle" ); } heli_patrol() { flag_wait( "start_underwater_heli" ); flag_wait( "sdv_02_arriving" ); eHeli = spawn_vehicle_from_targetname( "heli_patrol_01" ); eHeli thread heli_patrol_think(); thread maps\_vehicle::gopath( eHeli ); eHeli waittill( "reached_dynamic_path_end" ); eHeli delete(); } DDS_water_rise() { wait( 1 ); movetime = 10; moveDist = 20; self moveTo( self.origin + ( 0, 0, moveDist ), movetime, 1, 1 ); wait( movetime ); self delete(); } submarine_rumble() { self endon( "death" ); org = spawn( "script_origin", self.origin + ( 0, -900, -1800 ) ); org linkto( self ); while( !flag( "player_ready_to_be_helped_from_water" ) ) { org PlayRumbleOnEntity( "mig_rumble" ); wait( .4 ); } org delete(); } dialogue_underwater() { wait( 8 ); //"Sub Command: USS Indiana actual to drydock shelter. We have a go." radio_dialogue( "oilrig_sbc_drydock" ); wait( 2 ); //"Sub Officer: DDS hangar flooded. Full pressure." radio_dialogue( "oilrig_sbo_fullpressure" ); //"Sub Command: Begin deployment." radio_dialogue( "oilrig_sbc_deployment" ); flag_set( "open_dds_door" ); wait( 10 ); //"Sub Officer: Team one SDV is away." radio_dialogue( "oilrig_sbo_tm1away" ); wait( 5 ); //"Sub Officer: Hotel-Six bearing zero-one-niner." radio_dialogue( "oilrig_sbo_zerooneniner" ); //level.player playlocalsound( "submarine_driveby" ); flag_wait( "sdv_01_passing" ); //wait( 8 ); //"Sub Command: USS Dallas deploying team two. RV at the objective." radio_dialogue( "oilrig_sbc_ussdallas" ); wait( 3 ); flag_set( "player_approaching_oilrig_legs" ); flag_set( "start_underwater_heli" ); wait( 3 ); //"Sub Officer: Hotel-Six depth 20 meters." radio_dialogue( "oilrig_sbo_depth20" ); flag_wait( "sdv_02_arriving" ); flag_set( "start_surface_sequences" ); //wait( 12 ); //"Sub Command: Team two at the objective." radio_dialogue( "oilrig_sbc_tm2objective" ); wait( 3 ); //***Command The sooner we get the hostages, the sooner we can send reinforcements to take care of the SAM sites, over." oilrig_sbc_sooner Friendly breaching dialogue (all radio headset) //radio_dialogue( "oilrig_sbc_sooner" ); thread maps\_introscreen::oilrig_intro2(); flag_wait( "sdv_01_stopping" ); wait( 5 ); } player_sdv_think( eSDV, eNodeIntro ) { level.player disableweapons(); level.player allowcrouch( false ); level.player allowprone( false ); level.player allowsprint( false ); level.player allowjump( false ); /*----------------------- WORLDMODEL RIGS FOR PLAYER ANIMS -------------------------*/ ePlayer_rig = spawn_anim_model( "player_rig" ); ePlayer_rig thread underwater_player_flags(); eSDV anim_first_frame_solo( ePlayer_rig, "underwater_player_start", "origin_animate_jnt" ); ePlayer_rig linkto( eSDV, "origin_animate_jnt" ); /*----------------------- ATTACH PLAYER TO SUB -------------------------*/ //level.player setorigin( eSDV.origin ); //level.player setplayerangles( eSDV.angles ); level.player setorigin( ePlayer_rig gettagorigin( "tag_player" ) ); level.player setplayerangles( ePlayer_rig gettagangles( "tag_player" ) ); wait( 1 ); //player, tag, lerptime, fraction, right_arc, left_arc, top_arc, bottom_arc ) //ePlayer_rig lerp_player_view_to_tag_oldstyle( self, "tag_player", 0.5, 1, 55, 43, 5, 20 ); //ePlayer_rig lerp_player_view_to_tag( self, "tag_player", 0.5, 1, 40, 45, 5, 30 ); level.player PlayerLinkToDelta( ePlayer_rig, "tag_player", 1, 55, 43, 5, 20, true ); flag_set( "player_attached_to_sdv" ); /*----------------------- PLAYER ANIMATES -------------------------*/ flag_wait( "intro_anim_sequence_starting" ); eSDV thread anim_single_solo( ePlayer_rig, "underwater_player_start", "origin_animate_jnt" ); /*----------------------- PLAYER SWIMMING UP -------------------------*/ flag_wait( "sdv_01_arriving" ); wait( 4 ); //ePlayer_rig lerp_player_view_to_tag_oldstyle( self, "tag_player", 3, 1, 30, 30, 10, 40 ); //thread maps\createart\oilrig_underwater_art::underwater_to_surface_fog(); /*-----------------------self endon( "death" ); PLAYER BREAKS SURFACE -------------------------*/ //flag_wait( "player_is_surfacing" ); wait( 15.5 ); flag_set( "player_breaks_surface" ); ePlayer_rig hide(); flag_wait( "player_is_done_swimming" ); ePlayer_rig delete(); } player_breaks_surface() { eNodeIntro = getent( "org_stealth_kill", "targetname" ); assert( isdefined( eNodeIntro ) ); grate_blocker = getent( "grate_blocker", "targetname" ); assert( isdefined( grate_blocker ) ); grate_blocker hide(); grate_blocker notsolid(); /*----------------------- STOP SCUBA, CHANGE VISION -------------------------*/ flag_wait( "player_breaks_surface" ); array_thread( level.players, ::stop_player_scuba ); level.player StopSounds(); thread above_water_art_and_ambient_setup(); level.player thread play_sound_on_entity( "surface_breathe" ); thread play_sound_in_space( "player_break_surface", level.player.origin ); thread player_surface_blur(); /*----------------------- PLAYER REGAINS CONTROL -------------------------*/ //flag_wait( "player_is_done_swimming" ); thread water_bob(); //level.player unlink(); } water_bob() { //wait( 2 ); //create bobbing origin org_water_level = getent( "org_water_level", "targetname" ); org_water_level.origin = org_water_level.origin + ( 0, 0, 0 ); org_view_bob = spawn( "script_origin", ( 0, 0, 0 ) ); //org_view_bob.origin = ( level.player.origin[ 0 ], level.player.origin[ 1 ], org_water_level.origin[ 2 ] ); org_view_bob.origin = level.player.origin + ( 0, 0, 10 ); org_view_bob.angles = org_water_level.angles; waterMoveModel = spawn( "script_model", org_view_bob.origin ); waterMoveModel setmodel( "tag_origin" ); waterMoveModel.origin = org_view_bob.origin; waterMoveModel.angles = org_view_bob.angles; org_view_bob thread view_bob(); org_view_bob thread view_rotate(); waterMoveModel thread water_movement( org_view_bob ); //waterMoveModel linkTo( org_view_bob ); timer = 1; //flag_wait( "player_is_done_swimming" ); zOffset = 9; waterMoveModel.origin = level.player.origin + ( 0, 0, zOffset); org_view_bob.origin = level.player.origin + ( 0, 0, zOffset); //lerp_player_view_to_tag_oldstyle( player, tag, lerptime, fraction, right_arc, left_arc, top_arc, bottom_arc ) waterMoveModel lerp_player_view_to_tag_oldstyle( level.player, "tag_origin", timer, 1, 90, 90, 50, 4 ); //level.player PlayerLinkToBlend( waterMoveModel, "tag_origin", timer, timer * 0.2, timer * 0.2 ); delaythread( 0, ::open_up_player_fov, waterMoveModel, "tag_origin" ); } open_up_player_fov( view_arms, tag ) { level.player PlayerLinkToDelta( view_arms, tag, 0.0, 90, 90, 50, 4, true ); //( , , , , , , , ) } view_bob() { //SELF ==> the bobbing script origin used for reference self endon( "death" ); movetime = 2.4; moveDist = 3.2; self moveTo( self.origin + ( 0, 0, moveDist/2 ), movetime, 1, 1 ); wait( movetime ); while( isdefined( self ) ) { self moveTo( self.origin + ( 0, 0, moveDist * ( -1 ) ), movetime, 1, 1 ); wait( movetime ); self moveTo( self.origin + ( 0, 0, moveDist ), movetime, 1, 1 ); wait( movetime ); } } view_rotate() { //SELF ==> the bobbing script origin used for reference self endon( "death" ); rotaterollangle = 4; rotateTime = 6; self rotateRoll( rotaterollangle/2, rotateTime, rotateTime/2, rotateTime/2 ); wait( rotateTime ); while( isdefined( self ) ) { self rotateRoll( rotaterollangle * ( - 1 ), rotateTime, rotateTime/2, rotateTime/2 ); wait( rotateTime ); self rotateRoll( rotaterollangle, rotateTime, rotateTime/2, rotateTime/2 ); wait( rotateTime ); } } water_movement( org_view_bob ) { //SELF ==> The model the player is attached to moveRate = 1; updateTime = 0.05; org_grate_top_left = getent( "org_grate_top_left", "targetname" ); org_grate_bot_right = getent( "org_grate_bot_right", "targetname" ); maxValueX = org_grate_top_left.origin[ 0 ] ; maxValueY = org_grate_bot_right.origin[ 1 ] ; minValueX = org_grate_bot_right.origin[ 0 ] ; minValueY = org_grate_top_left.origin[ 1 ] ; valueX = undefined; valueY = undefined; valueZ = undefined; //Get the player's normalized movement vector. Returns [-1,1] for X(forward) and Y(right) based on player's input. //getnormalizedMovement - add this value times the dvar "moverate" or something while( !flag( "player_ready_to_be_helped_from_water" ) ) { wait( updateTime ); movement = level.player GetNormalizedMovement(); //iprintlnbold( movement[ 0 ] + " : " + movement[ 1 ] ); forward = anglesToForward( level.player.angles ); right = anglesToRight( level.player.angles ); forward *= movement[ 0 ] * moveRate; right *= movement[ 1 ] * moveRate; newLocation = self.origin + forward + right; newLocation = ( newLocation[ 0 ], newLocation[ 1 ], org_view_bob.origin[ 2 ] ); valueX = cap_value( newLocation[ 0 ], minValueX, maxValueX ); valueY = cap_value( newLocation[ 1 ], minValueY, maxValueY ); valueZ = org_view_bob.origin[ 2 ]; newLocation = ( valueX, valueY, valueZ ); self.angles = ( level.player.angles[ 0 ], level.player.angles[ 1 ], org_view_bob.angles[ 2 ] ); self moveto( newLocation, updateTime, 0, 0 ); } if ( isdefined( org_view_bob ) ) org_view_bob delete(); if ( isdefined( self ) ) self delete(); } underwater_player_flags() { /*----------------------- PLAYER BREAKS SURFACE -------------------------*/ //self waittillmatch( "single anim", "surface" ); //flag_set( "player_is_surfacing" ); /*----------------------- PLAYER ENDS SWIMMING -------------------------*/ self waittillmatch( "single anim", "end" ); flag_set( "player_is_done_swimming" ); } friendly_sdv_think( eSDV, eNodeIntro ) { eSDV anim_first_frame_solo( self, "sdv_ride_in", "origin_animate_jnt" ); self linkto( eSDV, "origin_animate_jnt" ); flag_wait( "intro_anim_sequence_starting" ); /*----------------------- FRIENDLY RIDE-IN AND SWIM TO SURFACE -------------------------*/ eSDV thread anim_single_solo( self, "sdv_ride_in", "origin_animate_jnt" ); self waittillmatch( "single anim", "end" ); self notify( "finished_swim_animation" ); } /**************************************************************************** SURFACE START ****************************************************************************/ AA_surface_init() { thread dialogue_stealth_kill(); thread obj_stealthkill(); thread music_surface_to_first_breach(); thread enemy_dialogue(); thread water_monitor(); thread friendly_gear_takeoff(); level.player thread player_grate_sequence_think(); array_thread( level.sdvSquad01,:: friendly_surface_think ); array_thread( level.sdvSquad02,:: friendly_surface_think ); thread friendlies_help_player_from_water(); thread show_friendlies_out_of_water(); thread grate_enemy_setup(); flag_wait( "obj_stealthkill_complete" ); thread AA_rig_init(); } water_monitor() { level endon( "obj_stealthkill_complete" ); org_water_level = getent( "org_water_level", "targetname" ); assert( isdefined( org_water_level ) ); water_level = org_water_level.origin[2]; flag_wait( "player_starting_stealth_kill" ); thread water_vision_management(); while( true ) { wait( 0.05 ); playerEye = level.player getEye(); if ( playerEye[ 2 ] < water_level ) level notify( "player_is_below_water" ); else level notify( "player_is_above_water" ); } } water_vision_management() { level endon( "obj_stealthkill_complete" ); while( true ) { level waittill( "player_is_below_water" ); below_water_art_and_ambient_setup( true ); //thread player_surface_blur(); level waittill( "player_is_above_water" ); above_water_art_and_ambient_setup(); thread player_surface_blur(); } } player_surface_blur() { level.player thread play_sound_in_space( "splash_player_water_exit" ); thread water_streaks(); SetBlur( 3, .1 ); wait 0.25; SetBlur( 0, .5 ); } water_streaks() { level.player SetWaterSheeting( 1, 3.0 ); } friendlies_help_player_from_water() { eNodeIntro = getent( "org_stealth_kill", "targetname" ); assert( isdefined( eNodeIntro ) ); aWaterHelpers = []; aWaterHelpers[ 0 ] = get_AI_with_script_noteworthy( "allies", "water_helper_01" ); aWaterHelpers[ 1 ] = get_AI_with_script_noteworthy( "allies", "water_helper_02" ); aWaterHelpers[ 0 ].animname = "water_helper_01"; aWaterHelpers[ 1 ].animname = "water_helper_02"; eNodeIntro anim_first_frame( aWaterHelpers, "surface_helpout" ); flag_wait( "player_ready_to_be_helped_from_water" ); eNodeIntro anim_single( aWaterHelpers, "surface_helpout" ); flag_wait( "lower_room_breached" ); array_thread( aWaterHelpers,::AI_delete ); } show_friendlies_out_of_water() { flag_wait( "player_looking_at_floating_body" ); array_call( level.friendlies, ::show ); } enemy_dialogue() { level endon( "player_starting_stealth_kill" ); flag_wait( "player_breaks_surface" ); //ENEMY COMMAND (German radio): Team one patroling the perimeter. We've got two on the lower deck. //level.hostile_stealthkill_friendly play_sound_in_space( "oilrig_enc_lowerdeck" ); //ENEMY COMMAND (German radio): Switch patrols at 08:00. Teams three, five and seven will return to the crew quarters on deck 3. //level.hostile_stealthkill_friendly play_sound_in_space( "oilrig_enc_switchpatrols" ); //MERC 1 (in German): Those unfiltered pieces of shit will kill you. level.hostile_stealthkill_friendly dialogue_execute( "oilrig_mrc1_killyou" ); flag_set_delayed( "enemy_lull_in_conversation", 1 ); wait( .75 ); //MERC 1 (in German): Alright, give me one. level.hostile_stealthkill_friendly thread dialogue_execute( "oilrig_mrc1_givemeone" ); wait( 1.5 ); //MERC 2 (in German): Fuck off. level.hostile_stealthkill_player dialogue_execute( "oilrig_mrc2_foff" ); flag_wait( "obj_stealthkill_given" ); wait( .4 ); //MERC 1 (in German): This sea air makes me sick. Prefered the last job. Private security in a limo all day. level.hostile_stealthkill_friendly dialogue_execute( "oilrig_mrc1_limoallday" ); //MERC 2 (in German): You complain too much. level.hostile_stealthkill_player dialogue_execute( "oilrig_mrc2_complain" ); //MERC 1 (in German): yeah, well, not as much as the Italians. Who hired those lazy fucks anyways? Did you see that one guy the other day? Didn't even know how to clean his gun. level.hostile_stealthkill_friendly dialogue_execute( "oilrig_mrc1_theitalians" ); //MERC 1 (in German): Yeah, too much spent on gear but no clue how to use it. level.hostile_stealthkill_player dialogue_execute( "oilrig_mrc2_noclue" ); //You know what they call a cheesburger in Russian? //level.hostile_stealthkill_friendly dialogue_execute( "oilrig_mrc1_cheeseburger" ); //You've got to be kidding me. You think this is a Tarantino movie or something? //level.hostile_stealthkill_player dialogue_execute( "oilrig_mrc2_tarantino" ); //(laughs) Alright, well at least the Russians pay well. I was hesitant to take the job till I saw the bottom line. I don't know where their financing comes from, but I don't really care either. Still...they're pretty damn secretive. //level.hostile_stealthkill_friendly dialogue_execute( "oilrig_mrc1_paywell" ); //As long as I get paid, I could care less. They can be as secretive as they like. It's none of my business what their politics are. //level.hostile_stealthkill_player dialogue_execute( "oilrig_mrc2_careless" ); //(YAWNS) How much longer until the patrol changes. I've gotta take a piss. //level.hostile_stealthkill_friendly dialogue_execute( "oilrig_mrc1_patrolchange" ); } grate_enemy_setup() { level.hostile_stealthkill_player thread grate_enemy_think(); level.hostile_stealthkill_friendly thread grate_enemy_think(); } grate_enemy_think() { flag_wait( "player_starting_stealth_kill" ); self waittillmatch( "single anim", "grab" ); self stopSounds(); wait( 0.05 ); if ( self.animname == "hostile_stealthkill_player" ) self thread play_sound_on_entity( "grate_enemy_grabbed_grunt_01" ); else self thread play_sound_on_entity( "grate_enemy_grabbed_grunt_02" ); self waittillmatch( "single anim", "end" ); self delete(); } dialogue_stealth_kill() { flag_wait( "player_is_done_swimming" ); flag_wait( "enemy_lull_in_conversation" ); dialogue_random_gratekill(); flag_set( "obj_stealthkill_given" ); } player_grate_sequence_think() { org_water_exit = getent( "org_water_exit", "targetname" ); assert( isdefined( org_water_exit ) ); org_water_exit.origin = org_water_exit.origin + ( 0, 0, 10 ); eNodeIntro = getent( "org_stealth_kill", "targetname" ); assert( isdefined( eNodeIntro ) ); flag_wait( "player_is_done_swimming" ); //SetDvar( "old_compass", "1" ); SetSavedDvar( "compass", "1" ); /*----------------------- PLAYER REGAINS CONTROL -------------------------*/ level.player set_speed( level.playerWaterSpeed ); /*------------------------- WORLDMODEL RIGS FOR PLAYER ANIMS -------------------------*/ ePlayer_rig = spawn_anim_model( "player_rig" ); ePlayer_rig thread player_kill_fx(); ePlayer_rig hide(); eNodeIntro anim_first_frame_solo( ePlayer_rig, "player_stealth_kill" ); /*----------------------- MAKE GUARD USABLE -------------------------*/ // level.hostile_stealthkill_player.useable = true; // level.hostile_stealthkill_player SetCursorHint( "HINT_NOICON" ); // level.hostile_stealthkill_player sethintstring( &"SCRIPT_PLATFORM_OILRIG_HINT_STEALTH_KILL" ); // level.hostile_stealthkill_player waittill( "trigger" ); thread grate_enemy_hint(); thread player_looking_at_grate_guard_logic(); waittill_player_triggers_stealth_kill(); //SetDvar( "old_compass", "0" ); SetSavedDvar( "compass", "0" ); level.hostile_stealthkill_player.useable = false; /*----------------------- PLAYER DOES STEALTH KILL -------------------------*/ //ePlayer_rig show(); //ePlayer_rig lerp_player_view_to_tag_oldstyle( level.player, "tag_player", 0.5, 1, 0, 0, 0, 0 ); //player is starting kill anim...set flag to tell others to go too level.player PlayerLinkToBlend( ePlayer_rig, "tag_player", 1, 0, 0 ); //PlayerLinkToBlend( , ,