From 9f92cf912747a848fb09dd5b86126e54d3b086d9 Mon Sep 17 00:00:00 2001 From: JerryALT Date: Tue, 4 Jun 2024 18:23:56 +0300 Subject: [PATCH] [Mod FF]: Removed unused files --- iw3sp_mod_ff_src/raw/maps/killhouse.gsc | 2578 -------- iw3sp_mod_ff_src/raw/maps/killhouse_code.gsc | 2658 -------- .../raw/maps/village_assault_code.gsc | 2791 --------- iw3sp_mod_ff_src/raw/maps/village_defend.gsc | 5447 ----------------- .../raw/maps/village_defend_code.gsc | 1042 ---- 5 files changed, 14516 deletions(-) delete mode 100644 iw3sp_mod_ff_src/raw/maps/killhouse.gsc delete mode 100644 iw3sp_mod_ff_src/raw/maps/killhouse_code.gsc delete mode 100644 iw3sp_mod_ff_src/raw/maps/village_assault_code.gsc delete mode 100644 iw3sp_mod_ff_src/raw/maps/village_defend.gsc delete mode 100644 iw3sp_mod_ff_src/raw/maps/village_defend_code.gsc diff --git a/iw3sp_mod_ff_src/raw/maps/killhouse.gsc b/iw3sp_mod_ff_src/raw/maps/killhouse.gsc deleted file mode 100644 index 038fc6f..0000000 --- a/iw3sp_mod_ff_src/raw/maps/killhouse.gsc +++ /dev/null @@ -1,2578 +0,0 @@ -#include common_scripts\utility; -#include maps\_utility; -#include maps\_hud_util; -#include maps\_anim; -#include maps\killhouse_code; - -main() -{ - level.short_training = true; - - level.hip_fire_required = false; - level.firing_range_door_open = false; - if ( level.console ) - level.hint_text_size = 1.6; - else - level.hint_text_size = 1.2; - - level.targets_hit = 0; - set_console_status(); - - //setDvar ( "hud_fade_offhand", 6 ); - - //setsaveddvar ( "r_lodbias", -400 ); - - // add the starts before _load because _load handles starts now - if ( level.short_training ) - default_start( ::inside_start ); - else - default_start( ::look_training ); - //add_start( "look", ::look_training, &"STARTS_LOOK" ); - //add_start( "obj", ::navigationTraining, &"STARTS_OBJ" ); - add_start( "inside", ::inside_start, &"STARTS_INSIDE" ); - add_start( "shoot", ::rifle_start, &"STARTS_SHOOT" ); - add_start( "timed", ::rifle_timed_start, &"STARTS_TIMED" ); - add_start( "sidearm", ::sidearm_start, &"STARTS_SIDEARM" ); - //add_start( "frag", ::frag_start, &"STARTS_FRAG" ); - //add_start( "m203", ::launcher_start, &"STARTS_M203" ); - //add_start( "c4", ::explosives_start, &"STARTS_C4" ); - //add_start( "course", ::obstacle_start, &"STARTS_COURSE" ); - add_start( "ship", ::reveal_start, &"STARTS_SHIP" ); - add_start( "mp5", ::cargoship_start, &"STARTS_MP5" ); - //add_start( "deck", ::deck_start, &"STARTS_DECK1" ); - add_start( "debrief", ::debrief_start, &"STARTS_DEBRIEF" ); - - precacheShader( "objective" ); - precacheShader( "hud_icon_c4" ); - precacheShader( "hud_dpad" ); - precacheShader( "hud_arrow_right" ); - precacheShader( "hud_arrow_down" ); - precacheShader( "hud_icon_40mm_grenade" ); - precacheshader( "popmenu_bg" ); - precachestring( &"KILLHOUSE_HINT_CHECK_OBJECTIVES_PAUSED" ); - precachestring( &"KILLHOUSE_HINT_CHECK_OBJECTIVES_PAUSED" ); - precachestring( &"KILLHOUSE_HINT_OBJECTIVE_MARKER" ); - precachestring( &"KILLHOUSE_HINT_CHECK_OBJECTIVES_PAUSED" ); - precachestring( &"KILLHOUSE_HINT_CHECK_OBJECTIVES_SCORES" ); - precachestring( &"KILLHOUSE_HINT_CHECK_OBJECTIVES_SCORES_PS3" ); - precachestring( &"KILLHOUSE_HINT_OBJECTIVE_MARKER" ); - precachestring( &"KILLHOUSE_HINT_OBJECTIVE_REMINDER" ); - precachestring( &"KILLHOUSE_HINT_OBJECTIVE_REMINDER2" ); - precachestring( &"KILLHOUSE_HINT_ATTACK_PC" ); - precachestring( &"KILLHOUSE_HINT_ATTACK" ); - precachestring( &"KILLHOUSE_HINT_HIP_ATTACK_PC" ); - precachestring( &"KILLHOUSE_HINT_HIP_ATTACK" ); - precachestring( &"KILLHOUSE_HINT_ADS_360" ); - precachestring( &"KILLHOUSE_HINT_ADS" ); - precachestring( &"KILLHOUSE_HINT_ADS_TOGGLE" ); - precachestring( &"KILLHOUSE_HINT_ADS_THROW_360" ); - precachestring( &"KILLHOUSE_HINT_ADS_THROW" ); - precachestring( &"KILLHOUSE_HINT_ADS_TOGGLE_THROW" ); - precachestring( &"KILLHOUSE_HINT_STOP_ADS" ); - precachestring( &"KILLHOUSE_HINT_STOP_ADS_TOGGLE" ); - precachestring( &"KILLHOUSE_HINT_STOP_ADS_THROW" ); - precachestring( &"KILLHOUSE_HINT_STOP_ADS_TOGGLE_THROW" ); - precachestring( &"KILLHOUSE_HINT_BREATH_MELEE" ); - precachestring( &"KILLHOUSE_HINT_BREATH_SPRINT" ); - precachestring( &"KILLHOUSE_HINT_BREATH_BINOCULARS" ); - precachestring( &"KILLHOUSE_HINT_MELEE_BREATH" ); - precachestring( &"KILLHOUSE_HINT_MELEE" ); - precachestring( &"KILLHOUSE_HINT_MELEE_BREATH_CLICK" ); - precachestring( &"KILLHOUSE_HINT_MELEE_CLICK" ); - precachestring( &"KILLHOUSE_HINT_PRONE" ); - precachestring( &"KILLHOUSE_HINT_PRONE_HOLD" ); - precachestring( &"KILLHOUSE_HINT_PRONE_TOGGLE" ); - precachestring( &"KILLHOUSE_HINT_PRONE_STANCE" ); - precachestring( &"KILLHOUSE_HINT_PRONE_DOUBLE" ); - precachestring( &"KILLHOUSE_HINT_CROUCH_STANCE" ); - precachestring( &"KILLHOUSE_HINT_CROUCH" ); - precachestring( &"KILLHOUSE_HINT_CROUCH_TOGGLE" ); - precachestring( &"KILLHOUSE_HINT_STAND" ); - precachestring( &"KILLHOUSE_HINT_STAND_STANCE" ); - precachestring( &"KILLHOUSE_HINT_JUMP_STAND" ); - precachestring( &"KILLHOUSE_HINT_JUMP" ); - precachestring( &"KILLHOUSE_HINT_SPRINT_PC" ); - precachestring( &"KILLHOUSE_HINT_SPRINT" ); - precachestring( &"KILLHOUSE_HINT_SPRINT_BREATH_PC" ); - precachestring( &"KILLHOUSE_HINT_SPRINT_BREATH" ); - precachestring( &"KILLHOUSE_HINT_HOLDING_SPRINT" ); - precachestring( &"KILLHOUSE_HINT_HOLDING_SPRINT_BREATH" ); - precachestring( &"KILLHOUSE_HINT_RELOAD_USE" ); - precachestring( &"KILLHOUSE_HINT_RELOAD" ); - precachestring( &"KILLHOUSE_HINT_MANTLE" ); - precachestring( &"KILLHOUSE_HINT_ADS_SWITCH" ); - precachestring( &"KILLHOUSE_HINT_ADS_SWITCH_SHOULDER" ); - precachestring( &"KILLHOUSE_HINT_ADS_SWITCH_THROW" ); - precachestring( &"KILLHOUSE_HINT_ADS_SWITCH_THROW_SHOULDER" ); - precachestring( &"KILLHOUSE_HINT_SIDEARM_SWAP" ); - precachestring( &"KILLHOUSE_HINT_PRIMARY_SWAP" ); - precachestring( &"KILLHOUSE_HINT_SIDEARM" ); - precachestring( &"KILLHOUSE_HINT_SIDEARM_RELOAD" ); - precachestring( &"KILLHOUSE_HINT_SIDEARM_RELOAD_USE" ); - precachestring( &"KILLHOUSE_HINT_LADDER" ); - precachestring( &"KILLHOUSE_HINT_FRAG" ); - precachestring( &"KILLHOUSE_HINT_SWAP" ); - precachestring( &"KILLHOUSE_HINT_SWAP_RELOAD" ); - precachestring( &"KILLHOUSE_HINT_FIREMODE" ); - precachestring( &"KILLHOUSE_HINT_LAUNCHER_ATTACK" ); - precachestring( &"KILLHOUSE_HINT_EXPLOSIVES" ); - precachestring( &"KILLHOUSE_HINT_EXPLOSIVES_RELOAD" ); - precachestring( &"KILLHOUSE_HINT_EXPLOSIVES_PLANT" ); - precachestring( &"KILLHOUSE_HINT_EXPLOSIVES_PLANT_RELOAD" ); - precachestring( &"KILLHOUSE_MARINE3_USE_SIDEARM" ); - precachestring( &"KILLHOUSE_C4_PICKUP" ); - precachestring( &"KILLHOUSE_HINT_C4_ICON" ); - precachestring( &"KILLHOUSE_HINT_EQUIP_C4" ); - precachestring( &"KILLHOUSE_HINT_THROW_C4" ); - precachestring( &"KILLHOUSE_HINT_THROW_C4_TOGGLE" ); - precachestring( &"KILLHOUSE_HINT_THROW_C4_SPEED" ); - precachestring( &"KILLHOUSE_HINT_APPROACH_MELEE" ); - precachestring( &"KILLHOUSE_HINT_APPROACH_C4_THROW" ); - precachestring( &"KILLHOUSE_HINT_HUD_CHANGES" ); - precachestring( &"KILLHOUSE_DETONATE_C4" ); - precachestring( &"KILLHOUSE_HINT_CROSSHAIR_CHANGES" ); - precachestring( &"KILLHOUSE_HINT_ADS_ACCURACY" ); - precachestring( &"KILLHOUSE_USE_ROPE" ); - precachestring( &"KILLHOUSE_SHIP_TOO_SLOW" ); - precachestring( &"KILLHOUSE_YOUR_TIME" ); - precachestring( &"KILLHOUSE_YOUR_FINAL_TIME" ); - precachestring( &"KILLHOUSE_IW_BEST_TIME" ); - precachestring( &"KILLHOUSE_YOUR_DECK_TIME" ); - precachestring( &"KILLHOUSE_IW_DECK_TIME" ); - precachestring( &"KILLHOUSE_SHIP_OUT_OF_FLASH" ); - precachestring( &"KILLHOUSE_SHIP_JUMPED_TOO_EARLY" ); - precachestring( &"KILLHOUSE_HIT_FRIENDLY" ); - precachestring( &"KILLHOUSE_HINT_FLASH" ); - precachestring( &"KILLHOUSE_ACCURACY_BONUS" ); - precachestring( &"KILLHOUSE_SHIP_LABEL" ); - precachestring( &"KILLHOUSE_DECK_LABEL" ); - precachestring( &"KILLHOUSE_ACCURACY_BONUS_ZERO" ); - precachestring( &"KILLHOUSE_C4_OBJECTIVE" ); - precachestring( &"KILLHOUSE_HINT_GRENADE_TOO_LOW" ); - precachestring( &"KILLHOUSE_HINT_GL_TOO_LOW" ); - precachestring( &"KILLHOUSE_AXIS_OPTION_MENU1" ); - precachestring( &"KILLHOUSE_AXIS_OPTION_MENU2" ); - precachestring( &"KILLHOUSE_AXIS_OPTION_MENU1B" ); - precachestring( &"KILLHOUSE_AXIS_OPTION_MENU2B" ); - precachestring( &"KILLHOUSE_AXIS_OPTION_YES" ); - precachestring( &"KILLHOUSE_AXIS_OPTION_NO" ); - precachestring( &"KILLHOUSE_AXIS_OPTION_MENU1_ALL" ); - precachestring( &"KILLHOUSE_AXIS_OPTION_MENU2_ALL" ); - precachestring( &"KILLHOUSE_LOOK_UP" ); - precachestring( &"KILLHOUSE_LOOK_DOWN" ); - precachestring( &"KILLHOUSE_HINT_LAUNCHER_ICON" ); - precachestring( &"KILLHOUSE_FIRED_NEAR_FRIENDLY" ); - precachestring( &"KILLHOUSE_USE_YOUR_OBJECTIVE_INDICATOR" ); - precachestring( &"KILLHOUSE_PICK_UP_A_RIFLE_FROM" ); - precachestring( &"KILLHOUSE_GET_A_PISTOL_FROM_THE" ); - precachestring( &"KILLHOUSE_MELEE_THE_WATERMELON" ); - precachestring( &"KILLHOUSE_GO_OUTSIDE_AND_REPORT" ); - precachestring( &"KILLHOUSE_PICK_UP_THE_RIFLE_WITH" ); - precachestring( &"KILLHOUSE_PICK_UP_THE_C4_EXPLOSIVE" ); - precachestring( &"KILLHOUSE_RUN_THE_OBSTACLE_COURSE" ); - precachestring( &"KILLHOUSE_REPORT_TO_CAPTAIN_PRICE" ); - precachestring( &"KILLHOUSE_CLIMB_THE_LADDER" ); - precachestring( &"KILLHOUSE_DEBRIEF_WITH_CPT_PRICE" ); - precachestring( &"KILLHOUSE_ENTER_STATION_NUMBER" ); - precachestring( &"KILLHOUSE_SHOOT_EACH_TARGET_WHILE" ); - precachestring( &"KILLHOUSE_SHOOT_EACH_TARGET_WHILE1" ); - precachestring( &"KILLHOUSE_SHOOT_EACH_TARGET_AS" ); - precachestring( &"KILLHOUSE_EQUIP_THE_MP5_AND_PICK" ); - precachestring( &"KILLHOUSE_CLEAR_THE_CARGOSHIP_BRIDGE" ); - precachestring( &"KILLHOUSE_SWITCH_TO_YOUR_RIFLE" ); - precachestring( &"KILLHOUSE_PICK_UP_THE_FRAG_GRENADES" ); - precachestring( &"KILLHOUSE_ENTER_THE_SAFETY_PIT" ); - precachestring( &"KILLHOUSE_THROW_A_GRENADE_INTO" ); - precachestring( &"KILLHOUSE_RETURN_TO_THE_SAFETY" ); - precachestring( &"KILLHOUSE_FIRE_AT_THE_WALL_WITH" ); - precachestring( &"KILLHOUSE_PLANT_THE_C4_EXPLOSIVE" ); - precachestring( &"KILLHOUSE_FIRE_YOUR_GRENADE_LAUNCHER" ); - precachestring( &"KILLHOUSE_CLIMB_THE_LADDER1" ); - precachestring( &"KILLHOUSE_SHOOT_A_TARGET_THROUGH" ); - - precachestring( &"KILLHOUSE_SLIDE_DOWN_THE_ROPE" ); - precachestring( &"KILLHOUSE_COMPLETE_THE_DECK_MOCKUP" ); - - precachestring( &"KILLHOUSE_RECOMMENDED_LABEL" ); - precachestring( &"KILLHOUSE_RECOMMENDED_LABEL2" ); - precachestring( &"KILLHOUSE_RECOMMENDED_EASY" ); - precachestring( &"KILLHOUSE_RECOMMENDED_NORMAL" ); - precachestring( &"KILLHOUSE_RECOMMENDED_HARD" ); - precachestring( &"KILLHOUSE_RECOMMENDED_VETERAN" ); - - - level.weaponClipModels = []; - level.weaponClipModels[0] = "weapon_mp5_clip"; - level.weaponClipModels[1] = "weapon_m16_clip"; - level.weaponClipModels[2] = "weapon_saw_clip"; - - maps\_blackhawk::main( "vehicle_blackhawk" ); - maps\_80s_hatch1::main( "vehicle_80s_hatch1_red" ); - maps\_80s_sedan1::main( "vehicle_80s_sedan1_green" ); - maps\_bus::main( "vehicle_bus_destructable" ); - maps\_bm21_troops::main( "vehicle_bm21_mobile_cover" ); - maps\_humvee::main( "vehicle_humvee_camo" ); - maps\_small_wagon::main( "vehicle_small_wagon_turq" ); - maps\_80s_sedan1::main( "vehicle_80s_sedan1_brn" ); - maps\_bm21_troops::main( "vehicle_bm21_mobile_bed" ); - maps\killhouse_fx::main(); - maps\_load::main(); - maps\killhouse_anim::anim_main(); - level thread maps\killhouse_amb::main(); - maps\_compass::setupMiniMap("compass_map_killhouse"); - maps\_c4::main(); // Add in you main() function. - maps\createart\killhouse_art::main(); - - battlechatter_off( "allies" ); - battlechatter_off( "axis" ); - - level.curObjective = 1; - level.objectives = []; - - //speakersInit(); - registerActions(); - //thread playerShootTracker(); - - flag_init ( "in_pit_with_frags" ); - - flag_init( "ADS_targets_shot" ); - flag_init( "hip_targets_shot" ); - flag_init( "crosshair_dialog" ); - flag_init( "ADS_shoot_dialog" ); - //flag_init ( "sidearm_complete" ); - flag_init ( "melee_run_dialog" ); - flag_init( "melee_complete" ); - flag_init ( "picked_up_launcher_dialog" ); - flag_init ( "plant_c4_dialog" ); - //flag_init ( "c4_equiped" ); - flag_init ( "c4_thrown" ); - flag_init ( "C4_planted" ); - flag_init ( "car_destroyed" ); - flag_init ( "reveal_dialog_starting" ); - flag_init ( "reveal_dialog_done" ); - - flag_init ( "price_reveal_done" ); - flag_init ( "reveal_done" ); - flag_init ( "player_sprinted" ); - flag_init ( "fragTraining_end" ); - flag_init ( "got_flashes" ); - flag_init ( "got_frags" ); - flag_init ( "sprinted" ); - flag_init ( "finish" ); - flag_init ( "activate_rope" ); - - flag_init ( "aa_look_training" ); - flag_init ( "aa_obj_training" ); - flag_init ( "aa_rifle_training" ); - flag_init ( "aa_timed_shooting_training" ); - flag_init ( "aa_sidearm_melee" ); - flag_init ( "aa_frag" ); - flag_init ( "aa_launcher" ); - flag_init ( "aa_c4" ); - flag_init ( "aa_obstacle" ); - flag_init ( "aa_cargoship" ); - - flag_init( "gaz_in_idle_position" ); - - - precacheString( &"KILLHOUSE_OBJ_GET_RIFLE_AMMO" ); - precacheString( &"KILLHOUSE_OBJ_ENTER_STALL" ); - precacheString( &"KILLHOUSE_HINT_SIDEARM" ); - precacheString( &"KILLHOUSE_HINT_OBJECTIVE_MARKER" ); - precacheString( &"KILLHOUSE_HINT_OBJECTIVE_REMINDER" ); - precacheString( &"KILLHOUSE_HINT_OBJECTIVE_REMINDER2" ); - precacheString( &"KILLHOUSE_HINT_LADDER" ); - precacheString( &"KILLHOUSE_HINT_HOLDING_SPRINT" ); - precacheString( &"KILLHOUSE_AXIS_OPTION_MENU1_ALL" ); - precacheString( &"KILLHOUSE_AXIS_OPTION_MENU2_ALL" ); - - precacheMenu("invert_axis"); - precacheMenu("invert_axis_pc"); - precacheMenu("select_difficulty"); - - flag_init ( "spawn_sidearms" ); - flag_init ( "spawn_frags" ); - flag_init ( "spawn_launcher" ); - - flashes = getEntArray( "pickup_flash", "targetname" ); - frags = getEntArray( "frag_ammoitem", "targetname" ); - launcher_ammoitem = getEntArray( "launcher_ammoitem", "targetname" ); - array_thread( flashes, ::Ammorespawnthink , undefined, "flash_grenade", "got_flashes" ); - array_thread( getEntArray( "pickup_mp5", "targetname" ), ::ammoRespawnThink , undefined, "mp5" ); - array_thread( getEntArray( "pickup_rifle", "targetname" ), ::ammoRespawnThink , undefined, "g36c" ); - array_thread( getEntArray( "pickup_sidearm", "targetname" ), ::ammoRespawnThink , "spawn_sidearms", "usp" ); - array_thread( frags, ::ammoRespawnThink , "spawn_frags", "fraggrenade", "got_frags" ); - array_thread( launcher_ammoitem, ::ammoRespawnThink , "spawn_launcher", "m203_m4" ); - array_thread( getEntArray( "pickup_pistol", "targetname" ), ::ammoRespawnThink , undefined, "usp" ); - - - level.gunPrimary = "g36c"; - level.gunPrimaryClipAmmo = 30; - level.gunSidearm = "usp"; - silently_lowerPlywoodWalls(); - thread training_targetDummies( "rifle" ); - //thread test(); - thread melon_think(); - thread turn_off_frag_lights(); - thread waters_think(); - thread mac_think(); - thread newcastle_think(); - thread price_think(); - thread music_control(); - - //car = getent ( "destructible", "targetname" ); - //car thread do_in_order( ::waittill_msg, "destroyed", ::flag_set, "car_destroyed" ); - //car destructible_disable_explosion(); - - pickupTrigger = getEnt( "c4_pickup", "targetname" ); - pickupTrigger trigger_off(); - - C4_models = getEntArray( pickupTrigger.target, "targetname" ); - for ( i = 0; i < C4_models.size; i++ ) - C4_models[ i ] hide(); - - - //level.destructible_type[0].parts[0][3].v["validDamageCause"] = "ai_only"; - - flag_init ( "start_deck" ); - thread deck_training(); - thread ambient_trucks(); - helis = maps\_vehicle::create_vehicle_from_spawngroup_and_gopath( 8 ); - array_thread(getentarray("level_scripted_unloadnode","script_noteworthy"),::level_scripted_unloadnode ); - - //array_thread(getentarray("killhouse_interior","targetname"),::vision_trigger, "killhouse_interior" ); - //array_thread(getentarray("killhouse_exterior","targetname"),::vision_trigger, "killhouse" ); - - thread setup_player_action_notifies(); - - aa = getEntArray( "launcher_aim_assist", "script_noteworthy" ); - for ( i = 0; i < aa.size; i++ ) - { - aa[ i ] hide(); - aa[ i ] notsolid(); - } - - //thread flashed_debug(); - //thread flashed_hud_elem(); - - thread new_look_training_setup(); - - ai = getaispeciesarray( "allies", "all" ); - array_thread ( ai, ::magic_bullet_shield ); - array_thread ( ai, ::fail_on_damage ); - - thread glowing_rope(); - thread chair_guy_setup(); - thread clear_hints_on_mission_fail(); -} - -clear_hints_on_mission_fail() -{ - level waittill ( "mission failed" ); - clear_hints(); -} - - - -killhouse_introscreen() -{ - level.player freezeControls( true ); - - lines = []; - lines[ lines.size ] = &"KILLHOUSE_INTROSCREEN_LINE_1"; -// lines[ "date" ] = &"KILLHOUSE_INTROSCREEN_LINE_2"; -// lines[ "date" ] = "Day 1 - 6:30:[{FAKE_INTRO_SECONDS:09}]"; - lines[ lines.size ] = &"KILLHOUSE_INTROSCREEN_LINE_3"; - lines[ lines.size ] = &"KILLHOUSE_INTROSCREEN_LINE_4"; - lines[ lines.size ] = &"KILLHOUSE_INTROSCREEN_LINE_5"; - - - thread maps\_introscreen::introscreen_feed_lines( lines ); - thread maps\_introscreen::introscreen_generic_black_fade_in( 5 ); - wait 5; - level.player freezeControls( false ); -} - - - -look_training() -{ - //killhouse_introscreen(); - flag_set ( "aa_look_training" ); - thread hint( &"KILLHOUSE_LOOK_UP", 9999 ); - - while ( 1 ) - { - angles = level.player getPlayerAngles(); - //println ( angles ); - if ( angles[ 0 ] < -40 ) - break; - wait .1; - } - clear_hints(); - wait .5; - thread hint( &"KILLHOUSE_LOOK_DOWN", 9999 ); - - while ( 1 ) - { - angles = level.player getPlayerAngles(); - //println ( angles ); - if ( angles[ 0 ] > 0 ) - break; - wait .1; - } - clear_hints(); - - setDvar( "ui_start_inverted", 0 ); - if ( level.Console || getdvarint("gpad_in_use") ) - { - if(isdefined( getdvar("input_invertPitch") ) && getdvar("input_invertPitch") == "1" ) - setDvar( "ui_start_inverted", 1 ); - } - else // PC - { - if(isdefined( getdvar("ui_mousepitch") ) && getdvar("ui_mousepitch") == "1" ) - setDvar( "ui_start_inverted", 1 ); - } - wait .1;//make sure dvar is set - - setDvar( "ui_invert_string", "@KILLHOUSE_AXIS_OPTION_MENU1_ALL" ); - if ( level.console ) - level.player openMenu("invert_axis"); - else - level.player openMenu("invert_axis_pc"); - - level.player freezecontrols(true); - setblur(2, .1); - level.player waittill("menuresponse", menu, response); - setblur(0, .2); - level.player freezecontrols(false); - - if(response == "try_invert") - { - thread hint( &"KILLHOUSE_LOOK_UP", 9999 ); - - while ( 1 ) - { - angles = level.player getPlayerAngles(); - //println ( angles ); - if ( angles[ 0 ] < -40 ) - break; - wait .1; - } - clear_hints(); - wait .5; - thread hint( &"KILLHOUSE_LOOK_DOWN", 9999 ); - - while ( 1 ) - { - angles = level.player getPlayerAngles(); - //println ( angles ); - if ( angles[ 0 ] > 0 ) - break; - wait .1; - } - clear_hints(); - - setDvar( "ui_invert_string", "@KILLHOUSE_AXIS_OPTION_MENU2_ALL" ); - if ( level.console ) - level.player openMenu("invert_axis"); - else - level.player openMenu("invert_axis_pc"); - - level.player freezecontrols(true); - setblur(2, .1); - level.player waittill("menuresponse", menu, response); - setblur(0, .2); - level.player freezecontrols(false); - } - - flag_clear ( "aa_look_training" ); - thread navigationTraining(); -} - -navigationTraining() -{ - flag_set ( "aa_obj_training" ); - level notify ( "navigationTraining_start" ); - - level.waters thread execDialog( "illletyouin" ); - - registerObjective( "obj_enter_range", &"KILLHOUSE_USE_YOUR_OBJECTIVE_INDICATOR", getEnt( "rifle_range_obj", "targetname" ) ); - setObjectiveState( "obj_enter_range", "current" ); - - wait 3; - - thread objective_hints( "at_rifle_range" ); - - flag_wait( "at_rifle_range" ); - - thread open_firing_range_door(); - - - thread door_to_rifle_handler(); - - flag_wait ( "inside_firing_range" ); - - setObjectiveState( "obj_enter_range", "done" ); -} - -inside_start() -{ - inside_start = getent( "inside_start", "targetname" ); - level.player setOrigin( inside_start.origin ); - level.player setPlayerAngles( inside_start.angles ); - - flag_set ( "inside_firing_range" ); - - //killhouse_introscreen(); - //flag_wait( "pullup_weapon" ); - //wait .2; - //flag_wait ("introscreen_complete"); - - wait 2.5; - saveGame( "levelstart", &"AUTOSAVE_LEVELSTART", "whatever", true ); - - thread maps\_introscreen::introscreen_generic_white_fade_in( .1, 0.30 ); - thread door_to_rifle_handler(); -} - -door_to_rifle_handler() -{ - //flag_wait ( "inside_firing_range" ); - node = getnode ( "gaz_intro", "targetname" ); - node thread anim_first_frame_solo ( level.waters, "intro" ); - - flag_wait ("introscreen_complete"); - - node thread anim_single_solo ( level.waters, "intro" ); - //level.waters thread execDialog( "goodtosee" ); - //level.waters Delaythread( 1, ::execDialog, "goodtosee" ); - - level notify ( "navigationTraining_end" ); - - clear_hints(); - - wait ( 0.5 ); - - flag_clear ( "aa_obj_training" ); - thread rifleTraining(); -} - -rifle_start() -{ - shooting_start = getent( "shooting_start", "targetname" ); - level.player setOrigin( shooting_start.origin ); - level.player setPlayerAngles( shooting_start.angles ); - - flag_set ( "inside_firing_range" ); - - thread rifleTraining(); -} - -rifleTraining() -{ - flag_set ( "aa_rifle_training" ); - level notify ( "rifleTraining_start" ); - flag_trigger_init( "player_at_rifle_stall", getEnt( "rifleTraining_stall", "targetname" ), true ); - - flag_wait ( "inside_firing_range" ); - - thread delay_objective_after_intro(); - - - thread move_gaz_once_player_past(); - - while ( !(level.player GetWeaponAmmoStock( level.gunPrimary ) ) ) - wait ( 0.05 ); - - close_firing_range_door(); - autosave_by_name( "rifle_training" ); - - setObjectiveString( "obj_rifle", &"KILLHOUSE_ENTER_STATION_NUMBER" ); - setObjectiveLocation( "obj_rifle", getEnt( "obj_rifle_stall", "targetname" ) ); - - - //You know the drill. Go to station one...and aim your rifle downrange. - thread gaz_animation( "killhouse_gaz_idleA", 1.5 ); - level.waters execDialog( "youknowdrill" ); - - - /* - if ( !flag( "player_at_rifle_stall" ) ) - { - //Captain Price wants an evaluation of everyone's shooting skills, so don't fuck it up mate! You may have passed Selection, but you're still on probation as far as the Regiment's concerned. - level.waters thread execDialog( "priceevaluation" ); - } - */ - - while( !flag( "player_at_rifle_stall" ) ) - wait ( 0.05 ); - - if ( !isADS() ) - { - //Now aim your rifle down range, Soap. - if ( level.Xenon || getdvarint("gpad_style") == 0 ) - thread keyHint( "ads_360" ); - else - thread keyHint( "ads" );//PC and PS3 are both press - - thread gaz_animation( "killhouse_gaz_idleA" ); - level.waters execDialog( "rifledownrange" ); - } - - while( !isADS() ) - wait ( 0.05 ); - - if ( level.short_training ) - thread new_look_training_handler(); - else - thread shoot_ADS_handler(); -} - - - -new_look_training_handler() -{ - aim_down_target = getEnt( "aim_down_target", "targetname" ); - aim_up_target = getEnt( "aim_up_target", "targetname" ); - - //thread add_dialogue_line( "GAZ", "Shoot the targets." ); - if( level.Xenon || getdvarint("gpad_style") == 0 ) - thread keyHint( "attack" ); - else - thread keyHint( "pc_attack" );//PC and PS3 are both press - - //Now. Shoot - each - target, while aiming down the sights. - level.waters thread execDialog( "shooteachtarget" ); - - //make the targets appear - //aim_up_target waittill_player_lookat(); - aim_up_target new_look_wait_for_target( -90, 90 ); - aim_down_target new_look_wait_for_target( 90, -90 ); - - - setDvar( "ui_start_inverted", 0 ); - if ( level.Console || getdvarint("gpad_in_use") ) - { - if(isdefined( getdvar("input_invertPitch") ) && getdvar("input_invertPitch") == "1" ) - setDvar( "ui_start_inverted", 1 ); - } - else // PC - { - if(isdefined( getdvar("ui_mousepitch") ) && getdvar("ui_mousepitch") == "1" ) - setDvar( "ui_start_inverted", 1 ); - } - wait .1;//make sure dvar is set - - setDvar( "ui_invert_string", "@KILLHOUSE_AXIS_OPTION_MENU1_ALL" ); - if ( level.console ) - level.player openMenu("invert_axis"); - else - level.player openMenu("invert_axis_pc"); - - level.player freezecontrols(true); - setblur(2, .1); - level.player waittill("menuresponse", menu, response); - setblur(0, .2); - level.player freezecontrols(false); - - if(response == "try_invert") - { - level.waters thread execDialog( "onemoretime" ); - //thread add_dialogue_line( "GAZ", "Okay mate, one more time while aiming down your sights." ); - - aim_up_target new_look_wait_for_target( -90, 90 ); - aim_down_target new_look_wait_for_target( 90, -90 ); - - setDvar( "ui_invert_string", "@KILLHOUSE_AXIS_OPTION_MENU2_ALL" ); - if ( level.console ) - level.player openMenu("invert_axis"); - else - level.player openMenu("invert_axis_pc"); - - level.player freezecontrols(true); - setblur(2, .1); - level.player waittill("menuresponse", menu, response); - setblur(0, .2); - level.player freezecontrols(false); - } - //Lovely� - level.waters execDialog( "lovely" ); - - thread rifle_hip_shooting(); -} - - -shoot_ADS_handler() -{ - thread ADS_shoot_dialog(); - - wait ( 0.1 ); - raiseTargetDummies( "rifle", undefined, undefined ); - thread setObjectiveString( "obj_rifle", &"KILLHOUSE_SHOOT_EACH_TARGET_WHILE" ); - - thread flag_when_lowered( "ADS_targets_shot" ); - - flag_wait( "ADS_targets_shot" ); - flag_wait( "ADS_shoot_dialog" ); - - //Brilliant. You know Soap, it might help to aim your rifle before firing. - //level.waters thread execDialog( "brilliant" ); - - thread rifle_hip_shooting(); -} - - -rifle_hip_shooting() -{ - wait .5; - double_line = true; - thread hint ( &"KILLHOUSE_HINT_ADS_ACCURACY", 10, double_line ); - //Now, shoot at the targets while firing from the hip. - level.waters execDialog( "firingfromhip" ); - - setObjectiveString( "obj_rifle", &"KILLHOUSE_SHOOT_EACH_TARGET_WHILE1" ); - wait 1; - - double_line = true; - if ( isADS() ) - thread keyHint( "stop_ads", undefined, double_line ); - - while( isADS() ) - wait ( 0.05 ); - - level.hip_fire_required = true; - raiseTargetDummies( "rifle", undefined, undefined ); - thread flag_when_lowered( "hip_targets_shot" ); - - - if( level.xenon || getdvarint("gpad_style") == 0 ) - keyHint( "hip_attack" ); - else - keyHint( "pc_hip_attack" );//PC and ps3 are both "press" - - //thread crosshair_dialog(); - - while ( level.targets_hit == 0 ) - wait .1; - - double_line = true; - thread hint ( &"KILLHOUSE_HINT_CROSSHAIR_CHANGES", 6, double_line ); - - flag_wait( "hip_targets_shot" ); - level.hip_fire_required = false; - //flag_wait( "crosshair_dialog" ); - thread rifle_penetration_shooting(); -} - - -crosshair_dialog() -{ - wait 1; - //Notice that your crosshair changes size as you fire, this indicates your current accuracy blah blah blaaah� - level.waters execDialog( "changessize" ); - - //�uhhh, also note that you will never be as accurate when you fire from the hip, as when you aim down your sights. (Bloody hell this is a stupid test innit?) All right let's get this over with. - level.waters execDialog( "stupidtest" ); - - wait 1; - - flag_set( "crosshair_dialog" ); -} - -rifle_penetration_shooting() -{ - wait .5; - //Now I'm going to block the targets with a sheet of plywood. - level.waters execDialog( "blocktargets" ); - - raiseTargetDummies( "rifle", undefined, undefined ); - raisePlywoodWalls(); - setObjectiveString( "obj_rifle", &"KILLHOUSE_SHOOT_A_TARGET_THROUGH" ); - level.targets_hit = 0; - - wait .5; - - //I want you to shoot the targets through the wood. - level.waters execDialog( "shoottargets" ); - - wait .2; - - //Bullets will penetrate thin, weak materials like wood, plaster and sheet metal. The larger the weapon, the more penetrating power it has. But - you already knew that. Moving on. - level.waters thread execDialog( "bulletspenetrate" ); - - targetDummies = getTargetDummies( "rifle" ); - numRaised = targetDummies.size; - - while ( level.targets_hit == 0 ) - wait .1; - - /* - while ( numRaised == targetDummies.size ) - { - numRaised = 0; - for ( index = 0; index < targetDummies.size; index++ ) - { - if ( targetDummies[index].raised ) - numRaised++; - } - if ( !(level.player GetWeaponAmmoStock( level.gunPrimary )) ) - { - level.marine2 nagPlayer( "getammo", 8.0 ); // should tell carver to get more ammo - println ("z: wtf2"); - } - else if ( !(level.player GetWeaponAmmoClip( level.gunPrimary )) ) - { - wait ( 2.0 ); - if ( !(level.player GetWeaponAmmoClip( level.gunPrimary )) ) - { - thread keyHint( "reload" ); - - level.marine2 nagPlayer( "loadweapon", 8.0 ); - println ("z: wtf"); - } - } - else if ( !flag( "player_at_rifle_stall" ) ) - { - level.marine2 nagPlayer( "backtostation", 8.0 ); - } - - wait ( 0.05 ); - } - */ - - //Good. - level.waters execDialog( "good" ); - - setObjectiveState( "obj_rifle", "done" ); - lowerPlywoodWalls(); - lowerTargetDummies( "rifle", undefined, undefined ); - - wait .5; - - flag_clear ( "aa_rifle_training" ); - thread rifle_timed_shooting(); -} - -rifle_timed_start() -{ - shooting_start = getent( "shooting_start", "targetname" ); - level.player setOrigin( shooting_start.origin ); - level.player setPlayerAngles( shooting_start.angles ); - level.player giveWeapon("g36c"); - level.player switchtoWeapon("g36c"); - - thread rifle_timed_shooting(); -} - - - -rifle_timed_shooting() -{ - flag_set ( "aa_timed_shooting_training" ); - //Now I'm going make the targets pop up one at a time. - level.waters execDialog( "targetspop" ); - - //wait .5; - - //Hit all of them as fast as you can. - level.waters execDialog( "hitall" ); - - registerObjective( "obj_timed_rifle", &"KILLHOUSE_SHOOT_EACH_TARGET_AS", getEnt("obj_rifle_stall", "targetname" ) ); - setObjectiveState( "obj_timed_rifle", "current" ); - - if ( auto_aim() ) - { - //ps3_flipped = is_ps3_flipped(); - - //if ( ( level.xenon ) || ( ps3_flipped ) ) - if ( level.xenon || getdvarint("gpad_style") == 0 ) - actionBind = getActionBind( "ads_switch" ); - else - actionBind = getActionBind( "ads_switch_shoulder" ); - double_line = true; - thread hint( actionBind.hint, 6, double_line ); - - //As long as your crosshairs are near the targets, you can snap onto them by repeatedly popping in //and out of aiming down the sight. - //level.waters execDialog( "cansnap" ); - //As long as your aiming near the target, you can snap onto them by repeatedly popping in and out of aiming down the sight. - level.waters execDialog( "snaponto" ); - } - - if ( (level.player GetWeaponAmmoClip( level.gunPrimary ) ) < level.gunPrimaryClipAmmo ) - { - keyHint( "reload" ); - wait ( 2.0 ); - } - - tooslow_dialog = []; - tooslow_dialog[ 0 ] = "stilltooslow"; //You're still too slow� - tooslow_dialog[ 1 ] = "again"; //Again. - tooslow_dialog[ 2 ] = "again2"; //Again. - tooslow_dialog[ 3 ] = "walkinpark"; //Too slow. Come on. This should be a walk in the park for you. - - - numRepeats = 0; - while ( 1 ) - { - //level.marine2 execDialog( "fire" ); - lowerTargetDummies( "rifle" ); - - if ( auto_aim() && numRepeats != 0 ) - { - //ps3_flipped = is_ps3_flipped(); - - //if ( ( level.xenon ) || ( ps3_flipped ) ) - if ( level.xenon || getdvarint("gpad_style") == 0 ) - actionBind = getActionBind( "ads_switch" ); - else - actionBind = getActionBind( "ads_switch_shoulder" ); - double_line = true; - thread hint( actionBind.hint, 10, double_line ); - wait 4; - } - - level.num_hit = 0; - thread timedTargets(); - - wait 10; - - level notify ("times_up"); - - if ( level.num_hit > 6 ) - break; - wait 1; - - numRepeats++; - //iprintlnbold( "Too slow" ); - lowerTargetDummies( "rifle" ); - if ( numRepeats == 1 ) - level.waters execDialog( "tryagain" );//Too slow mate! Try again! - else - level.waters execDialog( tooslow_dialog[ randomint ( tooslow_dialog.size ) ] ); - - wait 2; - - if ( (level.player GetWeaponAmmoClip( level.gunPrimary ) ) < level.gunPrimaryClipAmmo ) - { - thread keyHint( "reload" ); - while ( (level.player GetWeaponAmmoClip( level.gunPrimary ) ) < level.gunPrimaryClipAmmo ) - wait .1; - clear_hints(); - wait 1; - } - } - flag_set ( "spawn_sidearms" ); - - wait 1; - - //iprintlnbold( level.num_hit + " hits" ); - setObjectiveState( "obj_timed_rifle", "done" ); - - //Proper good job mate! - level.waters execDialog( "propergood" ); - - level notify ( "rifleTraining_end" ); - wait 0.5; - flag_clear ( "aa_timed_shooting_training" ); - thread sidearm_Training(); -} - -timedTargets() -{ - level endon ("times_up"); - targets = getentarray ( "rifle_target_dummy", "script_noteworthy" ); - last_selection = -1; - while (1) - { - while (1) - { - //randomly pop up a target - selected_target = randomint(targets.size); - if ( selected_target != last_selection ) - break; - } - - last_selection = selected_target; - targets[ selected_target ] thread moveTargetDummy( "raise" ); - - //wait for target to be hit - targets[ selected_target ] waittill ( "hit" ); - level.num_hit++; - - wait .1; - } -} - -sidearm_start() -{ - delaythread( .1, ::move_gaz_fake ); - shooting_start = getent( "shooting_start", "targetname" ); - level.player setOrigin( shooting_start.origin ); - level.player setPlayerAngles( shooting_start.angles ); - level.player giveWeapon("g36c"); - level.player switchtoWeapon("g36c"); - - wait .5; - - thread sideArm_Training(); -} - - -sideArm_Training() -{ - flag_set ( "aa_sidearm_melee" ); - level notify ( "sideArmTraining_begin" ); - autosave_by_name( "sidearm_training" ); - - flag_set( "spawn_sidearms" ); - - - //level.waters thread walk_to ( getnode ( "sidearm_node", "script_noteworthy" ) ); - - //Now go get a side arm from the table. - //level.waters execDialog( "getsidearm" ); - thread gaz_animation( "killhouse_gaz_point_side" ); - level.waters execDialog( "getasidearm" );//armory - - //OBJECTIVE 3: Pick up a pistol. - registerObjective( "obj_sidearm", &"KILLHOUSE_GET_A_PISTOL_FROM_THE", getEnt( "obj_rifle_ammo", "targetname" ) ); - setObjectiveState( "obj_sidearm", "current" ); - - - //while ( level.player getCurrentWeapon() != level.gunSidearm ) - while ( ! level.player HasWeapon( "usp" ) ) - { - //NAG_HINT: Approach the table and hold [USE_BUTTON] to pick up a pistol. - wait .05; - } - level notify ( "show_melon" ); - - setObjectiveString( "obj_sidearm", &"KILLHOUSE_SWITCH_TO_YOUR_RIFLE" ); - - //NEW2 Sgt. Waters: "Good. Now switch to your rifle." - - level.waters execDialog( "switchtorifle" ); - - //OBJECTIVE 3: Switch to your rifle and then back to your pistol. - - if ( level.player getCurrentWeapon() != level.gunPrimary ) - thread keyHint( "primary" ); - - while ( level.player getCurrentWeapon() != level.gunPrimary ) - wait .05; - clear_hints(); - //{ - //NAG_HINT: Press [WEAPON_SWITCH] to switch to your rifle. - // thread keyHint( "primary" ); - // wait .05; - //} - - - //NEW2 Sgt. Waters: "Good. Now switch to your side arm again." - thread gaz_animation( "killhouse_gaz_point_side" ); - level.waters execDialog( "pulloutsidearm" ); - - if ( level.player getCurrentWeapon() != level.gunSidearm ) - { - //NAG_HINT: Press [WEAPON_SWITCH] to switch to your pistol. - thread keyHint( "sidearm" ); - //wait .05; - } - while ( level.player getCurrentWeapon() != level.gunSidearm ) - wait .05; - clear_hints(); - - //*fast pistol swapping - - //Sgt. Waters: "Switching to your pistol is always faster than reloading." - level.waters execDialog( "switchingfaster" ); - - //Sgt. Waters: "If your caught with an empty magazine I recommend you use your side arm, - //thats what its there for." - //level.waters execDialog( "shortofelephant" ); - - setObjectiveState( "obj_sidearm", "done" ); - - flag_set ( "sidearm_complete" ); - level notify ( "sideArmTraining_end" ); - wait ( 0.5 ); - thread melee_training(); -} - -melee_training() -{ - //while( !flag( "melee_entered" ) ) - // wait ( 0.05 ); - level notify ( "melee_training" ); - - registerObjective( "obj_melee", &"KILLHOUSE_MELEE_THE_WATERMELON", getEnt( "scr_watermelon", "targetname" ) ); - setObjectiveState( "obj_melee", "current" ); - - if ( !flag ( "melee_complete" ) ) - thread generic_compass_hint_reminder( "melee_complete", 12 ); - - //level.waters thread walk_to ( getnode ( "melon_node", "script_noteworthy" ) ); - - if ( !flag ( "near_melee" ) && !flag ( "melee_complete" ) ) - { - thread hint( &"KILLHOUSE_HINT_APPROACH_MELEE", 9999 ); - - //All right Soap, come this way. - level.waters execDialog( "comethisway" ); - } - - thread melee_run_dialog(); - - if ( !flag ( "melee_complete" ) ) - flag_wait ( "near_melee" ); - - while ( !flag ( "melee_complete" ) ) - keyHint( "melee" ); - - flag_wait ( "melee_complete" ); - - clear_hints(); - thread open_firing_range_door(); - - - flag_wait ( "melee_run_dialog" ); - - wait .5; - - - //flag_set ( "spawn_frags" ); - - //Lovely. Your fruit killing skills are remarkable. - thread gaz_animation( "killhouse_gaz_talk_side" ); - level.waters execDialog( "fruitkilling" ); - - setObjectiveState( "obj_melee", "done" ); - - level notify ( "meleeTraining_end" ); - flag_clear ( "aa_sidearm_melee" ); - autosave_by_name( "melee_complete" ); - - if ( level.short_training ) - { - level.waters execDialog( "wantstosee" ); - //thread add_dialogue_line( "GAZ", "Captain Price wants to see you." ); - thread report_to_price(); - } - else - { - level.waters execDialog( "allgoodhere" ); - //level.waters thread walk_to ( getnode ( "door_node", "script_noteworthy" ) ); - - thread frag_Training(); - } -} - -open_firing_range_door() -{ - if ( level.firing_range_door_open ) - return; - - door = getEnt( "rifle_range_door", "targetname" ); - - //while ( distance ( level.player.origin, door.origin ) < 160 ) - // wait .1; - - door playsound ( "door_metal_slow_open" ); - door rotateto( door.angles + (0,88,0), 1, .5, 0 ); - door connectpaths(); - level.firing_range_door_open = true; -} - - -close_firing_range_door() -{ - if ( !level.firing_range_door_open ) - return; - door = getEnt( "rifle_range_door", "targetname" ); - door rotateto( door.angles + (0,-88,0), 1, .5, 0 ); - door connectpaths(); - level.firing_range_door_open = false; -} - -melee_run_dialog() -{ - if ( !flag ( "melee_complete" ) ) - { - //Using your knife is even faster than switching to your pistol. - level.waters execDialog( "evenfaster" ); - - - //Here's the situation. You're caught with an empty magazine and you're just a few feet from your enemy. - //level.waters execDialog( "fewfeet" ); - //wait .3; - //What do you do? Easy. You gut the bastard! - //level.waters execDialog( "whatdoyoudo" ); - } - - - if ( !flag ( "melee_complete" ) ) - { - //Knife the watermelon. - level.waters execDialog( "knifewatermelon" ); - } - - //if ( !flag ( "melee_complete" ) ) - // level.waters execDialog( "attackwithknife" ); - - flag_set ( "melee_run_dialog" ); -} - - -frag_start() -{ - frag_start = getent( "frag_start", "targetname" ); - level.player setOrigin( frag_start.origin ); - level.player setPlayerAngles( frag_start.angles ); - level.player giveWeapon("g36c"); - level.player giveWeapon("usp"); - level.player switchtoWeapon("g36c"); - - flag_set ( "spawn_frags" ); - - thread frag_Training(); -} - - -frag_Training() -{ - flag_set ( "aa_frag" ); - level notify ( "fragTraining_begin" ); - autosave_by_name( "frag_training" ); - - flag_set ( "start_frag_training" ); - - thread generic_compass_hint_reminder( "got_frags", 7 ); - - registerObjective( "obj_frags", &"KILLHOUSE_GO_OUTSIDE_AND_REPORT", getEnt( "obj_frag_ammo", "targetname" ) ); - setObjectiveState( "obj_frags", "current" ); - - flag_wait ( "near_grenade_area" ); - - setObjectiveString( "obj_frags", &"KILLHOUSE_PICK_UP_THE_FRAG_GRENADES" ); - - //It's time for some fun mate. Let's blow some shit up� - level.newcastle execDialog( "timeforfun" ); - - if ( !( level.player GetWeaponAmmoStock( "fraggrenade" ) ) && (!( in_pit() ) ) ) - { - //Pick up those frag grenades and get in the safety pit. - level.newcastle execDialog( "pickupfrag" ); - } - - while ( level.player GetWeaponAmmoStock( "fraggrenade" ) < 3 ) - wait ( 0.05 ); - - flag_set ( "got_frags" ); - - getEnt( "grenade_too_low", "targetname" ) thread frag_too_low_hint(); - - thread frag_trigger_think( "frag_target_1", getEnt( "grenade_damage_trigger1", "targetname" ) ); - thread frag_trigger_think( "frag_target_2", getEnt( "grenade_damage_trigger2", "targetname" ) ); - thread frag_trigger_think( "frag_target_3", getEnt( "grenade_damage_trigger3", "targetname" ) ); - - - setObjectiveLocation( "obj_frags", getEnt( "safety_pit", "targetname" ) ); - setObjectiveString( "obj_frags", &"KILLHOUSE_ENTER_THE_SAFETY_PIT" ); - - thread dialog_nag_till_in_pit(); - - getEnt( "safety_pit", "targetname" ) waittill ( "trigger" ); - flag_set ( "in_pit_with_frags" ); - - //level.newcastle thread walk_to( getnode ( "watch_pit_node", "script_noteworthy" ) ); - level.newcastle setgoalnode ( getnode ( "watch_pit_node", "script_noteworthy" ) ); - - //Now throw a grenade into windows two, three and four. - level.newcastle thread execDialog( "throwgrenade" ); - thread keyHint( "frag" ); - - setObjectiveString( "obj_frags", &"KILLHOUSE_THROW_A_GRENADE_INTO" ); - setObjectiveLocation( "obj_frags", getEnt( "safety_pit", "targetname" ) ); - - wait ( 0.1 ); - - numRemaining = 0; - for ( index = 1; index < 4; index++ ) - { - if ( flag( "frag_target_" + index ) ) - continue; - - numRemaining++; - } - - - //level.marine4 execDialog( "firstwindow" ); - - //level.marine4.lastNagTime = getTime(); - while( numRemaining ) - { - curRemaining = 0; - - nextTarget = ""; - if ( !flag( "frag_target_1" ) ) - { - curRemaining++; - nextTarget = "firstwindow"; - } - if ( !flag( "frag_target_2" ) ) - { - curRemaining++; - if ( nextTarget == "" ) - nextTarget = "secondwindow"; - } - if ( !flag( "frag_target_3" ) ) - { - curRemaining++; - if ( nextTarget == "" ) - nextTarget = "dumpster"; - } - - if ( !curRemaining ) - break; - - if ( curRemaining != numRemaining ) - { - //level.marine4 execDialog( nextTarget ); - //level.marine4.lastNagTime = getTime(); - } - else - { - //level.marine4 nagPlayer( nextTarget + "again", 10.0 ); - } - - numRemaining = curRemaining; - - wait ( 0.05 ); - } - - setObjectiveState( "obj_frags", "done" ); - - wait ( 1.0 ); - //level.marine4 thread execDialog( "gotorange" ); - - flag_set ( "fragTraining_end" ); - thread launcherTraining(); - flag_clear ( "aa_frag" ); -} - -launcher_trigger_think( flag, trigger, continuous ) -{ - flag_init( flag ); - trigger.aim_assist = getEnt( trigger.script_noteworthy, "targetname" ); - trigger.light = getEnt( trigger.target, "targetname" ); - - trigger.aim_assist enableAimAssist(); - trigger.light thread flicker_on(); - - if( !isDefined( continuous ) ) - continuous = false; - - trigger _flag_wait_trigger( flag, continuous ); - - level.player playSound( "killhouse_buzzer" ); - trigger.light thread flicker_off(); - trigger.aim_assist disableAimAssist(); - - return trigger; -} - -gl_too_low_hint() -{ - level endon ( "launcherTraining_end" ); - while( 1 ) - { - self waittill ( "trigger" ); - clear_hints(); - hint( &"KILLHOUSE_HINT_GL_TOO_LOW", 6 ); - } -} - -launcher_start() -{ - frag_start = getent( "frag_start", "targetname" ); - level.player setOrigin( frag_start.origin ); - level.player setPlayerAngles( frag_start.angles ); - level.player giveWeapon("g36c"); - level.player giveWeapon("usp"); - level.player switchtoWeapon("g36c"); - - flag_set ( "spawn_frags" ); - wait .1; - thread launcherTraining(); -} - -launcherTraining() -{ - flag_set ( "aa_launcher" ); - level notify ( "launcherTraining_begin" ); - autosave_by_name( "launcher_training" ); - - flag_set ( "spawn_launcher" ); - - level.newcastle setgoalnode ( getnode ( "watch_table_node", "script_noteworthy" ) ); - //level.newcastle thread walk_to ( getnode ( "watch_table_node", "script_noteworthy" ) ); - - //Now let's try something with a little more 'mojo'. I don't know how much experience you've got with demolitions, so just do as I say, all right? - //level.newcastle execDialog( "moremojo" ); - - if ( !level.player hasWeapon( "m203_m4" ) ) - { - //Come back here and pick up this grenade launcher. - level.newcastle execDialog( "pickuplauncher" ); - } - - flag_trigger_init( "launcher_wall_target", getEnt( "launcher_wall_trigger", "script_noteworthy" ) ); - - registerObjective( "obj_launcher", &"KILLHOUSE_PICK_UP_THE_RIFLE_WITH", getEnt( "obj_frag_ammo", "targetname" ) ); - setObjectiveState( "obj_launcher", "current" ); - - thread keyHint( "swap_launcher" ); - - while ( !level.player hasWeapon( "m203_m4" ) ) - wait ( 0.05 ); - clear_hints(); - thread M203_icon_hint(); - RefreshHudAmmoCounter(); - - - level.player giveMaxAmmo( "m203_m4" ); - - setObjectiveString( "obj_launcher", &"KILLHOUSE_RETURN_TO_THE_SAFETY" ); - setObjectiveLocation( "obj_launcher", getEnt( "safety_pit", "targetname" ) ); - - //Notice you now have an icon of a grenade launcher on your HUD. - //level.newcastle execDialog( "icononhud" ); - - if ( !( level.player istouching( getEnt( "safety_pit", "targetname" ) ) ) ) - { - //Now get back into the safety pit. - level.newcastle execDialog( "nowbacktopit" ); - } - getEnt( "safety_pit", "targetname" ) waittill ( "trigger" ); - - //level.newcastle thread walk_to( getnode ( "watch_pit_node", "script_noteworthy" ) ); - level.newcastle setgoalnode ( getnode ( "watch_pit_node", "script_noteworthy" ) ); - - if ( !(level.player getCurrentWeapon() == "m203_m4") ) - { - //Equip the grenade launcher. - level.newcastle execDialog( "equiplauncher" ); - thread keyHint( "firemode" ); - RefreshHudAmmoCounter(); - } - - while ( !(level.player getCurrentWeapon() == "m203_m4") ) - { - thread keyHint( "firemode" ); - wait ( 1.0 ); - } - - clear_hints(); - - - setObjectiveString( "obj_launcher", &"KILLHOUSE_FIRE_AT_THE_WALL_WITH" ); - setObjectiveLocation( "obj_launcher", getEnt( "safety_pit", "targetname" ) ); - wait ( 0.1 ); - - //Fire at the wall with the number one on it. - level.newcastle execDialog( "firewall1" ); - - if( level.Xenon || getdvarint("gpad_style") == 0 ) - thread keyHint( "attack" ); - else - thread keyHint( "pc_attack" );//PC and PS3 are both press - - while ( !flag( "launcher_wall_target" ) ) - { - //level.player giveMaxAmmo( "m203_m4" ); - wait ( 0.05 ); - } - clear_hints(); - wait ( 0.1 ); - - //Notice it didn't explode. - level.newcastle execDialog( "didntexplode" ); - - //As you know, all grenade launchers have a minimum safe arming distance. - level.newcastle execDialog( "safearming" ); - - //The grenade wont explode unless it travels that distance. - //level.newcastle execDialog( "wontexplode" ); - - //Right. Now pop a grenade in each window, five, six and seven. - level.newcastle thread execDialog( "56and7" ); - - - array_thread ( getEntArray( "gl_too_low", "targetname" ), ::gl_too_low_hint ); - - thread launcher_trigger_think( "launcher_target_1", getEnt( "launcher_damage_trigger1", "targetname" ) ); - thread launcher_trigger_think( "launcher_target_2", getEnt( "launcher_damage_trigger2", "targetname" ) ); - thread launcher_trigger_think( "launcher_target_3", getEnt( "launcher_damage_trigger3", "targetname" ) ); - - - setObjectiveString( "obj_launcher", &"KILLHOUSE_FIRE_YOUR_GRENADE_LAUNCHER" ); - - numRemaining = 0; - for ( index = 1; index < 4; index++ ) - { - if ( flag( "launcher_target_" + index ) ) - continue; - - numRemaining++; - } - - - //level.marine5.lastNagTime = getTime(); - while( numRemaining ) - { - curRemaining = 0; - - nextTarget = ""; - if ( !flag( "launcher_target_1" ) ) - { - curRemaining++; - nextTarget = "hittwo"; - } - if ( !flag( "launcher_target_2" ) ) - { - curRemaining++; - if ( nextTarget == "" ) - nextTarget = "hitthree"; - } - if ( !flag( "launcher_target_3" ) ) - { - curRemaining++; - if ( nextTarget == "" ) - nextTarget = "hitfour"; - } - - if ( !curRemaining ) - break; - - //level.player giveMaxAmmo( "m203_m4" ); - - if ( curRemaining != numRemaining ) - { - //level.marine5.lastNagTime = getTime(); - } - else - { - //level.marine5 nagPlayer( nextTarget, 8.0 ); - } - - numRemaining = curRemaining; - - wait ( 0.05 ); - } - - level notify ( "launcherTraining_end" ); - setObjectiveState( "obj_launcher", "done" ); - - wait ( 1.0 ); - //level.marine5 execDialog( "oorah" ); - wait ( 1.0 ); - - flag_clear ( "aa_launcher" ); - thread c4_Training(); -} - - - - -explosives_start() -{ - c4_start = getent( "c4_start", "targetname" ); - level.player setOrigin( c4_start.origin ); - level.player setPlayerAngles( c4_start.angles ); - level.player giveWeapon("g36c"); - level.player giveWeapon("m4_grenadier"); - level.player switchtoWeapon("m4_grenadier"); - - flag_set ( "spawn_frags" ); - //mp5 = spawn ( "weapon_mp5", c4_start.origin ); - - wait .1; - thread c4_Training(); -} - -c4_Training() -{ - flag_set ( "aa_c4" ); - level notify ( "explosivesTraining_begin" ); - autosave_by_name( "c4_training" ); - - pickupTrigger = flag_trigger_init( "explosives_pickup", getEnt( "c4_pickup", "targetname" ) ); - C4_models = getEntArray( pickupTrigger.target, "targetname" ); - - pickupTrigger setHintString (&"KILLHOUSE_C4_PICKUP"); - pickupTrigger trigger_on(); - for ( i = 0; i < C4_models.size; i++ ) - C4_models[ i ] show(); - - registerObjective( "obj_c4", &"KILLHOUSE_PICK_UP_THE_C4_EXPLOSIVE", pickupTrigger ); - setObjectiveState( "obj_c4", "current" ); - - //Come back around and pick up some C4 off the table. - level.newcastle thread execDialog( "c4offtable" ); - - //level.newcastle thread walk_to ( getnode ( "watch_c4_node", "script_noteworthy" ) ); - level.newcastle setgoalnode ( getnode ( "watch_c4_node", "script_noteworthy" ) ); - - thread keyHint( "swap_explosives" ); - - while ( !flag( "explosives_pickup" ) ) - wait ( 0.05 ); - - level.player playsound ( "detpack_pickup" ); - for ( i = 0; i < C4_models.size; i++ ) - C4_models[ i ] hide(); - pickupTrigger trigger_off(); - old_weapon = level.player GetCurrentWeapon (); - level.player giveWeapon("c4"); - level.player SetWeaponAmmoClip( "c4", 1 ); - level.player SetActionSlot( 2, "weapon" , "c4" ); - - thread C4_icon_hint(); - RefreshHudAmmoCounter(); - thread flag_when_c4_thrown(); - - wait .5; - - if ( !(level.player getCurrentWeapon() == "c4") ) - { - level.newcastle execDialog( "equipc4" ); //Equip the C4, Soap. - //thread keyHint( "equip_C4" ); - level notify ( "c4_equiped" ); - level.hintElem setText( &"KILLHOUSE_HINT_EQUIP_C4" ); - RefreshHudAmmoCounter(); - } - - while ( !(level.player getCurrentWeapon() == "c4") ) - { - wait ( 1.0 ); - } - - - flag_set ( "c4_equiped" ); - level.hintbackground destroy(); - double_line = true; - add_hint_background( double_line ); - level.hintElem setText( &"KILLHOUSE_HINT_HUD_CHANGES" ); - RefreshHudAmmoCounter(); - //thread hint( &"KILLHOUSE_HINT_HUD_CHANGES", 9999 ); - - //It seems my ex-wife was kind enough to donate her car to furthering your education Soap. - level.newcastle execDialog( "exwifecar" ); - - setObjectiveLocation( "obj_c4", getEnt( "c4_target", "targetname" ) ); - - level notify ( "C4_the_car" ); - - if ( !flag ( "c4_thrown" ) ) - level.newcastle execDialog( "throwc4car" ); //Throw some C4 on the car. - - if ( ( !flag ( "near_car" ) ) && ( !flag ( "c4_thrown" ) ) ) - { - //thread hint( &"KILLHOUSE_HINT_APPROACH_C4_THROW", 9999 ); - level.hintbackground destroy(); - add_hint_background(); - level.hintElem setText( &"KILLHOUSE_HINT_APPROACH_C4_THROW" ); - flag_wait ( "near_car" ); - } - - - if ( !flag ( "c4_thrown" ) ) - keyHint( "throw_C4" ); - - flag_wait ( "c4_thrown" ); - - wait .5; - - //Sgt Newcastle - When planting C4 is your objective, you will see a glowing marker in the world that indicates where to plant it. - //thread add_dialogue_line( "newcastle", "When planting C4 is your objective, you will see a glowing marker in the world that indicates where to plant it." ); - double_line = true; - thread hint( &"KILLHOUSE_C4_OBJECTIVE", 9999, double_line ); - wait 4; - - //Place the C4 on the indicated spot. - level.newcastle thread execDialog( "placec4" ); - - c4_target = getent( "c4_target", "targetname" ); - c4_target maps\_c4::c4_location( undefined, undefined, undefined, c4_target.origin ); - level thread do_in_order( ::waittill_msg, "c4_in_place", ::flag_set, "C4_planted" ); - - wait ( 1.0 ); - - setObjectiveString( "obj_c4", &"KILLHOUSE_PLANT_THE_C4_EXPLOSIVE" ); - setObjectiveLocation( "obj_c4", c4_target ); - //thread keyHint( "plant_explosives" ); - - flag_wait ( "C4_planted" ); - - c4_target thread force_detonation(); - - clear_hints(); - - setObjectiveState( "obj_c4", "done" ); - - //level.newcastle execDialog( "morec4" ); //Go get some more C4 from the table. - //level.newcastle execDialog( "behindwall" ); //Now come over here behind the safety wall. - - if( !flag( "car_destroyed" ) ) - level.newcastle execDialog( "safedistance" ); //Now get to a safe distance from the explosives. - - - while ( ( distance( c4_target.origin, level.player.origin ) <= 256 ) && !flag( "car_destroyed" ) ) - wait 0.05; - - if( !flag( "car_destroyed" ) ) - { - level.newcastle execDialog( "fireinhole" ); //Fire in the hole! - thread keyHint( "detonate_C4", 9999 ); - } - - flag_wait ( "car_destroyed" ); - thread switch_in_two( old_weapon ); - - clear_hints(); - - setObjectiveState( "obj_c4", "done" ); - - thread C4_complete_dialog(); - - level notify ( "explosivesTraining_end" ); - thread obstacle_Training(); - flag_clear ( "aa_c4" ); -} - -switch_in_two( old_weapon ) -{ - wait 2; - level.player SwitchToWeapon ( old_weapon ); -} - -force_detonation() -{ - self waittill ( "c4_detonation" ); - - wait .05; //destructable cars can only take damage from one source per frame - - car = getent ( "destructible", "targetname" ); - car destructible_force_explosion(); -} - -flag_when_c4_thrown() -{ - while (1) - { - level.player waittill ( "grenade_fire", grenade ); - - if (level.player getCurrentWeapon() == "c4") - { - flag_set ( "c4_thrown" ); - return; - } - } -} - - - -C4_complete_dialog() -{ - level.newcastle execDialog( "chuckle" ); //< satisfied chuckling > - level.newcastle execDialog( "muchimproved" ); //Much improved. - - if ( ! flag ( "start_obstacle" ) ) - level.newcastle execDialog( "passedeval" ); //All right Soap, you passed the weapons evaluation. - - if ( ! flag ( "start_obstacle" ) ) - level.newcastle execDialog( "reporttomac" ); //Now report to Mac on the obstacle course. - - if ( ! flag ( "start_obstacle" ) ) - level.newcastle execDialog( "thrilledtosee" ); //I�m sure he'll be thrilled to see you. - - //level.newcastle execDialog( "justbetween" ); //Just between you and me, he's a real arsehole. - //level.newcastle execDialog( "goodluck" ); //Good luck! -} - - -obstacle_start() -{ - - start_obstacle_course = getent( "start_obstacle_course", "targetname" ); - level.player setOrigin( start_obstacle_course.origin ); - level.player setPlayerAngles( start_obstacle_course.angles ); - level.player giveWeapon("g36c"); - level.player giveWeapon("m4_grenadier"); - level.player switchtoWeapon("m4_grenadier"); - - flag_set ( "spawn_frags" ); - - thread obstacle_Training(); -} - -obstacle_Training() -{ - flag_set ( "aa_obstacle" ); - level notify ( "obstacleTraining_start" ); - - registerObjective( "obj_obstacle", &"KILLHOUSE_RUN_THE_OBSTACLE_COURSE", getEnt( "obstacleTraining_objective", "targetname" ) ); - setObjectiveState( "obj_obstacle", "current" ); - - thread generic_compass_hint_reminder( "start_obstacle", 7 ); - - getEnt( "obstacle_course_start", "targetname" ) waittill ( "trigger" ); - - flag_set ( "start_obstacle" ); - - flag_trigger_init( "prone_entered", getEnt( "obstacleTraining_prone", "targetname" ) ); - thread obstacleTraining_buddies(); - - thread obstacleTraining_dialog(); - - flag_wait( "start_course" ); - - setObjectiveLocation( "obj_obstacle", getEnt( "obj_course_end", "targetname" ) ); - - move_mac_triggers = getentarray( "move_mac", "targetname" ); - array_thread( move_mac_triggers, ::move_mac ); - - getEnt( "obstacleTraining_mantle", "targetname" ) waittill ( "trigger" ); - thread keyHint( "mantle", 5.0 ); - - flag_wait( "obstacleTraining_crouch" ); - thread keyHint( "crouch" ); - - flag_wait( "obstacleTraining_mantle2" ); - thread keyHint( "mantle", 5.0 ); - - flag_wait( "prone_entered" ); - thread keyHint( "prone" ); - - getEnt( "obstacleTraining_Standup", "targetname" ) waittill ( "trigger" ); - thread keyHint( "stand", 5.0 ); - clear_hints_on_stand(); - - wait .1; - - //player must sprint - if ( level.xenon || getdvarint("gpad_style") == 0 )// ghetto but PS3 requires "Press X" and 360 requires "Click X" - keyHint( "sprint" ); - else - keyHint( "sprint_pc" ); - - flag_set ( "player_sprinted" ); - - if( !flag( "obstacle_course_end" ) ) - thread second_sprint_hint(); - - flag_wait( "obstacle_course_end" ); - level notify ( "kill_sprint_hint" ); - clear_hints(); - setObjectiveState( "obj_obstacle", "done" ); - - thread report_to_price(); - flag_clear ( "aa_obstacle" ); -} - - - -obstacleTraining_dialog() -{ - level endon( "obstacleTraining_end" ); - - //Wellll...it seems Miss Soap here was kind enough to join us! - level.mac execDialog( "misssoap" ); - - if( !flag( "start_course" ) ) - { - //Line up ladies! - level.mac execDialog( "lineup" ); - flag_set( "start_course" ); - } - - //iprintlnbold ( "go!" ); - //level.mac execDialog( "go" ); - level.mac playsound( "killhouse_mcm_go" ); - - flag_set( "start_course" ); - - //This isn't a bloody charity walk - get your arses in gear! MOVE! - level.mac execDialog( "isntcharitywalk" ); - - flag_wait( "obstacleTraining_mantle2" ); - - //Jump over those obstacles! - level.mac execDialog( "jumpobstacles" ); - - - //You thought it was going to easier once you passed Selection didn't you? Didn't you?!!! - //level.mac execDialog( "didntyou" ); - - flag_wait( "crawl_dialog" ); - - //You crawl like old people screw! - level.mac execDialog( "youcrawllike" ); - - //if( !flag( "obstacle_course_end" ) ) - //{ - //You're all too slow! You're all just too fucking slow!!! You'd be dead by now if this were the real thing! - //level.mac execDialog( "bedeadbynow" ); - //} - - if( !flag( "obstacle_course_end" ) ) - { - //I've seen "Sandhurst Commandos" run faster than you lot! - level.mac execDialog( "commandos" ); - } - - if( !flag( "obstacle_course_end" ) ) - { - //Move move move!!!! What's the matter with you? You all want to be R.T.U'd? - level.mac execDialog( "bertud" ); - } - - flag_wait ( "player_sprinted" ); - flag_wait( "obstacle_course_end" ); - - //Oi! Soap! Captain Price wants to see you in Hangar 4. You passed my little test, now get out of my sight. - level.mac execDialog( "passedtest" ); - - //The rest of you bloody ponces are going to run it again until I'm no longer embarassed to look at you! - level.mac execDialog( "runitagain" ); - - thread loop_obstacle(); -} - - - -reveal_start() -{ - start_reveal = getent( "start_reveal", "targetname" ); - level.player setOrigin( start_reveal.origin ); - level.player setPlayerAngles( start_reveal.angles ); - level.player giveWeapon("g36c"); - level.player giveWeapon("m4_grenadier"); - level.player switchtoWeapon("m4_grenadier"); - - thread report_to_price(); -} - -report_to_price() -{ - flag_set ( "aa_cargoship" ); - wait .1; - registerObjective( "obj_price", &"KILLHOUSE_REPORT_TO_CAPTAIN_PRICE", getEnt( "obj_price", "targetname" ) ); - setObjectiveState( "obj_price", "current" ); - - hangerdoor = getent ( "ship_hanger_door" , "targetname" ); - hangerdoor moveX( 40, .1, 0, 0 ); - - level.price gun_remove(); - - sas1 = getent ( "sas1" , "script_noteworthy" ); - sas2 = getent ( "sas2" , "script_noteworthy" ); - sas3 = getent ( "sas3" , "script_noteworthy" ); - - sas1.animname = "sas1"; - sas2.animname = "sas2"; - sas3.animname = "sas3"; - - SAS_blackkits = []; - SAS_blackkits [ SAS_blackkits.size ] = sas1; - SAS_blackkits [ SAS_blackkits.size ] = sas2; - SAS_blackkits [ SAS_blackkits.size ] = sas3; - - node = getent ( "reveal_node", "targetname" ); - node thread reveal_anims ( SAS_blackkits, sas2 ); - - delaythread ( 4, ::objective_hints, "reveal_dialog_starting" ); - //thread objective_hints( "open_ship_hanger" ); - //thread generic_compass_hint_reminder( "open_ship_hanger", 7 ); - - flag_set ( "obstacle_complete" ); - - - //node thread maps\_debug::drawOriginForever (); - - //node thread anim_reach_and_idle( SAS_blackkits, "reveal", "reveal_idle", "start_reveal_anim" ); - - - flag_wait ( "open_ship_hanger" ); - - thread do_in_order( ::flag_wait, "at_ladder", ::hint, &"KILLHOUSE_HINT_LADDER" ); - - //hangerdoor moveX( 150, 8, .3, 0 ); - hangerdoor moveX( 110, 8, .3, 0 ); - hangerdoor playsound ( "door_hanger_metal_open" ); - - - - flag_wait ( "on_ladder" ); - node notify ( "end_idle" ); - level.price animscripts\shared::placeWeaponOn( level.price.weapon, "right" ); - - //flag_wait ( "reveal_dialog_done" ); - - thread cargoship_training(); -} - - -reveal_anims( SAS_blackkits, sas2 ) -{ - looking_at_price = getent ( "looking_at_price", "targetname" ); - -// self thread anim_single( SAS_blackkits, "reveal" ); - self add_wait( ::anim_single, SAS_blackkits, "reveal" ); - level add_func( ::flag_set, "reveal_done" ); - thread do_wait(); - - - self add_wait( ::anim_single_solo, level.price, "reveal" ); - level add_func( ::flag_set, "price_reveal_done" ); - thread do_wait(); - - //self notify ( "start_reveal_anim" ); - wait 2; //make anims start faster - array_thread ( SAS_blackkits, ::pause_anim ); - level.price pause_anim(); - - flag_wait ( "open_ship_hanger" ); - - while ( ! level.player istouching ( looking_at_price ) ) - wait .1; - - array_thread ( SAS_blackkits, ::unpause_anim ); - level.price unpause_anim(); - - wait 3; - clear_hints(); - flag_set ( "reveal_dialog_starting" ); - - //thread reveal_dialog( sas2 ); - - //wait 2; - - clip = getent ( "ship_hanger_clip", "targetname" ); - clip delete(); - - flag_wait ( "reveal_done" ); - //self waittill ( "reveal" ); - - if ( !flag ( "on_ladder" ) ) - self thread anim_loop( SAS_blackkits, "reveal_idle", undefined, "end_idle"); - - flag_wait ( "price_reveal_done" ); - //self waittill ( "reveal" ); - - if ( !flag ( "on_ladder" ) ) - self thread anim_loop_solo( level.price, "reveal_idle", undefined, "end_idle"); -} - -reveal_dialog_ladder( param1 ) -{ - if ( !flag ( "at_ladder" ) ) - { - level.price playsound( "killhouse_pri_ladderthere" ); //Climb the ladder over there. - } - - setObjectiveString( "obj_price", &"KILLHOUSE_CLIMB_THE_LADDER1" ); - setObjectiveLocation( "obj_price", getent( "top_of_ladder_trigger", "targetname" ) ); - - flag_set ( "reveal_dialog_done" ); -} - - - -reveal_dialog( sas2 ) -{ - wait 1; - //It's the F.N.G. sir. - //sas2 execDialog ( "fng" ); //It's the fingy sir. - //sas2 execDialog ( "fingy" ); //It's the fingy sir. - - //Go easy on him sir, it's his first day in the Regiment. - //sas2 execDialog ( "goeasy" ); //It's the fingy sir. - - - /* - //Riight. What the hell kind of name is Soap? How'd a muppet like you pass Selection, eh? - level.price execDialog( "muppet" ); - - wait .3; - //"Soap, it's your turn for the CQB test. Everyone else head to observation." - level.price execDialog( "cbqtest" ); - - //"For this test, you'll have to run the cargoship solo in less than 60 seconds." - level.price execDialog( "runsolo" ); - - //"Gaz holds the current squadron record at 25 seconds. Good luck." - level.price execDialog( "record19sec" ); - */ -} - - - - - -cargoship_start() -{ - - start_pre_rope = getent( "start_pre_rope", "targetname" ); - level.player setOrigin( start_pre_rope.origin ); - level.player setPlayerAngles( start_pre_rope.angles ); - level.player giveWeapon("g36c"); - level.player giveWeapon("m4_grenadier"); - level.player switchtoWeapon("m4_grenadier"); - - registerObjective( "obj_price", &"KILLHOUSE_CLIMB_THE_LADDER", getEnt( "top_of_rope_trigger", "targetname" ) ); - setObjectiveState( "obj_price", "current" ); - - flag_set ( "reveal_dialog_done" ); - thread cargoship_training(); -} - -cargoship_training() -{ - level endon ( "clear_course" ); - level endon ( "mission failed" ); - cargoship_targets = getentarray( "cargoship_target", "script_noteworthy" ); - array_thread( cargoship_targets, ::cargoship_targets ); - thread rope(); - top_of_rope_trigger = getent( "top_of_rope_trigger", "targetname" ); - near_rope = getent( "near_rope", "targetname" ); - top_of_rope = getent( "top_of_rope", "targetname" ); - top_of_ladder_trigger = getent( "top_of_ladder_trigger", "targetname" ); - position_one = getent( "position_one", "targetname" ); - two = getent( "position_two", "targetname" ); - three = getent( "position_three", "targetname" ); - four = getent( "position_four", "targetname" ); - five = getent( "position_five", "targetname" ); - six = getent( "position_six", "targetname" ); - sprint = getent ( "sprint", "targetname" ); - final_obj = getent( "final_obj", "targetname" ); - setdvar( "killhouse_too_slow", "0" ); - - volume = getent( three.script_noteworthy, "targetname" ); - volume2 = getent( six.script_noteworthy, "targetname" ); - first_time = true; - previous_time = 0; - previous_selection = "none"; - - // Added 24.05.2023 (6:53 PM) - selection = undefined; - player_bestrecord = undefined; //i don't know which your record. - player_reach_record_gaz = false; //player not reach record Gaz. - - flash_volumes = getentarray ( "flash_volume", "script_noteworthy" ); - jump_off_trigger = getent ( "jump_off_trigger", "targetname" ); - - - flag_wait( "at_top_of_ladder" ); - clear_hints(); //remove ladder hint - thread autosave_by_name( "ladder_top" ); - jump_off_trigger thread jumpoff_monitor(); - - flag_wait ( "reveal_dialog_done" ); - - while ( 1 ) - { - if ( first_time ) - { - if ( ( !( level.player getCurrentWeapon() == "mp5" ) ) || ( level.player GetWeaponAmmoStock( "flash_grenade" ) < 4 ) ) - { - //"Pick up that MP5 and four flashbangs." ); - level.price thread execDialog( "pickupmp5" ); - setObjectiveString( "obj_price", &"KILLHOUSE_EQUIP_THE_MP5_AND_PICK" ); - setObjectiveLocation( "obj_price", getent( "obj_flashes", "targetname" ) ); - } - } - else - { - jump_off_trigger thread jumpoff_monitor(); - - //"Replace any flash bangs you used." - level.price execDialog( "replaceflash" ); - if ( !(level.player getCurrentWeapon() == "mp5") ) - { - //"Equip your MP5." - level.price execDialog( "equipmp5" ); - } - } - - nag_time = 0; - while ( !(level.player getCurrentWeapon() == "mp5") ) - { - if ( (level.player istouching ( near_rope ) ) && ( nag_time > 4 ) ) - { - //"Soap. Equip your MP5." ); - level.price thread execDialog( "soapequipmp5" ); - nag_time = 0; - } - wait ( 1.0 ); - nag_time++; - } - - nag_time = 0; - while ( level.player GetWeaponAmmoStock( "flash_grenade" ) < 4 ) - { - if ( (level.player istouching ( near_rope ) ) && ( nag_time > 4 ) ) - { - level.price thread execDialog( "soap4flash" ); - //"Soap. Pick up four flash bangs." ); - nag_time = 0; - } - wait ( 1.0 ); - nag_time++; - } - if ( first_time ) - flag_set ( "got_flashes" ); - - - thread flashbang_ammo_monitor ( flash_volumes ); - - if ( first_time ) - { - level.price execDialog( "ropedeck" ); //On my go, I want you to rope down to the deck and rush to position 1. - level.price execDialog( "stormstairs" ); //After that you will storm down the stairs to position 2. - level.price execDialog( "hit3and4" ); //Then hit position 3 and 4 following my precise instructions at each position. - } - - - //"Grab the rope when your ready." - level.price thread execDialog( "grabrope" ); - delaythread ( 1.5, ::rope_obj ); - - flag_set ( "activate_rope" ); - level notify ( "show_glowing_rope" ); - - thread autosave_by_name( "starting_bridge_attack" ); - - level waittill ( "starting_rope" ); - level notify ( "hide_glowing_rope" ); - flag_clear ( "activate_rope" ); - - level notify ( "okay_if_friendlies_in_line_of_fire" ); - level notify ( "starting_cargoship_obj" ); - setObjectiveString( "obj_price", &"KILLHOUSE_CLEAR_THE_CARGOSHIP_BRIDGE" ); - setObjectiveLocation( "obj_price", position_one ); - - level.price thread execDialog( "gogogo" ); //Go go go! - - if ( getdvarint( "killhouse_too_slow" ) >= 1 ) - thread startTimer( 120 ); - else - thread startTimer( 60 ); - - thread accuracy_bonus(); - if ( isdefined ( level.IW_deck ) ) - level.IW_deck destroy(); - - position_one wait_till_pos_cleared(); - - setObjectiveLocation( "obj_price", two ); - level.price thread execDialog( "position2" ); //Position 2 go! - - two wait_till_pos_cleared(); - - //level.price thread execDialog( "position3" ); //Go to Position 3! - setObjectiveLocation( "obj_price", three ); - - //three wait_till_pos_cleared(); - three thread flash_dialog_three( volume ); - three wait_till_flashed( volume ); - clear_hints(); - - level.price thread execDialog( "position4" ); //Position 4! - setObjectiveLocation( "obj_price", four ); - - four wait_till_pos_cleared(); - - setObjectiveLocation( "obj_price", five ); - //"Position five go!!" ); - level.price thread execDialog( "5go" ); - - five wait_till_pos_cleared(); - - setObjectiveLocation( "obj_price", six ); - //"Six go!!" ); - level.price thread execDialog( "6go" ); - - six thread flash_dialog_six( volume2 ); - six wait_till_flashed( volume2 ); - clear_hints(); - six wait_till_pos_cleared( "skip_trigger" ); - - - setObjectiveLocation( "obj_price", final_obj ); - //"Final position go!!" ); - level.price thread execDialog( "finalgo" ); - notify_on_sprint(); - thread flag_on_notify( "sprinted" ); - - flag_wait ( "sprint" ); - flag_set ( "ready_to_finish" ); - - //Sprint to the finish! - level.price thread execDialog( "sprint" ); - thread dialog_sprint_reminders(); - - //player must sprint - if ( level.xenon || getdvarint("gpad_style") == 0 )// ghetto but PS3 requires "Press X" and 360 requires "Click X" - thread keyHint( "sprint" ); - else - thread keyHint( "sprint_pc" ); - - flag_wait ( "sprinted" ); - - if( !flag( "at_finish" ) ) - thread second_sprint_hint(); - - - flag_wait( "at_finish" ); - level notify ( "kill_sprint_hint" ); - clear_hints(); - - flag_clear ( "ready_to_finish" ); - flag_clear ( "at_finish" ); - flag_clear( "at_top_of_ladder" ); - flag_clear ( "sprinted" ); - flag_clear ( "sprint" ); - - level notify ( "test_cleared" ); - if ( first_time ) - thread debrief(); - //flag_set ( "start_deck" ); - final_time = killTimer( 15.1, false ); - - if( !( maps\_cheat::is_cheating() ) && ! ( flag("has_cheated") ) ) - level.player UploadTime( 19, final_time );//19 is the leaderboard code for this level - - if ( player_reach_record_gaz == false ) - { - if( final_time < 19.0 ) - { - player_bestrecord = final_time; - selection = "newrecord"; - player_reach_record_gaz = true; - } - else - selection = dialog_end_of_course( first_time, final_time, previous_time, previous_selection ); - } - else if ( final_time < ( player_bestrecord ) && player_reach_record_gaz == true ) - { - player_bestrecord = final_time; - selection = "newrecord"; - } - else - selection = dialog_end_of_course( first_time, final_time, previous_time, previous_selection ); - - level.price execDialog( selection ); - - previous_selection = selection; - previous_time = final_time; - first_time = false; - - //"Climb up the ladder if you want another go." ); - level.price execDialog( "anothergo" ); - - //"Otherwise come over to the monitors for a debrief." ); - level.price execDialog( "debrief" ); - - clear_hints(); - setObjectiveState( "obj_price", "done" ); - - flag_wait( "at_top_of_ladder" ); - //top_of_ladder_trigger waittill ( "trigger" ); - } -} - - -dialog_end_of_course( first_time, final_time, previous_time, previous_selection ) -{ - if ( ! first_time ) - { - if ( ( previous_time + 2 ) < final_time ) - { - if ( ( randomint ( 2 ) ) > 0 ) - { - //Don't waste our time Soap. The idea is to take less time, not more. - selection = ( "lesstime" ); - return selection; - } - else - { - //You're getting' slower. Perhaps it was a mistake to let you skip the obstacle course. - selection = ( "letyouskip" ); - return selection; - } - } - - if ( previous_time > ( final_time + 3 ) ) - { - if ( ( randomint ( 2 ) ) > 0 ) - { - //That was an improvement, but it's not hard to improve on garbage. Try it again. - selection = ( "tryitagain" ); - return selection; - } - else - { - //That was better. Not great. But better. - selection = ( "notgreat" ); - return selection; - } - } - - if ( ( level.bonus_time < 1.8 ) && ( previous_selection != "sloppy" ) ) - { - //Fast, but sloppy. You need to work on your accuracy. - selection = ( "sloppy" ); - return selection; - } - } - - num = randomint ( 2 ); - if ( num == 0 ) - { - //All right Soap, that's enough. You'll do. - selection = ( "youlldo" ); - return selection; - } - //else if ( num == 1 ) - //{ - //I've seen better, but that'll do. - // selection = ( "seenbetter2" ); - // return selection; - //} - else - { - //"Pretty good, Soap. But I've seen better." ); - selection = "seenbetter"; - return selection; - } -} - - -flag_on_notify( msg ) -{ - level.player waittill ( msg ); - flag_set ( msg ); -} - -notify_on_sprint() -{ - level.player NotifyOnCommand ( "sprinted", "+breath_sprint" ); - level.player NotifyOnCommand ( "sprinted", "+sprint" ); -} - -movies_on_tvs() -{ - wait 2; - setsaveddvar( "cg_cinematicFullScreen", "0" ); - - for ( ;; ) - { - if ( getdvar("ps3Game") == "true" ) - CinematicInGameLoopFromFastfile( "Killhouse_monitor1" ); - else - CinematicInGameLoopResident( "Killhouse_monitor1" ); - -// THE KILLHOUSE VIDEO FILE IS BROKEN AND WON'T LOOP - wait 6; - -// wait 5; - -// while ( IsCinematicPlaying() ) -// wait 1; - } -} - -debrief_start() -{ - start_pre_rope = getent( "start_pre_rope", "targetname" ); - level.player setOrigin( start_pre_rope.origin ); - level.player setPlayerAngles( start_pre_rope.angles ); - level.player giveWeapon("g36c"); - level.player giveWeapon("m4_grenadier"); - level.player switchtoWeapon("m4_grenadier"); - - - flag_set ( "reveal_dialog_done" ); - thread debrief(); -} - - -debrief() -{ - thread movies_on_tvs(); - - debrief_trigger = getent( "debrief_trigger", "targetname" ); - registerObjective( "obj_debrief", &"KILLHOUSE_DEBRIEF_WITH_CPT_PRICE", debrief_trigger ); - setObjectiveState( "obj_debrief", "current" ); - - debrief_trigger waittill ( "trigger" ); - - //thread autosave_by_name ( "debrief" ); - thread fail_if_friendlies_in_line_of_fire(); - clear_timer_elems(); - clear_hints(); - level notify ( "kill_timer" ); - level notify ( "clear_course" ); - flag_clear ( "aa_cargoship" ); - setObjectiveState( "obj_debrief", "done" ); - //Good job Soap. It appears you may have earned that winged dagger after all. Now get ready to deploy for the cargoship operation. We go 'wheels up' in twenty minutes. - level.price execDialog( "wheelsup" ); - - // --- menu popup for difficulty selection --- - level.player openMenu("select_difficulty"); - level.player freezecontrols(true); - setblur(2, .1); - - while( true ) - { - level.player waittill("menuresponse", menu, response); - if( response == "continue" || response == "tryagain" ) - break; - - level.player openMenu("select_difficulty"); - } - assertex( response == "continue" || response == "tryagain", "Menu response from Killhouse difficulty selection is incorrect!" ); - - setblur(0, .2); - level.player freezecontrols(false); - - level notify ( "okay_if_friendlies_in_line_of_fire" ); - - if( response == "tryagain" ) - { - setDvar("ui_deadquote", &"KILLHOUSE_SHIP_TRY_AGAIN"); - maps\_utility::missionFailedWrapper(); - } - // --- - - wait 1; - nextmission(); -} - -music_control() -{ - flag_wait ( "open_ship_hanger" ); - - thread music_killhouse_price(); - flag_wait ( "activate_rope" ); - - musicstop( 3 ); -} - -music_killhouse_price() -{ - MusicPlayWrapper( "killhouse_price" ); -} \ No newline at end of file diff --git a/iw3sp_mod_ff_src/raw/maps/killhouse_code.gsc b/iw3sp_mod_ff_src/raw/maps/killhouse_code.gsc deleted file mode 100644 index 705b7cd..0000000 --- a/iw3sp_mod_ff_src/raw/maps/killhouse_code.gsc +++ /dev/null @@ -1,2658 +0,0 @@ -#include common_scripts\utility; -#include maps\_utility; -#include maps\_anim; -#include maps\_debug; -#include maps\killhouse; -#include maps\killhouse_anim; -#include maps\_hud_util; - - - -new_look_training_setup() -{ - aim_down_target = getEnt( "aim_down_target", "targetname" ); - aim_up_target = getEnt( "aim_up_target", "targetname" ); - - aim_down_target rotateto ( aim_down_target.angles + (0,0,-90), .25, 0, 0 ); - aim_up_target rotateto ( aim_down_target.angles + (0,0,90), .25, 0, 0 ); - -} -new_look_wait_for_target( up, down) -{ - self setCanDamage( true ); - self rotateto ( self.angles + (0,0,up), .25, 0, 0 ); - self playSound( "killhouse_target_up" ); - - while ( 1 ) - { - self waittill ( "damage", amount, attacker, direction_vec, point, cause ); - if ( isADS() ) - break; - else - { - if ( level.Xenon || getdvarint("gpad_style") == 0 ) - thread keyHint( "ads_360" ); - else - thread keyHint( "ads" ); - } - } - - self playSound( "killhouse_buzzer" ); - self playSound( "killhouse_target_up" ); - self rotateto ( self.angles + (0,0,down), .25, 0, 0 ); -} - -rope_obj() -{ - level endon ( "starting_cargoship_obj" ); - setObjectiveString( "obj_price", &"KILLHOUSE_SLIDE_DOWN_THE_ROPE" ); - top_of_rope = getent( "top_of_rope", "targetname" ); - setObjectiveLocation( "obj_price", top_of_rope ); -} - -level_scripted_unloadnode() -{ - while(1) - { - self waittill ("trigger",helicopter ); - helicopter vehicle_detachfrompath(); - helicopter setspeed( 20,20 ); - helicopter vehicle_land(); - //helicopter notify ("unload"); - //helicopter waittill ("unloaded"); - //ai = getnonridingai(); - //helicopter thread maps\_vehicle::vehicle_load_ai( ai ); // -Nate. I changed this comment just incase you decide to enable uncomment. - //helicopter notify ("load",ai); - //helicopter waittill ("loaded"); - wait 10; - helicopter vehicle_resumepath(); - } -} - - - - -ambient_trucks() -{ - trigger = getent ( "se_truck_trigger", "targetname" ); - while ( 1 ) - { - //trigger notify ( "trigger" ); - group = randomint( 8 ); - vehicles = maps\_vehicle::create_vehicle_from_spawngroup_and_gopath( group ); - for ( i = 0; i < vehicles.size; i++ ) - { - speed = randomintrange ( 30, 50 ); - vehicles [ i ] setspeed ( speed, 30, 30 ); - } - wait ( randomintrange ( 3, 6 ) ); - } -} - -delay_objective_after_intro() -{ - registerObjective( "obj_rifle", &"KILLHOUSE_PICK_UP_A_RIFLE_FROM", getEnt( "obj_rifle_ammo", "targetname" ) ); - wait 3; - setObjectiveState( "obj_rifle", "current" ); -} - -waters_think() -{ - level.waters = getent("waters", "script_noteworthy"); - assert( isDefined( level.waters ) ); - level.waters.animname = "gaz"; - level.waters.disablearrivals = true; - level.waters.disableexits = true; - level.waters.lastSpeakTime = 0; - level.waters.lastNagTime = 0; - level.waters.speaking = false; - //level.waters pushplayer( true ); -} - -newcastle_think() -{ - flag_wait ( "spawn_frags" ); - - spawner = getent("nwc", "script_noteworthy"); - assert( isDefined( spawner ) ); - - level.newcastle = spawner spawn_ai(); - - level.newcastle.animname = "nwc"; - level.newcastle.disablearrivals = true; - level.newcastle.disableexits = true; - level.newcastle.lastSpeakTime = 0; - level.newcastle.lastNagTime = 0; - level.newcastle.speaking = false; - //level.newcastle pushplayer( true ); -} - -mac_think() -{ - level.mac = getent("mac", "script_noteworthy"); - assert( isDefined( level.mac ) ); - level.mac.animname = "mac"; - level.mac.disablearrivals = true; - level.mac.disableexits = true; - level.mac.lastSpeakTime = 0; - level.mac.lastNagTime = 0; - level.mac.speaking = false; - //level.mac pushplayer( true ); -} - -price_think() -{ - level.price = getent("price", "script_noteworthy"); - assert( isDefined( level.price ) ); - level.price.animname = "price"; - level.price.disablearrivals = true; - level.price.disableexits = true; - level.price.lastSpeakTime = 0; - level.price.lastNagTime = 0; - level.price.speaking = false; - level.price pushplayer( true ); -} - - -clear_hints_on_flag( msg ) -{ - flag_wait ( msg ); - clear_hints(); -} - -generic_compass_hint_reminder( msg, time ) -{ - thread clear_hints_on_flag( msg ); - level endon ( msg ); - wait time; - - compass_hint(); - - wait 2; - - timePassed = 6; - for ( ;; ) - { - if ( timePassed > 20.0 ) - { - thread compass_reminder(); - RefreshHudCompass(); - timePassed = 0; - } - timePassed += 0.05; - wait ( 0.05 ); - } -} - - -objective_hints( completion_flag ) -{ - level endon ( "mission failed" ); - level endon ( "navigationTraining_end" ); - level endon ( "reveal_dialog_starting" ); - - compass_hint(); - - wait 2; - - if ( level.Console || getdvarint("gpad_in_use") ) - { - if ( level.Xenon /*|| getdvarint("gpad_style") == 0*/ ) - keyHint( "objectives", 6.0); - else - hint( &"KILLHOUSE_HINT_CHECK_OBJECTIVES_SCORES_PS3", 6 ); - } - else - { - keyHint( "objectives_pc", 6.0); - } - - //level.marine1.lastNagTime = getTime(); - timePassed = 16; - for ( ;; ) - { - //if( distance( level.player.origin, level.marine1.origin ) < 512 ) - // level.marine1 nagPlayer( "squadwaiting", 15.0 ); - - if ( !flag( completion_flag ) && timePassed > 20.0 ) - { - //hint( &"KILLHOUSE_HINT_OBJECTIVE_REMINDER", 6.0 ); - thread compass_reminder(); - RefreshHudCompass(); - //wait( 0.5 ); - //thread hint( &"KILLHOUSE_HINT_OBJECTIVE_REMINDER2", 10.0 ); - timePassed = 0; - } - - timePassed += 0.05; - wait ( 0.05 ); - } -} - -add_hint_background( double_line ) -{ - if ( isdefined ( double_line ) ) - level.hintbackground = createIcon( "popmenu_bg", 650, 50 ); - else - level.hintbackground = createIcon( "popmenu_bg", 650, 30 ); - level.hintbackground.hidewheninmenu = true; - level.hintbackground setPoint( "TOP", undefined, 0, 105 ); - level.hintbackground.alpha = .5; - level.hintbackground.sort = 0; -} - -compass_hint( text, timeOut ) -{ - if ( getdvar( "chaplincheat" ) == "1" ) - return; - - clear_hints(); - level endon ( "clearing_hints" ); - - double_line = true; - 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( &"KILLHOUSE_HINT_OBJECTIVE_MARKER" ); - - level.iconElem = createIcon( "objective", 32, 32 ); - level.iconElem.hidewheninmenu = true; - //level.iconElem setPoint( "CENTER", "CENTER", 0, -60 ); - level.iconElem setPoint( "TOP", undefined, 0, 155 ); - - wait 5; - - level.iconElem setPoint( "CENTER", "BOTTOM", 0, -20, 1.0 ); - - level.iconElem scaleovertime(1, 20, 20); - - wait .85; - level.iconElem fadeovertime(.15); - level.iconElem.alpha = 0; - - wait .5; - level.hintElem fadeovertime(.5); - level.hintElem.alpha = 0; - - clear_hints(); -} - -compass_reminder() -{ - if ( getdvar( "chaplincheat" ) == "1" ) - return; - - clear_hints(); - level endon ( "clearing_hints" ); - - double_line = true; - 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( &"KILLHOUSE_HINT_OBJECTIVE_REMINDER" ); - - - level.iconElem = createIcon( "objective", 32, 32 ); - level.iconElem.hidewheninmenu = true; - //level.iconElem setPoint( "CENTER", "CENTER", 0, -60 ); - level.iconElem setPoint( "TOP", undefined, 0, 155 ); - - wait 5; - //setObjectiveLocation( "obj_enter_range", getEnt( "rifle_range_obj", "targetname" ) ); - - level.iconElem setPoint( "CENTER", "BOTTOM", 0, -20, 1.0 ); - - level.iconElem scaleovertime(1, 20, 20); - - wait .85; - level.iconElem fadeovertime(.15); - level.iconElem.alpha = 0; - - wait 2; - level.hintElem fadeovertime(.5); - level.hintElem.alpha = 0; - - clear_hints(); -} - - -move_gaz_once_player_past() -{ - flag_wait ( "past_gaz" ); - //level.waters walk_to ( getnode ( "stationone_node", "script_noteworthy" ) ); - temp = getnode ( "stationone_node", "script_noteworthy" ); - node = spawn( "script_origin", temp.origin + (0,12,0) ); - node.angles = temp.angles; - - level.waters.ref_node = node; - node anim_generic_reach_and_arrive( level.waters, "killhouse_gaz_idle_arrive" ); - - level.waters.ref_node thread anim_loop_solo( level.waters, "killhouse_gaz_idleB", undefined, "stop_loop" ); - flag_set( "gaz_in_idle_position" ); -} - -move_gaz_fake() -{ - temp = getnode ( "stationone_node", "script_noteworthy" ); - node = spawn( "script_origin", temp.origin + (0,12,0) ); - node.angles = temp.angles; - - level.waters.ref_node = node; - level.waters.ref_node thread anim_loop_solo( level.waters, "killhouse_gaz_idleB", undefined, "stop_loop" ); - flag_set( "gaz_in_idle_position" ); -} - - -fail_on_damage() -{ - while ( 1 ) - { - self waittill ( "damage", damage, attacker, parm1, parm2, damageType ); - if ( attacker == level.player ) - maps\_friendlyfire::missionfail(); - } -} - -fail_if_friendlies_in_line_of_fire() -{ - grenade = true; - flash = true; - level endon ( "okay_if_friendlies_in_line_of_fire" ); - while ( true ) - { - msg = level.player waittill_any_return( "weapon_fired", "player_flash", "player_frag" ); - if ( !isdefined(msg) ) - break; - if ( msg == "weapon_fired" ) - { - weap = level.player getCurrentWeapon(); - //ignore if melee - - if ( weap == "c4" ) - continue; - } - if ( msg == "player_frag" && isdefined( grenade ) ) - { - if ( ! level.player isthrowinggrenade() ) - continue;//no ammo - wait 1; - //continue; - } - if ( msg == "player_flash" && isdefined( flash ) ) - { - if ( ! level.player isthrowinggrenade() ) - continue; - wait 1; - //continue; - } - - allies = getaiarray( "allies" ); - for ( i = 0; i < allies.size; i++ ) - { - qBool = within_fov( level.player.origin, level.player.angles, allies[ i ].origin, cos( 25 ) ); - dist = distance ( level.player.origin, allies[ i ].origin ); - if ( ( qBool ) && ( dist < 1000 ) ) - { - level notify ( "mission failed" ); - setDvar("ui_deadquote", &"KILLHOUSE_FIRED_NEAR_FRIENDLY"); - maps\_utility::missionFailedWrapper(); - } - } - } -} - - -setup_player_action_notifies() -{ - wait 1; -// level.player notifyOnCommand( "player_gun", "+attack" ); - level.player notifyOnCommand( "player_frag", "+frag" ); - level.player notifyOnCommand( "player_flash", "-smoke" ); -} - - -vision_trigger( vision_file ) -{ - while ( 1 ) - { - self waittill ( "trigger" ); - set_vision_set( vision_file, 1 ); - while ( level.player istouching ( self ) ) - wait .1; - } -} - - -flashed_hud_elem() -{ - while ( 1 ) - { - if ( level.player isFlashed() ) - level notify ( "flashed" ); - else - level notify ( "not_flashed" ); - - wait .2; - } -} - -flashed_debug() -{ - while ( 1 ) - { - level waittill ( "flashed" ); - flashed = maps\_hud_util::get_countdown_hud(); - - flashed.y = 130; - - flashed setText( &"KILLHOUSE_YOUR_TIME" ); - //flashed.label = &"KILLHOUSE_YOUR_TIME"; - - level waittill ( "not_flashed" ); - flashed destroy(); - } -} - -flag_when_lowered( flag ) -{ - level.targets_hit = 0; - targetDummies = getTargetDummies( "rifle" ); - numRaised = targetDummies.size; - while ( level.targets_hit < numRaised ) - wait ( 0.05 ); - - flag_set ( flag ); -} - - -ADS_shoot_dialog() -{ - wait .4; - - if ( !flag( "ADS_targets_shot" ) ) - { - if( level.Console || getdvarint("gpad_in_use")) - thread keyHint( "attack" ); - else - thread keyHint( "pc_attack" ); - - //Now. Shoot - each - target, while aiming down the sights. - level.waters execDialog( "shooteachtarget" ); - } - - flag_set( "ADS_shoot_dialog" ); -} - - - -deck_start() -{ - deck_start = getent( "deck_start", "targetname" ); - level.player setOrigin( deck_start.origin ); - level.player setPlayerAngles( deck_start.angles ); - level.player giveWeapon("g36c"); - level.player giveWeapon("mp5"); - level.player switchtoWeapon("mp5"); - - flag_set ( "start_deck" ); -} - - - -deck_training() -{ - deck_targets = getentarray( "deck_target", "script_noteworthy" ); - array_thread( deck_targets, ::cargoship_targets ); - - flag_wait ( "start_deck" ); - registerObjective( "obj_deck", &"KILLHOUSE_COMPLETE_THE_DECK_MOCKUP", getent( "area_two_one", "targetname" ) ); - setObjectiveState( "obj_deck", "current" ); - - one = getent( "area_two_one", "targetname" ); - two = getent( "area_two_two", "targetname" ); - three = getent( "area_two_three", "targetname" ); - four = getent( "area_two_four", "targetname" ); - five = getent( "area_two_five", "targetname" ); - finish = getent( "area_two_finish", "targetname" ); - first_time = true; - - while ( 1 ) - { - one waittill ( "trigger" ); - thread add_dialogue_line( "price", "Get ready..." ); - wait 2; - thread add_dialogue_line( "price", "Go go go!!" ); - thread accuracy_bonus(); - thread startTimer( 60 ); - if ( isdefined ( level.IW_best ) ) - level.IW_best destroy(); - thread autosave_by_name( "starting_deck_attack" ); - - one pop_up_and_wait(); - level.price thread execDialog( "position2" ); //Position 2 go! - setObjectiveLocation( "obj_deck", two ); - two pop_up_and_wait(); - level.price thread execDialog( "position3" ); //Go to Position 3! - setObjectiveLocation( "obj_deck", three ); - three pop_up_and_wait(); - level.price thread execDialog( "position4" ); //Position 4! - setObjectiveLocation( "obj_deck", four ); - four pop_up_and_wait(); - thread add_dialogue_line( "price", "Position five go!!" ); - setObjectiveLocation( "obj_deck", five ); - five pop_up_and_wait(); - thread add_dialogue_line( "price", "Final position go!!" ); - setObjectiveLocation( "obj_deck", finish ); - - finish waittill ( "trigger" ); - - level notify ( "test_cleared" ); - killTimer( 15.85, true ); - setObjectiveState( "obj_deck", "done" ); - thread add_dialogue_line( "price", "Not bad, but not that good either." ); - thread add_dialogue_line( "price", "Go back to position one if you want try for a better time." ); - thread add_dialogue_line( "price", "Otherwise come over to the monitors for a debrief." ); - - if ( first_time ) - thread debrief(); - first_time = false; - } -} - - -get_randomized_targets() -{ - tokens = strtok( self.script_linkto, " " ); - targets = []; - for ( i=0; i < tokens.size; i++ ) - { - token = tokens[ i ]; - target = getent( token, "script_linkname" ); - if ( isdefined( target ) ) - { - targets = add_to_array( targets, target ); - continue; - } - } - targets = array_randomize( targets ); - return targets; -} - -pop_up_and_wait() -{ - self waittill ( "trigger" ); - - deck_targets = self get_randomized_targets(); - - targets_needed = 0; - level.targets_hit = 0; - friendlies_up = []; - j = 0; - - for ( i = 0; targets_needed < 3; i++ ) - { - wait randomfloatrange (.25, .4); - deck_targets[ i ] notify ( "pop_up" ); - if ( deck_targets[ i ].targetname == "hostile" ) - targets_needed++; - else - { - friendlies_up[ j ] = deck_targets[ i ]; - j++; - } - } - - //level.price thread execDialog( "hittargets" ); //Hit the targets! - - while ( level.targets_hit != targets_needed ) - wait ( .05 ); - - if ( friendlies_up.size > 0 ) - { - for ( k = 0; k < friendlies_up.size; k++ ) - friendlies_up[ k ] notify ( "pop_down" ); - } -} - - -jumpoff_monitor() -{ - level endon ( "starting_rope" ); - self waittill ( "trigger" ); - - level notify ( "mission failed" ); - if ( flag ( "activate_rope" ) ) - setDvar("ui_deadquote", &"KILLHOUSE_SHIP_JUMPED_OFF"); - else - setDvar("ui_deadquote", &"KILLHOUSE_SHIP_JUMPED_TOO_EARLY"); - maps\_utility::missionFailedWrapper(); -} - -flashbang_ammo_monitor ( flash_volumes ) -{ - level endon ( "test_cleared" ); - level.volumes_flashed = 0; - - while ( 1 ) - { - level.player waittill ( "grenade_fire", grenade, weaponName ); - - grenade waittill ( "death" ); - waittillframeend; - - flashes_needed = flash_volumes.size - level.volumes_flashed; - if ( ( level.player GetWeaponAmmoStock( "flash_grenade" ) ) < flashes_needed ) - { - level notify ( "mission failed" ); - setDvar("ui_deadquote", &"KILLHOUSE_SHIP_OUT_OF_FLASH"); - maps\_utility::missionFailedWrapper(); - } - } -} - - -check_if_in_volume( tracker, volume ) -{ - self waittill ( "death" ); - if ( tracker istouching ( volume ) ) - { - volume notify ( "flashed" ); - level.volumes_flashed++; - } -} - -track_grenade_origin( tracker, volume ) -{ - self endon ( "death" ); - volume endon ( "flashed" ); - while ( 1 ) - { - tracker.origin = self.origin; - wait .05; - } -} - -flash_dialog_three( volume ) -{ - level endon ( "clear_course" ); - - volume endon ( "flashed" ); - self waittill ( "trigger" ); - say_first_dialog = true; - - while( 1 ) - { - if ( ! ( level.player istouching ( self ) ) ) - { - if ( say_first_dialog ) - { - level.price thread execDialog( "3" ); //3 - level.price thread execDialog( "goback" ); //Go back! - say_first_dialog = false; - } - else - { - level.price thread execDialog( "position3" ); //go to 3 - //level.price thread execDialog( "followarrows" ); //Follow the arrows on the floor. - say_first_dialog = true; - } - } - else - { - level.price thread execDialog( "flashthrudoor" ); //Flashbang through the door! - thread keyHint( "flash" ); - } - //thread add_dialogue_line( "price", "Flash the room!!" ); - wait 5; - } -} - -flash_dialog_six( volume ) -{ - level endon ( "clear_course" ); - - volume endon ( "flashed" ); - self waittill ( "trigger" ); - say_first_dialog = true; - - while( 1 ) - { - if ( ! ( level.player istouching ( self ) ) ) - { - if ( say_first_dialog ) - { - level.price thread execDialog( "goback" ); //Go back! - say_first_dialog = false; - } - else - { - level.price thread execDialog( "6go" ); //Six go! - say_first_dialog = true; - } - } - else - { - level.price thread execDialog( "flashthrudoor" ); //Flashbang through the door! - thread keyHint( "flash" ); - } - //thread add_dialogue_line( "price", "Flash the room!!" ); - wait 5; - } -} - - -wait_till_flashed( volume ) -{ - volume endon ( "flashed" ); - assert ( isdefined ( volume ) ); - - - while ( 1 ) - { - level.player waittill ( "grenade_fire", grenade, weaponName ); - if ( weaponname == "flash_grenade" ) - { - tracker = spawn ("script_origin", (0,0,0)); - grenade thread track_grenade_origin( tracker, volume ); - grenade thread check_if_in_volume( tracker, volume ); - } - } -} - - -wait_till_pos_cleared( skip_trigger ) -{ - level endon ( "clear_course" ); - - if ( !isdefined ( skip_trigger ) ) - self waittill ( "trigger" ); - - level.targets_hit = 0; - if ( isdefined ( self.target ) ) - { - targets = getentarray( self.target, "targetname" ); - - for ( i = 0; i < targets.size; i++ ) - targets[ i ] notify ( "pop_up" ); - - level.price thread execDialog( "hittargets" ); //Hit the targets! - time_waited = 0; - - while ( level.targets_hit != targets.size ) - { - if ( time_waited > 5 ) - { - if ( ! level.player istouching ( self ) ) - { - go_back = []; - go_back[ 0 ] = "missgoback"; - go_back[ 1 ] = "passgoback"; - go_back[ 2 ] = "goback"; - - selection = go_back[ randomint( go_back.size ) ]; - - level.price thread execDialog( selection ); - time_waited = 0; - } - else - { - if ( level.targets_hit > 0 ) - { - dialog = []; - dialog[ 0 ] = "shoottarget"; - dialog[ 1 ] = "remainingtarg"; - dialog[ 2 ] = "hitother"; - - selection = dialog[ randomint( dialog.size ) ]; - - level.price thread execDialog( selection ); - - //thread add_dialogue_line( "price", "Shoot the other target." ); - //thread add_dialogue_line( "price", "Shoot the remaining targets." ); - //thread add_dialogue_line( "price", "Hit other targets." ); - } - else - { - level.price thread execDialog( "hittargets" ); //Hit the targets! - } - - time_waited = 0; - } - } - time_waited += 0.05; - wait ( .05 ); - } - } - return; -} - - - -rope() -{ - top_of_rope_trigger = getent( "top_of_rope_trigger", "targetname" ); - top_of_rope_trigger trigger_off(); - top_of_rope = getent( "top_of_rope", "targetname" ); - bottom_of_rope = getent( "bottom_of_rope", "targetname" ); - - while ( 1 ) - { - - flag_wait ( "activate_rope" ); - - top_of_rope_trigger trigger_on(); - top_of_rope_trigger setHintString (&"KILLHOUSE_USE_ROPE"); - - top_of_rope_trigger waittill ( "trigger" ); - level notify ( "starting_rope" ); - level.player DisableWeapons(); - - tag_origin = spawn("script_model", top_of_rope.origin + (0,0,-60) ); - tag_origin.angles = top_of_rope.angles; - tag_origin setmodel("tag_origin"); - - //lerp_player_view_to_tag( tag, lerptime, fraction, right_arc, left_arc, top_arc, bottom_arc ) - tag_origin lerp_player_view_to_tag( "tag_origin", .2, .2, 45, 45, 30, 30 ); - - rope_time = 1.5; - tag_origin moveto ( bottom_of_rope.origin + (0,0,-60), rope_time, 1, .2 ); - wait rope_time; - tag_origin delete(); - - level.player EnableWeapons(); - top_of_rope_trigger trigger_off(); - } -} - - - -fail_if_damage_waiter() -{ - self endon ( "pop_down" ); - self waittill ( "damage", amount, attacker, direction_vec, point, cause ); - - setDvar("ui_deadquote", &"KILLHOUSE_HIT_FRIENDLY"); - maps\_utility::missionFailedWrapper(); -} - -// ****** Get the timer started ****** // -startTimer( timelimit ) -{ -// destroy any previous timer just in case ****** // - - clear_timer_elems(); - -// destroy timer and thread if objectives completed within limit ****** // - level endon ( "kill_timer" ); - - level.hudTimerIndex = 20; - - level.start_time = gettime(); -// Timer size and positioning ****** // - level.timer = maps\_hud_util::get_countdown_hud(); - level.timer.label = &"KILLHOUSE_YOUR_TIME"; - level.timer settenthstimerUp( .05 ); - -// Wait until timer expired - wait ( timelimit ); - //flag_set ( "timer_expired" ); - -// Get rid of HUD element and fail the mission - level.timer destroy(); - - level thread mission_failed_out_of_time(); -} - -dialog_sprint_reminders() -{ - level endon ( "sprinted" ); - - while ( 1 ) - { - wait 8; - level.price thread execDialog( "sprint" ); - //thread add_dialogue_line( "price", "Sprint to the finish!" );//new - } -} - -mission_failed_out_of_time() -{ - level.player endon ( "death" ); - level endon ( "kill_timer" ); - - dialog = []; - dialog[ 0 ] = "startover"; // - dialog[ 1 ] = "doitagain"; // - dialog[ 2 ] = "tooslow"; // - - selection = dialog[ randomint( dialog.size ) ]; - - level.price thread execDialog( selection ); - - - failures = getdvarint( "killhouse_too_slow" ); - setdvar( "killhouse_too_slow", ( failures + 1 ) ); - - level notify ( "mission failed" ); - if( !flag( "at_finish" ) ) - setDvar("ui_deadquote", &"KILLHOUSE_SHIP_TOO_SLOW"); - else - setDvar("ui_deadquote", &"KILLHOUSE_SHIP_DIDNT_SPRINT"); - - maps\_utility::missionFailedWrapper(); -} - -clear_timer_elems() -{ - if (isdefined (level.timer)) - level.timer destroy(); - if (isdefined (level.bonus)) - level.bonus destroy(); - if (isdefined (level.label)) - level.label destroy(); - if (isdefined (level.IW_best) ) - level.IW_best destroy(); - if (isdefined (level.recommended_label) ) - level.recommended_label destroy(); - if (isdefined (level.recommended_label2) ) - level.recommended_label2 destroy(); - if (isdefined (level.recommended) ) - level.recommended destroy(); -} - -killTimer( best_time, deck ) -{ - level notify ( "kill_timer" ); - clear_timer_elems(); - - time = ( ( gettime() - level.start_time ) / 1000 ); - level.timer = maps\_hud_util::get_countdown_hud(); - level.timer.label = &"KILLHOUSE_YOUR_FINAL_TIME"; - - level waittill ( "accuracy_bonus" ); - final_time = time - level.bonus_time; - //iprintlnbold ( "time: " + time ); - level.timer setValue ( final_time ); - - level.IW_best = maps\_hud_util::get_countdown_hud(); - level.IW_best.y = 115; - level.IW_best.label = &"KILLHOUSE_IW_BEST_TIME"; - level.IW_best setValue ( best_time ); - - level.recommended_label = maps\_hud_util::get_countdown_hud(); - level.recommended_label.label = &"KILLHOUSE_RECOMMENDED_LABEL"; - level.recommended_label.y = 145; - - level.recommended_label2 = maps\_hud_util::get_countdown_hud(); - level.recommended_label2.label = &"KILLHOUSE_RECOMMENDED_LABEL2"; - level.recommended_label2.y = 160; - - level.recommended = maps\_hud_util::get_countdown_hud(); - level.recommended.y = 180; - - if ( final_time > 40 ) - { - setdvar ( "recommended_gameskill", "0" ); - level.recommended.label = &"KILLHOUSE_RECOMMENDED_EASY"; - } - else if ( final_time > 26 ) - { - setdvar ( "recommended_gameskill", "1" ); - level.recommended.label = &"KILLHOUSE_RECOMMENDED_NORMAL"; - } - else if ( final_time > 20 ) - { - setdvar ( "recommended_gameskill", "2" ); - level.recommended.label = &"KILLHOUSE_RECOMMENDED_HARD"; - } - else - { - setdvar ( "recommended_gameskill", "3" ); - level.recommended.label = &"KILLHOUSE_RECOMMENDED_VETERAN"; - } - - if( final_time < 20.0 ) - maps\_utility::giveachievement_wrapper( "NEW_SQUADRON_RECORD" ); - - return final_time; -} - -accuracy_bonus() -{ - guns = level.player GetWeaponsListPrimaries(); - gun0 = level.player GetWeaponAmmoStock( guns[0] ); - gun1 = level.player GetWeaponAmmoStock( guns[1] ); - gunc0 = level.player GetWeaponAmmoClip( guns[0] ); - gunc1 = level.player GetWeaponAmmoClip( guns[1] ); - starting_ammo = gun0 + gun1 + gunc0 + gunc1; - //iprintlnbold ( "starting_ammo " + starting_ammo ); - - level waittill ( "test_cleared" ); - - gun0 = level.player GetWeaponAmmoStock( guns[0] ); - gun1 = level.player GetWeaponAmmoStock( guns[1] ); - gunc0 = level.player GetWeaponAmmoClip( guns[0] ); - gunc1 = level.player GetWeaponAmmoClip( guns[1] ); - ending_ammo = gun0 + gun1 + gunc0 + gunc1; - //iprintlnbold ( "ending_ammo " + ending_ammo ); - - used = starting_ammo - ending_ammo; - //iprintlnbold ( "ammo used: " + used ); - - allowed_shots = 20; - if ( used > allowed_shots ) - excess_ammo = ( used - allowed_shots ); - else - excess_ammo = 0; - - level.bonus = maps\_hud_util::get_countdown_hud(); - level.bonus.y = 85; - - level.bonus_time = ( ( 15 - excess_ammo ) * .2 ); - if ( level.bonus_time <= 0 ) - { - level.bonus.label = &"KILLHOUSE_ACCURACY_BONUS_ZERO"; - level.bonus_time = 0; - } - else - { - level.bonus.label = &"KILLHOUSE_ACCURACY_BONUS"; - level.bonus setValue ( level.bonus_time ); - } - - level notify ( "accuracy_bonus" ); -} - - - -nagPlayer( nagAnim, minNagTime ) -{ - if ( self.speaking ) - return false; - - time = getTime(); - if ( time - self.lastSpeakTime < 1.0 ) - return false; - - if ( time - self.lastNagTime < (minNagTime * 1000) ) - return false; - - self execDialog( nagAnim ); - self.lastNagTime = self.lastSpeakTime; - return true; -} - - -scoldPlayer( scoldAnim ) -{ - if ( self.speaking ) - return false; - - self execDialog( scoldAnim ); - return true; -} - - -execDialog( dialogAnim ) -{ - //assert( !self.speaking ); - self.speaking = true; - //self anim_single_solo( self, dialogAnim ); - self anim_single_queue( self, dialogAnim ); - self.speaking = false; - self.lastSpeakTime = getTime(); -} - -actionNodeThink( actionNode ) -{ - assert( isDefined( actionNode.script_noteworthy ) ); - - switch( actionNode.script_noteworthy ) - { - case "ammo_node": - wait ( 2.0 ); - println( self.buddyID + " leaving" ); - break; - } -} - -getFreeActionNode( curNode ) -{ - actionNode = undefined; - while ( isDefined( curNode.target ) ) - { - nextNode = getNode( curNode.target, "targetname" ); - - if ( isDefined( nextNode.script_noteworthy ) ) - { - if ( nextNode.inUse ) - { - if ( !isDefined( actionNode ) ) - return curNode; - else - return actionNode; - } - - actionNode = nextNode; - } - - curNode = nextNode; - } - return actionNode; -} - - -initActionChain( actionNode ) -{ - while ( isDefined( actionNode.target ) ) - { - actionNode.inUse = false; - actionNode = getNode( actionNode.target, "targetname" ); - } -} - -actionChainThink( startNode ) -{ - self setGoalNode( startNode ); - self waittill( "goal" ); - curNode = startNode; - actionNode = undefined; - - while ( !isDefined( actionNode ) ) - { - actionNode = getFreeActionNode( curNode ); - wait ( 0.05 ); - } - - while ( isDefined( actionNode ) ) - { - actionNode.inUse = true; - while ( curNode != actionNode ) - { - curNode = getNode( curNode.target, "targetname" ); - self setGoalNode( curNode ); - self waittill ( "goal" ); - } - - self actionNodeThink( actionNode ); - - while ( isDefined( actionNode ) && curNode == actionNode ) - { - actionNode = getFreeActionNode( curNode ); - wait ( randomFloatRange( 0.1, 0.5 ) ); - } - curNode.inUse = false; - } - - while( isDefined( curNode.target ) ) - { - curNode = getNode( curNode.target, "targetname" ); - self setGoalNode( curNode ); - self waittill ( "goal" ); - } -} - - -raisePlywoodWalls() -{ - plywoodWalls = getEntArray( "plywood", "script_noteworthy" ); - - for ( index = 0; index < plywoodWalls.size; index++ ) - { - plywoodWalls[index] rotateRoll( 90, 0.25, 0.1, 0.1 ); - plywoodWalls[index] playSound( "killhouse_target_up_wood" ); - } -} - -silently_lowerPlywoodWalls() -{ - plywoodWalls = getEntArray( "plywood", "script_noteworthy" ); - - for ( index = 0; index < plywoodWalls.size; index++ ) - { - plywoodWalls[index] rotateRoll( -90, 0.25, 0.1, 0.1 ); - } -} - -lowerPlywoodWalls() -{ - plywoodWalls = getEntArray( "plywood", "script_noteworthy" ); - - for ( index = 0; index < plywoodWalls.size; index++ ) - { - plywoodWalls[index] rotateRoll( -90, 0.25, 0.1, 0.1 ); - plywoodWalls[index] playSound( "killhouse_target_up_wood" ); - } -} - - -raiseTargetDummies( group, laneID, dummyID ) -{ - targetDummies = getEntArray( group + "_target_dummy", "script_noteworthy" ); - - for ( index = 0; index < targetDummies.size; index++ ) - { - targetDummy = targetDummies[index]; - if ( isDefined( dummyID ) && targetDummy.dummyID != dummyID ) - continue; - - if ( isDefined( laneID ) && targetDummy.laneID != laneID ) - continue; - - if ( targetDummy.raised ) - continue; - - targetDummies[index] thread moveTargetDummy( "raise" ); - } -} - -moveTargetDummy( command ) -{ - self setCanDamage( false ); - - while ( self.moving ) - wait ( 0.05 ); - - switch( command ) - { - case "raise": - if ( !self.raised ) - { - self.aim_assist_target enableAimAssist(); - speed = 0.25; - //self playSound( "killhouse_target_up" ); - self playSound( "killhouse_target_up_metal" ); - self.orgEnt rotatePitch( 90, speed, 0.1, 0.1 ); - wait ( 0.25 ); - self.raised = true; - self.light light_on(); - - //if ( self.laneID == 1 ) - // self enableAimAssist(); - - self setCanDamage( true ); - } - break; - - case "lower": - if ( self.raised ) - { - speed = 0.75; - self.orgEnt rotatePitch( -90, speed, 0.25, 0.25 ); - wait ( 0.75 ); - self.raised = false; - self.light light_off(); - self playSound( "killhouse_target_up" ); - - //if ( self.laneID == 1 ) - // self disableAimAssist(); - self.aim_assist_target disableAimAssist(); - - } - break; - } -} - -lowerTargetDummies( group, laneID, dummyID ) -{ - targetDummies = getEntArray( group + "_target_dummy", "script_noteworthy" ); - - for ( index = 0; index < targetDummies.size; index++ ) - { - targetDummy = targetDummies[index]; - if ( isDefined( dummyID ) && targetDummy.dummyID != dummyID ) - { - continue; - } - - if ( isDefined( laneID ) && targetDummy.laneID != laneID ) - continue; - - if ( !targetDummy.raised ) - continue; - - targetDummies[index] thread moveTargetDummy( "lower" ); - } -} - - -training_targetDummies( group ) -{ - targetDummies = getTargetDummies( group ); - for ( index = 0; index < targetDummies.size; index++ ) - targetDummies[index] thread targetDummyThink(); -} - - -targetDummyThink() -{ - self.orgEnt = getEnt( self.target, "targetname" ); - assert( isdefined( self.orgEnt ) ); - - self linkto (self.orgEnt); - - self.dummyID = int( self.script_label ); - self.laneID = int( self.targetname[4] ); - - self.aim_assist_target = getEnt( self.orgEnt.target, "targetname" ); - self.aim_assist_target hide(); - self.aim_assist_target notsolid(); - - self.light = getEnt( self.aim_assist_target.target, "targetname" ); - - self.light light_off(); - self.orgEnt rotatePitch( -90, 0.25 ); - self.raised = false; - self.moving = false; - - stall = getEnt( "rifleTraining_stall", "targetname" ); - level.waters_speaking = false; - level.waters_last_line = 0; - - for( ;; ) - { - while ( 1 ) - { - self waittill ( "damage", amount, attacker, direction_vec, point, cause ); - - if ( ! ( level.player istouching ( stall ) ) ) - { - self target_down(); - - if ( level.waters_speaking != true ) - { - dialog = []; - dialog[ 0 ] = "gotostation1"; //Soap! Go to Station One. - dialog[ 1 ] = "heygo"; //Hey. Go to Station One. - dialog[ 2 ] = "getback"; //Oi, where are you going? Get back to Station One� - - selection = dialog[ randomint( dialog.size ) ]; - - level.waters_speaking = true; - level.waters execDialog( selection ); - level.waters_speaking = false; - } - self moveTargetDummy( "raise" ); - continue; - } - - double_line = true; - if ( level.hip_fire_required ) - { - if ( isADS() ) - { - thread keyHint( "stop_ads", 2, double_line ); - - self target_down(); - - if ( level.waters_speaking != true ) - { - level.waters_speaking = true; - - dialog = []; - dialog[ 0 ] = "stopaiming"; //Stop aiming down your sights. - dialog[ 1 ] = "seeyoufire"; //I want to see you fire from the hip. - - if ( level.waters_last_line == 0 ) - { - level.waters execDialog( "stopaiming" ); - level.waters_last_line = 1; - } - else - { - level.waters execDialog( "seeyoufire" ); - level.waters_last_line = 0; - } - level.waters_speaking = false; - } - - self moveTargetDummy( "raise" ); - continue; - } - } - break; - } - self notify ( "hit" ); - level.targets_hit++; - self playSound( "killhouse_buzzer" ); - - self target_down(); - } -} - -target_down() -{ - self.health = 1000; - self playSound( "killhouse_target_up" ); - - self.moving = true; - self.aim_assist_target disableAimAssist(); - self setCanDamage( false ); - self.orgEnt rotatePitch( -90, 0.25 ); - wait ( 0.5 ); - self.raised = false; - self.moving = false; - self.light light_off(); -} - -cargoship_targets() -{ - orgEnt = getEnt( self.target, "targetname" ); - assert( isdefined( orgEnt ) ); - - self linkto (orgEnt); - //self.origin = orgEnt.origin; - //self.angles = orgEnt.angles; - if ( ! isdefined ( orgEnt.script_noteworthy ) ) - orgEnt.script_noteworthy = "standard"; - - if (orgEnt.script_noteworthy == "reverse" ) - orgEnt rotatePitch( 90, 0.25 ); - else - orgEnt rotatePitch( -90, 0.25 ); - - aim_assist_target = getEnt( orgEnt.target, "targetname" ); - aim_assist_target hide(); - aim_assist_target notsolid(); - - while ( 1 ) - { - self waittill ( "pop_up" ); - - wait randomfloatrange (0, .2); - - //self playSound( "killhouse_target_up" ); - self playSound( "killhouse_target_up_metal" ); - self setCanDamage( true ); - if ( self.targetname != "friendly" ) - aim_assist_target enableAimAssist(); - if (orgEnt.script_noteworthy == "reverse" ) - orgEnt rotatePitch( -90, 0.25 ); - else - orgEnt rotatePitch( 90, 0.25 ); - wait .25; - - if ( self.targetname == "friendly" ) - { - self fail_if_damage_waiter(); - } - else - { - while ( 1 ) - { - self waittill ( "damage", amount, attacker, direction_vec, point, type ); - if( type == "MOD_IMPACT" ) - continue; - else - break; - } - self notify ( "hit" ); - self.health = 1000; - level.targets_hit++; - self playSound( "killhouse_buzzer" ); - self playSound( "killhouse_target_up" ); - aim_assist_target disableAimAssist(); - } - - if (orgEnt.script_noteworthy == "reverse" ) - orgEnt rotatePitch( 90, 0.25 ); - else - orgEnt rotatePitch( -90, 0.25 ); - self setCanDamage( false ); - wait .25; - } -} - -getTargetDummies( group, laneID, dummyID ) -{ - groupTargetDummies = getEntArray( group + "_target_dummy", "script_noteworthy" ); - - targetDummies = []; - for ( index = 0; index < groupTargetDummies.size; index++ ) - { - targetDummy = groupTargetDummies[index]; - if ( isDefined( dummyID ) && targetDummy.dummyID != dummyID ) - continue; - - if ( isDefined( laneID ) && targetDummy.laneID != laneID ) - continue; - - targetDummies[targetDummies.size] = targetDummy; - } - - if ( isDefined( laneID ) && isDefined( dummyID ) ) - { - assert( targetDummies.size == 1 ); - } - return targetDummies; -} - -set_ammo() -{ - if ( (self.classname == "weapon_fraggrenade") || (self.classname == "weapon_flash_grenade") ) - self ItemWeaponSetAmmo( 1, 0 ); - else - self ItemWeaponSetAmmo( 999, 999 ); -} - -ammoRespawnThink( flag, type, obj_flag ) -{ - wait .2; //timing - weapon = self; - ammoItemClass = weapon.classname; - ammoItemOrigin = ( weapon.origin + (0,0,8) ); //wont spawn if inside something - ammoItemAngles = weapon.angles; - weapon set_ammo(); - - obj_model = undefined; - if ( isdefined ( weapon.target ) ) - { - obj_model = getent ( weapon.target, "targetname" ); - obj_model.origin = weapon.origin; - obj_model.angles = weapon.angles; - } - - if ( type == "flash_grenade" ) - ammo_fraction_required = 1; - else - ammo_fraction_required = .2; - - if ( isdefined ( flag ) ) - { - //self delete(); - self.origin = self.origin + (0, 0, -10000); - if ( isdefined ( obj_model ) ) - obj_model hide(); - - flag_wait ( flag ); - - if ( isdefined ( obj_model ) ) - obj_model show(); - self.origin = self.origin + (0, 0, 10000); - //weapon = spawn ( ammoItemClass, ammoItemOrigin ); - //weapon.angles = ammoItemAngles; - weapon set_ammo(); - } - - //if ( isdefined ( obj_model ) ) - // obj_model hide();//temp hiding of glowing weapons - - if ( ( isdefined ( obj_model ) ) && ( isdefined ( obj_flag ) ) ) - obj_model thread delete_if_obj_complete( obj_flag ); - - weapon waittill ( "trigger" ); - - if ( isdefined ( obj_model ) ) - obj_model delete(); - - while ( 1 ) - { - wait 1; - - if ( ( level.player GetFractionMaxAmmo( type ) ) < ammo_fraction_required ) - { - while ( distance( level.player.origin, ammoItemOrigin ) < 160 ) - wait 1; - - //if ( level.player pointInFov( ammoItemOrigin ) ) - // continue; - - weapon = spawn ( ammoItemClass, ammoItemOrigin, 1 ); //suspended bit flag - //weapon = spawn ( "weapon_mp5", ammoItemOrigin ); - weapon.angles = ammoItemAngles; - weapon set_ammo(); - wait .2; - weapon.origin = ( ammoItemOrigin + (0,0,-8) ); - //weapon.angles = ammoItemAngles; - - //weapon waittill ( "trigger" ); - while ( isdefined ( weapon ) ) - wait 1; - } - } -} - -delete_if_obj_complete( obj_flag ) -{ - self endon ( "death" ); - flag_wait ( obj_flag ); - self delete(); -} - - -test2( type ) -{ - while (1) - { - println ( type + " " + (level.player GetFractionMaxAmmo( type ) ) ); - wait 1; - } -} - - -pointInFov( origin ) -{ - forward = anglesToForward( self.angles ); - return ( vectorDot( forward, origin - self.origin ) > 0.766 ); // 80 fov -} - - -registerObjective( objName, objText, objEntity ) -{ - flag_init( objName ); - objID = level.objectives.size; - - newObjective = spawnStruct(); - newObjective.name = objName; - newObjective.id = objID; - newObjective.state = "invisible"; - newObjective.text = objText; - newObjective.entity = objEntity; - newObjective.added = false; - - level.objectives[objName] = newObjective; - - return newObjective; -} - - -setObjectiveState( objName, objState ) -{ - assert( isDefined( level.objectives[objName] ) ); - - objective = level.objectives[objName]; - objective.state = objState; - - if ( !objective.added ) - { - objective_add( objective.id, objective.state, objective.text, objective.entity.origin ); - objective.added = true; - } - else - { - objective_state( objective.id, objective.State ); - } - - if ( objective.state == "done" ) - flag_set( objName ); -} - - -setObjectiveString( objName, objString ) -{ - objective = level.objectives[objName]; - objective.text = objString; - - objective_string( objective.id, objString ); -} - -setObjectiveLocation( objName, objLoc ) -{ - objective = level.objectives[objName]; - objective.loc = objLoc; - - objective_position( objective.id, objective.loc.origin ); -} - -setObjectiveRemaining( objName, objString, objRemaining ) -{ - assert( isDefined( level.objectives[objName] ) ); - - objective = level.objectives[objName]; - - if ( !objRemaining ) - objective_string( objective.id, objString ); - else - objective_string( objective.id, objString, objRemaining ); -} - - -printAboveHead (string, duration, offset, color) -{ - self endon ("death"); - - if (!isdefined (offset)) - offset = (0, 0, 0); - if (!isdefined (color)) - color = (1,0,0); - - for(i = 0; i < (duration * 20); i++) - { - if (!isalive (self)) - return; - - aboveHead = self getshootatpos() + (0,0,10) + offset; - print3d (aboveHead, string, color, 1, 0.5); // origin, text, RGB, alpha, scale - wait (0.05); - } -} - -chair_guy_setup() -{ - chair_guy = getent ( "chair_guy", "script_noteworthy" ); - chair_guy_origin = getent ( "chair_guy_origin", "script_noteworthy" ); - chair_guy.animname = "generic"; - chair_guy gun_remove(); - chair_guy teleport ( chair_guy_origin.origin ); - //anim_loop_solo( guy, anime_idle, tag, ender, entity ); - chair_guy_origin thread anim_loop_solo(chair_guy, "chair_idles", undefined, undefined); -} - -glowing_rope() -{ - rope = getent ( "glowing_rope", "targetname" ); - //if ( ! isdefined ( rope ) ) - // return; - - rope hide(); - - while ( 1 ) - { - level waittill ( "show_glowing_rope" ); - - rope show(); - - level waittill ( "hide_glowing_rope" ); - - rope hide(); - } -} - - -registerActions() -{ - level.actionBinds = []; - registerActionBinding( "objectives", "pause", &"KILLHOUSE_HINT_CHECK_OBJECTIVES_PAUSED" ); - - registerActionBinding( "objectives_pc", "+scores", &"KILLHOUSE_HINT_CHECK_OBJECTIVES_SCORES" ); - - registerActionBinding( "pc_attack", "+attack", &"KILLHOUSE_HINT_ATTACK_PC" ); - registerActionBinding( "pc_hip_attack", "+attack", &"KILLHOUSE_HINT_HIP_ATTACK_PC" ); - - registerActionBinding( "hip_attack", "+attack", &"KILLHOUSE_HINT_HIP_ATTACK" ); - registerActionBinding( "attack", "+attack", &"KILLHOUSE_HINT_ATTACK" ); - - registerActionBinding( "stop_ads", "+speed_throw", &"KILLHOUSE_HINT_STOP_ADS_THROW" ); - registerActionBinding( "stop_ads", "+speed", &"KILLHOUSE_HINT_STOP_ADS" ); - registerActionBinding( "stop_ads", "+toggleads_throw", &"KILLHOUSE_HINT_STOP_ADS_TOGGLE_THROW" ); - registerActionBinding( "stop_ads", "toggleads", &"KILLHOUSE_HINT_STOP_ADS_TOGGLE" ); - - registerActionBinding( "ads_360", "+speed_throw", &"KILLHOUSE_HINT_ADS_THROW_360" ); - registerActionBinding( "ads_360", "+speed", &"KILLHOUSE_HINT_ADS_360" ); - - registerActionBinding( "ads", "+speed_throw", &"KILLHOUSE_HINT_ADS_THROW" ); - registerActionBinding( "ads", "+speed", &"KILLHOUSE_HINT_ADS" ); - registerActionBinding( "ads", "+toggleads_throw", &"KILLHOUSE_HINT_ADS_TOGGLE_THROW" ); - registerActionBinding( "ads", "toggleads", &"KILLHOUSE_HINT_ADS_TOGGLE" ); - - registerActionBinding( "ads_switch", "+speed_throw", &"KILLHOUSE_HINT_ADS_SWITCH_THROW" ); - registerActionBinding( "ads_switch", "+speed", &"KILLHOUSE_HINT_ADS_SWITCH" ); - - registerActionBinding( "ads_switch_shoulder", "+speed_throw", &"KILLHOUSE_HINT_ADS_SWITCH_THROW_SHOULDER" ); - registerActionBinding( "ads_switch_shoulder", "+speed", &"KILLHOUSE_HINT_ADS_SWITCH_SHOULDER" ); - - registerActionBinding( "breath", "+melee_breath", &"KILLHOUSE_HINT_BREATH_MELEE" ); - registerActionBinding( "breath", "+breath_sprint", &"KILLHOUSE_HINT_BREATH_SPRINT" ); - registerActionBinding( "breath", "+holdbreath", &"KILLHOUSE_HINT_BREATH" ); - - registerActionBinding( "melee", "+melee", &"KILLHOUSE_HINT_MELEE" ); - registerActionBinding( "melee", "+melee_breath", &"KILLHOUSE_HINT_MELEE_BREATH" ); - - registerActionBinding( "prone", "goprone", &"KILLHOUSE_HINT_PRONE" ); - registerActionBinding( "prone", "+stance", &"KILLHOUSE_HINT_PRONE_STANCE" ); - registerActionBinding( "prone", "toggleprone", &"KILLHOUSE_HINT_PRONE_TOGGLE" ); - registerActionBinding( "prone", "+prone", &"KILLHOUSE_HINT_PRONE_HOLD" ); - registerActionBinding( "prone", "lowerstance", &"KILLHOUSE_HINT_PRONE_DOUBLE" ); -// registerActionBinding( "prone", "+movedown", &"" ); - - registerActionBinding( "crouch", "gocrouch", &"KILLHOUSE_HINT_CROUCH" ); - registerActionBinding( "crouch", "+stance", &"KILLHOUSE_HINT_CROUCH_STANCE" ); - registerActionBinding( "crouch", "togglecrouch", &"KILLHOUSE_HINT_CROUCH_TOGGLE" ); -// registerActionBinding( "crouch", "lowerstance", &"KILLHOUSE_HINT_CROUCH_DOU" ); -// registerActionBinding( "crouch", "+movedown", &"KILLHOUSE_HINT_CROUCH" ); - - registerActionBinding( "stand", "+gostand", &"KILLHOUSE_HINT_STAND" ); - registerActionBinding( "stand", "+stance", &"KILLHOUSE_HINT_STAND_STANCE" ); - - registerActionBinding( "jump", "+gostand", &"KILLHOUSE_HINT_JUMP_STAND" ); - registerActionBinding( "jump", "+moveup", &"KILLHOUSE_HINT_JUMP" ); - - registerActionBinding( "sprint", "+breath_sprint", &"KILLHOUSE_HINT_SPRINT_BREATH" ); - registerActionBinding( "sprint", "+sprint", &"KILLHOUSE_HINT_SPRINT" ); - - registerActionBinding( "sprint_pc", "+breath_sprint", &"KILLHOUSE_HINT_SPRINT_BREATH_PC" ); - registerActionBinding( "sprint_pc", "+sprint", &"KILLHOUSE_HINT_SPRINT_PC" ); - - registerActionBinding( "sprint2", "+breath_sprint", &"KILLHOUSE_HINT_HOLDING_SPRINT_BREATH" ); - registerActionBinding( "sprint2", "+sprint", &"KILLHOUSE_HINT_HOLDING_SPRINT" ); - - registerActionBinding( "reload", "+reload", &"KILLHOUSE_HINT_RELOAD" ); - registerActionBinding( "reload", "+usereload", &"KILLHOUSE_HINT_RELOAD_USE" ); - - registerActionBinding( "mantle", "+gostand", &"KILLHOUSE_HINT_MANTLE" ); - - registerActionBinding( "sidearm", "weapnext", &"KILLHOUSE_HINT_SIDEARM_SWAP" ); - - registerActionBinding( "primary", "weapnext", &"KILLHOUSE_HINT_PRIMARY_SWAP" ); - - registerActionBinding( "frag", "+frag", &"KILLHOUSE_HINT_FRAG" ); - - registerActionBinding( "flash", "+smoke", &"KILLHOUSE_HINT_FLASH" ); - - registerActionBinding( "swap_launcher", "+activate", &"KILLHOUSE_HINT_SWAP" ); - registerActionBinding( "swap_launcher", "+usereload", &"KILLHOUSE_HINT_SWAP_RELOAD" ); - - registerActionBinding( "firemode", "+actionslot 2", &"KILLHOUSE_HINT_FIREMODE" ); - - registerActionBinding( "attack_launcher", "+attack", &"KILLHOUSE_HINT_LAUNCHER_ATTACK" ); - - registerActionBinding( "swap_explosives", "+activate", &"KILLHOUSE_HINT_EXPLOSIVES" ); - registerActionBinding( "swap_explosives", "+usereload", &"KILLHOUSE_HINT_EXPLOSIVES_RELOAD" ); - - registerActionBinding( "plant_explosives", "+activate", &"KILLHOUSE_HINT_EXPLOSIVES_PLANT" ); - registerActionBinding( "plant_explosives", "+usereload", &"KILLHOUSE_HINT_EXPLOSIVES_PLANT_RELOAD" ); - - registerActionBinding( "equip_C4", "+actionslot 4", &"KILLHOUSE_HINT_EQUIP_C4" ); - - registerActionBinding( "throw_C4", "+toggleads_throw", &"KILLHOUSE_HINT_THROW_C4_TOGGLE" ); - registerActionBinding( "throw_C4", "+speed_throw", &"KILLHOUSE_HINT_THROW_C4_SPEED" ); - registerActionBinding( "throw_C4", "+throw", &"KILLHOUSE_HINT_THROW_C4" ); - - registerActionBinding( "detonate_C4", "+attack", &"KILLHOUSE_DETONATE_C4" ); - - initKeys(); - updateKeysForBindings(); -} - - -registerActionBinding( action, binding, hint ) -{ - if ( !isDefined( level.actionBinds[action] ) ) - level.actionBinds[action] = []; - - actionBind = spawnStruct(); - actionBind.binding = binding; - actionBind.hint = hint; - - actionBind.keyText = undefined; - actionBind.hintText = undefined; - - precacheString( hint ); - - level.actionBinds[action][level.actionBinds[action].size] = actionBind; -} - - -getActionBind( action ) -{ - for ( index = 0; index < level.actionBinds[action].size; index++ ) - { - actionBind = level.actionBinds[action][index]; - - binding = getKeyBinding( actionBind.binding ); - if ( !binding["count"] ) - continue; - - return level.actionBinds[action][index]; - } - - return level.actionBinds[action][0];//unbound -} - - -updateKeysForBindings() -{ - if ( level.console || getdvarint("gpad_in_use") ) - { - setKeyForBinding( getCommandFromKey( "BUTTON_START" ), "BUTTON_START" ); - setKeyForBinding( getCommandFromKey( "BUTTON_A" ), "BUTTON_A" ); - setKeyForBinding( getCommandFromKey( "BUTTON_B" ), "BUTTON_B" ); - setKeyForBinding( getCommandFromKey( "BUTTON_X" ), "BUTTON_X" ); - setKeyForBinding( getCommandFromKey( "BUTTON_Y" ), "BUTTON_Y" ); - setKeyForBinding( getCommandFromKey( "BUTTON_LSTICK" ), "BUTTON_LSTICK" ); - setKeyForBinding( getCommandFromKey( "BUTTON_RSTICK" ), "BUTTON_RSTICK" ); - setKeyForBinding( getCommandFromKey( "BUTTON_LSHLDR" ), "BUTTON_LSHLDR" ); - setKeyForBinding( getCommandFromKey( "BUTTON_RSHLDR" ), "BUTTON_RSHLDR" ); - setKeyForBinding( getCommandFromKey( "BUTTON_LTRIG" ), "BUTTON_LTRIG" ); - setKeyForBinding( getCommandFromKey( "BUTTON_RTRIG" ), "BUTTON_RTRIG" ); - } - else - { - //level.kbKeys = "1234567890-=QWERTYUIOP[]ASDFGHJKL;'ZXCVBNM,./"; - //level.specialKeys = []; - - for ( index = 0; index < level.kbKeys.size; index++ ) - { - setKeyForBinding( getCommandFromKey( level.kbKeys[index] ), level.kbKeys[index] ); - } - - for ( index = 0; index < level.specialKeys.size; index++ ) - { - setKeyForBinding( getCommandFromKey( level.specialKeys[index] ), level.specialKeys[index] ); - } - - } -} - - -getActionForBinding( binding ) -{ - arrayKeys = getArrayKeys( level.actionBinds ); - for ( index = 0; index < arrayKeys; index++ ) - { - bindArray = level.actionBinds[arrayKeys[index]]; - for ( bindIndex = 0; bindIndex < bindArray.size; bindIndex++ ) - { - if ( bindArray[bindIndex].binding != binding ) - continue; - - return arrayKeys[index]; - } - } -} - -setKeyForBinding( binding, key ) -{ - if ( binding == "" ) - return; - - arrayKeys = getArrayKeys( level.actionBinds ); - for ( index = 0; index < arrayKeys.size; index++ ) - { - bindArray = level.actionBinds[arrayKeys[index]]; - for ( bindIndex = 0; bindIndex < bindArray.size; bindIndex++ ) - { - if ( bindArray[bindIndex].binding != binding ) - continue; - - bindArray[bindIndex].key = key; - } - } -} - - -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" ); -} - -keyHint( actionName, timeOut, doubleline ) -{ - if ( getdvar( "chaplincheat" ) == "1" ) - return; - - clear_hints(); - level endon ( "clearing_hints" ); - - if ( isdefined ( doubleline ) ) - add_hint_background( doubleline ); - else - add_hint_background(); - level.hintElem = createFontString( "objective", level.hint_text_size ); - level.hintElem.hidewheninmenu = true; - level.hintElem setPoint( "TOP", undefined, 0, 110 ); - level.hintElem.sort = 0.5; - - actionBind = getActionBind( actionName ); - if ( ( actionName == "melee" ) && ( level.xenon || getdvarint("gpad_style") == 0 ) && ( actionBind.key == "BUTTON_RSTICK" ) ) - level.hintElem setText( &"KILLHOUSE_HINT_MELEE_CLICK" ); - else - level.hintElem setText( actionBind.hint ); - //level.hintElem endon ( "death" ); - - notifyName = "did_action_" + actionName; - for ( index = 0; index < level.actionBinds[actionName].size; index++ ) - { - actionBind = level.actionBinds[actionName][index]; - level.player notifyOnCommand( notifyName, actionBind.binding ); - } - - if ( isDefined( timeOut ) ) - level.player thread notifyOnTimeout( notifyName, timeOut ); - level.player waittill( notifyName ); - - level.hintElem fadeOverTime( 0.5 ); - level.hintElem.alpha = 0; - - wait ( 0.5 ); - - clear_hints(); -} - -second_sprint_hint() -{ - level endon ( "kill_sprint_hint" ); - //getEnt( "obstacleTraining_sprint", "targetname" ) waittill ( "trigger" ); - - wait .5; - actionBind = getActionBind( "sprint2" ); - hint( actionBind.hint, 5 ); -} - - -notifyOnTimeout( finishedNotify, timeOut ) -{ - self endon( finishedNotify ); - wait timeOut; - self notify( finishedNotify ); -} - - -training_stallTriggers( group, endonString ) -{ - stallTriggers = getEntArray( group + "_stall_trigger", "script_noteworthy" ); - - for ( index = 0; index < stallTriggers.size; index++ ) - stallTriggers[index] thread stallTriggerThink( group ); - - thread wrongStallNag( endonString ); -} - - -wrongStallNag( endonString ) -{ - level endon ( endonString ); - for( ;; ) - { - level waittill ( "player_wrong_stall", stallString ); - - level.marine2 anim_single_solo( level.marine2, "gotofour" ); - - wait ( 10.0 ); - } -} - - -stallTriggerThink( group ) -{ - for ( ;; ) - { - self waittill ( "trigger", entity ); - - if ( entity != level.player ) - continue; - - if ( self.targetname != "stall4" ) - level notify ( "player_wrong_stall", self.targetname ); - else - flag_set( group + "_player_at_stall" ); - } -} - -initKeys() -{ - level.kbKeys = "1234567890-=qwertyuiop[]asdfghjkl;'zxcvbnm,./"; - - level.specialKeys = []; - - level.specialKeys[level.specialKeys.size] = "TAB"; - level.specialKeys[level.specialKeys.size] = "ENTER"; - level.specialKeys[level.specialKeys.size] = "ESCAPE"; - level.specialKeys[level.specialKeys.size] = "SPACE"; - level.specialKeys[level.specialKeys.size] = "BACKSPACE"; - level.specialKeys[level.specialKeys.size] = "UPARROW"; - level.specialKeys[level.specialKeys.size] = "DOWNARROW"; - level.specialKeys[level.specialKeys.size] = "LEFTARROW"; - level.specialKeys[level.specialKeys.size] = "RIGHTARROW"; - level.specialKeys[level.specialKeys.size] = "ALT"; - level.specialKeys[level.specialKeys.size] = "CTRL"; - level.specialKeys[level.specialKeys.size] = "SHIFT"; - level.specialKeys[level.specialKeys.size] = "CAPSLOCK"; - level.specialKeys[level.specialKeys.size] = "F1"; - level.specialKeys[level.specialKeys.size] = "F2"; - level.specialKeys[level.specialKeys.size] = "F3"; - level.specialKeys[level.specialKeys.size] = "F4"; - level.specialKeys[level.specialKeys.size] = "F5"; - level.specialKeys[level.specialKeys.size] = "F6"; - level.specialKeys[level.specialKeys.size] = "F7"; - level.specialKeys[level.specialKeys.size] = "F8"; - level.specialKeys[level.specialKeys.size] = "F9"; - level.specialKeys[level.specialKeys.size] = "F10"; - level.specialKeys[level.specialKeys.size] = "F11"; - level.specialKeys[level.specialKeys.size] = "F12"; - level.specialKeys[level.specialKeys.size] = "INS"; - level.specialKeys[level.specialKeys.size] = "DEL"; - level.specialKeys[level.specialKeys.size] = "PGDN"; - level.specialKeys[level.specialKeys.size] = "PGUP"; - level.specialKeys[level.specialKeys.size] = "HOME"; - level.specialKeys[level.specialKeys.size] = "END"; - level.specialKeys[level.specialKeys.size] = "MOUSE1"; - level.specialKeys[level.specialKeys.size] = "MOUSE2"; - level.specialKeys[level.specialKeys.size] = "MOUSE3"; - level.specialKeys[level.specialKeys.size] = "MOUSE4"; - level.specialKeys[level.specialKeys.size] = "MOUSE5"; - level.specialKeys[level.specialKeys.size] = "MWHEELUP"; - level.specialKeys[level.specialKeys.size] = "MWHEELDOWN"; - level.specialKeys[level.specialKeys.size] = "AUX1"; - level.specialKeys[level.specialKeys.size] = "AUX2"; - level.specialKeys[level.specialKeys.size] = "AUX3"; - level.specialKeys[level.specialKeys.size] = "AUX4"; - level.specialKeys[level.specialKeys.size] = "AUX5"; - level.specialKeys[level.specialKeys.size] = "AUX6"; - level.specialKeys[level.specialKeys.size] = "AUX7"; - level.specialKeys[level.specialKeys.size] = "AUX8"; - level.specialKeys[level.specialKeys.size] = "AUX9"; - level.specialKeys[level.specialKeys.size] = "AUX10"; - level.specialKeys[level.specialKeys.size] = "AUX11"; - level.specialKeys[level.specialKeys.size] = "AUX12"; - level.specialKeys[level.specialKeys.size] = "AUX13"; - level.specialKeys[level.specialKeys.size] = "AUX14"; - level.specialKeys[level.specialKeys.size] = "AUX15"; - level.specialKeys[level.specialKeys.size] = "AUX16"; - level.specialKeys[level.specialKeys.size] = "KP_HOME"; - level.specialKeys[level.specialKeys.size] = "KP_UPARROW"; - level.specialKeys[level.specialKeys.size] = "KP_PGUP"; - level.specialKeys[level.specialKeys.size] = "KP_LEFTARROW"; - level.specialKeys[level.specialKeys.size] = "KP_5"; - level.specialKeys[level.specialKeys.size] = "KP_RIGHTARROW"; - level.specialKeys[level.specialKeys.size] = "KP_END"; - level.specialKeys[level.specialKeys.size] = "KP_DOWNARROW"; - level.specialKeys[level.specialKeys.size] = "KP_PGDN"; - level.specialKeys[level.specialKeys.size] = "KP_ENTER"; - level.specialKeys[level.specialKeys.size] = "KP_INS"; - level.specialKeys[level.specialKeys.size] = "KP_DEL"; - level.specialKeys[level.specialKeys.size] = "KP_SLASH"; - level.specialKeys[level.specialKeys.size] = "KP_MINUS"; - level.specialKeys[level.specialKeys.size] = "KP_PLUS"; - level.specialKeys[level.specialKeys.size] = "KP_NUMLOCK"; - level.specialKeys[level.specialKeys.size] = "KP_STAR"; - level.specialKeys[level.specialKeys.size] = "KP_EQUALS"; - level.specialKeys[level.specialKeys.size] = "PAUSE"; - level.specialKeys[level.specialKeys.size] = "SEMICOLON"; - level.specialKeys[level.specialKeys.size] = "COMMAND"; - level.specialKeys[level.specialKeys.size] = "181"; - level.specialKeys[level.specialKeys.size] = "191"; - level.specialKeys[level.specialKeys.size] = "223"; - level.specialKeys[level.specialKeys.size] = "224"; - level.specialKeys[level.specialKeys.size] = "225"; - level.specialKeys[level.specialKeys.size] = "228"; - level.specialKeys[level.specialKeys.size] = "229"; - level.specialKeys[level.specialKeys.size] = "230"; - level.specialKeys[level.specialKeys.size] = "231"; - level.specialKeys[level.specialKeys.size] = "232"; - level.specialKeys[level.specialKeys.size] = "233"; - level.specialKeys[level.specialKeys.size] = "236"; - level.specialKeys[level.specialKeys.size] = "241"; - level.specialKeys[level.specialKeys.size] = "242"; - level.specialKeys[level.specialKeys.size] = "243"; - level.specialKeys[level.specialKeys.size] = "246"; - level.specialKeys[level.specialKeys.size] = "248"; - level.specialKeys[level.specialKeys.size] = "249"; - level.specialKeys[level.specialKeys.size] = "250"; - level.specialKeys[level.specialKeys.size] = "252"; -} - - - -turn_off_frag_lights() -{ - frag_lights = getentarray ( "frag_lights", "script_noteworthy" ); - - for(i = 0; i < frag_lights.size; i++) - frag_lights[ i ] setLightIntensity( 0 ); -} - -blink_primary_lights() -{ - frag_lights = getentarray ( "frag_lights", "script_noteworthy" ); - - while( 1 ) - { - wait 1; - for(i = 0; i < frag_lights.size; i++) - frag_lights[ i ] setLightIntensity( 1 ); - wait 1; - - for(i = 0; i < frag_lights.size; i++) - frag_lights[ i ] setLightIntensity( 0 ); - } -} - - -melon_think() -{ - melon = getEnt ( "scr_watermelon", "targetname" ); - melon_model = getEnt ( melon.target, "targetname" ); - melon_model hide(); - melon_model notsolid(); - - level waittill ( "show_melon" ); - - melon_model show(); - melon_model solid(); - - melon waittill ( "trigger" ); - - melon playsound ( "melee_knife_hit_watermelon" ); - - flag_set ( "melee_complete" ); - playfx (level._effect["watermelon"], melon_model.origin); - melon_model hide(); - melon_model notsolid(); -} - -test() -{ - while (1) - { - println (" ammo: " + level.player GetWeaponAmmoClip( level.gunPrimary ) ); - wait 1; - } -} - - - -clear_hints_on_stand() -{ - while (level.player GetStance() != "stand" ) - wait .05; - clear_hints(); -} - - -move_mac() -{ - self waittill ( "trigger" ); - - level.mac set_generic_run_anim( "jog" ); - level.mac setgoalnode ( getnode ( self.target, "targetname" ) ); -} - -loop_obstacle() -{ - for ( index = 0; index < level.buddies.size; index++ ) - { - level.mac set_generic_run_anim( "jog" ); - level.buddies[index] thread obstacleTrainingCourseThink( level.buddies[index].startNode ); - } - - level.mac set_generic_run_anim( "walk", true ); - level.mac setgoalnode ( getnode ( "mac_start_node", "targetname" ) ); - level.mac waittill ( "goal" ); - - //level notify ( "start_course" ); -} - -obstacleTraining_buddies() -{ - buddiesInit(); - - for ( index = 0; index < level.buddies.size; index++ ) - { - buddy = level.buddies[index]; - buddy.startNode = getNode( "obstacle_lane_node" + buddy.buddyID, "targetname" ); - - level.buddies[index] thread obstacleTrainingCourseThink( buddy.startNode ); - } -} - -buddiesInit() -{ - level.buddies = getEntArray( "buddy", "script_noteworthy" ); - level.buddiesByID = []; - for ( index = 0; index < level.buddies.size; index++ ) - { - level.buddies[index].buddyID = int( level.buddies[index].targetname[5] ); - level.buddiesByID[level.buddies[index].buddyID] = level.buddies[index]; - } -} - -obstacleTrainingCourseThink( goalNode ) -{ - level endon( "obstacleTraining_end" ); - - self.goalradius = 32; - self setGoalNode( goalNode ); - self waittill ( "goal" ); - - flag_wait ( "start_course" ); - - noteworthy_function[ "prone" ] = ::set_allowed_stances_prone; - noteworthy_function[ "stand" ] = ::set_allowed_stances_all; - noteworthy_function[ "sprint" ] = ::set_sprint; - - self.disablearrivals = true; - while ( isDefined( goalNode.target ) ) - { - goalNode = getNode( goalNode.target, "targetname" ); - - self setGoalNode( goalNode ); - self waittill ( "goal" ); - - if ( !isDefined( goalNode.script_noteworthy ) ) - continue; - - [[ noteworthy_function[ goalNode.script_noteworthy ] ]](); - } - self.disablearrivals = false; -} - -set_allowed_stances_prone() -{ - self allowedStances( "prone" ); -} - -set_allowed_stances_all() -{ - self allowedStances( "prone", "stand", "crouch" ); -} - -set_sprint() -{ - self.sprint = true; -} - - -frag_trigger_think( flag, trigger, continuous ) -{ - flag_init( flag ); - trigger enablegrenadetouchdamage(); - if ( isdefined ( trigger.target ) ) - trigger.light = getEnt( trigger.target, "targetname" ); - - if ( isdefined ( trigger.light ) ) - trigger.light thread flicker_on(); - - if( !isDefined( continuous ) ) - continuous = false; - - trigger _flag_wait_trigger( flag, continuous ); - - level.player playSound( "killhouse_buzzer" ); - - if ( isdefined ( trigger.light ) ) - trigger.light thread flicker_off(); - - return trigger; -} - -light_off() -{ - self setLightIntensity( 0 ); -} - -light_on() -{ - self setLightIntensity( 1 ); -} - -flicker_off() -{ - wait randomfloatrange ( .2, .5); - self setLightIntensity( 0 ); - wait randomfloatrange ( .05, .1); - self setLightIntensity( .7 ); - wait randomfloatrange ( .1, .2); - self setLightIntensity( 0 ); - wait randomfloatrange ( .05, .4); - self setLightIntensity( .5 ); - wait randomfloatrange ( .1, .5); - self setLightIntensity( 0 ); -} - -flicker_on() -{ - wait randomfloatrange ( .2, .5); - self setLightIntensity( .4 ); - wait randomfloatrange ( .2, .4); - self setLightIntensity( 0 ); - wait randomfloatrange ( .2, .5); - self setLightIntensity( .6 ); - wait randomfloatrange ( .05, .2); - self setLightIntensity( 0 ); - wait randomfloatrange ( .05, .1); - self setLightIntensity( 1 ); -} - -in_pit() -{ - pit = getEnt( "safety_pit", "targetname" ); - if ( !level.player istouching( pit ) ) - return false; - return true; -} - -frag_too_low_hint() -{ - level endon ( "fragTraining_end" ); - self enablegrenadetouchdamage(); - while( 1 ) - { - self waittill ( "trigger" ); - clear_hints(); - hint( &"KILLHOUSE_HINT_GRENADE_TOO_LOW", 6 ); - } -} - -walk_to( goal ) -{ - self set_generic_run_anim( "walk", true ); - //self.walk_combatanim = level.scr_anim[ "generic" ][ "walk" ]; - //self.walk_noncombatanim = level.scr_anim[ "generic" ][ "walk" ]; - self.disablearrivals = true; - self.disableexits = true; - - self.goalradius = 32; - self setgoalnode ( goal ); - self waittill ( "goal" ); - self anim_generic( self, "patrol_stop" ); - self setgoalpos ( self.origin ); -} - -dialog_nag_till_in_pit() -{ - level endon ( "in_pit_with_frags" ); - while( 1 ) - { - level.newcastle execDialog( "getinsafety" ); - wait 10; - } -} - -pause_anim() -{ - self setflaggedanim( "single anim", self getanim( "reveal" ), 1, 0, 0 ); // pause -} - -unpause_anim() -{ - self setflaggedanim( "single anim", self getanim( "reveal" ), 1, 0, 1 ); // unpause -} - - -M203_icon_hint() -{ - if ( getdvar( "chaplincheat" ) == "1" ) - return; - - clear_hints(); - //level endon ( "clearing_hints" ); - - add_hint_background(); - //Notice you now have an icon of a grenade launcher on your HUD. - level.hintElem = createFontString( "objective", level.hint_text_size ); - level.hintElem.hidewheninmenu = true; - level.hintElem setPoint( "TOP", undefined, 0, 130 ); - level.hintElem.sort = 0.5; - - level.hintElem setText( &"KILLHOUSE_HINT_LAUNCHER_ICON" ); - - iconElem = createIcon( "hud_dpad", 32, 32 ); - iconElem.hidewheninmenu = true; - iconElem setPoint( "TOP", undefined, 16, 165 ); - - iconElem2 = createIcon( "hud_icon_40mm_grenade", 64, 32 ); - iconElem2.hidewheninmenu = true; - iconElem2 setPoint( "TOP", undefined, -32, 165 ); - - level waittill ( "clearing_hints" ); - - iconElem setPoint( "CENTER", "BOTTOM", -304, -20, 1.0 ); - iconElem2 setPoint( "CENTER", "BOTTOM", -336, -20, 1.0 ); - - iconElem scaleovertime(1, 20, 20); - iconElem2 scaleovertime(1, 20, 20); - - wait .70; - iconElem fadeovertime(.15); - iconElem.alpha = 0; - - iconElem2 fadeovertime(.15); - iconElem2.alpha = 0; - wait .5; - - //clear_hints(); -} - - -C4_icon_hint() -{ - if ( getdvar( "chaplincheat" ) == "1" ) - return; - - clear_hints(); - level endon ( "clearing_hints" ); - - add_hint_background(); - level.hintElem = createFontString( "objective", level.hint_text_size ); - level.hintElem.hidewheninmenu = true; - level.hintElem setPoint( "TOP", undefined, 0, 130 ); - level.hintElem.sort = 0.5; - - level.hintElem setText( &"KILLHOUSE_HINT_C4_ICON" ); - //level.hintElem endon ( "death" ); - - level.iconElem = createIcon( "hud_dpad", 32, 32 ); - level.iconElem.hidewheninmenu = true; - level.iconElem setPoint( "TOP", undefined, 0, 175 ); - - level.iconElem2 = createIcon( "hud_icon_c4", 32, 32 ); - level.iconElem2.hidewheninmenu = true; - level.iconElem2 setPoint( "TOP", undefined, 0, 205 ); - - - level waittill ( "c4_equiped" ); - - level.iconElem3 = createIcon( "hud_arrow_down", 24, 24 ); - level.iconElem3.hidewheninmenu = true; - level.iconElem3 setPoint( "TOP", undefined, 0, 179 ); - level.iconElem3.sort = 1; - level.iconElem3.color = (1,1,0); - level.iconElem3.alpha = .7; - - level waittill ( "C4_the_car" ); - - - level.iconElem setPoint( "CENTER", "BOTTOM", -320, -20, 1.0 ); - level.iconElem2 setPoint( "CENTER", "BOTTOM", -320, -20, 1.0 ); - level.iconElem3 setPoint( "CENTER", "BOTTOM", -320, -20, 1.0 ); - - level.iconElem scaleovertime(1, 20, 20); - level.iconElem2 scaleovertime(1, 20, 20); - level.iconElem3 scaleovertime(1, 15, 15); - - wait .85; - level.iconElem fadeovertime(.15); - level.iconElem.alpha = 0; - - level.iconElem2 fadeovertime(.15); - level.iconElem2.alpha = 0; - - level.iconElem3 fadeovertime(.15); - level.iconElem3.alpha = 0; - - level.iconElem destroy(); - level.iconElem2 destroy(); - level.iconElem3 destroy(); -} - - -auto_aim() -{ - if ( level.console || getdvarint("gpad_in_use") ) - { - if(isdefined( getdvar("input_autoaim") ) ) - if ( getdvar("input_autoaim") == "1" ) - return true; - //iw3sp-mod - if(isdefined( getdvar("gpad_aimassist") ) ) - if ( getdvar("gpad_aimassist") == "1" ) - return true; - } - return false; -} - - - -is_ps3_flipped() -{ - ps3_flipped = false; - config = getdvar ( "gpad_buttonsConfig" ); - if ( isdefined ( config ) ) - if ( issubstr ( config , "_alt" ) ) - ps3_flipped = true; - return ps3_flipped; -} - -gaz_animation( name, delay ) -{ - if( isdefined( delay ) ) - wait delay; - - if( !flag( "gaz_in_idle_position" ) ) - return; - - level.waters notify( "gaz_animation" ); - level.waters endon( "gaz_animation" ); - - level.waters.ref_node notify( "stop_loop" ); - level.waters stopanimscripted(); - level.waters.ref_node anim_single_solo( level.waters, name ); - - level.waters.ref_node thread anim_loop_solo( level.waters, "killhouse_gaz_idleB", undefined, "stop_loop" ); -} \ No newline at end of file diff --git a/iw3sp_mod_ff_src/raw/maps/village_assault_code.gsc b/iw3sp_mod_ff_src/raw/maps/village_assault_code.gsc deleted file mode 100644 index f29c064..0000000 --- a/iw3sp_mod_ff_src/raw/maps/village_assault_code.gsc +++ /dev/null @@ -1,2791 +0,0 @@ -#include maps\_utility; -#include common_scripts\utility; -#include maps\_anim; -#include maps\_hud_util; -precacheLevelStuff() -{ - precacheString( &"VILLAGE_ASSAULT_OBJECTIVE_LOCATE_ALASAD" ); - precacheString( &"SCRIPT_ARMOR_DAMAGE" ); - precacheString( &"SCRIPT_LEARN_CHOPPER_AIR_SUPPORT1" ); - precacheString( &"SCRIPT_LEARN_CHOPPER_AIR_SUPPORT1_PC" ); - precacheShader( "black" ); - precacheShader( "hud_icon_cobra" ); - precacheShader( "popmenu_bg" ); - precacheShader( "hud_dpad" ); - precacheShader( "hud_arrow_right" ); - precacheModel( "sundirection_arrow" ); - precacheModel( "com_folding_chair" ); - precacheModel( "com_flashlight_off" ); - precacheModel( "com_flashlight_on" ); - precacheItem( "mi28_ffar_village_assault" ); - precacheItem( "flash_grenade" ); - precacheItem( "colt45_alasad_killer" ); - - flag_init( "gave_air_support_hint" ); - flag_init( "alasad_sequence_started" ); - flag_init( "air_support_refueling" ); - flag_init( "delete_attack_coord_hint" ); - - level.weaponClipModels = []; - level.weaponClipModels[0] = "weapon_ak47_clip"; - level.weaponClipModels[1] = "weapon_mp5_clip"; - level.weaponClipModels[2] = "weapon_m16_clip"; - level.weaponClipModels[3] = "weapon_g36_clip"; - level.weaponClipModels[4] = "weapon_dragunov_clip"; - level.weaponClipModels[5] = "weapon_g3_clip"; -} - -setLevelDVars() -{ - setSavedDvar( "r_specularColorScale", "1.8" ); - - if ( getdvar( "village_assault_debug_marker") == "" ) - setdvar( "village_assault_debug_marker", "0" ); - - level.seekersUsingColors = false; - level.BMP_Safety_Distance = 512 * 512; - level.goodFriendlyDistanceFromPlayerSquared = 512 * 512; - level.chopperSupportCallNextAudio = 0; - level.buildingClearNextAudio = 0; - level.air_support_hint_print_dialog_next = 0; - level.chopperSupportHoverLocations = []; - hoverEnts = getentarray( "chopper_location", "targetname" ); - for( i = 0 ; i < hoverEnts.size ; i++ ) - { - level.chopperSupportHoverLocations[ level.chopperSupportHoverLocations.size ] = hoverEnts[ i ].origin; - hoverEnts[ i ] delete(); - } - assert( level.chopperSupportHoverLocations.size > 0 ); - level.cosine[ "25" ] = cos( 25 ); - level.cosine[ "45" ] = cos( 45 ); - level.cosine[ "55" ] = cos( 55 ); - level.cosine[ "60" ] = cos( 60 ); - level.cosine[ "70" ] = cos( 70 ); - - level.alasad_possible_objective_locations = []; - level.alasad_possible_objective_locations_remaining[ 0 ] = "2"; - level.alasad_possible_objective_locations_remaining[ 1 ] = "6"; - - level.next_genocide_audio = 0; - level.genocide_audio[ 0 ] = "assault_killing_distance1"; - level.genocide_audio[ 1 ] = "assault_killing_interior1"; - level.genocide_audio[ 2 ] = "assault_killing_interior2"; - level.genocide_audio[ 3 ] = "assault_killing_interior3"; - - level.timedAutosaveNumber = 0; - level.timedAutosaveTime = undefined; - skill = getdifficulty(); - switch( skill ) - { - case "gimp": - case "easy": - level.timedAutosaveTime = 60; - array_thread( getentarray( "bmp_spawn_trigger", "script_noteworthy" ), ::trigger_off ); - break; - case "medium": - level.timedAutosaveTime = 120; - break; - case "hard": - case "difficult": - level.timedAutosaveTime = 180; - break; - case "fu": - level.timedAutosaveTime = 0; - break; - } - assert( isdefined( level.timedAutosaveTime ) ); -} - -scriptCalls() -{ - maps\village_assault_anim::main(); - level thread maps\village_assault_amb::main(); - maps\_compass::setupMiniMap("compass_map_village_assault"); - - array_thread( getentarray( "seek_player", "script_noteworthy" ), ::add_spawn_function, ::seek_player ); - array_thread( getentarray( "indoor_enemy", "script_noteworthy" ), ::add_spawn_function, ::indoor_enemy ); - array_thread( getentarray( "seek_player_smart", "script_noteworthy" ), ::add_spawn_function, ::seek_player_smart ); - array_thread( getentarray( "dog", "script_noteworthy" ), ::add_spawn_function, ::seek_player_dog ); - array_thread( getentarray( "enemy_color_hint_trigger", "targetname" ), ::enemy_color_hint_trigger_think ); - array_thread( getentarray( "genocide_audio_trigger", "targetname" ), ::genocide_audio_trigger ); - array_thread( getentarray( "dead_civilian", "targetname" ), ::dead_civilian ); - array_thread( getentarray( "trigger_upstairs_guys", "targetname" ), ::trigger_upstairs_guys ); - array_thread( getentarray( "alasad_barn_deletable", "script_noteworthy" ), ::alasad_deletable_hide ); - array_thread( getentarray( "alasad_house_deletable", "script_noteworthy" ), ::alasad_deletable_hide ); - - add_hint_string( "call_air_support2", &"SCRIPT_PLATFORM_LEARN_CHOPPER_AIR_SUPPORT2", ::should_delete_attack_coord_hint ); - - thread chopper_air_support(); - thread vehicle_patrol_init(); - thread roaming_bmp(); - thread timedAutosaves(); - - if ( getdvar( "village_assault_disable_gameplay") == "1" ) - thread disable_gameplay(); - - wait 6.5; - - objective_add( 0, "current", &"VILLAGE_ASSAULT_OBJECTIVE_LOCATE_ALASAD", ( 0, 0, 0 ) ); -} - -disable_gameplay() -{ - array_thread( getentarray( "trigger_multiple", "classname" ), ::disable_gameplay_trigger ); - array_thread( getentarray( "trigger_radius", "classname" ), ::disable_gameplay_trigger ); -} - -movePlayerToLocation( sTargetname ) -{ - assert( isdefined( sTargetname ) ); - start = getent( sTargetname, "targetname" ); - assert( isdefined( start ) ); - assert( isdefined( level.player ) ); - level.player setOrigin( start.origin ); - level.player setPlayerAngles( ( 0, start.angles[ 1 ], 0 ) ); -} - -disable_gameplay_trigger() -{ - gameplayTrigger = false; - - if ( self.spawnflags & 32 ) - gameplayTrigger = true; - - if ( isdefined( self.targetname ) ) - { - if ( self.targetname == "flood_and_secure" ) - gameplayTrigger = true; - else if ( self.targetname == "flood_spawner" ) - gameplayTrigger = true; - } - - if ( gameplayTrigger ) - self thread trigger_off(); -} - -spawn_starting_friendlies( sTargetname ) -{ - level.friendlies = []; - spawners = getentarray( sTargetname, "targetname" ); - for( i = 0 ; i < spawners.size ; i++ ) - { - friend = spawners[ i ] stalingradSpawn(); - if ( spawn_failed( friend ) ) - assertMsg( "A friendly failed to spawn" ); - - friend.goalradius = 32; - friend.fixednode = false; - - if ( issubstr( friend.classname, "price" ) ) - { - level.price = friend; - } - else if ( issubstr( friend.classname, "gaz" ) ) - { - level.gaz = friend; - } - else if ( issubstr( friend.classname, "russian" ) ) - { - level.opening_guy = friend; - level.opening_guy.animname = "opening_guy"; - } - - if ( friend isHero() ) - friend thread magic_bullet_shield( undefined, 5.0 ); - - level.friendlies[ level.friendlies.size ] = friend; - - friend thread friendly_adjust_movement_speed(); - friend thread friendly_bmp_damage_ignore_timer(); - } - - assert( isdefined( level.price ) ); - level.price.animname = "price"; - level.price make_hero(); - - assert( isdefined( level.gaz ) ); - level.gaz.animname = "gaz"; - level.gaz make_hero(); - - //array_thread( getaiarray( "allies" ), ::replace_on_death ); - assert( level.friendlies.size == spawners.size ); -} - -friendly_bmp_damage_ignore_timer() -{ - self endon( "death" ); - - for(;;) - { - self waittill( "damage", amount, attacker ); - if ( !isdefined( attacker ) ) - continue; - if ( !isdefined( attacker.classname ) ) - continue; - if ( attacker.classname != "script_vehicle" ) - continue; - self.ignored_by_tank_cannon = true; - wait randomfloatrange( 4.0, 6.0 ); - self.ignored_by_tank_cannon = undefined; - } -} - -friendly_adjust_movement_speed() -{ - self endon( "death" ); - - for(;;) - { - wait randomfloatrange( 1.0, 3.0 ); - - while( friendly_should_speed_up() ) - { - self.moveplaybackrate = 2.0; - wait 0.05; - } - - self.moveplaybackrate = 1.0; - } -} - -friendly_should_speed_up() -{ - prof_begin( "friendly_movement_rate_math" ); - - if ( !isdefined( self.goalpos ) ) - { - prof_end( "friendly_movement_rate_math" ); - return false; - } - - if ( distanceSquared( self.origin, self.goalpos ) <= level.goodFriendlyDistanceFromPlayerSquared ) - { - prof_end( "friendly_movement_rate_math" ); - return false; - } - - // check if AI is visible in player's FOV - if ( within_fov( level.player.origin, level.player getPlayerAngles(), self.origin, level.cosine[ "60" ] ) ) - { - prof_end( "friendly_movement_rate_math" ); - return false; - } - - prof_end( "friendly_movement_rate_math" ); - - return true; -} - -isHero() -{ - if ( !isdefined( self ) ) - return false; - - if ( !isdefined( self.script_noteworthy ) ) - return false; - - if ( self.script_noteworthy == "hero" ) - return true; - - return false; -} - -friendly_sight_distance( fDistance ) -{ - dist = fDistance * fDistance; - for( i = 0 ; i < level.friendlies.size ; i++ ) - level.friendlies[ i ].maxsightdistsqrd = dist; -} - -friendly_movement_speed( speed ) -{ - for( i = 0 ; i < level.friendlies.size ; i++ ) - level.friendlies[ i ].moveplaybackrate = speed; -} - -friendly_stance( stance1, stance2, stance3 ) -{ - for( i = 0 ; i < level.friendlies.size ; i++ ) - { - if ( isdefined ( stance3 ) ) - level.friendlies[ i ] allowedStances( stance1, stance2, stance3 ); - else - if ( isdefined ( stance2 ) ) - level.friendlies[ i ] allowedStances( stance1, stance2 ); - else - level.friendlies[ i ] allowedStances( stance1 ); - } -} - -distracted_guys_spawn() -{ - script_org = getent( self.target, "targetname" ); - assert( isdefined( script_org ) ); - assert( script_org.classname == "script_origin" ); - distractedGuyStruct = spawnStruct(); - - targeted = getentarray( script_org.target, "targetname" ); - distractedGuyStruct.alert_triggers = []; - distractedGuyStruct.spawners = []; - for( i = 0 ; i < targeted.size ; i++ ) - { - if ( issubstr( targeted[ i ].classname, "trigger" ) ) - { - assert( isdefined( targeted[ i ].script_noteworthy ) ); - distractedGuyStruct.alert_triggers[ distractedGuyStruct.alert_triggers.size ] = targeted[ i ]; - } - else if ( targeted[ i ] isSpawner() ) - { - assert( isdefined( targeted[ i ].script_animation ) ); - distractedGuyStruct.spawners[ distractedGuyStruct.spawners.size ] = targeted[ i ]; - } - } - assert( distractedGuyStruct.alert_triggers.size > 0 ); - assert( distractedGuyStruct.spawners.size > 0 ); - - distractedGuyStruct.nodes = []; - for( i = 0 ; i < distractedGuyStruct.spawners.size ; i++ ) - { - assert( isdefined( distractedGuyStruct.spawners[ i ].target ) ); - node = getnode( distractedGuyStruct.spawners[ i ].target, "targetname" ); - assert( isdefined( node ) ); - distractedGuyStruct.nodes[ distractedGuyStruct.nodes.size ] = node; - } - - assert( distractedGuyStruct.nodes.size > 0 ); - assert( distractedGuyStruct.nodes.size == distractedGuyStruct.spawners.size ); - - self waittill( "trigger" ); - - // spawn the guys - distractedGuyStruct.guys = []; - for( i = 0 ; i < distractedGuyStruct.spawners.size ; i++ ) - { - spawned = distractedGuyStruct.spawners[ i ] stalingradSpawn(); - if ( spawn_failed( spawned ) ) - { - assertMsg( "distracted guy failed to spawn" ); - return; - } - distractedGuyStruct.guys[ distractedGuyStruct.guys.size ] = spawned; - } - assert( distractedGuyStruct.guys.size > 0 ); - - thread distractedGuys_animate( distractedGuyStruct ); -} - -distractedGuys_animate( distractedGuyStruct ) -{ - for( i = 0 ; i < distractedGuyStruct.alert_triggers.size ; i++ ) - distractedGuyStruct.alert_triggers[ i ] thread distractedGuys_alert_trigger( distractedGuyStruct ); - - for( i = 0 ; i < distractedGuyStruct.guys.size ; i++ ) - { - distractedGuyStruct.guys[ i ].distracted = true; - //distractedGuyStruct.guys[ i ].ignoreme = true; - distractedGuyStruct.guys[ i ] thread alert_event_notify( distractedGuyStruct ); - distractedGuyStruct.guys[ i ].animname = distractedGuyStruct.guys[ i ].script_animation; - distractedGuyStruct.nodes[ i ] thread anim_loop_solo( distractedGuyStruct.guys[ i ], "idle", undefined, "stop_idle" ); - distractedGuyStruct.guys[ i ].allowdeath = true; - if ( isdefined( level.scr_anim[ distractedGuyStruct.guys[ i ].animname ][ "death" ] ) ) - distractedGuyStruct.guys[ i ].deathanim = level.scr_anim[ distractedGuyStruct.guys[ i ].animname ][ "death" ]; - } - - thread distractedGuys_alert( distractedGuyStruct ); -} - -distractedGuys_alert_trigger( distractedGuyStruct ) -{ - self waittill( self.script_noteworthy ); - distractedGuyStruct notify( "alerted" ); -} - -distractedGuys_alert( distractedGuyStruct ) -{ - switch( distractedGuyStruct.guys.size ) - { - case 1: - level waittill_any_ents( distractedGuyStruct, "alerted", - distractedGuyStruct.guys[ 0 ] , "alerted", - distractedGuyStruct.guys[ 0 ], "death", - distractedGuyStruct.guys[ 0 ], "damage" ); - break; - case 2: - level waittill_any_ents( distractedGuyStruct, "alerted", - distractedGuyStruct.guys[ 0 ] , "alerted", - distractedGuyStruct.guys[ 0 ], "death", - distractedGuyStruct.guys[ 0 ], "damage", - distractedGuyStruct.guys[ 1 ], "alerted", - distractedGuyStruct.guys[ 1 ], "death", - distractedGuyStruct.guys[ 1 ], "damage" ); - break; - } - - distractedGuyStruct notify( "alerted" ); - wait randomfloatrange( 0, 1.3 ); - - for( i = 0 ; i < distractedGuyStruct.guys.size ; i++ ) - { - if ( !isalive( distractedGuyStruct.guys[ i ] ) ) - continue; - - distractedGuyStruct.guys[ i ].distracted = undefined; - //distractedGuyStruct.guys[ i ].ignoreme = false; - distractedGuyStruct.guys[ i ] notify( "alerted" ); - distractedGuyStruct.guys[ i ] notify( "stop_idle" ); - distractedGuyStruct.guys[ i ].deathanim = undefined; - if ( isdefined( level.scr_anim[ distractedGuyStruct.guys[ i ].animname ][ "react" ] ) ) - distractedGuyStruct.nodes[ i ] thread anim_single_solo( distractedGuyStruct.guys[ i ], "react" ); - else - distractedGuyStruct.guys[ i ] stopanimscripted(); - } -} - -assasination() -{ - targeted = getentarray( self.target, "targetname" ); - script_org = undefined; - assasinate_trigger = undefined; - for( i = 0 ; i < targeted.size ; i++ ) - { - if ( targeted[ i ].classname == "script_origin" ) - script_org = targeted[ i ]; - if ( issubstr( targeted[ i ].classname, "trigger" ) ) - assasinate_trigger = targeted[ i ]; - } - assert( isdefined( script_org ) ); - assasinationStruct = spawnStruct(); - if ( isdefined( assasinate_trigger ) ) - assasinationStruct.assasinate_trigger = assasinate_trigger; - - targeted = getentarray( script_org.target, "targetname" ); - assasinationStruct.assasination_triggers = []; - assasinationStruct.spawners = []; - for( i = 0 ; i < targeted.size ; i++ ) - { - if ( issubstr( targeted[ i ].classname, "trigger" ) ) - { - assert( isdefined( targeted[ i ].script_noteworthy ) ); - assasinationStruct.assasination_triggers[ assasinationStruct.assasination_triggers.size ] = targeted[ i ]; - } - else if ( targeted[ i ] isSpawner() ) - { - assasinationStruct.spawners[ assasinationStruct.spawners.size ] = targeted[ i ]; - } - } - assert( assasinationStruct.assasination_triggers.size > 0 ); - assert( assasinationStruct.spawners.size > 0 ); - - for( i = 0 ; i < assasinationStruct.spawners.size ; i++ ) - { - assert( isdefined( assasinationStruct.spawners[ i ].target ) ); - node = getnode( assasinationStruct.spawners[ i ].target, "targetname" ); - assert( isdefined( node ) ); - assasinationStruct.spawners[ i ].animnode = node; - } - - self waittill( "trigger" ); - - // spawn the guys - assasinationStruct.guys = []; - for( i = 0 ; i < assasinationStruct.spawners.size ; i++ ) - { - spawned = assasinationStruct.spawners[ i ] stalingradSpawn(); - if ( spawn_failed( spawned ) ) - { - assertMsg( "assasination guy failed to spawn" ); - return; - } - assert( isdefined( assasinationStruct.spawners[ i ].animnode ) ); - spawned.animnode = assasinationStruct.spawners[ i ].animnode; - assasinationStruct.guys[ assasinationStruct.guys.size ] = spawned; - } - assert( assasinationStruct.guys.size > 0 ); - assasinationStruct.executioners = []; - allGuys = assasinationStruct.guys; - for( i = 0 ; i < allGuys.size ; i++ ) - { - if ( allGuys[ i ].team != "axis" ) - { - //allGuys[ i ].ignoreme = true; - continue; - } - - assasinationStruct.executioners[ assasinationStruct.executioners.size ] = allGuys[ i ]; - assasinationStruct.guys = array_remove( assasinationStruct.guys, allGuys[ i ] ); - } - assert( assasinationStruct.executioners.size > 0 ); - assert( assasinationStruct.guys.size > 0 ); - assert( assasinationStruct.guys.size + assasinationStruct.executioners.size == assasinationStruct.spawners.size ); - - thread assasination_think( assasinationStruct ); -} - -assasination_think( assasinationStruct ) -{ - for( i = 0 ; i < assasinationStruct.executioners.size ; i++ ) - assasinationStruct.executioners[ i ] endon( "death" ); - - for( i = 0 ; i < assasinationStruct.guys.size ; i++ ) - thread assasination_assasinated_idle( assasinationStruct, i ); - - for( i = 0 ; i < assasinationStruct.executioners.size ; i++ ) - thread assasination_executioner_idle( assasinationStruct, i ); - - thread assasination_alert( assasinationStruct ); - - assasinationStruct waittill_any( "alerted", "assasinate" ); - - createthreatbiasgroup( "executioner" ); - createthreatbiasgroup( "assasinated" ); - setthreatbias( "assasinated", "executioner", 100000 ); - - for( i = 0 ; i < assasinationStruct.executioners.size ; i++ ) - { - assasinationStruct.executioners[ i ] setthreatbiasgroup( "executioner" ); - assasinationStruct.executioners[ i ] notify( "stop_idle" ); - assasinationStruct.executioners[ i ] stopanimscripted(); - assasinationStruct.executioners[ i ].goalradius = 16; - assasinationStruct.executioners[ i ] setGoalNode( assasinationStruct.executioners[ i ].animnode ); - assasinationStruct.executioners[ i ].old_baseAccuracy = assasinationStruct.executioners[ i ].baseAccuracy; - assasinationStruct.executioners[ i ].baseAccuracy = 1000; - } - - for( i = 0 ; i < assasinationStruct.guys.size ; i++ ) - { - assasinationStruct.guys[ i ] setthreatbiasgroup( "assasinated" ); - assasinationStruct.guys[ i ].deathanim = level.scr_anim[ "assasinated" ][ "knees_fall" ]; - assasinationStruct.guys[ i ] thread assasination_ragdoll_death(); - assasinationStruct.guys[ i ].allowdeath = true; - //assasinationStruct.guys[ i ].ignoreme = false; - } - - switch( assasinationStruct.guys.size ) - { - case 1: - assasinationStruct.guys[ 0 ] waittill( "death" ); - break; - case 2: - waittill_multiple_ents( assasinationStruct.guys[ 0 ], "death", assasinationStruct.guys[ 1 ], "death" ); - break; - case 3: - waittill_multiple_ents( assasinationStruct.guys[ 0 ], "death", assasinationStruct.guys[ 1 ], "death", assasinationStruct.guys[ 2 ], "death" ); - break; - case 4: - waittill_multiple_ents( assasinationStruct.guys[ 0 ], "death", assasinationStruct.guys[ 1 ], "death", assasinationStruct.guys[ 2 ], "death", assasinationStruct.guys[ 3 ], "death" ); - break; - } - - for( i = 0 ; i < assasinationStruct.executioners.size ; i++ ) - { - assasinationStruct.executioners[ i ].baseAccuracy = assasinationStruct.executioners[ i ].old_baseAccuracy; - assasinationStruct.executioners[ i ].old_baseAccuracy = undefined; - } -} - -assasination_alert( assasinationStruct ) -{ - for( i = 0 ; i < assasinationStruct.assasination_triggers.size ; i++ ) - assasinationStruct.assasination_triggers[ i ] thread assasination_kill_trigger( assasinationStruct ); - - for( i = 0 ; i < assasinationStruct.executioners.size ; i++ ) - { - assasinationStruct.executioners[ i ] thread alert_event_notify( assasinationStruct ); - thread assasination_alert_thread( assasinationStruct.executioners[ i ], assasinationStruct ); - } -} - -assasination_alert_thread( guy, assasinationStruct ) -{ - level waittill_any_ents( assasinationStruct, "alerted", - guy , "alerted", - guy, "death", - guy, "damage" ); - - assasinationStruct notify( "assasinate" ); -} - -assasination_ragdoll_death() -{ - self waittill( "death" ); - wait 0.5; - if ( isdefined( self ) ) - self startRagDoll(); -} - -assasination_assasinated_idle( assasinationStruct, guyIndex ) -{ - assasinationStruct.guys[ guyIndex ] thread gun_remove(); - assasinationStruct.guys[ guyIndex ].animname = "assasinated"; - if ( randomint( 3 ) == 0 ) - { - if ( randomint( 3 ) == 0 ) - assasinationStruct.guys[ guyIndex ].animnode anim_single_solo( assasinationStruct.guys[ guyIndex ], "stand_idle2" ); - assasinationStruct.guys[ guyIndex ].animnode anim_single_solo( assasinationStruct.guys[ guyIndex ], "stand_fall" ); - } - assasinationStruct.guys[ guyIndex ].animnode thread anim_loop_solo( assasinationStruct.guys[ guyIndex ], "knees_idle", undefined, "stop_idle" ); -} - -assasination_executioner_idle( assasinationStruct, guyIndex ) -{ - assasinationStruct.executioners[ guyIndex ].allowdeath = true; - assasinationStruct.executioners[ guyIndex ].animname = "executioner"; - assasinationStruct.executioners[ guyIndex ].animnode thread anim_loop_solo( assasinationStruct.executioners[ guyIndex ], "idle", undefined, "stop_idle" ); -} - -assasination_kill_trigger( assasinationStruct ) -{ - self waittill( self.script_noteworthy ); - assasinationStruct notify( "assasinate" ); -} - -alert_event_notify( struct ) -{ - struct endon( "alerted" ); - self endon( "death" ); - - self thread add_event_listener( "grenade danger" ); - self thread add_event_listener( "gunshot" ); - self thread add_event_listener( "silenced_shot" ); - self thread add_event_listener( "bulletwhizby" ); - self thread add_event_listener( "projectile_impact" ); - - self waittill( "event_notify" ); - - struct notify( "alerted" ); -} - -add_event_listener( sEventString ) -{ - self endon( "death" ); - self endon( "event_notify" ); - self addAIEventListener( sEventString ); - self waittill( sEventString ); - self removeAIEventListener( sEventString ); - self notify( "event_notify" ); -} - -seek_player() -{ - self endon( "death" ); - - if ( ( isdefined( self.distracted ) ) && ( self.distracted == true ) ) - self waittill( "alerted" ); - - self.goalradius = 600; - self setgoalentity( level.player ); -} - -enemy_color_hint_trigger_think() -{ - for(;;) - { - // trigger is hit - notify the targeted trigger to make enemies use color nodes - self waittill( "trigger" ); - - getent( self.target, "targetname" ) notify( "trigger" ); - level.seekersUsingColors = true; - - while( level.player isTouching( self ) ) - wait 0.1; - - // player not in trigger anymore - make enemies use players goal pos - level.seekersUsingColors = false; - level notify( "seekers_chase_player" ); - } -} - -seek_player_smart() -{ - self endon( "death" ); - - if ( ( isdefined( self.distracted ) ) && ( self.distracted == true ) ) - self waittill( "alerted" ); - - self set_force_color( "r" ); - for(;;) - { - if ( !level.seekersUsingColors ) - { - self.goalradius = 2000; - self.pathenemyfightdist = 1500; - self setEngagementMinDist( 1300, 1000 ); - self setgoalentity( level.player ); - } - level waittill( "seekers_chase_player" ); - } -} - -seek_player_dog() -{ - self.goalradius = 1000; - self setgoalentity( level.player ); -} - -indoor_enemy() -{ - //self.engagemaxdist = 512; - //self.engagemaxfalloffdist = 1024; -} - -waittill_ai_in_volume_dead( volumeTargetname ) -{ - volume = getent( volumeTargetname, "targetname" ); - axis = getaiarray( "axis" ); - volumeAxis = []; - for( i = 0 ; i < axis.size ; i++ ) - { - if ( !axis[ i ] isTouching( volume ) ) - continue; - volumeAxis[ volumeAxis.size ] = axis[ i ]; - } - - if( volumeAxis.size > 0 ) - waittill_dead( volumeAxis ); -} - -add_objective_building( aiGroupNum ) -{ - if ( !isdefined( level._ai_group ) ) - return; - - if ( !isdefined( level._ai_group[ aiGroupNum ] ) ) - return; - - if ( !isdefined( level.buildings_remaining ) ) - level.buildings_remaining = 0; - level.buildings_remaining++; - - if ( !isdefined( level.suggested_objective_order ) ) - level.suggested_objective_order = []; - - // Find the matching script_origin building location for this objective. It will have the same script_aigroup as the AI - all_obj_locs = getentarray( "objective_location", "targetname" ); - objective_location = undefined; - for( i = 0 ; i < all_obj_locs.size ; i++ ) - { - assert( isdefined( all_obj_locs[ i ].script_aigroup ) ); - if ( all_obj_locs[ i ].script_aigroup != aiGroupNum ) - continue; - objective_location = all_obj_locs[ i ].origin; - break; - } - assert( isdefined( objective_location ) ); - - // add this objective to the suggested order - objectiveIndex = level.suggested_objective_order.size; - level.suggested_objective_order[ objectiveIndex ] = spawnStruct(); - level.suggested_objective_order[ objectiveIndex ].aiGroupNum = aiGroupNum; - level.suggested_objective_order[ objectiveIndex ].completed = false; - level.suggested_objective_order[ objectiveIndex ].additionalPositionIndex = level.buildings_remaining; - level.suggested_objective_order[ objectiveIndex ].location = objective_location; - - // Wait until all AI at this building objective are dead - waittill_aigroupcleared( aiGroupNum ); - - wait randomfloatrange( 1.5, 3.0 ); - - arcademode_checkpoint( 4, "building_" + aiGroupNum ); - - if ( ( isdefined( level.alasad_objective_location ) ) && ( aiGroupNum == level.alasad_objective_location ) ) - return; - - // Buildings cleared - update waypoints - level.buildings_remaining--; - level.suggested_objective_order[ objectiveIndex ].completed = true; - thread objective_updateNextWaypoints(); - - if ( !flag( "alasad_sequence_started" ) ) - { - if ( level.buildingClearNextAudio == 0 ) - { - // Building clear. No sign of Al-Asad. Move on. - level.gaz thread anim_single_solo( level.gaz, "nosign" ); - - // increase the ambient - thread maps\_utility::set_ambient( "exterior3" ); - } - else if ( level.buildingClearNextAudio == 1 ) - { - // Building is clear. Move on to the next one. - level.gaz thread anim_single_solo( level.gaz, "nextone" ); - } - else if ( level.buildingClearNextAudio == 2 ) - { - // This building's clear! Let's check the other buildings! - level.gaz thread anim_single_solo( level.gaz, "checkother" ); - } - else if ( level.buildingClearNextAudio == 3 ) - { - // Building clear. Let's check the next one. - level.gaz thread anim_single_solo( level.gaz, "checknext" ); - - // settle the ambient - thread maps\_utility::set_ambient( "exterior1" ); - } - else if ( level.buildingClearNextAudio == 4 ) - { - // Building clear. No sign of Al-Asad. Move on. - level.gaz thread anim_single_solo( level.gaz, "nosign" ); - } - level.buildingClearNextAudio++; - } - - // Autosave the game at this point - thread doAutoSave( "building_" + aiGroupNum + "_cleared" ); - - // if there is only one possible alasad location remaining then activate it now - level.alasad_possible_objective_locations_remaining = array_remove( level.alasad_possible_objective_locations_remaining, aiGroupNum ); - if ( level.alasad_possible_objective_locations_remaining.size > 1 ) - return; - if ( isdefined( level.alasad_sequence_init ) ) - return; - if ( level.alasad_possible_objective_locations_remaining[ 0 ] == "2" ) - thread do_alasad( "house" ); - else if ( level.alasad_possible_objective_locations_remaining[ 0 ] == "6" ) - thread do_alasad( "barn" ); -} - -objective_updateNextWaypoints() -{ - numObjectivesDisplayed = 2; - numObjectivesAdded = 0; - - // clear all objective waypoints - for ( i = 0 ; i < level.suggested_objective_order.size ; i++ ) - objective_additionalposition( 0, i, ( 0, 0, 0 ) ); - - // get the next locations to be shown - for ( objectiveIndex = 0 ; objectiveIndex < level.suggested_objective_order.size ; objectiveIndex++ ) - { - if ( level.suggested_objective_order[ objectiveIndex ].completed ) - continue; - - // add objective waypoint - positionIndex = level.suggested_objective_order[ objectiveIndex ].additionalPositionIndex; - location = level.suggested_objective_order[ objectiveIndex ].location; - objective_additionalposition( 0, numObjectivesAdded + 1, location ); - - // make sure we only add as many waypoints as specified - numObjectivesAdded++; - if ( numObjectivesAdded == numObjectivesDisplayed ) - return; - assert( numObjectivesAdded < numObjectivesDisplayed ); - } -} - -chopper_air_support() -{ - dialogIndex = 0; - level.lastUsedWeapon = undefined; - level.fake_chopper_ammo = 1; - flag_init("ammo_cheat_for_chopper"); - - for(;;) - { - while( level.player getcurrentweapon() != "cobra_air_support" ) - { - level.lastUsedWeapon = level.player GetCurrentWeapon(); - wait 0.05; - } - - if(getdvar("player_sustainAmmo") == "0" && !flag("ammo_cheat_for_chopper")) - ammo = level.player getAmmoCount( "cobra_air_support" ); - else - { - flag_set("ammo_cheat_for_chopper"); //once cheat has been called maintain fake ammo. going in and out breaks things. - Nate - ammo = level.fake_chopper_ammo; - } - - if ( ( !isdefined( ammo ) ) || ( ammo <= 0 ) ) - { - // give player his weapon back - chopper_air_support_giveBackWeapon(); - - if ( flag( "air_support_refueling" ) ) - { - if ( dialogIndex == 0 ) - { - // Negative, we are refueling at this time. Standby. - thread radio_dialogue_queue( "refueling" ); - dialogIndex = 1; - } - else - { - // We are rearming at this time. Standby. - thread radio_dialogue_queue( "rearming" ); - dialogIndex = 0; - } - } - - wait 1; - continue; - } - - thread chopper_air_support_activate(); - - while( level.player getcurrentweapon() == "cobra_air_support" ) - wait 0.05; - - level notify( "air_support_canceled" ); - thread chopper_air_support_deactive(); - } -} - -chopper_air_support_removeFunctionality() -{ - level.player takeWeapon( "cobra_air_support" ); - level notify( "air_support_canceled" ); - level notify( "air_support_deleted" ); - thread chopper_air_support_deactive(); - if ( isdefined( level.chopper ) ) - { - level.chopper.delete_on_death = true; - level.chopper notify( "death" ); - } -} - -chopper_air_support_activate() -{ - level endon( "air_support_canceled" ); - level endon( "air_support_called" ); - thread chopper_air_support_paint_target(); - thread air_support_hint_print_call(); - - // Make the arrow - level.chopperAttackArrow = spawn( "script_model", ( 0, 0, 0 ) ); - level.chopperAttackArrow setModel( "tag_origin" ); - level.chopperAttackArrow.angles = ( -90, 0, 0 ); - level.chopperAttackArrow.offset = 4; - - playfxontag( getfx( "air_support_fx_yellow" ), level.chopperAttackArrow, "tag_origin" ); - - level.playerActivatedAirSupport = true; - - coord = undefined; - - traceOffset = 15; - traceLength = 15000; - minValidLength = 300 * 300; - - trace = []; - - trace[ 0 ] = spawnStruct(); - trace[ 0 ].offsetDir = "vertical"; - trace[ 0 ].offsetDist = traceOffset; - - trace[ 1 ] = spawnStruct(); - trace[ 1 ].offsetDir = "vertical"; - trace[ 1 ].offsetDist = traceOffset * -1; - - trace[ 2 ] = spawnStruct(); - trace[ 2 ].offsetDir = "horizontal"; - trace[ 2 ].offsetDist = traceOffset; - - trace[ 3 ] = spawnStruct(); - trace[ 3 ].offsetDir = "horizontal"; - trace[ 3 ].offsetDist = traceOffset * -1; - - rotateTime = 0; - - for(;;) - { - wait 0.05; - - prof_begin( "spotting_marker" ); - - // Trace to where the player is looking - direction = level.player getPlayerAngles(); - direction_vec = anglesToForward( direction ); - eye = level.player getEye(); - - for ( i = 0 ; i < trace.size ; i++ ) - { - start = eye; - vec = undefined; - if ( trace[ i ].offsetDir == "vertical" ) - vec = anglesToUp( direction ); - else if ( trace[ i ].offsetDir == "horizontal" ) - vec = anglesToRight( direction ); - assert( isdefined( vec ) ); - start = start + vector_multiply( vec, trace[ i ].offsetDist ); - trace[ i ].trace = bullettrace( start, start + vector_multiply( direction_vec , traceLength ), 0, undefined ); - trace[ i ].length = distanceSquared( start, trace[ i ].trace[ "position" ] ); - - if ( getdvar( "village_assault_debug_marker") == "1" ) - thread draw_line_for_time( start, trace[ i ].trace[ "position" ], 1, 1, 1, 0.05 ); - } - - validLocations = []; - validNormals = []; - for ( i = 0 ; i < trace.size ; i++ ) - { - if ( trace[ i ].length < minValidLength ) - continue; - index = validLocations.size; - validLocations[ index ] = trace[ i ].trace[ "position" ]; - validNormals[ index ] = trace[ i ].trace[ "normal" ]; - - if ( getdvar( "village_assault_debug_marker") == "1" ) - thread draw_line_for_time( level.player getEye(), validLocations[ index ], 0, 1, 0, 0.05 ); - } - - // if all points are too close just use all of them since none are good - if ( validLocations.size == 0 ) - { - for ( i = 0 ; i < trace.size ; i++ ) - { - validLocations[ i ] = trace[ i ].trace[ "position" ]; - validNormals[ i ] = trace[ i ].trace[ "normal" ]; - } - } - - assert( validLocations.size > 0 ); - - if ( validLocations.size == 4 ) - { - fxLocation = findAveragePointVec( validLocations[ 0 ], validLocations[ 1 ], validLocations[ 2 ], validLocations[ 3 ] ); - fxNormal = findAveragePointVec( validNormals[ 0 ], validNormals[ 1 ], validNormals[ 2 ], validNormals[ 3 ] ); - } - else if ( validLocations.size == 3 ) - { - fxLocation = findAveragePointVec( validLocations[ 0 ], validLocations[ 1 ], validLocations[ 2 ] ); - fxNormal = findAveragePointVec( validNormals[ 0 ], validNormals[ 1 ], validNormals[ 2 ] ); - } - else if ( validLocations.size == 2 ) - { - fxLocation = findAveragePointVec( validLocations[ 0 ], validLocations[ 1 ] ); - fxNormal = findAveragePointVec( validNormals[ 0 ], validNormals[ 1 ] ); - } - else - { - fxLocation = validLocations[ 0 ]; - fxNormal = validNormals[ 0 ]; - } - - if ( getdvar( "village_assault_debug_marker") == "1" ) - thread draw_line_for_time( level.player getEye(), fxLocation, 1, 0, 0, 0.05 ); - - thread drawChopperAttackArrow( fxLocation, fxNormal, rotateTime ); - - rotateTime = 0.2; - - prof_end( "spotting_marker" ); - } -} - -findAveragePointVec( point1, point2, point3, point4 ) -{ - assert( isdefined( point1 ) ); - assert( isdefined( point2 ) ); - - if ( isdefined( point4 ) ) - { - x = findAveragePoint( point1[ 0 ], point2[ 0 ], point3[ 0 ], point4[ 0 ] ); - y = findAveragePoint( point1[ 1 ], point2[ 1 ], point3[ 1 ], point4[ 1 ] ); - z = findAveragePoint( point1[ 2 ], point2[ 2 ], point3[ 2 ], point4[ 2 ] ); - } - else if ( isdefined( point3 ) ) - { - x = findAveragePoint( point1[ 0 ], point2[ 0 ], point3[ 0 ] ); - y = findAveragePoint( point1[ 1 ], point2[ 1 ], point3[ 1 ] ); - z = findAveragePoint( point1[ 2 ], point2[ 2 ], point3[ 2 ] ); - } - else - { - x = findAveragePoint( point1[ 0 ], point2[ 0 ] ); - y = findAveragePoint( point1[ 1 ], point2[ 1 ] ); - z = findAveragePoint( point1[ 2 ], point2[ 2 ] ); - } - return( x, y, z ); -} - -findAveragePoint( point1, point2, point3, point4 ) -{ - assert( isdefined( point1 ) ); - assert( isdefined( point2 ) ); - - if ( isdefined( point4 ) ) - return ( ( point1 + point2 + point3 + point4 ) / 4 ); - else if ( isdefined( point3 ) ) - return ( ( point1 + point2 + point3 ) / 3 ); - else - return ( ( point1 + point2 ) / 2 ); -} - -chopper_air_support_deactive() -{ - thread delete_attack_coord_hint(); - wait 0.05; - if ( isdefined( level.chopperAttackArrow ) ) - level.chopperAttackArrow delete(); -} - -chopper_air_support_giveBackWeapon() -{ - if ( ( isdefined( level.lastUsedWeapon ) ) && ( level.player HasWeapon( level.lastUsedWeapon ) ) ) - { - level.player switchToWeapon( level.lastUsedWeapon ); - } - else - { - weaponList = level.player GetWeaponsListPrimaries(); - if ( isdefined( weaponList[ 0 ] ) ) - level.player switchToWeapon( weaponList[ 0 ] ); - } -} - -chopper_air_support_paint_target() -{ - level endon( "air_support_canceled" ); - level.player waittill ( "weapon_fired" ); - - level.fake_chopper_ammo = 0; - level.playerCalledAirSupport = true; - - thread chopper_air_support_mark(); - - // give player his weapon back - chopper_air_support_giveBackWeapon(); - - thread chopper_air_support_call_chopper( level.chopperAttackArrow.origin ); - - level notify( "air_support_called" ); - chopper_air_support_deactive(); - - if ( level.chopperSupportCallNextAudio == 0 ) - thread radio_dialogue_queue( "ontheway" ); // Mosin Two-Five here. We're on the way. Standby for air support. - else if ( level.chopperSupportCallNextAudio == 1 ) - thread radio_dialogue_queue( "helicopteronway" ); // Helicopter is on the way. We'll handle it. Out. - else if ( level.chopperSupportCallNextAudio == 2 ) - thread radio_dialogue_queue( "wehavetarget" ); // This is Mosin Two-Five, we have the target. Standby. - - level.chopperSupportCallNextAudio++; - if ( level.chopperSupportCallNextAudio > 2 ) - level.chopperSupportCallNextAudio = 0; -} - -chopper_dialog() -{ - -} - -chopper_air_support_mark() -{ - marker = spawn( "script_model", level.chopperAttackArrow.origin ); - marker setModel( "tag_origin" ); - marker.angles = level.chopperAttackArrow.angles; - - wait 0.1; - - playfxontag( getfx( "air_support_fx_red" ), marker, "tag_origin" ); - - wait 5.0; - - marker delete(); -} - -chopper_air_support_friendlyFire() -{ - self endon( "death" ); - chopper_accumulated_friendly_damage = 0; - for(;;) - { - self waittill( "damage", amount, attacker, direction, point, type ); - if ( attacker != level.player ) - continue; - if ( ( isdefined( type ) ) && ( !issubstr( tolower( type ), "bullet" ) ) ) - break; - - if ( isdefined( amount ) && ( amount > 0 ) ) - chopper_accumulated_friendly_damage += amount; - - if ( chopper_accumulated_friendly_damage >= 500 ) - break; - } - thread maps\_friendlyfire::missionfail(); -} - -chopper_air_support_call_chopper( coordinate ) -{ - closestPoint = findBestChopperWaypoint( coordinate, 45 ); - if ( closestPoint <= -1 ) - { - wait 0.05; - closestPoint = findBestChopperWaypoint( coordinate, 70 ); - if ( closestPoint <= -1 ) - { - wait 0.05; - closestPoint = findBestChopperWaypoint( coordinate, 70, true ); - } - } - assert( closestPoint > -1 ); - - if ( getdvar( "debug_chopper_air_support") == "1" ) - print3d( level.chopperSupportHoverLocations[ closestPoint ] + ( 0, 0,20 ), "chosen", ( 0, 0, 1 ), 1.0, 3.0, 10000 ); - - // spawn the chopper - level.chopper = maps\_vehicle::spawn_vehicle_from_targetname( "chopper" ); - assert( isdefined( level.chopper ) ); - level.chopper endon( "death" ); - - level.chopper thread chopper_air_support_friendlyFire(); - - returnToBasePos = level.chopper.origin; - - // fly chopper to that point and make it face the direction of the target - eTarget = spawn( "script_origin", coordinate ); - level.chopper setLookAtEnt( eTarget ); - - level.chopper setspeed( 65, 10, 20 ); - level.chopper sethoverparams( 250, 60, 35 ); - yawAngle = vectorToAngles( coordinate - level.chopperSupportHoverLocations[ closestPoint ] ); - level.chopper setgoalyaw( yawAngle[ 1 ] ); - level.chopper setvehgoalpos( level.chopperSupportHoverLocations[ closestPoint ], true ); - - level.chopper setNearGoalNotifyDist( 4000 ); - level.chopper waittill( "near_goal" ); - level.chopper thread chopper_ai_mode(); - level.chopper settargetyaw( yawAngle[ 1 ] ); - - level.chopper waittill( "goal" ); - - // kill all the spawners nearby the coordinate - killspawns = getentarray( "helicopter_force_kill_spawn", "targetname" ); - for ( i = 0 ; i < killspawns.size ; i++ ) - { - if ( eTarget isTouching( killspawns[ i ] ) ) - { - assert( isdefined( killspawns[ i ].target ) ); - trig = getentarray( killspawns[ i ].target, "targetname" ); - for ( j = 0 ; j < trig.size ; j++ ) - trig[ j ] notify( "trigger" ); - } - } - - level.chopper thread chopper_ai_mode_missiles( eTarget ); - - badplace_cylinder( "air_support_AOE", 30.0, eTarget.origin, 1050, 10000, "allies" ); - thread chopper_air_support_end( returnToBasePos ); - -} - -player_activated_air_support() -{ - return isdefined( level.playerActivatedAirSupport ); -} - -player_called_air_support() -{ - return isdefined( level.playerCalledAirSupport ); -} - -delete_hint_print_activated_air_support() -{ - if ( isdefined( level.air_support_hint_delete ) ) - { - level.air_support_hint_delete = undefined; - return true; - } - - return isdefined( level.playerActivatedAirSupport ); -} - -delete_attack_coord_hint() -{ - flag_set( "delete_attack_coord_hint" ); - level waittill( "checked_should_delete_hint" ); - flag_clear( "delete_attack_coord_hint" ); -} - -should_delete_attack_coord_hint() -{ - ans = flag( "delete_attack_coord_hint" ); - level notify( "checked_should_delete_hint" ); - return ans; -} - -findBestChopperWaypoint( coordinate, fov_angle, bForceLocation ) -{ - if ( getdvar( "debug_chopper_air_support") == "1" ) - iprintln( "chopper deciding which location to fly to" ); - - playerCoordinate = level.player.origin; - playerFaceAngle = level.player getPlayerAngles(); - targetFaceAngle = playerFaceAngle + ( 0, 180, 0 ); - cosine = cos( fov_angle ); - - if ( !isdefined( bForceLocation ) ) - bForceLocation = false; - - closestPoint = -1; - closestDist = 1000000000; - minimumSafeDistance = 1000 * 1000; - for( i = 0 ; i < level.chopperSupportHoverLocations.size ; i++ ) - { - p = level.chopperSupportHoverLocations[ i ]; - - if ( !bForceLocation ) - { - // dont use the point if it's not on the same side of the target as the player ( using imaginary perpindicular line to players facing direction ) - if( !within_fov( flat_origin( coordinate ), flat_angle( targetFaceAngle ), flat_origin( p ), cosine ) ) - continue; - } - - // get the closest point on the segment to the point - nearestPointOnLine = pointOnSegmentNearestToPoint( coordinate, playerCoordinate, p ); - d = distanceSquared( nearestPointOnLine, p ); - - if ( !bForceLocation ) - { - // make sure the chopper wont fly to a location too close to the target - if ( d < minimumSafeDistance ) - continue; - } - - if( d < closestDist ) - { - closestPoint = i; - closestDist = d; - } - - if ( getdvar( "debug_chopper_air_support") == "1" ) - print3d( p, d, ( 1, 1, 1 ), 1.0, 3.0, 10000 ); - } - return closestPoint; -} - -chopper_air_support_end( returnToBasePos ) -{ - level endon( "air_support_deleted" ); - - flag_clear( "air_support_refueling" ); - - wait 30; - - flag_set( "air_support_refueling" ); - - // This is Two-Five. We have to refuel and rearm. We will not be available for some time. - thread radio_dialogue_queue( "refuelandrearm" ); - - level notify( "air_support_over" ); - flyHomeVec = vectorToAngles( returnToBasePos - level.chopper.origin ); - - if ( !isdefined( level.chopper ) ) - return; - - level.chopper clearLookatEnt(); - level.chopper setTargetYaw( flyHomeVec[ 1 ] ); - level.chopper setVehGoalPos( returnToBasePos ); - - level.chopper waittill( "goal" ); - level.chopper delete(); - level.chopper = undefined; - - wait 20; - - flag_clear( "air_support_refueling" ); - - // Mosin Two-Five here. We are ready to attack and are standing by for new orders. - thread radio_dialogue_queue( "readytoattack" ); - - level.player giveStartAmmo( "cobra_air_support" ); - level.fake_chopper_ammo = 1; -} - -chopper_ai_mode() -{ - self thread chopper_ai_mode_aim_turret(); - self thread chopper_ai_mode_shoot_turret(); - self thread chopper_ai_mode_flares(); -} - -chopper_ai_mode_aim_turret() -{ - self endon( "death" ); - level endon( "air_support_over" ); - - for(;;) - { - eTarget = maps\_helicopter_globals::getEnemyTarget( 6000, level.cosine[ "45" ], true, true, true, true ); - if( isdefined( eTarget ) ) - { - eTargetOffset = ( 0, 0, 0 ); - if ( isdefined( eTarget.script_targetoffset_z ) ) - eTargetOffset += ( 0, 0, eTarget.script_targetoffset_z ); - else if ( isSentient( eTarget ) ) - eTargetOffset = ( 0, 0, 32 ); - self setTurretTargetEnt( eTarget, eTargetOffset ); - } - wait randomfloatrange( 0.2, 1.0 ); - } -} - -chopper_ai_mode_shoot_turret() -{ - self endon( "death" ); - level endon( "air_support_over" ); - - for(;;) - { - randomShots = randomintrange( 30, 60 ); - self setVehWeapon( "hind_turret" ); - for( i = 0 ; i < randomShots ; i++ ) - { - self fireWeapon( "tag_flash" ); - wait 0.05; - } - wait randomfloatrange( 1.0, 1.75 ); - } -} - -chopper_ai_mode_flares() -{ - self endon( "death" ); - level endon( "air_support_over" ); - - for(;;) - { - iNumFlares = randomintrange( 2, 8 ); - thread maps\_helicopter_globals::flares_fire_burst( self, iNumFlares, 1, 5.0 ); - wait randomfloatrange( 4.0, 8.0 ); - } -} - -chopper_ai_mode_missiles( eTarget ) -{ - eTargetOriginal = eTarget; - - self endon( "death" ); - level endon( "air_support_over" ); - for(;;) - { - iShots = randomintrange( 1, 5 ); - eTarget = maps\_helicopter_globals::getEnemyTarget( 6000, level.cosine[ "25" ], true, true, true, true ); - if ( ( isdefined( eTarget ) ) && ( isdefined( eTarget.origin ) ) ) - self maps\_helicopter_globals::fire_missile( "ffar_mi28_village_assault", iShots, eTarget ); - else - self maps\_helicopter_globals::fire_missile( "ffar_mi28_village_assault", iShots, eTargetOriginal ); - wait randomfloatrange( 3.5, 6.0 ); - } -} - -drawChopperAttackArrow( coord, normal, rotateTime ) -{ - assert( isdefined( level.chopperAttackArrow ) ); - assert( isdefined( coord ) ); - assert( isdefined( normal ) ); - assert( isdefined( rotateTime ) ); - - coord += vector_multiply( normal, level.chopperAttackArrow.offset ); - level.chopperAttackArrow.origin = coord; - - if ( rotateTime > 0 ) - level.chopperAttackArrow rotateTo( vectortoangles( normal ), 0.2 ); - else - level.chopperAttackArrow.angles = vectortoangles( normal ); -} - -getClosestInFOV( startOrigin, arrayEnts, fov_angle, minDistance ) -{ - cos = cos( fov_angle ); - - closestEnt = undefined; - secondClosestEnt = undefined; - closestDist = 1000000000; - for( i = 0 ; i < arrayEnts.size ; i++ ) - { - //if( !within_fov( flat_origin( startOrigin ), flat_angle( level.player getPlayerAngles() ), flat_origin( arrayEnts[ i ].origin ), cos ) ) - // continue; - - d = distancesquared( startOrigin, arrayEnts[ i ].origin ); - - if ( d < minDistance ) - continue; - - if( d < closestDist ) - { - secondClosestEnt = closestEnt; - closestEnt = arrayEnts[ i ]; - closestDist = d; - } - } - array = []; - array[ 0 ] = closestEnt; - array[ 1 ] = secondClosestEnt; - return array; -} - -vehicle_c4_think() -{ - iEntityNumber = self getentitynumber(); - rearOrgOffset = (0, -33, 10); - rearAngOffset = (0, 90, -90); - frontOrgOffset = (129, 0, 35); - frontAngOffset = (0, 90, 144); - - self maps\_c4::c4_location( "rear_hatch_open_jnt_left", rearOrgOffset, rearAngOffset ); - self maps\_c4::c4_location( "tag_origin", frontOrgOffset, frontAngOffset ); - self.rearC4location = spawn( "script_origin", self.origin ); - self.frontC4location = spawn( "script_origin", self.origin ); - self.rearC4location linkto( self, "rear_hatch_open_jnt_left", rearOrgOffset, rearAngOffset ); - self.frontC4location linkto( self, "tag_origin", frontOrgOffset, frontAngOffset ); - - self waittill( "c4_detonation" ); - - self.frontC4location delete(); - self.rearC4location delete(); - - self thread vehicle_death( iEntityNumber ); -} - -vehicle_death( iEntityNumber ) -{ - self notify( "clear_c4" ); - setplayerignoreradiusdamage( true ); - - //----------------------- - // FINAL EXPLOSION - //----------------------- - earthquake( 0.6, 2, self.origin, 2000 ); - self notify( "death" ); - thread play_sound_in_space( "exp_armor_vehicle", self gettagorigin( "tag_turret" ) ); - AI = get_ai_within_radius( 1024, self.origin, "axis" ); - if ( (isdefined(AI)) && (AI.size > 0) ) - array_thread(AI, ::AI_stun, .85); - - radiusdamage( self.origin, 256, 200, 100 ); - - if ( distancesquared( self.origin, level.player.origin ) <= ( 256 * 256 ) ) - level.player dodamage( level.player.health / 3, ( 0, 0, 0 ) ); -} - -AI_stun( fAmount ) -{ - self endon( "death" ); - if( ( isdefined( self ) ) && ( isalive( self ) ) && ( self getFlashBangedStrength() == 0 ) ) - self setFlashBanged( true, fAmount ); -} - -get_ai_within_radius( fRadius, org, sTeam ) -{ - if( isdefined( sTeam ) ) - ai = getaiarray( sTeam ); - else - ai = getaiarray(); - - aDudes = []; - for( i = 0 ; i < ai.size ; i++ ) - { - if ( distance( org, self.origin ) <= fRadius ) - array_add( aDudes, ai[ i ] ); - } - return aDudes; -} - -roaming_bmp() -{ - bmp = maps\_vehicle::waittill_vehiclespawn( "roaming_bmp" ); - assert( isdefined( bmp ) ); - - target_set( bmp, ( 0, 0, 32 ) ); - target_setJavelinOnly( bmp, true ); - - bmp thread vehicle_patrol_think(); - bmp thread vehicle_turret_think(); - bmp thread vehicle_c4_think(); - bmp thread maps\_vehicle::damage_hints(); - bmp thread bmp_autosave_on_death(); - bmp thread vehicle_death_think(); -} - -getDamageType( type ) -{ - //returns a simple damage type: melee, bullet, splash, or unknown - - if ( !isdefined( type ) ) - return "unknown"; - - type = tolower( type ); - switch( type ) - { - case "mod_explosive": - case "mod_explosive_splash": - return "c4"; - case "mod_projectile": - case "mod_projectile_splash": - return "rocket"; - case "mod_grenade": - case "mod_grenade_splash": - return "grenade"; - case "unknown": - return "unknown"; - default: - return "unknown"; - } -} - -vehicle_death_think() -{ - self endon ("death"); - for(;;) - { - self waittill( "damage", damage, attacker, direction_vec, point, type ); - - if (attacker != level.player) - continue; - - if ( !isdefined( damage ) ) - continue; - - if ( damage <= 0 ) - continue; - - type = getDamageType( type ); - assert( isdefined( type ) ); - - if ( ( type == "rocket" ) && ( damage >= 300 ) ) - break; - - if ( ( type == "c4" ) && ( damage >= 250 ) ) - break; - } - self notify( "c4_detonation" ); -} - - - - -vehicle_patrol_init() -{ - level.aVehicleNodes = []; - array1 = getvehiclenodearray( "go_forward", "script_noteworthy" ); - array2 = getvehiclenodearray( "go_backward", "script_noteworthy" ); - level.aVehicleNodes = array_merge( array1, array2 ); -} - -vehicle_patrol_think() -{ - level endon( "alasad_sequence_started" ); - self endon( "death" ); - - ePathstart = self.attachedpath; - self waittill( "reached_end_node" ); - - for(;;) - { - prof_begin( "bmp_logic" ); - - //----------------------- - // REINITIALIZE ALL VARIABLES - //----------------------- - aLinked_nodes = []; - eCurrentNode = undefined; - go_backward_node = undefined; - go_forward_node = undefined; - eStartNode = undefined; - closestEndNodes = undefined; - - //----------------------- - // GET LAST NODE IN CHAIN (CURRENT POSITION - //----------------------- - assert( isdefined( ePathstart ) ); - eCurrentNode = ePathstart get_last_ent_in_chain( "vehiclenode" ); - - //----------------------- - // GET ALL NODES THAT ARE GROUPED WITH THIS PATH END - //----------------------- - aLinked_nodes = level.aVehicleNodes; - aLinked_nodes = array_remove( aLinked_nodes, eCurrentNode); - aVehicleNodes = level.aVehicleNodes; - sScript_vehiclenodegroup = eCurrentNode.script_vehiclenodegroup; - assert(isdefined(sScript_vehiclenodegroup)); - for(i=0;i 0, "Ends of vehicle paths need to be grouped with at least one other chain of nodes for moving forward, backward or both"); - for(i=0;i= go_forward_node.end.script_vehiclenodegroup ) ) - eStartNode = go_forward_node; - else if ( ( isdefined( go_backward_node ) ) && ( closestEndNodes[ 0 ].script_vehiclenodegroup <= go_backward_node.end.script_vehiclenodegroup ) ) - eStartNode = go_backward_node; - - prof_end( "bmp_logic" ); - - //----------------------- - // GO ON THE NEW PATH TO GET CLOSER TO PLAYER OTHERWISE STAY PUT - //----------------------- - if ( isdefined(eStartNode) ) - { - self attachpath( eStartNode ); - ePathstart = eStartNode; - wait randomfloatrange( 0.2, 1.2 ); - self resumeSpeed( 100 ); - self waittill( "reached_end_node" ); - } - else - { - wait randomfloatrange( 3, 6 ); - } - } -} - -vehicle_turret_think() -{ - level endon( "alasad_sequence_started" ); - self endon( "death" ); - - eTarget = undefined; - - for(;;) - { - prof_begin( "bmp_logic" ); - - eTarget = maps\_helicopter_globals::getEnemyTarget( 3000, undefined, true, true, false, true ); - - prof_end( "bmp_logic" ); - - if ( isdefined( eTarget ) ) - { - self setTurretTargetEnt( eTarget, ( 0, 0, 32 ) ); - self waittill_notify_or_timeout( "turret_rotate_stopped", randomfloatrange( 2.0, 3.0 ) ); - - iFireTime = weaponfiretime( "bmp_turret" ); - assert( isdefined( iFireTime ) ); - assert( iFireTime > 0 ); - - iShots = randomintrange( 3, 8 ); - for( i = 0 ; i < iShots ; i++ ) - { - self fireWeapon(); - wait iFireTime; - } - } - wait randomfloat( 3.0, 6.0 ); - } -} - -doAutoSave( sSaveName ) -{ - assert( isdefined( sSaveName ) ); - thread autosave_by_name( sSaveName ); - thread timedAutosaves(); -} - -bmp_autosave_on_death() -{ - self waittill( "death" ); - if ( isdefined( self ) ) - target_remove( self ); - thread doAutoSave( "bmp_destroyed" ); -} - -timedAutosaves() -{ - level endon( "alasad_sequence_started" ); - level notify( "timedAutosaveThread" ); - level endon( "timedAutosaveThread" ); - - if ( level.timedAutosaveTime == 0 ) - return; - - for(;;) - { - wait level.timedAutosaveTime; - level.timedAutosaveNumber++; - thread doAutoSave( "timed_autosave" + level.timedAutosaveNumber ); - } -} - -genocide_audio_trigger() -{ - soundEnt = getent( self.target, "targetname" ); - assert( isdefined( soundEnt ) ); - - self waittill( "trigger" ); - - if ( isdefined( self.script_delay ) ) - wait self.script_delay; - - assert( isdefined( level.genocide_audio[ level.next_genocide_audio ] ) ); - - soundEnt playSound( level.genocide_audio[ level.next_genocide_audio ] ); - - level.next_genocide_audio++; -} - -dead_civilian() -{ - wait randomfloatrange( 0.05, 0.2 ); - spawned = dronespawn( self ); - spawned setContents( 0 ); - spawned startRagDoll(); -} - -air_support_hint_print_activate() -{ - level endon( "alasad_sequence_started" ); - - while( !player_activated_air_support() ) - { - if ( level.air_support_hint_print_dialog_next == 0 ) - { - // Soap! Call in air support on that building! - level.price thread anim_single_solo( level.price, "airsupport" ); - } - else if ( level.air_support_hint_print_dialog_next == 1 ) - { - // Use our air support to soften up that building! - level.price thread anim_single_solo( level.price, "softenup" ); - } - else - { - // Mosin Two-Five here. We are ready to attack and are standing by for new orders. - thread radio_dialogue_queue( "readytoattack" ); - } - level.air_support_hint_print_dialog_next++; - - if ( !flag( "gave_air_support_hint" ) ) - { - flag_set( "gave_air_support_hint" ); - if ( isdefined( level.console ) && level.console || getdvarint("gpad_in_use")) - thread display_air_support_hint_console(); - else - thread display_air_support_hint_pc(); - } - wait 5; - level.air_support_hint_delete = true; - wait 60; - } -} - -display_air_support_hint_console() -{ - level endon( "clearing_hints" ); - - add_hint_background(); - - level.hintElem = createFontString( "default", 1.6 ); - level.hintElem setPoint( "TOP", undefined, 0, 130 ); - level.hintElem setText( &"SCRIPT_LEARN_CHOPPER_AIR_SUPPORT1" ); - - level.iconElem1 = createIcon( "hud_dpad", 32, 32 ); - level.iconElem1 setPoint( "TOP", undefined, -32, 165 ); - - level.iconElem3 = createIcon( "hud_arrow_right", 24, 24 ); - level.iconElem3 setPoint( "TOP", undefined, -31.5, 170 ); - level.iconElem3.sort = 1; - level.iconElem3.color = (1,1,0); - level.iconElem3.alpha = .7; - - level.iconElem2 = createIcon( "hud_icon_cobra", 64, 32 ); - level.iconElem2 setPoint( "TOP", undefined, 16, 165 ); - - wait 4; - - level.iconElem1 setPoint( "CENTER", "BOTTOM", -320, -20, 1.0 ); - level.iconElem2 setPoint( "CENTER", "BOTTOM", -320, -20, 1.0 ); - level.iconElem3 setPoint( "CENTER", "BOTTOM", -320, -20, 1.0 ); - - level.iconElem1 scaleovertime(1, 20, 20); - level.iconElem2 scaleovertime(1, 20, 20); - level.iconElem3 scaleovertime(1, 20, 20); - - wait .70; - - level.hintElem fadeovertime(.15); - level.hintElem.alpha = 0; - - level.iconElem1 fadeovertime(.15); - level.iconElem1.alpha = 0; - - level.iconElem2 fadeovertime(.15); - level.iconElem2.alpha = 0; - - level.iconElem3 fadeovertime(.15); - level.iconElem3.alpha = 0; - - level.hintbackground fadeovertime(.15); - level.hintbackground.alpha = 0; - - wait 0.15; - - clear_hints(); -} - -display_air_support_hint_pc() -{ - level endon( "clearing_hints" ); - - add_hint_background(); - - level.hintElem = createFontString( "default", 1.6 ); - level.hintElem setPoint( "TOP", undefined, 0, 130 ); - level.hintElem setText( &"SCRIPT_LEARN_CHOPPER_AIR_SUPPORT1_PC" ); - - level.iconElem2 = createIcon( "hud_icon_cobra", 64, 32 ); - level.iconElem2 setPoint( "TOP", undefined, 16, 165 ); - - wait 4; - - level.iconElem2 setPoint( "CENTER", "BOTTOM", -320, -20, 1.0 ); - - level.iconElem2 scaleovertime(1, 20, 20); - - wait .70; - - level.hintElem fadeovertime(.15); - level.hintElem.alpha = 0; - - level.iconElem2 fadeovertime(.15); - level.iconElem2.alpha = 0; - - level.hintbackground fadeovertime(.15); - level.hintbackground.alpha = 0; - - wait 0.15; - - clear_hints(); -} - -add_hint_background( double_line ) -{ - if ( isdefined ( double_line ) ) - level.hintbackground = createIcon( "popmenu_bg", 650, 50 ); - else - level.hintbackground = createIcon( "popmenu_bg", 650, 30 ); - level.hintbackground.hidewheninmenu = true; - level.hintbackground setPoint( "TOP", undefined, 0, 125 ); - level.hintbackground.alpha = .5; -} - -clear_hints() -{ - level notify ( "clearing_hints" ); - if ( isDefined( level.hintElem ) ) - level.hintElem destroy(); - if ( isDefined( level.iconElem1 ) ) - level.iconElem1 destroy(); - if ( isDefined( level.iconElem2 ) ) - level.iconElem2 destroy(); - if ( isDefined( level.iconElem3 ) ) - level.iconElem3 destroy(); - if ( isDefined( level.hintbackground ) ) - level.hintbackground destroy(); -} - -air_support_hint_print_call() -{ - if ( player_called_air_support() ) - return; - - level endon( "alasad_sequence_started" ); - thread clear_hints(); - thread display_hint( "call_air_support2" ); - wait 5; - level.air_support_hint_delete = true; -} - -trigger_upstairs_guys() -{ - assert( isdefined( self.target ) ); - - volume = getent( self.target, "targetname" ); - assert( isdefined( volume ) ); - assert( isdefined( volume.target ) ); - - node = getnode( volume.target, "targetname" ); - assert( isdefined( node ) ); - assert( isdefined( node.radius ) ); - - self waittill( "trigger" ); - - wait randomfloatrange( 5.0, 10.0 ); - - enemies = getaiarray( "axis" ); - for( i = 0 ; i < enemies.size ; i++ ) - { - if ( !( enemies[ i ] istouching( volume ) ) ) - continue; - - enemies[i].goalradius = node.radius; - enemies[i] setgoalnode( node ); - } -} - -delete_dropped_weapons() -{ - wc = []; - wc = array_add( wc, "weapon_ak47" ); - wc = array_add( wc, "weapon_beretta" ); - wc = array_add( wc, "weapon_g36c" ); - wc = array_add( wc, "weapon_m14" ); - wc = array_add( wc, "weapon_m16" ); - wc = array_add( wc, "weapon_m203" ); - wc = array_add( wc, "weapon_rpg" ); - wc = array_add( wc, "weapon_saw" ); - wc = array_add( wc, "weapon_m4" ); - wc = array_add( wc, "weapon_m40a3" ); - wc = array_add( wc, "weapon_mp5" ); - wc = array_add( wc, "weapon_mp5sd" ); - wc = array_add( wc, "weapon_usp" ); - wc = array_add( wc, "weapon_at4" ); - wc = array_add( wc, "weapon_dragunov" ); - wc = array_add( wc, "weapon_g3" ); - wc = array_add( wc, "weapon_uzi" ); - - for( i = 0 ; i < wc.size ; i ++ ) - { - weapons = getentarray( wc[i], "classname" ); - for( n = 0 ; n < weapons.size ; n ++ ) - { - if ( isdefined( weapons[n].targetname ) ) - continue; - weapons[n] delete(); - } - } -} - -alasad_deletable_hide() -{ - if ( isdefined( self.spawnflags ) && ( self.spawnflags & 1 ) ) - self connectpaths(); - self.origin -= ( 0, 0, 5000 ); -} - -alasad_deletable_show() -{ - self.origin += ( 0, 0, 5000 ); - if ( isdefined( self.spawnflags ) && ( self.spawnflags & 1 ) ) - self disconnectpaths(); -} - -spawn_ai_and_make_dumb( spawnerTargetname, linkInPlace ) -{ - spawner = getent( spawnerTargetname, "targetname" ); - assert( isdefined( spawner ) ); - if ( isdefined( spawner.script_drone ) ) - { - guy = droneSpawn( spawner ); - } - else - { - guy = spawner stalingradSpawn(); - spawn_failed( guy ); - guy.maxsightdistsqrd = 0; - guy.ignoreme = true; - guy.ignoreall = true; - guy thread ignoreAllEnemies( true ); - } - guy.health = 100000; - - if ( isdefined( linkInPlace ) ) - { - dummy = spawn( "script_origin", spawner.origin ); - guy linkto( dummy ); - } - - return guy; -} - -headshot( guy, killguy ) -{ - if ( !isdefined( guy ) ) - return; - if ( !isAlive( guy ) ) - return; - if ( !isdefined( killguy ) ) - killguy = true; - playFX( getfx( "headshot" ), guy getTagOrigin( "tag_eye" ) ); - if ( killguy ) - guy doDamage( guy.health + 100, guy getTagOrigin( "tag_eye" ) ); -} - -goBlack( fDelay, fFadeTimeIn, fFadeTimeOut ) -{ - overlay = newHudElem(); - overlay.x = 0; - overlay.y = 0; - overlay.alignX = "left"; - overlay.alignY = "top"; - overlay.horzAlign = "fullscreen"; - overlay.vertAlign = "fullscreen"; - overlay setshader ( "black", 640, 480 ); - overlay.sort = 1; - overlay.alpha = 0; - - assert( isdefined( fFadeTimeIn ) ); - assert( isdefined( fFadeTimeOut ) ); - assert( fFadeTimeIn >= 0 ); - assert( fFadeTimeOut >= 0 ); - - if ( fFadeTimeIn > 0 ) - overlay fadeOverTime( fFadeTimeIn ); - overlay.alpha = 1.0; - wait fFadeTimeIn; - - if ( !isdefined( fDelay ) ) - return; - assert( fDelay > 0 ); - - wait fDelay; - - level notify( "fade_from_black" ); - wait 0.1; - - if ( fFadeTimeOut > 0 ) - overlay fadeOverTime( fFadeTimeOut ); - overlay.alpha = 0.0; - wait fFadeTimeOut; - - overlay destroy(); -} - -do_alasad( location ) -{ - assert( isdefined( location ) ); - - level.alasad_sequence_init = true; - - struct = spawnStruct(); - - if ( location == "barn" ) - { - println( "Al Asad is in the ^3BARN" ); - - struct.nodeTargetname1 = "alasad_barn_node"; - struct.nodeTargetname2 = "alasad_barn_node2"; - struct.deletableNoteworthy = "alasad_barn_deletable"; - struct.brushDoorTargetname = "alasad_barn_door"; - struct.spawnersToDeleteKillspawner = 12; - struct.friendlyColorTriggerTargetname1 = "alasad_barn_friendly_color_trigger"; - struct.friendlyColorTriggerTargetname2 = "alasad_barn_last_friendly_trigger"; - struct.AlAsadSpawnerTargetname = "alasad_spawner_barn"; - struct.AlAsadFirstShotSpawnerTargetname = "alasad_barn_first_shot_spawner"; - struct.AlAsadSecondShotSpawnerTargetname = "alasad_barn_second_shot_spawner"; - struct.startSequenceTriggerTargetname = "alasad_barn_trigger"; - struct.playerLocationSceneBTargetname = "alasad_barn_playerlocation"; - struct.setupAreaTriggerTargetname = "alasad_barn_area"; - struct.AItoDeleteAreaTargetname = "area_barn"; - - level.alasad_flashbang_location = getent( "alasad_barn_flash_location", "targetname" ).origin; - - level.alasad_objective_location = "6"; - } - else if ( location == "house" ) - { - println( "Al Asad is in the ^3HOUSE" ); - - struct.nodeTargetname1 = "alasad_house_node"; - struct.nodeTargetname2 = "alasad_house_node2"; - struct.deletableNoteworthy = "alasad_house_deletable"; - struct.brushDoorTargetname = "alasad_house_door"; - struct.spawnersToDeleteKillspawner = 2; - struct.friendlyColorTriggerTargetname1 = "alasad_house_friendly_color_trigger"; - struct.friendlyColorTriggerTargetname2 = "alasad_house_last_friendly_trigger"; - struct.AlAsadSpawnerTargetname = "alasad_spawner_house"; - struct.AlAsadFirstShotSpawnerTargetname = "alasad_house_first_shot_spawner"; - struct.AlAsadSecondShotSpawnerTargetname = "alasad_house_second_shot_spawner"; - struct.startSequenceTriggerTargetname = "alasad_house_trigger"; - struct.playerLocationSceneBTargetname = "alasad_house_playerlocation"; - struct.setupAreaTriggerTargetname = "alasad_house_area"; - struct.AItoDeleteAreaTargetname = "area_grandmas_house"; - - level.alasad_flashbang_location = getent( "alasad_house_flash_location", "targetname" ).origin; - - level.alasad_objective_location = "2"; - } - - assert( isdefined( struct ) ); - assert( isdefined( struct.nodeTargetname1 ) ); - assert( isdefined( struct.nodeTargetname2 ) ); - assert( isdefined( struct.deletableNoteworthy ) ); - assert( isdefined( struct.brushDoorTargetname ) ); - assert( isdefined( struct.friendlyColorTriggerTargetname1 ) ); - assert( isdefined( struct.friendlyColorTriggerTargetname2 ) ); - assert( isdefined( struct.AlAsadSpawnerTargetname ) ); - assert( isdefined( struct.AlAsadFirstShotSpawnerTargetname ) ); - assert( isdefined( struct.AlAsadSecondShotSpawnerTargetname ) ); - assert( isdefined( struct.startSequenceTriggerTargetname ) ); - assert( isdefined( struct.playerLocationSceneBTargetname ) ); - assert( isdefined( struct.setupAreaTriggerTargetname ) ); - assert( isdefined( level.alasad_flashbang_location ) ); - - alasad_sequence_init( struct ); -} - -alasad_sequence_init( struct ) -{ - // prepares the correct location for the scene by removing spawners and setting up doors etc. - - array_thread( getentarray( struct.deletableNoteworthy, "script_noteworthy" ), ::alasad_deletable_show ); - - // get the first node - struct.node = getnode( struct.nodeTargetname1, "targetname" ); - assert( isdefined( struct.node ) ); - - // spawn the door and make it play frame 0 so it's shut - struct.door = spawn_anim_model( "door" ); - struct.node thread anim_first_frame_solo( struct.door, "interrogationA" ); - - // link the door to the model door that animates and hide the model door - struct.brushmodel_door = getent( struct.brushDoorTargetname, "targetname" ); - assert( isdefined( struct.brushmodel_door ) ); - struct.brushmodel_door linkto( struct.door, "door_hinge_jnt" ); - struct.door hide(); - - // delete AI and spawners with this noteworthy when the barn will be the location of al asad - if ( isdefined( struct.spawnersToDeleteKillspawner ) ) - thread maps\_spawner::kill_spawnerNum( struct.spawnersToDeleteKillspawner ); - if ( isdefined( struct.AItoDeleteAreaTargetname ) ) - { - area = getent( struct.AItoDeleteAreaTargetname, "targetname" ); - axis = getAIArray( "axis" ); - for ( i = 0 ; i < axis.size ; i++ ) - { - if ( !axis[ i ] istouching( area ) ) - continue; - axis[ i ].dieQuietly = true; - axis[ i ] doDamage( axis[ i ].health + 100, axis[ i ].origin ); - } - } - - alasad_sequence_wait( struct ); -} - -alasad_sequence_wait( struct ) -{ - // Waits for the player to get close to Al Asad's location and moves the friendlies to the door - // If the player runs off the friendlies leave the door and go back to normal AI until the player returns - - level endon( "alasad_sequence_started" ); - - struct.alasad_area = getent( struct.setupAreaTriggerTargetname, "targetname" ); - assert( isdefined( struct.alasad_area ) ); - - struct.color_trigger = getent( struct.friendlyColorTriggerTargetname1, "targetname" ); - assert( isdefined( struct.color_trigger ) ); - - for(;;) - { - if ( level.player isTouching( struct.alasad_area ) ) - { - // make all friendlies orange color group and send them to the door - array_thread( getAIArray( "allies" ), ::set_force_color, "o" ); - struct.color_trigger notify( "trigger" ); - - thread alasad_sequence_ready( struct ); - - while( level.player isTouching( struct.alasad_area ) ) - wait 0.05; - } - else - { - level notify( "alasad_sequence_canceled" ); - - // make all friendlies red color group again because player is leaving the area - array_thread( getAIArray( "allies" ), ::set_force_color, "r" ); - - while( !level.player isTouching( struct.alasad_area ) ) - wait 0.05; - } - } -} - -alasad_sequence_ready( struct ) -{ - level endon( "alasad_sequence_canceled" ); - - // get price into position - struct.node thread anim_reach_solo( level.price, "interrogationA" ); - - // wait for the player to get close - getent( struct.startSequenceTriggerTargetname, "targetname" ) waittill( "trigger" ); - - alasad_sequence_start( struct ); -} - -alasad_sequence_start( struct ) -{ - level notify( "alasad_sequence_started" ); - level.air_support_hint_delete = true; - - // take away flash, grenade, smoke, etc - removeWeaponFromPlayer( "fraggrenade" ); - removeWeaponFromPlayer( "smoke_grenade_american" ); - removeWeaponFromPlayer( "c4" ); - removeWeaponFromPlayer( "flash_grenade" ); - - thread battlechatter_off( "allies" ); - thread battlechatter_off( "axis" ); - - thread doAutoSave( "capturing_al_asad" ); - - //--------------- - // SCENE A - //--------------- - - // spawn and prepare Al Asad - level.alasad = spawn_ai_and_make_dumb( struct.AlAsadSpawnerTargetname ); - level.alasad thread removeWeapon(); - level.alasad.animname = "alasad"; - waittillframeend; // waittillframeend so that Al Asad can finish spawning before he gets teleported - struct.node thread anim_teleport_solo( level.alasad, "interrogationA" ); - - // spawn the guys guarding Al Asad - level.alasad_guard1 = spawn_ai_and_make_dumb( struct.AlAsadFirstShotSpawnerTargetname, true ); - level.alasad_guard2 = spawn_ai_and_make_dumb( struct.AlAsadSecondShotSpawnerTargetname, true ); - - // spawn the phone - phone = spawn_anim_model( "phone" ); - struct.node thread anim_first_frame_solo( phone, "interrogationA" ); - - struct.guys = []; - struct.guys[ struct.guys.size ] = level.price; - - // get them into position to start the sequence - struct.node anim_reach( struct.guys, "interrogationA" ); - struct.guys[ struct.guys.size ] = level.alasad; - - // give price his special weapon for the scene - level.price animscripts\init::initWeapon( "colt45_alasad_killer", "sidearm" ); - level.price.sidearm = "colt45_alasad_killer"; - - // wait until the player can see the sequence - level.price waittill_player_lookat( level.cosine[ "60" ] ); - - flag_set( "alasad_sequence_started" ); - - level.price thread play_sound_on_entity( "scn_assault_interogation_enter" ); - - // Remember, we want Al-Asad alive. He's no good to us dead. Let's go. - level.price thread anim_single_solo( level.price, "nogooddead" ); - - // start the seqence - delayThread( 5.9, ::activate_trigger_with_targetname, struct.friendlyColorTriggerTargetname2 ); - delayThread( 6.0, ::disconnectPathsWrapper, struct.brushmodel_door ); - struct.guys[ struct.guys.size ] = struct.door; - struct.guys[ struct.guys.size ] = phone; - struct.node anim_single( struct.guys, "interrogationA" ); - - // take away ability to call air support - thread chopper_air_support_removeFunctionality(); - - thread goBlack( 18.0, 0.0, 0.5 ); - thread blackscreen1_dialog(); - thread alasad_kill_axis(); - level.player NightVisionForceOff(); - - //--------------- - // SCENE B - //--------------- - - objective_state( 0, "done" ); - - struct.node = getnode( struct.nodeTargetname2, "targetname" ); - assert( isdefined( struct.node ) ); - - level.price detach( "weapon_m4grunt_sp_silencer", "tag_weapon_chest" ); - level.price.a.weaponPos[ "chest" ] = "none"; - - // spawn the chair - chair = spawn_anim_model( "chair" ); - - // first frame of next scene so it's ready - struct.guys = []; - struct.guys[ struct.guys.size ] = level.price; - struct.guys[ struct.guys.size ] = level.gaz; - struct.guys[ struct.guys.size ] = level.alasad; - struct.guys[ struct.guys.size ] = chair; - struct.guys[ struct.guys.size ] = phone; - - struct.node thread anim_first_frame( struct.guys, "interrogationB" ); - - // put the player in a good spot - level.player freezeControls( true ); - delete_dropped_weapons(); - level.player takeAllWeapons(); - movePlayerToLocation( struct.playerLocationSceneBTargetname ); - - level waittill( "fade_from_black" ); - level.player freezeControls( false ); - - level.price thread alasad_execution_notes(); - level.price thread alasad_cell_phone_sounds( phone ); - level.gaz thread play_sound_on_entity( "scn_assault_interogation_pickup" ); - level.price thread play_sound_on_entity( "scn_assault_interogation_beating" ); - level.alasad thread play_sound_on_entity( "scn_assault_interogation_breathing" ); - struct.node anim_single( struct.guys, "interrogationB" ); - - level.price.weaponInfo["m4_silencer"].position = "none"; -} - -blackscreen1_dialog() -{ - wait 2; - - level.player thread play_sound_on_entity( "scn_assault_interogation_black" ); - - // Why'd you do it? Where did you get the bomb? - level.price thread delayThread( 0.0, ::anim_single_solo, level.price, "whydyoudoit" ); - - // It wasn't me!! - level.alasad thread delayThread( 3.05, ::anim_single_solo, level.alasad, "wasntme1" ); - - // Who then? - level.price thread delayThread( 5.3, ::anim_single_solo, level.price, "whothen" ); - - // It wasn't me!! - level.alasad thread delayThread( 8.3, ::anim_single_solo, level.alasad, "wasntme2" ); - - // Who!? Give me a name! - level.price thread delayThread( 10.85, ::anim_single_solo, level.price, "givemeaname" ); - - // A name! I - want - his - name! - level.price thread delayThread( 13.65, ::anim_single_solo, level.price, "aname" ); - - wait 16; -} - -blackscreen2_dialog() -{ - wait 1; - - // Who was that sir? - level.gaz thread anim_single_solo( level.gaz, "whowasthat" ); - - wait 2; - - // Zakhaev. - level.price thread anim_single_solo( level.price, "zakhaev" ); - - wait 2; - - // Imran Zakhaev. - level.price thread anim_single_solo( level.price, "imran" ); -} - -alasad_execution_notes() -{ - level.price waittillmatch( "single anim", "pistol_pickup" ); - level.price detach( "weapon_colt1911_black", "tag_weapon_right" ); - wait 0.2; - level.price attach( "weapon_colt1911_black", "tag_weapon_right" ); - - level.price waittillmatch( "single anim", "fire" ); - wait 3.5; - - level.player freezeControls( true ); - thread goBlack( 60.0, 1.0, 0.5 ); - thread blackscreen2_dialog(); - wait 7; - nextmission(); -} - -alasad_cell_phone_sounds( phone ) -{ - wait 2; - - thread alasad_cell_phone_ring( phone ); - - wait 7; - - phone notify( "stop ringing" ); - - wait 1; - - // Sir. It's his cell phone. - level.gaz thread anim_single_solo( level.gaz, "cellphone" ); -} - -alasad_cell_phone_ring( phone ) -{ - phone endon( "stop ringing" ); - for(;;) - { - level.gaz thread play_sound_on_entity( "scn_assault_mobile_ring" ); - wait 2; - } -} - -alasad_notetracks( guy ) -{ - // called from a notetrack - - sHandTag = "J_Mid_RI_3"; - guy attach( "projectile_m84_flashbang_grenade", sHandTag ); - - wait 2.0; - - // price tosses in a flashbang - guy detach( "projectile_m84_flashbang_grenade", sHandTag ); - thread alasad_flashbang( 1.0 ); - - // price picks up pistol so need to replace the rifle - guy waittillmatch( "single anim", "pistol_pickup" ); - - // price drops his gun - guy waittillmatch( "single anim", "pistol_drop" ); - guy gun_remove(); - - // al asad gets shot - guy waittillmatch( "single anim", "fire" ); - headshot( level.alasad, false ); -} - -alasad_flashbang( fDelay ) -{ - assert( isdefined( level.alasad_flashbang_location ) ); - wait fDelay; - playFX( getfx( "alasad_flash" ), level.alasad_flashbang_location ); - thread play_sound_in_space( "flashbang_explode_default", level.alasad_flashbang_location ); - - // two guards get shot - wait 1.0; - headshot( level.alasad_guard1 ); - wait 0.5; - headshot( level.alasad_guard2 ); -} - -alasad_kill_axis() -{ - axis = getaiarray( "axis" ); - for ( i = 0 ; i < axis.size ; i++ ) - { - if ( !isAlive( axis[ i ] ) ) - continue; - if ( axis[ i ] == level.alasad ) - continue; - if ( axis[ i ] == level.alasad_guard1 ) - continue; - if ( axis[ i ] == level.alasad_guard2 ) - continue; - axis[ i ].dieQuietly = true; - axis[ i ] doDamage( axis[ i ].health + 100, axis[ i ].origin ); - } -} - -disconnectPathsWrapper( ent ) -{ - ent connectPaths(); -} - -opening_sequence() -{ - assert( isdefined( level.opening_guy ) ); - node = getnode( "opening_sequence_node", "targetname" ); - assert( isdefined( node ) ); - guys = []; - guys[ 0 ] = level.price; - guys[ 1 ] = level.opening_guy; - node anim_first_frame( guys, "opening" ); - wait 4.0; - thread opening_sequence_notetracks( level.opening_guy ); - thread opening_sequence_dialog( level.opening_guy ); - node anim_single( guys, "opening" ); -} - -opening_sequence_notetracks( guy ) -{ - guy attach( "com_flashlight_off", "tag_inhand" ); - - guy waittillmatch( "single anim", "flash" ); - thread opening_sequence_flashLight( guy ); - - guy waittillmatch( "single anim", "flash" ); - thread opening_sequence_flashLight( guy ); - - guy waittillmatch( "single anim", "flash" ); - thread opening_sequence_flashLight( guy ); - - guy waittillmatch( "single anim", "detach flashlight" ); - guy detach( "com_flashlight_off", "tag_inhand" ); -} - -opening_sequence_flashLight( guy ) -{ - tagName = "tag_inhand"; - modelOn = "com_flashlight_on"; - modelOff = "com_flashlight_off"; - - // on - if ( guy isModelAttached( modelOff, tagName ) ) - guy detach( modelOff, tagName ); - guy attach( modelOn, tagName ); - guy thread flashlight_light( true ); - wait 0.1; - - // off - if ( guy isModelAttached( modelOn, tagName ) ) - guy detach( modelOn, tagName ); - guy attach( modelOff, tagName ); - guy thread flashlight_light( false ); -} - -opening_sequence_dialog( guy ) -{ - wait 3; - - //There's Kamarov's man, let's go. - level.price thread anim_single_solo( level.price, "kamarovsman" ); - - wait 5; - - //Al-Asad is in the village. The Ultranationalists are protecting him. - guy thread anim_single_solo( guy, "asadinvillage" ); - - wait 4.5; - - //Perfect. Move out. - level.price thread anim_single_solo( level.price, "perfect" ); - - wait 10; - - //What the bloody hell's going on up there? - level.gaz thread anim_single_solo( level.gaz, "whatsgoingon" ); - - wait 2.5; - - //It's the Ultranationalists. They're killing the villagers. - guy thread anim_single_solo( guy, "killingvillagers" ); - - wait 3.5; - - //Not for long they're not. - level.gaz thread anim_single_solo( level.gaz, "notforlong" ); -} - -isModelAttached( modelName, tagName ) -{ - qAttached = false; - - modelName = tolower( modelName ); - tagName = tolower( tagName ); - - assert( isdefined( modelName ) ); - if ( !isdefined( tagName ) ) - return qAttached; - - attachedModelCount = self getattachsize(); - attachedModels = []; - for ( i = 0 ; i < attachedModelCount ; i++ ) - attachedModels[ i ] = tolower( self getAttachModelName( i ) ); - - for ( i = 0 ; i < attachedModels.size ; i++ ) - { - if ( attachedModels[ i ] != modelName ) - continue; - - sName = tolower( self getattachtagname( i ) ); - if ( tagName != sName ) - continue; - - qAttached = true; - break; - } - - return qAttached; -} - -flashlight_light( state ) -{ - flash_light_tag = "tag_light"; - - if ( state ) - { - flashlight_fx_ent = spawn( "script_model", ( 0, 0, 0 ) ); - flashlight_fx_ent setmodel( "tag_origin" ); - flashlight_fx_ent hide(); - flashlight_fx_ent linkto( self, flash_light_tag, ( 0, 0, 0 ), ( 0, 0, 0 ) ); - - self thread flashlight_light_death( flashlight_fx_ent ); - playfxontag( level._effect[ "flashlight" ], flashlight_fx_ent, "tag_origin" ); - } - else - self notify( "flashlight_off" ); -} - -flashlight_light_death( flashlight_fx_ent ) -{ - self waittill_either( "death", "flashlight_off" ); - flashlight_fx_ent delete(); -} - -removeWeaponFromPlayer( weaponName ) -{ - assert( isdefined( weaponName ) ); - if( level.player HasWeapon( weaponName ) ) - level.player takeWeapon( weaponName ); -} - -removeWeapon( optionalWeaponName ) -{ - if( IsAI( self ) ) - self gun_remove(); - else - { - size = self getattachsize(); - for ( i = 0; i < size; i++ ) - { - model = self getattachmodelname( i ); - tag = self GetAttachTagName( i ); - if ( isdefined( optionalWeaponName ) ) - { - if ( model == optionalWeaponName ) - self detach( model, tag ); - } - else - { - if ( issubstr( tolower( model ), "weapon_" ) ) - self detach( model, tag ); - } - } - } -} diff --git a/iw3sp_mod_ff_src/raw/maps/village_defend.gsc b/iw3sp_mod_ff_src/raw/maps/village_defend.gsc deleted file mode 100644 index c0a078c..0000000 --- a/iw3sp_mod_ff_src/raw/maps/village_defend.gsc +++ /dev/null @@ -1,5447 +0,0 @@ -/**************************************************************************** - -Level: The Village (village_defend.bsp) -Location: Northern Azerbaijan -Campaign: British SAS Woodland Scheme -Objectives: 1. Obtain new orders from Captain Price. - 2. Take up a defensive position along the ridgeline. - 3. Defend the southern hill approach. - 4. Fall back and defend the southwestern approaches. - 5. Use the detonators to delay the enemy attack. - 6. Get the Javelin. - 7. Destroy the incoming armor. - 8. Survive until the helicopter arrives. - 9. Destroy the enemy attack helicopter. - 10. Board the rescue helicopter before it leaves. - -*****************************************************************************/ - -#include common_scripts\utility; -#include maps\_utility; -#include maps\_hud_util; -#include maps\_vehicle; -#include maps\_anim; -#include maps\village_defend_code; - -main() -{ - preCacheModel( "weapon_c4" ); - preCacheModel( "projectile_cbu97_clusterbomb" ); - preCacheModel( "tag_origin" ); - preCacheModel( "weapon_javelin_obj" ); - preCacheModel( "vehicle_av8b_harrier_jet" ); - - preCacheItem( "c4" ); - preCacheItem( "javelin" ); - preCacheItem( "airstrike_support" ); - preCacheItem( "flash_grenade" ); - - precacheshader( "popmenu_bg" ); - precacheshader( "compass_objpoint_airstrike" ); - precacheShader( "hud_dpad" ); - precacheShader( "hud_arrow_down" ); - - precacheShader( "white" ); - precacheShader( "black" ); - precacheShader( "hud_temperature_gauge" ); - - precachestring( &"VILLAGE_DEFEND_HINT_SPINUP_MINIGUN" ); - precachestring( &"VILLAGE_DEFEND_HELICOPTER_EXTRACTION" ); - precacheString( &"VILLAGE_DEFEND_CASREADY" ); - precacheString( &"SCRIPT_PLATFORM_HINT_GET_DETONATOR" ); - precachestring( &"VILLAGE_DEFEND_TAKE_UP_A_DEFENSIVE_POSITION" ); - precachestring( &"VILLAGE_DEFEND_DEFEND_THE_SOUTHERN_HILL" ); - precachestring( &"VILLAGE_DEFEND_FALL_BACK_AND_DEFEND" ); - precachestring( &"VILLAGE_DEFEND_USE_THE_DETONATORS_IN" ); - precachestring( &"VILLAGE_DEFEND_FALL_BACK_TO_THE_FARM" ); - precachestring( &"VILLAGE_DEFEND_GET_THE_JAVELIN_IN_THE" ); - precachestring( &"VILLAGE_DEFEND_SURVIVE_UNTIL_THE_HELICOPTER" ); - precachestring( &"VILLAGE_DEFEND_GET_TO_THE_LZ" ); - precachestring( &"VILLAGE_DEFEND_BOARD_THE_HELICOPTER" ); - precachestring( &"VILLAGE_DEFEND_USE_THE_DETONATORS_IN1" ); - precachestring( &"VILLAGE_DEFEND_DESTROY_THE_INCOMING" ); - precachestring( &"VILLAGE_DEFEND_OBTAIN_NEW_ORDERS_FROM" ); - precachestring( &"VILLAGE_DEFEND_YOU_DIDNT_REACH_THE_HELICOPTER" ); - precachestring( &"VILLAGE_DEFEND_CLOSE_AIR_SUPPORT_STANDING" ); - precachestring( &"VILLAGE_DEFEND_CLOSE_AIR_SUPPORT_STANDING_PC" ); - precachestring( &"VILLAGE_DEFEND_INTRO_1" ); - precachestring( &"VILLAGE_DEFEND_INTRO_2" ); - precachestring( &"VILLAGE_DEFEND_INTRO_3" ); - precachestring( &"VILLAGE_DEFEND_INTRO_4" ); - precachestring( &"VILLAGE_DEFEND_INTRO_5" ); - precachestring( &"VILLAGE_DEFEND_DESTROY_THE_INCOMING1" ); - precachestring( &"VILLAGE_DEFEND_AIRSTRIKE_UNAVAIL" ); - precachestring( &"SCRIPT_PLATFORM_SPOOL_MINIGUN" ); - - precacherumble( "minigun_rumble" ); - - set_console_status(); - - //add_start( "cobras", ::start_cobras ); - //add_start( "end", ::start_end ); - add_start( "southern_hill", ::start_southern_hill, &"STARTS_SOUTHERNHILL" ); - add_start( "minigun_fallback", ::start_minigun_fallback, &"STARTS_MINIGUNFALLBACK" ); - add_start( "minigun", ::start_minigun, &"STARTS_MINIGUN" ); - add_start( "helidrop", ::start_helidrop, &"STARTS_HELIDROP" ); - add_start( "clackers", ::start_clackers, &"STARTS_CLACKERS" ); - add_start( "field_fallback", ::start_field_fallback, &"STARTS_FIELDFALLBACK" ); - add_start( "javelin", ::start_javelin, &"STARTS_JAVELIN" ); - add_start( "final_battle", ::start_final_battle, &"STARTS_FINALBATTLE" ); - add_start( "seaknight", ::start_seaknight, &"STARTS_SEAKNIGHT1" ); - default_start( ::start_village_defend ); - - createthreatbiasgroup( "player" ); - - level.weaponClipModels = []; - level.weaponClipModels[ 0 ] = "weapon_ak47_clip"; - level.weaponClipModels[ 1 ] = "weapon_saw_clip"; - level.weaponClipModels[ 2 ] = "weapon_g36_clip"; - level.weaponClipModels[ 3 ] = "weapon_ak74u_clip"; - level.weaponClipModels[ 4 ] = "weapon_dragunov_clip"; - level.weaponClipModels[ 5 ] = "weapon_mp5_clip"; - level.weaponClipModels[ 6 ] = "weapon_m16_clip"; - - maps\_t72::main( "vehicle_t72_tank_woodland" ); - maps\_mi17::main( "vehicle_mi17_woodland_fly_cheap" ); - //maps\_mig29::main( "vehicle_mig29_desert" ); - maps\_seaknight_village_defend::main( "vehicle_ch46e" ); - thread maps\_pipes::main(); - thread maps\_leak::main(); - maps\_load::set_player_viewhand_model( "viewhands_player_sas_woodland" ); - - maps\village_defend_fx::main(); - maps\village_defend_anim::main(); - maps\_load::main(); - maps\_javelin::init(); - - level thread maps\village_defend_amb::main(); - - level.killzoneBigExplosion_fx = loadfx( "explosions/artilleryExp_dirt_brown_low" ); - level.killzoneMudExplosion_fx = loadfx( "explosions/grenadeExp_mud_1" ); - level.killzoneDirtExplosion_fx = loadfx( "explosions/grenadeExp_dirt_1" ); - level.killzoneFuelExplosion_fx = loadfx( "explosions/grenadeExp_fuel" ); - - level.air_support_fx_yellow = loadfx( "misc/ui_pickup_available" ); - level.air_support_fx_red = loadfx( "misc/ui_pickup_unavailable" ); - - killzoneFxProgram(); - - maps\createart\village_defend_art::main(); - - maps\_compass::setupMiniMap("compass_map_village_defend"); - - level.price = getent( "price", "targetname" ); - level.price make_hero(); - level.price.animname = "price"; - - level.gaz = getent( "redshirt2", "targetname" ); - level.gaz make_hero(); - level.gaz.animname = "gaz"; - - level.redshirt = getent( "redshirt1", "targetname" ); - - battlechatter_off( "allies" ); - battlechatter_off( "axis" ); - - setdvar( "village_defend_one_minute", "0" ); - - flag_init( "intro_tank_fire_authorization" ); - flag_init( "church_tower_explodes" ); - flag_init( "stop_ambush_music" ); - - flag_init( "objective_price_orders_southern_hill" ); - flag_init( "objective_player_on_ridgeline" ); - flag_init( "objective_price_on_ridgeline" ); - flag_init( "objective_on_ridgeline" ); - flag_init( "objective_price_orders_minigun" ); - flag_init( "objective_player_uses_minigun" ); - flag_init( "objective_player_at_vantage_point" ); - - flag_init( "price_ordered_hill_detonation" ); - flag_init( "southern_hill_action_started" ); - flag_init( "southern_hill_killzone_detonate" ); - flag_init( "southern_mg_openfire" ); - - flag_init( "southern_hill_smoked" ); - flag_init( "southern_hill_smoke_entry" ); - flag_init( "enemy_breached_wire" ); - - flag_init( "ridgeline_targeted" ); - flag_init( "ridgeline_unsafe" ); - - flag_init( "disable_overheat" ); - - flag_init( "helidrop_started" ); - flag_init( "objective_minigun_baglimit_done" ); - flag_init( "divert_for_clacker" ); - flag_init( "stop_minigun_fallback_shouting" ); - - flag_init( "objective_detonators" ); - flag_init( "detonators_activate" ); - flag_init( "got_the_clacker" ); - flag_init( "clacker_has_been_exercised" ); - - flag_init( "crashsite_exploded" ); - flag_init( "cliffside_exploded" ); - flag_init( "nearslope_exploded" ); - flag_init( "farslope_exploded" ); - flag_init( "clacker_far_and_near_slope_done" ); - - flag_init( "spawncull" ); - flag_init( "player_entered_clacker_house_top_floor" ); - - flag_init( "storm_the_tavern" ); - flag_init( "player_running_to_farm" ); - flag_init( "fall_back_to_barn" ); - flag_init( "farm_reached" ); - flag_init( "objective_armor_arrival" ); - - flag_init( "got_the_javelin" ); - flag_init( "objective_all_tanks_destroyed" ); - flag_init( "kill_jav_glow" ); - - flag_init( "start_final_battle" ); - flag_init( "return_trip_begins" ); - flag_init( "airstrikes_ready" ); - flag_init( "falcon_one_finished_talking" ); - - flag_init( "engage_delaying_action" ); - - flag_init( "objective_get_to_lz" ); - flag_init( "rescue_chopper_ingress" ); - - flag_init( "seaknight_can_be_boarded" ); - - flag_init( "lz_reached" ); - - flag_init( "no_more_grenades" ); - - flag_init( "player_made_it" ); - flag_init( "player_made_it_with_rescue" ); - - flag_init( "minigun_lesson_learned" ); - - flag_init( "all_fake_friendlies_aboard" ); - flag_init( "all_real_friendlies_on_board" ); - flag_init( "seaknight_guards_boarding" ); - flag_init( "seaknight_unboardable" ); - - flag_init( "aa_southernhill" ); - flag_init( "aa_minigun" ); - flag_init( "aa_detonators" ); - flag_init( "aa_fallback" ); - flag_init( "aa_javelin" ); - flag_init( "aa_returntrip" ); - - flag_init( "airstrike_in_progress" ); - - if (level.gameSkill == 0) - { - level.southernHillAdvanceBaglimit = 4; - level.minigunBreachBaglimit = 4; - } - - if (level.gameSkill == 1) - { - level.southernHillAdvanceBaglimit = 6; - level.minigunBreachBaglimit = 6; - } - - if (level.gameSkill == 2) - { - level.southernHillAdvanceBaglimit = 8; - level.minigunBreachBaglimit = 8; - } - - if (level.gameSkill == 3) - { - level.southernHillAdvanceBaglimit = 10; - level.minigunBreachBaglimit = 10; - } - - level.hint_text_size = 1.6; - - if ( getdvar( "village_defend_one_minute") != "1" ) - level.stopwatch = 4; //minutes - else - level.stopwatch = 1; //minutes - - level.encroachMinWait = 3; - level.encroachMaxWait = 5; - assertEX( level.encroachMinWait < level.encroachMaxWait, "encroachMinWait must be less than encroachMaxWait!" ); - - level.magicSniperTalk = true; - level.southern_hill_magic_sniper_min_cycletime = 5; - level.southern_hill_magic_sniper_max_cycletime = 15; - - level.southernMortarIntroTimer = 3.5; //this many seconds before Price mentions mortars and order the team to pull back - level.southernMortarKillTimer = 25; //this many seconds before player is struck by enemy mortars in the ridgeline area - - level.genericBaitCount = 0; //circulates spare enemies to the clacker bait locations for the clacker objective - - level.irrelevantDist = 1000; - level.irrelevantPopLimit = 8; - - level.divertClackerRange = 1000; //distance beyond which enemies will break off attacking the player and move to a prearranged spot - level.encroachRate = 0.85; //percentage of goal reduction per encroaching iteration - - level.objectiveClackers = 0; - level.tankPop = 4; - level.tankid = 0; - - level thread minigun_const(); - run_thread_on_targetname( "minigun", ::minigun_think ); - - level.aSpawners = getspawnerarray(); - level.aRouteNodes = getnodearray( "flanking_route", "targetname" ); - - level.airstrikeCalledRecently = false; - level.airStriker = level.player; - - //Primary Zone Spawn Controllers - - level.maxAI = 32; - level.reqSlots = 8; - level.detectionCycleTime = 45; - level.smokeBuildTime = 8; - level.smokeSpawnSafeDist = 640; - level.detectionRefreshTime = 3; - level.volumeDesertionTime = 6; - - //Airstrike Controllers - - level.lowplaneflyby = 0; - level.strikeZoneGracePeriod = 20; - level.airstrikeCooldown = 135; - level.dangerCloseSafeDist = 1200; - - level.airstrikeSupportCallsRemaining = 5; - - level.sasSeaKnightBoarded = 0; - - level.minigunSessions = 0; - - level.delayingActionEnemyWaves = 0; - - level.activeAirstrikes = 0; - - if( level.gameskill == 0 ) - level.enemyWavesAllowed = 1; - else - if( level.gameskill == 1 ) - level.enemyWavesAllowed = 3; - else - if( level.gameskill == 2 ) - level.enemyWavesAllowed = 4; - else - if( level.gameskill == 3 ) - level.enemyWavesAllowed = 5; - - level.sniperfx = "weap_m40a3sniper_fire_village"; - - level thread objectives(); - level thread magic_sniper(); - level thread southern_hill_ambush_mg(); - level thread southern_hill_vanguard_setup(); - level thread friendly_setup(); - level thread southern_hill_killzone_sequence(); - level thread helidrop(); - level thread clacker_init(); - level thread clacker_primary_attack(); - - level thread player_interior_detect_init(); - level thread enemy_interior_flashbangs(); - - level thread javelin_init(); - level thread tanks_init(); - level thread barn_helidrop(); - level thread field_fallback(); - level thread barn_fallback(); - - level thread final_battle(); - level thread autosaves_return_trip(); - level thread airstrike_command(); - - level thread begin_delaying_action(); - level thread begin_delaying_action_timeout(); - level thread player_detection_volume_init(); - - level thread escape_fallback(); - - level thread music(); - level thread seaknight_music(); - - level thread southern_hill_shotmonitor(); - - level thread return_trip_friendly_boost(); - - diff = []; - diff[ 0 ] = 0.3; - diff[ 1 ] = 0.6; - diff[ 2 ] = 1; - diff[ 3 ] = 1.2; - - level.village_diff = diff; - - level thread return_trip_enemy_acc_prep(); - - //Left trigger spin functionality for console controllers - // if( level.console || getdvarint("gpad_in_use") ) - // { - // level thread minigun_firstuse_check(); - // //level thread minigun_session_check(); - - // add_hint_string( "minigun_spin_left_trigger", &"SCRIPT_PLATFORM_SPOOL_MINIGUN", maps\village_defend::should_break_minigun_spin_hint ); - // } - - level.playerSafetyBlocker = getent( "helo_safety_blocker", "targetname" ); - level.playerSafetyBlocker notsolid(); -} - -should_break_minigun_spin_hint() -{ - minigun = getent( "minigun", "targetname" ); - minigunUser = minigun getTurretOwner(); - - if ( !isdefined( minigunUser ) ) - return true; - - if ( !flag( "minigun_lesson_learned" ) ) - return false; - - return level.player == minigunUser; -} - -start_village_defend() -{ - thread intro(); - level.start_intro = true; - - level.player setthreatbiasgroup( "player" ); - - setignoremegroup( "axis", "allies" ); // allies ignore axis - setignoremegroup( "allies", "axis" ); // axis ignore allies - setignoremegroup( "player", "axis" ); // axis ignore player -} - -start_southern_hill() -{ - level.player setthreatbiasgroup( "player" ); - - setignoremegroup( "axis", "allies" ); // allies ignore axis - setignoremegroup( "allies", "axis" ); // axis ignore allies - setignoremegroup( "player", "axis" ); // axis ignore player - - flag_set( "church_tower_explodes" ); - flag_set( "objective_price_orders_southern_hill" ); - flag_set( "objective_player_on_ridgeline" ); - //flag_set( "objective_price_on_ridgeline" ); - flag_set( "objective_on_ridgeline" ); - - playerStart = getnode( "player_southern_start", "targetname" ); - level.player setorigin (playerStart.origin); - - priceStart = getnode( "price_southern_start", "targetname" ); - level.price = getent( "price", "targetname" ); - level.price teleport (priceStart.origin); - - introHillTrigs = getentarray( "introHillTrig", "targetname" ); - for( i = 0 ; i < introHillTrigs.size; i++ ) - { - introHillTrigs[ i ] notify ("trigger"); - } - - //thread intro_tankdrive(); - thread southern_hill_defense(); -} - -start_minigun_fallback() -{ - //Advance objectives, set past game states - - flag_set( "stop_ambush_music" ); - flag_set( "objective_player_on_ridgeline" ); - flag_set( "church_tower_explodes" ); - flag_set( "objective_price_orders_southern_hill" ); - flag_set( "objective_on_ridgeline" ); - flag_set( "southern_hill_killzone_detonate" ); - - //Position player - - //playerStart = getnode( "player_start_minigun", "targetname" ); - playerStart = getnode( "player_southern_start", "targetname" ); - level.player setorigin (playerStart.origin); - - //Position friendlies - - priceStart = getnode( "price_southern_start", "targetname" ); - level.price = getent( "price", "targetname" ); - level.price teleport (priceStart.origin); - - thread moveRedshirts( "redshirt_southern_start1", "redshirt_southern_start2" ); - - //Restore game state - - introHillTrigs = getentarray( "introHillTrig", "targetname" ); - for( i = 0 ; i < introHillTrigs.size; i++ ) - { - introHillTrigs[ i ] notify ("trigger"); - } - - thread southern_hill_smokescreens(); - - thread saw_gunner_friendly(); -} - -start_minigun() -{ - //Advance objectives, set past game states - - flag_set( "stop_ambush_music" ); - flag_set( "church_tower_explodes" ); - flag_set( "objective_price_orders_southern_hill" ); - flag_set( "objective_on_ridgeline" ); - flag_set( "objective_player_on_ridgeline" ); - flag_set( "southern_hill_killzone_detonate" ); - flag_set( "objective_price_orders_minigun" ); - flag_set( "southern_hill_smoke_entry" ); - - //Position player - - playerStart = getnode( "player_start_minigun", "targetname" ); - level.player setorigin (playerStart.origin); - - //Position friendlies - - priceStart = getnode( "fallback_price", "targetname" ); - level.price = getent( "price", "targetname" ); - level.price teleport (priceStart.origin); - level.price setgoalnode( priceStart ); - - thread moveRedshirts( "fallback_redshirt1", "fallback_redshirt2" ); - - //Restore game state - - thread southern_hill_mortars_killtimer(); - thread minigun_primary_attack(); - thread minigun_smokescreens(); - thread saw_gunner_friendly(); -} - -start_helidrop() -{ - //Advance objectives, set past game states - - flag_set( "stop_ambush_music" ); - flag_set( "church_tower_explodes" ); - flag_set( "objective_price_orders_southern_hill" ); - flag_set( "objective_on_ridgeline" ); - flag_set( "objective_player_on_ridgeline" ); - flag_set( "southern_hill_killzone_detonate" ); - flag_set( "objective_price_orders_minigun" ); - flag_set( "southern_hill_smoke_entry" ); - flag_set( "objective_minigun_baglimit_done" ); - flag_set( "divert_for_clacker" ); - - //Position player - - playerStart = getnode( "player_start_minigun", "targetname" ); - level.player setorigin (playerStart.origin); - - //Position friendlies - - priceStart = getnode( "fallback_price", "targetname" ); - level.price = getent( "price", "targetname" ); - level.price teleport (priceStart.origin); - level.price setgoalnode( priceStart ); - - thread moveRedshirts( "fallback_redshirt1", "fallback_redshirt2" ); - - //Restore game state - - thread southern_hill_mortars_killtimer(); - thread minigun_primary_attack(); - thread minigun_smokescreens(); - thread saw_gunner_friendly(); -} - -start_clackers() -{ - //Advance objectives, set past game states - - flag_set( "stop_ambush_music" ); - flag_set( "church_tower_explodes" ); - flag_set( "objective_price_orders_southern_hill" ); - flag_set( "objective_on_ridgeline" ); - flag_set( "objective_player_on_ridgeline" ); - flag_set( "southern_hill_killzone_detonate" ); - flag_set( "objective_price_orders_minigun" ); - flag_set( "southern_hill_smoke_entry" ); - flag_set( "objective_detonators" ); - flag_set( "detonators_activate" ); - - //Position player - - playerStart = getnode( "player_start_clacker", "targetname" ); - level.player setorigin (playerStart.origin); - - //Restore game state - - thread southern_hill_mortars_killtimer(); - thread minigun_primary_attack(); - thread minigun_smokescreens(); - thread saw_gunner_friendly(); - - wait 7; - flag_set( "objective_minigun_baglimit_done" ); - flag_set( "divert_for_clacker" ); -} - -start_field_fallback() -{ - //Advance objectives, set past game states - - flag_set( "stop_ambush_music" ); - flag_set( "church_tower_explodes" ); - flag_set( "objective_price_orders_southern_hill" ); - flag_set( "objective_on_ridgeline" ); - flag_set( "objective_player_on_ridgeline" ); - flag_set( "southern_hill_killzone_detonate" ); - flag_set( "objective_price_orders_minigun" ); - flag_set( "southern_hill_smoke_entry" ); - flag_set( "objective_detonators" ); - flag_set( "divert_for_clacker" ); - flag_set( "fall_back_to_barn" ); - flag_set( "barn_assault_begins" ); - flag_set( "objective_armor_arrival" ); - flag_set( "storm_the_tavern" ); - - //Position player - - playerStart = getnode( "player_start_clacker", "targetname" ); - level.player setorigin (playerStart.origin); - - //Restore game state - - thread southern_hill_mortars_killtimer(); - thread minigun_primary_attack(); - thread minigun_smokescreens(); - thread saw_gunner_friendly(); -} - -start_javelin() -{ - //Advance objectives, set past game states - - flag_set( "stop_ambush_music" ); - flag_set( "church_tower_explodes" ); - flag_set( "objective_price_orders_southern_hill" ); - flag_set( "objective_on_ridgeline" ); - flag_set( "objective_player_on_ridgeline" ); - flag_set( "southern_hill_killzone_detonate" ); - flag_set( "objective_price_orders_minigun" ); - flag_set( "southern_hill_smoke_entry" ); - flag_set( "objective_detonators" ); - flag_set( "divert_for_clacker" ); - flag_set( "fall_back_to_barn" ); - flag_set( "farm_reached" ); - flag_set( "barn_assault_begins" ); - flag_set( "objective_armor_arrival" ); - flag_set( "storm_the_tavern" ); - - //Position player - - level.player setorigin ( ( 1021, 7309, 1006 ) ); - - //Restore game state - - //thread southern_hill_mortars_killtimer(); - //thread minigun_primary_attack(); - //thread minigun_smokescreens(); - thread saw_gunner_friendly(); -} - -start_final_battle() -{ - //Advance objectives, set past game states - - flag_set( "stop_ambush_music" ); - flag_set( "church_tower_explodes" ); - flag_set( "objective_price_orders_southern_hill" ); - flag_set( "objective_on_ridgeline" ); - flag_set( "objective_player_on_ridgeline" ); - flag_set( "southern_hill_killzone_detonate" ); - flag_set( "objective_price_orders_minigun" ); - flag_set( "southern_hill_smoke_entry" ); - flag_set( "objective_detonators" ); - flag_set( "divert_for_clacker" ); - flag_set( "fall_back_to_barn" ); - flag_set( "barn_assault_begins" ); - flag_set( "objective_armor_arrival" ); - flag_set( "farm_reached" ); - flag_set( "got_the_javelin" ); - flag_set( "objective_all_tanks_destroyed" ); - flag_set( "airstrikes_ready" ); - flag_set( "storm_the_tavern" ); - flag_set( "start_final_battle" ); - - //Position player - - level.player setorigin ( ( 1021, 7309, 1006 ) ); - - //Restore game state - - //thread southern_hill_mortars_killtimer(); - //thread minigun_primary_attack(); - //thread minigun_smokescreens(); - thread saw_gunner_friendly(); - - //Delete the barbed wire - - barbedDets = getentarray( "barbed_wire_detonator", "targetname" ); - - thread minigun_barbed_wire_detonate( "southern_hill_barbed_wire_wall_1", barbedDets ); - - wait 2; - - thread minigun_barbed_wire_detonate( "southern_hill_barbed_wire_wall_2", barbedDets ); - - wait 3; - - thread minigun_barbed_wire_detonate( "southern_hill_barbed_wire_wall_3", barbedDets ); -} - -start_seaknight() -{ - //Advance objectives, set past game states - - flag_set( "stop_ambush_music" ); - flag_set( "church_tower_explodes" ); - flag_set( "objective_price_orders_southern_hill" ); - flag_set( "objective_on_ridgeline" ); - flag_set( "objective_player_on_ridgeline" ); - flag_set( "southern_hill_killzone_detonate" ); - flag_set( "objective_price_orders_minigun" ); - flag_set( "southern_hill_smoke_entry" ); - flag_set( "objective_detonators" ); - flag_set( "divert_for_clacker" ); - flag_set( "fall_back_to_barn" ); - flag_set( "farm_reached" ); - flag_set( "barn_assault_begins" ); - flag_set( "objective_armor_arrival" ); - flag_set( "got_the_javelin" ); - flag_set( "objective_all_tanks_destroyed" ); - flag_set( "airstrikes_ready" ); - flag_set( "storm_the_tavern" ); - flag_set( "rescue_chopper_ingress" ); - - //Position player - - level.player setorigin ( ( -64, -1904, -80 ) ); - - //Restore game state - - //thread southern_hill_mortars_killtimer(); - //thread minigun_primary_attack(); - //thread minigun_smokescreens(); - thread saw_gunner_friendly(); - - //Delete the barbed wire - - barbedDets = getentarray( "barbed_wire_detonator", "targetname" ); - - thread minigun_barbed_wire_detonate( "southern_hill_barbed_wire_wall_1", barbedDets ); - thread minigun_barbed_wire_detonate( "southern_hill_barbed_wire_wall_2", barbedDets ); - thread minigun_barbed_wire_detonate( "southern_hill_barbed_wire_wall_3", barbedDets ); - - wait 0.05; - - aAxis = getaiarray( "axis" ); - for( i = 0; i < aAxis.size; i++ ) - { - aAxis[ i ] delete(); - } -} - -moveRedshirts( node1, node2 ) -{ - redshirt1 = getent( "redshirt1", "targetname" ); - redshirt2 = getent( "redshirt2", "targetname" ); - - redshirt_node1 = getnode( node1, "targetname" ); - redshirt_node2 = getnode( node2, "targetname" ); - - redshirt1 teleport ( redshirt_node1.origin ); - redshirt1 setgoalnode ( redshirt_node1 ); - - redshirt2 teleport ( redshirt_node2.origin ); - redshirt2 setgoalnode ( redshirt_node2 ); -} - -intro() -{ - thread intro_loudspeaker(); - - aAllies = getaiarray( "allies" ); - - for( i = 0 ; i < aAllies.size; i++ ) - { - aAllies[ i ].dontavoidplayer = true; - aAllies[ i ].baseaccuracy = 15; - } - - aAllies = remove_heroes_from_array( aAllies ); - - for( i = 0 ; i < aAllies.size; i++ ) - { - aAllies[ i ] allowedstances ("crouch"); - aAllies[ i ].disableArrivals = true; - aAllies[ i ].ignoresuppression = true; - } - - introTrigs = getentarray( "introTrig", "targetname" ); - for( i = 0 ; i < introTrigs.size; i++ ) - { - introTrigs[ i ] notify ("trigger"); - } - - for( i = 0 ; i < aAllies.size; i++ ) - { - aAllies[i] allowedStances ("stand", "crouch", "prone"); - } - - wait 18; - - price_intro_route = getnode( "price_intro_route", "targetname" ); - - redshirt1 = getent( "redshirt1", "targetname" ); - redshirt2 = getent( "redshirt2", "targetname" ); - - //redshirt_routes = []; - redshirt_route1 = getnode( "sas1_intro_route", "targetname" ); - redshirt_route2 = getnode( "sas2_intro_route", "targetname" ); - - level.price thread followScriptedPath( price_intro_route, undefined, "prone" ); - - redshirt1 thread followScriptedPath( redshirt_route1, 0.75, "prone" ); - redshirt2 thread followScriptedPath( redshirt_route2, 0.75, "prone" ); - - //wait 6.5; - wait 1; - - //"Ignore that load of bollocks. Their counterattack is imminent. Spread out and cover the southern approach." - //iprintln( "Their counterattack is imminent. Spread out and cover the southern approach." ); - level.price anim_single_queue( level.price, "spreadout" ); - - flag_set( "objective_price_orders_southern_hill" ); - - thread intro_ridgeline_check( level.player, "player_southern_start" ); - thread intro_ridgeline_check( level.price, "price_southern_start" ); - thread intro_hillpatrol_check(); - - //"Bell tower here. Two enemy squads forming up to the south." - //iprintln( "Bell tower here. Two enemy squads forming up to the south." ); - //radio_dialogue_queue( "belltowerhere" ); - - //wait 6.2; - - //"Sir, they're slowly coming up the hill. Just say when." - //iprintln( "Sir, they're slowly coming up the hill. Just say when." ); - radio_dialogue_queue( "justsaywhen" ); - - thread southern_hill_defense(); -} - -intro_church_tower_explode() -{ - temp_tower_sequence = getent( "intro_tank_tower_target", "targetname" ); - - wait 2; - - temp_tower_sequence playsound ( "artillery_incoming" ); - - wait 1; - - //incoming tracer and explosion - exploder( 1000 ); - wait 1.1; - exploder( 1001 ); - temp_tower_sequence playsound( "exp_bell_tower" ); - earthquake( 0.65, 1, temp_tower_sequence.origin, 3000 ); - - flag_set( "church_tower_explodes" ); - - deathVolume = getent( "church_explosion_damage", "targetname" ); - - for( i = 0; i < 20; i++ ) - { - if( level.player isTouching( deathVolume ) ) - level.player doDamage( level.player.health + 10000, level.player.origin ); - - wait 0.05; - } -} - -intro_hillpatrol_check() -{ - trig = getent( "hill_patrol_trig", "targetname" ); - trig waittill ( "trigger" ); - - flag_set( "objective_player_on_ridgeline" ); -} - -intro_ridgeline_check( guy, nodename ) -{ - ridgelinePos = getnode( nodename, "targetname" ); - - dist = length(level.player.origin - ridgelinePos.origin); - - //Wait for guy to reach his place on the ridgeline - - while(dist > 128) - { - dist = length(guy.origin - ridgelinePos.origin); - wait 0.1; - } - - if( guy == level.price ) - flag_set( "objective_on_ridgeline" ); - //flag_set( "objective_price_on_ridgeline" ); - - if( guy == level.player ) - { - //flag_set( "objective_on_ridgeline" ); - //flag_set( "objective_player_on_ridgeline" ); - flag_set( "objective_player_at_vantage_point" ); - } -} - -intro_loudspeaker() -{ - //Ultranationalist Russian commander demanding the surrender of the SAS troops - - aSpeakerTalk = []; - - //TEMP DIALOGUE - //"Surrender at once and your lives will be spared. I am sure you will make the right choice given the circumstances." - aSpeakerTalk[ 0 ] = "villagedef_rul_surrenderatonce"; - - //TEMP DIALOGUE - //"Drop your weapons and surrender at once. You will not be harmed if you surrender." - aSpeakerTalk[ 1 ] = "villagedef_rul_dropyourweapons"; - - //TEMP DIALOGUE - //"We know you are hiding in the village. You are surrounded, there is nowhere to run. Surrender and make it easy on yourselves." - aSpeakerTalk[ 2 ] = "villagedef_rul_weknowyourehiding"; - - aSpeakers = getentarray( "russian_loudspeaker", "targetname" ); - speakerCount = aSpeakers.size; - j = 0; - - for( i = 0; i < aSpeakerTalk.size; i++ ) - { - if( j >= speakerCount) - j = 0; - - play_sound_in_space( aSpeakerTalk[ i ], aSpeakers[ j ].origin); - wait randomfloatrange( 5 , 8); - j++; - } -} - -southern_hill_defense() -{ - thread southern_hill_intro(); - thread southern_hill_intro_interrupt(); - thread southern_hill_panic_screaming(); - thread southern_hill_javelin(); - thread southern_hill_ambush(); - thread southern_hill_primary_attack(); - thread southern_hill_baglimit(); -} - -southern_hill_primary_attack() -{ - //level endon ( "objective_player_uses_minigun" ); - level endon ( "southern_hill_smoked" ); - - startNode = getnode( "southern_hill_waypoint", "targetname" ); - unitName = "southern_hill_assaulter"; - endonMsg = "southern_hill_attack_stop"; - - squad1 = "spawnRock"; - squad2 = "spawnRoad"; - squad3 = "spawnGas"; - - level endon ( endonMsg ); - - flag_wait( "southern_hill_killzone_detonate" ); - wait 1; - - while( 1 ) - { - thread encroach_start( startNode, unitName, endonMsg, squad1, "southern_hill" ); - thread encroach_start( startNode, unitName, endonMsg, squad2, "southern_hill" ); - thread encroach_start( startNode, unitName, endonMsg, squad3, "southern_hill" ); - - wait randomfloat( 6, 8 ); - - thread encroach_start( startNode, unitName, endonMsg, squad2, "southern_hill" ); - thread encroach_start( startNode, unitName, endonMsg, squad2, "southern_hill" ); - thread encroach_start( startNode, unitName, endonMsg, squad3, "southern_hill" ); - - wait randomfloat( 8, 10 ); - - thread encroach_start( startNode, unitName, endonMsg, squad1, "southern_hill" ); - thread encroach_start( startNode, unitName, endonMsg, squad3, "southern_hill" ); - thread encroach_start( startNode, unitName, endonMsg, squad2, "southern_hill" ); - - wait randomfloat( 10, 12 ); - } -} - -magic_sniper() -{ - flag_wait( "southern_hill_killzone_detonate" ); - - wait 2; - - n = undefined; - j = 0; - magic_sniper = getent( "southern_hill_magic_sniper", "targetname" ); - //sniperfx = "weap_m40a3sniper_fire_village"; - - while( 1 ) - { - aAxis = []; - aValidSniperTargets = []; - - aAxis = getaiarray( "axis" ); //bad get? - - for( i = 0; i < aAxis.size; i++ ) - { - guy = aAxis[ i ]; - - if( !isdefined( guy.targetname ) && !isdefined( guy.script_noteworthy ) ) - continue; - - if( guy.script_noteworthy == "spawnGas" ) - { - aValidSniperTargets[ aValidSniperTargets.size ] = guy; - } - else - if( guy.script_noteworthy == "spawnRoad" ) - { - aValidSniperTargets[ aValidSniperTargets.size ] = guy; - } - else - if( guy.script_noteworthy == "spawnRock" ) - { - aValidSniperTargets[ aValidSniperTargets.size ] = guy; - } - else - if( isdefined( guy.targetname ) && guy.targetname == "vanguard" ) - { - aValidSniperTargets[ aValidSniperTargets.size ] = guy; - } - else - if ( guy.script_noteworthy == "spawnHillFence" ) - { - aValidSniperTargets[ aValidSniperTargets.size ] = guy; - } - else - if ( guy.script_noteworthy == "spawnHillChurch" ) - { - aValidSniperTargets[ aValidSniperTargets.size ] = guy; - } - else - if ( guy.script_noteworthy == "spawnHillGraveyard" ) - { - aValidSniperTargets[ aValidSniperTargets.size ] = guy; - } - else - if ( guy.script_noteworthy == "spawnHillFlank" ) - { - aValidSniperTargets[ aValidSniperTargets.size ] = guy; - } - } - - if( aValidSniperTargets.size == 0 ) - { - wait 1; - continue; - } - - n = randomint( aValidSniperTargets.size ); - sniperTarget = aValidSniperTargets[ n ]; - - magic_sniper playsound( level.sniperfx ); - sniperTarget doDamage ( sniperTarget.health + 100, (0, 0, 0) ); - - if( level.magicSniperTalk ) - { - if( j == 0 ) - { - //"Target down." - radio_dialogue_queue( "targetdown" ); - j++; - } - else - if( j == 1 ) - { - //"Got him." - radio_dialogue_queue( "gothim" ); - j++; - } - else - if( j == 2 ) - { - //"Target eliminated." - radio_dialogue_queue( "targeteliminated" ); - j++; - } - else - if( j == 3 ) - { - //"Goodbye." - radio_dialogue_queue( "goodbye" ); - j = 0; - } - } - - aAxis = undefined; - aValidSniperTargets = undefined; - - cycleDelay = randomfloatrange( level.southern_hill_magic_sniper_min_cycletime, level.southern_hill_magic_sniper_max_cycletime ); - wait cycleDelay; - } -} - -southern_hill_vanguard_setup() -{ - vanguards = []; - vanguards = getentarray( "vanguard", "targetname" ); - - for( i = 0; i < vanguards.size; i++ ) - { - vanguards[ i ].goalradius = 16; - } - - flag_wait( "objective_player_on_ridgeline" ); - //flag_wait( "objective_price_on_ridgeline" ); - //flag_wait( "objective_on_ridgeline" ); - - for( i = 0; i < vanguards.size; i++ ) - { - //vanguards[ i ] enable_cqbwalk(); - - if( isdefined( vanguards[ i ] ) ) - { - vanguards[ i ].animname = "axis"; - vanguards[ i ] set_run_anim( "patrolwalk_" + ( randomint(5) + 1 ) ); - vanguards[ i ] thread southern_hill_vanguard_nav(); - vanguards[ i ] thread southern_hill_vanguard_wakeup(); - vanguards[ i ] thread southern_hill_deathmonitor(); - vanguards[ i ] thread southern_hill_damagemonitor(); - - } - - wait 0.05; - } -} - -southern_hill_vanguard_nav() -{ - self endon ( "death" ); - - node = undefined; - - if( !isdefined( self.script_noteworthy ) ) - { - node = getnode( "default_vanguard_dest", "targetname" ); - } - else - { - nodes = getnodearray( "vanguard_node", "targetname" ); - for( i = 0; i < nodes.size; i++ ) - { - assertEX( isdefined( nodes[ i ].script_noteworthy ), "vanguard_node without a script_noteworthy" ); - if( self.script_noteworthy == nodes[ i ].script_noteworthy ) - { - node = nodes[ i ]; - break; - } - } - } - - self setgoalnode( node ); - self.goalradius = 2048; - self thread southern_hill_vanguard_aim(); -} - -southern_hill_vanguard_aim() -{ - self endon ( "death" ); - - aimpoints = []; - aimpoints = getentarray( "vanguard_aimpoint", "targetname" ); - - while( 1 ) - { - i = randomint( aimpoints.size ); - self cqb_aim ( aimpoints[ i ] ); - wait randomfloat(1, 2); - } -} - -southern_hill_vanguard_wakeup() -{ - self endon ( "death" ); - - flag_wait( "southern_hill_action_started" ); - - self clear_run_anim(); -} - -southern_hill_timeout() -{ - //timeout on waiting for player if player was close to Price at the time Price reached his goal - - wait 10; - flag_set( "objective_player_at_vantage_point" ); -} - -southern_hill_intro() -{ - level endon ( "intro_hill_interrupted" ); - - flag_wait( "objective_player_on_ridgeline" ); //guys are walking - //flag_wait( "objective_price_on_ridgeline" ); - flag_wait( "objective_on_ridgeline" ); //price is there - - dist = length( level.player.origin - level.price.origin ); - - if( dist < 512 ) - { - thread southern_hill_timeout(); - flag_wait( "objective_player_at_vantage_point" ); //wait longer if player is likely following price - } - - wait 6; - - if( !flag( "southern_hill_action_started" ) ) - { - //"Do it." - //iprintln( "Do it." ); - flag_set( "price_ordered_hill_detonation" ); - radio_dialogue_queue( "doit" ); - } - - //"Ka-boom." - //iprintln( "Ka-boom." ); - radio_dialogue_queue( "kaboom" ); - - if( !flag( "southern_hill_action_started" ) ) - { - flag_set( "southern_hill_killzone_detonate" ); - - wait 0.5; - - flag_set( "southern_hill_action_started" ); - } - else - { - flag_set( "southern_hill_killzone_detonate" ); - } -} - -southern_hill_intro_interrupt() -{ - //if a grenade is thrown by the player and kills an enemy on the hill or the player opens fire, start the battle - - flag_wait( "southern_hill_action_started" ); - - level notify ( "intro_hill_interrupted" ); - - flag_set( "southern_hill_action_started" ); - - wait 0.35; - - if( !flag( "price_ordered_hill_detonation" ) ) - { - radio_dialogue_queue( "doit" ); - radio_dialogue_queue( "kaboom" ); - } - - flag_set( "southern_hill_killzone_detonate" ); -} - -southern_hill_ambush() -{ - flag_wait( "southern_hill_action_started" ); - - //wait 0.15; - - flag_set( "southern_mg_openfire" ); - - //wait 0.3; - - setthreatbias( "player", "axis", 0 ); // axis fight player - setthreatbias( "allies", "axis", 0 ); // axis fight allies - setthreatbias( "axis", "allies", 0 ); // allies fight axis - - flag_wait( "southern_hill_killzone_detonate" ); - - wait 2; - - //"OPEN FIIRRRRRE!!!!!" - //iprintln( "OPEN FIIRRRRRE!!!!!" ); - level.price thread anim_single_queue( level.price, "openfire" ); - - wait 1; - - battlechatter_on( "allies" ); -} - -southern_hill_killzone_sequence() -{ - killzone1 = []; - killzone2 = []; - killzone1point = getent( "southern_hill_killzone_1", "targetname" ); - killzone2point = getent( "southern_hill_killzone_2", "targetname" ); - - while( 1 ) - { - killzone1[ killzone1.size ] = killzone1point; - - if( isdefined( killzone1point.target ) ) - killzone1point = getent( killzone1point.target, "targetname" ); - else - break; - - wait 0.05; - } - - while( 1 ) - { - killzone2[ killzone2.size ] = killzone2point; - - if( isdefined( killzone2point.target ) ) - killzone2point = getent( killzone2point.target, "targetname" ); - else - break; - - wait 0.05; - } - - flag_wait( "southern_hill_killzone_detonate" ); - - battlechatter_on( "axis" ); - - thread killzone_detonation( killzone1 ); - wait 1.25; - thread killzone_detonation( killzone2 ); - - wait 2; - - flag_set( "stop_ambush_music" ); - musicStop( 1 ); -} - -southern_hill_panic_screaming() -{ - //level endon ( "temp_demo_stopshooting" ); //TEMP LEVEL STOP FOR DEMOING PURPOSES ONLY - - level endon ( "stop_hill_screaming" ); - - flag_wait( "southern_hill_action_started" ); - - speakers = getentarray( "ambush_speaker", "targetname" ); - for( j = 0; j < 4; j++ ) - { - for( i = 0; i < speakers.size; i++ ) - { - speaker = speakers[ i ]; - play_sound_in_space( "RU_1_reaction_casualty_generic", speaker.origin ); - wait 1; - play_sound_in_space( "RU_1_order_move_generic", speaker.origin ); - wait 1; - play_sound_in_space( "RU_1_order_attack_infantry", speaker.origin ); - wait 1; - play_sound_in_space( "RU_1_order_action_coverme", speaker.origin ); - wait 1; - play_sound_in_space( "RU_1_inform_suppressed_generic", speaker.origin ); - wait 1; - play_sound_in_space( "RU_1_order_action_suppress", speaker.origin ); - wait 1; - play_sound_in_space( "RU_1_response_ack_covering", speaker.origin ); - wait 1; - play_sound_in_space( "RU_1_response_ack_follow", speaker.origin ); - wait 1; - play_sound_in_space( "villagedef_ru4_helpmeimwounded", speaker.origin ); - wait 1; - play_sound_in_space( "villagedef_ru1_noicantmove", speaker.origin ); - wait 1; - play_sound_in_space( "villagedef_ru2_death", speaker.origin ); - wait 1; - play_sound_in_space( "villagedef_ru3_death", speaker.origin ); - wait 1; - play_sound_in_space( "villagedef_ru4_wheretheyshooting", speaker.origin ); - wait 1; - play_sound_in_space( "villagedef_ru1_icantseethem", speaker.origin ); - wait 1; - play_sound_in_space( "villagedef_ru2_underheavyfire", speaker.origin ); - wait 1; - play_sound_in_space( "villagedef_ru4_reinforcements", speaker.origin ); - wait 1; - play_sound_in_space( "villagedef_ru1_goaroundwest", speaker.origin ); - wait 1; - play_sound_in_space( "villagedef_ru4_imhitmedic", speaker.origin ); - wait 1; - play_sound_in_space( "villagedef_ru1_medic", speaker.origin ); - wait 1; - } - } -} - -southern_hill_ambush_mg() -{ - southern_sas_mg = getent( "southern_house_manual_mg", "targetname" ); - southern_sas_mg setmode( "manual" ); - southern_sas_mg thread southern_hill_mg_targeting(); - - flag_wait( "southern_mg_openfire" ); - - southern_sas_mg thread manual_mg_fire(); -} - -southern_hill_mg_targeting() -{ - level endon ( "sawgunner_moving" ); - - targets = getentarray( self.target, "targetname" ); - n = 0; - - while( 1 ) - { - target = random( targets ); - - self settargetentity( target ); - - wait( randomfloatrange( 1, 5 ) ); - - n++; - - //Occasionally pick off a bad guy - - if( n > 8 ) - { - aAxis = []; - aAxis = getaiarray( "axis" ); - if( aAxis.size ) - { - target = random( aAxis ); - self settargetentity( target ); - wait( randomfloatrange( 1, 2 ) ); - - n = 0; - aAxis = undefined; - } - else - { - break; - } - } - } -} - -manual_mg_fire() -{ - level endon( "sawgunner_moving" ); - self.turret_fires = true; - n = 0; - for ( ;; ) - { - timer = randomfloatrange( 0.4, 0.7 ) * 20; - if ( self.turret_fires ) - { - for ( i = 0; i < timer; i++ ) - { - self shootturret(); - wait( 0.05 ); - } - } - - n++; - - //time between bursts - wait( randomfloat( 3.3, 6 ) ); - - if(n >= 10) - { - //pretend reloading - wait randomfloat( 6.1, 7.4 ); - n = 0; - } - } -} - -southern_hill_javelin() -{ - flag_wait( "southern_hill_action_started" ); - - wait 4; - - //"Nice shot mate!" - radio_dialogue_queue( "niceshotmate" ); -} - -southern_hill_baglimit() -{ - i=0; - - speakers = getentarray( "ambush_speaker", "targetname" ); - - while( i < level.southernHillAdvanceBaglimit ) - { - level waittill ( "player_killed_southern_hill_enemy" ); - i++; - - if( i == level.southernHillAdvanceBaglimit / 2 ) - { - speaker = speakers[ randomint( speakers.size ) ]; - - play_sound_in_space( "villagedef_ru1_mustbetwoplatoons", speaker.origin ); - wait 2; - - //"Squad, hold your ground, they think we're a larger force than we really are." - radio_dialogue_queue( "largerforce" ); - - //"Copy." - radio_dialogue_queue( "copy" ); - } - } - - thread saw_gunner_friendly(); - - wait 7; - - flag_set( "southern_hill_smoked" ); - - wait 20; - - thread southern_hill_smokescreens(); -} - -southern_hill_deathmonitor() -{ - self waittill ( "death", nAttacker ); - - flag_set( "southern_hill_action_started" ); - - if( isdefined( nAttacker ) && nAttacker == level.player ) - { - level notify ( "player_killed_southern_hill_enemy" ); - } -} - -southern_hill_damagemonitor() -{ - self waittill ( "damage", nAttacker ); - - flag_set( "southern_hill_action_started" ); -} - -southern_hill_shotmonitor() -{ - trig = getent( "hill_patrol_shotdetector", "targetname" ); - - /* - - trig waittill ( "damage", nAttacker ); - - if( isdefined( nAttacker ) && nAttacker == level.player ) - { - flag_set( "southern_hill_action_started" ); - } - - */ - - trig waittill ( "trigger" ); - flag_set( "southern_hill_action_started" ); -} - -saw_gunner_friendly() -{ - //spawn the SAW gunner - - sasGunner = getent( "sasGunner", "targetname" ); - level.sasGunner = sasGunner doSpawn(); - if( spawn_failed( level.sasGunner ) ) - { - return; - } - sasGunnerNode = getnode( "fallback_sasGunner", "targetname" ); - level.sasGunner setgoalnode( sasGunnerNode ); - level.sasGunner thread hero(); - level.sasGunner.ignoreSuppression = true; - //level.sasGunner.baseaccuracy = 1; - - flag_wait( "objective_minigun_baglimit_done" ); -} - -/* -intro_tankdrive() -{ - tank = spawn_vehicle_from_targetname_and_drive( "intro_tank" ); - node = getVehicleNode( "intro_tank_church_aim", "targetname" ); - targetpoint = getent( "intro_tank_tower_target", "targetname" ); - - tank setwaitnode(node); - tank waittill ("reached_wait_node"); - tank setTurretTargetEnt( targetpoint ); - tank waittill_notify_or_timeout( "turret_rotate_stopped", 5.0 ); - - flag_wait( "intro_tank_fire_authorization" ); - tank fireweapon(); -} -*/ - -southern_hill_smokescreens() -{ - //playfx(level.smokegrenade, smokeSquad.origin); - //smokescreen_southern_hill - - speakers = getentarray( "ambush_speaker", "targetname" ); - speaker = speakers[ randomint( speakers.size ) ]; - - play_sound_in_space( "villagedef_ru2_putupsmokescreen", speaker.origin ); - - aSmokes = getentarray( "smokescreen_southern_hill", "targetname" ); - for( i = 0; i < aSmokes.size; i++ ) - { - playfx(level.smokegrenade, aSmokes[ i ].origin); - } - - level notify ( "sawgunner_moving" ); - - wait 2; - - level notify ( "stop_hill_screaming" ); - level.magicSniperTalk = false; - - wait 2; - - //"They're putting up smokescreens. Mac - you see anything?" - //iprintln( "They're putting up smokescreens. Mac - you see anything?" ); - radio_dialogue_queue( "smokescreensmac" ); - - wait 0.5; - - //"Not much movement on the road. They might be moving to our west." - //iprintln( "Not much movement on the road. They might be moving to our west." ); - radio_dialogue_queue( "notmuchmovement" ); - - wait 4; - - thread southern_hill_mortars(); - - while( !flag( "objective_player_uses_minigun" ) && !flag( "ridgeline_unsafe" ) ) - { - for( i = 0; i < aSmokes.size; i++ ) - { - playfx(level.smokegrenade, aSmokes[ i ].origin); - wait randomfloatrange( 1.2, 2.3 ); - } - - wait 32; - } -} - -southern_hill_mortars() -{ - //mortars start hitting around on the fake points - //Price orders everyone to fall back to the next defensive zone - //Price tells the player to get on the minigun - //after the friendlies are out of the killzone, mortars start hitting around the real points - //if the player enters the killzone after the timeout, he is killed by a magic mortar - //use level.killzoneBigExplosion_fx - - aHits = getentarray( "southern_hill_mortar_hit", "targetname" ); - aRealHits = getentarray( "southern_hill_mortar_hit_real", "targetname" ); - - thread minigun_fallback(); - thread southern_hill_mortars_killtimer(); - thread southern_hill_mortars_timing( "southern_hill_mortar_hit", "ridgeline_unsafe", 192 ); - - //start the barbed wire breach concealing smoke when the player killing mortars start happening - - flag_set( "southern_hill_smoke_entry" ); - - thread minigun_smokescreens(); - - flag_wait( "ridgeline_unsafe" ); - - thread southern_hill_mortars_timing( "southern_hill_mortar_hit_real", "enemy_breached_wire", 0 ); - - wait 1.5; - - thread minigun_primary_attack(); -} - -minigun_smokescreens() -{ - //level endon ( "enemy_breached_wire" ); - level endon ( "objective_detonators" ); - - aSmokes = getentarray( "smokescreen_barbed_wire", "targetname" ); - - //while( !flag( "enemy_breached_wire" ) ) - while( 1 ) - { - if( flag( "southern_hill_smoke_entry" ) ) - { - for( i = 0; i < aSmokes.size; i++ ) - { - playfx(level.smokegrenade, aSmokes[ i ].origin); - wait randomfloatrange( 1.2, 2.3 ); - } - - wait 28; - } - - wait 0.25; - } - -} - -southern_hill_mortars_timing( mortarMsg, endonMsg, safeDist ) -{ - assertEX( isdefined( mortarMsg ), "mortarMsg not defined" ); - assertEX( isdefined( endonMsg ), "endonMsg not defined" ); - assertEX( isdefined( safeDist ), "safeDist not defined" ); - - level endon ( endonMsg ); - - aHits = getentarray( mortarMsg, "targetname" ); - aHits = array_randomize(aHits); - - while( !flag( endonMsg ) ) - { - for( i = 0; i < aHits.size; i++ ) - { - hit = aHits[ i ]; - dist = distance(level.player.origin, hit.origin); - - if( dist > safeDist ) - { - southern_hill_mortar_detonate( hit ); - wait randomfloatrange( 0.7, 1.4 ); - } - } - - aHits = array_randomize(aHits); - } -} - -southern_hill_mortars_killtimer() -{ - wait level.southernMortarIntroTimer; - flag_set( "ridgeline_targeted" ); - - wait level.southernMortarKillTimer; - flag_set( "ridgeline_unsafe" ); - - //wait 20; - - thread southern_hill_mortars_killplayer(); -} - -southern_hill_mortars_killplayer() -{ - //Blows up player if player is too close to the ridgeline after Price orders the team to fall back - - level endon ( "arm_delaying_action" ); - - dangerZone = getent( "ridgeline_dangerarea", "targetname" ); - - while( 1 ) - { - if( level.player isTouching( dangerZone ) ) - { - wait 2; - if ( level.player isTouching( dangerZone ) ) - { - thread southern_hill_mortar_detonate( level.player ); - level.player doDamage( level.player.health + 10000, level.player.origin ); - } - } - - wait 0.5; - } -} - -minigun_fallback() -{ - flag_wait( "ridgeline_targeted" ); - - autosave_by_name( "ridgeline_under_mortar_fire" ); - - redshirt1 = getent( "redshirt1", "targetname" ); - redshirt2 = getent( "redshirt2", "targetname" ); - - redshirt_node1 = getnode( "fallback_redshirt1", "targetname" ); - redshirt_node2 = getnode( "fallback_redshirt2", "targetname" ); - - //Left trigger spin functionality for console controllers - if( level.console || getdvarint("gpad_in_use") ) - { - level thread minigun_firstuse_check(); - //level thread minigun_session_check(); - - add_hint_string( "minigun_spin_left_trigger", &"SCRIPT_PLATFORM_SPOOL_MINIGUN", maps\village_defend::should_break_minigun_spin_hint ); - } - - //"They're targeting our position with mortars. It's time to fall back." - //iprintln( "They're targeting our position with mortars. It's time to fall back." ); - radio_dialogue_queue( "targetingour" ); - - thread minigun_orders(); - - wait 2; - - //"Two, falling back." - radio_dialogue_queue( "twofallingback" ); - - redshirt1 allowedstances ( "stand", "crouch", "prone" ); - redshirt1 setgoalnode( redshirt_node1 ); - wait randomfloatrange( 0.7, 1.2 ); - - //"Three, on the move." - radio_dialogue_queue( "threeonthemove" ); - - redshirt2 allowedstances ( "stand", "crouch", "prone" ); - redshirt2 setgoalnode( redshirt_node2 ); - - priceNode = getnode( "fallback_price", "targetname" ); - level.price allowedstances ( "stand", "crouch", "prone" ); - level.price setgoalnode( priceNode ); - - //"Three here. Two's in the far eastern building. We've got the eastern road locked down." - radio_dialogue_queue( "easternroadlocked" ); - - level.price.baseaccuracy = 1; - level.price.ignoreSuppression = true; - - redshirt1.baseaccuracy = 1; - redshirt1.ignoreSuppression = true; - - redshirt2.baseaccuracy = 1; - redshirt2.ignoreSuppression = true; - - thread friendly_pushplayer( "off" ); - - wait 5; - - thread intro_church_tower_explode(); -} - -minigun_orders() -{ - level endon ( "objective_player_uses_minigun" ); - level endon ( "objective_minigun_baglimit_done" ); - - //Price gives orders for the minigun. - - flag_set( "objective_price_orders_minigun" ); - - //"Right. Soap, get to the minigun and cover the western flank. Go." - //iprintln( "Right. Soap, get to the minigun and cover the western flank. Go." ); - radio_dialogue_queue( "minigunflank" ); - - thread minigun_use(); - thread minigun_arming_check(); - - n = 0; - cycleTime = 30; - - while( 1 ) - { - wait cycleTime; - - if( n == 0 ) - { - //"Soap, get to the minigun! Move! It's attached to the crashed helicopter." - radio_dialogue_queue( "miniguncrashed" ); - } - - if( n == 1 ) - { - //"Soap, the minigun's online. It's in the crashed helicopter." - radio_dialogue_queue( "gazminigunonline" ); - } - - if( n == 2 ) - { - //"Soap, I need you to operate the minigun! Get your arse moving!" - radio_dialogue_queue( "minigunarse" ); - } - - if( n == 3 ) - { - //Soap. The minigun is inside the crashed helicopter. - radio_dialogue_queue( "priceminiguninheli" ); - } - - if( n == 4 ) - { - //Soap, get inside the crashed helicopter and use the minigun! - level.gaz anim_single_queue( level.gaz, "gazuseminigun" ); - } - - if( n == 5 ) - { - //"Get on the minigun in the helicopter. Move!" - radio_dialogue_queue( "priceminiguninhelimove" ); - n = 0; - cycleTime = 65; - continue; - } - - n++; - - } -} - -minigun_fallback_shouting() -{ - level endon ( "stop_minigun_fallback_shouting" ); - - minigun = getent( "minigun", "targetname" ); - minigunNagDelayTime = 5; - normalNagDelayTime = 10; - normalNagOnly = false; - n = 0; - k = 0; - m = 0; - j = 0; - - while( !flag( "stop_minigun_fallback_shouting" ) ) - { - minigunUser = minigun getTurretOwner(); - - if( isdefined( minigunUser ) && !normalNagOnly ) - { - if( k == 2 ) - { - normalNagOnly = true; - continue; - } - - if( n == 0 ) - { - //GAZ: Soaap!!! Get off the miniguun! We're faalling baack! - radio_dialogue_queue( "detminigunfallbackremind1" ); - } - - if( n == 1 ) - { - //GAZ: Forget the minigun! We've go to go! NOW! - radio_dialogue_queue( "detminigunfallbackremind2" ); - n = 0; - k++; - wait minigunNagDelayTime * 3; - continue; - } - - n++; - - - wait minigunNagDelayTime; - } - else - { - /* - if( m == 3 ) - { - break; - } - */ - - if( j == 0 ) - { - //GAZ: Soap! We're falling back to the next phase line! Let's go! Let's go! You're gonna be left behind!! - radio_dialogue_queue( "detfallbackremind1" ); - } - - if( j == 1 ) - { - //GAZ: Let's gooo!!! Fall back now!!! - radio_dialogue_queue( "detfallbackremind2" ); - } - - if( j == 2 ) - { - //PRICE: Soap! Fall back to the next phase line! You're going to get overrun! - radio_dialogue_queue( "detfallbackremind3" ); - j = 0; - //m++; - continue; - } - - j++; - - wait normalNagDelayTime; - } - } -} - -minigun_fallback_shouting_cancel() -{ - trig = getent( "minigun_fallback_shouting", "targetname" ); - trig waittill ( "trigger" ); - - flag_set( "stop_minigun_fallback_shouting" ); - - thread clacker_use_shouting(); -} - -clacker_use_shouting() -{ - level endon ( "clacker_has_been_exercised" ); - - wait 5; - - //n = 0; - - while( !flag( "clacker_has_been_exercised" ) ) - { - /* - if( n == 2 ) - { - break; - } - */ - - //GAZ: Soap! Use the detonators! There's four of them in the tavern! Move! - radio_dialogue_queue( "detuseremind1" ); - - wait 20; - - //GAZ: The detonators are on the second floor of the tavern! Check your compass and move! We'll try to hold them off! - radio_dialogue_queue( "detuseremind2" ); - - wait 25; - - //n++; - } -} - -minigun_use() -{ - flag_wait( "objective_player_uses_minigun" ); - - level notify ( "southern_hill_attack_stop" ); //stops southern hill attack -} - -minigun_primary_attack() -{ - //Mortar shreds the barbed wire out of the way on the southern hill - - barbedDets = getentarray( "barbed_wire_detonator", "targetname" ); - - thread minigun_barbed_wire_detonate( "southern_hill_barbed_wire_wall_1", barbedDets ); - - wait 2; - - thread minigun_barbed_wire_detonate( "southern_hill_barbed_wire_wall_2", barbedDets ); - - wait 3; - - thread minigun_barbed_wire_detonate( "southern_hill_barbed_wire_wall_3", barbedDets ); - - autosave_by_name( "southwestern_flanking_assault" ); - - thread minigun_breach_baglimit(); - - //startNode = getnode( "southern_hill_waypoint", "targetname" ); - //unitName = "southern_hill_assaulter"; - //endonMsg = "southern_hill_attack_stop"; - - //squad1 = "spawnRock"; - //squad2 = "spawnRoad"; - //squad3 = "spawnGas"; - - //thread encroach_start( startNode, unitName, endonMsg, squad1, "southern_hill" ); - - startnode1 = getnode( "southern_hill_breach_church", "targetname" ); - startnode2 = getnode( "southern_hill_breach_graveyard", "targetname" ); - startnode3 = getnode( "southern_hill_breach_housegap", "targetname" ); - startnode4 = getnode( "southern_hill_breach_flank", "targetname" ); - - unitName = "southern_hill_breacher"; - - endonMsg = "halfway_through_field"; //enemy continues to attack heavily until player is in the barn and has picked up the javelin - - squad1 = "spawnHillChurch"; - squad2 = "spawnHillGraveyard"; - squad3 = "spawnHillFence"; - squad4 = "spawnHillFlank"; - - deathmonitorName = "minigun_breach"; - - level endon ( endonMsg ); - - while( 1 ) - { - thread encroach_start( startNode2, unitName, endonMsg, squad1, deathmonitorName ); - thread encroach_start( startNode2, unitName, endonMsg, squad2, deathmonitorName ); - thread encroach_start( startNode3, unitName, endonMsg, squad3, deathmonitorName ); - - wait randomfloatrange( 6, 8 ); - - thread encroach_start( startNode1, unitName, endonMsg, squad1, deathmonitorName ); - thread encroach_start( startNode2, unitName, endonMsg, squad2, deathmonitorName ); - thread encroach_start( startNode1, unitName, endonMsg, squad3, deathmonitorName ); - - wait randomfloatrange( 9, 11 ); - - thread encroach_start( startNode3, unitName, endonMsg, squad1, deathmonitorName ); - thread encroach_start( startNode2, unitName, endonMsg, squad2, deathmonitorName ); - thread encroach_start( startNode2, unitName, endonMsg, squad3, deathmonitorName ); - //thread encroach_start( startNode4, unitName, endonMsg, squad4, deathmonitorName ); - - wait randomfloatrange( 12, 14 ); - } -} - -minigun_breach_deathmonitor() -{ - self waittill ( "death", nAttacker ); - if( isdefined( nAttacker ) && nAttacker == level.player ) - { - level notify ( "player_killed_minigun_breach_enemy" ); - } -} - -minigun_breach_baglimit() -{ - i=0; - while( i < level.minigunBreachBaglimit ) - { - level waittill ( "player_killed_minigun_breach_enemy" ); - i++; - } - - flag_set( "objective_minigun_baglimit_done" ); - flag_set( "divert_for_clacker" ); -} - -minigun_barbed_wire_detonate( barricade, detonators ) -{ - obstacle = getentarray( barricade, "targetname" ); - - for( i = 0; i < detonators.size; i++ ) - { - det = detonators[ i ]; - if( !isdefined( det.script_noteworthy ) ) - continue; - if( det.script_noteworthy != barricade ) - continue; - - playfx( level.megaExplosion, det.origin ); - det playsound( "explo_mine" ); - earthquake( 0.5, 0.5, level.player.origin, 1250 ); - radiusDamage(det.origin, 256, 1000, 500); //radiusDamage(origin, range, maxdamage, mindamage); - } - - for( i = 0; i < obstacle.size; i++ ) - { - obstacle[ i ] delete(); - } - - flag_set( "enemy_breached_wire" ); - - level.magicSniperTalk = true; -} - -minigun_firstuse_check() -{ - while( !flag( "minigun_lesson_learned" ) ) - { - minigun = getent( "minigun", "targetname" ); - minigun waittill( "turretownerchange" ); - minigunUser = minigun getTurretOwner(); - - if( !isdefined( minigunUser) ) - { - level notify ( "minigun_session" ); - continue; - } - - if( level.console || getdvarint("gpad_in_use") ) - thread display_hint( "minigun_spin_left_trigger" ); - } -} - -/* -minigun_session_check() -{ - //First three uses, player gets the hint to use left trigger - - while( level.minigunSessions < 2 ) - { - level waittill ( "minigun_session" ); - level.minigunSessions++; - } - - flag_set( "minigun_lesson_learned" ); -} -*/ - -minigun_arming_check() -{ - //Checks to see if the player is on the minigun. - //Lowers enemy AI accuracy when player is on the minigun. - - minigun = getent( "minigun", "targetname" ); - - while(1) - { - minigunUser = minigun getTurretOwner(); - if( !isdefined( minigunUser ) ) - { - minigun waittill("turretownerchange"); - minigunUser = minigun getTurretOwner(); - } - - wait 1; - - if((isdefined(minigunUser) && level.player != minigunUser) || !isdefined(minigunUser)) - { - aEnemy = []; - aEnemy = getaiarray( "axis" ); - /* - for( i = 0; i < aEnemy.size; i++ ) - { - aEnemy[ i ].baseAccuracy = 8; - } - */ - } - - if( (isdefined(minigunUser) && level.player == minigunUser) ) - { - if( !flag( "objective_player_uses_minigun" ) ) - { - flag_set( "objective_player_uses_minigun" ); - - wait 2.5; - - //"Soap. Keep the minigun spooled up. Fire in bursts, 30 seconds max." - radio_dialogue_queue( "spooledup" ); - } - - aEnemy = []; - aEnemy = getaiarray( "axis" ); - - /* - for( i = 0; i < aEnemy.size; i++ ) - { - aEnemy[ i ].baseAccuracy = 5; - } - */ - } - } -} - -helidrop() -{ - flag_wait( "objective_minigun_baglimit_done" ); - flag_set( "helidrop_started" ); - - level.magicSniperTalk = false; - - spawn_vehicle_from_targetname_and_drive( "helidrop_01" ); - spawn_vehicle_from_targetname_and_drive( "helidrop_02" ); - spawn_vehicle_from_targetname_and_drive( "helidrop_03" ); - spawn_vehicle_from_targetname_and_drive( "helidrop_04" ); - spawn_vehicle_from_targetname_and_drive( "helidrop_05" ); - - thread helidrop_rider_setup( "helidrop_01" ); - thread helidrop_rider_setup( "helidrop_02" ); - thread helidrop_rider_setup( "helidrop_03" ); - thread helidrop_rider_setup( "helidrop_04" ); - thread helidrop_rider_setup( "helidrop_05" ); - - wait 20; - - //"We've got a problem here...heads up!" - radio_dialogue_queue( "headsup" ); - - //"Bloody hell, that's a lot of helis innit?" - radio_dialogue_queue( "lotofhelis" ); - - //"Soap, fall back to the tavern and man the detonators." - //iprintln( "Soap, fall back to the tavern and man the detonators." ); - radio_dialogue_queue( "tavern" ); - - flag_set( "objective_detonators" ); - flag_set( "detonators_activate" ); - - //"The rest of us will keep them busy from the next defensive line. Everyone move!" - //iprintln( "The rest of us will keep them busy from the next defensive line. Everyone move!" ); - radio_dialogue_queue( "nextdefensiveline" ); - - priceNode = getnode( "clacker_fallback_price", "targetname" ); - level.price setgoalnode( priceNode ); - level.price thread hero_scripted_travel(); - - redshirt1 = getent( "redshirt1", "targetname" ); - redshirt_node1 = getnode( "clacker_fallback_redshirt1", "targetname" ); - redshirt1 setgoalnode( redshirt_node1 ); - redshirt1 thread hero_scripted_travel(); - - redshirt2 = getent( "redshirt2", "targetname" ); - redshirt_node2 = getnode( "clacker_fallback_redshirt2", "targetname" ); - redshirt2 setgoalnode( redshirt_node2 ); - redshirt2 thread hero_scripted_travel(); - - sasGunnerNode = getnode( "clacker_fallback_sasGunner", "targetname" ); - level.sasGunner setgoalnode( sasGunnerNode ); - level.sasGunner thread hero_scripted_travel(); - - thread minigun_fallback_shouting_cancel(); - thread minigun_fallback_shouting(); -} - -hero_scripted_travel() -{ - self.disableArrivals = true; - self.goalradius = 16; - - self waittill ( "goal" ); - wait 2; - self.disableArrivals = false; - self.goalradius = 2048; -} - -helidrop_rider_setup( heliName ) -{ - heli = getent( heliName, "targetname" ); - aRiders = heli.riders; - - for( i = 0; i < aRiders.size; i++ ) - { - rider = aRiders[ i ]; - rider thread hunt_player( heli ); - rider thread helidrop_clacker_divert( heli ); - } -} - -hunt_player( heli ) -{ - self endon ( "death" ); - self endon ( "going_to_baitnode" ); - - if( isdefined( heli ) ) - heli waittill ( "unloaded" ); - - self.goalradius = 1800; - - //Adjust accuracy of helidrop troops to make them more effective in the larger spaces inherent in this layout - /* - switch( level.gameSkill ) - { - case 0: - self.baseAccuracy = 1; - break; - case 1: - self.baseAccuracy = 2; - break; - case 2: - self.baseAccuracy = 4; - break; - case 3: - self.baseAccuracy = 5; - break; - } - */ - - //Encroach on the player and kill the player - //When player enters the upper floor of the clacker house a flag is set - - self.pathenemyfightdist = 1800; - self.pathenemylookahead = 1800; - - playerHeliDetector = getent( "player_in_blackhawk_detector", "targetname" ); - heliDefaultNode = getnode( "bait_crashsite", "targetname" ); - - while( self.goalradius > 640 ) - { - if( level.player isTouching( playerHeliDetector ) ) - { - self setgoalnode( heliDefaultNode ); - } - else - { - self setgoalpos( level.player.origin ); - } - - self.goalradius = self.goalradius * level.encroachRate; - self waittill ( "goal" ); - wait randomintrange( 10, 15 ); - } -} - -helidrop_clacker_divert( heli ) -{ - self endon ( "death" ); - - if( isdefined( heli ) ) - heli waittill ( "unloaded" ); - - flag_wait( "player_entered_clacker_house_top_floor" ); - - self notify ( "going_to_baitnode" ); - - //if enemy is already within X of player, commits to pursuing player - //outside of X enemy will maneuver to killzone - - baitNode = undefined; - - if( isdefined( self.script_noteworthy ) ) - { - if( self.script_noteworthy == "helidrop_bait_grassyknoll" && !flag( "farslope_exploded" ) ) - { - baitNode = getnode( "bait_farslope", "targetname" ); - } - else - if( self.script_noteworthy == "helidrop_bait_grassyknoll" && flag( "farslope_exploded" ) && !flag( "nearslope_exploded") ) - { - baitNode = getnode( "bait_nearslope", "targetname" ); - } - else - if( self.script_noteworthy == "helidrop_bait_grassyknoll" && flag( "farslope_exploded" ) && flag( "nearslope_exploded" ) ) - { - if( flag( "fall_back_to_barn" ) ) - flag_wait( "storm_the_tavern" ); - - self thread hunt_player(); - return; - } - else - if( self.script_noteworthy == "helidrop_bait_crashsite" && !flag( "crashsite_exploded" ) ) - { - baitNode = getnode( "bait_crashsite", "targetname" ); - } - else - if( self.script_noteworthy == "helidrop_bait_crashsite" && flag( "crashsite_exploded" ) && !flag( "cliffside_exploded" ) ) - { - baitNode = getnode( "bait_crashsite", "targetname" ); - } - else - if( self.script_noteworthy == "helidrop_bait_crashsite" && flag( "crashsite_exploded" ) && flag( "cliffside_exploded" ) ) - { - baitNode = getnode( "bait_crashsite", "targetname" ); //best blocking position - } - else - if( self.script_noteworthy == "helidrop_bait_trees" && !flag( "cliffside_exploded" ) ) - { - baitNode = getnode( "bait_trees", "targetname" ); - } - if( self.script_noteworthy == "helidrop_bait_trees" && flag( "cliffside_exploded" ) && !flag( "crashsite_exploded" ) ) - { - baitNode = getnode( "bait_crashsite", "targetname" ); - } - else - if( self.script_noteworthy == "spawnHillFlank" ) - { - baitNode = getnode( "bait_nearslope", "targetname" ); - } - else - { - self.goalradius = 2400; - - switch( level.genericBaitCount ) - { - case 0: - baitNode = getnode( "bait_nearslope", "targetname" ); - level.genericBaitCount++; - break; - case 1: - baitNode = getnode( "bait_trees", "targetname" ); - level.genericBaitCount = 0; - break; - } - } - } - else - { - if( flag( "fall_back_to_barn" ) ) - flag_wait( "storm_the_tavern" ); - - self thread hunt_player(); - return; - } - - distToPlayer = distance( level.player.origin, self.origin ); - wait 0.5; - distToBaitNode = distance( baitNode.origin, self.origin ); - - if( ( level.divertClackerRange < distToPlayer ) && ( distToBaitNode < distToPlayer ) ) - { - self setgoalnode( baitNode ); - } - - flag_wait( "fall_back_to_barn" ); - - //Storm the tavern and the player hardcore - - //wait randomfloatrange( 1.5, 2.8 ); - - if( flag( "fall_back_to_barn" ) ) - flag_wait( "storm_the_tavern" ); - - self thread hunt_player(); -} - -tavern_storming_delay() -{ - trig = getent( "tavern_fallback_shouting", "targetname" ); - trig thread tavern_stop_shouting(); - - thread tavern_storming_hints(); - - wait 5; - - if( !flag( "player_running_to_farm" ) ) - flag_clear( "can_save" ); - - wait 55; - - flag_set( "storm_the_tavern" ); -} - -tavern_storming_hints() -{ - level endon ( "stop_shouting_tavern" ); - - flag_wait( "objective_armor_arrival" ); - - for( i = 0; i < 2; i++ ) - { - //PRICE: "Fall back to the farm at the top of the hill. Let's go. Now." - radio_dialogue_queue( "fallbacktofarm1" ); - - wait 1; - - if( i < 1 ) - { - //GAZ: "FALL BAAACK!!! FAALLL BAACK!!!" - level.gaz anim_single_queue( level.gaz, "fallbackgeneric" ); - } - - wait 1; - - if( i < 1 ) - { - //GAZ: "Head for the farm to the north! Go! Go! Go!" - level.gaz anim_single_queue( level.gaz, "fallbacktofarm3" ); - } - - wait 12; - - //PRICE: "Soap! You wanna be left behind? Fall back to the farm. Move!" - radio_dialogue_queue( "fallbacktofarm2" ); - - wait 12; - - //GAZ: "Soap! They're going to overrun your position! Fall back now!" - radio_dialogue_queue( "tavernoverrunsoon" ); - - wait 10; - } -} - -tavern_stop_shouting() -{ - self waittill ( "trigger" ); - level notify ( "stop_shouting_tavern" ); - - flag_set( "player_running_to_farm" ); - flag_set( "can_save" ); - - autosave_by_name( "running_to_farm" ); -} - -clacker_primary_attack() -{ - flag_wait( "objective_minigun_baglimit_done" ); - flag_set( "spawncull" ); - - thread clacker_nearfarslope_check(); - - startnode4 = getnode( "southern_hill_breach_flank", "targetname" ); - - unitName = "southern_hill_breacher"; - - endonMsg = "clacker_far_and_near_slope_done"; - - squad4 = "spawnHillFlank"; - - level endon ( endonMsg ); - - startAttackTrig = getent( "nearfarslope_activation", "targetname" ); - startAttackTrig waittill ( "trigger" ); - - flag_set( "player_entered_clacker_house_top_floor" ); - - autosave_by_name( "player_entered_clacker_house" ); - - flag_wait( "helidrop_started" ); - - while( 1 ) - { - aAxis = undefined; - aAxis = []; - aAxis = getaiarray( "axis" ); - if( aAxis.size < 27 ) - { - thread encroach_start( startNode4, unitName, endonMsg, squad4, undefined ); - wait randomfloatrange( 2, 3 ); - } - - wait 0.5; - } -} - -clacker_nearfarslope_check() -{ - //if player has detonated the near and far slope mines, then stop attacks from the southern hill left flank - - flag_wait( "nearslope_exploded" ); - flag_wait( "farslope_exploded" ); - - flag_set( "clacker_far_and_near_slope_done" ); -} - -clacker_init() -{ - aUseTrigs = getentarray( "detonator_usetrig", "targetname" ); - aDets = []; - detEnts = []; - det = undefined; - - for( i = 0; i < aUseTrigs.size; i++ ) - { - if( !isdefined( aUseTrigs[ i ].target ) ) - continue; - - detEnts = getentarray( aUseTrigs[ i ].target, "targetname" ); - - for( j = 0; j < detEnts.size; j++ ) - { - det = detEnts[ j ]; - - if( !isdefined( det.script_namenumber ) ) - continue; - - if( det.script_namenumber == "objective_clacker" ) - { - level.objectiveClackers++; - aDets[ aDets.size ] = det; - det hide(); - } - } - - detEnts = []; - } - - for( i = 0; i < aDets.size; i++ ) - { - markers = []; - markers = aDets[ i ] clacker_marker_setup(); - aDets[ i ] thread clacker_standby( markers ); - } -} - -clacker_marker_setup() -{ - markers = []; - currentMarker = getent( self.target, "targetname" ); - - while( 1 ) - { - markers[ markers.size ] = currentMarker; - - if( isdefined( currentMarker.target ) ) - currentMarker = getent( currentMarker.target, "targetname" ); - else - break; - - wait 0.05; - } - - return( markers ); -} - -clacker_standby( markers ) -{ - assertEX( isdefined( self.targetname ), "clacker use trigger should target the clacker" ); - trig = getent( self.targetname, "target" ); - - assertEX( isdefined( self.script_noteworthy ), "useVolume should have a targetname matching the clacker script_noteworthy" ); - useVolume = getent( self.script_noteworthy, "targetname" ); - - flag_wait( "detonators_activate" ); - - self show(); - - trigFlag = trig.script_flag_true; - flag_set( trigFlag ); - - while( 1 ) - { - self thread clacker_markers( useVolume, markers ); - - trig sethintstring( &"SCRIPT_PLATFORM_HINT_GET_DETONATOR" ); - trig waittill ( "trigger" ); - - self thread clacker_enable( trig, useVolume, markers ); - self thread clacker_notouch( trig, useVolume ); - } -} - -clacker_markers( useVolume, detMarkers ) -{ - //Display the marker effects - - objGroup = undefined; - - while( isdefined( useVolume ) ) - { - if( level.player isTouching( useVolume ) ) - { - setthreatbias( "player", "axis", 50 ); //don't shoot player as much when at detonator window - - //effect = spawnFx( getfx( "firelp_small_dl" ), markerPos.origin + (0, 0, 64) ); - - objGroup = []; - - for( i = 0; i < detMarkers.size; i++ ) - { - obj = spawn( "script_model", ( 0, 0, 0 ) ); - obj setModel( "tag_origin" ); - obj.angles = ( -90, 0, 0 ); - obj.origin = detMarkers[ i ].origin; - objGroup[ objGroup.size ] = obj; - - playfxontag( getfx( "killzone_marker" ), obj, "tag_origin" ); - } - } - - while( isdefined( useVolume) && level.player isTouching( useVolume ) ) - { - wait 0.1; - } - - //Remove the glowing hint effects for the killzone if they were generated previously - - if( isdefined( objGroup ) ) - { - assertEX( objGroup.size > 0, "there are no detMarkers to delete" ); - - count = objGroup.size; - - for( i = 0; i < count; i++ ) - { - objGroup[ i ] delete(); - } - - objGroup = undefined; - - setthreatbias( "player", "axis", 1000 ); //resume normal aggression when player is not near a detonator window - } - - wait 0.1; - } -} - -clacker_enable( trig, useVolume, markers ) -{ - if( level.player isTouching( useVolume ) ) - { - self hide(); //hide the prop clacker - - //Bring up the clacker in hand - - flag_set( "got_the_clacker" ); - - level.player maps\_c4::switch_to_detonator(); - - self thread clacker_drop( trig, useVolume ); - - //The use trigger for this specific clacker is deactivated while player has the clacker - - trigFlag = trig.script_flag_true; - flag_clear( trigFlag ); - - //trig hide(); - //trig trigger_off(); - - self thread clacker_fire( trig, useVolume, markers ); - - while( level.player getcurrentweapon() != "c4" ) - { - wait 0.05; - } - - flag_clear( "got_the_clacker" ); - } -} - -clacker_drop( trig, useVolume ) -{ - //detects when player switches to another weapon, which automatically counts as 'clacker dropped' - - while( isdefined( useVolume) && level.player isTouching ( useVolume ) && !flag( "got_the_clacker" ) ) - { - //wait 2; - weapon = level.player getcurrentweapon(); - - if( weapon != "c4" ) - self thread clacker_disable( trig, useVolume ); - - wait 0.05; - } -} - -clacker_notouch(trig, useVolume ) -{ - while( isdefined( useVolume ) && level.player isTouching( useVolume ) ) - { - wait 0.1; - } - - self thread clacker_disable( trig, useVolume ); -} - -clacker_disable( trig, useVolume ) -{ - //Actively disarm the armed clacker - - if( isdefined( trig ) ) - { - level notify ( "detclacker_disarm" ); - flag_clear( "got_the_clacker" ); - - //If clacker has been picked up - //and player is not in the detection volume - //or player switched weapons away from the clacker - - //Return the clacker to its rightful spot - //Clacker reappears - - level.player takeweapon( "c4" ); - self show(); - - //Reenable use trigger for clacker pickup - - trigFlag = trig.script_flag_true; - flag_set( trigFlag ); - - //trig show(); - //trig trigger_on(); - - //Switch to normal weapon - - level.player switchtoweapon( level.player GetWeaponsListPrimaries()[0] ); - } -} - -clacker_fire( trig, useVolume, markers ) -{ - level endon ( "detclacker_disarm" ); - - //Arm the clacker - level.player waittill( "detonate" ); - - flag_set( "clacker_has_been_exercised" ); - - assertEX( isdefined( trig ), "trig is not defined" ); - - if( !isdefined( trig ) ) - return; - - if( self.script_noteworthy == "detonator_nearslope" ) - flag_set( "nearslope_exploded" ); - - if( self.script_noteworthy == "detonator_farslope" ) - flag_set( "farslope_exploded" ); - - if( self.script_noteworthy == "detonator_crashsite" ) - flag_set( "crashsite_exploded" ); - - if( self.script_noteworthy == "detonator_cliffside" ) - flag_set( "cliffside_exploded" ); - - thread killzone_detonation( markers, level.player ); - - earthquake( 0.5, 2, level.player.origin, 1650 ); - - level.player takeweapon( "c4" ); - level.player switchtoweapon( level.player GetWeaponsListPrimaries()[0] ); - - //Objective position updating for clackers - - //Locate the clacker position that was just used - - targ = undefined; - usedClackerObjectiveMarker = undefined; - - trigTargets = getentarray( trig.target, "targetname" ); - - for( i = 0 ; i < trigTargets.size; i++ ) - { - targ = trigTargets[ i ]; - - if( !isdefined( targ.script_noteworthy ) ) - continue; - - if( !( targ.script_noteworthy == "clacker_objective_marker" ) ) - continue; - - usedClackerObjectiveMarker = targ; - } - - //Get the clacker positions and remove the position that was just used - - aManualDets = getentarray( "clacker_objective_marker", "script_noteworthy" ); - - for( i = 0; i < aManualDets.size; i++ ) - { - det = aManualDets[ i ]; - if( det == usedClackerObjectiveMarker ) - aManualDets = maps\_utility::array_remove(aManualDets, det); - } - - useVolume delete(); - - //Reprint the objective with the latest unused clacker positions - - objective_delete( 5 ); - objective_add( 5, "active", &"VILLAGE_DEFEND_USE_THE_DETONATORS_IN1" ); - objective_current( 5 ); - - for( i = 0; i < aManualDets.size; i++ ) - { - det = aManualDets[ i ]; - if( isdefined( det ) ) - objective_additionalposition( 5, i, det.origin); - } - - trig delete(); - usedClackerObjectiveMarker delete(); - - level.objectiveClackers--; - - if( !level.objectiveClackers ) - { - flag_set( "fall_back_to_barn" ); - flag_set( "barn_assault_begins" ); - - autosave_by_name( "clackers_all_used_up" ); - - thread tavern_storming_delay(); - } -} - -player_interior_detect_init() -{ - level endon ( "farm_reached" ); - - flag_wait( "fall_back_to_barn" ); - - detectors = getentarray( "interior_detection_volume", "targetname" ); - - level.playerIndoors = false; - n = 0; - - while( 1 ) - { - for( i = 0; i < detectors.size; i++ ) - { - if( level.player isTouching( detectors[ i ] ) ) - { - level.playerIndoors = true; - } - else - { - n++; - } - - wait 0.5; - } - - if( n == detectors.size ) - { - level.playerIndoors = false; - } - - n = 0; - - wait 0.5; - } -} - -enemy_interior_flashbangs() -{ - level endon ( "farm_reached" ); - - enemyApproachTrig = getent( "enemy_near_interior_trig", "targetname" ); - - flag_wait( "fall_back_to_barn" ); - - while( 1 ) - { - enemyApproachTrig waittill ( "trigger", enemyAI ); - - enemyAI notify ( "reset_loadout" ); - - wait 0.1; - - if( isdefined( enemyAI ) ) - { - enemyAI thread enemy_interior_grenadeswap(); - enemyAI thread enemy_loadout_reset(); - } - } -} - -enemy_interior_grenadeswap() -{ - self endon ( "death" ); - self endon ( "reset_loadout" ); - - level endon ( "farm_reached" ); - - while( 1 ) - { - if( level.playerIndoors ) - { - self.grenadeammo = 6; - self.grenadeweapon = "flash_grenade"; - } - else - { - self.grenadeammo = 6; - self.grenadeweapon = "fraggrenade"; - break; - } - - wait 0.5; - } -} - -enemy_loadout_reset() -{ - self endon ( "death" ); - self endon ( "reset_loadout" ); - - flag_wait( "farm_reached" ); - - wait 0.5; - - self.grenadeammo = 6; - self.grenadeweapon = "fraggrenade"; -} - -javelin_init() -{ - flag_wait( "fall_back_to_barn" ); - - javelin = spawn( "weapon_javelin", (1021.1, 7309.2, 1006), 1 ); // suspended - javelin.angles = (356.201, 346.91, -0.426635); - - javelin thread add_jav_glow( "kill_jav_glow" ); - - javelin waittill ( "trigger" ); - - flag_set( "got_the_javelin" ); -} - -tanks_init() -{ - if ( getdvar( "start" ) != "final_battle" && getdvar( "start" ) != "seaknight" ) - { - flag_wait( "fall_back_to_barn" ); - - //"We have enemy tanks approaching from the north! (sounds of fighting for a second) Bloody hell I'm hit! Arrrgh - (static)" - radio_dialogue_queue( "enemytanksnorth" ); - - //"Mac's in trouble! Soap! Get to the barn at the northern end of the village and stop those tanks! Use the Javelins in the barn!" - radio_dialogue_queue( "gettothebarn" ); - - flag_set( "objective_armor_arrival" ); - - flag_wait( "got_the_javelin" ); - - //wait randomfloatrange( 3, 5 ); - - for( i = 1; i < 5; i++ ) - { - thread tanks_deploy( "tank_backyard_0" + i ); - } - } -} - -tanks_engage( name ) -{ - self endon ( "death" ); - level.player endon ( "death" ); - - node = undefined; - killzoneTrig = undefined; - - if( name == "tank_backyard_01" ) - { - node = getVehicleNode( "tank1_fire_position", "script_noteworthy" ); - killzoneTrig = getent( "tank_killzone_east", "targetname" ); - } - else - if( name == "tank_backyard_02" ) - { - node = getVehicleNode( "tank2_fire_position", "script_noteworthy" ); - killzoneTrig = getent( "tank_killzone_west", "targetname" ); - } - else - if( name == "tank_backyard_03" ) - { - node = getVehicleNode( "tank3_fire_position", "script_noteworthy" ); - killzoneTrig = getent( "tank_killzone_west", "targetname" ); - } - else - if( name == "tank_backyard_04" ) - { - node = getVehicleNode( "tank4_fire_position", "script_noteworthy" ); - killzoneTrig = getent( "tank_killzone_east", "targetname" ); - } - - self setwaitnode( node ); - - self waittill ("reached_wait_node"); - - while( 1 ) - { - killzoneTrig waittill ( "trigger" ); - self setTurretTargetVec( level.player.origin + ( 0, 0, 72 ) ); - self waittill_notify_or_timeout( "turret_rotate_stopped", 8.0 ); - self fireweapon(); - wait 4; - } -} - -tanks_deploy( name ) -{ - tank = spawn_vehicle_from_targetname_and_drive( name ); - tank thread tanks_engage( name ); - - tank.mgturret[ 0 ].maxrange = 6000; - - level.tankid++; - tanknumber = level.tankid; - - tank thread tank_ping( tanknumber ); - - OFFSET = ( 0, 0, 60 ); - target_set( tank, OFFSET ); - target_setAttackMode( tank, "top" ); - target_setJavelinOnly( tank, true ); - - tank waittill ( "death" ); - - level.tankPop--; - - if( level.tankPop ) - { - objective_delete( 8 ); - objective_add( 8, "active", "" ); - objective_string( 8, &"VILLAGE_DEFEND_DESTROY_THE_INCOMING", level.tankPop ); - objective_current( 8 ); - - autosave_or_timeout( "save_tank_destroyed_with_javelin", 10 ); - } - else - { - flag_set( "objective_all_tanks_destroyed" ); - flag_set( "kill_jav_glow" ); - } - - if ( isdefined( tank ) ) - { - target_remove( tank ); //javelin targeting reticle removal - } - - arcadeMode_kill( tank.origin, "explosive", 1000 ); -} - -tank_ping( tanknumber ) -{ - self endon ( "death" ); - - while( isalive( self ) ) - { - objective_additionalposition( 8, tanknumber, self.origin); - objective_ring( 8 ); - wait 1.2; - } -} - -barn_helidrop() -{ - if ( getdvar( "start" ) != "final_battle" && getdvar( "start" ) != "javelin" && getdvar( "start" ) != "seaknight" ) - { - //enemy_heli_reinforcement_shoulder - //enemy_heli_reinforcement_barncenter - //enemy_heli_reinforcement_parkinglot - //enemy_heli_reinforcement_barnleft - //enemy_heli_reinforcement_cowfield - - barnHelidropTrig = getent( "barn_helidrop", "targetname" ); - - flag_wait( "barn_assault_begins" ); - - barnHelidropTrig waittill ( "trigger" ); - - level notify ( "halfway_through_field" ); - - spawn_vehicle_from_targetname_and_drive( "enemy_heli_reinforcement_shoulder" ); - spawn_vehicle_from_targetname_and_drive( "enemy_heli_reinforcement_barncenter" ); - spawn_vehicle_from_targetname_and_drive( "enemy_heli_reinforcement_cowfield" ); - //spawn_vehicle_from_targetname_and_drive( "enemy_heli_reinforcement_barnleft" ); - } -} - -field_fallback() -{ - redshirt1 = getent( "redshirt1", "targetname" ); - redshirt2 = getent( "redshirt2", "targetname" ); - redshirt_node1 = getnode( "field_fallback_redshirt1", "targetname" ); - redshirt_node2 = getnode( "field_fallback_redshirt2", "targetname" ); - priceNode = getnode( "field_fallback_price", "targetname" ); - sasGunnerNode = getnode( "field_fallback_sasGunner", "targetname" ); - - flag_wait( "fall_back_to_barn" ); - - redshirt1 setgoalnode( redshirt_node1 ); - wait 2; - - redshirt2 setgoalnode( redshirt_node2 ); - wait 2; - - level.price setgoalnode( priceNode ); - wait 5; - - level.sasGunner setgoalnode( sasGunnerNode ); -} - -barn_fallback() -{ - redshirt1 = getent( "redshirt1", "targetname" ); - redshirt_node1 = getnode( "barn_fallback_redshirt1", "targetname" ); - - redshirt2 = getent( "redshirt2", "targetname" ); - redshirt_node2 = getnode( "barn_fallback_redshirt2", "targetname" ); - - priceNode = getnode( "barn_fallback_price", "targetname" ); - - sasGunnerNode = getnode( "barn_fallback_sasGunner", "targetname" ); - - flag_wait( "got_the_javelin" ); - - redshirt1 setgoalnode( redshirt_node1 ); - wait 1; - - redshirt2 setgoalnode( redshirt_node2 ); - wait 2; - - level.price setgoalnode( priceNode ); - wait 3; - - level.sasGunner setgoalnode( sasGunnerNode ); -} - -escape_fallback() -{ - trig = getent( "final_lz", "targetname" ); - - redshirt1 = getent( "redshirt1", "targetname" ); - redshirt_node1 = getnode( "final_rally_gaz", "targetname" ); - - redshirt2 = getent( "redshirt2", "targetname" ); - redshirt_node2 = getnode( "final_rally_redshirt2", "targetname" ); - - priceNode = getnode( "final_rally_price", "targetname" ); - - sasGunnerNode = getnode( "final_rally_redshirt1", "targetname" ); - - flag_wait( "arm_delaying_action" ); - - trig waittill ( "trigger" ); - - flag_set( "lz_reached" ); - - redshirt2 setgoalnode( redshirt_node2 ); - level.price setgoalnode( priceNode ); - level.sasGunner setgoalnode( sasGunnerNode ); - redshirt1 setgoalnode( redshirt_node1 ); -} - -final_battle() -{ - if ( getdvar( "start" ) != "seaknight" ) - { - flag_wait( "start_final_battle" ); - - wait 6; - - flag_set( "airstrikes_ready" ); - - wait 5; - - flag_wait( "falcon_one_finished_talking" ); - - //"Bravo Six, this is Gryphon Two-Seven. We've just crossed into Azerbaijani airspace. E.T.A. is four minutes. Be ready for pickup." - radio_dialogue_queue( "etafourminutes" ); - - autosave_by_name( "start_the_clock" ); - } - - thread objective_stopwatch(); - thread countdown_events(); - //thread early_chopper(); - thread rescue_chopper(); - thread mandown_reverse_spawn(); - - if ( getdvar( "start" ) != "seaknight" ) - { - if ( getdvar( "village_defend_one_minute") != "1" ) - { - //MHP: Bravo Six, The LZ is too hot! We cannot land at the farm! I repeat, we CANNOT land at the farm! We're picking up SAM sites all over these mountains! - radio_dialogue_queue( "pickingupSAMs" ); - - thread escape_music(); - - //GAZ: That's just great!! Where the hell are they gonna land now? - level.gaz anim_single_queue( level.gaz, "thatsjustgreat" ); - - //"Bravo Six, we're getting' a lot of enemy radar signatures, we'll try to land closer to the bottom of the hill to avoid a lock-on." - radio_dialogue_queue( "lzbottomhill" ); - - - //GAZ: Is he takin' the piss? We just busted our arses to get to this LZ and now they want us to go all the way back down?! - radio_dialogue_queue( "takingthepiss" ); - - //PRICE: Forget it Gaz! We've got to get to the new LZ at the bottom of the hill! Now! Soap! Take point! Go! - radio_dialogue_queue( "thenewlz" ); - } - - flag_set( "objective_get_to_lz" ); - flag_set( "return_trip_begins" ); - - wait 15; - - //Bravo Six, be advised, we're gonna come in low from the south across the river. Recommend you haul ass to LZ Bravo at the base of the hill. Out. - radio_dialogue_queue( "lzfoxtrot" ); - - //"Copy Two-Seven! Everyone - head for the landing zone! It's our last chance! Move!" - radio_dialogue_queue( "headlandingzone" ); - } -} - -return_trip_friendly_boost() -{ - flag_wait( "return_trip_begins" ); - - aAllies = getaiarray( "allies" ); - for( i = 0; i < aAllies.size; i++ ) - { - if( level.gameSkill == 0 ) - aAllies[ i ].baseAccuracy = 12; - - if( level.gameSkill == 1 ) - aAllies[ i ].baseAccuracy = 6; - - if( level.gameSkill == 2 ) - aAllies[ i ].baseAccuracy = 2; - - if( level.gameSkill == 3 ) - aAllies[ i ].baseAccuracy = 1.5; - } -} - -airstrike_command() -{ - flag_wait( "airstrikes_ready" ); - - thread callStrike( level.player.origin, 1, ( 0, 110, 0 ) ); - wait 1.2; - thread callStrike( level.player.origin, 1, ( 0, 96, 0 ) ); - wait 1; - thread callStrike( level.player.origin, 1, ( 0, 126, 0 ) ); - - wait 5; - - //"Bravo Six, this is Falcon One standing by to provide close air support. Gimme a target over." - radio_dialogue_queue( "casready" ); - - if ( isdefined( level.console ) && level.console || getdvarint("gpad_in_use")) - thread airstrike_hint_console(); - else - thread airstrike_hint_pc(); - - level.player giveWeapon( "airstrike_support" ); - level.player SetActionSlot( 2, "weapon" , "airstrike_support" ); - - thread airstrike_support(); - - wait 3; - - flag_set( "falcon_one_finished_talking" ); - - flag_wait( "return_trip_begins" ); - - thread airstrike_frequency_check(); - - level endon ( "stop_airstrike_reminders" ); - level endon ( "no_airstrike_ammo" ); - - while( 1 ) - { - startTime = gettime(); - wait 70; - - if( !level.airstrikeCalledRecently ) - { - //"Bravo Six, this is Falcon One standing by to provide close air support. Gimme a target over." - radio_dialogue_queue( "casready" ); - - level.airstrikeCalledRecently = false; - } - } -} - -airstrike_frequency_check() -{ - level endon ( "stop_airstrike_reminders" ); - level endon ( "no_airstrike_ammo" ); - - while( 1 ) - { - level waittill ( "air_support_called" ); - level.airstrikeCalledRecently = true; - } -} - -farm_javelin_nag() -{ - wait 8; - - while( !flag( "got_the_javelin" ) ) - { - thread radio_dialogue_queue( "javelinorder2" ); - wait 30; - } -} - -objectives() -{ - minigun = getent( "minigun", "targetname" ); - aManualDets = getentarray( "clacker_objective_marker", "script_noteworthy" ); - farmTrig = getent( "farm_reached_trig", "targetname" ); - extractionPoint = getent( "extraction_point", "targetname" ); - - if ( is_default_start() ) - { - wait 25; - } - - objective_add( 1, "active", &"VILLAGE_DEFEND_OBTAIN_NEW_ORDERS_FROM", ( level.price.origin ) ); - objective_current( 1 ); - - flag_wait( "objective_price_orders_southern_hill" ); - - objective_state( 1 , "done" ); - - //playerDefensePos = getnode( "player_southern_start", "targetname" ); - - flag_set( "aa_southernhill" ); - - objective_add( 2, "active", &"VILLAGE_DEFEND_TAKE_UP_A_DEFENSIVE_POSITION", ( -732, -1473, 188 ) ); - objective_current( 2 ); - - //flag_wait( "objective_on_ridgeline" ); - flag_wait( "objective_player_on_ridgeline" ); - - wait 3; - - objective_state( 2 , "done" ); - - objective_add( 3, "active", &"VILLAGE_DEFEND_DEFEND_THE_SOUTHERN_HILL", ( -732, -1473, 188 ) ); - objective_current( 3 ); - - autosave_by_name( "ready_for_ambush" ); - - flag_wait( "objective_price_orders_minigun" ); - - objective_state( 3 , "done" ); - - flag_clear( "aa_southernhill" ); - flag_set( "aa_minigun" ); - - objective_add( 4, "active", &"VILLAGE_DEFEND_FALL_BACK_AND_DEFEND", ( minigun.origin ) ); - objective_current( 4 ); - - arcademode_checkpoint( 4, "a" ); - - autosave_by_name( "minigun_defense" ); - - flag_wait( "objective_detonators" ); - - objective_state( 4 , "done" ); - - flag_clear( "aa_minigun" ); - flag_set( "aa_detonators" ); - - objective_add( 5, "active", &"VILLAGE_DEFEND_USE_THE_DETONATORS_IN", aManualDets[ 0 ].origin ); - objective_current( 5 ); - - arcademode_checkpoint( 5, "b" ); - - autosave_by_name( "detonator_defense" ); - - for( i = 1; i < aManualDets.size; i++ ) - { - det = aManualDets[ i ]; - - objective_additionalposition( 5, i, det.origin); - } - - flag_wait( "objective_armor_arrival" ); - - objective_state( 5, "done" ); - - flag_clear( "aa_detonators" ); - flag_set( "aa_fallback" ); - - autosave_by_name( "detonators_all_used_up" ); - - objective_add( 6, "active", &"VILLAGE_DEFEND_FALL_BACK_TO_THE_FARM", farmTrig.origin ); - objective_current( 6 ); - - arcademode_checkpoint( 3.5, "c" ); - - thread farm_javelin_nag(); - - if ( getdvar( "start" ) != "final_battle" && getdvar( "start" ) != "seaknight" && getdvar( "start" ) != "javelin" ) - farmTrig waittill ( "trigger" ); - - flag_set( "farm_reached" ); - - objective_state( 6, "done" ); - - flag_clear( "aa_fallback" ); - flag_set( "aa_javelin" ); - - autosave_by_name( "player_got_to_the_farm" ); - - objective_add( 7, "active", &"VILLAGE_DEFEND_GET_THE_JAVELIN_IN_THE", ( 1021.1, 7309.2, 1006 ) ); - objective_current( 7 ); - - arcademode_checkpoint( 2, "d" ); - - //thread radio_dialogue_queue( "javelinorder2" ); - - flag_wait( "got_the_javelin" ); - - objective_state( 7, "done" ); - - autosave_by_name( "got_javelin" ); - - thread early_chopper(); - - objective_add( 8, "active", "" ); - objective_string( 8, &"VILLAGE_DEFEND_DESTROY_THE_INCOMING", 4 ); - objective_current( 8 ); - - arcademode_checkpoint( 4, "e" ); - - //objective_add( 8, "active", &"VILLAGE_DEFEND_DESTROY_THE_INCOMING", 4 ); - - flag_wait( "objective_all_tanks_destroyed" ); - - level.playerSafetyBlocker solid(); - - objective_string( 8, &"VILLAGE_DEFEND_DESTROY_THE_INCOMING1" ); - objective_state( 8, "done" ); - - flag_clear( "aa_javelin" ); - flag_set( "aa_returntrip" ); - - autosave_by_name( "tanks_cleared" ); - - flag_set( "arm_delaying_action" ); - - objective_add( 9, "active", &"VILLAGE_DEFEND_SURVIVE_UNTIL_THE_HELICOPTER" ); - objective_current( 9 ); - - arcademode_checkpoint( 3, "f" ); - - flag_set( "start_final_battle" ); - - flag_wait( "objective_get_to_lz" ); - - objective_add( 9, "active", &"VILLAGE_DEFEND_GET_TO_THE_LZ", extractionPoint.origin ); - objective_current( 9 ); - - autosave_by_name( "get_to_the_choppah" ); - - arcademode_checkpoint( 7, "g" ); - - priceDist = length( level.price.origin - level.player.origin ); - priceCopy = getent( "price_seaknight_doppel", "targetname" ); - - gazDist = length( level.gaz.origin - level.player.origin ); - gazCopy = getent( "gaz_seaknight_doppel", "targetname" ); - - redshirtDist = length( level.redshirt.origin - level.player.origin ); - redshirtCopy = getent( "redshirt_seaknight_doppel", "targetname" ); - - gunnerDist = length( level.sasgunner.origin - level.player.origin ); - gunnerCopy = getent( "sasGunner_seaknight_doppel", "targetname" ); - - playerFollowers = []; - - playerFollowers[ 0 ] = level.price; - playerFollowers[ 1 ] = level.gaz; - playerFollowers[ 2 ] = level.redshirt; - playerFollowers[ 3 ] = level.sasgunner; - - /* - aAllies = getaiarray( "allies" ); - - for( i = 0; i < aAllies.size; i++ ) - { - aAllies[ i ] thread friendly_player_tracking_nav(); - } - */ - - for( i = 0; i < playerFollowers.size; i++ ) - { - playerFollowers[ i ] thread friendly_player_tracking_nav(); - } - - flag_wait( "lz_reached" ); - - level notify ( "stop_airstrike_reminders" ); - - thread friendly_pushplayer( "on" ); - - objective_state( 9, "done" ); - - objective_add( 10, "active", &"VILLAGE_DEFEND_SURVIVE_UNTIL_THE_HELICOPTER" ); - objective_current( 10 ); - - flag_wait( "seaknight_can_be_boarded" ); - - objective_state( 10, "done" ); - - objective_add( 11, "active", &"VILLAGE_DEFEND_BOARD_THE_HELICOPTER", extractionPoint.origin ); - objective_current( 11 ); - - flag_wait( "player_made_it" ); - - arcademode_checkpoint( 1.75, "h" ); - autosave_by_name( "inside_choppah" ); - - flag_wait( "outtahere" ); - - objective_state( 11, "done" ); - - flag_clear( "aa_returntrip" ); -} - -autosaves_return_trip() -{ - level endon ( "outtahere" ); - - flag_wait( "return_trip_begins" ); - - saveTrig1 = getent( "first_return_save" , "targetname" ); - saveTrig2 = getent( "second_return_save" , "targetname" ); - saveTrig3 = getent( "third_return_save" , "targetname" ); - - totalTime = level.stopwatch * 60 * 1000; - startTime = gettime(); - - saveTrig1 waittill ( "trigger" ); - timeSpent = ( gettime() - startTime ) / 1000; - maxTimeAllowed = 90; - thread autosaves_safety( timeSpent, maxTimeAllowed ); - - saveTrig2 waittill ( "trigger" ); - timeSpent = ( gettime() - startTime ) / 1000; - maxTimeAllowed = 120; - thread autosaves_safety( timeSpent, maxTimeAllowed ); - - saveTrig3 waittill ( "trigger" ); - timeSpent = ( gettime() - startTime ) / 1000; - //maxTimeAllowed = 160; - maxTimeAllowed = 180; - noExceptions = true; - thread autosaves_safety( timeSpent, maxTimeAllowed, noExceptions ); -} - -autosaves_safety( timeSpent, maxTimeAllowed, noExceptions ) -{ - if( !isdefined( noExceptions ) ) - noExceptions = false; - - if( timeSpent <= maxTimeAllowed ) - { - //autosave_by_name( "return_trip_section" ); - autosave_or_timeout( "return_trip_section", 10 ); - - if( noExceptions ) - wait 3; - else - wait 10; - - flag_clear( "can_save" ); - wait 2; - flag_set( "can_save" ); - } -} - -objective_stopwatch() -{ - flag_wait( "objective_get_to_lz" ); - level notify ( "start stopwatch" ); - - //fMissionLength = level.stopwatch; //how long until relieved (minutes) - //iMissionTime_ms = gettime() + int(fMissionLength*60*1000); //convert to milliseconds - - // Setup the HUD display of the timer. - level.hudelem = maps\_hud_util::get_countdown_hud(); - - level.hudelem SetPulseFX( 30, 900000, 700 );//something, decay start, decay duration - countdown = 20 * 60; - if ( isdefined( level.stopwatch ) ) - countdown = level.stopwatch * 60; - - level.hudelem.label = &"VILLAGE_DEFEND_HELICOPTER_EXTRACTION";// + minutes + ":" + seconds - level.hudelem settenthstimer( countdown ); - - - wait(level.stopwatch*60); - - //if( isdefined( level.timer ) ) - //level.timer destroy(); - - if( isdefined( level.hudelem ) ) - level.hudelem destroy(); -} - -countdown_speech( alias ) -{ - assertEX( isdefined( alias ), "Specify a speech sound." ); - - level endon ( "player_made_it" ); - - radio_dialogue_queue( alias ); -} - - -countdown_events() -{ - flag_wait( "objective_get_to_lz" ); - - level endon ( "player_made_it" ); - - missionTime = level.stopwatch * 60; - - if ( getdvar( "village_defend_one_minute") != "1" ) - { - wait 60; - - if( !flag( "reached_evac_point" ) && !flag( "lz_reached" ) ) - { - //Bravo Six, be advised we are almost there but we're low on fuel. You guys have three minutes before we have to leave without you, over. - thread countdown_speech( "almosttherethree" ); - } - - if( !flag( "lz_reached" ) ) - { - //GAZ: "We're gonna get left behind! We've got to get to the landing zone!" - thread countdown_speech( "gettolandingzone" ); - } - - wait 60; - - //You got two minutes, over! *MISSING* - thread countdown_speech( "twominutesleft" ); - - if( !flag( "lz_reached" ) ) - { - //PRICE: Copy that, we're on our way! - thread countdown_speech( "copywereonourway" ); - - //PRICE: "We've got to break through their lines to reach the LZ! Keep pushing downhill!" - thread countdown_speech( "breakthroughtolz" ); - - //GAZ: Let's go! Let's go! Get down the hill!! - thread countdown_speech( "getdownthehill" ); - } - - wait 30; - - //"Ninety seconds to dustoff." - thread countdown_speech( "ninetysecondsleft" ); - - flag_set( "rescue_chopper_ingress" ); - - wait 30; - } - - //"One minute to bingo fuel." - thread countdown_speech( "oneminutebingo" ); - - if( !flag( "lz_reached" ) ) - { - //PRICE: "Get to the bottom of the hill!!! Move move!!!" - thread countdown_speech( "bottomofthehill" ); - } - - wait 30; - - //"Thirty seconds." - thread countdown_speech( "thirtyseconds" ); - - if( !flag( "lz_reached" ) ) - { - //GAZ: Get to the LZ! Go! Go! - thread countdown_speech( "gettothelzgogo" ); - } - - wait 30; - - if( !flag( "player_made_it" ) ) - { - flag_set( "seaknight_guards_boarding" ); - flag_wait( "seaknight_unboardable" ); - - wait 3; - - if( !flag( "player_made_it" ) && isalive( level.player ) ) - { - setDvar( "ui_deadquote", &"VILLAGE_DEFEND_YOU_DIDNT_REACH_THE_HELICOPTER" ); - maps\_utility::missionFailedWrapper(); - } - } -} - -early_chopper() -{ - trig = getent( "early_chopper", "targetname" ); - trig waittill ( "trigger" ); - - flag_set( "rescue_chopper_ingress" ); -} - -escape_music() -{ - level endon ( "open_bay_doors" ); - - MusicPlayWrapper( "village_defend_fallback" ); - wait 94; - musicStop( 6 ); - wait 6.1; - - MusicPlayWrapper( "village_defend_direstraits" ); - wait 83; - musicStop( 6 ); - wait 6.1; - - MusicPlayWrapper( "village_defend_fallback" ); - wait 94; - musicStop( 6 ); - wait 6.1; - - MusicPlayWrapper( "village_defend_direstraits" ); - wait 83; - musicStop( 6 ); - wait 6.1; -} - -seaknight_music() -{ - flag_wait( "open_bay_doors" ); - - musicStop( 3 ); - wait 3.1; - - MusicPlayWrapper( "village_defend_escape" ); -} - -rescue_chopper() -{ - if ( getdvar( "village_defend_one_minute") != "1" ) - flag_wait( "rescue_chopper_ingress" ); - - thread seaknight(); - - flag_wait( "seaknight_can_be_boarded" ); - - trigger = spawn( "script_origin", (0,0,0) ); - trigger.origin = level.seaknight1 gettagorigin( "tag_door_rear" ); - trigger.radius = 27.731134; - - for( ;; ) - { - wait 0.05; - - if ( distance( level.player.origin, trigger.origin ) >= trigger.radius ) - continue; - else - break; - } - - if( !flag( "seaknight_unboardable" ) ) - { - flag_set( "player_made_it" ); - - rescue_ride(); - - thread rescue_teleport_friendlies(); - thread rescue_failsafe(); - - if( isdefined( level.hudelem ) ) - level.hudelem destroy(); - - flag_wait( "outtahere" ); - - wait 2; - - //"Baseplate this is Gryphon Two-Seven. We got 'em and we're comin' home. Out." - radio_dialogue_queue( "cominhome" ); - - wait 1; - - nextmission(); - } - else - { - sniperSoundSource = getent( "intro_tank_tower_target", "targetname" ); - sniperSoundSource playsound( level.sniperfx ); - wait 0.1; - level.player doDamage( level.player.health + 10000, level.player.origin ); - } -} - -rescue_teleport_friendlies() -{ - wait 2; - - priceDist = length( level.price.origin - level.player.origin ); - priceCopy = getent( "price_seaknight_doppel", "targetname" ); - - gazDist = length( level.gaz.origin - level.player.origin ); - gazCopy = getent( "gaz_seaknight_doppel", "targetname" ); - - redshirtDist = length( level.redshirt.origin - level.player.origin ); - redshirtCopy = getent( "redshirt_seaknight_doppel", "targetname" ); - - gunnerDist = length( level.sasgunner.origin - level.player.origin ); - gunnerCopy = getent( "sasGunner_seaknight_doppel", "targetname" ); - - allowedDist = 1800; - - if( priceDist > allowedDist ) - { - level.price stop_magic_bullet_shield(); - level.price delete(); - priceCopy thread rescue_doppel_spawn(); - } - - if( gazDist > allowedDist ) - { - level.gaz stop_magic_bullet_shield(); - level.gaz delete(); - gazCopy thread rescue_doppel_spawn(); - } - - if( redshirtDist > allowedDist ) - { - level.redshirt stop_magic_bullet_shield(); - level.redshirt delete(); - redshirtCopy thread rescue_doppel_spawn(); - } - - if( gunnerDist > allowedDist ) - { - level.sasgunner stop_magic_bullet_shield(); - level.sasgunner delete(); - gunnerCopy thread rescue_doppel_spawn(); - } -} - -rescue_doppel_spawn() -{ - guy = self stalingradSpawn(); - if( spawn_failed( guy ) ) - { - return; - } - - guy thread hero(); - guy.fixedNode = false; - - guy thread seaknight_sas_load(); -} - -rescue_failsafe() -{ - //if the friendlies don't board the helicopter for any reason, failsafe - - wait 45; - - nextmission(); -} - -rescue_ride() -{ - level.player disableweapons(); - - // this is the model the player will attach to for the pullout sequence - ePlayerview = spawn_anim_model( "player_carry" ); - ePlayerview hide(); - - // put the ePlayerview in the first frame so the tags are in the right place - //level.seaknight1 anim_first_frame_solo( ePlayerview, "wounded_seaknight_putdown", "tag_detach" ); - level.seaknight1 anim_first_frame_solo( ePlayerview, "village_player_getin", "tag_detach" ); - - ePlayerview linkto( level.seaknight1, "tag_detach" ); - - // this smoothly hooks the player up to the animating tag - ePlayerview lerp_player_view_to_tag( "tag_player", 0.5, 0.9, 35, 35, 45, 0 ); - - guys_animating = []; - guys_animating[ guys_animating.size ] = ePlayerview; - - level.seaknight1 anim_single( guys_animating, "village_player_getin", "tag_detach" ); - - /* -- -- -- -- -- -- -- -- -- -- -- - - LINK PLAYER TO CURRENT POS TO SEE LANDSCAPE - -- -- -- -- -- -- -- -- -- -- -- -- -*/ - level.player enableweapons(); - // < viewpercentag fraction> , , , , ) - level.player playerlinktodelta( ePlayerview, "tag_player", 1, 20, 45, 5, 25 ); -} - -music() -{ - //flag_wait( "church_tower_explodes" ); - - level endon ( "stop_ambush_music" ); - - if ( getdvar( "start" ) != "final_battle" && getdvar( "start" ) != "seaknight" ) - { - while( !flag( "stop_ambush_music" ) ) - { - //MusicPlayWrapper( "village_defend_ambush_music" ); - MusicPlayWrapper( "village_defend_vanguards" ); - wait 85.2; - musicStop( 0.1 ); - wait 0.15; - } - } -} - -mandown_reverse_spawn() -{ - trig = getent( "back_spawning_activator", "script_noteworthy" ); - trig waittill ( "trigger" ); - - flag_set( "back_spawn_stoppable" ); -} - -//Datatables and Utilities - -killzone_detonation( squibs, attacker ) -{ - n = 0; - - for( i = 0 ; i < squibs.size; i++ ) - { - squib = squibs[ i ]; - vfx = level.killZoneFxProgram[ n ]; - soundfx = level.killZoneSfx[ n ]; - - playfx( vfx, squib.origin ); - squib playsound( soundfx ); - earthquake( 0.1, 0.5, level.player.origin, 1250 ); - - if( !isdefined( attacker ) ) - radiusDamage(squib.origin, 240, 100500, 100500); //radiusDamage(origin, range, maxdamage, mindamage); - else - radiusDamage(squib.origin, 240, 100500, 100500, attacker); //radiusDamage(origin, range, maxdamage, mindamage); - - n++; - if( n >= level.killZoneFxProgram.size ) - { - n = 0; - } - - wait randomfloatrange( 0.05 , 0.15 ); - } -} - -killzoneFxProgram() -{ - level.killZoneFxProgram = []; - - level.killZoneFxProgram[ 0 ] = level.killzoneBigExplosion_fx; - level.killZoneFxProgram[ 1 ] = level.killzoneMudExplosion_fx; - level.killZoneFxProgram[ 2 ] = level.killzoneBigExplosion_fx; - level.killZoneFxProgram[ 3 ] = level.killzoneFuelExplosion_fx; - level.killZoneFxProgram[ 4 ] = level.killzoneDirtExplosion_fx; - level.killZoneFxProgram[ 5 ] = level.killzoneMudExplosion_fx; - level.killZoneFxProgram[ 6 ] = level.killzoneBigExplosion_fx; - level.killZoneFxProgram[ 7 ] = level.killzoneFuelExplosion_fx; - level.killZoneFxProgram[ 8 ] = level.killzoneDirtExplosion_fx; - level.killZoneFxProgram[ 9 ] = level.killzoneBigExplosion_fx; - - level.killZoneSfx = []; - - level.killZoneSfx[ 0 ] = "explo_mine"; - level.killZoneSfx[ 1 ] = "explo_tree"; - level.killZoneSfx[ 2 ] = "explo_mine"; - level.killZoneSfx[ 3 ] = "explo_rock"; - level.killZoneSfx[ 4 ] = "explo_roadblock"; - level.killZoneSfx[ 5 ] = "explo_tree"; - level.killZoneSfx[ 6 ] = "explo_mine"; - level.killZoneSfx[ 7 ] = "explo_rock"; - level.killZoneSfx[ 8 ] = "explo_roadblock"; - level.killZoneSfx[ 9 ] = "explo_mine"; - - assertEX( level.killZoneFxProgram.size == level.killZoneSfx.size, "Fx and Sfx programs should have equal number of entries." ); -} - -followScriptedPath( node, delayTime, stance ) -{ - if( !isdefined( delayTime ) ) - delayTime = 0; - - wait delayTime; - - nodes = []; - - while( 1 ) - { - nodes[ nodes.size ] = node; - - if( isdefined( node.target ) ) - { - node = getnode( node.target, "targetname" ); - } - else - { - break; - } - } - - self.disableArrivals = true; - - for( i = 0; i < nodes.size; i++ ) - { - node = nodes[ i ]; - self setgoalnode( node ); - - if( isdefined( node.radius ) ) - self.goalradius = node.radius; - - if( isdefined( node.script_stance ) ) - self allowedstances( node.script_stance ); - - self waittill( "goal" ); - if( !isdefined( node.target ) ) - self notify ("reached_last_node_in_chain"); - if( !isdefined( node.script_noteworthy ) ) - continue; - //if( node.script_noteworthy == "tower_reaction" ) - //continue; - //iprintln( "Team reacts to bell tower explosion!" ); - //TEMP ANIM OF REACTION TO BELL TOWER EXPLOSION - - wait 0.1; - } - - self.disableArrivals = false; -} - -friendly_setup() -{ - aAllies = getaiarray( "allies" ); - for( i = 0; i < aAllies.size; i++ ) - { - aAllies[ i ] thread hero(); - aAllies[ i ].grenadeammo = 0; - } - - flag_wait( "objective_price_orders_minigun" ); - - aAllies = getaiarray( "allies" ); - for( i = 0; i < aAllies.size; i++ ) - { - aAllies[ i ].grenadeammo = 5; - } -} - -hero() -{ - self thread magic_bullet_shield(); - self pushPlayer( true ); - self.IgnoreRandomBulletDamage = true; - self.ignoresuppression = true; -} - -//self set_run_anim( "path_slow" ); -//self clear_run_anim(); - -encroach_start( node, groupname, msg, squadname, deathmonitorname ) -{ - //node - ent - starting main node for enemy infantry attack run - //groupname - str - targetname of enemy spawners; - //msg - str - endon - //squadname - str - script_noteworthy of enemy spawners' starting area on spawner; - - level endon ( msg ); - - aGroup = []; - aSquad = []; - guy = undefined; - - aGroup = getentarray( groupname, "targetname" ); - for( i = 0; i < aGroup.size; i++ ) - { - if( isdefined( aGroup[ i ].script_noteworthy ) ) - { - if( aGroup[ i ].script_noteworthy == squadname ) - { - aSquad[ aSquad.size ] = aGroup[ i ]; - } - } - } - - for( i = 0; i < aSquad.size; i++ ) - { - aSquad[ i ].count = 1; - guy = aSquad[ i ] stalingradSpawn(); - if( spawn_failed( guy ) ) - { - return; - } - - if( flag( "no_more_grenades" ) ) - self.grenadeammo = 0; - - guy thread encroach_nav( node, msg ); - - minigun = getent( "minigun", "targetname" ); - minigunUser = minigun getTurretOwner(); - /* - if((isdefined(minigunUser) && level.player == minigunUser)) - { - guy.baseAccuracy = 5; - } - */ - - if( isdefined( deathmonitorname ) ) - { - if( deathmonitorname == "southern_hill" ) - guy thread southern_hill_deathmonitor(); - } - - if( isdefined( deathmonitorname ) ) - { - if( deathmonitorname == "minigun_breach" ) - guy thread minigun_breach_deathmonitor(); - } - } -} - -encroach_nav( node, msg ) -{ - level endon ( msg ); - self endon ( "death" ); - - if( !flag( "objective_minigun_baglimit_done" ) ) - { - aRoutes = []; - startNode = node; - n = undefined; - while( 1 ) - { - aRoutes[ aRoutes.size ] = startNode; - if( isdefined( startNode.target ) ) - { - aBranchNodes = getnodearray( startNode.target, "targetname" ); - assertEX( aBranchNodes.size > 0, "At least one node should be targeted for encroach_nav routes" ); - - n = randomint( aBranchNodes.size ); - startNode = aBranchNodes[ n ]; - } - else - { - break; - } - } - - for( i = 0; i < aRoutes.size; i++ ) - { - self setgoalnode( aRoutes[ i ] ); - self waittill ( "goal" ); - wait randomfloatrange( level.encroachMinWait, level.encroachMaxWait ); - } - - //flag_wait( "objective_minigun_baglimit_done" ); - flag_wait( "divert_for_clacker" ); - } - - if( flag( "fall_back_to_barn" ) ) - flag_wait( "storm_the_tavern" ); - - self thread hunt_player(); - self thread helidrop_clacker_divert(); -} - -southern_hill_mortar_detonate( squib ) -{ - //squib = origin ent - //inFX = incoming sound - //detFX = explosion sound - - vfx = level.killzoneBigExplosion_fx; - inFX = "artillery_incoming"; - detFX = []; - detFX[ 0 ] = "explo_mine"; - detFX[ 1 ] = "explo_rock"; - detFX[ 2 ] = "explo_tree"; - - squib playsound( inFX ); - wait 0.25; - - playfx( vfx, squib.origin ); - - j = randomintrange( 0, detFX.size ); - detSound = detFX[ j ]; - squib playsound( detSound ); - earthquake( 0.35, 0.5, level.player.origin, 1250 ); - radiusDamage(squib.origin, 256, 1000, 500); //radiusDamage(origin, range, maxdamage, mindamage); -} - -//======================================================================= - -begin_delaying_action() -{ - flag_wait( "arm_delaying_action" ); - - if ( level.gameSkill == 0 ) - { - //level.detectionCycleTime = 120; - level.detectionCycleTime = 60; - } - - if ( level.gameSkill == 1 ) - { - //level.detectionCycleTime = 90; - level.detectionCycleTime = 25; - } - - if ( level.gameSkill == 2 ) - { - //level.detectionCycleTime = 60; - level.detectionCycleTime = 22; - } - - if ( level.gameSkill == 3 ) - { - //level.detectionCycleTime = 50; - level.detectionCycleTime = 19; - } - - trig = getent( "delaying_action_trigger", "targetname" ); - trig waittill ( "trigger" ); - - flag_set( "engage_delaying_action" ); -} - -begin_delaying_action_timeout() -{ - flag_wait( "arm_delaying_action" ); - - wait 180; - flag_set( "engage_delaying_action" ); -} - -//======================================================================= - -player_detection_volume_init() -{ - aVolumes = getentarray( "player_detection_volume", "targetname" ); - - for( i = 0; i < aVolumes.size; i++ ) - { - aSpawnProcs = player_detection_collect( aVolumes[ i ] ); - aProcEntsContainer = player_spawnProc_ents_collect( aVolumes[ i ] ); - thread player_detection_loop( aVolumes[ i ], aSpawnProcs, aProcEntsContainer ); - } -} - -player_detection_collect( detectionVolume ) -{ - aSpawnProcs = getentarray( detectionVolume.target, "targetname" ); - - aProcEnts = []; - - for( i = 0; i < aSpawnProcs.size; i++ ) - { - aProcEnts = getentarray( aSpawnProcs[ i ].target, "targetname" ); - } - - return( aSpawnProcs ); -} - -player_spawnProc_ents_collect( detectionVolume ) -{ - aSpawnProcs = getentarray( detectionVolume.target, "targetname" ); - - aProcEntsContainer = []; - - for( i = 0; i < aSpawnProcs.size; i++ ) - { - aProcEnts = getentarray( aSpawnProcs[ i ].target, "targetname" ); - aProcEntsContainer[ aProcEntsContainer.size ] = aProcEnts; - } - - return( aProcEntsContainer ); -} - -player_detection_loop( detectionVolume, aSpawnProcs, aProcEntsContainer ) -{ - level endon ( "engage_delaying_action" ); - - flag_wait( "fall_back_to_barn" ); - - while( 1 ) - { - //Check AI population capacity before spawning - - aAxis = getaiarray( "axis" ); - aAllies = getaiarray( "allies" ); - - //Some overspawning is ok but not too much - - aiPop = aAxis.size + aAllies.size; - slotsAvailable = level.maxAI - aiPop; - - //Detect player position using isTouching volume - - if( slotsAvailable >= level.reqSlots ) - { - if( level.player isTouching( detectionVolume ) ) - { - thread ai_spawnprocessor( detectionVolume, aSpawnProcs, aProcEntsContainer ); - - if( flag( "objective_all_tanks_destroyed" ) ) - level.delayingActionEnemyWaves++; - - if( level.delayingActionEnemyWaves >= level.enemyWavesAllowed ) - flag_set( "engage_delaying_action" ); - } - - wait level.detectionCycleTime; - } - - wait 0.5; - } -} - -ai_spawnprocessor( detectionVolume, aSpawnProcs, aProcEntsContainer ) -{ - //Activate the spawn processors for this detection volume - - for( i = 0; i < aSpawnProcs.size; i++ ) - { - thread ai_spawn_control_set_create( aSpawnProcs[ i ], detectionVolume, aProcEntsContainer[ i ] ); - } -} - -ai_spawn_control_set_create( spawnProc, detectionVolume, procEntsContainer ) -{ - //Get the spawners for this unit - - aProcSpawners = []; - - for( i = 0; i < level.aSpawners.size; i++ ) - { - spawner = level.aSpawners[ i ]; - - if( !isdefined( spawner.targetname ) ) - continue; - - if( spawner.targetname == spawnProc.target ) - { - aProcSpawners[ aProcSpawners.size ] = spawner; - } - } - - //Check for smokescreen usage on this unit and get the smoke generator if it exists - - smokeEnt = undefined; - aProcEnts = []; - aProcEnts = procEntsContainer; - - for( i = 0; i < aProcEnts.size; i++ ) - { - procEnt = aProcEnts[ i ]; - - if( !isdefined( procEnt.script_noteworthy ) ) - { - continue; - } - - if( procEnt.script_noteworthy == "smoke_generator" ) - { - smokeEnt = procEnt; - break; - } - } - - //Get the flank routing node for this unit - - routeNode = undefined; - assertEX( isdefined( spawnProc.script_namenumber ), "Spawn processor is missing a routing label e.g. AR15" ); - routeID = spawnProc.script_namenumber; - - for( i = 0; i < level.aRouteNodes.size; i++ ) - { - routeStartNode = level.aRouteNodes[ i ]; - - if( !isdefined( routeStartNode.script_noteworthy ) ) - continue; - - if( routeStartNode.script_noteworthy == routeID ) - { - routeNode = routeStartNode; - break; - } - } - - thread ai_spawn_and_attack( aProcSpawners, smokeEnt, routeNode, detectionVolume ); -} - -ai_spawn_and_attack( spawners, smokeEnt, routeNode, detectionVolume ) -{ - //If smoke is being deployed to cover the spawn: - //1. Wait X seconds for the smoke to build to sufficient opacity and size - //2. Confirm that the player is far enough from the smoke cloud origin - //3. Spawn and attack along assigned routes and run the reacquisition monitor - - if( isdefined( smokeEnt ) ) - { - playfx( level.smokegrenade, smokeEnt.origin ); - wait level.smokeBuildTime; - - dist = length( level.player.origin - smokeEnt.origin ); - if( dist < level.smokeSpawnSafeDist ) - { - return; - } - } - - //If smoke is not being used to cover the spawn: - //1. Spawn and attack along assigned routes and run the reacquisition monitor - - //Spawners become finite during the return trip - - for( i = 0; i < spawners.size; i++ ) - { - spawner = spawners[ i ]; - - /* - if( flag( "return_trip_begins" )) - { - if( !isdefined( spawner[ i ].script_namenumber ) ) - { - if( level.gameSkill == 0 ) - { - spawner[ i ].count = 3; - self.baseAccuracy = 0.3; - } - else - if( level.gameSkill == 1 ) - { - spawner[ i ].count = 4; - self.baseAccuracy = 0.5; - } - else - if( level.gameSkill == 2 ) - { - spawner[ i ].count = 5; - } - else - if( level.gameSkill == 3 ) - { - spawner[ i ].count = 6; - } - } - - spawner[ i ].script_namenumber = true; - } - else - { - spawners[ i ].count = 1; - } - */ - - spawners[ i ].count = 1; - - totalPop = aiPopCount(); - - if( totalPop < 32 ) - { - guy = spawner stalingradSpawn(); - if( spawn_failed( guy ) ) - { - continue; - } - - if( flag( "no_more_grenades" ) ) - self.grenadeammo = 0; - - guy thread ai_flank_route( routeNode ); - guy thread ai_reacquire_player( detectionVolume ); - } - } -} - -ai_flank_route( routeNode ) -{ - self endon ( "death" ); - self endon ( "reacquire_player" ); - - while( 1 ) - { - self setgoalnode( routeNode ); - - if( isdefined( routeNode.radius ) ) - self.goalradius = routeNode.radius; - - self waittill ( "goal" ); - - if( isdefined( routeNode.script_node_pausetime ) ) - { - pauseTime = routeNode.script_node_pausetime + randomfloatrange( 0.5, 1.5 ); - - wait( pauseTime ); - } - - if( !isdefined( routeNode.target ) ) - { - if( flag( "fall_back_to_barn" ) ) - flag_wait( "storm_the_tavern" ); - - self thread hunt_player(); - break; - } - - routeNode = getnode( routeNode.target, "targetname" ); - } -} - -ai_reacquire_player( detectionVolume ) -{ - //If player leaves the original detection volume substantially, the - //1. Check to see that the player is still touching the volume. - //2. Wait a bit, then resample to see if the player is still touching the volume. - //3. If not, send the guy after the player using hunt_player. - - self endon ( "death" ); - - while( 1 ) - { - if( !level.player isTouching ( detectionVolume ) ) - { - wait level.volumeDesertionTime; - - if( !level.player isTouching ( detectionVolume ) ) - { - self notify ( "reacquire_player" ); - wait 0.5; - - if( flag( "fall_back_to_barn" ) ) - flag_wait( "storm_the_tavern" ); - - self thread hunt_player(); - break; - } - } - - wait level.detectionRefreshTime; - } -} - -return_trip_enemy_acc_prep() -{ - aFloods = getentarray( "flood_spawner" , "targetname" ); - aSpawners = []; - - for( i = 0 ; i < aFloods.size; i++ ) - { - aSpawners = getentarray( aFloods[ i ].target, "targetname" ); - array_thread( aSpawners, ::add_spawn_function, ::return_trip_enemy_acc ); - - aSpawners = undefined; - aSpawners = []; - } -} - -return_trip_enemy_acc() -{ - flag_wait( "start_final_battle" ); - - self.baseAccuracy = level.village_diff[ level.gameskill ]; -} - -//======================================================================= - -add_hint_background( double_line ) -{ - if ( isdefined ( double_line ) ) - level.hintbackground = createIcon( "popmenu_bg", 650, 50 ); - else - level.hintbackground = createIcon( "popmenu_bg", 650, 30 ); - - level.hintbackground setPoint( "TOP", undefined, 0, 125 ); - level.hintbackground.alpha = .5; -} - -airstrike_hint_console() -{ - add_hint_background(); - - //Airstrikes standing by. - level.hintElem = createFontString( "objective", level.hint_text_size ); - level.hintElem setPoint( "TOP", undefined, 0, 130 ); - //level.hintElem.label = &"VILLAGE_DEFEND_CASREADY"; - level.hintElem setText( &"VILLAGE_DEFEND_CLOSE_AIR_SUPPORT_STANDING" ); - - level.iconElem = createIcon( "hud_dpad", 32, 32 ); - level.iconElem setPoint( "TOP", undefined, -16, 165 ); - - level.iconElem2 = createIcon( "compass_objpoint_airstrike", 32, 32 ); - level.iconElem2 setPoint( "TOP", undefined, -15, 196 ); - - level.iconElem3 = createIcon( "hud_arrow_down", 24, 24 ); - level.iconElem3 setPoint( "TOP", undefined, -15.5, 170 ); - level.iconElem3.sort = 1; - level.iconElem3.color = (1,1,0); - level.iconElem3.alpha = .7; - - wait 4; - - level.iconElem setPoint( "CENTER", "BOTTOM", -320, -20, 1.0 ); - level.iconElem2 setPoint( "CENTER", "BOTTOM", -320, -20, 1.0 ); - level.iconElem3 setPoint( "CENTER", "BOTTOM", -320, -20, 1.0 ); - - level.iconElem scaleovertime(1, 20, 20); - level.iconElem2 scaleovertime(1, 20, 20); - level.iconElem3 scaleovertime(1, 20, 20); - - wait .70; - - level.hintElem fadeovertime(.15); - level.hintElem.alpha = 0; - - level.iconElem fadeovertime(.15); - level.iconElem.alpha = 0; - - level.iconElem2 fadeovertime(.15); - level.iconElem2.alpha = 0; - - level.iconElem3 fadeovertime(.15); - level.iconElem3.alpha = 0; - - clear_hints(); -} - -airstrike_hint_pc() -{ - add_hint_background(); - - //Airstrikes standing by. - level.hintElem = createFontString( "objective", level.hint_text_size ); - level.hintElem setPoint( "TOP", undefined, 0, 130 ); - //level.hintElem.label = &"VILLAGE_DEFEND_CASREADY"; - level.hintElem setText( &"VILLAGE_DEFEND_CLOSE_AIR_SUPPORT_STANDING_PC" ); - - level.iconElem2 = createIcon( "compass_objpoint_airstrike", 32, 32 ); - level.iconElem2 setPoint( "TOP", undefined, -15, 196 ); - - wait 4; - - level.iconElem2 setPoint( "CENTER", "BOTTOM", -320, -20, 1.0 ); - - level.iconElem2 scaleovertime(1, 20, 20); - - wait .70; - - level.hintElem fadeovertime(.15); - level.hintElem.alpha = 0; - - level.iconElem2 fadeovertime(.15); - level.iconElem2.alpha = 0; - - 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" ); -} - -airstrike_support() -{ - level.playerPreviousWeapon = undefined; - - for(;;) - { - while( level.player getcurrentweapon() != "airstrike_support" ) - { - level.playerPreviousWeapon = level.player getcurrentweapon(); - wait 0.05; - } - - airstrike_ammo = level.player getWeaponAmmoStock( "airstrike_support" ); - - if( !isdefined( airstrike_ammo ) ) - { - break; - } - else - if( airstrike_ammo == 0 ) - { - break; - } - - thread airstrike_support_activate(); - - while( level.player getcurrentweapon() == "airstrike_support" ) - wait 0.05; - - level notify( "air_support_canceled" ); - thread airstrike_support_deactive(); - } -} - -airstrike_support_activate() -{ - level endon( "air_support_canceled" ); - level endon( "air_support_called" ); - thread airstrike_support_paint_target(); - - // Make the arrow - level.airstrikeAttackArrow = spawn( "script_model", ( 0, 0, 0 ) ); - level.airstrikeAttackArrow setModel( "tag_origin" ); - level.airstrikeAttackArrow.angles = ( -90, 0, 0 ); - level.airstrikeAttackArrow.offset = 4; - - playfxontag( level.air_support_fx_yellow, level.airstrikeAttackArrow, "tag_origin" ); - - level.playerActivatedAirSupport = true; - - coord = undefined; - - traceOffset = 15; - traceLength = 15000; - minValidLength = 300 * 300; - - trace = []; - - trace[ 0 ] = spawnStruct(); - trace[ 0 ].offsetDir = "vertical"; - trace[ 0 ].offsetDist = traceOffset; - - trace[ 1 ] = spawnStruct(); - trace[ 1 ].offsetDir = "vertical"; - trace[ 1 ].offsetDist = traceOffset * -1; - - trace[ 2 ] = spawnStruct(); - trace[ 2 ].offsetDir = "horizontal"; - trace[ 2 ].offsetDist = traceOffset; - - trace[ 3 ] = spawnStruct(); - trace[ 3 ].offsetDir = "horizontal"; - trace[ 3 ].offsetDist = traceOffset * -1; - - for(;;) - { - wait 0.05; - - prof_begin( "spotting_marker" ); - - // Trace to where the player is looking - direction = level.player getPlayerAngles(); - direction_vec = anglesToForward( direction ); - eye = level.player getEye(); - - for ( i = 0 ; i < trace.size ; i++ ) - { - start = eye; - vec = undefined; - if ( trace[ i ].offsetDir == "vertical" ) - vec = anglesToUp( direction ); - else if ( trace[ i ].offsetDir == "horizontal" ) - vec = anglesToRight( direction ); - assert( isdefined( vec ) ); - start = start + vector_multiply( vec, trace[ i ].offsetDist ); - trace[ i ].trace = bullettrace( start, start + vector_multiply( direction_vec , traceLength ), 0, undefined ); - trace[ i ].length = distanceSquared( start, trace[ i ].trace[ "position" ] ); - - if ( getdvar( "village_defend_debug_marker") == "1" ) - thread draw_line_for_time( start, trace[ i ].trace[ "position" ], 1, 1, 1, 0.05 ); - } - - validLocations = []; - validNormals = []; - for ( i = 0 ; i < trace.size ; i++ ) - { - if ( trace[ i ].length < minValidLength ) - continue; - index = validLocations.size; - validLocations[ index ] = trace[ i ].trace[ "position" ]; - validNormals[ index ] = trace[ i ].trace[ "normal" ]; - - if ( getdvar( "village_defend_debug_marker") == "1" ) - thread draw_line_for_time( level.player getEye(), validLocations[ index ], 0, 1, 0, 0.05 ); - } - - // if all points are too close just use all of them since none are good - if ( validLocations.size == 0 ) - { - for ( i = 0 ; i < trace.size ; i++ ) - { - validLocations[ i ] = trace[ i ].trace[ "position" ]; - validNormals[ i ] = trace[ i ].trace[ "normal" ]; - } - } - - assert( validLocations.size > 0 ); - - if ( validLocations.size == 4 ) - { - fxLocation = findAveragePointVec( validLocations[ 0 ], validLocations[ 1 ], validLocations[ 2 ], validLocations[ 3 ] ); - fxNormal = findAveragePointVec( validNormals[ 0 ], validNormals[ 1 ], validNormals[ 2 ], validNormals[ 3 ] ); - } - else if ( validLocations.size == 3 ) - { - fxLocation = findAveragePointVec( validLocations[ 0 ], validLocations[ 1 ], validLocations[ 2 ] ); - fxNormal = findAveragePointVec( validNormals[ 0 ], validNormals[ 1 ], validNormals[ 2 ] ); - } - else if ( validLocations.size == 2 ) - { - fxLocation = findAveragePointVec( validLocations[ 0 ], validLocations[ 1 ] ); - fxNormal = findAveragePointVec( validNormals[ 0 ], validNormals[ 1 ] ); - } - else - { - fxLocation = validLocations[ 0 ]; - fxNormal = validNormals[ 0 ]; - } - - if ( getdvar( "village_defend_debug_marker") == "1" ) - thread draw_line_for_time( level.player getEye(), fxLocation, 1, 0, 0, 0.05 ); - - // Draw the arrow and circle around the arrow - thread drawAirstrikeAttackArrow( fxLocation, fxNormal ); - - prof_end( "spotting_marker" ); - } -} - -findAveragePointVec( point1, point2, point3, point4 ) -{ - assert( isdefined( point1 ) ); - assert( isdefined( point2 ) ); - - if ( isdefined( point4 ) ) - { - x = findAveragePoint( point1[ 0 ], point2[ 0 ], point3[ 0 ], point4[ 0 ] ); - y = findAveragePoint( point1[ 1 ], point2[ 1 ], point3[ 1 ], point4[ 1 ] ); - z = findAveragePoint( point1[ 2 ], point2[ 2 ], point3[ 2 ], point4[ 2 ] ); - } - else if ( isdefined( point3 ) ) - { - x = findAveragePoint( point1[ 0 ], point2[ 0 ], point3[ 0 ] ); - y = findAveragePoint( point1[ 1 ], point2[ 1 ], point3[ 1 ] ); - z = findAveragePoint( point1[ 2 ], point2[ 2 ], point3[ 2 ] ); - } - else - { - x = findAveragePoint( point1[ 0 ], point2[ 0 ] ); - y = findAveragePoint( point1[ 1 ], point2[ 1 ] ); - z = findAveragePoint( point1[ 2 ], point2[ 2 ] ); - } - return( x, y, z ); -} - -findAveragePoint( point1, point2, point3, point4 ) -{ - assert( isdefined( point1 ) ); - assert( isdefined( point2 ) ); - - if ( isdefined( point4 ) ) - return ( ( point1 + point2 + point3 + point4 ) / 4 ); - else if ( isdefined( point3 ) ) - return ( ( point1 + point2 + point3 ) / 3 ); - else - return ( ( point1 + point2 ) / 2 ); -} - -drawAirstrikeAttackArrow( coord, normal ) -{ - assert( isdefined( level.airstrikeAttackArrow ) ); - - coord += vector_multiply( normal, level.airstrikeAttackArrow.offset ); - level.airstrikeAttackArrow.origin = coord; - level.airstrikeAttackArrow rotateTo( vectortoangles( normal ), 0.2 ); -} - -airstrike_support_deactive() -{ - wait 0.05; - if ( isdefined( level.airstrikeAttackArrow ) ) - level.airstrikeAttackArrow delete(); -} - -airstrike_support_paint_target() -{ - level endon( "air_support_canceled" ); - level.player waittill ( "weapon_fired" ); - - flag_set( "airstrike_in_progress" ); - - maps\_friendlyfire::TurnOff(); - - level.activeAirstrikes++; - - airstrike_ammo = level.player getWeaponAmmoStock( "airstrike_support" ); - - if( !isdefined( airstrike_ammo ) ) - { - level notify ( "no_airstrike_ammo" ); - } - else - if( airstrike_ammo == 0 ) - { - level notify ( "no_airstrike_ammo" ); - } - - thread airstrike_support_mark(); - - // give player his weapon back - - weaponList = level.player GetWeaponsListPrimaries(); - - if ( isdefined( weaponList[ 0 ] ) && ( weaponList[ 0 ] == level.playerPreviousWeapon ) ) - { - level.player switchToWeapon( weaponList[ 0 ] ); - } - else - if ( isdefined( weaponList[ 1 ] ) && ( weaponList[ 1 ] == level.playerPreviousWeapon ) ) - { - level.player switchToWeapon( weaponList[ 1 ] ); - } - else - { - level.player switchToWeapon( weaponList[ 0 ] ); - } - - coord = level.airstrikeAttackArrow.origin; - - thread airstrike_support_launch( coord ); - - level notify( "air_support_called" ); - airstrike_support_deactive(); - - level.airstrikeSupportCallsRemaining--; - - if ( ( level.airstrikeSupportCallsRemaining % 2 ) == 0 ) - radio_dialogue_queue( "airstrikewarning" ); - else - if ( ( level.airstrikeSupportCallsRemaining % 2 ) != 0 ) - radio_dialogue_queue( "airstrikewarning" ); - else - if ( level.airstrikeSupportCallsRemaining <= 0 ) - radio_dialogue_queue( "airstrikewarning" ); -} - -airstrike_support_launch( coord ) -{ - wait 5; - - thread callStrike( coord ); -} - -airstrike_support_mark() -{ - marker = spawn( "script_model", level.airstrikeAttackArrow.origin ); - marker setModel( "tag_origin" ); - marker.angles = level.airstrikeAttackArrow.angles; - - wait 0.1; - - playfxontag( level.air_support_fx_red, marker, "tag_origin" ); - - wait 5.0; - - marker delete(); -} - -//======================================================================= - -callStrike( coord, flybyOnly, direction ) -{ - // Get starting and ending point for the plane - - if( !isdefined( direction ) ) - { - //direction = ( 0, randomint( 360 ), 0 ); - - //get vector between player's current position and the target coordinates and pick a good flight path start point - //so that the planes don't cluster bomb the player, which is annoying - - vec = coord - level.player.origin; - angles = vectortoangles( vec ); - yaw = angles[ 1 ]; - - spread = 75; - - for ( ;; ) - { - direction = ( 0, randomint( 360 ), 0 ); - absyawdiff = animscripts\utility::AbsAngleClamp180( yaw - direction[ 1 ] ); - if ( absyawdiff < 180 - spread ) - break; - if ( absyawdiff > 180 + spread ) - break; - wait 0.05; - } - } - - planeHalfDistance = 24000; - planeBombExplodeDistance = 200; //1500 - - if( level.lowplaneflyby < 3 ) - { - planeFlyHeight = 850; - level.lowplaneflyby++; - } - else - { - planeFlyHeight = 1850; //850 original - } - - planeFlySpeed = 6000; //7000 - - startPoint = coord + vector_scale( anglestoforward( direction ), -1 * planeHalfDistance ); - startPoint += ( 0, 0, planeFlyHeight ); - - endPoint = coord + vector_scale( anglestoforward( direction ), planeHalfDistance ); - endPoint += ( 0, 0, planeFlyHeight ); - - // Make the plane fly by - d = length( startPoint - endPoint ); - flyTime = ( d / planeFlySpeed ); - - // bomb explodes planeBombExplodeDistance after the plane passes the center - d = abs( d/2 + planeBombExplodeDistance ); - bombTime = ( d / planeFlySpeed ); - - assert( flyTime > bombTime ); - - if( isdefined( flybyOnly ) ) - { - level thread doPlaneStrike( coord, startPoint+(0,0,randomInt(500)), endPoint+(0,0,randomInt(500)), bombTime, flyTime, direction, flybyOnly ); - return; - } - - level thread doPlaneStrike( coord, startPoint+(0,0,randomInt(500)), endPoint+(0,0,randomInt(500)), bombTime, flyTime, direction ); - wait randomfloatrange( 1.5, 2.5 ); - level thread doPlaneStrike( coord, startPoint+(0,0,randomInt(200)), endPoint+(0,0,randomInt(200)), bombTime, flyTime, direction ); - wait randomfloatrange( .3, 1 ); - level thread doPlaneStrike( coord, startPoint+(0,0,randomInt(200)), endPoint+(0,0,randomInt(200)), bombTime, flyTime, direction ); - wait randomfloatrange( 1.5, 2.5 ); - level thread doPlaneStrike( coord, startPoint+(0,0,randomInt(200)), endPoint+(0,0,randomInt(200)), bombTime, flyTime, direction ); - - thread airstrike_completion_check(); -} - -airstrike_completion_check() -{ - wait 27; - level.activeAirstrikes--; - - if( !level.activeAirstrikes ) - { - flag_clear( "airstrike_in_progress" ); - maps\_friendlyfire::TurnBackOn(); - } -} - -vector_scale(vec, scale) -{ - vec = (vec[0] * scale, vec[1] * scale, vec[2] * scale); - return vec; -} - -doPlaneStrike( bombsite, startPoint, endPoint, bombTime, flyTime, direction, flybyOnly ) -{ - // plane spawning randomness = up to 125 units, biased towards 0 - // radius of bomb damage is 512 - - startPathRandomness = 100; - endPathRandomness = 150; - - pathStart = startPoint + ( (randomfloat(2) - 1)*startPathRandomness, (randomfloat(2) - 1)*startPathRandomness, 0 ); - pathEnd = endPoint + ( (randomfloat(2) - 1)*endPathRandomness , (randomfloat(2) - 1)*endPathRandomness , 0 ); - - // Spawn the planes - //plane = spawnplane( "script_model", pathStart ); - - plane = spawn( "script_model", pathStart ); - //plane setModel( "vehicle_mig29_desert" ); - plane setModel( "vehicle_av8b_harrier_jet" ); - plane.angles = direction; - - plane thread playContrail(); - - plane moveTo( pathEnd, flyTime, 0, 0 ); - - thread callStrike_planeSound( plane, bombsite ); - - // callStrike_bomb( bomb time, bomb location, number of bombs ) - thread callStrike_bombEffect( plane, bombTime - 1.0, flybyOnly ); - //thread callStrike_bomb( bombTime, bombsite, 2, owner ); - - // Delete the plane after its flyby - wait flyTime; - plane notify( "delete" ); - plane delete(); -} - -playContrail() -{ - self endon ( "death" ); - - if ( !isDefined( level.mapCenter ) ) - mapCenter = (0,0,0); - else - mapCenter = level.mapCenter; - - while ( isdefined( self ) ) - { - if ( distance( self.origin , mapCenter ) <= 4000 ) - { - playfxontag( level.fx_airstrike_contrail, self, "tag_right_wingtip" ); - playfxontag( level.fx_airstrike_contrail, self, "tag_left_wingtip" ); - return; - } - wait 0.05; - } -} - -callStrike_planeSound( plane, bombsite ) -{ - plane thread play_loop_sound_on_entity( "veh_mig29_dist_loop" ); - while( !targetisclose( plane, bombsite ) ) - wait .05; - plane notify ( "stop sound" + "veh_mig29_dist_loop" ); - plane thread play_loop_sound_on_entity( "veh_mig29_close_loop" ); - while( targetisinfront( plane, bombsite ) ) - wait .05; - wait .5; - //plane thread play_sound_in_space( "veh_mig29_sonic_boom" ); - while( targetisclose( plane, bombsite ) ) - wait .05; - plane notify ( "stop sound" + "veh_mig29_close_loop" ); - plane thread play_loop_sound_on_entity( "veh_mig29_dist_loop" ); - plane waittill( "delete" ); - plane notify ( "stop sound" + "veh_mig29_dist_loop" ); -} - -targetisinfront(other, target) -{ - forwardvec = anglestoforward(flat_angle(other.angles)); - normalvec = vectorNormalize(flat_origin(target)-other.origin); - dot = vectordot(forwardvec,normalvec); - if(dot > 0) - return true; - else - return false; -} - -targetisclose(other, target) -{ - infront = targetisinfront(other, target); - if(infront) - dir = 1; - else - dir = -1; - a = flat_origin(other.origin); - b = a+vector_scale(anglestoforward(flat_angle(other.angles)), (dir*100000)); - point = pointOnSegmentNearestToPoint(a,b, target); - dist = distance(a,point); - if (dist < 3000) - return true; - else - return false; -} - -callStrike_bombEffect( plane, launchTime, flybyOnly ) -{ - wait ( launchTime ); - - plane thread play_sound_in_space( "veh_mig29_sonic_boom" ); - - if( !isdefined( flybyOnly ) ) - { - bomb = spawnbomb( plane.origin, plane.angles ); - bomb moveGravity( vector_scale( anglestoforward( plane.angles ), 7000/1.5 ), 3.0 ); - - wait ( 1.0 ); - newBomb = spawn( "script_model", bomb.origin ); - newBomb setModel( "tag_origin" ); - newBomb.origin = bomb.origin; - newBomb.angles = bomb.angles; - wait (0.05); - - bomb delete(); - bomb = newBomb; - - bombOrigin = bomb.origin; - bombAngles = bomb.angles; - playfxontag( level.airstrikefx, bomb, "tag_origin" ); - // bomb hide(); - - //wait ( 0.5 ); - wait 1.6; - repeat = 12; - minAngles = 5; - maxAngles = 55; - angleDiff = (maxAngles - minAngles) / repeat; - - for( i = 0; i < repeat; i++ ) - { - traceDir = anglesToForward( bombAngles + (maxAngles-(angleDiff * i),randomInt( 10 )-5,0) ); - traceEnd = bombOrigin + vector_scale( traceDir, 10000 ); - trace = bulletTrace( bombOrigin, traceEnd, false, undefined ); - - traceHit = trace["position"]; - - radiusDamage( traceHit + (0,0,16), 512, 400, 30, level.airStriker ); // targetpos, radius, maxdamage, mindamage - - if ( i%3 == 0 ) - { - thread playsoundinspace( "clusterbomb_explode_default", traceHit ); - playRumbleOnPosition( "artillery_rumble", traceHit ); - earthquake( 0.7, 0.75, traceHit, 1000 ); - } - - wait ( 0.75/repeat ); - } - wait ( 1.0 ); - bomb delete(); - } -} - -playSoundinSpace (alias, origin, master) -{ - org = spawn ("script_origin",(0,0,1)); - if (!isdefined (origin)) - origin = self.origin; - org.origin = origin; - if (isdefined(master) && master) - org playsoundasmaster (alias); - else - org playsound (alias); - wait ( 10.0 ); - org delete(); -} - -spawnbomb( origin, angles ) -{ - bomb = spawn( "script_model", origin ); - bomb.angles = angles; - bomb setModel( "projectile_cbu97_clusterbomb" ); - - return bomb; -} - -friendly_player_tracking_nav() -{ - self endon ( "death" ); - level endon ( "lz_reached" ); - level endon ( "player_made_it" ); - - self.goalradius = 1400; - self.fixednode = false; - - playerHeliDetector = getent( "player_in_blackhawk_detector", "targetname" ); - heliDefaultNode = getnode( "bait_crashsite", "targetname" ); - - while( 1 ) - { - wait randomfloatrange( 3, 5 ); - - if( level.player isTouching( playerHeliDetector ) ) - { - self setgoalnode( heliDefaultNode ); - } - else - { - self setgoalpos( level.player.origin ); - } - } -} - -aiPopCount() -{ - aAllies = getaiarray( "allies" ); - aAxis = getaiarray( "axis" ); - - totalPop = aAllies.size + aAxis.size; - - return( totalPop ); -} \ No newline at end of file diff --git a/iw3sp_mod_ff_src/raw/maps/village_defend_code.gsc b/iw3sp_mod_ff_src/raw/maps/village_defend_code.gsc deleted file mode 100644 index 5719e3c..0000000 --- a/iw3sp_mod_ff_src/raw/maps/village_defend_code.gsc +++ /dev/null @@ -1,1042 +0,0 @@ -#include common_scripts\utility; -#include maps\_utility; -#include maps\_hud_util; -#include maps\_vehicle; -#include maps\_anim; -#include maps\village_defend; - -minigun_think() -{ - flag_init( "player_on_minigun" ); - self.animname = "minigun"; - self assign_animtree(); - self thread minigun_used(); - - for ( ;; ) - { - for ( ;; ) - { - // wait for the player to get on the turret - if ( isdefined( self getturretowner() ) ) - break; - wait( 0.05 ); - } - - level thread overheat_enable(); - - flag_set( "player_on_minigun" ); - - for ( ;; ) - { - if ( !isdefined( self getturretowner() ) ) - break; - wait( 0.05 ); - } - - flag_clear( "player_on_minigun" ); - level thread overheat_disable(); - self.rumble_ent stoprumble("minigun_rumble"); - } -} - -minigun_const() -{ - level.turret_heat_status = 1; - level.turret_heat_max = 114; - level.turret_cooldownrate = 15; -} - -minigun_rumble() -{ - //push the rumble origin in and out based on the momentum - closedist = 0; - fardist = 750; - - between = fardist-closedist; - - self.rumble_ent = spawn("script_origin",self.origin); - while(1) - { - wait .05; - if( self.momentum <= 0 || !flag("player_on_minigun") ) - { - continue; - } - //org = level.player geteye() + vector_multiply( vectornormalize( anglestoforward( level.player getplayerangles() ) ), fardist - ( between * self.momentum ) ); - self.rumble_ent.origin = level.player geteye()+ (0,0,fardist - ( between * self.momentum )); - self.rumble_ent PlayRumbleOnentity( "minigun_rumble" ); - } -} - -minigun_used() -{ - flag_wait( "player_on_minigun" ); - - //Tweakable values - - if( level.console || getdvarint("gpad_in_use") ) - overheat_time = 6; //full usage to overheat (original 8) - else - overheat_time = 10; - - cooldown_time = 4; //time to cool down from max heat back to 0 if not operated during this time (original 4) - penalty_time = 7; //hold inoperative for this amount of time - rate = 0.02; - slow_rate = 0.02; - overheat_fx_rate = 0.35; - - adsbuttonAccumulate = 0; //check for left trigger hold down duration - - //Not to tweak - - heatrate = 1 / ( overheat_time * 20 ); //increment of the temp gauge for heating up - coolrate = 1 / ( cooldown_time * 20 ); //increment of the temp gauge for cooling down - level.inuse = false; - momentum = 0; - self.momentum = 0; - heat = 0; - max = 1; - maxed = false; - firing = false; - maxed_time = undefined; - overheated = false; - penalized_time = 0; //if greater than gettime - startFiringTime = undefined; - oldheat = 0; - level.frames = 0; - level.normframes = 0; - next_overheat_fx = 0; - thread minigun_rumble(); - for ( ;; ) - { - level.normframes++; - if ( flag( "player_on_minigun" ) ) - { - if ( !level.inuse ) - { - if ( level.Console || getdvarint("gpad_in_use") ) - { - //if ( level.player adsbuttonpressed() || ( level.player attackbuttonpressed() && !overheated ) ) - if ( level.player adsbuttonpressed() ) - { - level.inuse = true; - self thread minigun_sound_spinup(); - } - } - else - if( level.player attackbuttonpressed() ) - { - level.inuse = true; - self thread minigun_sound_spinup(); - } - } - else - { - if ( level.Console || getdvarint("gpad_in_use") ) - { - //if ( !level.player adsbuttonpressed() && !level.player attackbuttonpressed() ) - if ( !level.player adsbuttonpressed() ) - { - level.inuse = false; - self thread minigun_sound_spindown(); - } - else - if( !level.player adsbuttonpressed() && level.player attackbuttonpressed() && overheated ) - { - level.inuse = false; - self thread minigun_sound_spindown(); - } - } - else - if( !level.player attackbuttonpressed() ) - { - level.inuse = false; - self thread minigun_sound_spindown(); - } - else - if( level.player attackbuttonpressed() && overheated ) - { - level.inuse = false; - self thread minigun_sound_spindown(); - } - } - - if( level.Console || getdvarint("gpad_in_use")) - { - if( level.player adsbuttonpressed() ) - { - adsbuttonAccumulate += 0.05; - - if( adsbuttonAccumulate >= 2.75 ) - { - flag_set( "minigun_lesson_learned" ); - } - } - else - { - adsbuttonAccumulate = 0; - } - } - - if ( !firing ) - { - if( level.player attackbuttonpressed() && !overheated && maxed ) - { - firing = true; - startFiringTime = gettime(); - } - else - if ( level.player attackbuttonpressed() && overheated ) - { - firing = false; - startFiringTime = undefined; - } - } - else - { - if( !level.player attackbuttonpressed() ) - { - firing = false; - startFiringTime = undefined; - } - - if( level.player attackbuttonpressed() && !maxed ) - { - firing = false; - startFiringTime = undefined; - } - } - } - else - { - if( firing || level.inuse == true ) - { - self thread minigun_sound_spindown(); - } - - firing = false; - level.inuse = false; - } - - if ( overheated ) - { - if ( !(heat >= max) ) - { - overheated = false; - startFiringTime = undefined; - self TurretFireEnable(); - } - } - - if ( level.inuse ) - { - momentum += rate; - self.momentum = momentum; - } - else - { - momentum -= slow_rate; - self.momentum = momentum; - } - - if ( momentum > max ) - { - momentum = max; - self.momentum = momentum; - } - if ( momentum < 0 ) - { - momentum = 0; - self.momentum = momentum; - self notify ( "done" ); - } - - if ( momentum == max ) - { - maxed = true; - maxed_time = gettime(); - self TurretFireEnable(); - } - else - { - maxed = false; - self TurretFireDisable(); - } - - if ( firing && !overheated ) - { - level.frames++; - heat += heatrate; - } - - if( gettime() > penalized_time && !firing ) - heat -= coolrate; - - if ( heat > max ) - heat = max; - if ( heat < 0 ) - heat = 0; - - level.heat = heat; - - level.turret_heat_status = int( heat * 114 ); - if ( isdefined( level.overheat_status2 ) ) - thread overheat_hud_update(); - - if( (heat >= max) && (heat <= max) && ((oldheat < max) || (oldheat > max)) ) - { - overheated = true; - penalized_time = gettime() + penalty_time * 1000; - next_overheat_fx = 0; - thread overheat_overheated(); - } - oldheat = heat; - - if ( overheated ) - { - self TurretFireDisable(); - firing = false; - //playfxOnTag( getfx( "turret_overheat_haze" ), self, "tag_flash"); - if ( gettime() > next_overheat_fx ) - { - playfxOnTag( getfx( "turret_overheat_smoke" ), self, "tag_flash"); - next_overheat_fx = gettime() + overheat_fx_rate * 1000; - } - } - - self setanim( getanim( "spin" ), 1, 0.2, momentum ); - - wait( 0.05 ); - } -} - -minigun_sound_spinup() -{ - level notify ( "stopMinigunSound" ); - level endon ( "stopMinigunSound" ); - - /* - Minigun_gatling_spinup1 0.6 s - Minigun_gatling_spinup2 0.5 s - Minigun_gatling_spinup3 0.5 s - Minigun_gatling_spinup4 0.5 s - */ - - if ( self.momentum < 0.25 ) - { - self playsound( "minigun_gatling_spinup1" ); - wait 0.6; - self playsound( "minigun_gatling_spinup2" ); - wait 0.5; - self playsound( "minigun_gatling_spinup3" ); - wait 0.5; - self playsound( "minigun_gatling_spinup4" ); - wait 0.5; - } - else - if( self.momentum < 0.5 ) - { - self playsound( "minigun_gatling_spinup2" ); - wait 0.5; - self playsound( "minigun_gatling_spinup3" ); - wait 0.5; - self playsound( "minigun_gatling_spinup4" ); - wait 0.5; - } - else - if( self.momentum < 0.75 ) - { - self playsound( "minigun_gatling_spinup3" ); - wait 0.5; - self playsound( "minigun_gatling_spinup4" ); - wait 0.5; - } - else - if( self.momentum < 1 ) - { - self playsound( "minigun_gatling_spinup4" ); - wait 0.5; - } - - thread minigun_sound_spinloop(); -} - -minigun_sound_spinloop() -{ - //Minigun_gatling_spinloop (loops until canceled) 2.855 s - - level notify ( "stopMinigunSound" ); - level endon ( "stopMinigunSound" ); - - while( 1 ) - { - self playsound( "minigun_gatling_spin" ); - wait 2.5; - } -} - -minigun_sound_spindown() -{ - level notify ( "stopMinigunSound" ); - level endon ( "stopMinigunSound" ); - - /* - Minigun_gatling_spindown4 0.5 s - Minigun_gatling_spindown3 0.5 s - Minigun_gatling_spindown2 0.5 s - Minigun_gatling_spindown1 0.65 s - */ - - if( self.momentum > 0.75 ) - { - self stopsounds(); - self playsound( "minigun_gatling_spindown4" ); - wait 0.5; - self playsound( "minigun_gatling_spindown3" ); - wait 0.5; - self playsound( "minigun_gatling_spindown2" ); - wait 0.5; - self playsound( "minigun_gatling_spindown1" ); - wait 0.65; - } - else - if( self.momentum > 0.5 ) - { - self playsound( "minigun_gatling_spindown3" ); - wait 0.5; - self playsound( "minigun_gatling_spindown2" ); - wait 0.5; - self playsound( "minigun_gatling_spindown1" ); - wait 0.65; - } - else - if( self.momentum > 0.25 ) - { - self playsound( "minigun_gatling_spindown2" ); - wait 0.5; - self playsound( "minigun_gatling_spindown1" ); - wait 0.65; - } - else - { - self playsound( "minigun_gatling_spindown1" ); - wait 0.65; - } -} - -overheat_enable() -{ - //Draw the temperature gauge - - //level.turretOverheat = true; - level thread overheat_hud(); - flag_clear( "disable_overheat" ); -} - -overheat_disable() -{ - //Erase the temperature gauge - - //level.turretOverheat = false; - //level notify ( "disable_overheat" ); - flag_set( "disable_overheat" ); - level.savehere = undefined; - - waittillframeend; - - if (isdefined(level.overheat_bg)) - level.overheat_bg destroy(); - if (isdefined(level.overheat_status)) - level.overheat_status destroy(); - if (isdefined(level.overheat_status2)) - level.overheat_status2 destroy(); - if (isdefined(level.overheat_flashing)) - level.overheat_flashing destroy(); -} - -overheat_hud() -{ - //Draw the temperature gauge and filler bar components - - level endon ( "disable_overheat" ); - if ( !isdefined( level.overheat_bg ) ) - { - level.overheat_bg = newhudelem(); - level.overheat_bg.alignX = "right"; - level.overheat_bg.alignY = "bottom"; - level.overheat_bg.horzAlign = "right"; - level.overheat_bg.vertAlign = "bottom"; - level.overheat_bg.x = 2; - level.overheat_bg.y = -120; - level.overheat_bg setShader("hud_temperature_gauge", 35, 150); - level.overheat_bg.sort = 4; - } - - barX = -10; - barY = -152; - - //status bar - if ( !isdefined( level.overheat_status ) ) - { - level.overheat_status = newhudelem(); - level.overheat_status.alignX = "right"; - level.overheat_status.alignY = "bottom"; - level.overheat_status.horzAlign = "right"; - level.overheat_status.vertAlign = "bottom"; - level.overheat_status.x = barX; - level.overheat_status.y = barY; - level.overheat_status setShader("white", 10, 0); - level.overheat_status.color = (1,.9,0); - level.overheat_status.alpha = 0; - level.overheat_status.sort = 1; - } - - //draw fake bar to cover up a hitch - - if ( !isdefined( level.overheat_status2 ) ) - { - level.overheat_status2 = newhudelem(); - level.overheat_status2.alignX = "right"; - level.overheat_status2.alignY = "bottom"; - level.overheat_status2.horzAlign = "right"; - level.overheat_status2.vertAlign = "bottom"; - level.overheat_status2.x = barX; - level.overheat_status2.y = barY; - level.overheat_status2 setShader("white", 10, 0); - level.overheat_status2.color = (1,.9,0); - level.overheat_status2.alpha = 0; - level.overheat_status.sort = 2; - } - - if ( !isdefined( level.overheat_flashing ) ) - { - level.overheat_flashing = newhudelem(); - level.overheat_flashing.alignX = "right"; - level.overheat_flashing.alignY = "bottom"; - level.overheat_flashing.horzAlign = "right"; - level.overheat_flashing.vertAlign = "bottom"; - level.overheat_flashing.x = barX; - level.overheat_flashing.y = barY; - level.overheat_flashing setShader("white", 10, level.turret_heat_max); - level.overheat_flashing.color = (.8,.16,0); - level.overheat_flashing.alpha = 0; - level.overheat_status.sort = 3; - } -} - -overheat_overheated() -{ - //Gun has overheated - flash full temp bar, do not drain - - level endon ( "disable_overheat" ); - if( !flag( "disable_overheat" ) ) - { - level.savehere = false; - level.player thread play_sound_on_entity ("smokegrenade_explode_default"); - - level.overheat_flashing.alpha = 1; - level.overheat_status.alpha = 0; - level.overheat_status2.alpha = 0; - - level notify ( "stop_overheat_drain" ); - level.turret_heat_status = level.turret_heat_max; - thread overheat_hud_update(); - - for (i=0;i<4;i++) - { - level.overheat_flashing fadeovertime(0.5); - level.overheat_flashing.alpha = 0.5; - wait 0.5; - level.overheat_flashing fadeovertime(0.5); - level.overheat_flashing.alpha = 1.0; - } - level.overheat_flashing fadeovertime(0.5); - level.overheat_flashing.alpha = 0.0; - level.overheat_status.alpha = 1; - wait 0.5; - - thread overheat_hud_drain(); - - wait 2; - level.savehere = undefined; - } -} - -overheat_hud_update() -{ - level endon ( "disable_overheat" ); - level notify ( "stop_overheat_drain" ); - - if ( level.turret_heat_status > 1 ) - level.overheat_status.alpha = 1; - else - { - level.overheat_status.alpha = 0; - level.overheat_status fadeovertime( 0.25 ); - } - - if ( isdefined( level.overheat_status2 ) && level.turret_heat_status > 1 ) - { - level.overheat_status2.alpha = 1; - level.overheat_status2 setShader( "white", 10, int( level.turret_heat_status ) ); - level.overheat_status scaleovertime( 0.05, 10, int( level.turret_heat_status ) ); - } - else - { - level.overheat_status2.alpha = 0; - level.overheat_status2 fadeovertime( 0.25 ); - } - - //set color of bar - overheat_setColor( level.turret_heat_status ); - - wait 0.05; - if ( isdefined( level.overheat_status2 ) ) - level.overheat_status2.alpha = 0; - if ( isdefined( level.overheat_status ) && level.turret_heat_status < level.turret_heat_max ) - thread overheat_hud_drain(); -} - -overheat_setColor( value, fadeTime ) -{ - level endon ("disable_overheat"); - - //define what colors to use - color_cold = []; - color_cold[0] = 1.0; - color_cold[1] = 0.9; - color_cold[2] = 0.0; - color_warm = []; - color_warm[0] = 1.0; - color_warm[1] = 0.5; - color_warm[2] = 0.0; - color_hot = []; - color_hot[0] = 0.9; - color_hot[1] = 0.16; - color_hot[2] = 0.0; - - //default color - SetValue = []; - SetValue[0] = color_cold[0]; - SetValue[1] = color_cold[1]; - SetValue[2] = color_cold[2]; - - //define where the non blend points are - cold = 0; - warm = (level.turret_heat_max / 2); - hot = level.turret_heat_max; - - iPercentage = undefined; - difference = undefined; - increment = undefined; - - if ( (value > cold) && (value <= warm) ) - { - iPercentage = int(value * (100 / warm)); - for ( colorIndex = 0 ; colorIndex < SetValue.size ; colorIndex++ ) - { - difference = (color_warm[colorIndex] - color_cold[colorIndex]); - increment = (difference / 100); - SetValue[colorIndex] = color_cold[colorIndex] + (increment * iPercentage); - } - } - else if ( (value > warm) && (value <= hot) ) - { - iPercentage = int( (value - warm) * (100 / (hot - warm) ) ); - for ( colorIndex = 0 ; colorIndex < SetValue.size ; colorIndex++ ) - { - difference = (color_hot[colorIndex] - color_warm[colorIndex]); - increment = (difference / 100); - SetValue[colorIndex] = color_warm[colorIndex] + (increment * iPercentage); - } - } - - if (isdefined( fadeTime ) ) - level.overheat_status fadeOverTime( fadeTime ); - - if( isdefined( level.overheat_status.color ) ) - level.overheat_status.color = (SetValue[0], SetValue[1], SetValue[2]); - - if( isdefined( level.overheat_status2.color ) ) - level.overheat_status2.color = (SetValue[0], SetValue[1], SetValue[2]); -} - -overheat_hud_drain() -{ - level endon ( "disable_overheat" ); - level endon ( "stop_overheat_drain" ); - - waitTime = 1.0; - for (;;) - { - if ( level.turret_heat_status > 1 ) - level.overheat_status.alpha = 1; - - value = level.turret_heat_status - level.turret_cooldownrate; - thread overheat_status_rampdown( value, waitTime ); - if ( value < 1 ) - value = 1; - level.overheat_status scaleovertime( waitTime, 10, int( value ) ); - overheat_setColor( level.turret_heat_status, waitTime ); - wait waitTime; - - if ( isdefined( level.overheat_status ) && level.turret_heat_status <= 1 ) - level.overheat_status.alpha = 0; - - if ( isdefined( level.overheat_status2 ) && level.turret_heat_status <= 1 ) - level.overheat_status2.alpha = 0; - } -} - -overheat_status_rampdown( targetvalue, time ) -{ - level endon ( "disable_overheat" ); - level endon ( "stop_overheat_drain" ); - - frames = (20 * time); - difference = ( level.turret_heat_status - targetvalue ); - frame_difference = ( difference / frames ); - - for ( i = 0; i < frames; i++ ) - { - level.turret_heat_status -= frame_difference; - if ( level.turret_heat_status < 1 ) - { - level.turret_heat_status = 1; - return; - } - wait 0.05; - } -} - -//script_anglevehicle = 1 -//script_decel = 10000 -//script_noteworthy = seaknight_land_location -//script_stopnode = 1 - -seaknight() -{ - //seaknight_path = getent( "seaknight_path", "targetname" ); - //seaknight_land_location = getent( "seaknight_land_location", "script_noteworthy" ); - /* - // make friends go to seaknight - friends = getaiarray( "allies" ); - for ( i = 0 ; i < friends.size ; i++ ) - friends[ i ] set_force_color( "c" ); - getent( "seaknight_friendly_trigger", "targetname" ) notify( "trigger" ); - */ - - // spawn the helicopter - level.seaknight1 = spawn_vehicle_from_targetname_and_drive( "rescue_chopper" ); - assert( isdefined( level.seaknight1 ) ); - - wait 0.05; - - // make riders only crouch so their anims look good when they unload - //seaknightRiders = level.seaknight1.riders; - seaknightRiders = []; - for( i = 0; i < level.seaknight1.riders.size; i++ ) - { - if( level.seaknight1.riders[ i ].classname != "actor_ally_pilot_zach_woodland" ) - seaknightRiders[ seaknightRiders.size ] = level.seaknight1.riders[ i ]; - - if( level.seaknight1.riders[ i ].classname == "actor_ally_hero_mark_woodland" ) - { - level.griggs = level.seaknight1.riders[ i ]; - level.griggs.animname = "griggs"; - } - } - - //assert( seaknightRiders.size == 5 ); - for ( i = 0 ; i < seaknightRiders.size ; i++ ) - seaknightRiders[ i ] thread seaknightRiders_standInPlace(); - - flag_set( "no_more_grenades" ); - - aAxis = getaiarray( "axis" ); - for( i = 0; i < aAxis.size; i++ ) - { - aAxis[ i ].grenadeammo = 0; - } - - flag_wait( "open_bay_doors" ); - - wait 4; - - level.seaknight1 setanim( getanim_generic( "ch46_doors_open" ), 1 ); //target weight - level.seaknight1 playsound( "seaknight_door_open" ); - - //flag_wait( "reached_evac_point" ); //sea knight reaches landing spot - - wait 5; - - repulsor = Missile_CreateRepulsorEnt( level.seaknight1, 5000, 1500 ); - - level.seaknight1.dontDisconnectPaths = true; - //level.seaknight1 vehicle_detachfrompath(); - //level.seaknight1 vehicle_land(); - level.seaknight1 setHoverParams( 0, 0, 0 ); - - wait 3.0; - - level.seaknight1 notify( "unload" ); - - wait 4.5; - - level.playerSafetyBlocker delete(); - - flag_set( "seaknight_can_be_boarded" ); - - thread seaknight_griggs_speech(); - - //level.seaknightFakeRamp show(); - - iLoadNumber = 0; - for(i=0;i 0 ) - { - wait 0.1; - } - - flag_set( "all_real_friendlies_on_board" ); - flag_set( "seaknight_guards_boarding" ); -} - -seaknight_departure_sequence() -{ - flag_wait( "seaknight_guards_boarding" ); - - wait 10; - - if( !flag( "player_made_it" ) ) - wait 2; - - flag_set( "all_fake_friendlies_aboard" ); - - //grace period - - if( !flag( "player_made_it" ) ) - wait 5; - - //Point of no return, late arrival check during grace period - - if( flag( "player_made_it" ) ) - { - flag_wait( "all_real_friendlies_on_board" ); - - //"All right we're all aboard!!! Go! Go!" - level.player playsound( "villagedef_grg_wereallaboard" ); - wait 1; - } - else - { - //player can no longer trigger personal and live friendly boarding sequence - flag_set( "seaknight_unboardable" ); - } - - - flag_set( "outtahere" ); //seaknight takes off - - wait 1.5; - - //"Ok we're outta here." - thread countdown_speech( "outtahere" ); -} - -seaknight_sas_load() -{ - self endon ( "death" ); - - self.interval = 8; - - self setthreatbiasgroup( "sas_evac_guy" ); - - setignoremegroup( "axis" , "sas_evac_guy" ); // allies ignore axis - - self.goalradius = 160; - self.disableArrivals = true; - self.ignoresuppression = true; - self.ignoreAll = true; - - wait randomfloatrange( 1.5, 3.2 ); - - fakeramp_startnode = getnode( "seaknight_fakeramp_startpoint", "targetname" ); - self setgoalnode( fakeramp_startnode ); - self waittill ( "goal" ); - - if( isdefined( fakeramp_startnode.radius ) ) - self.goalradius = fakeramp_startnode.radius; - - fakeramp_endnode = getnode( "seaknight_fakeramp_end", "targetname" ); - self setgoalnode( fakeramp_endnode ); - self waittill ( "goal" ); - - level.sasSeaKnightBoarded--; - - if ( isdefined( self.magic_bullet_shield ) ) - self stop_magic_bullet_shield(); - - self delete(); -} - -seaknight_griggs_speech() -{ - flag_wait( "seaknight_can_be_boarded" ); - - if( !flag( "lz_reached" ) ) //if heli arrives early - { - flag_wait( "lz_reached" ); - } - else - { - wait 5.5; //if player arrives early - } - - //"Heard you guys needed a ride outta here!" - level.griggs anim_single_queue( level.griggs, "needaride" ); - - wait 0.45; - - //"Get on board! Move! Move!!" - level.griggs anim_single_queue( level.griggs, "getonboard" ); - - wait 2; - - //"Let's go! Let's go!" - level.griggs anim_single_queue( level.griggs, "griggsletsgo" ); -} - -vehicle_seaknight_idle_and_load_think( iAnimNumber ) -{ - self endon( "death" ); - - flag_wait( "seaknight_guards_boarding" ); - - sAnimLoad = "ch46_load_" + iAnimNumber; - - /*----------------------- - LOAD INTO SEAKNIGHT AND DELETE - -------------------------*/ - - level.seaknight1 anim_generic( self, sAnimLoad, "tag_detach" ); - - self setGoalPos( self.origin ); - self.goalradius = 4; - - if( !flag( "player_made_it" ) ) - { - //flag_wait( "outtahere" ); - - self LinkTo( level.seaknight1, "tag_detach" ); - } - - flag_wait( "player_made_it" ); - - wait 1; - - if ( isdefined( self.magic_bullet_shield ) ) - self stop_magic_bullet_shield(); - - self delete(); -} - -seaknight_riders_erase() -{ - if( isdefined( self.animname ) && self.animname == "griggs" ) - return; - - self endon ( "death" ); - - flag_wait( "player_made_it" ); - - wait 1; - - flag_wait( "all_fake_friendlies_aboard" ); - - if ( isdefined( self.magic_bullet_shield ) ) - self stop_magic_bullet_shield(); - - self delete(); -} - -deleteme() -{ - self delete(); -} - -seaknightRiders_standInPlace() -{ - if ( !isAI( self ) ) - return; - self allowedStances( "crouch" ); - self thread hero(); - self waittill( "jumpedout" ); - self allowedStances( "crouch" ); - waittillframeend; - self allowedStances( "crouch" ); - self.goalradius = 4; - self pushPlayer( true ); - self.pushable = false; - self setGoalPos( self.origin ); - self.grenadeawareness = 0; - self.grenadeammo = 0; - self.ignoresuppression = true; - //self.ignoreall = true; -} - -friendly_pushplayer( status ) -{ - if( !isdefined( status ) ) - status = false; - - aAllies = getaiarray( "allies" ); - for( i = 0; i < aAllies.size; i++ ) - { - if( status == "on" ) - { - aAllies[ i ] pushplayer( true ); - aAllies[ i ].dontavoidplayer = true; - aAllies[ i ].pushable = false; - } - else - { - aAllies[ i ] pushplayer( false ); - aAllies[ i ].dontavoidplayer = false; - aAllies[ i ].pushable = true; - } - } -} \ No newline at end of file