7287 lines
193 KiB
Plaintext
7287 lines
193 KiB
Plaintext
#include maps\_utility;
|
||
#include common_scripts\utility;
|
||
#include maps\_anim;
|
||
#include maps\_blizzard;
|
||
#include maps\_vehicle;
|
||
#include maps\_stealth_utility;
|
||
#include maps\_stealth_shared_utilities;
|
||
#include maps\contingency_anim;
|
||
|
||
main()
|
||
{
|
||
level.price_destroys_btr = false;
|
||
setsaveddvar( "sm_sunShadowScale", 0.5 );// optimization
|
||
setsaveddvar( "r_lightGridEnableTweaks", 1 );
|
||
setsaveddvar( "r_lightGridIntensity", 1.24 );
|
||
setsaveddvar( "r_lightGridContrast", 0 );
|
||
|
||
//level.ai_dont_glow_in_thermal = true;
|
||
level.min_btr_fighting_range = 400;
|
||
level.explosion_dist_sense = 1500;
|
||
level.default_goalradius = 7200;
|
||
level.goodFriendlyDistanceFromPlayerSquared = 250 * 250;
|
||
level.corpse_behavior_doesnt_require_player_sight = true;
|
||
level.attackheliRange = 7000;
|
||
level.min_time_between_uav_launches = 24 * 1000;
|
||
level.dont_use_global_uav_kill_dialog = true;
|
||
PreCacheItem( "remote_missile_snow" );
|
||
level.remote_missile_snow = true;
|
||
|
||
level.bcs_maxTalkingDistFromPlayer = 5000; // default = 1500
|
||
|
||
level.visionThermalDefault = "contingency_thermal_inverted";
|
||
level.VISION_UAV = "contingency_thermal_inverted";
|
||
level.cosine[ "60" ] = cos( 60 );
|
||
level.cosine[ "70" ] = cos( 70 );
|
||
|
||
//thermal fx overrides
|
||
SetThermalBodyMaterial( "thermalbody_snowlevel" );
|
||
level.friendly_thermal_Reflector_Effect = loadfx( "misc/thermal_tapereflect" );
|
||
|
||
PreCacheRumble( "tank_rumble" );
|
||
precacheItem( "remote_missile_not_player" );
|
||
precacheModel( "com_computer_keyboard_obj" );
|
||
PrecacheNightVisionCodeAssets();
|
||
|
||
default_start( ::start_start );
|
||
add_start( "start", ::start_start, "Start" );
|
||
//add_start( "bridge", ::start_bridge, "Bridge" );
|
||
add_start( "slide", ::start_slide, "Slide" );
|
||
add_start( "woods", ::start_woods, "Woods" );
|
||
add_start( "midwoods", ::start_midwoods, "mid woods" );
|
||
add_start( "ridge", ::start_ridge, "ridge" );
|
||
//add_start( "village", ::start_village, "village" );
|
||
add_start( "base", ::start_base, "Base" );
|
||
add_start( "defend_sub", ::start_defend_sub, "defend_sub" );
|
||
|
||
//add_start( "sub", ::start_sub, "Submarine" );
|
||
//add_start( "exit_sub", ::start_exit_sub, "Exit Submarine" );
|
||
//add_start( "sub_gas_mask", ::start_sub_gas_mask, "Sub w/ gas mask" );
|
||
|
||
maps\contingency_precache::main();
|
||
maps\createart\contingency_fog::main();
|
||
maps\contingency_fx::main();
|
||
maps\contingency_anim::main_anim();
|
||
|
||
maps\_attack_heli::preLoad();
|
||
|
||
build_light_override( "btr80", "vehicle_btr80", "spotlight", "TAG_FRONT_LIGHT_RIGHT", "misc/spotlight_btr80_daytime", "spotlight", 0.2 );
|
||
build_light_override( "btr80", "vehicle_btr80", "spotlight_turret", "TAG_TURRET_LIGHT", "misc/spotlight_btr80_daytime", "spotlight_turret", 0.0 );
|
||
|
||
level.weaponClipModels = [];
|
||
level.weaponClipModels[0] = "weapon_m16_clip";
|
||
level.weaponClipModels[1] = "weapon_kriss_clip";
|
||
level.weaponClipModels[2] = "weapon_ak47_tactical_clip";
|
||
level.weaponClipModels[3] = "weapon_m4_clip";
|
||
level.weaponClipModels[4] = "weapon_magpul_masada_clip";
|
||
level.weaponClipModels[5] = "weapon_dragunov_clip";
|
||
level.weaponClipModels[6] = "weapon_famas_clip";
|
||
|
||
level.dead_vehicles = [];
|
||
|
||
precacheString( &"CONTINGENCY_TIME_TO_ENTER_SUB" );
|
||
precacheString( &"CONTINGENCY_LINE1" );
|
||
precacheString( &"CONTINGENCY_LINE2" );
|
||
precacheString( &"CONTINGENCY_LINE3" );
|
||
precacheString( &"CONTINGENCY_LINE4" );
|
||
precacheString( &"CONTINGENCY_LINE5" );
|
||
|
||
|
||
precacheString( &"CONTINGENCY_OBJ_DEFEND_SUB" );
|
||
precacheString( &"CONTINGENCY_OBJ_ENTER_SUB" );
|
||
precacheString( &"CONTINGENCY_OBJ_CONTROL_SUB" );
|
||
precacheString( &"CONTINGENCY_OBJ_TURN_KEY" );
|
||
precacheString( &"CONTINGENCY_OBJ_EXIT_SUB" );
|
||
precacheString( &"CONTINGENCY_OBJ_DEFEND" );
|
||
precacheString( &"CONTINGENCY_SUB_TIMER_EXPIRED" );
|
||
precacheString( &"CONTINGENCY_OBJ_ENTER_BASE" );
|
||
precacheString( &"CONTINGENCY_OBJ_PRICE" );
|
||
precacheString( &"CONTINGENCY_USE_DRONE" );
|
||
precacheString( &"CONTINGENCY_TURN_KEY" );
|
||
precacheString( &"CONTINGENCY_DONT_LEAVE" );
|
||
precacheString( &"CONTINGENCY_DONT_LEAVE_FAILURE" );
|
||
|
||
|
||
|
||
|
||
maps\_load::main();
|
||
maps\_load::set_player_viewhand_model( "viewhands_player_arctic_wind" );
|
||
thread maps\contingency_amb::main();
|
||
//maps\_blizzard::blizzard_main();
|
||
maps\createart\contingency_art::main();
|
||
//maps\_utility::set_vision_set( "contingency", 0 );
|
||
//snow_fx();
|
||
|
||
maps\_remotemissile::init();
|
||
// maps\_remotemissile::init_radio_dialogue();
|
||
|
||
maps\_compass::setupMiniMap("compass_map_contingency");
|
||
|
||
createThreatBiasGroup( "bridge_guys" );
|
||
createThreatBiasGroup( "truck_guys" );
|
||
createThreatBiasGroup( "bridge_stealth_guys" );
|
||
createThreatBiasGroup( "dogs" );
|
||
createThreatBiasGroup( "price" );
|
||
createThreatBiasGroup( "player" );
|
||
createThreatBiasGroup( "end_patrol" );
|
||
level.player setthreatbiasgroup( "player" );
|
||
//Make first group ignored by second group
|
||
SetIgnoreMeGroup( "price", "dogs" );
|
||
//ignoreEachOther( "left_rooftop_enemies", "players_group" );
|
||
//Set threat bias of first group against second group
|
||
setthreatbias( "player", "bridge_stealth_guys", 1000 );
|
||
setthreatbias( "player", "truck_guys", 1000 );
|
||
//setthreatbias( "end_patrol", "price", 1000 );
|
||
|
||
precacheItem( "at4_straight" );
|
||
precacheItem( "rpg_straight" );
|
||
precacheItem( "zippy_rockets" );
|
||
precacheItem( "zippy_rockets_inverted" );
|
||
precacheItem( "semtex_grenade" );
|
||
precacheItem( "facemask" );
|
||
|
||
|
||
flag_init( "saying_base_on_alert" );
|
||
flag_init( "said_second_uav_in_position" );
|
||
flag_init( "everyone_set_green" );
|
||
flag_init( "said_convoy_coming" );
|
||
flag_init( "saying_patience" );
|
||
flag_init( "stop_stealth_music" );
|
||
flag_init( "price_starts_moving" );
|
||
|
||
flag_init( "all_bridge_guys_dead" );
|
||
thread flag_when_all_bridge_guys_dead();
|
||
thread flag_when_second_group_of_stragglers_are_dead();
|
||
flag_init( "second_group_of_stragglers_are_dead" );
|
||
flag_init( "saying_contact" );
|
||
flag_init( "said_follow_me" );
|
||
flag_init( "someone_became_alert" );
|
||
flag_init( "price_is_hiding" );
|
||
flag_init( "truck_guys_alerted" );
|
||
flag_init( "jeep_stopped" );
|
||
flag_init( "convoy_hide_section_complete" );
|
||
|
||
flag_init( "attach_rocket" );
|
||
flag_init( "fire_rocket" );
|
||
flag_init( "drop_rocket" );
|
||
|
||
flag_init( "done_with_exploding_trees" );
|
||
|
||
flag_init( "first_uav_spawned" );
|
||
flag_init( "first_uav_destroyed" );
|
||
flag_init( "second_uav_in_position" );
|
||
flag_init( "rasta_and_bricktop_dialog_done" );
|
||
flag_init( "player_turned_key" );
|
||
flag_init( "player_in_uaz" );
|
||
|
||
//flag_init( "dialog_woods_first_patrol" );
|
||
//flag_init( "dialog_woods_first_dog_patrol" );
|
||
//flag_init( "dialog_woods_second_dog_patrol" );
|
||
//flag_init( "dialog_woods_first_stationary" );
|
||
//flag_init( "dialog_woods_blocking_stationary" );
|
||
|
||
flag_init( "time_to_use_UAV" );
|
||
flag_init( "both_gauntlets_destroyed" );
|
||
flag_init( "time_to_race_to_submarine" );
|
||
flag_init( "player_key_rdy" );
|
||
flag_init( "close_sub_hatch" );
|
||
|
||
maps\_idle::idle_main();
|
||
maps\_idle_coffee::main();
|
||
maps\_idle_smoke::main();
|
||
maps\_idle_lean_smoke::main();
|
||
maps\_idle_phone::main();
|
||
maps\_idle_sleep::main();
|
||
maps\_idle_sit_load_ak::main();
|
||
|
||
animscripts\dog\dog_init::initDogAnimations();
|
||
maps\_patrol_anims::main();
|
||
|
||
maps\_dynamic_run_speed::main();
|
||
maps\_stealth::main();
|
||
stealth_settings();
|
||
thread stealth_music_control();
|
||
|
||
//thread dialog_theyre_looking_for_you();
|
||
thread dialog_we_are_spotted();
|
||
thread dialog_stealth_recovery();
|
||
thread dialog_price_kill();
|
||
thread dialog_price_kill_dog();
|
||
thread dialog_player_kill_master();
|
||
thread dialog_enemy_saw_corpse();
|
||
|
||
// Remote Missile
|
||
level.player.remotemissile_actionslot = 4;
|
||
level.player thread maps\_remotemissile::RemoteMissileDetonatorNotify();
|
||
|
||
|
||
level.player stealth_plugin_basic();
|
||
level.player thread playerSnowFootsteps();
|
||
player_speed_percent( 90 );
|
||
|
||
destroyable_trees = getentarray( "trigger_tree_explosion", "targetname" );
|
||
foreach( trigger in destroyable_trees )
|
||
trigger thread setup_destroyable_tree();
|
||
|
||
//tree_destruction_chain = getstruct( "tree_destruction_chain", "targetname" );
|
||
//thread destroy_chain( tree_destruction_chain );
|
||
|
||
//thread spawn_bridge_trucks();
|
||
truck_patrol_vehicles = getentarray( "truck_patrol", "targetname" );
|
||
array_thread( truck_patrol_vehicles, ::add_spawn_function, ::setup_bridge_trucks );
|
||
truck_guys = getentarray( "truck_guys", "script_noteworthy" );
|
||
array_thread( truck_guys, ::add_spawn_function, ::base_truck_guys_think );
|
||
|
||
rasta_spawners = getentarray( "rasta", "script_noteworthy" );
|
||
array_thread( rasta_spawners, ::add_spawn_function, ::setup_rasta );
|
||
|
||
bricktop_spawners = getentarray( "bricktop", "script_noteworthy" );
|
||
array_thread( bricktop_spawners, ::add_spawn_function, ::setup_bricktop );
|
||
|
||
village_redshirt = getentarray( "village_redshirt", "script_noteworthy" );
|
||
if( isdefined( village_redshirt ) )
|
||
array_thread( village_redshirt, ::add_spawn_function, ::setup_village_redshirt );
|
||
|
||
|
||
start_of_base_redshirt = getentarray( "start_of_base_redshirt", "script_noteworthy" );
|
||
if( isdefined( start_of_base_redshirt ) )
|
||
array_thread( start_of_base_redshirt, ::add_spawn_function, ::setup_base_redshirt );
|
||
|
||
level.village_defenders_dead = 0;
|
||
village_defenders = getentarray( "village_defenders", "targetname" );
|
||
array_thread( village_defenders, ::add_spawn_function, ::setup_village_defenders );
|
||
|
||
base_starting_guys = getentarray( "base_starting_guys", "script_noteworthy" );
|
||
array_thread( base_starting_guys, ::add_spawn_function, ::setup_base_starting_guys );
|
||
|
||
base_vehicles = getentarray( "base_vehicles", "script_noteworthy" );
|
||
array_thread( base_vehicles, ::add_spawn_function, ::setup_base_vehicles );
|
||
|
||
base_troop_transport1 = getent( "base_troop_transport1", "targetname" );
|
||
base_troop_transport1 add_spawn_function( ::unload_when_close_to_player );
|
||
base_troop_transport1 add_spawn_function( ::dialog_destroyed_vehicle, "cont_cmt_goodkilltruck" );
|
||
|
||
|
||
base_troop_transport2 = getent( "base_troop_transport2", "targetname" );
|
||
base_troop_transport2 add_spawn_function( ::unload_when_close_to_player );
|
||
base_troop_transport2 add_spawn_function( ::dialog_destroyed_vehicle, "cont_cmt_goodkilltruck" );
|
||
|
||
base_truck2 = getent( "base_truck2", "targetname" );
|
||
base_truck2 add_spawn_function( ::unload_when_close_to_player );
|
||
base_truck2 add_spawn_function( ::dialog_destroyed_vehicle, "cont_cmt_directhitjeep" );
|
||
|
||
|
||
price_spawner = getent( "price", "script_noteworthy" );
|
||
price_spawner add_spawn_function( ::setup_price );
|
||
price_spawner add_spawn_function( ::set_threatbias_group, "price" );
|
||
|
||
|
||
//base_truck_guys = getentarray( "base_truck_guys", "script_noteworthy" );
|
||
//array_thread( base_truck_guys, ::add_spawn_function, ::setup_remote_missile_target_rider );
|
||
//defend_sub_vehicle_guys = getentarray( "defend_sub_vehicle_guys", "script_noteworthy" );
|
||
//array_thread( defend_sub_vehicle_guys, ::add_spawn_function, ::setup_remote_missile_target_rider );
|
||
//base_starting_guys_truckriders = getentarray( "base_starting_guys_truckriders", "targetname" );
|
||
//array_thread( base_starting_guys_truckriders, ::add_spawn_function, ::setup_remote_missile_target_rider );
|
||
|
||
|
||
//defend_sub_final_guys = getentarray( "defend_sub_final_guys", "targetname" );
|
||
//array_thread( defend_sub_final_guys, ::add_spawn_function, maps\_remotemissile::setup_remote_missile_target );
|
||
//base_defenders = getentarray( "base_defenders", "script_noteworthy" );
|
||
//array_thread( base_defenders, ::add_spawn_function, maps\_remotemissile::setup_remote_missile_target );
|
||
//base_starting_guys = getentarray( "base_starting_guys", "targetname" );
|
||
//array_thread( base_starting_guys, ::add_spawn_function, maps\_remotemissile::setup_remote_missile_target );
|
||
|
||
add_global_spawn_function( "axis", ::setup_remote_missile_target_guy );
|
||
|
||
add_global_spawn_function( "axis", ::setup_count_predator_infantry_kills );
|
||
//add_global_spawn_function( "axis", ::tons_of_health );
|
||
thread dialog_handle_predator_infantry_kills();
|
||
|
||
flag_init( "base_troop_transport2_spawned" );
|
||
base_troop_transport2 = getent( "base_troop_transport2", "targetname" );
|
||
base_troop_transport2 add_spawn_function( ::flag_set, "base_troop_transport2_spawned" );
|
||
|
||
village_truck_guys = getentarray( "village_truck_guys", "script_noteworthy" );
|
||
array_thread( village_truck_guys, ::add_spawn_function, ::village_truck_guys_setup );
|
||
|
||
//end_patrol = getentarray( "end_patrol", "targetname" );
|
||
//array_thread( end_patrol, ::add_spawn_function, ::set_threatbias_group, "end_patrol" );
|
||
|
||
|
||
sub_ladder = getent( "sub_ladder", "targetname" );
|
||
sub_ladder.realOrigin = sub_ladder.origin;
|
||
sub_ladder.origin += ( 0, 0, -10000 );
|
||
|
||
thread setup_sub_hatch();
|
||
|
||
thread setup_dont_leave_failure();
|
||
thread setup_dont_leave_hint();
|
||
add_hint_string( "hint_dont_leave_price", &"CONTINGENCY_DONT_LEAVE", ::should_break_dont_leave );
|
||
add_hint_string( "hint_predator_drone", &"HELLFIRE_USE_DRONE", ::should_break_use_drone );
|
||
add_hint_string( "hint_steer_drone", &"SCRIPT_PLATFORM_STEER_DRONE", ::should_break_steer_drone );
|
||
|
||
thread objective_main();
|
||
}
|
||
|
||
tons_of_health()
|
||
{
|
||
self.health = 100000;
|
||
}
|
||
|
||
|
||
|
||
start_start()
|
||
{
|
||
thread handle_start();
|
||
}
|
||
|
||
|
||
start_base()
|
||
{
|
||
start = getstruct( "base_start_player", "targetname" );
|
||
level.player setOrigin( start.origin );
|
||
level.player setPlayerAngles( start.angles );
|
||
|
||
friendlies = getentarray( "start_friendly", "targetname" );
|
||
friendlies2 = getentarray( "rasta_and_bricktop", "targetname" );
|
||
friendlies = array_combine( friendlies, friendlies2 );
|
||
|
||
//array_thread( friendlies, ::spawn_ai );
|
||
friendly_starts = getstructarray( "base_start_friendly", "targetname" );
|
||
|
||
for ( i = 0 ; i < friendlies.size ; i++ )
|
||
{
|
||
friendlies[ i ].origin = friendly_starts[ i ].origin;
|
||
friendlies[ i ].angles = friendly_starts[ i ].angles;
|
||
friendlies[ i ] spawn_ai();
|
||
}
|
||
wait .1;
|
||
|
||
level.price.colornode_func = ::dialog_moving_to_new_position_in_village;
|
||
level.price forceUseWeapon( "aug_scope", "primary" );
|
||
//disable_stealth_system();
|
||
thread spawn_second_uav();
|
||
flag_set( "player_on_ridge" );
|
||
flag_set( "leaving_village" );
|
||
thread handle_base();
|
||
}
|
||
|
||
|
||
|
||
|
||
start_defend_sub()
|
||
{
|
||
start = getstruct( "defend_sub_start_player", "targetname" );
|
||
level.player setOrigin( start.origin );
|
||
level.player setPlayerAngles( start.angles );
|
||
|
||
friendlies = getentarray( "start_friendly", "targetname" );
|
||
friendlies2 = getentarray( "rasta_and_bricktop", "targetname" );
|
||
friendlies = array_combine( friendlies, friendlies2 );
|
||
|
||
//array_thread( friendlies, ::spawn_ai );
|
||
friendly_starts = getstructarray( "defend_sub_start_friendly", "targetname" );
|
||
|
||
for ( i = 0 ; i < friendlies.size ; i++ )
|
||
{
|
||
friendlies[ i ].origin = friendly_starts[ i ].origin;
|
||
friendlies[ i ].angles = friendly_starts[ i ].angles;
|
||
friendlies[ i ] spawn_ai();
|
||
}
|
||
flag_set( "stop_stealth_music" );
|
||
music_stop();
|
||
|
||
level.player takeallweapons();
|
||
level.player giveWeapon( "aa12" );
|
||
level.player giveWeapon( "m240_heartbeat_reflex_arctic" );
|
||
level.player switchToWeapon( "m240_heartbeat_reflex_arctic" );
|
||
|
||
level.player giveWeapon( "fraggrenade" );
|
||
level.player setOffhandSecondaryClass( "flash" );
|
||
level.player giveWeapon( "flash_grenade" );
|
||
|
||
|
||
wait .1;
|
||
|
||
level.rasta set_force_color( "g" );
|
||
level.rasta enable_ai_color();
|
||
level.bricktop set_force_color( "g" );
|
||
level.bricktop enable_ai_color();
|
||
level.price set_force_color( "g" );
|
||
level.price enable_ai_color();
|
||
|
||
level.price forceUseWeapon( "aug_scope", "primary" );
|
||
|
||
disable_stealth_system();
|
||
|
||
friendlies = getaiarray( "allies" );
|
||
foreach( g in friendlies )
|
||
g thread turn_off_stealth_settings();
|
||
|
||
thread spawn_second_uav();
|
||
flag_set( "player_on_ridge" );
|
||
flag_set( "leaving_village" );
|
||
flag_set( "base_alerted" );
|
||
|
||
//flag_set( "price_splits_off" );
|
||
|
||
thread base_arrival_music();
|
||
|
||
thread handle_defend_sub();
|
||
}
|
||
|
||
dialog_i_cant_see_roach()
|
||
{
|
||
wait 4;
|
||
//Price, I can barely see Roach's chute on my satellite feed. Too much interference. Do you see him, over?
|
||
thread radio_dialogue( "cont_cmt_barelysee" );
|
||
|
||
}
|
||
|
||
handle_start()
|
||
{
|
||
thread dialog_i_cant_see_roach();
|
||
|
||
maps\_introscreen::contingency_black_screen_intro();
|
||
|
||
price_spawner = getent( "price", "script_noteworthy" );
|
||
price_spawner spawn_ai();
|
||
//price_intro_talk_pos = getnode( "price_intro_talk_pos", "script_noteworthy" );
|
||
//level.price setgoalnode( price_intro_talk_pos );
|
||
//level.price.goalradius = 64;
|
||
|
||
thread cargo_choppers();
|
||
thread price_intro_anim();
|
||
|
||
//wait .2;
|
||
|
||
//thread dialog_intro();
|
||
|
||
//flag_wait_either ( "price_goes_to_road", "said_follow_me" );
|
||
|
||
//level.price SetLookAtEntity();// clears it
|
||
|
||
thread dialog_lets_follow_quietly();
|
||
|
||
flag_wait ( "start_first_patrol" );
|
||
|
||
autosave_by_name( "start_first_patrol" );
|
||
first_patrol = getentarray( "first_patrol", "targetname" );
|
||
foreach( guy in first_patrol )
|
||
{
|
||
guy thread spawn_with_delays();
|
||
}
|
||
|
||
flag_wait( "price_starts_moving" );
|
||
flag_wait( "patrol_in_sight" );
|
||
|
||
thread hide_and_kill_first_stragglers();
|
||
thread hide_and_kill_everyone();
|
||
|
||
|
||
thread dialog_first_patrol_spotted();
|
||
|
||
|
||
//flag_wait( "cross_bridge_patrol_dead" );//guy and dog that look over the bridge
|
||
//flag_wait( "rightside_patrol_dead" );
|
||
|
||
flag_wait( "start_truck_patrol" );
|
||
|
||
|
||
if( !flag( "cross_bridge_patrol_dead" ) && !flag( "first_stragglers_dead" ) && !flag( "rightside_patrol_dead" ) )
|
||
thread autosave_stealth();
|
||
|
||
level.price.ignoreall = true;
|
||
|
||
thread spawn_vehicles_from_targetname_and_drive( "truck_patrol" );
|
||
|
||
wait 1;
|
||
|
||
//level.price thread disable_cqbwalk();
|
||
//level.price thread hide_from_bridge_convoy();
|
||
|
||
thread dialog_convoy_coming();
|
||
|
||
flag_wait_any( "last_truck_left", "player_is_crossing_bridge", "all_bridge_guys_dead" );
|
||
|
||
//thread autosave_stealth();
|
||
|
||
level.price notify( "stop_smart_path_following" );
|
||
price_rdy_vs_stragglers = getnode( "price_rdy_vs_stragglers", "targetname" );
|
||
level.price thread price_smart_path_following( price_rdy_vs_stragglers );
|
||
|
||
|
||
level.price thread friendly_adjust_movement_speed();
|
||
|
||
flag_wait( "price_slide_prep" );
|
||
|
||
level.price.ignoreall = false;
|
||
thread handle_slide();
|
||
}
|
||
|
||
start_slide()
|
||
{
|
||
start = getstruct( "slide_start_player", "targetname" );
|
||
level.player setOrigin( start.origin );
|
||
level.player setPlayerAngles( start.angles );
|
||
|
||
friendlies = getentarray( "start_friendly", "targetname" );
|
||
//array_thread( friendlies, ::spawn_ai );
|
||
friendly_starts = getstructarray( "slide_start_friendly", "targetname" );
|
||
|
||
for ( i = 0 ; i < friendlies.size ; i++ )
|
||
{
|
||
friendlies[ i ].origin = friendly_starts[ i ].origin;
|
||
friendlies[ i ].angles = friendly_starts[ i ].angles;
|
||
friendlies[ i ] spawn_ai();
|
||
}
|
||
wait .1;
|
||
|
||
level.price enable_cqbwalk();
|
||
//price_pre_slide_node = getnode( "price_pre_slide", "targetname" );
|
||
//price_pre_slide_node = getnode( "price_fire_loc", "targetname" );
|
||
//level.price setgoalnode( price_pre_slide_node );
|
||
//level.price.goalradius = 64;
|
||
|
||
//flag_set( "start_btr_slide" );
|
||
|
||
thread handle_slide();
|
||
}
|
||
|
||
|
||
|
||
//#using_animtree( "generic_human" );
|
||
handle_slide()
|
||
{
|
||
price_destroys_btr = level.price_destroys_btr;
|
||
thread cargo_choppers2();
|
||
|
||
|
||
|
||
level.price notify( "stop_smart_path_following" );
|
||
|
||
//if( !price_destroys_btr )
|
||
//{
|
||
price_pre_slide_node = getnode( "price_fire_loc", "targetname" );
|
||
|
||
price_pre_slide_node thread Price_Caution_Stop();
|
||
|
||
//level.price setgoalnode( price_pre_slide_node );
|
||
//level.price.goalradius = 64;
|
||
// wait 2.5;
|
||
//}
|
||
|
||
|
||
flag_wait( "start_btr_slide" );
|
||
autosave_stealth();
|
||
println( "hit flag" );
|
||
println( "anim starting" );
|
||
|
||
level.price notify( "stop_adjust_movement_speed" );
|
||
|
||
//second btr is the one with the script to kill the player.
|
||
//if( price_destroys_btr )
|
||
thread setup_tree_destroyer();
|
||
|
||
level.btr_slider = spawn_vehicle_from_targetname( "btr_slider" );
|
||
level.btr_slider thread vehicle_lights_on( "spotlight spotlight_turret" );
|
||
level.btr_slider thread maps\_vehicle::damage_hints();
|
||
|
||
level.btr_slider thread fake_treads();
|
||
|
||
//thread debug_timer();
|
||
//level.btr_slider = spawn_anim_model( "contingency_btr_slide" );
|
||
|
||
//wait 1;
|
||
|
||
level.btr_slider.animname = "contingency_btr_slide";
|
||
|
||
btr81_slide_node = getstruct("btr81_slide_node", "targetname" );
|
||
//thread draw_line_for_time ( btr81_slide_node.origin, btr81_slide_node.origin + (0,0,32), 0, 1, 1, 999);
|
||
|
||
btr81_slide_node thread anim_single_solo( level.btr_slider, "contingency_btr_slide" );
|
||
level.btr_slider playsound( "scn_con_bmp_skid" );
|
||
|
||
//thread dialog_btr_incoming();
|
||
//thread debug_timer();
|
||
|
||
|
||
//if( price_destroys_btr )
|
||
//{
|
||
// price_fire_loc = getent( "price_fire_loc_new", "targetname" );
|
||
// level.price notify( "stop_smart_path_following" );
|
||
//
|
||
//
|
||
// wait 1.3;
|
||
//
|
||
// level.price thread disable_cqbwalk();
|
||
// level.price pushplayer( true );
|
||
//
|
||
//
|
||
// fire_pos_ent = price_fire_loc;
|
||
// thing = level.btr_slider;
|
||
// thing_offset = (0,0,0);
|
||
// level.price destroy_thing_with_at4( fire_pos_ent, thing, thing_offset, true );
|
||
//}
|
||
//else
|
||
//{
|
||
//thread end_btr_slide();
|
||
wait_to_hide = 2.8;
|
||
wait wait_to_hide;
|
||
|
||
level notify( "run_to_woods" );
|
||
level.price anim_stopanimscripted();
|
||
level.price thread dialogue_queue( "cont_pri_incoming" );
|
||
|
||
//level.price disable_cqbwalk();
|
||
//price_quick_hide_loc = getnode( "price_into_the_woods_path", "targetname" );
|
||
//level.price setgoalnode( price_quick_hide_loc );
|
||
|
||
|
||
//wait (5.45 - wait_to_hide);
|
||
//}
|
||
|
||
thread stealth_ai_ignore_tree_explosions();
|
||
|
||
thread dialog_into_the_woods();
|
||
|
||
thread end_of_tree_explosions();
|
||
|
||
level.price pushplayer( true );
|
||
//this is price running fast into the woods
|
||
level.price thread disable_cqbwalk();
|
||
//level.price set_generic_run_anim( "sprint", true );
|
||
level.price.sprint = true;
|
||
level.price.moveplaybackrate = .9;
|
||
level.price thread faster_price_if_player_close();
|
||
price_into_the_woods_path = getnode( "price_into_the_woods_path", "targetname" );
|
||
level.price thread follow_path( price_into_the_woods_path );
|
||
|
||
thread handle_woods();
|
||
}
|
||
|
||
|
||
|
||
start_woods()
|
||
{
|
||
start = getstruct( "woods_start_player", "targetname" );
|
||
level.player setOrigin( start.origin );
|
||
level.player setPlayerAngles( start.angles );
|
||
|
||
friendlies = getentarray( "start_friendly", "targetname" );
|
||
//array_thread( friendlies, ::spawn_ai );
|
||
friendly_starts = getstructarray( "woods_start_friendly", "targetname" );
|
||
|
||
for ( i = 0 ; i < friendlies.size ; i++ )
|
||
{
|
||
friendlies[ i ].origin = friendly_starts[ i ].origin;
|
||
friendlies[ i ].angles = friendly_starts[ i ].angles;
|
||
friendlies[ i ] spawn_ai();
|
||
}
|
||
wait .1;
|
||
|
||
level.price thread disable_cqbwalk();
|
||
level.price.moveplaybackrate = 1.2;
|
||
level.price.goalradius = 64;
|
||
level.price setgoalpos( ( -28257.9, -8877.1, 840.5 ) );
|
||
|
||
thread handle_woods();
|
||
}
|
||
|
||
|
||
start_midwoods()
|
||
{
|
||
start = getstruct( "midwoods_start_player", "targetname" );
|
||
level.player setOrigin( start.origin );
|
||
level.player setPlayerAngles( start.angles );
|
||
|
||
friendlies = getentarray( "start_friendly", "targetname" );
|
||
//array_thread( friendlies, ::spawn_ai );
|
||
friendly_starts = getstructarray( "midwoods_start_friendly", "targetname" );
|
||
|
||
for ( i = 0 ; i < friendlies.size ; i++ )
|
||
{
|
||
friendlies[ i ].origin = friendly_starts[ i ].origin;
|
||
friendlies[ i ].angles = friendly_starts[ i ].angles;
|
||
friendlies[ i ] spawn_ai();
|
||
}
|
||
wait .1;
|
||
|
||
|
||
flag_set( "safe_from_btrs" );
|
||
level.price thread enable_cqbwalk();
|
||
woods_stealth_path_start = getnode( "price_overlook_stream", "targetname" );
|
||
level.price thread price_smart_path_following( woods_stealth_path_start );
|
||
|
||
thread dialog_russians_looking_for_you();
|
||
thread handle_midwoods();
|
||
}
|
||
|
||
|
||
handle_woods()
|
||
{
|
||
flag_wait( "safe_from_btrs" );
|
||
|
||
thread monitor_player_returns_to_btrs();
|
||
|
||
enemies = GetAISpeciesArray( "axis", "all" );
|
||
foreach( guy in enemies )
|
||
{
|
||
if( distance( level.player.origin, guy.origin ) > 1500 )
|
||
guy delete();
|
||
}
|
||
|
||
|
||
|
||
thread dialog_russians_looking_for_you();
|
||
|
||
level.price notify( "_utility::follow_path" );
|
||
level.price notify( "stop_going_to_node" );// kills the last call to go_to_node
|
||
|
||
level.price.moveplaybackrate = 1;
|
||
//level.price clear_run_anim();
|
||
level.price pushplayer( true );//so he doesnt stop when the player is in front
|
||
sight_ranges_foggy_woods();
|
||
level.price_maxsightdistsqrd_woods = 40*40;
|
||
level.price.maxsightdistsqrd = level.price_maxsightdistsqrd_woods;//keeps him from being jumpy at cover nodes
|
||
|
||
//aiarray = GetAIArray( "axis" );
|
||
//foreach( ai in aiarray )
|
||
// ai delete();
|
||
|
||
//Slow down. They cant follow us this far.
|
||
//iprintlnbold( "Slow down. Their vehicles cant follow us this far." );
|
||
//level.price thread radio_dialogue( "cont_pri_slowdown" );
|
||
level.price thread dialogue_queue( "cont_pri_slowdown" );
|
||
|
||
autosave_stealth();
|
||
|
||
//level.price stealth_fog_smart_stance();
|
||
|
||
//woods_guys = getentarray( "woods_guys", "targetname" );
|
||
//foreach( guy in woods_guys )
|
||
// guy spawn_ai();
|
||
|
||
level.price.sprint = undefined;
|
||
level.price thread enable_cqbwalk();
|
||
woods_stealth_path_start = getnode( "price_woods_path_start", "targetname" );
|
||
level.price thread price_smart_path_following( woods_stealth_path_start );
|
||
|
||
thread handle_midwoods();
|
||
}
|
||
|
||
handle_midwoods()
|
||
{
|
||
sight_ranges_foggy_woods();
|
||
thread dialog_looking_for_us();
|
||
thread dialog_woods_first_patrol();
|
||
thread dialog_woods_first_dog_patrol();
|
||
thread dialog_woods_second_dog_patrol();
|
||
thread dialog_woods_first_stationary();
|
||
thread dialog_woods_blocking_stationary();
|
||
|
||
//level.price thread price_move_speed_think();
|
||
//level.price enable_stealth_smart_stance();
|
||
//level.price enable_dynamic_run_speed();
|
||
//enable_dynamic_run_speed( pushdist, sprintdist, stopdist, jogdist, group, dontChangeMovePlaybackRate )
|
||
|
||
//level.price thread follow_path( woods_stealth_path_start );
|
||
|
||
thread handle_ridge();
|
||
}
|
||
|
||
|
||
start_ridge()
|
||
{
|
||
start = getstruct( "ridge_start_player", "targetname" );
|
||
level.player setOrigin( start.origin );
|
||
level.player setPlayerAngles( start.angles );
|
||
|
||
friendlies = getentarray( "start_friendly", "targetname" );
|
||
//array_thread( friendlies, ::spawn_ai );
|
||
friendly_starts = getstructarray( "ridge_start_friendly", "targetname" );
|
||
|
||
for ( i = 0 ; i < friendlies.size ; i++ )
|
||
{
|
||
friendlies[ i ].origin = friendly_starts[ i ].origin;
|
||
friendlies[ i ].angles = friendly_starts[ i ].angles;
|
||
friendlies[ i ] spawn_ai();
|
||
}
|
||
wait .1;
|
||
|
||
thread handle_ridge();
|
||
}
|
||
|
||
first_uav_sequence()
|
||
{
|
||
|
||
//because of stealth clean up
|
||
//rasta and bricktop could destroy the gauntlets beofre the UAV shows
|
||
if( ( isalive( level.gauntlet_east ) ) && ( isalive( level.gauntlet_west ) ) )
|
||
{
|
||
//ambient_villagers = getentarray( "ambient_villagers", "targetname" );
|
||
//foreach( guy in ambient_villagers )
|
||
// guy spawn_ai();
|
||
|
||
flag_set( "first_uav_spawned" );
|
||
thread dialog_approaching_ridge();
|
||
|
||
|
||
level.uav = spawn_vehicle_from_targetname_and_drive( "first_uav" );
|
||
level.uav playLoopSound( "uav_engine_loop" );
|
||
level.uavRig = spawn( "script_model", level.uav.origin );
|
||
level.uavRig setmodel( "tag_origin" );
|
||
thread UAVRigAiming();
|
||
|
||
|
||
}
|
||
flag_wait( "player_on_ridge" );
|
||
|
||
|
||
if( stealth_is_everything_normal() )
|
||
{
|
||
enemies = GetAISpeciesArray( "axis", "all" );
|
||
foreach( mf in enemies )
|
||
{
|
||
if( !( mf cansee( level.player ) ) )
|
||
mf delete();
|
||
}
|
||
disable_stealth_system();
|
||
}
|
||
else
|
||
{
|
||
disable_stealth_system();
|
||
enemies = GetAISpeciesArray( "axis", "all" );
|
||
foreach( mf in enemies )
|
||
{
|
||
if( distance( mf.origin, level.player.origin ) > 2300 )
|
||
mf delete();
|
||
else
|
||
mf thread setup_stealth_enemy_cleanup();
|
||
}
|
||
|
||
enemies = GetAISpeciesArray( "axis", "all" );
|
||
level.stealth_enemies_remaining = enemies.size;
|
||
while( level.stealth_enemies_remaining > 0 )
|
||
wait 1;
|
||
}
|
||
level.price thread disable_cqbwalk();
|
||
|
||
flag_wait( "price_on_ridge" );
|
||
|
||
if( ( isalive( level.gauntlet_east ) ) && ( isalive( level.gauntlet_west ) ) )
|
||
{
|
||
|
||
level.last_uav_launch_time = gettime();
|
||
|
||
level.player.has_remote_detonator = true;
|
||
level.player giveWeapon( "remote_missile_detonator" );
|
||
level.player SetActionSlot( 4, "weapon", "remote_missile_detonator" );
|
||
|
||
if( !flag( "player_slid_down" ) )
|
||
{
|
||
//This ridge is perfect.
|
||
level.price dialogue_queue( "cont_pri_ridgeisperfect" );
|
||
//radio_dialogue( "cont_pri_ridgeisperfect" );
|
||
|
||
//Roach take control of the UAV.
|
||
level.price dialogue_queue( "cont_pri_controluav" );
|
||
//radio_dialogue( "cont_pri_controluav" );
|
||
|
||
level.player thread display_hint( "hint_predator_drone" );
|
||
}
|
||
|
||
if( !flag( "going_down_ridge" ) )
|
||
wait 3;
|
||
|
||
if( !flag( "going_down_ridge" ) && ( !isdefined( level.player.is_controlling_UAV ) ) )
|
||
wait 3;
|
||
}
|
||
else
|
||
{
|
||
level.last_uav_launch_time = gettime();
|
||
level.player.has_remote_detonator = true;
|
||
level.player giveWeapon( "remote_missile_detonator" );
|
||
level.player SetActionSlot( 4, "weapon", "remote_missile_detonator" );
|
||
}
|
||
|
||
if( ( isalive( level.gauntlet_east ) ) && ( isalive( level.gauntlet_west ) ) )
|
||
{
|
||
flag_set( "first_uav_destroyed" );
|
||
|
||
gauntlet_west = getent( "gauntlet_west", "targetname" );
|
||
stinger_source = spawn( "script_origin", gauntlet_west.origin + (0,0,220) );
|
||
//thread maps\_debug::drawArrowForever ( stinger_source, gauntlet_west.angles );
|
||
|
||
fire_stinger_at_uav( stinger_source );
|
||
|
||
//waht happened?
|
||
dialog_gauntlet_surprise_reaction();
|
||
}
|
||
|
||
if( !flag ( "going_down_ridge" ) )
|
||
{
|
||
//Roach - let's go.
|
||
level.price thread dialogue_queue( "cont_pri_roachletsgo" );
|
||
//thread radio_dialogue( "cont_pri_roachletsgo" );
|
||
}
|
||
|
||
//price moves
|
||
flag_set( "going_down_ridge" );
|
||
}
|
||
|
||
handle_ridge()
|
||
{
|
||
rasta_spawners = getentarray( "rasta", "script_noteworthy" );
|
||
array_thread( rasta_spawners, ::add_spawn_function, ::setup_rasta_village );
|
||
|
||
bricktop_spawners = getentarray( "bricktop", "script_noteworthy" );
|
||
array_thread( bricktop_spawners, ::add_spawn_function, ::setup_bricktop_village );
|
||
|
||
|
||
thread price_slides_down_the_ridge();
|
||
//thread village_spawners();
|
||
|
||
|
||
level.price thread enable_cqbwalk();
|
||
|
||
flag_wait( "approaching_ridge" );
|
||
|
||
level notify( "stop_snow" );
|
||
|
||
//thread village_enemies();
|
||
|
||
level.gauntlet_east = spawn_vehicle_from_targetname( "gauntlet_east" );
|
||
level.gauntlet_west = spawn_vehicle_from_targetname( "gauntlet_west" );
|
||
|
||
level.price disable_ai_color();
|
||
level.price notify( "stop_smart_path_following" );
|
||
ridge_price_overlook = getnode( "ridge_price_overlook", "targetname" );
|
||
level.price setgoalnode( ridge_price_overlook );
|
||
level.price.goalradius = 64;
|
||
level.price notify( "stop_dynamic_run_speed" );
|
||
|
||
|
||
thread first_uav_sequence();
|
||
|
||
flag_wait( "player_slid_down" );
|
||
flag_set( "stop_stealth_music" );
|
||
|
||
thread dialog_roach_change_guns();
|
||
|
||
if( isalive( level.btr_slider ) )
|
||
level.btr_slider delete();
|
||
if( isalive( level.btr_tree_destroyer ) )
|
||
level.btr_tree_destroyer delete();
|
||
|
||
thread price_changes_weapons();
|
||
|
||
autosave_by_name( "village_fight" );
|
||
|
||
thread save_when_x_are_killed();
|
||
|
||
first_villagers = getentarray( "first_villagers", "targetname" );
|
||
foreach( guy in first_villagers )
|
||
guy spawn_ai();
|
||
|
||
//must kill stealth before base
|
||
//flag_wait_either( "first_villagers_dead", "start_village_fight" );
|
||
|
||
disable_stealth_system();
|
||
flag_clear( "_stealth_spotted" );
|
||
|
||
thread spawn_ghosts_team();
|
||
|
||
//thread spawn_village_trucks_at_right_time();
|
||
|
||
|
||
if( isalive( level.gauntlet_east ) )
|
||
level.gauntlet_east waittill( "death" );
|
||
|
||
if( isalive( level.gauntlet_west ) )
|
||
level.gauntlet_west waittill( "death" );
|
||
|
||
//change obj:
|
||
flag_set( "both_gauntlets_destroyed" );
|
||
|
||
add_wait( ::flag_wait, "second_uav_in_position" );
|
||
add_func( ::spawn_second_uav );
|
||
thread do_wait();
|
||
|
||
//timeout the dialog if the player doesnt get close to the guys
|
||
add_wait( ::_wait, 30 );
|
||
add_func( ::flag_set, "start_village_fight" );
|
||
thread do_wait();
|
||
|
||
dialog_rasta_and_bricktop();
|
||
|
||
flag_set( "rasta_and_bricktop_dialog_done" );
|
||
flag_set( "second_uav_in_position" );
|
||
flag_set( "start_village_fight" );
|
||
|
||
autosave_by_name( "village_fight2" );
|
||
|
||
wait 1;
|
||
|
||
level.price thread turn_off_stealth_settings();
|
||
//level.price.colornode_func = ::dialog_moving_to_new_position_in_village;
|
||
|
||
village_defenders = getentarray( "village_defenders", "targetname" );
|
||
foreach( guy in village_defenders )
|
||
guy spawn_ai();
|
||
|
||
//add_wait( ::flag_wait, "second_uav_in_position" );
|
||
//add_func( ::display_hint, "hint_predator_drone" );
|
||
//thread do_wait();
|
||
|
||
//level.player thread display_hint( "hint_predator_drone" );
|
||
|
||
flag_wait( "leaving_village" );
|
||
thread handle_base();
|
||
}
|
||
|
||
|
||
handle_base()
|
||
{
|
||
// MikeD: Disable radio in _remotemissile until the dialog for the base is complete.
|
||
level.uav_radio_disabled = true;
|
||
|
||
level.price thread dead_vehicle_blocking_path();
|
||
level.rasta thread dead_vehicle_blocking_path();
|
||
|
||
alive = 0;
|
||
f_guys = getaiarray( "allies" );
|
||
{
|
||
foreach( f in f_guys )
|
||
{
|
||
if( ( f == level.rasta ) || ( f == level.price ) )
|
||
continue;
|
||
alive++;
|
||
f thread replace_on_death();
|
||
}
|
||
}
|
||
|
||
desired = 3 - alive;
|
||
start_of_base_redshirt = getentarray( "start_of_base_redshirt", "targetname" );
|
||
for( i = 0 ; i < desired ; i++ )
|
||
{
|
||
start_of_base_redshirt[ i ] spawn_ai();
|
||
}
|
||
|
||
thread dialog_second_uav_in_position();
|
||
|
||
thread base_autosave_logic();
|
||
level notify( "stop_snow" );
|
||
//stealth + color node system
|
||
thread setup_friendlies_for_base();
|
||
|
||
//get rid of village enemies
|
||
retreat_pos = getstruct( "village_enemies_retreat_pos", "targetname" ).origin;
|
||
enemies = getaiarray( "axis" );
|
||
foreach( mf in enemies )
|
||
mf thread village_enemies_setup_retreat( retreat_pos );
|
||
|
||
//spawn stuff thats unaware:
|
||
|
||
sight_ranges_foggy_woods();
|
||
|
||
base_starting_guys = getentarray( "base_starting_guys", "targetname" );
|
||
foreach( guy in base_starting_guys )
|
||
{
|
||
guy spawn_ai();
|
||
}
|
||
|
||
thread setup_base_idling_vehicles();
|
||
thread nag_player_to_destroy_btr();
|
||
|
||
add_wait( ::waittill_base_alerted );
|
||
add_func( ::flag_set, "base_alerted" );
|
||
thread do_wait();
|
||
|
||
|
||
thread dialog_sub_spotted();
|
||
|
||
flag_wait( "base_alerted" );
|
||
|
||
thread base_arrival_music();
|
||
|
||
disable_stealth_system();
|
||
|
||
|
||
thread base_alarm_sound();
|
||
|
||
wait 1;
|
||
|
||
thread dialog_base_on_alert();
|
||
thread dialog_progress_through_base();
|
||
activate_trigger_with_targetname( "friendlies_enter_base" );
|
||
thread timer_start();
|
||
|
||
|
||
friendlies = getaiarray( "allies" );
|
||
foreach( g in friendlies )
|
||
g thread turn_off_stealth_settings();
|
||
|
||
if( isalive( level.base_btr2 ) )
|
||
{
|
||
end_if_cant_see = false;
|
||
no_misses = false;
|
||
level.base_btr2 thread bmp_turret_attack_player( end_if_cant_see, no_misses );
|
||
}
|
||
|
||
if( isalive( level.base_truck1 ) )
|
||
{
|
||
level.base_truck1 thread unload_base_truck();
|
||
}
|
||
|
||
wait 2;
|
||
|
||
if( isalive( level.base_heli ) )
|
||
{
|
||
thread gopath( level.base_heli );
|
||
level.base_heli.circling = true;
|
||
level.base_heli.no_attractor = true;
|
||
level.base_heli = thread maps\_attack_heli::begin_attack_heli_behavior( level.base_heli );
|
||
}
|
||
|
||
//flag_wait( "player_is_halfway_to_sub" );
|
||
|
||
|
||
thread handle_defend_sub();
|
||
}
|
||
|
||
|
||
|
||
|
||
handle_defend_sub()
|
||
{
|
||
flag_wait( "price_splits_off" );
|
||
|
||
|
||
thread kill_helicopter_fail_safe();
|
||
|
||
if( isalive( level.base_btr2 ) )
|
||
{
|
||
level.base_btr2 kill();
|
||
wait 3;
|
||
}
|
||
|
||
flag_clear( "respawn_friendlies" );
|
||
autosave_by_name( "defend" );
|
||
|
||
//obj_guard_house
|
||
thread setup_vehicle_gate( "gate1" );
|
||
thread setup_vehicle_gate( "gate2" );
|
||
|
||
level.price.colornode_func = undefined;
|
||
|
||
killTimer();
|
||
|
||
thread dialog_price_splits_off();
|
||
|
||
level.price disable_ai_color();
|
||
price_key_pos = getent( "price_key_pos", "targetname" );
|
||
level.price setgoalpos( price_key_pos.origin );
|
||
level.price.goalradius = 64;
|
||
|
||
wait 4;
|
||
|
||
greens = get_force_color_guys( "allies", "g" );
|
||
array_thread( greens, ::set_force_color, "b" );
|
||
|
||
activate_trigger_with_targetname( "friendlies_go_to_guardhouse" );
|
||
|
||
thread setup_defend_sub_vehicles();
|
||
|
||
|
||
enemies = getaiarray( "axis" );
|
||
foreach( guy in enemies )
|
||
{
|
||
guy.combatmode = "cover";
|
||
guy setgoalpos( level.player.origin );
|
||
}
|
||
|
||
flag_wait( "price_inside_sub" );
|
||
|
||
//All right, I'm inside the sub! Cover me, I need a few minutes!
|
||
radio_dialogue( "cont_pri_insidesub" );
|
||
|
||
//Alert! The use of nuclear weapons has been authorized.
|
||
|
||
//Launch codes verified authentic. Launch codes accepted.
|
||
//Set condition one-SQ. Nuclear missile launch authorized.
|
||
//Now spinning up missiles 1 through 4 and 8 through 12 for strategic missile launch<63>
|
||
//Target package 572 has been authorized. Standing by for target confirmation and launch order.
|
||
|
||
flag_wait_or_timeout( "defend_sub_vehicle_guys_dead", 50 );
|
||
flag_wait( "player_on_guardhouse" );
|
||
|
||
flee_pos = getstruct( "sub_obj_enemies_flee", "targetname" ).origin;
|
||
enemies = getaiarray( "axis" );
|
||
foreach( guy in enemies )
|
||
guy thread enemies_flee( flee_pos );
|
||
|
||
|
||
stinger_source = getent( "defend_sub_stinger_source", "targetname" );
|
||
//thread maps\_debug::drawArrowForever ( stinger_source, gauntlet_west.angles );
|
||
fire_stinger_at_uav( stinger_source );
|
||
|
||
thread breakforsub_music();
|
||
println( "^3z: thread breakforsub_music(); " );
|
||
//thread debug_timer();
|
||
|
||
wait 1;
|
||
|
||
autosave_by_name( "defend2" );
|
||
|
||
defend_sub_final_guys = getentarray( "defend_sub_final_guys", "targetname" );
|
||
foreach( guy in defend_sub_final_guys )
|
||
guy spawn_ai();
|
||
|
||
wait 5;
|
||
activate_trigger_with_targetname( "contacts_south" );
|
||
|
||
|
||
//Contact to the south, on the dock next to the sub!
|
||
level.rasta dialogue_queue( "cont_gst_nexttosub" );
|
||
|
||
flag_set( "close_sub_hatch" );
|
||
|
||
battlechatter_off( "allies" );
|
||
battlechatter_off( "axis" );
|
||
|
||
wait 10;
|
||
|
||
thread open_sub_missile_doors();
|
||
|
||
wait 4;
|
||
|
||
flee_pos = getstruct( "contacts_south_flee_pos", "targetname" ).origin;
|
||
enemies = getaiarray( "axis" );
|
||
foreach( guy in enemies )
|
||
{
|
||
//if( !isdefined( guy.targetname ) )
|
||
// continue;
|
||
//if( guy.targetname == "defend_sub_final_guys" )
|
||
guy thread enemies_flee( flee_pos );
|
||
}
|
||
|
||
ai = getaiarray();
|
||
foreach( guy in ai )
|
||
guy.dontevershoot = true;
|
||
|
||
//Price, are you there? The silo doors are opening on the sub, I repeat, the silo doors are opening on the sub!
|
||
level.rasta dialogue_queue( "cont_gst_youthere" );
|
||
|
||
wait 2.4;
|
||
|
||
//Price, come in!! They're opening the silo doors on the sub!!! Hurry!!!
|
||
level.rasta dialogue_queue( "cont_gst_comein" );
|
||
|
||
wait 2;
|
||
|
||
//Price, do you copy??? The silo doors are open, I repeat, the silo doors are open!!
|
||
level.rasta dialogue_queue( "cont_gst_doyoucopy" );
|
||
|
||
wait 1;
|
||
|
||
//Good.
|
||
radio_dialogue( "cont_pri_good2" );
|
||
|
||
thread launch_nuke();
|
||
|
||
|
||
//What<61>? Wait...wait, Price - no!!!
|
||
level.rasta dialogue_queue( "cont_gst_whatwait" );
|
||
|
||
wait 2;
|
||
|
||
//We have a nuclear missile launch, missile in the air missile in the air!! Code black code black!!
|
||
level.rasta dialogue_queue( "cont_gst_codeblack" );
|
||
|
||
//Price what have you done???
|
||
//level.rasta dialogue_queue( "cont_gst_whathaveyoudone" );
|
||
wait 1;
|
||
|
||
|
||
//flee_pos = getstruct( "dock_enemies_flee", "targetname" ).origin;
|
||
//enemies = getaiarray( "axis" );
|
||
//foreach( guy in enemies )
|
||
// guy thread enemies_flee( flee_pos );
|
||
|
||
|
||
//wait 15;
|
||
|
||
|
||
//iprintlnbold( "Next Mission" );
|
||
nextmission();
|
||
}
|
||
|
||
//debug_timer()
|
||
//{
|
||
// time = 0;
|
||
// while( 1 )
|
||
// {
|
||
// println( "time " + time );
|
||
// time++;
|
||
// wait 1;
|
||
// }
|
||
//}
|
||
|
||
|
||
//
|
||
//
|
||
//start_sub()
|
||
//{
|
||
// start = getstruct( "sub_start_player", "targetname" );
|
||
// level.player setOrigin( start.origin );
|
||
// level.player setPlayerAngles( start.angles );
|
||
//
|
||
// friendlies = getentarray( "start_friendly", "targetname" );
|
||
// friendlies2 = getentarray( "rasta_and_bricktop", "targetname" );
|
||
// friendlies = array_combine( friendlies, friendlies2 );
|
||
//
|
||
// //array_thread( friendlies, ::spawn_ai );
|
||
// friendly_starts = getstructarray( "sub_start_friendly", "targetname" );
|
||
//
|
||
// for ( i = 0 ; i < friendlies.size ; i++ )
|
||
// {
|
||
// friendlies[ i ].origin = friendly_starts[ i ].origin;
|
||
// friendlies[ i ].angles = friendly_starts[ i ].angles;
|
||
// friendlies[ i ] spawn_ai();
|
||
// }
|
||
// flag_set( "stop_stealth_music" );
|
||
// music_stop();
|
||
//
|
||
// level.player takeallweapons();
|
||
// level.player giveWeapon( "aa12" );
|
||
// level.player giveWeapon( "m240_heartbeat_reflex_arctic" );
|
||
// level.player switchToWeapon( "m240_heartbeat_reflex_arctic" );
|
||
//
|
||
// level.player giveWeapon( "fraggrenade" );
|
||
// level.player setOffhandSecondaryClass( "flash" );
|
||
// level.player giveWeapon( "flash_grenade" );
|
||
//
|
||
//
|
||
// wait .1;
|
||
//
|
||
// level.rasta set_force_color( "g" );
|
||
// level.rasta enable_ai_color();
|
||
// level.bricktop set_force_color( "g" );
|
||
// level.bricktop enable_ai_color();
|
||
// level.price set_force_color( "g" );
|
||
// level.price enable_ai_color();
|
||
//
|
||
// level.price forceUseWeapon( "aug_scope", "primary" );
|
||
//
|
||
// disable_stealth_system();
|
||
//
|
||
// friendlies = getaiarray( "allies" );
|
||
// foreach( g in friendlies )
|
||
// g thread turn_off_stealth_settings();
|
||
//
|
||
// thread spawn_second_uav();
|
||
// flag_set( "player_on_ridge" );
|
||
// flag_set( "leaving_village" );
|
||
//
|
||
// thread handle_sub();
|
||
//}
|
||
//
|
||
//start_sub_gas_mask()
|
||
//{
|
||
// start_sub();
|
||
//
|
||
// wait 2;
|
||
//
|
||
// thread put_on_player_gas_mask();
|
||
//}
|
||
//
|
||
//
|
||
//handle_sub()
|
||
//{
|
||
// level notify( "stop_snow" );
|
||
// thread start_tear_gas_fx();
|
||
// thread start_tear_gas_guys();
|
||
// thread sub_ladder();
|
||
// flag_wait( "friendlies_or_player_at_sub" );
|
||
//
|
||
// flee_pos = getstruct( "sub_obj_enemies_flee", "targetname" ).origin;
|
||
// enemies = getaiarray( "axis" );
|
||
// foreach( guy in enemies )
|
||
// guy thread enemies_flee( flee_pos );
|
||
//
|
||
//
|
||
// level.price.colornode_func = undefined;
|
||
// thread dialog_at_sub();
|
||
//
|
||
// flag_wait( "obj_sub_entrance" );//player at sub
|
||
//
|
||
//
|
||
// level.price disable_ai_color();
|
||
// price_on_sub = getnode( "price_on_sub", "targetname" );
|
||
// level.price setgoalnode( price_on_sub );
|
||
//
|
||
// flag_wait( "player_on_sub" );
|
||
//
|
||
// //Roach! Get your mask on!
|
||
// level.price dialogue_queue( "cont_pri_getmaskon" );
|
||
// thread put_on_player_gas_mask();
|
||
//
|
||
// if( !flag( "player_dropping_into_sub" ) )
|
||
// {
|
||
// //Down the hatch, lets go!
|
||
// level.price thread dialogue_queue( "cont_pri_downthehatch" );
|
||
// }
|
||
//
|
||
// flag_wait( "player_dropping_into_sub" );
|
||
//
|
||
// if( isalive( level.rasta ) )
|
||
// level.rasta kill();
|
||
// if( isalive( level.bricktop ) )
|
||
// level.bricktop kill();
|
||
// level.price set_battlechatter( false );
|
||
//
|
||
// killTimer();
|
||
//
|
||
//
|
||
// flag_wait( "player_is_clear_of_ladder" );
|
||
//
|
||
// price_drop_pos = getent( "price_drop_pos", "targetname" );
|
||
//
|
||
// price_drop_kill_pos = getent( "price_drop_kill_pos", "targetname" );
|
||
// level.price setgoalpos( price_drop_kill_pos.origin );
|
||
//
|
||
// price_drop_bottom_pos = getent( "price_drop_bottom_pos", "targetname" );
|
||
//
|
||
// level.price forceteleport( price_drop_bottom_pos.origin, price_drop_bottom_pos.angles );
|
||
//
|
||
// level.price.goalradius = 64;
|
||
// level.price.baseaccuracy = 500000;
|
||
// //level.price.shootstyleoverride = "single";
|
||
// level.price.a.specialShootBehavior = ::single_shots;
|
||
//
|
||
// flag_wait( "tear_gas_guys_dead" );
|
||
//
|
||
// thread spawn_sub_enemies();
|
||
//
|
||
// price_key_pos = getent( "price_key_pos", "targetname" );
|
||
// level.price setgoalpos( price_key_pos.origin );
|
||
// level.price.goalradius = 64;
|
||
// level.price.ignoreall = true;
|
||
// level.price.ignoreme = true;
|
||
//
|
||
// //Roach! I need a few minutes! Cover me!
|
||
// level.price dialogue_queue( "cont_pri_needfewminutes" );
|
||
//
|
||
// //Alert! The use of nuclear weapons has been authorized.
|
||
//
|
||
// //Price! I'm on my way to the east gate with our transport, over!
|
||
// radio_dialogue( "cont_cmt_eastgate" );
|
||
//
|
||
// //Copy that Soap!
|
||
// level.price dialogue_queue( "cont_pri_copythatsoap" );
|
||
//
|
||
// //Launch codes verified authentic. Launch codes accepted.
|
||
// //Set condition one-SQ. Nuclear missile launch authorized.
|
||
// //Now spinning up missiles 1 through 4 and 8 through 12 for strategic missile launch<63>
|
||
// //Target package 572 has been authorized. Standing by for target confirmation and launch order.
|
||
//
|
||
// //Roach! I'm almost done! Hold your ground!!
|
||
// level.price dialogue_queue( "cont_pri_almostdone" );
|
||
//
|
||
// //Price! How much longer do you need to sink the sub? We're almost at the gate!
|
||
// radio_dialogue( "cont_cmt_muchlonger" );
|
||
//
|
||
// //Soap, I'm not sinking the sub - I'm launching the nukes.
|
||
// level.price dialogue_queue( "cont_pri_notsinking" );
|
||
//
|
||
// //The bloody hell you are!!!!
|
||
// radio_dialogue( "cont_cmt_bloodyhell" );
|
||
//
|
||
// thread activate_players_key();
|
||
//
|
||
// //There's no time to explain! Roach! Turn that key over there! Hurry! They've scrambled MiGs to take us out!
|
||
// level.price dialogue_queue( "cont_pri_notime" );
|
||
//
|
||
// level notify( "stop_sub_enemies" );
|
||
// thread dialog_turn_key_nags();
|
||
//
|
||
// flag_wait( "player_turned_key" );
|
||
// thread handle_exit_sub();
|
||
//
|
||
// //Missiles are ready for launch. Ten<65>Nine<6E>Eight<68>Seven<65>Six...Five<76>Four<75>Three<65>Two<77>One<6E>ignition on missiles 1 through 4 and 8 through 12 for strategic missile launch.
|
||
//}
|
||
//
|
||
//
|
||
//start_exit_sub()
|
||
//{
|
||
// start = getstruct( "exit_sub_start_player", "targetname" );
|
||
// level.player setOrigin( start.origin );
|
||
// level.player setPlayerAngles( start.angles );
|
||
//
|
||
// friendlies = getentarray( "start_friendly", "targetname" );
|
||
// //friendlies2 = getentarray( "rasta_and_bricktop", "targetname" );
|
||
// //friendlies = array_combine( friendlies, friendlies2 );
|
||
//
|
||
// //array_thread( friendlies, ::spawn_ai );
|
||
// friendly_starts = getstructarray( "exit_sub_start_friendly", "targetname" );
|
||
//
|
||
// for ( i = 0 ; i < friendlies.size ; i++ )
|
||
// {
|
||
// friendlies[ i ].origin = friendly_starts[ i ].origin;
|
||
// friendlies[ i ].angles = friendly_starts[ i ].angles;
|
||
// friendlies[ i ] spawn_ai();
|
||
// }
|
||
// flag_set( "stop_stealth_music" );
|
||
// music_stop();
|
||
//
|
||
// level.player takeallweapons();
|
||
// level.player giveWeapon( "aa12" );
|
||
// level.player giveWeapon( "m240_heartbeat_reflex_arctic" );
|
||
// level.player switchToWeapon( "m240_heartbeat_reflex_arctic" );
|
||
//
|
||
// level.player giveWeapon( "fraggrenade" );
|
||
// level.player setOffhandSecondaryClass( "flash" );
|
||
// level.player giveWeapon( "flash_grenade" );
|
||
//
|
||
//
|
||
// wait .1;
|
||
//
|
||
// //level.rasta set_force_color( "g" );
|
||
// //level.rasta enable_ai_color();
|
||
// //level.bricktop set_force_color( "g" );
|
||
// //level.bricktop enable_ai_color();
|
||
// //level.price set_force_color( "g" );
|
||
// //level.price enable_ai_color();
|
||
//
|
||
// level.price forceUseWeapon( "aug_scope", "primary" );
|
||
//
|
||
// disable_stealth_system();
|
||
//
|
||
// friendlies = getaiarray( "allies" );
|
||
// foreach( g in friendlies )
|
||
// g thread turn_off_stealth_settings();
|
||
//
|
||
// thread spawn_second_uav();
|
||
// flag_set( "player_on_ridge" );
|
||
// flag_set( "leaving_village" );
|
||
//
|
||
// thread handle_exit_sub();
|
||
//}
|
||
//
|
||
//handle_exit_sub()
|
||
//{
|
||
// level notify( "stop_snow" );
|
||
// level.soap_truck = spawn_vehicle_from_targetname( "soap_truck" );
|
||
// level.soap_truck.dontunloadonend = true;
|
||
//
|
||
//
|
||
// price_wait_for_truck_node = getnode( "price_wait_for_truck_node", "targetname" );
|
||
// level.price setgoalnode( price_wait_for_truck_node );
|
||
//
|
||
// //We're done here! Let's go!
|
||
// level.price thread dialogue_queue( "cont_pri_donehereletsgo" );
|
||
//
|
||
//
|
||
// flag_wait( "player_on_sub" );
|
||
//
|
||
// flee_pos = getstruct( "exit_sub_start_player", "targetname" ).origin;
|
||
// enemies = getaiarray( "axis" );
|
||
// foreach( guy in enemies )
|
||
// guy thread enemies_flee( flee_pos );
|
||
//
|
||
// thread gopath( level.soap_truck );
|
||
//
|
||
// level.uaz = level.soap_truck;
|
||
// level.uaz thread uaz_control();
|
||
//
|
||
// //Roach! Get to the truck! Move! Move!!
|
||
// level.price thread dialogue_queue( "cont_pri_gettotruck" );
|
||
//
|
||
// flag_wait( "soap_truck_arrived" );
|
||
//
|
||
// friendlies = [];
|
||
// friendlies[ friendlies.size ] = level.price;
|
||
// level.soap_truck thread vehicle_load_ai( friendlies );
|
||
//
|
||
//
|
||
// flag_wait( "player_in_uaz" );
|
||
//
|
||
// soap_truck_reverse_path = getvehiclenode( "soap_truck_reverse_path", "targetname" );
|
||
// soap_truck_exit_path = getvehiclenode( "soap_truck_exit_path", "targetname" );
|
||
//
|
||
//
|
||
//
|
||
// level.soap_truck StartPath( soap_truck_reverse_path );
|
||
// //soap_truck thread maps\_vehicle::vehicle_paths( soap_truck_reverse_path );
|
||
// //soap_truck.veh_pathdir = "reverse";
|
||
// //soap_truck.veh_transmission = "reverse";
|
||
//
|
||
// wait 6;
|
||
//
|
||
// thread launch_nuke();
|
||
//
|
||
// //flag_wait( "soap_truck_finished_reverse" );
|
||
//
|
||
// //Sometimes you can't end a war with a bullet, Soap.
|
||
// level.price dialogue_queue( "cont_pri_endawar" );
|
||
//
|
||
// wait 2;
|
||
//
|
||
// level.soap_truck StartPath( soap_truck_exit_path );
|
||
// //soap_truck thread maps\_vehicle::vehicle_paths( soap_truck_exit_path );
|
||
// //soap_truck.veh_pathdir = "forward";
|
||
// //soap_truck.veh_transmission = "forward";
|
||
//
|
||
//
|
||
//
|
||
// //level waittill( "forever" );
|
||
//
|
||
//
|
||
// //iprintlnbold( "end of scripting" );
|
||
//
|
||
// wait 4;
|
||
//
|
||
// nextmission();
|
||
//}
|
||
|
||
|
||
|
||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
////***********************************************************************************************************************
|
||
////***********************************************************************************************************************
|
||
////***********************************************************************************************************************
|
||
////***********************************************************************************************************************
|
||
////***********************************************************************************************************************
|
||
////***********************************************************************************************************************
|
||
////***********************************************************************************************************************
|
||
////***********************************************************************************************************************
|
||
////***********************************************************************************************************************
|
||
////***********************************************************************************************************************
|
||
////***********************************************************************************************************************
|
||
////***********************************************************************************************************************
|
||
////***********************************************************************************************************************
|
||
////***********************************************************************************************************************
|
||
////***********************************************************************************************************************
|
||
////***********************************************************************************************************************
|
||
////***********************************************************************************************************************
|
||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
////***********************************************************************************************************************
|
||
////***********************************************************************************************************************
|
||
////***********************************************************************************************************************
|
||
////***********************************************************************************************************************
|
||
////***********************************************************************************************************************
|
||
////***********************************************************************************************************************
|
||
////***********************************************************************************************************************
|
||
////***********************************************************************************************************************
|
||
////***********************************************************************************************************************
|
||
////***********************************************************************************************************************
|
||
////***********************************************************************************************************************
|
||
////***********************************************************************************************************************
|
||
////***********************************************************************************************************************
|
||
////***********************************************************************************************************************
|
||
////***********************************************************************************************************************
|
||
////***********************************************************************************************************************
|
||
////***********************************************************************************************************************
|
||
////***********************************************************************************************************************
|
||
////***********************************************************************************************************************
|
||
////***********************************************************************************************************************
|
||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
||
base_arrival_music()
|
||
{
|
||
flag_set( "stop_stealth_music" );
|
||
music_stop( .5 );
|
||
wait 1;
|
||
|
||
level endon( "stop_base_arrival_music" );
|
||
music_TIME = musicLength( "contingency_base_arrival" );
|
||
|
||
while( 1 )
|
||
{
|
||
MusicPlayWrapper( "contingency_base_arrival" );
|
||
wait music_TIME;
|
||
}
|
||
}
|
||
|
||
breakforsub_music()
|
||
{
|
||
flag_set( "stop_stealth_music" );
|
||
level notify( "stop_base_arrival_music" );
|
||
music_stop( 1 );
|
||
//wait .1;
|
||
//MusicPlayWrapper( "contingency_breakforsub" );
|
||
level.player playsound( "contingency_breakforsub" );
|
||
}
|
||
|
||
save_when_x_are_killed()
|
||
{
|
||
start_amount = level.enemies_killed;
|
||
needed = 20 + start_amount;
|
||
|
||
while( level.enemies_killed < needed )
|
||
wait 1;
|
||
|
||
autosave_by_name( "x_killed" );
|
||
}
|
||
|
||
|
||
magic_break_stealth()
|
||
{
|
||
flag_wait( "magic_break_stealth" );
|
||
enemies = GetAISpeciesArray( "axis", "all" );
|
||
if( enemies.size > 0 )
|
||
enemies[0].favoriteenemy = level.player;
|
||
}
|
||
|
||
dialog_roach_change_guns()
|
||
{
|
||
wait 4;
|
||
weap = level.player getcurrentweapon();
|
||
if( ( weap == level.starting_sidearm ) || ( weap == level.starting_rifle ) )
|
||
{
|
||
//Roach, they know we're here. You might want to grab a different weapon.
|
||
level.price dialogue_queue( "cont_pri_grabweapon" );
|
||
}
|
||
}
|
||
|
||
spawn_ghosts_team()
|
||
{
|
||
bricktop_spawner = getent( "bricktop", "script_noteworthy" );
|
||
bricktop_spawner spawn_ai();
|
||
rasta_spawner = getent( "rasta", "script_noteworthy" );
|
||
rasta_spawner spawn_ai();
|
||
|
||
if( isalive( level.gauntlet_east ) )
|
||
level.gauntlet_east waittill( "death" );
|
||
|
||
other_guys = getentarray( "village_redshirt", "script_noteworthy" );
|
||
foreach( guy in other_guys )
|
||
guy spawn_ai();
|
||
}
|
||
|
||
dialog_second_uav_in_position()
|
||
{
|
||
//Soap - Rasta and Bricktop are here.
|
||
level.price dialogue_queue( "cont_pri_rastaandbricktop" );
|
||
|
||
//Roger that. The second UAV is almost in position.
|
||
radio_dialogue( "cont_cmt_2nduav" );
|
||
|
||
flag_set( "said_second_uav_in_position" );
|
||
}
|
||
|
||
fake_treads()
|
||
{
|
||
self thread maps\_vehicle::tread( "tag_wheel_back_left", "back_left", undefined, undefined, 25 );
|
||
self thread maps\_vehicle::tread( "tag_wheel_back_right", "back_right", undefined, undefined, 25 );
|
||
wait 8;
|
||
self notify( "kill_treads_forever" );
|
||
}
|
||
|
||
faster_price_if_player_close()
|
||
{
|
||
level.player endon( "death" );
|
||
level endon( "safe_from_btrs" );
|
||
while( 1 )
|
||
{
|
||
wait .1;
|
||
|
||
if( distance( level.player.origin, level.price.origin ) < 400 )
|
||
{
|
||
level.price.moveplaybackrate = 1;
|
||
}
|
||
else
|
||
{
|
||
vec2 = VectorNormalize( ( level.player.origin - level.price.origin ) );
|
||
vec = anglestoforward( level.price.angles );
|
||
vecdot = vectordot( vec, vec2 );//dot of my angle vs player position
|
||
|
||
//vecdot > 0 means in 180 in front
|
||
if( vecdot > 0 )// player is in front of me
|
||
level.price.moveplaybackrate = 1;
|
||
else
|
||
level.price.moveplaybackrate = .9;
|
||
}
|
||
}
|
||
}
|
||
|
||
dialog_price_splits_off()
|
||
{
|
||
//I'm going for the sub!
|
||
level.price dialogue_queue( "cont_pri_goingforsub" );
|
||
//Cover me from that guardhouse by the west gate!
|
||
level.price dialogue_queue( "cont_pri_coverme" );
|
||
//Roger that!
|
||
level.rasta dialogue_queue( "cont_gst_rogerthat" );
|
||
//Roach, we have to get to that guardhouse by the west gate to cover Price! Follow me!
|
||
level.rasta dialogue_queue( "cont_gst_guardhouse" );
|
||
|
||
while( !flag( "player_on_guardhouse" ) )
|
||
{
|
||
wait 20;
|
||
if( flag( "player_on_guardhouse" ) )
|
||
return;
|
||
//Cover me from that guardhouse by the west gate!
|
||
level.price dialogue_queue( "cont_pri_coverme" );
|
||
|
||
wait 20;
|
||
|
||
if( flag( "player_on_guardhouse" ) )
|
||
return;
|
||
//Roach, we have to get to that guardhouse by the west gate to cover Price! Follow me!
|
||
level.rasta dialogue_queue( "cont_gst_guardhouse" );
|
||
}
|
||
}
|
||
|
||
setup_defend_sub_vehicles()
|
||
{
|
||
wait 24;
|
||
|
||
level.defend_sub_truck2 = spawn_vehicle_from_targetname_and_drive( "defend_sub_truck2" );
|
||
level.defend_sub_truck2 thread friendlies_shoot_at_truck_until_its_unloads();
|
||
level.defend_sub_truck2 thread dialog_destroyed_vehicle( "cont_cmt_goodkilltruck" );
|
||
wait 1;
|
||
level.defend_sub_truck3 = spawn_vehicle_from_targetname_and_drive( "defend_sub_truck3" );
|
||
level.defend_sub_truck3 thread friendlies_shoot_at_truck_until_its_unloads();
|
||
level.defend_sub_truck3 thread dialog_destroyed_vehicle( "cont_cmt_goodkilltruck" );
|
||
wait 3;
|
||
|
||
|
||
//Incoming! Two trucks to the east!
|
||
level.rasta thread dialogue_queue( "cont_gst_twotruckseast" );
|
||
|
||
|
||
wait 15;
|
||
|
||
level.defend_sub_truck1 = spawn_vehicle_from_targetname_and_drive( "defend_sub_truck1" );
|
||
level.defend_sub_truck1 thread friendlies_shoot_at_truck_until_its_unloads();
|
||
level.defend_sub_truck1 thread dialog_destroyed_vehicle( "cont_cmt_goodkilltruck" );
|
||
wait 2;
|
||
level.defend_sub_jeep1 = spawn_vehicle_from_targetname_and_drive( "defend_sub_jeep1" );
|
||
level.defend_sub_jeep1 thread friendlies_shoot_at_truck_until_its_unloads();
|
||
level.defend_sub_jeep1 thread dialog_destroyed_vehicle( "cont_cmt_goodkilltruck" );
|
||
|
||
//level.defend_sub_btr1 = spawn_vehicle_from_targetname_and_drive( "defend_sub_btr1" );
|
||
//level.defend_sub_btr1 thread friendlies_shoot_at_truck_until_its_unloads();
|
||
//level.defend_sub_btr1 thread vehicle_lights_on( "spotlight spotlight_turret" );
|
||
wait 3;
|
||
|
||
//More vehicles to the east! Use the Hellfires!
|
||
level.rasta thread dialogue_queue( "cont_gst_morevehicleseast" );
|
||
|
||
//wait 8;
|
||
//if( isalive( level.defend_sub_btr1 ) )
|
||
//{
|
||
// end_if_cant_see = false;
|
||
// no_misses = false;
|
||
// level.defend_sub_btr1 thread bmp_turret_attack_player( end_if_cant_see, no_misses );
|
||
//}
|
||
}
|
||
|
||
setup_vehicle_gate( stringname )
|
||
{
|
||
flag_wait( stringname );
|
||
gates = getentarray( stringname, "targetname" );
|
||
foreach( gate in gates )
|
||
{
|
||
dir = -160;
|
||
if( gate.script_noteworthy == "left" )
|
||
dir = 160;
|
||
|
||
gate movex( dir, 2, 1, 0 );
|
||
}
|
||
|
||
while( 1 )
|
||
{
|
||
flag_clear( stringname );
|
||
wait .2;
|
||
if( !flag( stringname ) )
|
||
break;
|
||
}
|
||
|
||
|
||
foreach( gate in gates )
|
||
{
|
||
dir = 160;
|
||
if( gate.script_noteworthy == "left" )
|
||
dir = -160;
|
||
|
||
gate movex( dir, 2, 1, 0 );
|
||
}
|
||
}
|
||
|
||
setup_sub_hatch()
|
||
{
|
||
sub_hatch_th = getent( "sub_hatch_th", "targetname" );
|
||
sub_hatch_th trigger_off();
|
||
hatch_model = getent( "hatch_model", "targetname" );
|
||
hatch_model_collision = getent( "hatch_model_collision", "targetname" );
|
||
hatch_model_collision linkto( hatch_model );
|
||
hatch_model rotatepitch( 120, .05 );
|
||
|
||
flag_wait( "close_sub_hatch" );
|
||
hatch_model rotatepitch( -120, 5 );
|
||
wait 2;
|
||
sub_hatch_th trigger_on();
|
||
wait 4;
|
||
sub_hatch_th trigger_off();
|
||
}
|
||
|
||
|
||
open_sub_missile_doors()
|
||
{
|
||
sub_missile_doors = getentarray( "sub_missile_door", "targetname" );
|
||
|
||
current_side = "left";
|
||
current_num = 1;
|
||
open_time = 2;
|
||
shake_time = .1;
|
||
time_between_doors = 1.6;
|
||
|
||
while( 1 )
|
||
{
|
||
foreach( door in sub_missile_doors )
|
||
{
|
||
if( ( door.script_noteworthy == current_side ) && ( int( door.script_namenumber ) == current_num ) )
|
||
{
|
||
door thread open_sub_missile_door_action( open_time, shake_time );
|
||
|
||
if( current_side == "left" )
|
||
{
|
||
current_side = "right";
|
||
}
|
||
else
|
||
{
|
||
current_side = "left";
|
||
current_num++;
|
||
}
|
||
if( current_num > 4 )
|
||
return;
|
||
wait time_between_doors;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
open_sub_missile_door_action( open_time, shake_time )
|
||
{
|
||
org = Spawn( "script_origin", ( 0, 0, 1 ) );
|
||
org.origin = self.origin;
|
||
org PlaySound( "missile_hatch_slams_open", "sounddone" );
|
||
|
||
door = self;
|
||
if( door.script_noteworthy == "left" )
|
||
door rotateroll( -60, open_time, .2 );
|
||
else
|
||
door rotateroll( 60, open_time, .2 );
|
||
|
||
wait open_time;
|
||
door rotateroll( -1, shake_time );
|
||
wait shake_time;
|
||
door rotateroll( 1, shake_time );
|
||
wait shake_time;
|
||
|
||
wait 1;
|
||
org stopsounds();
|
||
wait 1;
|
||
org delete();
|
||
}
|
||
|
||
dialog_looking_for_us()
|
||
{
|
||
flag_wait( "first_patrol_cqb" );
|
||
first_patrol_cqb = getentarray( "first_patrol_cqb", "targetname" );
|
||
foreach( guy in first_patrol_cqb )
|
||
guy spawn_ai();
|
||
|
||
wait 6;
|
||
|
||
//Looks like they're searching for us.
|
||
radio_dialogue( "cont_pri_searchingforus" );
|
||
}
|
||
|
||
launch_nuke()
|
||
{
|
||
//level.player playsound( "scn_icbm_missile_launch" );
|
||
//icbm_missile01 thread play_loop_sound_on_entity( "scn_icbm_missile2_loop" );
|
||
|
||
|
||
icbm_missile01 = getent( "icbm_missile01", "targetname" );
|
||
missile01_start = getent( "missile01_start", "targetname" );
|
||
missile01_end = getent( "missile01_end", "targetname" );
|
||
|
||
//PlayFX( getfx("icbm_launch") , icbm_missile01.origin );
|
||
|
||
//Earthquake( <scale>, <duration>, <source>, <radius> )
|
||
earthquake( 0.3, 12, icbm_missile01.origin, 8000 );
|
||
|
||
level.player PlayRumbleLoopOnEntity( "tank_rumble" );
|
||
level.player delaycall( 8.0, ::stopRumble, "tank_rumble" );
|
||
|
||
icbm_missile01 playsound( "scn_con_icbm_ignition" );
|
||
|
||
icbm_missile01 linkto( missile01_start );
|
||
//point, time, accel time, decel time
|
||
missile01_start moveto( missile01_end.origin, 50, 10, 0 );
|
||
// icbm_missile thread maps\_utility::playSoundOnTag( "parachute_land_player" );
|
||
playfxontag( level._effect[ "smoke_geotrail_icbm" ], icbm_missile01, "TAG_NOZZLE" );
|
||
exploder( "icbm_launch" );
|
||
//playfxontag( level._effect[ "smoke_geotrail_icbm" ], icbm_missile01, "tag_origin" );
|
||
|
||
wait 1;
|
||
|
||
if( distance( level.player.origin, missile01_start.origin ) < 600 )
|
||
level.player dodamage( ( level.player.health + 1000 ), missile01_start.origin );
|
||
|
||
icbm_missile01 playloopsound( "scn_con_icbm_rocket_loop" );
|
||
|
||
missile01_start waittill( "movedone" );
|
||
icbm_missile01 delete();
|
||
}
|
||
|
||
|
||
uaz_control()
|
||
{
|
||
trigger = spawn( "trigger_radius", self gettagorigin( "tag_passenger" ) + (0,0,-48), 0, 72, 72);
|
||
trigger enablelinkto();
|
||
trigger linkto( self );
|
||
trigger waittill( "trigger" );
|
||
|
||
level.player allowProne( false );
|
||
level.player allowCrouch( false );
|
||
level.player allowStand( true );
|
||
|
||
enablePlayerWeapons( false );
|
||
level.player.rig = spawn_anim_model( "player_rig" );
|
||
level.player.rig hide();
|
||
|
||
level.player.rig linkto( self, "tag_body" );
|
||
self thread anim_single_solo( level.player.rig, "boneyard_uaz_mount" , "tag_body" );
|
||
self thread ride_uaz_door();
|
||
|
||
level.player PlayerLinkToBlend( level.player.rig, "tag_player", 0.5 );
|
||
wait 0.5;
|
||
level.player.rig show();
|
||
level.player PlayerLinkToDelta( level.player.rig, "tag_player", 0.5, 180, 180, 75, 25, true );
|
||
|
||
self waittill( "boneyard_uaz_mount" );
|
||
|
||
// self thread player_rig_adjust_height();
|
||
|
||
level.player.rig hide();
|
||
//enablePlayerWeapons( true );
|
||
level.player LerpViewAngleClamp( 0.5, 0.5, 0, 180, 180, 75, 35 );
|
||
|
||
flag_set( "player_in_uaz" );
|
||
}
|
||
|
||
|
||
spawn_sub_enemies()
|
||
{
|
||
level endon( "stop_sub_enemies" );
|
||
sub_enemies = getentarray( "sub_enemies", "targetname" );//6 total
|
||
while( 1 )
|
||
{
|
||
desired = 1 + randomint( 3 );
|
||
while( desired > 0 )
|
||
{
|
||
sub_enemies[ (desired-1) ] spawn_ai();
|
||
desired--;
|
||
}
|
||
wait randomintrange( 4, 14 );
|
||
}
|
||
}
|
||
|
||
sub_ladder()
|
||
{
|
||
flag_wait( "player_on_sub" );
|
||
sub_ladder = getent( "sub_ladder", "targetname" );
|
||
|
||
sub_ladder.realOrigin = sub_ladder.origin;
|
||
sub_ladder.origin += ( 0, 0, -10000 );
|
||
|
||
flag_wait( "player_turned_key" );
|
||
|
||
sub_ladder.origin = sub_ladder.realOrigin;
|
||
}
|
||
|
||
single_shots()
|
||
{
|
||
self.shootstyle = "single";
|
||
}
|
||
|
||
activate_players_key()
|
||
{
|
||
flag_set( "player_key_rdy" );
|
||
players_key = getent( "players_key", "targetname" );
|
||
players_key glow();
|
||
|
||
players_key setCursorHint( "HINT_NOICON" );
|
||
// Press and hold ^3&&1^7 to pick up the turret.
|
||
players_key setHintString( &"CONTINGENCY_TURN_KEY" );
|
||
players_key makeUsable();
|
||
|
||
players_key waittill( "trigger", player );
|
||
|
||
//predator_drone_control playsound( "scn_invasion_controlrig_pickup" );
|
||
flag_set( "player_turned_key" );
|
||
players_key stopGlow();
|
||
players_key makeUnusable();
|
||
|
||
}
|
||
|
||
dialog_turn_key_nags()
|
||
{
|
||
wait 10;
|
||
first_line = true;
|
||
while( !flag( "player_turned_key" ) )
|
||
{
|
||
if( first_line )
|
||
{
|
||
//Roach! We're running out of time! Turn the key!!!
|
||
level.price dialogue_queue( "cont_pri_runningout" );
|
||
first_line = false;
|
||
}
|
||
else
|
||
{
|
||
//Roach! Trust me! Turn - your - key!!!
|
||
level.price dialogue_queue( "cont_pri_trustme" );
|
||
first_line = true;
|
||
}
|
||
wait 10;
|
||
}
|
||
}
|
||
|
||
start_tear_gas_guys()
|
||
{
|
||
flag_wait( "player_dropping_into_sub" );
|
||
tear_gas_nodes = getentarray( "tear_gas_nodes", "script_noteworthy" );
|
||
foreach( anode in tear_gas_nodes )
|
||
{
|
||
spawner = getent( anode.target, "targetname" );
|
||
anim_name = anode.script_animation;
|
||
spawner add_spawn_function( ::setup_tear_gas_guy, anim_name, anode );
|
||
spawner spawn_ai();
|
||
}
|
||
}
|
||
|
||
start_tear_gas_fx()
|
||
{
|
||
flag_wait( "player_dropping_into_sub" );
|
||
exploder( "tear_gas_submarine" );
|
||
}
|
||
|
||
setup_tear_gas_guy( anim_name, anode )
|
||
{
|
||
self.health = 1;
|
||
//self gun_remove();
|
||
self.allowdeath = true;
|
||
self.ragdoll_immediate = true;
|
||
anode thread anim_generic( self, anim_name );
|
||
}
|
||
|
||
debug_timer()
|
||
{
|
||
time_past = 0;
|
||
while( time_past < 70 )
|
||
{
|
||
wait .05;
|
||
time_past = time_past + .05;
|
||
println( "time past: " + time_past );
|
||
}
|
||
}
|
||
|
||
put_on_player_gas_mask()
|
||
{
|
||
//thread debug_timer();
|
||
//orig_nightVisionFadeInOutTime = GetDvar( "nightVisionFadeInOutTime" );
|
||
//orig_nightVisionPowerOnTime = GetDvar( "nightVisionPowerOnTime" );
|
||
//SetSavedDvar( "nightVisionPowerOnTime", 0.5 );
|
||
//SetSavedDvar( "nightVisionFadeInOutTime", 0.5 );
|
||
//SetSavedDvar( "overrideNVGModelWithKnife", 1 );
|
||
//SetSavedDvar( "nightVisionDisableEffects", 1 );
|
||
|
||
level.player disableweapons();
|
||
//level.player takeallweapons();
|
||
level.player giveweapon( "facemask" );
|
||
level.player switchtoWeapon( "facemask" );
|
||
|
||
//wait( 0.01 );// give the knife override a frame to catch up
|
||
level.player ForceViewmodelAnimation( "facemask", "nvg_down" );
|
||
wait( 2.0 );
|
||
level.player thread play_loop_sound_on_tag( "gas_mask_breath" );
|
||
SetSavedDvar( "hud_gasMaskOverlay", 1 );
|
||
wait( 2.5 );
|
||
level.player takeweapon( "facemask" );
|
||
level.player enableweapons();
|
||
//level.player playloopsound( "gas_mask_breath" );
|
||
//SetSavedDvar( "nightVisionDisableEffects", 0 );
|
||
//SetSavedDvar( "overrideNVGModelWithKnife", 0 );
|
||
//SetSavedDvar( "nightVisionPowerOnTime", orig_nightVisionPowerOnTime );
|
||
//SetSavedDvar( "nightVisionFadeInOutTime", orig_nightVisionFadeInOutTime );
|
||
}
|
||
|
||
|
||
nag_player_to_destroy_btr()
|
||
{
|
||
level endon( "base_btr2_dead" );
|
||
while( 1 )
|
||
{
|
||
flag_wait( "nag_player_to_destroy_btr" );
|
||
|
||
//Destroy that armored vehicle!
|
||
level.price dialogue_queue( "cont_pri_armoredvehicle" );
|
||
|
||
wait 10;
|
||
}
|
||
}
|
||
|
||
//spawn_village_trucks_at_right_time()
|
||
//{
|
||
// while( level.village_defenders_dead < 6 )
|
||
// wait 1;
|
||
//
|
||
// level.village_troop_transport = spawn_vehicle_from_targetname_and_drive( "village_troop_transport" );
|
||
// level.village_troop_transport thread friendlies_shoot_at_truck_until_its_unloads();
|
||
// level.village_troop_transport thread maps\_remotemissile::setup_remote_missile_target();
|
||
//
|
||
// wait 1;
|
||
//
|
||
// level.village_troop_transport2 = spawn_vehicle_from_targetname_and_drive( "village_troop_transport2" );
|
||
// level.village_troop_transport2 thread maps\_remotemissile::setup_remote_missile_target();
|
||
// level.village_troop_transport2 thread friendlies_shoot_at_truck_until_its_unloads();
|
||
//}
|
||
|
||
|
||
unload_base_truck()
|
||
{
|
||
level.base_truck1 endon( "death" );
|
||
level.base_truck1 Vehicle_SetSpeed( 0, 15 );
|
||
//wait .1;
|
||
level.base_truck1 maps\_vehicle::vehicle_unload();
|
||
|
||
wait 1;
|
||
|
||
|
||
if( isdefined( level.base_truck1.has_target_shader ) )
|
||
{
|
||
level.base_truck1.has_target_shader = undefined;
|
||
Target_Remove( level.base_truck1 );
|
||
}
|
||
|
||
if( isdefined( level.remote_missile_targets ) )
|
||
level.remote_missile_targets = array_remove( level.remote_missile_targets, level.base_truck1 );
|
||
}
|
||
|
||
turn_off_stealth_settings()
|
||
{
|
||
self disable_stealth_for_ai();
|
||
self.no_pistol_switch = undefined;
|
||
self.ignoreall = false;
|
||
self.fixednode = true;
|
||
self thread set_battlechatter( true );
|
||
self set_friendlyfire_warnings( true );
|
||
self.dontEverShoot = undefined;
|
||
self.grenadeammo = 3;
|
||
self.ignoreme = false;
|
||
self pushplayer( false );
|
||
self.ignoresuppression = false;
|
||
}
|
||
|
||
base_alarm_sound()
|
||
{
|
||
dialog = [];
|
||
//The base is under attack! I repeat, the base is under attack! Alert! Alert! They may be trying to reach the Kamarov!
|
||
dialog[dialog.size] = "cont_bpa_underattack";
|
||
//Terminate enemy forces with extreme prejudice! Do not allow them to sink the Kamarov!
|
||
dialog[dialog.size] = "cont_bpa_prejudice";
|
||
//2nd Platoon, reinforce submarine pens two, five, and seven! Establish blocking positions to the east and west of the mess hall to stop the intruders!
|
||
dialog[dialog.size] = "cont_bpa_2ndplatoon";
|
||
//Alert! Enemy forces have penetrated the perimeter and are making their way towards the submarines!
|
||
dialog[dialog.size] = "cont_bpa_alert";
|
||
//All submarine maintenance crews, get to your battlestation and prepare to dive immediately! I repeat, all submarine maintenance crews, get to your battlestations and prepare to dive immediately!
|
||
dialog[dialog.size] = "cont_bpa_battlestations";
|
||
current = 0;
|
||
|
||
base_pa = getent( "base_pa", "targetname" );
|
||
base_alarm_sound = getent( "base_alarm_sound", "targetname" );
|
||
while( !flag( "price_splits_off" ) )
|
||
while( 1 )
|
||
{
|
||
base_alarm_sound playloopsound( "emt_alarm_base_alert" );
|
||
base_alarm_sound.playing = true;
|
||
wait 8;
|
||
base_alarm_sound StopLoopSound();
|
||
base_alarm_sound.playing = undefined;
|
||
|
||
wait 1;
|
||
|
||
base_pa playsound( dialog[ current ] );
|
||
current++;
|
||
if( current >= dialog.size )
|
||
current = 0;
|
||
|
||
wait 12;
|
||
}
|
||
if( isdefined( base_alarm_sound.playing ) )
|
||
base_alarm_sound StopLoopSound();
|
||
}
|
||
|
||
waittill_base_alerted()
|
||
{
|
||
level endon( "base_alerted" );
|
||
level endon( "_stealth_spotted" );
|
||
level.player waittill( "projectile_impact", weaponName, position, radius );
|
||
}
|
||
|
||
setup_remote_missile_target_guy()
|
||
{
|
||
if( isdefined( self.ridingvehicle ) )
|
||
{
|
||
self endon( "death" );
|
||
self waittill( "jumpedout" );
|
||
|
||
}
|
||
self thread maps\_remotemissile::setup_remote_missile_target();
|
||
}
|
||
|
||
|
||
dialog_destroyed_vehicle( dialog )
|
||
{
|
||
self endon( "unloaded" );
|
||
self waittill( "death" );
|
||
|
||
wait .05;//so that old_veh_num is accurate
|
||
|
||
if( !isdefined( level.vehicles_killed ) )
|
||
level.vehicles_killed = 1;
|
||
else
|
||
level.vehicles_killed++;
|
||
|
||
level.veh_type = dialog;
|
||
}
|
||
|
||
|
||
setup_count_predator_infantry_kills()
|
||
{
|
||
self waittill( "death" );
|
||
|
||
if( isdefined( self.ridingvehicle ) )
|
||
return;
|
||
|
||
wait .05;
|
||
|
||
if( !isdefined( level.enemies_killed ) )
|
||
level.enemies_killed = 1;
|
||
else
|
||
level.enemies_killed++;
|
||
}
|
||
|
||
|
||
dialog_handle_predator_infantry_kills()
|
||
{
|
||
dialog = [];
|
||
dialog[dialog.size] = "cont_cmt_mutlipleconfirmed";
|
||
dialog[dialog.size] = "cont_cmt_3kills";
|
||
dialog[dialog.size] = "cont_cmt_theyredown";
|
||
|
||
last_line = 0;
|
||
said_direct_hit = false;
|
||
level.enemies_killed = 0;
|
||
level.vehicles_killed = 0;
|
||
said_good_effect = false;
|
||
kills = 0;
|
||
|
||
while( 1 )
|
||
{
|
||
level waittill( "remote_missile_exploded" );
|
||
old_num = level.enemies_killed;
|
||
old_veh_num = level.vehicles_killed;
|
||
|
||
wait .3;
|
||
|
||
veh_kills = level.vehicles_killed - old_veh_num;
|
||
|
||
if( isdefined( level.uav_killstats[ "ai" ] ) )
|
||
kills = level.uav_killstats[ "ai" ];
|
||
|
||
//wait a bit before saying the line
|
||
wait 1.2;
|
||
|
||
if( flag( "saying_base_on_alert" ) )
|
||
continue;
|
||
|
||
if( veh_kills == 1 )
|
||
{
|
||
radio_dialogue( level.veh_type );
|
||
continue;
|
||
}
|
||
if( veh_kills > 1 )
|
||
{
|
||
|
||
if( said_good_effect )
|
||
{
|
||
//Good hit. Multiple vehicles destroyed.
|
||
radio_dialogue( "cont_cmt_goodhitvehicles" );
|
||
said_good_effect = false;
|
||
}
|
||
else
|
||
{
|
||
//Good effect on target. Multiple enemy vehicles KIA.
|
||
radio_dialogue( "cont_cmt_goodeffectkia" );
|
||
said_good_effect = true;
|
||
}
|
||
continue;
|
||
}
|
||
|
||
if( kills == 0 )
|
||
{
|
||
continue;
|
||
}
|
||
if( kills == 1 )
|
||
{
|
||
if( said_direct_hit )
|
||
{
|
||
radio_dialogue( "cont_cmt_hesdown" );
|
||
said_direct_hit = false;
|
||
}
|
||
else
|
||
{
|
||
radio_dialogue( "cont_cmt_directhit" );
|
||
said_direct_hit = true;
|
||
}
|
||
continue;
|
||
}
|
||
if( kills > 5 )
|
||
{
|
||
radio_dialogue( "cont_cmt_fivepluskias" );
|
||
continue;
|
||
}
|
||
else
|
||
{
|
||
radio_dialogue( dialog[last_line] );
|
||
last_line++;
|
||
if( last_line >= dialog.size )
|
||
last_line = 0;
|
||
continue;
|
||
}
|
||
}
|
||
}
|
||
|
||
setup_base_vehicles()
|
||
{
|
||
// self.free_on_death = true;
|
||
|
||
self endon( "death" );
|
||
self thread vehicle_death_paths();
|
||
self thread unload_when_stuck();
|
||
self thread maps\_remotemissile::setup_remote_missile_target();
|
||
|
||
self waittill( "unloaded" );
|
||
|
||
if( isdefined( self.has_target_shader ) )
|
||
{
|
||
self.has_target_shader = undefined;
|
||
Target_Remove( self );
|
||
}
|
||
|
||
level.remote_missile_targets = array_remove( level.remote_missile_targets, self );
|
||
}
|
||
|
||
dead_vehicle_blocking_path()
|
||
{
|
||
count = 0;
|
||
last_bad_path_time = -10000;
|
||
while( 1 )
|
||
{
|
||
// bad_path nofies are every 0.5 seconds
|
||
self waittill( "bad_path" );
|
||
|
||
if ( GetTime() - last_bad_path_time < 5000 )
|
||
{
|
||
count++;
|
||
}
|
||
else
|
||
{
|
||
count = 0;
|
||
last_bad_path_time = GetTime();
|
||
}
|
||
|
||
// We sat here too long with a bad path, see if there are any dead script vehicles blocking us
|
||
if ( count >= 9 ) // 9 to be safe, since bad_paths are notified every 0.5 seconds... Meaning 10 notifies every 5 seconds.
|
||
{
|
||
count = 0;
|
||
foreach ( vehicle in level.dead_vehicles )
|
||
{
|
||
if ( IsDefined( vehicle ) && !IsAlive( vehicle ) && DistanceSquared( vehicle.origin, self.origin ) < 300 * 300 )
|
||
{
|
||
vehicle thread dead_vehicle_enable_paths_thread();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
dead_vehicle_enable_paths_thread()
|
||
{
|
||
self notify( "stop_vehicle_enabled_paths" );
|
||
self endon( "stop_vehicle_enabled_paths" );
|
||
|
||
self.dead_vehicle_enable_paths = true;
|
||
self ConnectPaths();
|
||
|
||
wait( 5 );
|
||
|
||
self DisconnectPaths();
|
||
self.dead_vehicle_enable_paths = undefined;
|
||
}
|
||
|
||
vehicle_death_paths()
|
||
{
|
||
self endon( "delete" );
|
||
|
||
// Notify from _vehicle::vehicle_kill, after the phys vehicle is blown up and disconnectpaths
|
||
self waittill( "kill_badplace_forever" );
|
||
|
||
level.dead_vehicles[ level.dead_vehicles.size ] = self;
|
||
|
||
min_dist = 50 * 50;
|
||
death_origin = self.origin;
|
||
|
||
while ( IsDefined( self ) )
|
||
{
|
||
if ( IsDefined( self.dead_vehicle_enable_paths ) )
|
||
{
|
||
wait( 0.5 );
|
||
continue;
|
||
}
|
||
|
||
if ( DistanceSquared( self.origin, death_origin ) > min_dist )
|
||
{
|
||
death_origin = self.origin;
|
||
|
||
// Connect the paths before we get to far away from the death_origin
|
||
self ConnectPaths();
|
||
|
||
// Don't disconnectpaths until we're done moving.
|
||
while ( 1 )
|
||
{
|
||
if ( IsDefined( self.dead_vehicle_enable_paths ) )
|
||
{
|
||
wait( 0.5 );
|
||
continue;
|
||
}
|
||
|
||
wait( 0.05 );
|
||
if ( !IsDefined( self ) )
|
||
{
|
||
return;
|
||
}
|
||
|
||
if ( DistanceSquared( self.origin, death_origin ) < 1 )
|
||
{
|
||
break;
|
||
}
|
||
|
||
death_origin = self.origin;
|
||
}
|
||
|
||
// Now disconnectpaths after we have settled
|
||
self DisconnectPaths();
|
||
}
|
||
|
||
wait( 0.05 );
|
||
}
|
||
}
|
||
|
||
unload_when_stuck()
|
||
{
|
||
self endon( "unloading" );
|
||
self endon( "death" );
|
||
while( 1 )
|
||
{
|
||
wait 2;
|
||
if( self Vehicle_GetSpeed() < 2 )
|
||
{
|
||
self Vehicle_SetSpeed( 0, 15 );
|
||
self.dontunloadonend = true;
|
||
self thread maps\_vehicle::vehicle_unload();
|
||
return;
|
||
}
|
||
}
|
||
}
|
||
|
||
unload_when_close_to_player()
|
||
{
|
||
self endon( "unloading" );
|
||
self endon( "death" );
|
||
|
||
self waittill_entity_in_range( level.player, 1000 );
|
||
|
||
self Vehicle_SetSpeed( 0, 15 );
|
||
self.dontunloadonend = true;
|
||
self thread maps\_vehicle::vehicle_unload();
|
||
}
|
||
|
||
setup_base_idling_vehicles()
|
||
{
|
||
//Direct hit on the enemy helo. Nice shot Roach.
|
||
//level.scr_radio[ "cont_cmt_directhitshelo" ] = "cont_cmt_directhitshelo";
|
||
//Good effect on target. BTR destroyed.
|
||
//level.scr_radio[ "cont_cmt_btrdestroyed" ] = "cont_cmt_btrdestroyed";
|
||
//Direct hit on that jeep.
|
||
//level.scr_radio[ "cont_cmt_directhitjeep" ] = "cont_cmt_directhitjeep";
|
||
//Good kill. Truck destroyed.
|
||
//level.scr_radio[ "cont_cmt_goodkilltruck" ] = "cont_cmt_goodkilltruck";
|
||
|
||
level.base_heli = spawn_vehicle_from_targetname( "base_heli" );
|
||
level.base_heli.helicopter_predator_target_shader = true;
|
||
level.base_heli.enableRocketDeath = true;
|
||
level.base_heli thread maps\_remotemissile::setup_remote_missile_target();
|
||
level.base_heli thread maps\_vehicle::damage_hint_bullet_only();
|
||
level.base_heli thread dialog_destroyed_vehicle( "cont_cmt_directhitshelo" );
|
||
|
||
level.base_btr2 = spawn_vehicle_from_targetname( "base_btr2" );
|
||
level.base_btr2 thread maps\_remotemissile::setup_remote_missile_target();
|
||
level.base_btr2 thread vehicle_lights_on( "spotlight spotlight_turret" );
|
||
level.base_btr2 thread dialog_destroyed_vehicle( "cont_cmt_btrdestroyed" );
|
||
// level.base_btr2.free_on_death = true;
|
||
|
||
level.base_truck1 = spawn_vehicle_from_targetname( "base_truck1" );
|
||
level.base_truck1 thread maps\_remotemissile::setup_remote_missile_target();
|
||
level.base_truck1 thread dialog_destroyed_vehicle( "cont_cmt_directhitjeep" );
|
||
// level.base_truck1.free_on_death = true;
|
||
|
||
thread vehicles_move_when_player_can_see_them();
|
||
}
|
||
|
||
setup_friendlies_for_base()
|
||
{
|
||
friendlies = getaiarray( "allies" );
|
||
foreach( guy in friendlies )
|
||
{
|
||
guy enable_ai_color();
|
||
guy set_force_color( "g" );
|
||
guy.pathrandompercent = 200;
|
||
guy.dontevershoot = true;
|
||
guy set_battlechatter( false );
|
||
guy set_friendlyfire_warnings( false );
|
||
}
|
||
|
||
level.price set_force_color( "r" );
|
||
|
||
flag_wait( "obj_base_entrance" );
|
||
|
||
flag_set( "everyone_set_green" );
|
||
level.price set_force_color( "g" );
|
||
|
||
flag_wait( "base_alerted" );
|
||
|
||
friendlies = getaiarray( "allies" );
|
||
foreach( guy in friendlies )
|
||
{
|
||
guy.dontevershoot = undefined;
|
||
guy set_battlechatter( true );
|
||
guy set_friendlyfire_warnings( true );
|
||
}
|
||
}
|
||
|
||
vehicles_move_when_player_can_see_them()
|
||
{
|
||
while( ( !isdefined( level.player.is_controlling_UAV ) ) && !flag( "obj_base_entrance" ) )
|
||
wait .05;
|
||
|
||
thread gopath( level.base_btr2 );
|
||
thread gopath( level.base_truck1 );
|
||
}
|
||
|
||
stealth_ai_ignore_tree_explosions()
|
||
{
|
||
ai_event[ "ai_eventDistExplosion" ] = [];
|
||
ai_event[ "ai_eventDistExplosion" ][ "spotted" ] = 0;
|
||
ai_event[ "ai_eventDistExplosion" ][ "hidden" ] = 0;
|
||
stealth_ai_event_dist_custom( ai_event );
|
||
|
||
|
||
flag_wait( "done_with_exploding_trees" );
|
||
wait 1;
|
||
|
||
ai_event[ "ai_eventDistExplosion" ] = [];
|
||
ai_event[ "ai_eventDistExplosion" ][ "spotted" ] = level.explosion_dist_sense;
|
||
ai_event[ "ai_eventDistExplosion" ][ "hidden" ] = level.explosion_dist_sense;
|
||
stealth_ai_event_dist_custom( ai_event );
|
||
}
|
||
|
||
dialog_moving_to_new_position_in_village( p_node )
|
||
{
|
||
if( !isdefined( level.dialog_moving_to_new_position_time ) )
|
||
{
|
||
level.dialog_moving_to_new_position_time = gettime();
|
||
}
|
||
else
|
||
{
|
||
if( gettime() < ( level.dialog_moving_to_new_position_time + ( 15 * 1000 ) ) )
|
||
return;
|
||
}
|
||
level.dialog_moving_to_new_position_time = gettime();
|
||
|
||
friendlies = getaiarray( "allies" );
|
||
|
||
friendlies[ randomint( friendlies.size ) ] custom_battlechatter( "order_move_combat" );
|
||
}
|
||
|
||
|
||
enemies_flee( flee_pos )
|
||
{
|
||
self endon ( "death" );
|
||
|
||
self setgoalpos( flee_pos );
|
||
|
||
self.ignoreme = true;
|
||
self.goalradius = 96;
|
||
self waittill( "goal" );
|
||
while( self cansee ( level.player ) )
|
||
wait 1;
|
||
self kill();
|
||
}
|
||
|
||
village_enemies_setup_retreat( retreat_pos )
|
||
{
|
||
self endon ( "death" );
|
||
flag_wait( "leaving_village" );
|
||
|
||
self setgoalpos( retreat_pos );
|
||
|
||
self.ignoreme = true;
|
||
self.goalradius = 32;
|
||
self waittill( "goal" );
|
||
while( self cansee ( level.player ) )
|
||
wait 1;
|
||
self kill();
|
||
}
|
||
|
||
smart_barney( end_flag, end_goal, end_volume )
|
||
{
|
||
self notify( "stop_barney" );
|
||
self endon( "stop_barney" );
|
||
self endon( "death" );
|
||
self ClearGoalVolume();
|
||
self thread friendly_adjust_movement_speed();
|
||
self.goalheight = 200;
|
||
self.goalradius = 300;
|
||
//level.taco setgoalentity( level.player );
|
||
self.fixednode = false;
|
||
|
||
while( !flag( end_flag ) )
|
||
{
|
||
player = level.player.origin;
|
||
vec = VectorNormalize( end_goal - player );
|
||
forward = vector_multiply( vec, 400 );
|
||
goal = forward + player;
|
||
self setgoalpos( goal );
|
||
//println(" player " + level.player.origin + " goal " + forward );
|
||
|
||
//if( !isdefined( self.favoriteenemy ) )
|
||
//{
|
||
// goal_enemies = end_volume get_ai_touching_volume( "axis" );
|
||
// if( goal_enemies.size )
|
||
// self.favoriteenemy = goal_enemies[0];
|
||
//}
|
||
//check for nearby BMPs
|
||
wait .5;
|
||
}
|
||
self notify( "stop_adjust_movement_speed" );
|
||
self.moveplaybackrate = 1.0;
|
||
|
||
self setgoalpos( end_goal );
|
||
if( isdefined( end_volume ) )
|
||
self setgoalvolume( end_volume );
|
||
}
|
||
|
||
|
||
|
||
price_changes_weapons()
|
||
{
|
||
flag_wait( "going_down_ridge" );
|
||
count = 3 * 20;
|
||
base_time = count;
|
||
dot = .9;
|
||
dot_only = true;
|
||
|
||
for ( ;; )
|
||
{
|
||
org = level.price GetEye();
|
||
|
||
if ( !player_looking_at( org, dot, dot_only ) )
|
||
{
|
||
count--;
|
||
if ( count <= 0 )
|
||
break;
|
||
}
|
||
else
|
||
{
|
||
count = base_time;
|
||
}
|
||
wait( 0.05 );
|
||
}
|
||
|
||
level.price forceUseWeapon( "aug_scope", "primary" );
|
||
//level.price forceUseWeapon( "ak47_arctic_acog", "primary" );
|
||
|
||
}
|
||
|
||
village_enemies()
|
||
{
|
||
}
|
||
|
||
friendlies_shoot_at_truck_until_its_unloads()
|
||
{
|
||
//self endon( "death" );
|
||
self MakeEntitySentient( "axis" );
|
||
self waittill_either( "unloaded", "death" );
|
||
self.ignoreme = true;
|
||
}
|
||
|
||
|
||
|
||
//kill_all_enemies_when_going_down_ridge()
|
||
//{
|
||
// flag_wait ( "going_down_ridge" );
|
||
//
|
||
// if( !flag( "_stealth_spotted" ) )
|
||
// {
|
||
// enemies = getaiarray( "axis" );
|
||
// foreach( mf in enemies )
|
||
// mf delete();
|
||
// }
|
||
// disable_stealth_system();
|
||
//}
|
||
|
||
handle_stealth_spotted()
|
||
{
|
||
level endon( "price_starts_moving" );
|
||
flag_wait( "_stealth_spotted" );
|
||
level.price anim_stopanimscripted();
|
||
}
|
||
|
||
price_intro_anim()
|
||
{
|
||
spot = getstruct( "price_intro_talk_struct", "script_noteworthy" );
|
||
spot thread handle_stealth_spotted();
|
||
spot anim_reach_solo( level.price, "intro" );
|
||
spot anim_single_solo( level.price, "intro" );
|
||
|
||
flag_set( "price_starts_moving" );
|
||
|
||
level.price notify( "_utility::follow_path" );
|
||
level.price notify( "stop_going_to_node" );// kills the last call to go_to_node
|
||
level.price disable_ai_color();
|
||
level.price thread enable_cqbwalk();
|
||
price_smart_path_to_road = getnode( "price_smart_path_to_road", "targetname" );
|
||
level.price thread price_smart_path_following( price_smart_path_to_road );
|
||
}
|
||
|
||
price_slides_down_the_ridge()
|
||
{
|
||
flag_wait( "price_on_ridge" );
|
||
wait 3;
|
||
flag_wait( "going_down_ridge" );
|
||
|
||
//level.price allowedstances( "stand" );
|
||
|
||
buddy_slide_node = getent( "ridge_price_overlook_org", "targetname" );
|
||
//buddy_slide_node = getstruct( "buddy_slide_node", "targetname" );
|
||
//buddy_slide_node anim_reach_solo( level.price, "slide" );
|
||
buddy_slide_node anim_single_solo( level.price, "slide" );
|
||
//level.price allowedstances( "stand", "crouch", "prone" );
|
||
|
||
level.price thread disable_cqbwalk();
|
||
if( !flag( "everyone_set_green" ) )
|
||
level.price set_force_color( "r" );
|
||
level.price enable_ai_color();
|
||
|
||
activate_trigger_with_targetname( "price_in_village_start" );
|
||
}
|
||
|
||
|
||
kill_helicopter_fail_safe()
|
||
{
|
||
flag_wait( "price_splits_off" );
|
||
wait 2;
|
||
if( !isalive( level.base_heli ) )
|
||
return;
|
||
|
||
origin = ( -13500.0, 876.0, 749.0 );
|
||
|
||
kill_heli_fail_safe = getstruct( "kill_heli_fail_safe", "targetname" );
|
||
if( isdefined( kill_heli_fail_safe ) )
|
||
origin = kill_heli_fail_safe.origin;
|
||
newMissile = MagicBullet( "zippy_rockets", origin, level.base_heli.origin );
|
||
|
||
newMissile Missile_SetTargetEnt( level.base_heli );
|
||
}
|
||
|
||
fire_stinger( stinger_source )
|
||
{
|
||
forward = AnglesToForward( level.uav.angles );
|
||
forwardfar = vector_multiply( forward, 10000 );
|
||
end = forwardfar + level.uav.origin;
|
||
|
||
|
||
if( isdefined( level.player.is_controlling_UAV ) )
|
||
{
|
||
//muzzlflash
|
||
PlayFX( getfx( "thermal_missle_flash_inverted" ), stinger_source );
|
||
newMissile = MagicBullet( "zippy_rockets_inverted", stinger_source, end );
|
||
}
|
||
else
|
||
{
|
||
PlayFX( getfx( "missle_flash" ), stinger_source );
|
||
newMissile = MagicBullet( "zippy_rockets", stinger_source, end );
|
||
}
|
||
|
||
newMissile Missile_SetTargetEnt( level.uav );
|
||
|
||
return newMissile;
|
||
}
|
||
|
||
|
||
setup_dont_leave_hint()
|
||
{
|
||
while( 1 )
|
||
{
|
||
//player_returning_to_map
|
||
flag_wait( "player_leaving_map" );
|
||
|
||
display_hint_timeout( "hint_dont_leave_price", 5 );
|
||
|
||
wait 5;
|
||
}
|
||
}
|
||
|
||
setup_dont_leave_failure()
|
||
{
|
||
flag_wait( "player_left_map" );
|
||
|
||
level notify ( "mission failed" );
|
||
setDvar( "ui_deadquote", &"CONTINGENCY_DONT_LEAVE_FAILURE");
|
||
maps\_utility::missionFailedWrapper();
|
||
}
|
||
|
||
flag_when_all_bridge_guys_dead()
|
||
{
|
||
flag_wait( "truckguys_dead" );
|
||
flag_wait( "cross_bridge_patrol_dead" );
|
||
flag_wait( "first_stragglers_dead" );
|
||
flag_wait( "rightside_patrol_dead" );
|
||
flag_set( "all_bridge_guys_dead" );
|
||
}
|
||
|
||
should_break_dont_leave()
|
||
{
|
||
if( flag( "player_returning_to_map" ) )
|
||
return true;
|
||
else
|
||
return false;
|
||
}
|
||
|
||
should_break_use_drone()
|
||
{
|
||
break_hint = false;
|
||
if( isdefined( level.uav_is_destroyed ) )
|
||
break_hint = true;
|
||
if( !isalive( level.uav ) )
|
||
break_hint = true;
|
||
if( isdefined( level.player.is_flying_missile ) )
|
||
break_hint = true;
|
||
if( flag( "base_alerted" ) )
|
||
break_hint = true;
|
||
if( level.player getCurrentWeapon() == "remote_missile_detonator" )
|
||
break_hint = true;
|
||
|
||
return break_hint;
|
||
}
|
||
|
||
should_break_steer_drone()
|
||
{
|
||
break_hint = false;
|
||
if( level.player getCurrentWeapon() == "remote_missile_detonator" )
|
||
break_hint = true;
|
||
if( ( level.hint_steer_drone_time + 5000 ) < gettime() )
|
||
break_hint = true;
|
||
|
||
return break_hint;
|
||
}
|
||
|
||
|
||
|
||
fire_stinger_at_uav( stinger_source )
|
||
{
|
||
level.uav maps\_vehicle::godoff();
|
||
level.uav.health = 400;
|
||
|
||
attractor = Missile_CreateAttractorEnt( level.uav, 100000, 60000 );
|
||
|
||
|
||
stinger_source playsound( "gauntlet_fires" );
|
||
stinger_source playsound( "gauntlet_ignition" );
|
||
|
||
newMissile = fire_stinger( stinger_source.origin );
|
||
|
||
|
||
old_org = level.uav.origin;
|
||
old_dist = 9999999999;
|
||
while ( IsDefined( newMissile ) )
|
||
{
|
||
if( !isalive( level.uav ) )
|
||
break;
|
||
dist = Distance( newMissile.origin, level.uav.origin );
|
||
if ( dist <= 200 )
|
||
break;
|
||
if( dist > old_dist )
|
||
break;
|
||
old_dist = dist;
|
||
old_org = level.uav.origin;
|
||
wait .05;
|
||
}
|
||
|
||
if( IsDefined( newMissile ) )
|
||
newMissile delete();
|
||
playfx( getfx( "uav_explosion" ), old_org );
|
||
level.uav thread play_sound_on_tag( "uav_explode" );
|
||
level.uav_is_destroyed = true;
|
||
level.player maps\_remotemissile::disable_uav( false, true );
|
||
|
||
level notify( "uav_destroyed" );
|
||
|
||
if( isdefined( level.uav ) )
|
||
level.uav delete();
|
||
}
|
||
|
||
UAVRigAiming()
|
||
{
|
||
if( !isalive( level.uav ) )
|
||
return;
|
||
if( isdefined( level.uav_is_destroyed ) )
|
||
return;
|
||
|
||
focus_points = getentarray( "uav_focus_point", "targetname" );
|
||
village_focus_point = getent( "village_focus_point", "script_noteworthy" );
|
||
|
||
|
||
level endon( "uav_destroyed" );
|
||
level.uav endon ( "death" );
|
||
for ( ;; )
|
||
{
|
||
//if ( IsDefined( level.uavTargetEnt ) )
|
||
//{
|
||
// targetPos = level.uavTargetEnt.origin;
|
||
//}
|
||
//else
|
||
if( flag( "leaving_village" ) )
|
||
{
|
||
closest_focus = getclosest( level.player.origin, focus_points );
|
||
targetPos = closest_focus.origin;
|
||
}
|
||
else
|
||
{
|
||
targetPos = village_focus_point.origin;
|
||
}
|
||
//else if ( IsDefined( level.uavTargetPos ) )
|
||
// targetPos = level.uavTargetPos;
|
||
//else
|
||
// targetpos = ( -17052.6, -4000.98, 696.409 );
|
||
|
||
|
||
angles = VectorToAngles( targetPos - level.uav.origin );
|
||
|
||
level.uavRig MoveTo( level.uav.origin, 0.10, 0, 0 );
|
||
level.uavRig RotateTo( ANGLES, 0.10, 0, 0 );
|
||
wait 0.05;
|
||
}
|
||
}
|
||
|
||
|
||
spawn_second_uav()
|
||
{
|
||
level.uav_is_destroyed = undefined;
|
||
level.player maps\_remotemissile::enable_uav( false, "remote_missile_detonator" );
|
||
|
||
|
||
restart_rig = false;
|
||
if( !isalive( level.uav ) )
|
||
{
|
||
restart_rig = true;
|
||
level.uav = spawn_vehicle_from_targetname_and_drive( "second_uav" );
|
||
level.uav playLoopSound( "uav_engine_loop" );
|
||
}
|
||
|
||
if( !isdefined( level.uavRig ) )
|
||
{
|
||
level.uavRig = spawn( "script_model", level.uav.origin );
|
||
level.uavRig setmodel( "tag_origin" );
|
||
}
|
||
|
||
if( restart_rig )
|
||
thread UAVRigAiming();
|
||
|
||
weapList = level.player GetWeaponsListAll();
|
||
has_remote = false;
|
||
foreach( weap in weapList )
|
||
if( weap == "remote_missile_detonator" )
|
||
has_remote = true;
|
||
|
||
if( !has_remote )
|
||
{
|
||
level.player giveWeapon( "remote_missile_detonator" );
|
||
level.player SetActionSlot( 4, "weapon", "remote_missile_detonator" );
|
||
}
|
||
}
|
||
|
||
|
||
dialog_russians_looking_for_you()
|
||
{
|
||
dialog = [];
|
||
dialog[dialog.size ] = "cont_ru0_woods";
|
||
dialog[dialog.size ] = "cont_ru1_woods";
|
||
dialog[dialog.size ] = "cont_ru2_woods";
|
||
dialog[dialog.size ] = "cont_ru3_woods";
|
||
dialog[dialog.size ] = "cont_ru4_woods";
|
||
|
||
|
||
while( !flag( "approaching_ridge" ) )
|
||
{
|
||
wait ( randomfloatrange( 2, 4 ) );
|
||
|
||
guys = getentarray( "cqb_patrol", "script_noteworthy" );
|
||
guys = array_randomize( guys );
|
||
foreach( guy in guys )
|
||
{
|
||
if( isalive( guy ) )
|
||
{
|
||
selection = dialog[ randomint( dialog.size ) ];
|
||
println( "guy.export " + guy.export + " sound " + selection );
|
||
guy playsound( selection );
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
dialog_approaching_ridge()
|
||
{
|
||
if( !stealth_is_everything_normal() )
|
||
return;
|
||
level endon( "someone_became_alert" );
|
||
|
||
//Soap, what's the status of our air support?
|
||
level.price dialogue_queue( "cont_pri_airsupport" );
|
||
//radio_dialogue( "cont_pri_airsupport" );
|
||
wait 1;
|
||
|
||
//The UAV is almost in position.
|
||
radio_dialogue( "cont_cmt_almostinpos" );
|
||
|
||
//Roger that.
|
||
level.price dialogue_queue( "cont_pri_rogerthat" );
|
||
//radio_dialogue( "cont_pri_rogerthat" );
|
||
}
|
||
|
||
|
||
dialog_gauntlet_surprise_reaction()
|
||
{
|
||
// Diable the _remotemissile dialogue until this sequence is done
|
||
level.uav_radio_disabled = true;
|
||
|
||
wait 2;
|
||
//Bollocks!
|
||
level.price dialogue_queue( "cont_pri_bollocks" );
|
||
//radio_dialogue( "cont_pri_bollocks" );
|
||
|
||
//What just happened?
|
||
radio_dialogue( "cont_cmt_whathappened" );
|
||
|
||
//There's a mobile SAM site in the village. It just took out our UAV.
|
||
level.price dialogue_queue( "cont_pri_mobilesaminvillage" );
|
||
//radio_dialogue( "cont_pri_mobilesaminvillage" );
|
||
|
||
//Soap, we need another UAV, sharpish!
|
||
level.price dialogue_queue( "cont_pri_uavsharpish" );
|
||
//radio_dialogue( "cont_pri_uavsharpish" );
|
||
|
||
// Re-enable the _remotemissile dialogue until this sequence is done
|
||
level.uav_radio_disabled = undefined;
|
||
}
|
||
|
||
//dialog_rasta_destroys_gauntlets()
|
||
//{
|
||
// //Stand back!
|
||
// dialogue_queue( "cont_rst_standback" );
|
||
//
|
||
// //Get back!
|
||
// dialogue_queue( "cont_rst_getback" );
|
||
//}
|
||
|
||
dialog_rasta_and_bricktop()
|
||
{
|
||
if( flag( "start_village_fight" ) )
|
||
return;
|
||
level endon( "start_village_fight" );
|
||
|
||
while( !isalive( level.rasta ) )
|
||
wait 1;
|
||
|
||
level.price waittill_entity_in_range( level.rasta, 300 );
|
||
level.price waittill_entity_in_range( level.player, 600 );
|
||
|
||
//Nice work on that SAM site.
|
||
level.price dialogue_queue( "cont_pri_nicework" );
|
||
|
||
//Thanks, but we better get moving - those explosions are gonna attract a lot of attention.
|
||
level.rasta dialogue_queue( "cont_rst_getmoving" );
|
||
|
||
|
||
//wait 1;
|
||
|
||
}
|
||
|
||
village_truck_guys_setup()
|
||
{
|
||
self endon( "death" );
|
||
self waittill( "jumpedout" );
|
||
self.goalradius = 8000;
|
||
}
|
||
|
||
price_smart_path_following( first_node )
|
||
{
|
||
self endon( "stop_smart_path_following" );
|
||
self.smart_path_following_node = first_node;
|
||
self setgoalnode( first_node );
|
||
|
||
if( !isdefined( first_node.target ) )
|
||
return;
|
||
|
||
next_node = getnode( first_node.target, "targetname" );
|
||
while( 1 )
|
||
{
|
||
trigger = undefined;
|
||
volume = undefined;
|
||
|
||
links = getentarray( next_node.script_linkto, "script_linkname" );
|
||
//get the flag trigger linked to the next_node
|
||
foreach( link in links )
|
||
{
|
||
if( link.classname == "trigger_multiple_flag_set" )
|
||
trigger = link;
|
||
if( link.classname == "info_volume" )
|
||
volume = link;
|
||
}
|
||
|
||
assert( isdefined( trigger ) );
|
||
assert( isdefined( trigger.script_flag ) );
|
||
assert( isdefined( volume ) );
|
||
|
||
// a flag trigger the player passes through
|
||
flag_wait( trigger.script_flag );
|
||
|
||
|
||
// the volume linked to the flag trigger
|
||
volume waittill_volume_dead();
|
||
|
||
level notify( next_node.targetname );//so we can react to price deciding to move
|
||
|
||
if( flag( "_stealth_spotted" ) )
|
||
flag_waitopen( "_stealth_spotted" );
|
||
|
||
// volume is clear, trigger is hit, go to the node
|
||
self setgoalnode( next_node );
|
||
self.smart_path_following_node = next_node;
|
||
|
||
if( !isdefined( next_node.target ) )
|
||
break;
|
||
|
||
//get the next node
|
||
next_node = getnode( next_node.target, "targetname" );
|
||
|
||
}
|
||
}
|
||
|
||
destroy_chain( start_ent )
|
||
{
|
||
current_target = start_ent;
|
||
while( 1 )
|
||
{
|
||
if( isdefined( current_target.script_linkTo ) )
|
||
{
|
||
tree = getent( current_target.script_linkTo, "script_linkname" );
|
||
tree notify ( "explode" );
|
||
}
|
||
|
||
wait .2;
|
||
|
||
if( isdefined( current_target.script_delay ) )
|
||
wait current_target.script_delay;
|
||
|
||
if( isdefined( current_target.target ) )
|
||
{
|
||
next_target = getstruct( current_target.target, "targetname" );
|
||
assert( isdefined( next_target ) );
|
||
current_target = next_target;
|
||
}
|
||
else
|
||
break;
|
||
}
|
||
}
|
||
|
||
|
||
setup_tree_destroyer()
|
||
{
|
||
wait 3;
|
||
level.btr_tree_destroyer = spawn_vehicle_from_targetname_and_drive( "btr_tree_destroyer" );
|
||
level.btr_tree_destroyer vehicle_lights_on( "spotlight spotlight_turret" );
|
||
level.btr_tree_destroyer thread monitor_distance_player_vs_price();
|
||
|
||
level.btr_tree_destroyer thread maps\_vehicle::damage_hints();
|
||
}
|
||
|
||
|
||
friendly_adjust_movement_speed()
|
||
{
|
||
self notify( "stop_adjust_movement_speed" );
|
||
self endon( "death" );
|
||
self endon( "stop_adjust_movement_speed" );
|
||
|
||
for(;;)
|
||
{
|
||
wait randomfloatrange( .5, 1.5 );
|
||
|
||
while( friendly_should_speed_up() )
|
||
{
|
||
//iPrintLnBold( "friendlies speeding up" );
|
||
self.moveplaybackrate = 2.5;
|
||
wait 0.05;
|
||
}
|
||
|
||
self.moveplaybackrate = 1.0;
|
||
}
|
||
}
|
||
|
||
friendly_should_speed_up()
|
||
{
|
||
prof_begin( "friendly_movement_rate_math" );
|
||
|
||
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[ "70" ] ) )
|
||
{
|
||
prof_end( "friendly_movement_rate_math" );
|
||
return false;
|
||
}
|
||
|
||
prof_end( "friendly_movement_rate_math" );
|
||
|
||
return true;
|
||
}
|
||
|
||
|
||
monitor_player_returns_to_btrs()
|
||
{
|
||
level endon( "player_slid_down" );
|
||
flag_wait( "returning_to_btrs" );
|
||
//level.player waittill_entity_in_range( level.btr_slider, 2200 );
|
||
|
||
level.btr_tree_destroyer setturrettargetent( level.player );
|
||
|
||
shots = randomintrange( 2, 5 );
|
||
for ( i = 0; i < shots; i++ )
|
||
{
|
||
level.btr_tree_destroyer fireWeapon();
|
||
wait( 0.35 );
|
||
}
|
||
level.btr_slider setturrettargetent( level.player );
|
||
wait( randomfloatrange( .2, .5 ) );
|
||
|
||
shots = randomintrange( 2, 4 );
|
||
for ( i = 0; i < shots; i++ )
|
||
{
|
||
level.btr_slider fireWeapon();
|
||
level.btr_tree_destroyer fireWeapon();
|
||
wait( 0.35 );
|
||
}
|
||
level.player dodamage( ( level.player.health + 1000 ), level.btr_tree_destroyer.origin );
|
||
}
|
||
|
||
monitor_distance_player_vs_price()
|
||
{
|
||
wait 10;
|
||
|
||
|
||
level endon( "safe_from_btrs" );
|
||
|
||
while( 1 )
|
||
{
|
||
level.player waittill_entity_out_of_range( level.price, 1000 );
|
||
|
||
vec2 = VectorNormalize( ( level.player.origin - level.price.origin ) );
|
||
|
||
//vec_goal = VectorNormalize( ( level.price.goalpos - level.price.origin ) );//angle of where I'm supposed to go
|
||
//vecdot = vectordot( vec_goal, vec2 );//dot my my goal dir vs player position
|
||
|
||
vec = anglestoforward( level.price.angles );
|
||
vecdot = vectordot( vec, vec2 );//dot of my angle vs player position
|
||
|
||
//vecdot > 0 means in 180 in front
|
||
if( vecdot < 0 )// player is behind my goal dir
|
||
break;
|
||
|
||
wait .1;
|
||
}
|
||
|
||
level notify( "shoot_at_player" );//stops the scripted tree destruction
|
||
|
||
|
||
self setturrettargetent( level.player );
|
||
|
||
shots = randomintrange( 2, 5 );
|
||
for ( i = 0; i < shots; i++ )
|
||
{
|
||
self fireWeapon();
|
||
wait( 0.35 );
|
||
}
|
||
level.btr_slider setturrettargetent( level.player );
|
||
wait( randomfloatrange( .2, .5 ) );
|
||
|
||
shots = randomintrange( 2, 4 );
|
||
for ( i = 0; i < shots; i++ )
|
||
{
|
||
level.btr_slider fireWeapon();
|
||
self fireWeapon();
|
||
wait( 0.35 );
|
||
}
|
||
level.player dodamage( ( level.player.health + 1000 ), self.origin );
|
||
}
|
||
|
||
end_of_tree_explosions()
|
||
{
|
||
level endon( "shoot_at_player" );//stops the scripted tree destruction
|
||
flag_wait( "end_of_tree_explosions" );
|
||
wait 2;
|
||
|
||
destroyable_trees = getentarray( "trigger_tree_explosion", "targetname" );
|
||
|
||
thread random_tree_impact_sounds( destroyable_trees );
|
||
level.btr_tree_destroyer fireWeapon();
|
||
wait .2;
|
||
thread random_tree_impact_sounds( destroyable_trees );
|
||
level.btr_tree_destroyer fireWeapon();
|
||
wait .2;
|
||
thread random_tree_impact_sounds( destroyable_trees );
|
||
level.btr_tree_destroyer fireWeapon();
|
||
|
||
|
||
wait 1;
|
||
thread random_tree_impact_sounds( destroyable_trees );
|
||
level.btr_tree_destroyer fireWeapon();
|
||
wait .5;
|
||
level.btr_tree_destroyer fireWeapon();
|
||
|
||
wait 1;
|
||
|
||
thread random_tree_impact_sounds( destroyable_trees );
|
||
level.btr_tree_destroyer fireWeapon();
|
||
wait .2;
|
||
thread random_tree_impact_sounds( destroyable_trees );
|
||
level.btr_tree_destroyer fireWeapon();
|
||
wait .2;
|
||
level.btr_tree_destroyer fireWeapon();
|
||
|
||
|
||
wait .5;
|
||
thread random_tree_impact_sounds( destroyable_trees );
|
||
level.btr_tree_destroyer fireWeapon();
|
||
wait .8;
|
||
level.btr_tree_destroyer fireWeapon();
|
||
|
||
wait 1;
|
||
level.btr_tree_destroyer fireWeapon();
|
||
|
||
wait 1;
|
||
level.btr_tree_destroyer fireWeapon();
|
||
|
||
wait 2;
|
||
level.btr_tree_destroyer fireWeapon();
|
||
|
||
flag_set( "done_with_exploding_trees" );
|
||
}
|
||
|
||
random_tree_impact_sounds( destroyable_trees )
|
||
{
|
||
loc = destroyable_trees[ randomint( destroyable_trees.size ) ];
|
||
loc playsound( "contingency_tree_impact" );
|
||
loc playsound( "contingency_tree_fall" );
|
||
}
|
||
|
||
setup_destroyable_tree()
|
||
{
|
||
//level._effect[ "tree_snow_dump_fast" ] = loadfx( "snow/tree_snow_dump_fast" );
|
||
//level._effect[ "tree_snow_dump_fast_small" ] = loadfx( "snow/tree_snow_dump_fast_small" );
|
||
//level._effect[ "tree_snow_fallen" ] = loadfx( "snow/tree_snow_fallen" );
|
||
//level._effect[ "tree_snow_fallen_small" ] = loadfx( "snow/tree_snow_fallen_small" );
|
||
|
||
level endon( "shoot_at_player" );
|
||
|
||
small_tree = false;
|
||
tree_base = getent( self.target, "targetname" );
|
||
destroyed_top = undefined;
|
||
clip_brush = undefined;
|
||
if( tree_base.model == "foliage_tree_pine_snow_tall_b_broken_btm" )
|
||
{
|
||
small_tree = true;
|
||
tree_base.endmodel = tree_base.model;
|
||
tree_base setmodel( "foliage_tree_pine_snow_tall_b" );
|
||
}
|
||
else
|
||
{
|
||
tree_base.endmodel = tree_base.model;
|
||
tree_base setmodel( "foliage_tree_pine_snow_tall_c" );
|
||
}
|
||
parts = getentarray( tree_base.target, "targetname" );
|
||
foreach( part in parts )
|
||
{
|
||
if( part.classname == "script_model" )
|
||
destroyed_top = part;
|
||
if( part.classname == "script_brushmodel" )
|
||
clip_brush = part;
|
||
}
|
||
assert( isdefined( destroyed_top ) );
|
||
destroyed_top.goalangles = destroyed_top.angles;
|
||
//destroyed_top.angles = (0, tree_base.angles[1], 0);
|
||
destroyed_top.angles = tree_base.angles;
|
||
destroyed_top hide();
|
||
|
||
|
||
hits_ground = false;
|
||
if( ( isdefined( destroyed_top.script_noteworthy ) ) && ( destroyed_top.script_noteworthy == "hits_the_ground" ) )
|
||
hits_ground = true;
|
||
if( hits_ground )
|
||
assert( isdefined( clip_brush ) );
|
||
if( isdefined( clip_brush ) )
|
||
{
|
||
assert( hits_ground );
|
||
clip_brush notsolid();
|
||
}
|
||
|
||
|
||
self waittill( "trigger" );
|
||
//while( !isdefined( level.price ) )
|
||
// wait 1;
|
||
|
||
if( isalive( level.btr_slider ) )
|
||
{
|
||
level.btr_slider setturrettargetvec( destroyed_top.origin );
|
||
level.btr_slider fireWeapon();
|
||
}
|
||
|
||
if( isalive( level.btr_tree_destroyer ) )
|
||
{
|
||
level.btr_tree_destroyer setturrettargetvec( destroyed_top.origin );
|
||
level.btr_tree_destroyer fireWeapon();
|
||
}
|
||
|
||
destroyed_top playsound( "contingency_tree_impact" );
|
||
tree_base playsound( "contingency_tree_fall" );
|
||
|
||
tree_base setmodel( tree_base.endmodel );
|
||
forward = AnglesToForward( destroyed_top.angles );
|
||
up = AnglesToUp( destroyed_top.angles );
|
||
if( small_tree )
|
||
{
|
||
playfx( getfx( "tree_snow_dump_fast_small" ), destroyed_top.origin, up , forward );
|
||
}
|
||
else
|
||
{
|
||
playfx( getfx( "tree_snow_dump_fast" ), destroyed_top.origin, up , forward );
|
||
}
|
||
|
||
destroyed_top show();
|
||
//drop_time = randomfloatrange( .6, 1.4 );
|
||
|
||
//if( isdefined( destroyed_top.script_duration ) )
|
||
// drop_time = destroyed_top.script_duration;
|
||
//else
|
||
//{
|
||
// drop_time = 1;
|
||
//}
|
||
|
||
|
||
pre_hit_fx_time = .25;
|
||
|
||
if( small_tree )
|
||
{
|
||
pre_hit_fx_time = pre_hit_fx_time - .25;
|
||
}
|
||
|
||
drop_time = 2;
|
||
//drop_time = drop_time * 2;
|
||
accel_time = drop_time;
|
||
//destroyed_top rotatepitch( 90, drop_time, accel_time, 0);
|
||
//destroyed_top thread maps\_debug::drawOrgForever();
|
||
destroyed_top RotateTo( destroyed_top.goalangles, drop_time, accel_time, 0 );
|
||
|
||
wait ( drop_time - pre_hit_fx_time );
|
||
|
||
if( hits_ground )
|
||
{
|
||
forward = AnglesToForward( destroyed_top.angles );
|
||
up = AnglesToUp( destroyed_top.angles );
|
||
|
||
if( small_tree )
|
||
{
|
||
//destroyed_top thread maps\_debug::drawOrgForever();
|
||
playfx( getfx( "tree_snow_fallen_small" ), destroyed_top.origin , up , forward );
|
||
}
|
||
else
|
||
{
|
||
//destroyed_top thread maps\_debug::drawOrgForever();
|
||
playfx( getfx( "tree_snow_fallen_heavy" ), destroyed_top.origin , up , forward );
|
||
}
|
||
}
|
||
wait pre_hit_fx_time;
|
||
|
||
//tree has stopped falling
|
||
if( hits_ground )
|
||
{
|
||
if( level.player istouching( clip_brush ) )
|
||
level.player kill();
|
||
clip_brush solid();
|
||
}
|
||
|
||
if( ( hits_ground ) && ( !small_tree ) )
|
||
{
|
||
if( level.player point_in_fov( destroyed_top.origin ) )
|
||
Earthquake( 0.3, .3, destroyed_top.origin, 2000 );
|
||
destroyed_top playsound( "contingency_tree_ground" );
|
||
}
|
||
|
||
if( !hits_ground )
|
||
{
|
||
forward = AnglesToForward( destroyed_top.angles );
|
||
up = AnglesToUp( destroyed_top.angles );
|
||
|
||
if( small_tree )
|
||
{
|
||
//destroyed_top thread maps\_debug::drawOrgForever();
|
||
playfx( getfx( "tree_snow_fallen_small" ), destroyed_top.origin , up , forward );
|
||
}
|
||
else
|
||
{
|
||
//destroyed_top thread maps\_debug::drawOrgForever();
|
||
playfx( getfx( "tree_snow_fallen" ), destroyed_top.origin , up , forward );
|
||
}
|
||
}
|
||
|
||
//if( !isdefined( destroyed_top.script_duration ) )
|
||
//{
|
||
shake_time = .2;
|
||
|
||
destroyed_top movez( 4, shake_time, 0, shake_time );
|
||
wait shake_time;
|
||
|
||
destroyed_top movez( -3, shake_time, 0, shake_time );
|
||
wait shake_time;
|
||
|
||
destroyed_top movez( 2, shake_time, 0, shake_time );
|
||
wait shake_time;
|
||
|
||
destroyed_top movez( -1, shake_time, 0, shake_time );
|
||
wait shake_time;
|
||
//}
|
||
|
||
/*
|
||
shake_time = .2;
|
||
destroyed_top rotatepitch( 3, shake_time, shake_time, 0);
|
||
|
||
wait shake_time;
|
||
|
||
destroyed_top rotatepitch( -2, shake_time, shake_time, 0);
|
||
|
||
wait shake_time;
|
||
|
||
destroyed_top rotatepitch( 1, shake_time, shake_time, 0);
|
||
|
||
wait shake_time;
|
||
*/
|
||
}
|
||
|
||
|
||
dialog_enemy_saw_corpse()
|
||
{
|
||
first_line = true;
|
||
|
||
while( 1 )
|
||
{
|
||
level waittill( "_stealth_saw_corpse" );
|
||
|
||
wait 2;
|
||
|
||
if( flag( "_stealth_spotted" ) )
|
||
continue;
|
||
}
|
||
|
||
if( first_line )
|
||
{
|
||
//Looks like they found a body.
|
||
radio_dialogue( "cont_pri_foundabody" );
|
||
first_line = false;
|
||
}
|
||
else
|
||
{
|
||
//They found a body.
|
||
radio_dialogue( "cont_pri_foundabody2" );
|
||
first_line = true;
|
||
}
|
||
|
||
if( flag( "_stealth_spotted" ) )
|
||
return;
|
||
level endon( "_stealth_spotted" );
|
||
wait 10;
|
||
|
||
|
||
//kill at same time
|
||
radio_dialogue( "cont_pri_sametime" );
|
||
|
||
/*
|
||
wait 3;
|
||
|
||
level.price.ignoreall = false;
|
||
level.price.dontevershoot = undefined;
|
||
level.price.baseaccuracy = 5000000;
|
||
|
||
|
||
ai = GetAIspeciesArray( "axis", "all" );
|
||
foreach ( actor in ai )
|
||
{
|
||
actor.no_price_kill_callout = true;
|
||
actor.dontattackme = undefined;
|
||
//level.price.favoriteenemy = actor;
|
||
}
|
||
*/
|
||
}
|
||
|
||
dialog_player_kill()
|
||
{
|
||
if( flag( "_stealth_spotted" ) )
|
||
return;
|
||
|
||
wait 3;
|
||
|
||
if( !stealth_is_everything_normal() )
|
||
return;
|
||
if( !isdefined( level.good_kill_dialog_time ) )
|
||
{
|
||
level.good_kill_dialog_time = gettime();
|
||
}
|
||
else
|
||
{
|
||
if( gettime() < ( level.good_kill_dialog_time + ( 15 * 1000 ) ) )
|
||
return;
|
||
}
|
||
level.good_kill_dialog_time = gettime();
|
||
|
||
level notify( "player kill dialog" );
|
||
}
|
||
|
||
|
||
dialog_player_kill_master()
|
||
{
|
||
dialog = [];
|
||
|
||
//Good.
|
||
dialog[ dialog.size ] = "cont_pri_good";
|
||
//beautiful
|
||
dialog[ dialog.size ] = "cont_pri_beautiful";
|
||
//Not bad, but I've seen better.
|
||
//dialog[ dialog.size ] = "cont_pri_seenbetter";
|
||
//Nicely done.
|
||
dialog[ dialog.size ] = "cont_pri_nicelydone";
|
||
//Well done.
|
||
dialog[ dialog.size ] = "cont_pri_welldone";
|
||
//Good work.
|
||
dialog[ dialog.size ] = "cont_pri_goodwork";
|
||
//Impressive.
|
||
dialog[ dialog.size ] = "cont_pri_impressive";
|
||
|
||
|
||
line = 0;
|
||
|
||
while( 1 )
|
||
{
|
||
level waittill( "player kill dialog" );
|
||
|
||
radio_dialogue( dialog[ line ] );
|
||
line++;
|
||
if( line >= dialog.size )
|
||
line = 0;
|
||
}
|
||
}
|
||
|
||
dialog_price_kill()
|
||
{
|
||
current_line = 0;
|
||
dialog = [];
|
||
|
||
//Got one.
|
||
dialog[ dialog.size ] = "cont_pri_gotone";
|
||
//He's down.
|
||
dialog[ dialog.size ] = "cont_pri_hesdown2";
|
||
//Tango down.
|
||
dialog[ dialog.size ] = "cont_pri_tangodown";
|
||
//Good night.
|
||
dialog[ dialog.size ] = "cont_pri_goodnight";
|
||
//Target eliminated.
|
||
dialog[ dialog.size ] = "cont_pri_targeteliminated";
|
||
//Target down.
|
||
dialog[ dialog.size ] = "cont_pri_targetdown";
|
||
|
||
|
||
while( 1 )
|
||
{
|
||
level waittill( "dialog_price_kill" );
|
||
|
||
wait 1.5;
|
||
|
||
if( isdefined( level.dont_brag_when_following_your_own_orders_time ) )
|
||
{
|
||
if( gettime() < ( level.dont_brag_when_following_your_own_orders_time + ( 15 * 1000 ) ) )
|
||
continue;
|
||
}
|
||
|
||
if( !isdefined( level.good_kill_dialog_time ) )
|
||
{
|
||
level.good_kill_dialog_time = gettime();
|
||
}
|
||
else
|
||
{
|
||
if( gettime() < ( level.good_kill_dialog_time + ( 3 * 1000 ) ) )
|
||
continue;
|
||
}
|
||
level.good_kill_dialog_time = gettime();
|
||
|
||
|
||
dialog_line = dialog[ current_line ];
|
||
radio_dialogue( dialog_line );//dont cut off the other line but clear the que
|
||
current_line++;
|
||
if( current_line >= dialog.size )
|
||
current_line = 0;
|
||
|
||
}
|
||
}
|
||
|
||
|
||
dialog_price_kill_dog()
|
||
{
|
||
current_line = 0;
|
||
|
||
dialog_dog = [];
|
||
|
||
//Nap time.
|
||
dialog_dog[ dialog_dog.size ] = "cont_pri_naptime";
|
||
//Down boy.
|
||
dialog_dog[ dialog_dog.size ] = "cont_pri_downboy";
|
||
|
||
while( 1 )
|
||
{
|
||
level waittill( "dialog_price_kill_dog" );
|
||
|
||
wait 1.5;
|
||
|
||
if( isdefined( level.dont_brag_when_following_your_own_orders_time ) )
|
||
{
|
||
if( gettime() < ( level.dont_brag_when_following_your_own_orders_time + ( 15 * 1000 ) ) )
|
||
continue;
|
||
}
|
||
|
||
if( !isdefined( level.good_kill_dialog_time ) )
|
||
{
|
||
level.good_kill_dialog_time = gettime();
|
||
}
|
||
else
|
||
{
|
||
if( gettime() < ( level.good_kill_dialog_time + ( 3 * 1000 ) ) )
|
||
continue;
|
||
}
|
||
level.good_kill_dialog_time = gettime();
|
||
|
||
dialog_line = dialog_dog[ current_line ];
|
||
radio_dialogue( dialog_line );//dont cut off the other line but clear the que
|
||
current_line++;
|
||
if( current_line >= dialog_dog.size )
|
||
current_line = 0;
|
||
|
||
}
|
||
}
|
||
|
||
monitor_stealth_pain()
|
||
{
|
||
self waittill( "damage", damage, attacker );
|
||
|
||
if ( !isdefined( attacker ) )
|
||
return;
|
||
|
||
if ( ( isplayer( attacker ) ) && ( isdefined( self.script_deathflag ) ) )
|
||
{
|
||
if( self.script_deathflag != "blocking_stationary_dead" )
|
||
thread price_helps_kill_group( self.script_deathflag );
|
||
}
|
||
}
|
||
|
||
|
||
monitor_stealth_kills()
|
||
{
|
||
self waittill( "death", killer );
|
||
|
||
if ( !isdefined( killer ) )
|
||
return;
|
||
|
||
if ( isplayer( killer ) )
|
||
{
|
||
thread dialog_player_kill();
|
||
return;
|
||
}
|
||
|
||
if( ( level.price == killer ) && ( !isdefined( self.no_price_kill_callout ) ) )
|
||
{
|
||
if( self.type == "dog" )
|
||
level notify( "dialog_price_kill_dog" );
|
||
else
|
||
level notify( "dialog_price_kill" );
|
||
}
|
||
}
|
||
|
||
dialog_stealth_recovery()
|
||
{
|
||
if( flag( "player_on_ridge" ) )
|
||
return;
|
||
level endon( "player_on_ridge" );
|
||
failure = [];
|
||
|
||
//Don't give away our position, Roach. This is only going to get harder.
|
||
failure[ failure.size ] = "cont_pri_giveawayposition";
|
||
//Roach, we can't afford to keep giving away our position like that. Maintain a low profile!
|
||
failure[ failure.size ] = "cont_pri_lowprofile";
|
||
//What the hell was that? You trying to get us killed?
|
||
failure[ failure.size ] = "cont_pri_getuskilled";
|
||
//Does the word stealth mean anything to you?
|
||
failure[ failure.size ] = "cont_pri_thewordstealth";
|
||
|
||
line = 0;
|
||
|
||
while( 1 )
|
||
{
|
||
flag_wait( "_stealth_spotted" );
|
||
wait 1;
|
||
flag_waitopen( "_stealth_spotted" );
|
||
wait 1;
|
||
|
||
radio_dialogue( failure[ line ] );
|
||
line++;
|
||
if( line >= failure.size )
|
||
line = 0;
|
||
}
|
||
}
|
||
|
||
|
||
dialog_we_are_spotted()
|
||
{
|
||
failure = [];
|
||
|
||
//We're spotted! Go loud! Take them out!
|
||
failure[ failure.size ] = "cont_pri_goloud";
|
||
//They're on to us! Open fire!
|
||
failure[ failure.size ] = "cont_pri_ontous";
|
||
//We're spotted! Take them out!
|
||
failure[ failure.size ] = "cont_pri_werespotted";
|
||
|
||
failure = array_randomize( failure );
|
||
line = 0;
|
||
|
||
while( 1 )
|
||
{
|
||
flag_wait( "_stealth_spotted" );
|
||
|
||
radio_dialogue_stop();//kills current line
|
||
radio_dialogue( failure[ line ] );
|
||
line++;
|
||
if( line >= failure.size )
|
||
line = 0;
|
||
|
||
wait 1;
|
||
flag_waitopen( "_stealth_spotted" );
|
||
wait 1;
|
||
//dialog_check_path_clear();
|
||
}
|
||
}
|
||
|
||
|
||
|
||
dialog_first_patrol_spotted()
|
||
{
|
||
level.price thread disable_cqbwalk();
|
||
level.price SetLookAtEntity();// clears it
|
||
if( flag( "someone_became_alert" ) )
|
||
return;
|
||
level endon( "someone_became_alert" );
|
||
if( flag( "saying_patience" ) )
|
||
return;
|
||
level endon( "saying_patience" );
|
||
flag_set( "saying_contact" );
|
||
//Contact. Enemy patrol 30 meters to our front.
|
||
radio_dialogue( "cont_pri_30metersfront" );
|
||
|
||
wait 2;
|
||
|
||
//Five men, automatic rifles, frag grenades. One German Shepherd.
|
||
radio_dialogue( "cont_pri_fivemen" );
|
||
|
||
wait .1;
|
||
|
||
//Dogs... I hate dogs.
|
||
radio_dialogue( "cont_cmt_hatedogs" );
|
||
|
||
wait .4;
|
||
|
||
//These Russian dogs are like pussycats compared to the ones in Pripyat.
|
||
radio_dialogue( "cont_pri_russiandogs" );
|
||
|
||
//wait .3;
|
||
//Its good to have you back, old man.
|
||
radio_dialogue( "cont_cmt_haveyouback" );
|
||
|
||
//wait .3;
|
||
//Roger that.
|
||
radio_dialogue( "cont_pri_rogerthat2" );
|
||
flag_clear( "saying_contact" );
|
||
|
||
//wait 3;
|
||
|
||
level.price thread enable_cqbwalk();
|
||
}
|
||
|
||
|
||
dialog_russians_have_sams()
|
||
{
|
||
wait 6;
|
||
|
||
if( flag( "_stealth_spotted" ) )
|
||
return;
|
||
if( flag( "someone_became_alert" ) )
|
||
return;
|
||
level endon( "someone_became_alert" );
|
||
//Soap, our intel was off. The Russians have mobile SAMs.
|
||
level.price dialogue_queue( "cont_pri_intelwasoff" );
|
||
|
||
//Roger that.
|
||
radio_dialogue( "cont_cmt_rogerthat" );
|
||
|
||
//Have you found us some transport?
|
||
level.price dialogue_queue( "cont_pri_foundtransport" );
|
||
//radio_dialogue( "cont_pri_foundtransport" );
|
||
|
||
//I'm working on it. Out.
|
||
radio_dialogue( "cont_cmt_workingonit" );
|
||
}
|
||
|
||
dialog_lets_follow_quietly()
|
||
{
|
||
level endon( "_stealth_spotted" );
|
||
level endon( "someone_became_alert" );
|
||
level waittill( "price_starts_following" );
|
||
if( flag( "saying_contact" ) )
|
||
flag_waitopen( "saying_contact" );
|
||
|
||
if( flag( "said_convoy_coming" ) )
|
||
return;
|
||
|
||
//Let's follow them quietly, and pick off any stragglers.
|
||
radio_dialogue( "cont_pri_pickoffstragglers" );
|
||
}
|
||
|
||
|
||
flag_when_second_group_of_stragglers_are_dead()
|
||
{
|
||
flag_wait( "cross_bridge_patrol_dead" );
|
||
flag_wait( "rightside_patrol_dead" );
|
||
flag_set( "second_group_of_stragglers_are_dead" );
|
||
}
|
||
|
||
|
||
hide_and_kill_everyone()
|
||
{
|
||
if( flag( "second_group_of_stragglers_are_dead" ) )
|
||
return;
|
||
level endon( "second_group_of_stragglers_are_dead" );
|
||
|
||
level endon( "_stealth_spotted" );
|
||
flag_wait( "price_in_position_remaining_group" );
|
||
//wait_till_every_thing_stealth_normal_for( 1 );
|
||
thread price_is_ready_vs_everyone();
|
||
//level endon( "someone_became_alert" );
|
||
|
||
//I'm ready. Lets take them all out at once.
|
||
radio_dialogue( "cont_pri_imready" );
|
||
|
||
if( flag( "cross_bridge_patrol_dead" ) || flag( "rightside_patrol_dead" ) )
|
||
return;
|
||
|
||
//You handle the two on the left.
|
||
radio_dialogue( "cont_pri_twoonleft" );
|
||
}
|
||
|
||
spawn_with_delays()
|
||
{
|
||
if( isdefined( self.script_delay ) )
|
||
wait self.script_delay;
|
||
|
||
self spawn_ai();
|
||
}
|
||
|
||
hide_and_kill_first_stragglers()
|
||
{
|
||
//level.price.dontevershoot = undefined;
|
||
//thread price_takes_next_path_when_they_are_dead();
|
||
if( flag( "_stealth_spotted" ) )
|
||
return;
|
||
level endon( "_stealth_spotted" );
|
||
|
||
flag_wait( "patience" );
|
||
|
||
flag_set( "saying_patience" );
|
||
level notify( "saying_patience" );
|
||
level.price thread enable_cqbwalk();
|
||
//Patience<63>don't do anything stupid.
|
||
radio_dialogue( "cont_pri_patience" );
|
||
wait .5;
|
||
|
||
if( !flag( "start_truck_patrol" ) )
|
||
{
|
||
//We'll have to take 'em out at the same time.
|
||
radio_dialogue( "cont_pri_sametime" );
|
||
}
|
||
|
||
flag_wait( "price_in_position_first_group" );
|
||
flag_wait( "first_stragglers_stopped" );
|
||
flag_wait( "last_truck_left" );
|
||
|
||
wait_till_every_thing_stealth_normal_for( 1 );
|
||
|
||
autosave_by_name( "first_stragglers" );
|
||
|
||
if( flag( "someone_became_alert" ) )
|
||
return;
|
||
level endon( "someone_became_alert" );
|
||
|
||
if( flag( "first_stragglers_dead" ) )
|
||
return;
|
||
level endon( "first_stragglers_dead" );
|
||
|
||
thread price_is_ready_vs_first_stragglers();
|
||
|
||
wait 1;
|
||
flag_wait( "they_have_split_up" );
|
||
|
||
//Now's your chance. Take one of 'em out.
|
||
//radio_dialogue( "cont_pri_yourchance" );
|
||
//iprintlnbold( "Two of them have stopped for a smoke. Take one and I'll take out the other." );
|
||
radio_dialogue( "cont_pri_forasmoke" );
|
||
}
|
||
|
||
|
||
|
||
|
||
price_is_ready_vs_everyone()
|
||
{
|
||
ai = GetAIspeciesArray( "axis", "all" );
|
||
foreach ( actor in ai )
|
||
{
|
||
if( ( isdefined( actor.script_noteworthy ) ) && ( actor.script_noteworthy == "rightside_patrol" ) )
|
||
actor.threatbias = 20000;
|
||
}
|
||
|
||
level.price.ignoreall = false;
|
||
level.player waittill( "weapon_fired" );
|
||
|
||
wait .2; //give enemy chance to die and price chance to pick other target
|
||
|
||
level.price.dontevershoot = undefined;
|
||
level.price.baseaccuracy = 5000000;
|
||
|
||
//ai = getentarray( "first_stragglers", "script_noteworthy" );
|
||
//foreach ( actor in ai )
|
||
//{
|
||
// self.dontattackme = undefined;
|
||
// level.price.favoriteenemy = self;
|
||
// level.price.baseaccuracy = 5000000;
|
||
// self.health = 1;
|
||
//}
|
||
|
||
ai = GetAIspeciesArray( "axis", "all" );
|
||
foreach ( actor in ai )
|
||
{
|
||
actor.no_price_kill_callout = true;
|
||
actor.dontattackme = undefined;
|
||
//level.price.favoriteenemy = actor;
|
||
actor.health = 1;
|
||
}
|
||
|
||
flag_wait( "second_group_of_stragglers_are_dead" );
|
||
|
||
bridge_reset_price_to_stealth();
|
||
}
|
||
|
||
price_is_ready_vs_first_stragglers()
|
||
{
|
||
level.price.ignoreall = false;
|
||
level.player waittill( "weapon_fired" );
|
||
|
||
wait .2; //give enemy chance to die and price chance to pick other target
|
||
|
||
level.price.dontevershoot = undefined;
|
||
level.price.baseaccuracy = 5000000;
|
||
|
||
//ai = getentarray( "first_stragglers", "script_noteworthy" );
|
||
//foreach ( actor in ai )
|
||
//{
|
||
// self.dontattackme = undefined;
|
||
// level.price.favoriteenemy = self;
|
||
// level.price.baseaccuracy = 5000000;
|
||
// self.health = 1;
|
||
//}
|
||
|
||
ai = GetAIspeciesArray( "axis", "all" );
|
||
foreach ( actor in ai )
|
||
{
|
||
if( ( isdefined( actor.script_noteworthy ) ) && ( actor.script_noteworthy == "first_stragglers" ) )
|
||
{
|
||
actor.no_price_kill_callout = true;
|
||
actor.dontattackme = undefined;
|
||
level.price.favoriteenemy = actor;
|
||
actor.health = 1;
|
||
}
|
||
}
|
||
flag_wait( "first_stragglers_dead" );
|
||
|
||
bridge_reset_price_to_stealth();
|
||
}
|
||
|
||
|
||
bridge_reset_price_to_stealth()
|
||
{
|
||
if( flag( "_stealth_spotted" ) )
|
||
return;
|
||
level.price.dontevershoot = true;
|
||
level.price.baseaccuracy = 1;
|
||
level.price.ignoreall = true;
|
||
}
|
||
|
||
|
||
price_helps_kill_group( script_deathflag )
|
||
{
|
||
level endon( "_stealth_spotted" );
|
||
level.price.maxsightdistsqrd = 8000*8000;
|
||
wait .2;
|
||
|
||
level.price.dontevershoot = undefined;
|
||
level.price.baseaccuracy = 5000000;
|
||
|
||
//ai = getentarray( "first_stragglers", "script_noteworthy" );
|
||
//foreach ( actor in ai )
|
||
//{
|
||
// self.dontattackme = undefined;
|
||
// level.price.favoriteenemy = self;
|
||
// level.price.baseaccuracy = 5000000;
|
||
// self.health = 1;
|
||
//}
|
||
|
||
ai = GetAIspeciesArray( "axis", "all" );
|
||
while( !flag( script_deathflag ) )
|
||
{
|
||
foreach ( actor in ai )
|
||
{
|
||
if( !isalive( actor ) )
|
||
continue;
|
||
if( ( isdefined( actor.script_deathflag ) ) && ( actor.script_deathflag == script_deathflag ) )
|
||
{
|
||
//actor.no_price_kill_callout = true;
|
||
actor.dontattackme = undefined;
|
||
actor.threatbias = 5000;
|
||
if( !isalive( level.price.enemy ) )
|
||
level.price.favoriteenemy = actor;
|
||
actor.health = 1;
|
||
}
|
||
}
|
||
wait .1;
|
||
}
|
||
//foreach ( actor in ai )
|
||
//{
|
||
// if( ( isdefined( actor.script_deathflag ) ) && ( actor.script_deathflag == script_deathflag ) )
|
||
// {
|
||
// actor.no_price_kill_callout = true;
|
||
// actor.dontattackme = undefined;
|
||
// level.price.favoriteenemy = actor;
|
||
// actor.health = 1;
|
||
// }
|
||
//}
|
||
//flag_wait( script_deathflag );
|
||
|
||
woods_reset_price_to_stealth();
|
||
}
|
||
|
||
woods_reset_price_to_stealth()
|
||
{
|
||
if( flag( "player_on_ridge" ) )
|
||
return;
|
||
if( flag( "_stealth_spotted" ) )
|
||
return;
|
||
level.price.dontevershoot = true;
|
||
level.price.baseaccuracy = 1;
|
||
level.price.maxsightdistsqrd = level.price_maxsightdistsqrd_woods;
|
||
}
|
||
|
||
//price_takes_next_path_when_they_are_dead()
|
||
//{
|
||
// flag_wait( "first_stragglers_dead" );
|
||
//
|
||
// //clean up
|
||
// if( !flag( "_stealth_spotted" ) )
|
||
// {
|
||
// level.price.dontevershoot = true;
|
||
// ai = GetAIspeciesArray( "axis", "all" );
|
||
// foreach ( actor in ai )
|
||
// self.ignoreme = false;
|
||
// }
|
||
// level.price.baseaccuracy = 1;
|
||
//
|
||
// if( flag( "price_is_hiding" ) )
|
||
// return;
|
||
//
|
||
// price_path_side_of_road = getent( "price_path_side_of_road", "targetname" );
|
||
// level.price thread follow_path( price_path_side_of_road );
|
||
//}
|
||
|
||
|
||
|
||
|
||
hide_from_bridge_convoy()
|
||
{
|
||
//if( flag( "price_is_hiding" ) )
|
||
// return;
|
||
|
||
|
||
thread price_takes_next_path_if_stealth_is_broken();
|
||
//flag_set( "price_is_hiding" );
|
||
//level.price notify( "stop_going_to_node" );
|
||
//level.price disable_dynamic_run_speed();
|
||
//level.price disable_stealth_smart_stance();
|
||
|
||
//level.price notify( "stop_dynamic_run_speed" );
|
||
|
||
//level.price notify( "stop_going_to_node" );//end follow_path
|
||
|
||
//level.price enable_ai_color();
|
||
//level.price set_force_color( "y" );
|
||
|
||
//price_hides_from_convoy = getnode( "price_hides_from_convoy", "targetname" );
|
||
//level.price setgoalnode( price_hides_from_convoy );
|
||
|
||
level.price.ignoreall = true;
|
||
|
||
level endon( "_stealth_spotted" );
|
||
|
||
flag_wait_or_timeout( "last_jeep_arrived", 20 );
|
||
|
||
wait 4;
|
||
|
||
wait_till_every_thing_stealth_normal_for( 1 );
|
||
|
||
//Looks like they saw your parachute.
|
||
radio_dialogue( "cont_pri_yourparachute" );
|
||
|
||
//hide_from_right_side_of_bridge_patrol();
|
||
|
||
//hide_from_cross_bridge_patrol();
|
||
|
||
flag_set( "convoy_hide_section_complete" );
|
||
autosave_stealth();
|
||
|
||
thread dialog_lets_keep_moving();
|
||
|
||
level.price.ignoreall = false;
|
||
level.price thread enable_cqbwalk();
|
||
price_goes_halfway_across_bridge = getnode( "price_goes_halfway_across_bridge", "targetname" );
|
||
level.price thread price_smart_path_following( price_goes_halfway_across_bridge );
|
||
|
||
|
||
|
||
//level.price thread price_move_speed_think();
|
||
//level.price enable_stealth_smart_stance();
|
||
//level.price enable_dynamic_run_speed();
|
||
|
||
//path_start_cross_bridge = getent( "path_start_cross_bridge", "targetname" );
|
||
//level.price thread follow_path( path_start_cross_bridge );
|
||
//level.price.ignoreall = false;
|
||
}
|
||
|
||
|
||
|
||
|
||
dialog_lets_keep_moving()
|
||
{
|
||
//level endon( "someone_became_alert" );
|
||
//level waittill( "price_goes_halfway_across_bridge" );
|
||
|
||
//Let's keep moving.
|
||
thread radio_dialogue( "cont_pri_keepmoving" );
|
||
}
|
||
|
||
price_takes_next_path_if_stealth_is_broken()
|
||
{
|
||
level endon( "convoy_hide_section_complete" );
|
||
flag_wait( "_stealth_spotted" );
|
||
wait 1;
|
||
flag_waitopen( "_stealth_spotted" );
|
||
wait 2;
|
||
|
||
//Let's keep moving.
|
||
//thread radio_dialogue( "cont_pri_keepmoving" );
|
||
|
||
|
||
//level.price thread price_move_speed_think();
|
||
//level.price enable_stealth_smart_stance();
|
||
//level.price enable_dynamic_run_speed();
|
||
|
||
level.price thread enable_cqbwalk();
|
||
price_goes_halfway_across_bridge = getnode( "price_goes_halfway_across_bridge", "targetname" );
|
||
level.price thread price_smart_path_following( price_goes_halfway_across_bridge );
|
||
|
||
|
||
//path_start_cross_bridge = getent( "path_start_cross_bridge", "targetname" );
|
||
//level.price thread follow_path( path_start_cross_bridge );
|
||
//level.price.ignoreall = false;
|
||
}
|
||
|
||
dialog_wait_for_me_to_get_into_position()
|
||
{
|
||
//Wait for me to get into position.
|
||
radio_dialogue( "cont_pri_waitposition" );
|
||
}
|
||
|
||
//hide_from_right_side_of_bridge_patrol()
|
||
//{
|
||
// if( flag( "rightside_patrol_dead" ) )
|
||
// return; //skips the autosave
|
||
// wait_till_every_thing_stealth_normal_for( 2 );
|
||
//
|
||
// //iprintlnbold( "Take out the two in the woods on the otherside of the bridge" );
|
||
// if( !flag( "rightside_patrol_dead" ) )
|
||
// radio_dialogue( "cont_pri_twoinwoods" );
|
||
//
|
||
// flag_wait( "rightside_patrol_dead" );
|
||
//
|
||
// autosave_stealth();
|
||
//}
|
||
//
|
||
//hide_from_cross_bridge_patrol()
|
||
//{
|
||
// if( flag( "cross_bridge_patrol_dead" ) )
|
||
// return; //skips the autosave
|
||
// wait 2;
|
||
// wait_till_every_thing_stealth_normal_for( 2 );
|
||
//
|
||
// if( !flag( "cross_bridge_patrol_dead" ) )
|
||
// {
|
||
// ai = GetAIspeciesArray( "axis", "all" );
|
||
// foreach ( actor in ai )
|
||
// {
|
||
// if( ( isdefined( actor.script_noteworthy ) ) && ( actor.script_noteworthy == "cross_bridge_patrol" ) )
|
||
// actor SetThreatBiasGroup( "bridge_guys" );
|
||
// }
|
||
// SetThreatBiasAgainstAll( "bridge_guys", 2000 );
|
||
//
|
||
// price_targets_bridge_patrol = getnode( "price_targets_bridge_patrol", "targetname" );
|
||
// level.price setgoalnode( price_targets_bridge_patrol );
|
||
//
|
||
// thread dialog_wait_for_me_to_get_into_position();
|
||
// //level.price.ignoreall = false;
|
||
//
|
||
// //thread price_ignores_truck_guys_momentarily();
|
||
//
|
||
// flag_wait( "price_in_position_vs_bridge" );
|
||
//
|
||
// thread price_is_ready_vs_bridge_patrol();
|
||
//
|
||
// wait 2;
|
||
//
|
||
// //iprintlnbold( "I'm ready. Lets take them all out at once." );
|
||
// radio_dialogue( "cont_pri_imready" );
|
||
// }
|
||
//
|
||
// flag_wait( "cross_bridge_patrol_dead" );
|
||
//
|
||
// autosave_stealth();
|
||
//}
|
||
|
||
//price_ignores_truck_guys_momentarily()
|
||
//{
|
||
// //Make first group ignored by second group
|
||
// SetIgnoreMeGroup( "truck_guys", "price" );
|
||
// level.price.ignoreall = false;
|
||
//
|
||
// flag_wait_either( "cross_bridge_patrol_dead", "_stealth_spotted" );
|
||
//
|
||
// //SetThreatBias( "truck_guys", "price", 0 );
|
||
// SetThreatBias( "price", "truck_guys", 0 );
|
||
//}
|
||
|
||
|
||
price_is_ready_vs_bridge_patrol()
|
||
{
|
||
level.player waittill( "weapon_fired" );
|
||
|
||
wait .2; //give enemy chance to die and price chance to pick other target
|
||
|
||
level.price.dontevershoot = undefined;
|
||
level.price.baseaccuracy = 5000000;
|
||
level.price.ignoreall = false;
|
||
|
||
//ai = getentarray( "first_stragglers", "script_noteworthy" );
|
||
//foreach ( actor in ai )
|
||
//{
|
||
// self.dontattackme = undefined;
|
||
// level.price.favoriteenemy = self;
|
||
// level.price.baseaccuracy = 5000000;
|
||
// self.health = 1;
|
||
//}
|
||
|
||
ai = GetAIspeciesArray( "axis", "all" );
|
||
foreach ( actor in ai )
|
||
{
|
||
if( ( isdefined( actor.script_noteworthy ) ) && ( actor.script_noteworthy == "cross_bridge_patrol" ) )
|
||
{
|
||
actor.no_price_kill_callout = true;
|
||
actor.dontattackme = undefined;
|
||
level.price.favoriteenemy = actor;
|
||
actor.health = 1;
|
||
}
|
||
}
|
||
}
|
||
|
||
dialog_woods_first_patrol()
|
||
{
|
||
level.player endon( "weapon_fired" );
|
||
flag_wait( "dialog_woods_first_patrol" );
|
||
|
||
//wait 6;
|
||
|
||
if( flag( "someone_became_alert" ) )
|
||
return;
|
||
|
||
//iprintlnbold( "let them pass" );
|
||
//Let them pass.
|
||
level.price radio_dialogue( "cont_pri_letpass" );
|
||
}
|
||
|
||
dialog_woods_first_dog_patrol()
|
||
{
|
||
flag_wait( "dialog_woods_first_dog_patrol" );
|
||
|
||
if( flag( "someone_became_alert" ) )
|
||
return;
|
||
|
||
autosave_stealth();
|
||
//Dog patrol.
|
||
level.price radio_dialogue( "cont_pri_dogpatrol" );
|
||
}
|
||
|
||
|
||
dialog_woods_first_stationary()
|
||
{
|
||
flag_wait( "dialog_woods_first_stationary" );
|
||
|
||
if( flag( "someone_became_alert" ) )
|
||
return;
|
||
|
||
if( flag( "first_stationary_dead" ) )
|
||
return;
|
||
|
||
autosave_stealth();
|
||
level endon( "someone_became_alert" );
|
||
//Three man patrol dead ahead.
|
||
level.price radio_dialogue( "cont_pri_3manpatrol" );
|
||
|
||
weap = level.player getcurrentweapon();
|
||
if( ( weap != level.starting_sidearm ) && ( weap != level.starting_rifle ) )
|
||
{
|
||
//Firing an unsuppressed weapon is going to alert a lot of enemies, Roach.
|
||
level.price radio_dialogue( "cont_pri_alertenemies" );
|
||
}
|
||
|
||
//Take them out or leave them be. It's your call.
|
||
level.price radio_dialogue( "cont_pri_yourcall" );
|
||
|
||
level.dont_brag_when_following_your_own_orders_time = gettime();
|
||
}
|
||
|
||
|
||
price_is_ready_vs_blocking_stationary()
|
||
{
|
||
ai = GetAIspeciesArray( "axis", "all" );
|
||
foreach ( actor in ai )
|
||
{
|
||
if( !isdefined( actor.script_noteworthy ) )
|
||
continue;
|
||
if( actor.script_noteworthy == "blocking_group_left_two" )
|
||
actor.threatbias = 20000;
|
||
}
|
||
|
||
|
||
level.player waittill( "weapon_fired" );
|
||
level.price.maxsightdistsqrd = 8000*8000;
|
||
|
||
wait .2; //give enemy chance to die and price chance to pick other target
|
||
|
||
level.price.dontevershoot = undefined;
|
||
level.price.baseaccuracy = 5000000;
|
||
|
||
//ai = getentarray( "first_stragglers", "script_noteworthy" );
|
||
//foreach ( actor in ai )
|
||
//{
|
||
// self.dontattackme = undefined;
|
||
// level.price.favoriteenemy = self;
|
||
// level.price.baseaccuracy = 5000000;
|
||
// self.health = 1;
|
||
//}
|
||
|
||
|
||
|
||
ai = GetAIspeciesArray( "axis", "all" );
|
||
while( !flag( "blocking_stationary_dead" ) )
|
||
{
|
||
foreach ( actor in ai )
|
||
{
|
||
if( !isalive( actor ) )
|
||
continue;
|
||
if( !isdefined( actor.script_noteworthy ) )
|
||
continue;
|
||
if( actor.script_noteworthy == "blocking_group_left_two" )
|
||
{
|
||
if( !isalive( level.price.enemy ) )
|
||
level.price.favoriteenemy = actor;
|
||
//actor.no_price_kill_callout = true;
|
||
actor.dontattackme = undefined;
|
||
//level.price.favoriteenemy = actor;
|
||
actor.health = 1;
|
||
}
|
||
}
|
||
|
||
foreach ( actor in ai )
|
||
{
|
||
if( !isalive( actor ) )
|
||
continue;
|
||
if( !isdefined( actor.script_noteworthy ) )
|
||
continue;
|
||
if( actor.script_noteworthy == "two_on_right" )
|
||
{
|
||
//actor.no_price_kill_callout = true;
|
||
actor.dontattackme = undefined;
|
||
//level.price.favoriteenemy = actor;
|
||
actor.health = 1;
|
||
}
|
||
}
|
||
wait .1;
|
||
}
|
||
woods_reset_price_to_stealth();
|
||
|
||
//ai = GetAIspeciesArray( "axis", "all" );
|
||
//foreach ( actor in ai )
|
||
//{
|
||
// if( isdefined( actor.script_noteworthy ) )
|
||
// {
|
||
// if( ( actor.script_noteworthy == "two_on_right" ) || ( actor.script_noteworthy == "blocking_group_right_two" ) )
|
||
// {
|
||
// if( actor.script_noteworthy == "two_on_right" )
|
||
// actor.threatbias = 2000;
|
||
// actor.no_price_kill_callout = true;
|
||
// actor.dontattackme = undefined;
|
||
// //level.price.favoriteenemy = actor;
|
||
// actor.health = 1;
|
||
// }
|
||
// }
|
||
//}
|
||
}
|
||
|
||
|
||
dialog_woods_blocking_stationary()
|
||
{
|
||
flag_wait( "dialog_woods_blocking_stationary" );
|
||
|
||
if( flag( "someone_became_alert" ) )
|
||
return;
|
||
|
||
if( flag( "blocking_stationary_dead" ) )
|
||
return;
|
||
|
||
autosave_stealth();
|
||
level endon( "someone_became_alert" );
|
||
|
||
thread price_is_ready_vs_blocking_stationary();
|
||
|
||
//Large patrol at 12 o'clock.
|
||
level.price radio_dialogue( "cont_pri_largepatrol12" );
|
||
|
||
//We can't slip by them. Get ready to take them out quickly.
|
||
level.price radio_dialogue( "cont_pri_cantslipby" );
|
||
|
||
level.price radio_dialogue( "cont_pri_twoonright" );
|
||
|
||
//level.price thread add_dialogue_line( "Price", "Take the two on the right." );
|
||
//iprintlnbold( "You handle the two on the left" );
|
||
//level.price radio_dialogue( "cont_pri_twoonleft" );
|
||
|
||
level.dont_brag_when_following_your_own_orders_time = gettime();
|
||
|
||
//two_on_right
|
||
}
|
||
|
||
dialog_woods_second_dog_patrol()
|
||
{
|
||
flag_wait( "dialog_woods_second_dog_patrol" );
|
||
|
||
if( flag( "someone_became_alert" ) )
|
||
return;
|
||
|
||
autosave_stealth();
|
||
|
||
end_patrol = getentarray( "end_patrol", "targetname" );
|
||
foreach( guy in end_patrol )
|
||
{
|
||
if( isalive( guy ) )
|
||
guy.threatbias = 10000;
|
||
}
|
||
//We got another dog patrol.
|
||
level.price radio_dialogue( "cont_pri_anotherdogpatrol" );
|
||
|
||
//iprintlnbold( "Take them out or try to slip past. Your call." );
|
||
level.price radio_dialogue( "cont_pri_slippast" );
|
||
|
||
}
|
||
|
||
|
||
dialog_convoy_coming()
|
||
{
|
||
level endon( "_stealth_spotted" );
|
||
level endon( "someone_became_alert" );
|
||
|
||
flag_set( "said_convoy_coming" );
|
||
level notify( "said_convoy_coming" );
|
||
//Convoy coming, get out of sight.
|
||
//level.price dialogue_queue( "cont_pri_convoycoming" );
|
||
level.price radio_dialogue( "cont_pri_convoycoming" );
|
||
|
||
//wait 13;
|
||
|
||
wait 2;
|
||
|
||
//Let them pass.
|
||
//level.price dialogue_queue( "cont_pri_letthempass" );
|
||
level.price radio_dialogue( "cont_pri_letthempass" );
|
||
}
|
||
|
||
|
||
|
||
dialog_theyre_looking_for_you()
|
||
{
|
||
current_line = 0;
|
||
dialog = [];
|
||
|
||
//Quick! Hide in the woods! You alerted one of them!
|
||
dialog[ dialog.size ] = "cont_pri_hideinwoods";
|
||
//Get into the woods! Hide!
|
||
dialog[ dialog.size ] = "cont_pri_getintowoods";
|
||
//They're alerted! Hide in the woods! Move!
|
||
dialog[ dialog.size ] = "cont_pri_theyrealerted";
|
||
|
||
while( 1 )
|
||
{
|
||
level waittill( "dialog_someone_is_alert" );
|
||
|
||
dialog_line = dialog[ current_line ];
|
||
radio_dialogue_clear_stack();
|
||
radio_dialogue( dialog_line );//dont cut off the other line but clear the que
|
||
if( current_line >= dialog.size )
|
||
current_line = 0;
|
||
|
||
}
|
||
}
|
||
|
||
|
||
monitor_price_hides_on_alerts()
|
||
{
|
||
while( 1 )
|
||
{
|
||
flag_wait( "someone_became_alert" );
|
||
if( !flag( "price_is_hiding" ) )
|
||
{
|
||
level.price.fixednode = true;
|
||
level.price enable_ai_color();
|
||
level.price set_force_color( "y" );
|
||
|
||
flag_set( "price_is_hiding" );
|
||
}
|
||
flag_waitopen( "someone_became_alert" );
|
||
}
|
||
}
|
||
|
||
monitor_someone_became_alert()
|
||
{
|
||
self endon( "death" );
|
||
|
||
self ent_flag_waitopen( "_stealth_normal" );
|
||
|
||
self.ignoreme = false;
|
||
|
||
if( flag( "someone_became_alert" ) )
|
||
return;
|
||
|
||
flag_set( "someone_became_alert" );
|
||
thread monitor_waittill_stealth_normal();
|
||
|
||
wait 1;//gives player a chance to kill the guy before warning dialog
|
||
|
||
if( flag( "_stealth_spotted" ) )
|
||
return;
|
||
|
||
level notify( "dialog_someone_is_alert" );
|
||
}
|
||
|
||
monitor_waittill_stealth_normal()
|
||
{
|
||
wait_till_every_thing_stealth_normal_for( 3 );
|
||
|
||
flag_clear( "someone_became_alert" );
|
||
}
|
||
|
||
|
||
wait_till_every_thing_stealth_normal_for( time )
|
||
{
|
||
while( 1 )
|
||
{
|
||
if( stealth_is_everything_normal() )
|
||
{
|
||
wait time;
|
||
if( stealth_is_everything_normal() )
|
||
return;
|
||
}
|
||
wait 1;
|
||
}
|
||
}
|
||
|
||
|
||
|
||
dialog_into_the_woods()
|
||
{
|
||
//FOLLOW ME!
|
||
level.price dialogue_queue( "cont_pri_followme" );
|
||
//level.price radio_dialogue( "cont_pri_followme" );
|
||
|
||
wait 2;
|
||
|
||
//INTO THE WOODS! LETS GO! LETS GO!
|
||
level.price dialogue_queue( "cont_pri_intothewoods" );
|
||
//level.price radio_dialogue( "cont_pri_intothewoods" );
|
||
}
|
||
|
||
dialog_sub_spotted()
|
||
{
|
||
level endon( "base_alerted" );
|
||
flag_wait( "said_second_uav_in_position" );
|
||
wait 1;
|
||
|
||
flag_wait( "obj_base_entrance" );
|
||
//There's the submarine! Right below that crane!
|
||
level.price dialogue_queue( "cont_pri_belowcrane" );
|
||
|
||
//Roach, soften up their defenses with the Hellfires!
|
||
level.price dialogue_queue( "cont_pri_softendefenses" );
|
||
|
||
autosave_by_name( "base" );
|
||
|
||
wait 1;
|
||
|
||
level.player thread display_hint_timeout( "hint_predator_drone", 6 );
|
||
|
||
//Watch for the blinking strobes. That<61>s us.
|
||
level.price dialogue_queue( "cont_pri_strobes" );
|
||
}
|
||
|
||
dialog_base_on_alert()
|
||
{
|
||
flag_set( "saying_base_on_alert" );
|
||
|
||
//That got their attention!
|
||
radio_dialogue( "cont_cmt_gotattention" );
|
||
|
||
//The whole base has gone on alert!
|
||
radio_dialogue( "cont_cmt_baseonalert" );
|
||
|
||
//You'd better hurry. You've only got a couple of minutes before that submarine dives.
|
||
radio_dialogue( "cont_cmt_betterhurry" );
|
||
|
||
// MikeD: Restore uav radio in _remotemissile, and let the player know if the the uav is 'reloading'
|
||
level.uav_radio_disabled = undefined;
|
||
|
||
//We're moving!
|
||
level.price dialogue_queue( "cont_pri_weremoving" );
|
||
|
||
flag_clear( "saying_base_on_alert" );
|
||
}
|
||
|
||
|
||
|
||
dialog_progress_through_base()
|
||
{
|
||
flag_wait( "player_is_halfway_to_sub" );
|
||
//You're halfway there!
|
||
radio_dialogue( "cont_cmt_halwaythere" );
|
||
|
||
|
||
if( isalive( level.base_heli ) )
|
||
{
|
||
//Take out that helicopter!
|
||
level.price dialogue_queue( "cont_pri_takeoutheli" );
|
||
level.base_heli MakeEntitySentient( "axis" );
|
||
}
|
||
|
||
flag_wait( "base_troop_transport2_spawned" );
|
||
|
||
wait 2;
|
||
|
||
//Use a Hellfire on that truck!
|
||
level.price dialogue_queue( "cont_pri_usehellfire" );
|
||
}
|
||
|
||
dialog_time_nags( total_time )
|
||
{
|
||
time_past = 0;
|
||
|
||
dialog = [];
|
||
//We've got to hurry! That sub isn't going to wait for us!
|
||
dialog[ dialog.size ] = "cont_pri_subwontwait";
|
||
//Go go go!
|
||
dialog[ dialog.size ] = "cont_pri_gogogo";
|
||
//Get to the sub! Hurry!
|
||
dialog[ dialog.size ] = "cont_pri_gettosub";
|
||
dialog = array_randomize( dialog );
|
||
current = 0;
|
||
|
||
while( 1 )
|
||
{
|
||
wait 30;
|
||
time_past = time_past + 30;
|
||
time_remaining = total_time - time_past;
|
||
|
||
if( time_remaining == 90 )
|
||
{
|
||
//90 seconds!
|
||
radio_dialogue( "cont_cmt_90secs" );
|
||
continue;
|
||
}
|
||
|
||
if( time_remaining == 60 )
|
||
{
|
||
//60 seconds!
|
||
radio_dialogue( "cont_cmt_60secs" );
|
||
continue;
|
||
}
|
||
|
||
if( time_remaining == 30 )
|
||
{
|
||
//30 seconds! Move!
|
||
radio_dialogue( "cont_cmt_30secs" );
|
||
continue;
|
||
}
|
||
if( time_remaining == 0 )
|
||
{
|
||
break;
|
||
}
|
||
if( cointoss() )
|
||
{
|
||
level.price dialogue_queue( dialog[current] );
|
||
current++;
|
||
if( current >= dialog.size )
|
||
current = 0;
|
||
}
|
||
}
|
||
}
|
||
|
||
dialog_at_sub()
|
||
{
|
||
//Soap, we've reached the sub!
|
||
level.price dialogue_queue( "cont_pri_reachedsub" );
|
||
|
||
//Roger that!
|
||
radio_dialogue( "cont_cmt_rogerthat2" );
|
||
}
|
||
|
||
kill_btr_slider( newMissile )
|
||
{
|
||
fire_time = gettime();
|
||
newMissile waittill( "death" );
|
||
if( gettime() > fire_time + 2000 )
|
||
return;//we missed
|
||
|
||
self setmodel( "vehicle_btr80_snow_d" );
|
||
playfx( getfx( "btr_explosion" ), self.origin );
|
||
StopFXOnTag( getfx( "btr_spotlight" ), self, "TAG_FRONT_LIGHT_RIGHT" );
|
||
StopFXOnTag( getfx( "btr_spotlight" ), self, "TAG_TURRET_LIGHT" );
|
||
}
|
||
|
||
|
||
dialog_intro()
|
||
{
|
||
level endon( "saying_contact" );
|
||
|
||
level.price SetLookAtEntity( level.player );
|
||
|
||
//wait 5;
|
||
|
||
|
||
//Price, I can barely see Roach's chute on my satellite feed. Too much interference. Do you see him, over?
|
||
radio_dialogue( "cont_cmt_barelysee" );
|
||
|
||
level.price SetLookAtEntity();// clears it
|
||
|
||
//Soap, I found Roach. He appears to be intact.
|
||
//level.price dialogue_queue( "cont_pri_foundroach" );
|
||
level.price radio_dialogue( "cont_pri_foundroach" );
|
||
|
||
//We're going to head northwest to the sub base, over.
|
||
//level.price dialogue_queue( "cont_pri_headnw" );
|
||
level.price radio_dialogue( "cont_pri_headnw" );
|
||
|
||
wait 1;
|
||
|
||
//Copy that. I've located Rasta and Alpha, they landed pretty far to the east, over.
|
||
radio_dialogue( "cont_cmt_fareast" );
|
||
|
||
//Tell them to proceed with the mission, we'll regroup if possible.
|
||
//level.price dialogue_queue( "cont_pri_proceed" );
|
||
level.price radio_dialogue( "cont_pri_proceed" );
|
||
|
||
//wait 1;
|
||
//
|
||
////Have you found us some transport, over?
|
||
//level.price radio_dialogue( "cont_pri_foundtransport" );
|
||
//
|
||
////I'm working on it. Out.
|
||
//radio_dialogue( "cont_cmt_workingonit" );
|
||
|
||
//level.price SetLookAtEntity( level.player );
|
||
|
||
wait 1;
|
||
|
||
flag_set( "said_follow_me" );
|
||
|
||
//Roach, follow me and stay out of sight.
|
||
radio_dialogue( "cont_pri_outofsight" );
|
||
|
||
//level.price SetLookAtEntity();// clears it
|
||
}
|
||
|
||
|
||
stealth_music_control()
|
||
{
|
||
//DEFINE_BASE_MUSIC_TIME = 143.5;
|
||
//DEFINE_ESCAPE_MUSIC_TIME = 136;
|
||
//DEFINE_SPOTTED_MUSIC_TIME = 117;
|
||
|
||
if( flag( "stop_stealth_music" ) )
|
||
return;
|
||
level endon ( "stop_stealth_music" );
|
||
|
||
//flag_wait( "first_two_guys_in_sight" );
|
||
|
||
while( 1 )
|
||
{
|
||
thread stealth_music_hidden_loop();
|
||
|
||
flag_wait( "_stealth_spotted" );
|
||
|
||
music_stop( .2 );
|
||
wait .5;
|
||
thread stealth_music_busted_loop();
|
||
|
||
flag_waitopen( "_stealth_spotted" );
|
||
|
||
music_stop( 3 );
|
||
wait 3.25;
|
||
}
|
||
}
|
||
|
||
|
||
stealth_music_hidden_loop()
|
||
{
|
||
music_TIME = musicLength( "contingency_stealth" );
|
||
//music_TIME = 528;
|
||
//level endon( "player_in_hanger" );
|
||
level endon( "_stealth_spotted" );
|
||
|
||
if( flag( "stop_stealth_music" ) )
|
||
return;
|
||
level endon ( "stop_stealth_music" );
|
||
|
||
while( 1 )
|
||
{
|
||
MusicPlayWrapper( "contingency_stealth" );
|
||
|
||
wait music_TIME;
|
||
|
||
wait 10;
|
||
}
|
||
}
|
||
|
||
stealth_music_busted_loop()
|
||
{
|
||
music_TIME = musicLength( "contingency_stealth_busted" );
|
||
//music_TIME = 154;
|
||
//level endon( "player_in_hanger" );
|
||
level endon( "_stealth_spotted" );
|
||
if( flag( "stop_stealth_music" ) )
|
||
return;
|
||
level endon ( "stop_stealth_music" );
|
||
while( 1 )
|
||
{
|
||
MusicPlayWrapper( "contingency_stealth_busted" );
|
||
|
||
wait music_TIME;
|
||
|
||
wait 3;
|
||
}
|
||
}
|
||
|
||
|
||
cargo_choppers2()
|
||
{
|
||
cargo_heli_spawners = getentarray( "cargo_heli_group2", "targetname" );
|
||
foreach ( spawner in cargo_heli_spawners )
|
||
{
|
||
Cargo_item_spawners = getentarray( spawner.script_noteworthy, "targetname" );
|
||
foreach ( ent in cargo_item_spawners )
|
||
ent Hide();
|
||
spawner.cargo_item_spawners = cargo_item_spawners;
|
||
}
|
||
|
||
flag_wait( "cargo_choppers_2" );
|
||
|
||
thread dialog_russians_have_sams();
|
||
|
||
current_spawner = 0;
|
||
num_of_groups = 1;
|
||
while( num_of_groups > 0 )
|
||
{
|
||
//group = randomintrange( 2, 4 );
|
||
group = cargo_heli_spawners.size;
|
||
|
||
while( group > 0 )
|
||
{
|
||
if( current_spawner >= cargo_heli_spawners.size )
|
||
current_spawner = 0;
|
||
thread spawn_cargo_chopper( cargo_heli_spawners[current_spawner] );
|
||
current_spawner++;
|
||
wait ( randomfloatrange(1.3, 1.8 ) );
|
||
group--;
|
||
}
|
||
num_of_groups--;
|
||
//flag_wait( "second_heli_group" );
|
||
//wait( randomintrange( 15, 24 ) );
|
||
}
|
||
}
|
||
|
||
cargo_choppers()
|
||
{
|
||
cargo_heli_spawners = getentarray( "cargo_heli", "targetname" );
|
||
foreach ( spawner in cargo_heli_spawners )
|
||
{
|
||
Cargo_item_spawners = getentarray( spawner.script_noteworthy, "targetname" );
|
||
foreach ( ent in cargo_item_spawners )
|
||
ent Hide();
|
||
spawner.cargo_item_spawners = cargo_item_spawners;
|
||
}
|
||
|
||
current_spawner = 0;
|
||
num_of_groups = 1;
|
||
while( num_of_groups > 0 )
|
||
{
|
||
//group = randomintrange( 2, 4 );
|
||
group = cargo_heli_spawners.size;
|
||
|
||
while( group > 0 )
|
||
{
|
||
if( current_spawner >= cargo_heli_spawners.size )
|
||
current_spawner = 0;
|
||
thread spawn_cargo_chopper( cargo_heli_spawners[current_spawner] );
|
||
current_spawner++;
|
||
wait ( randomfloatrange(1.3, 1.8 ) );
|
||
group--;
|
||
}
|
||
num_of_groups--;
|
||
//flag_wait( "second_heli_group" );
|
||
//wait( randomintrange( 15, 24 ) );
|
||
}
|
||
}
|
||
|
||
spawn_cargo_chopper( cargo_heli_spawner )
|
||
{
|
||
cargo_heli = vehicle_spawn( cargo_heli_spawner );
|
||
//cargo_heli = spawn_vehicle_from_targetname( "cargo_heli" );
|
||
wait .1;//vehicle spawns in one place and then moves on the first frame
|
||
cargo_item_spawners = cargo_heli_spawner.cargo_item_spawners;
|
||
new_cargo = [];
|
||
for( i = 0 ; i < cargo_item_spawners.size ; i++ )
|
||
{
|
||
new_cargo[i] = spawn( cargo_item_spawners[i].classname, cargo_item_spawners[i].origin );
|
||
new_cargo[i].angles = cargo_item_spawners[i].angles;
|
||
if( new_cargo[i].classname == "script_model" )
|
||
new_cargo[i] setmodel( cargo_item_spawners[i].model );
|
||
new_cargo[i] linkto( cargo_heli );
|
||
}
|
||
|
||
wait .1;
|
||
|
||
thread gopath( cargo_heli );
|
||
|
||
cargo_heli waittill( "death" );
|
||
|
||
foreach ( ent in new_cargo )
|
||
ent Delete();
|
||
}
|
||
|
||
|
||
destroy_thing_with_at4( fire_pos_ent, thing, thing_offset, missile_func )
|
||
{
|
||
tag = "TAG_WEAPON_CHEST";
|
||
guys = [];
|
||
guys[ guys.size ] = self;
|
||
|
||
fire_pos_ent anim_reach_and_plant( guys, "at4_fire" );
|
||
self.allowPain = false;
|
||
self notify( "finished_anim_reach" );
|
||
|
||
fire_pos_ent thread anim_custom_animmode( guys, "gravity", "at4_fire" );
|
||
|
||
//price_fire_loc anim_reach_solo( level.price, "at4_fire" );
|
||
//price_fire_loc thread anim_single_solo( level.price, "at4_fire" );
|
||
|
||
self waittill( "attach rocket" );//notetrack
|
||
|
||
self place_weapon_on( "at4", "chest" );
|
||
//self detach( "weapon_AT4", "TAG_STOWED_BACK" );
|
||
//self attach( "weapon_AT4", tag );
|
||
|
||
self waittill( "fire rocket" );//notetrack
|
||
|
||
gun = self gettagorigin( tag );
|
||
newMissile = MagicBullet( "at4_straight", gun, ( thing.origin + thing_offset ) );
|
||
//if( isdefined( missile_func ) )
|
||
// level.btr_slider thread kill_btr_slider( newMissile );
|
||
|
||
self waittill( "drop rocket" );//notetrack
|
||
|
||
org_hand = self gettagorigin( tag );
|
||
angles_hand = self gettagangles( tag );
|
||
|
||
self place_weapon_on( "at4", "none" );
|
||
|
||
model_at4 = spawn( "script_model", org_hand );
|
||
model_at4 setmodel( "weapon_at4" );
|
||
model_at4.angles = angles_hand;
|
||
|
||
fire_pos_ent waittill( "at4_fire" );
|
||
self.allowPain = true;
|
||
}
|
||
|
||
setup_village_defenders()
|
||
{
|
||
self waittill( "death" );
|
||
level.village_defenders_dead++;
|
||
}
|
||
|
||
setup_bricktop()
|
||
{
|
||
level.bricktop = self;
|
||
self.animname = "bricktop";
|
||
//self thread magic_bullet_shield();
|
||
|
||
//flag_wait( "base_alerted" );
|
||
|
||
//self thread stop_magic_bullet_shield();
|
||
//self thread replace_on_death();
|
||
}
|
||
|
||
setup_base_redshirt()
|
||
{
|
||
self thread replace_on_death();
|
||
}
|
||
|
||
setup_village_redshirt()
|
||
{
|
||
//self thread magic_bullet_shield();
|
||
|
||
//flag_wait( "base_alerted" );
|
||
|
||
//self thread stop_magic_bullet_shield();
|
||
//self thread replace_on_death();
|
||
}
|
||
|
||
setup_bricktop_village()
|
||
{
|
||
self thread magic_bullet_shield();
|
||
|
||
if( isalive( level.gauntlet_east ) )
|
||
{
|
||
self place_weapon_on( "at4", "back" );
|
||
|
||
|
||
fire_pos_ent = getent( self.target, "targetname" );
|
||
thing = level.gauntlet_east;
|
||
thing_offset = (0,0,64);
|
||
self thread destroy_thing_with_at4( fire_pos_ent, thing, thing_offset );
|
||
|
||
self waittill( "finished_anim_reach" );
|
||
|
||
//Stand back!
|
||
level.rasta dialogue_queue( "cont_rst_standback" );
|
||
|
||
|
||
fire_pos_ent waittill( "at4_fire" );
|
||
}
|
||
self thread stop_magic_bullet_shield();
|
||
|
||
self set_force_color( "g" );
|
||
self enable_ai_color();
|
||
}
|
||
|
||
setup_rasta()
|
||
{
|
||
self.animname = "rasta";
|
||
level.rasta = self;
|
||
self thread magic_bullet_shield();
|
||
}
|
||
|
||
setup_rasta_village()
|
||
{
|
||
|
||
if( isalive( level.gauntlet_west ) )
|
||
{
|
||
self place_weapon_on( "at4", "back" );
|
||
|
||
|
||
fire_pos_ent = getent( self.target, "targetname" );
|
||
thing = level.gauntlet_west;
|
||
thing_offset = (0,0,64);
|
||
self thread destroy_thing_with_at4( fire_pos_ent, thing, thing_offset );
|
||
|
||
self waittill( "finished_anim_reach" );
|
||
|
||
//Get back!
|
||
level.rasta dialogue_queue( "cont_rst_getback" );
|
||
|
||
|
||
fire_pos_ent waittill( "at4_fire" );
|
||
}
|
||
|
||
self set_force_color( "g" );
|
||
self enable_ai_color();
|
||
|
||
|
||
|
||
//Check your fire! Check your fire! Friendlies coming in at your 12!
|
||
level.rasta dialogue_queue( "cont_rst_checkfire" );
|
||
}
|
||
/*
|
||
self.goalradius = 32;
|
||
start = getent( "rasta_start", "targetname" );
|
||
|
||
self setgoalpos ( start.origin );
|
||
self waittill( "goal" );
|
||
|
||
first_grenade_target = getent( start.target, "targetname" );
|
||
target_org = first_grenade_target.origin;
|
||
org = self gettagorigin( "TAG_INHAND" );
|
||
|
||
vec = VectorNormalize( target_org - org );
|
||
forward = vector_multiply( vec, 30 );
|
||
pos = forward + org;
|
||
|
||
self.grenadeawareness = 0;
|
||
//draw_line_for_time( <org1> , <org2> , <r> , <g> , <b> , <timer> )
|
||
//thread draw_line_for_time( pos , target_org , 1 , 0, 0 , 3 );
|
||
grenade = MagicGrenade( "semtex_grenade", pos, target_org );
|
||
grenade thread maps\_detonategrenades::semtex_sticky_handle( self );
|
||
|
||
//Stand back!
|
||
thread dialogue_queue( "cont_rst_standback" );
|
||
|
||
wait 1;
|
||
|
||
second_grenade_throw_position = getent( first_grenade_target.target, "targetname" );
|
||
|
||
self setgoalpos ( second_grenade_throw_position.origin );
|
||
self waittill( "goal" );
|
||
|
||
second_grenade_target = getent( second_grenade_throw_position.target, "targetname" );
|
||
target_org = second_grenade_target.origin;
|
||
org = self gettagorigin( "TAG_INHAND" );
|
||
|
||
vec = VectorNormalize( target_org - org );
|
||
forward = vector_multiply( vec, 30 );
|
||
pos = forward + org;
|
||
|
||
//draw_line_for_time( <org1> , <org2> , <r> , <g> , <b> , <timer> )
|
||
//thread draw_line_for_time( pos , target_org , 1 , 0, 0 , 3 );
|
||
grenade = MagicGrenade( "semtex_grenade", pos, target_org );
|
||
grenade thread maps\_detonategrenades::semtex_sticky_handle( self );
|
||
//Get back!
|
||
thread dialogue_queue( "cont_rst_getback" );
|
||
|
||
|
||
self.grenadeawareness = 1;
|
||
|
||
//wait 1;
|
||
//
|
||
//done_with_throwing_position = getent( second_grenade_target.target, "targetname" );
|
||
//
|
||
//self setgoalpos ( done_with_throwing_position.origin );
|
||
//self waittill( "goal" );
|
||
//
|
||
//if( isalive( level.gauntlet_east ) )
|
||
// level.gauntlet_east waittill( "death" );
|
||
//
|
||
//if( isalive( level.gauntlet_west ) )
|
||
// level.gauntlet_west waittill( "death" );
|
||
//
|
||
self.goalradius = 2000;
|
||
*/
|
||
|
||
|
||
setup_price()
|
||
{
|
||
level.price = self;
|
||
level.price.animname = "price";
|
||
|
||
if( level.price_destroys_btr )
|
||
level.price place_weapon_on( "at4", "back" );
|
||
//level.price thread disable_ai_color();
|
||
// level.price stealth_plugin_aicolor();
|
||
// array = [];
|
||
// array[ "hidden" ] = ::do_nothing;
|
||
// array[ "spotted" ] = ::do_nothing;
|
||
// level.price stealth_color_state_custom( array );
|
||
|
||
level.price enable_ai_color();
|
||
level.price.pathRandomPercent = 0;
|
||
|
||
level.price thread magic_bullet_shield();
|
||
//level.price thread price_bullet_sheild(); //disables bullet shield if player is too far
|
||
//level.price thread price_handle_death(); //mission fail if price dies
|
||
level.price make_hero();
|
||
level.price.allowdeath = false;
|
||
//level.price.dontshootwhilemoving = true;//tried it and it looks bad.
|
||
|
||
//level.price thread stealth_price_accuracy_control();
|
||
|
||
//level.price.baseaccuracy = 5000000;
|
||
|
||
//all stuff from scoutsniper that might be a good idea
|
||
// level.price thread price_death();
|
||
// level.price setthreatbiasgroup( "price" );
|
||
|
||
self thread animscripts\utility::PersonalColdBreath();
|
||
}
|
||
|
||
stealth_settings()
|
||
{
|
||
stealth_set_default_stealth_function( "bridge_area", ::stealth_bridge_area );
|
||
stealth_set_default_stealth_function( "woods", ::stealth_woods );
|
||
stealth_set_default_stealth_function( "base", ::stealth_base );
|
||
|
||
ai_event = [];
|
||
ai_event[ "ai_eventDistNewEnemy" ] = [];
|
||
ai_event[ "ai_eventDistNewEnemy" ][ "spotted" ] = 512;
|
||
ai_event[ "ai_eventDistNewEnemy" ][ "hidden" ] = 256;
|
||
|
||
ai_event[ "ai_eventDistExplosion" ] = [];
|
||
ai_event[ "ai_eventDistExplosion" ][ "spotted" ] = level.explosion_dist_sense;
|
||
ai_event[ "ai_eventDistExplosion" ][ "hidden" ] = level.explosion_dist_sense;
|
||
|
||
ai_event[ "ai_eventDistDeath" ] = [];
|
||
ai_event[ "ai_eventDistDeath" ][ "spotted" ] = 512;
|
||
ai_event[ "ai_eventDistDeath" ][ "hidden" ] = 512; // used to be 256
|
||
|
||
ai_event[ "ai_eventDistPain" ] = [];
|
||
ai_event[ "ai_eventDistPain" ][ "spotted" ] = 256;
|
||
ai_event[ "ai_eventDistPain" ][ "hidden" ] = 256; // used to be 256
|
||
|
||
ai_event[ "ai_eventDistBullet" ] = [];
|
||
ai_event[ "ai_eventDistBullet" ][ "spotted" ] = 96;
|
||
ai_event[ "ai_eventDistBullet" ][ "hidden" ] = 96;
|
||
|
||
|
||
ai_event[ "ai_eventDistFootstep" ] = [];
|
||
ai_event[ "ai_eventDistFootstep" ][ "spotted" ] = 300;
|
||
ai_event[ "ai_eventDistFootstep" ][ "hidden" ] = 300;
|
||
|
||
ai_event[ "ai_eventDistFootstepWalk" ] = [];
|
||
ai_event[ "ai_eventDistFootstepWalk" ][ "spotted" ] = 300;
|
||
ai_event[ "ai_eventDistFootstepWalk" ][ "hidden" ] = 300;
|
||
|
||
ai_event[ "ai_eventDistFootstepSprint" ] = [];
|
||
ai_event[ "ai_eventDistFootstepSprint" ][ "spotted" ] = 400;
|
||
ai_event[ "ai_eventDistFootstepSprint" ][ "hidden" ] = 400;
|
||
|
||
stealth_ai_event_dist_custom( ai_event );
|
||
|
||
rangesHidden = [];
|
||
rangesHidden[ "prone" ] = 800;
|
||
rangesHidden[ "crouch" ] = 1200;
|
||
rangesHidden[ "stand" ] = 1600;
|
||
|
||
rangesSpotted = [];
|
||
rangesSpotted[ "prone" ] = 8192;
|
||
rangesSpotted[ "crouch" ] = 8192;
|
||
rangesSpotted[ "stand" ] = 8192;
|
||
|
||
stealth_detect_ranges_set( rangesHidden, rangesSpotted );
|
||
|
||
stealth_alert_level_duration( 0.5 );
|
||
|
||
stealth_ai_event_dist_custom( ai_event );
|
||
|
||
array = [];
|
||
array[ "sight_dist" ] = 400;
|
||
array[ "detect_dist" ] = 200;
|
||
stealth_corpse_ranges_custom( array );
|
||
}
|
||
|
||
|
||
sight_ranges_foggy_woods()
|
||
{
|
||
ai_event[ "ai_eventDistFootstep" ] = [];
|
||
ai_event[ "ai_eventDistFootstep" ][ "spotted" ] = 120;
|
||
ai_event[ "ai_eventDistFootstep" ][ "hidden" ] = 120;
|
||
|
||
ai_event[ "ai_eventDistFootstepWalk" ] = [];
|
||
ai_event[ "ai_eventDistFootstepWalk" ][ "spotted" ] = 60;
|
||
ai_event[ "ai_eventDistFootstepWalk" ][ "hidden" ] = 60;
|
||
|
||
ai_event[ "ai_eventDistFootstepSprint" ] = [];
|
||
ai_event[ "ai_eventDistFootstepSprint" ][ "spotted" ] = 400;
|
||
ai_event[ "ai_eventDistFootstepSprint" ][ "hidden" ] = 400;
|
||
|
||
stealth_ai_event_dist_custom( ai_event );
|
||
|
||
rangesHidden = [];
|
||
rangesHidden[ "prone" ] = 250;
|
||
rangesHidden[ "crouch" ] = 450;
|
||
rangesHidden[ "stand" ] = 500;
|
||
|
||
rangesSpotted = [];
|
||
rangesSpotted[ "prone" ] = 500;
|
||
rangesSpotted[ "crouch" ] = 500;
|
||
rangesSpotted[ "stand" ] = 600;
|
||
|
||
stealth_detect_ranges_set( rangesHidden, rangesSpotted );
|
||
|
||
alert_duration = [];
|
||
alert_duration[0] = 1;
|
||
alert_duration[1] = 1;
|
||
alert_duration[2] = 1;
|
||
alert_duration[3] = 0.75;
|
||
|
||
// easy and normal have 2 alert levels so the above times are effectively doubled
|
||
stealth_alert_level_duration( alert_duration[ level.gameskill ] );
|
||
}
|
||
|
||
woods_prespotted_func()
|
||
{
|
||
wait 3;//default is 2.25
|
||
}
|
||
|
||
|
||
|
||
stealth_woods()
|
||
{
|
||
self stealth_plugin_basic();
|
||
|
||
if ( isplayer( self ) )
|
||
return;
|
||
|
||
//threat_array[ "warning1" ] = maps\_stealth_threat_enemy::enemy_alert_level_warning2;
|
||
|
||
|
||
switch( self.team )
|
||
{
|
||
case "axis":
|
||
if( self.type == "dog" )
|
||
{
|
||
self thread dogs_have_small_fovs_when_stopped();
|
||
self set_threatbias_group( "dogs" );
|
||
}
|
||
else
|
||
{
|
||
self thread attach_flashlight();
|
||
}
|
||
self.pathrandompercent = 0;
|
||
self stealth_plugin_threat();
|
||
self stealth_pre_spotted_function_custom( ::woods_prespotted_func );
|
||
//self stealth_threat_behavior_custom( threat_array );
|
||
|
||
threat_array[ "warning1" ] = maps\_stealth_threat_enemy::enemy_alert_level_warning2;
|
||
threat_array[ "attack" ] = ::small_goal_attack_behavior;//default
|
||
self stealth_threat_behavior_custom( threat_array );
|
||
|
||
self stealth_enable_seek_player_on_spotted();
|
||
self stealth_plugin_corpse();
|
||
self stealth_plugin_event_all();
|
||
self.baseaccuracy = 2;
|
||
self.fovcosine = .5;
|
||
self.fovcosinebusy = .1;
|
||
|
||
self thread monitor_someone_became_alert();
|
||
self thread monitor_stealth_kills();
|
||
self thread monitor_stealth_pain();
|
||
self init_cold_patrol_anims();
|
||
|
||
if( isdefined( self.script_noteworthy ) && ( self.script_noteworthy == "cqb_patrol" ) )
|
||
{
|
||
if( isdefined( self.script_patroller ) )
|
||
{
|
||
wait .05;
|
||
self clear_run_anim();
|
||
}
|
||
self thread enable_cqbwalk();
|
||
self.alertlevel = "alert";
|
||
self.disablearrivals = undefined;
|
||
self.disableexits = undefined;
|
||
//if( isdefined( self.script_pet ) )
|
||
// self.moveplaybackrate = .4;
|
||
//else
|
||
self.moveplaybackrate = .8;
|
||
thread scan_when_idle();
|
||
}
|
||
|
||
break;
|
||
|
||
case "allies":
|
||
//use the bridge area settings!
|
||
}
|
||
}
|
||
|
||
scan_when_idle()
|
||
{
|
||
self endon( "death" );
|
||
while( 1 )
|
||
{
|
||
self set_generic_idle_anim( "cqb_stand_idle_scan" );
|
||
|
||
self waittill( "clearing_specialIdleAnim" );
|
||
}
|
||
}
|
||
|
||
|
||
stealth_bridge_area()
|
||
{
|
||
self stealth_plugin_basic();
|
||
|
||
if ( isplayer( self ) )
|
||
return;
|
||
|
||
|
||
switch( self.team )
|
||
{
|
||
case "axis":
|
||
if( self.type == "dog" )
|
||
{
|
||
self thread dogs_have_small_fovs_when_stopped();
|
||
self set_threatbias_group( "dogs" );
|
||
}
|
||
//self thread flashlight_when_alerted();
|
||
if( ( isdefined( self.script_noteworthy ) ) && ( self.script_noteworthy == "truck_guys" ) )
|
||
self set_threatbias_group( "truck_guys" );
|
||
else
|
||
self set_threatbias_group( "bridge_stealth_guys" );
|
||
|
||
self stealth_plugin_threat();
|
||
//self stealth_pre_spotted_function_custom( ::clifftop_prespotted_func );
|
||
|
||
self.pathrandompercent = 0;
|
||
threat_array[ "warning1" ] = maps\_stealth_threat_enemy::enemy_alert_level_warning2;
|
||
threat_array[ "attack" ] = ::small_goal_attack_behavior;//default
|
||
self stealth_threat_behavior_custom( threat_array );
|
||
self stealth_enable_seek_player_on_spotted();
|
||
self stealth_plugin_corpse();
|
||
self stealth_plugin_event_all();
|
||
self.baseaccuracy = 3;
|
||
self.fovcosine = .86; // for the 2nd group -z
|
||
self.fovcosinebusy = .1;
|
||
//self thread dialog_price_kill();
|
||
|
||
self thread monitor_stealth_kills();//price and player kill dialog
|
||
self thread monitor_someone_became_alert();
|
||
|
||
if( ( isdefined ( self.script_type ) ) && ( self.script_type == "cold_patrol" ) )
|
||
self init_cold_patrol_anims();
|
||
break;
|
||
|
||
case "allies":
|
||
//self.grenadeawareness = 0;//dont chase grenades
|
||
//self._stealth.behavior.no_prone = true;
|
||
//self._stealth.behavior.wait_resume_path = 4;
|
||
//self._stealth_move_detection_cap = 0;
|
||
|
||
//dynamic_run_speed settings:
|
||
//self.drs_pushdist = 250;
|
||
//self.drs_sprintdist = 0;//was 60
|
||
//self.drs_stopdist = 400;
|
||
|
||
//self thread stealth_plugin_smart_stance();
|
||
//self thread stealth_no_fog_smart_stance();
|
||
|
||
//self.dynamic_run_response_time = 1;
|
||
|
||
array = [];
|
||
array[ "hidden" ] = ::stealth_friendly_state_hidden;
|
||
array[ "spotted" ] = ::stealth_friendly_state_spotted;
|
||
stealth_basic_states_custom( array );
|
||
}
|
||
}
|
||
|
||
stealth_base()
|
||
{
|
||
self stealth_plugin_basic();
|
||
|
||
if ( isplayer( self ) )
|
||
return;
|
||
|
||
switch( self.team )
|
||
{
|
||
case "axis":
|
||
//self thread flashlight_when_alerted();
|
||
|
||
self stealth_plugin_threat();
|
||
//self stealth_pre_spotted_function_custom( ::clifftop_prespotted_func );
|
||
|
||
self.pathrandompercent = 0;
|
||
//threat_array[ "warning1" ] = maps\_stealth_threat_enemy::enemy_alert_level_warning2;
|
||
threat_array[ "attack" ] = ::large_goal_ambush_attack_behavior;//default
|
||
self stealth_threat_behavior_custom( threat_array );
|
||
//self stealth_enable_seek_player_on_spotted();
|
||
//self stealth_plugin_corpse();
|
||
self stealth_plugin_event_all();
|
||
//self.baseaccuracy = 3;
|
||
self.fovcosine = .76; // for the 2nd group -z
|
||
self.fovcosinebusy = .1;
|
||
//self thread dialog_price_kill();
|
||
|
||
//self thread monitor_stealth_kills();//price and player kill dialog
|
||
//self thread monitor_someone_became_alert();
|
||
|
||
if( ( isdefined ( self.script_type ) ) && ( self.script_type == "cold_patrol" ) )
|
||
self init_cold_patrol_anims();
|
||
break;
|
||
|
||
case "allies":
|
||
//self.grenadeawareness = 0;//dont chase grenades
|
||
//self._stealth.behavior.no_prone = true;
|
||
//self._stealth.behavior.wait_resume_path = 4;
|
||
//self._stealth_move_detection_cap = 0;
|
||
|
||
//dynamic_run_speed settings:
|
||
//self.drs_pushdist = 250;
|
||
//self.drs_sprintdist = 0;//was 60
|
||
//self.drs_stopdist = 400;
|
||
|
||
//self thread stealth_plugin_smart_stance();
|
||
//self thread stealth_no_fog_smart_stance();
|
||
|
||
//self.dynamic_run_response_time = 1;
|
||
|
||
array = [];
|
||
array[ "hidden" ] = ::stealth_friendly_state_hidden;
|
||
array[ "spotted" ] = ::stealth_friendly_state_spotted;
|
||
stealth_basic_states_custom( array );
|
||
}
|
||
}
|
||
|
||
///////////////////////////////////////////
|
||
//price_move_speed_think()
|
||
//{
|
||
// self notify( "start_dynamic_run_speed" );
|
||
//
|
||
// self endon( "death" );
|
||
// self endon( "stop_dynamic_run_speed" );
|
||
// self endon( "start_dynamic_run_speed" );
|
||
//
|
||
// if ( !isdefined( self.ent_flag[ "dynamic_run_speed_stopped" ] ) )
|
||
// {
|
||
// self ent_flag_init( "dynamic_run_speed_stopped" );
|
||
// self ent_flag_init( "dynamic_run_speed_stopping" );
|
||
// }
|
||
// else
|
||
// {
|
||
// self ent_flag_clear( "dynamic_run_speed_stopping" );
|
||
// self ent_flag_clear( "dynamic_run_speed_stopped" );
|
||
// }
|
||
//
|
||
// self thread price_move_speed_handle_cleanup();
|
||
//
|
||
// self.run_speed_state = "";
|
||
//
|
||
// fardist_min = 500 * 500;
|
||
// fardist_max = 600 * 600;
|
||
// stopdist_min = 250 * 250;
|
||
// stopdist_max = 400 * 400;
|
||
// ai_slow_dist = 1400 * 1400;
|
||
// ai_stop_dist_min = 850 * 850;
|
||
// ai_stop_dist_max = 950 * 950;//tweaking these breaks hide and kill stragglers
|
||
//
|
||
// responsiveness_ai = .2;
|
||
// //responsiveness_player_loc = 4;
|
||
// //player_loc_count = responsiveness_player_loc / responsiveness_ai;
|
||
// //ticks = 0;
|
||
//
|
||
//
|
||
// while ( 1 )
|
||
// {
|
||
// closest_dist = self GetClosestEnemySqDist();
|
||
// if( !isdefined( closest_dist ) )
|
||
// closest_dist = 99999999;
|
||
// //enemies = GetAISpeciesArray( "axis", "all" );
|
||
// //
|
||
// //if ( enemies.size == 0 )
|
||
// // closest_dist = 99999999;
|
||
// //else
|
||
// // closest_dist = distance ( level.player.origin, ( getClosest( level.player.origin, enemies ) ).origin );
|
||
//
|
||
// if ( ( closest_dist < ai_stop_dist_min ) )
|
||
// {
|
||
// /#
|
||
// println( "price_dynamic: enemy close. stopping (min). " + closest_dist/closest_dist );
|
||
// #/
|
||
// price_dynamic_run_set( "stop" );
|
||
// wait responsiveness_ai;
|
||
// continue;
|
||
// }
|
||
//
|
||
// if ( ( closest_dist < ai_stop_dist_max ) && ( self.run_speed_state == "stop" ) )
|
||
// {
|
||
// println( "price_dynamic: enemy close. stopping (max). " + closest_dist/closest_dist );
|
||
// price_dynamic_run_set( "stop" );
|
||
// wait responsiveness_ai;
|
||
// continue;
|
||
// }
|
||
//
|
||
// //how far is the player from price
|
||
// dist = DistanceSquared( self.origin, level.player.origin );
|
||
//
|
||
// /*
|
||
// angles1 = vectortoangles( self.goalpos - self.origin );
|
||
// forward1 = anglestoforward( angles1 );
|
||
//
|
||
// angles2 = vectortoangles( level.player.origin - self.origin );
|
||
// forward2 = anglestoforward( angles2 );
|
||
//
|
||
// vectordor( forward1, forward2 );
|
||
// */
|
||
//
|
||
// //normal = VectorNormalize( end_origin - start_origin );
|
||
// //forward = AnglesToForward( start_angles );
|
||
// //dot = VectorDot( forward, normal );
|
||
//
|
||
// //vec = anglestoforward( self.angles );
|
||
// vec_goal = VectorNormalize( ( self.goalpos - self.origin ) );//angle of where I'm supposed to go
|
||
// vec2 = VectorNormalize( ( level.player.origin - self.origin ) );
|
||
// //vecdot = vectordot( vec, vec2 );//dot of my angle vs player position
|
||
// vecdot = vectordot( vec_goal, vec2 );//dot my my goal dir vs player position
|
||
// //level.g = vecdot;
|
||
//
|
||
// if ( ( dist > stopdist_max ) && ( vecdot < 0 ) )//vecdot > 0 means in 180 in front
|
||
// {
|
||
// println( "price_dynamic: price too far in front (max). stopping. " + vecdot );
|
||
// price_dynamic_run_set( "stop" );
|
||
// wait responsiveness_ai;
|
||
// continue;
|
||
// }
|
||
//
|
||
// if ( ( dist > stopdist_min ) && ( self.run_speed_state == "stop" ) && ( vecdot < 0 ) )
|
||
// {
|
||
// println( "price_dynamic: price too far in front (min). stopping. " + vecdot );
|
||
// price_dynamic_run_set( "stop" );
|
||
// wait responsiveness_ai;
|
||
// continue;
|
||
// }
|
||
//
|
||
// if ( ( closest_dist < ai_slow_dist ) )
|
||
// {
|
||
// /#
|
||
// println( "price_dynamic: enemy close. crouch. " + closest_dist/closest_dist );
|
||
// #/
|
||
// price_dynamic_run_set( "crouch" );
|
||
// wait responsiveness_ai;
|
||
// continue;
|
||
// }
|
||
//
|
||
//
|
||
// if ( ( vecdot > - .25 ) && ( dist > fardist_max ) )
|
||
// {
|
||
// println( "price_dynamic: player in front (max). running. " );
|
||
// price_dynamic_run_set( "run" );
|
||
// wait responsiveness_ai;
|
||
// continue;
|
||
// }
|
||
//
|
||
// if ( ( vecdot > - .25 ) && ( dist > fardist_min ) && ( self.run_speed_state == "run" ) )
|
||
// {
|
||
// println( "price_dynamic: player in front (min). running. " );
|
||
// price_dynamic_run_set( "run" );
|
||
// wait responsiveness_ai;
|
||
// continue;
|
||
// }
|
||
//
|
||
// //otherwise cqb
|
||
// println( "price_dynamic: cqb " );
|
||
// price_dynamic_run_set( "cqb" );
|
||
// wait responsiveness_ai;
|
||
// }
|
||
//}
|
||
//
|
||
//
|
||
//
|
||
//price_dynamic_run_set( speed )
|
||
//{
|
||
// if ( self.run_speed_state == speed )
|
||
// return;
|
||
// self notify( "dynamic_run_speed_changing" );
|
||
// self.run_speed_state = speed;
|
||
//
|
||
// switch( speed )
|
||
// {
|
||
// case "cqb":
|
||
// self.pathenemyfightdist = 192;
|
||
// self.pathenemylookahead = 192;
|
||
// self enable_cqbwalk();
|
||
// self allowedstances( "stand", "crouch", "prone" );
|
||
//
|
||
// self notify( "stop_loop" );
|
||
// self anim_stopanimscripted();
|
||
// self ent_flag_clear( "dynamic_run_speed_stopped" );
|
||
// break;
|
||
// case "run":
|
||
// self.pathenemyfightdist = 192;
|
||
// self.pathenemylookahead = 192;
|
||
// self disable_cqbwalk();
|
||
// self allowedstances( "stand", "crouch", "prone" );
|
||
//
|
||
// self notify( "stop_loop" );
|
||
// self anim_stopanimscripted();
|
||
// self ent_flag_clear( "dynamic_run_speed_stopped" );
|
||
// break;
|
||
// case "stop":
|
||
// self thread price_dynamic_run_stop();
|
||
// break;
|
||
// case "crouch":
|
||
// self.pathenemyfightdist = 192;
|
||
// self.pathenemylookahead = 192;
|
||
// self allowedstances( "crouch" );
|
||
// self disable_cqbwalk();
|
||
//
|
||
// self notify( "stop_loop" );
|
||
// self anim_stopanimscripted();
|
||
// self ent_flag_clear( "dynamic_run_speed_stopped" );
|
||
// break;
|
||
// }
|
||
//}
|
||
//
|
||
//
|
||
//price_move_speed_handle_cleanup()
|
||
//{
|
||
// self endon( "start_dynamic_run_speed" );
|
||
// self endon( "death" );
|
||
//
|
||
// self price_dynamic_run_speed_cleanup_wait();
|
||
//
|
||
// self disable_cqbwalk();
|
||
// self allowedstances( "stand", "crouch", "prone" );
|
||
// self.pathenemyfightdist = 192;
|
||
// self.pathenemylookahead = 192;
|
||
// self notify( "stop_loop" );
|
||
// self anim_stopanimscripted();
|
||
// self ent_flag_clear( "dynamic_run_speed_stopping" );
|
||
// self ent_flag_clear( "dynamic_run_speed_stopped" );
|
||
//}
|
||
//
|
||
//price_dynamic_run_speed_cleanup_wait()
|
||
//{
|
||
// level endon( "_stealth_spotted" );
|
||
// self waittill( "stop_dynamic_run_speed" );
|
||
//}
|
||
|
||
//price_dynamic_run_stop()
|
||
//{
|
||
// self notify( "stop_going_to_node" );
|
||
// wait 1;
|
||
//
|
||
// self.oldgoal = self.goalpos;
|
||
// self.oldradius = self.goalradius;
|
||
//
|
||
// self setgoalpos( self.origin );
|
||
// self.goalradius = 90;
|
||
//
|
||
// self waittill( "dynamic_run_speed_changing" );
|
||
//
|
||
// self.goalradius = self.oldradius;
|
||
// if( isdefined( self.last_set_goalent ) )
|
||
// {
|
||
// self thread follow_path( self.last_set_goalent );
|
||
// }
|
||
// else
|
||
// {
|
||
// self setgoalpos( self.oldradius );
|
||
// }
|
||
//}
|
||
|
||
//price_dynamic_run_set( speed )
|
||
//{
|
||
// if ( self.run_speed_state == speed )
|
||
// return;
|
||
//
|
||
// self.run_speed_state = speed;
|
||
//
|
||
// switch( speed )
|
||
// {
|
||
// case "cqb":
|
||
// self.moveplaybackrate = 1;
|
||
//
|
||
// self enable_cqbwalk();
|
||
// self allowedstances( "stand", "crouch", "prone" );
|
||
//
|
||
// self notify( "stop_loop" );
|
||
// self ent_flag_clear( "dynamic_run_speed_stopped" );
|
||
// break;
|
||
// case "run":
|
||
//
|
||
// self disable_cqbwalk();
|
||
// if ( IsDefined( level.scr_anim[ "generic" ][ "DRS_run" ] ) )
|
||
// {
|
||
// if ( IsArray( level.scr_anim[ "generic" ][ "DRS_run" ] ) )
|
||
// self set_generic_run_anim_array( "DRS_run" );
|
||
// else
|
||
// self set_generic_run_anim( "DRS_run" );
|
||
// }
|
||
// else
|
||
// self clear_run_anim();
|
||
// //self AllowedStances( "stand", "crouch", "prone" );
|
||
//
|
||
// self notify( "stop_loop" );
|
||
// self anim_stopanimscripted();
|
||
// self ent_flag_clear( "dynamic_run_speed_stopped" );
|
||
// break;
|
||
// case "stop":
|
||
// self thread price_dynamic_move_speed_stop();
|
||
// break;
|
||
// case "crouch":
|
||
// self.moveplaybackrate = 1;
|
||
//
|
||
// self clear_run_anim();
|
||
// self allowedstances( "crouch" );
|
||
//
|
||
// self disable_cqbwalk();
|
||
// self notify( "stop_loop" );
|
||
// self ent_flag_clear( "dynamic_run_speed_stopped" );
|
||
// break;
|
||
// }
|
||
//}
|
||
|
||
//stop_dynamic_price_speed()
|
||
//{
|
||
// self endon( "start_dynamic_run_speed" );
|
||
// self endon( "death" );
|
||
//
|
||
// self.moveplaybackrate = 1;
|
||
// self clear_run_anim();
|
||
// self allowedstances( "stand", "crouch", "prone" );
|
||
//
|
||
// self notify( "stop_loop" );
|
||
// self ent_flag_clear( "dynamic_run_speed_stopping" );
|
||
// self ent_flag_clear( "dynamic_run_speed_stopped" );
|
||
//}
|
||
|
||
|
||
price_dynamic_run_stop()
|
||
{
|
||
self endon( "death" );
|
||
|
||
if ( self ent_flag( "dynamic_run_speed_stopped" ) )
|
||
return;
|
||
if ( self ent_flag( "dynamic_run_speed_stopping" ) )
|
||
return;
|
||
|
||
self endon( "stop_dynamic_run_speed" );
|
||
|
||
self ent_flag_set( "dynamic_run_speed_stopping" );
|
||
self ent_flag_set( "dynamic_run_speed_stopped" );
|
||
|
||
//->turned this off because I think checking the current movement would fix whatever this was trying to
|
||
//if( self ent_flag_exist( "_stealth_stance_handler" ) )
|
||
// self ent_flag_waitopen( "_stealth_stance_handler" );
|
||
|
||
stop = "DRS_run_2_stop";
|
||
self maps\_anim::anim_generic_custom_animmode( self, "gravity", stop );
|
||
self ent_flag_clear( "dynamic_run_speed_stopping" );// this flag gets cleared if we endon
|
||
|
||
//moved this line below clearing the stopping flag so we make sure that clears before this function has a chance to end.
|
||
if( !self ent_flag( "dynamic_run_speed_stopped" ) )
|
||
return;
|
||
self endon( "dynamic_run_speed_stopped" );
|
||
|
||
//if he's already playing a looping animation - we can assume its part of level logic and
|
||
//it makes sense not to play a stopping animation or play dialogue to tell you to catch up
|
||
if ( IsDefined( self.loops ) && self.loops > 0 )
|
||
return;
|
||
|
||
while ( self ent_flag( "dynamic_run_speed_stopped" ) )
|
||
{
|
||
//->turned this off because I think checking the current movement would fix whatever this was trying to
|
||
//if( self ent_flag_exist( "_stealth_stance_handler" ) )
|
||
// self ent_flag_waitopen( "_stealth_stance_handler" );
|
||
|
||
idle = "DRS_stop_idle";
|
||
self thread maps\_anim::anim_generic_loop( self, idle );
|
||
|
||
if ( IsDefined( level.scr_anim[ "generic" ][ "signal_go" ] ) )
|
||
self handsignal( "go" );
|
||
|
||
wait RandomFloatRange( 12, 20 );
|
||
|
||
if ( self ent_flag_exist( "_stealth_stance_handler" ) )
|
||
self ent_flag_waitopen( "_stealth_stance_handler" );
|
||
|
||
self notify( "stop_loop" );
|
||
|
||
if ( !self ent_flag( "dynamic_run_speed_stopped" ) )
|
||
return;
|
||
|
||
if ( IsDefined( level.dynamic_run_speed_dialogue ) )
|
||
{
|
||
string = random( level.dynamic_run_speed_dialogue );
|
||
level thread radio_dialogue_queue( string );
|
||
}
|
||
|
||
if ( IsDefined( level.scr_anim[ "generic" ][ "signal_go" ] ) )
|
||
self handsignal( "go" );
|
||
}
|
||
}
|
||
|
||
|
||
|
||
|
||
dogs_have_small_fovs_when_stopped()
|
||
{
|
||
self endon( "death" );
|
||
|
||
while( 1 )
|
||
{
|
||
self waittill( "master_reached_patrol_end" );
|
||
self.fovcosine = .99;
|
||
self notify( "end_patrol" );
|
||
|
||
self waittill( "_stealth_normal" );//be came alert
|
||
self.fovcosine = .76;
|
||
}
|
||
}
|
||
|
||
setup_stealth_enemy_cleanup()
|
||
{
|
||
self.pathrandompercent = 200;
|
||
self thread disable_cqbwalk();
|
||
if( isdefined( self.script_stealthgroup ) )
|
||
self thread maps\_stealth_shared_utilities::enemy_announce_spotted( self.origin );
|
||
|
||
self.goalradius = 400;
|
||
self.favoriteenemy = level.player;
|
||
self setgoalentity( level.player );
|
||
|
||
self waittill( "death" );
|
||
level.stealth_enemies_remaining--;
|
||
}
|
||
|
||
Small_Goal_Attack_Behavior()
|
||
{
|
||
self.pathrandompercent = 200;
|
||
self thread disable_cqbwalk();
|
||
self thread maps\_stealth_shared_utilities::enemy_announce_spotted( self.origin );
|
||
|
||
|
||
self.goalradius = 400;
|
||
|
||
self endon( "death" );
|
||
|
||
self ent_flag_set( "_stealth_override_goalpos" );
|
||
|
||
while ( isdefined( self.enemy ) && self ent_flag( "_stealth_enabled" ) )
|
||
{
|
||
self setgoalpos( self.enemy.origin );
|
||
|
||
wait 4;
|
||
}
|
||
}
|
||
|
||
|
||
|
||
setup_base_starting_guys()
|
||
{
|
||
self endon( "death" );
|
||
self.ignoreme = true;
|
||
self.maxsightdistsqrd = 600*600;
|
||
|
||
flag_wait( "base_alerted" );
|
||
|
||
self.ignoreme = false;
|
||
self.maxsightdistsqrd = 8000*8000;
|
||
// if( isdefined( self._stealth ) )
|
||
// {
|
||
// self ent_flag_clear( "_stealth_normal" );
|
||
// self stealth_ai_clear_custom_idle_and_react();
|
||
// }
|
||
|
||
// self stopanimscripted();
|
||
// self notify( "killanimscripts" );
|
||
|
||
self.favoriteenemy = level.player;
|
||
//self.ignoreme = false;
|
||
//self notify( "end_patrol" );
|
||
wait 1;
|
||
|
||
self.favoriteenemy = undefined;
|
||
|
||
self.pathrandompercent = 200;
|
||
self thread disable_cqbwalk();
|
||
self.combatmode = "ambush";
|
||
self setgoalpos( self.origin );
|
||
self.goalradius = 4000;
|
||
self.maxsightdistsqrd = 8000*8000;
|
||
}
|
||
|
||
|
||
large_goal_ambush_attack_behavior()
|
||
{
|
||
}
|
||
|
||
//stealth_no_fog_smart_stance()
|
||
//{
|
||
// self._stealth.behavior.No_Prone = true;
|
||
//
|
||
// // i do this because the player doesn't look as bad sneaking up on the enemies
|
||
// // friendlies however don't look as good getting so close
|
||
// looking_away = [];
|
||
// looking_away[ "stand" ] = 0;
|
||
// looking_away[ "crouch" ] = -800;
|
||
// looking_away[ "prone" ] = -800;//was -800
|
||
//
|
||
// neutral = [];
|
||
// neutral[ "stand" ] = 200;
|
||
// neutral[ "crouch" ] = 0;
|
||
// neutral[ "prone" ] = 0;
|
||
//
|
||
// looking_towards = [];
|
||
// looking_towards[ "stand" ] = 200;
|
||
// looking_towards[ "crouch" ] = 0;
|
||
// looking_towards[ "prone" ] = 0;
|
||
//
|
||
//
|
||
// stealth_friendly_stance_handler_distances_set( looking_away, neutral, looking_towards );
|
||
//}
|
||
//
|
||
//stealth_fog_smart_stance()
|
||
//{
|
||
// self._stealth.behavior.No_Prone = true;
|
||
//
|
||
// // i do this because the player doesn't look as bad sneaking up on the enemies
|
||
// // friendlies however don't look as good getting so close
|
||
// looking_away = [];
|
||
// looking_away[ "stand" ] = -700;
|
||
// looking_away[ "crouch" ] = -700;
|
||
// looking_away[ "prone" ] = -700;
|
||
//
|
||
// neutral = [];
|
||
// neutral[ "stand" ] = -500;
|
||
// neutral[ "crouch" ] = -700;
|
||
// neutral[ "prone" ] = -700;
|
||
//
|
||
// looking_towards = [];
|
||
// looking_towards[ "stand" ] = -100;
|
||
// looking_towards[ "crouch" ] = -200;
|
||
// looking_towards[ "prone" ] = -200;
|
||
//
|
||
// stealth_friendly_stance_handler_distances_set( looking_away, neutral, looking_towards );
|
||
//}
|
||
|
||
|
||
|
||
|
||
stealth_friendly_state_hidden()
|
||
{
|
||
flag_clear( "price_is_hiding" );
|
||
self.no_pistol_switch = true;
|
||
|
||
//dont aim at dudes in the woods
|
||
if( ( !flag( "player_on_ridge" ) ) && flag( "safe_from_btrs" ) )
|
||
self.maxsightdistsqrd = level.price_maxsightdistsqrd_woods;
|
||
|
||
self.ignoreCloseFoliage = true;
|
||
|
||
|
||
//dont run to color nodes before village
|
||
if( !flag( "approaching_ridge" ) )
|
||
{
|
||
self disable_ai_color();
|
||
|
||
|
||
if( isdefined( self.smart_path_following_node ) )
|
||
{
|
||
self thread enable_cqbwalk();
|
||
self thread price_smart_path_following( self.smart_path_following_node );
|
||
}
|
||
}
|
||
|
||
self pushplayer( true );
|
||
self.fixednode = true;
|
||
//self set_force_color( "r" );
|
||
self thread set_battlechatter( false );
|
||
self set_friendlyfire_warnings( false );
|
||
self.dontEverShoot = true;
|
||
|
||
self.grenadeammo = 0;
|
||
|
||
self.forceSideArm = undefined;
|
||
//used to be ignore all - but that makes him not aim at enemies when exposed - which isn't good...also
|
||
//after stealth groups were created we want to differentiate between who should be shot at and who shouldn't
|
||
//so we don't all of a sudden alert another stealth group by shooting at them
|
||
//self.dontEverShoot = true;
|
||
self.ignoreme = true;
|
||
//self enable_ai_color();
|
||
self.ignoresuppression = true;
|
||
setsaveddvar( "ai_friendlyfireblockduration", 0 );
|
||
setsaveddvar( "ai_friendlysuppression", 0 );
|
||
}
|
||
|
||
stealth_friendly_state_spotted()
|
||
{
|
||
self notify( "stop_dynamic_run_speed" );
|
||
self.no_pistol_switch = undefined;
|
||
self.ignoreall = false;
|
||
self.fixednode = true;
|
||
self.ignoreCloseFoliage = true;
|
||
|
||
//dont run to color nodes if in the woods
|
||
if( ( !flag( "approaching_ridge" ) ) && !flag( "safe_from_btrs" ) )
|
||
{
|
||
self enable_ai_color();
|
||
self set_force_color( "y" );
|
||
}
|
||
|
||
self thread set_battlechatter( false );//BCS sounds bad in combat right now
|
||
self set_friendlyfire_warnings( true );
|
||
self.dontEverShoot = undefined;
|
||
//self thread set_battlechatter( true );
|
||
|
||
self.maxsightdistsqrd = 8000*8000;
|
||
self.grenadeammo = 0;
|
||
//used to be ignore all - but that makes him not aim at enemies when exposed - which isn't good...also
|
||
//after stealth groups were created we want to differentiate between who should be shot at and who shouldn't
|
||
//so we don't all of a sudden alert another stealth group by shooting at them
|
||
//self.dontEverShoot = false;//self.ignoreall = false;
|
||
self.ignoreme = false;
|
||
|
||
//self.disablearrivals = true;
|
||
//self.disableeXits = true;
|
||
|
||
self pushplayer( false );
|
||
//self disable_cqbwalk();
|
||
|
||
//self thread maps\_stealth_behavior_friendly::friendly_spotted_getup_from_prone();
|
||
//self allowedstances( "prone", "crouch", "stand" );
|
||
//self anim_stopanimscripted();
|
||
|
||
//self disable_ai_color();
|
||
//self setgoalpos( self.origin );
|
||
self.ignoresuppression = false;
|
||
setsaveddvar( "ai_friendlyfireblockduration", 2000 );
|
||
setsaveddvar( "ai_friendlysuppression", 1 );
|
||
}
|
||
|
||
|
||
init_cold_patrol_anims()
|
||
{
|
||
// make sure we alternate instead of doing a random selection
|
||
if( !IsDefined( level.lastColdPatrolAnimSetAssigned ) )
|
||
{
|
||
level.lastColdPatrolAnimSetAssigned = "none";
|
||
}
|
||
|
||
if( level.lastColdPatrolAnimSetAssigned != "huddle" )
|
||
{
|
||
self.patrol_walk_anim = "patrol_cold_huddle";
|
||
self.patrol_walk_twitch = "patrol_twitch_weights";
|
||
|
||
self.patrol_scriptedanim[ "pause" ][ 0 ] = "patrol_cold_huddle_pause";
|
||
self.patrol_stop[ "pause" ] = "patrol_cold_huddle_stop";
|
||
self.patrol_start[ "pause" ] = "patrol_cold_huddle_start";
|
||
|
||
self.patrol_stop[ "path_end_idle" ] = "patrol_cold_huddle_stop";
|
||
self.patrol_end_idle[ 0 ] = "patrol_cold_huddle_pause";
|
||
|
||
level.lastColdPatrolAnimSetAssigned = "huddle";
|
||
}
|
||
else
|
||
{
|
||
self.patrol_walk_anim = "patrol_cold_crossed";
|
||
self.patrol_walk_twitch = "patrol_twitch_weights";
|
||
|
||
self.patrol_scriptedanim[ "pause" ][ 0 ] = "patrol_cold_crossed_pause";
|
||
self.patrol_stop[ "pause" ] = "patrol_cold_crossed_stop";
|
||
self.patrol_start[ "pause" ] = "patrol_cold_crossed_start";
|
||
|
||
self.patrol_stop[ "path_end_idle" ] = "patrol_cold_crossed_stop";
|
||
self.patrol_end_idle[ 0 ] = "patrol_cold_crossed_pause";
|
||
|
||
level.lastColdPatrolAnimSetAssigned = "crossed";
|
||
}
|
||
}
|
||
|
||
|
||
setup_bridge_trucks()
|
||
{
|
||
|
||
self endon( "death" );
|
||
|
||
flag_wait( "truck_guys_alerted" );
|
||
println( "truck_guys_alerted" );
|
||
|
||
flag_wait( "convoy_half_way_across_bridge" );
|
||
|
||
guys = get_living_ai_array( "truck_guys", "script_noteworthy" );
|
||
|
||
if( guys.size == 0 )
|
||
{
|
||
self Vehicle_SetSpeed( 0, 15 );
|
||
return;
|
||
}
|
||
|
||
screamer = random( guys );
|
||
screamer maps\_stealth_shared_utilities::enemy_announce_wtf();
|
||
|
||
//wait .5;
|
||
//self waittill( "safe_to_unload" );
|
||
|
||
self Vehicle_SetSpeed( 0, 15 );
|
||
wait 1;
|
||
self maps\_vehicle::vehicle_unload();
|
||
|
||
flag_set( "jeep_stopped" );
|
||
}
|
||
|
||
base_truck_guys_think()
|
||
{
|
||
self endon( "death" );
|
||
|
||
//if ( flag( "_stealth_spotted" ) || self ent_flag( "_stealth_attack" ) )
|
||
// return;
|
||
|
||
level endon( "_stealth_spotted" );
|
||
self endon( "_stealth_attack" );
|
||
|
||
self ent_flag_init( "jumped_out" );
|
||
self ent_flag_init( "not_first_attack" );
|
||
self thread truck_guys_think_jumpout();
|
||
|
||
self maps\_stealth_shared_utilities::ai_create_behavior_function( "animation", "wrapper", ::truck_animation_wrapper );
|
||
|
||
//corpse_array = [];
|
||
//corpse_array[ "saw" ] = ::truck_guys_reaction_behavior;
|
||
//corpse_array[ "found" ] = ::truck_guys_reaction_behavior;
|
||
//self stealth_corpse_behavior_custom( corpse_array );
|
||
|
||
alert_array = [];
|
||
//alert_array[ "warning1" ] = ::truck_guys_reaction_behavior;
|
||
//alert_array[ "warning2" ] = ::truck_guys_reaction_behavior;
|
||
alert_array[ "attack" ] = ::truck_alert_level_attack;//default
|
||
self stealth_threat_behavior_custom( alert_array );
|
||
|
||
awareness_array = [];
|
||
awareness_array[ "explode" ] = ::truck_guys_no_enemy_reaction_behavior;
|
||
awareness_array[ "heard_scream" ] = ::truck_guys_no_enemy_reaction_behavior;
|
||
awareness_array[ "doFlashBanged" ] = ::truck_guys_no_enemy_reaction_behavior;
|
||
|
||
foreach ( key, value in awareness_array )
|
||
self maps\_stealth_event_enemy::stealth_event_mod( key, value );
|
||
|
||
self ent_flag_set( "_stealth_behavior_reaction_anim" );
|
||
}
|
||
|
||
|
||
base_truck_guys_attacked_again()
|
||
{
|
||
self endon( "death" );
|
||
self endon( "_stealth_attack" );
|
||
level endon( "_stealth_spotted" );
|
||
|
||
wait 2;
|
||
|
||
self waittill( "_stealth_bad_event_listener" );
|
||
|
||
self maps\_stealth_shared_utilities::enemy_reaction_state_alert();
|
||
|
||
self ent_flag_set( "not_first_attack" );
|
||
}
|
||
|
||
truck_guys_base_search_behavior( node )
|
||
{
|
||
self endon( "_stealth_enemy_alert_level_change" );
|
||
level endon( "_stealth_spotted" );
|
||
self endon( "_stealth_attack" );
|
||
self endon( "death" );
|
||
self endon( "pain_death" );
|
||
|
||
self thread base_truck_guys_attacked_again();
|
||
|
||
self.disablearrivals = false;
|
||
self.disableexits = false;
|
||
|
||
distance = distance( node.origin, self.origin );
|
||
|
||
self setgoalnode( node );
|
||
self.goalradius = distance * .5;
|
||
|
||
wait 0.05; // because stealth system keeps clearing run anim on every enemy_animation_wrapper
|
||
self set_generic_run_anim( "_stealth_patrol_cqb" );
|
||
self waittill( "goal" );
|
||
|
||
self set_generic_run_anim( "patrol_cold_gunup_search", true );
|
||
|
||
self.disablearrivals = true;
|
||
self.disableexits = true;
|
||
self maps\_stealth_shared_utilities::enemy_runto_and_lookaround( node );
|
||
}
|
||
|
||
|
||
truck_guys_think_jumpout()
|
||
{
|
||
self endon( "death" );
|
||
self endon( "pain_death" );
|
||
|
||
while ( 1 )
|
||
{
|
||
self waittill( "jumpedout" );
|
||
self._stealth.behavior.last_spot = self.origin;
|
||
//self enemy_set_original_goal( self.origin );
|
||
self.got_off_truck_origin = self.origin;
|
||
self ent_flag_set( "jumped_out" );
|
||
|
||
self waittill( "enteredvehicle" );
|
||
wait .15;
|
||
self ent_flag_clear( "jumped_out" );
|
||
self ent_flag_set( "_stealth_behavior_reaction_anim" );
|
||
}
|
||
}
|
||
|
||
truck_animation_wrapper( type )
|
||
{
|
||
self endon( "death" );
|
||
self endon( "pain_death" );
|
||
|
||
flag_set( "truck_guys_alerted" );
|
||
|
||
self ent_flag_wait( "jumped_out" );
|
||
|
||
self maps\_stealth_shared_utilities::enemy_animation_wrapper( type );
|
||
}
|
||
|
||
truck_guys_reaction_behavior( type )
|
||
{
|
||
self endon( "death" );
|
||
self endon( "pain_death" );
|
||
level endon( "_stealth_spotted" );
|
||
self endon( "_stealth_attack" );
|
||
|
||
flag_set( "truck_guys_alerted" );
|
||
|
||
self ent_flag_wait( "jumped_out" );
|
||
|
||
if ( !flag( "truck_guys_alerted" ) )
|
||
return;
|
||
if ( flag_exist( "truck_guys_not_going_back" ) && flag( "truck_guys_not_going_back" ) )
|
||
return;
|
||
|
||
if ( !flag( "_stealth_spotted" ) && !self ent_flag( "_stealth_attack" ) )
|
||
{
|
||
player = get_closest_player( self.origin );
|
||
node = maps\_stealth_shared_utilities::enemy_find_free_pathnode_near( player.origin, 1500, 128 );
|
||
|
||
if ( isdefined( node ) )
|
||
self thread truck_guys_base_search_behavior( node );
|
||
}
|
||
|
||
spotted_flag = self group_get_flagname( "_stealth_spotted" );
|
||
if ( flag( spotted_flag ) )
|
||
self flag_waitopen( spotted_flag );
|
||
else
|
||
self waittill( "normal" );
|
||
}
|
||
|
||
|
||
truck_guys_no_enemy_reaction_behavior( type )
|
||
{
|
||
self endon( "death" );
|
||
self endon( "pain_death" );
|
||
level endon( "_stealth_spotted" );
|
||
self endon( "_stealth_attack" );
|
||
|
||
flag_set( "truck_guys_alerted" );
|
||
|
||
self ent_flag_wait( "jumped_out" );
|
||
|
||
if ( !flag( "truck_guys_alerted" ) )
|
||
return;
|
||
if ( flag_exist( "truck_guys_not_going_back" ) && flag( "truck_guys_not_going_back" ) )
|
||
return;
|
||
|
||
if ( !flag( "_stealth_spotted" ) && !self ent_flag( "_stealth_attack" ) )
|
||
{
|
||
origin = self._stealth.logic.event.awareness_param[ type ];
|
||
|
||
node = self maps\_stealth_shared_utilities::enemy_find_free_pathnode_near( origin, 300, 40 );
|
||
|
||
self thread maps\_stealth_shared_utilities::enemy_announce_wtf();
|
||
|
||
if ( isdefined( node ) )
|
||
self thread truck_guys_base_search_behavior( node );
|
||
}
|
||
|
||
spotted_flag = self group_get_flagname( "_stealth_spotted" );
|
||
if ( flag( spotted_flag ) )
|
||
self flag_waitopen( spotted_flag );
|
||
else
|
||
self waittill( "normal" );
|
||
}
|
||
|
||
truck_alert_level_attack( enemy )
|
||
{
|
||
self endon( "death" );
|
||
self endon( "pain_death" );
|
||
|
||
flag_set( "truck_guys_alerted" );
|
||
self ent_flag_wait( "jumped_out" );
|
||
|
||
self small_goal_attack_behavior();
|
||
//self maps\_stealth_threat_enemy::enemy_close_in_on_target();
|
||
|
||
//self cliffhanger_enemy_attack_behavior();
|
||
}
|
||
|
||
|
||
setObjectiveWaypoint( objName, text )
|
||
{
|
||
objective = level.objectives[objName];
|
||
if( isdefined( text ) )
|
||
Objective_SetPointerTextOverride( objective.id, text );
|
||
else
|
||
Objective_SetPointerTextOverride( objective.id );
|
||
}
|
||
|
||
registerObjective( objName, objText, objOrigin )
|
||
{
|
||
flag_init( objName );
|
||
if( !isdefined( level.objectives ) )
|
||
level.objectives = [];
|
||
objID = level.objectives.size;
|
||
|
||
newObjective = spawnStruct();
|
||
newObjective.name = objName;
|
||
newObjective.id = objID;
|
||
newObjective.state = "invisible";
|
||
newObjective.text = objText;
|
||
newObjective.origin = objOrigin;
|
||
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.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 );
|
||
}
|
||
|
||
setObjectiveLocationMoving( objName, objEnt, offset )
|
||
{
|
||
level notify( "moving " + objName );
|
||
level endon( "moving " + objName );
|
||
objective = level.objectives[objName];
|
||
|
||
Objective_OnEntity( objective.id, objEnt, offset );
|
||
|
||
//while( objective.state != "done" )
|
||
//{
|
||
// if( !isdefined( objEnt ) )
|
||
// break;
|
||
// objective_position( objective.id, objEnt.origin + (0,0,64) );
|
||
// wait .05;
|
||
//}
|
||
}
|
||
|
||
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 );
|
||
}
|
||
|
||
|
||
//default_start( ::start_start );
|
||
//add_start( "start", ::start_start, "Start" );
|
||
////add_start( "bridge", ::start_bridge, "Bridge" );
|
||
//add_start( "slide", ::start_slide, "Slide" );
|
||
//add_start( "woods", ::start_woods, "Woods" );
|
||
//add_start( "ridge", ::start_ridge, "ridge" );
|
||
//add_start( "village", ::start_village, "village" );
|
||
//add_start( "base", ::start_base, "Base" );
|
||
//add_start( "dock", ::start_dock, "Dock" );
|
||
//add_start( "sub", ::start_sub, "Submarine" );
|
||
|
||
|
||
objective_main()
|
||
{
|
||
switch( level.start_point )
|
||
{
|
||
case "default":
|
||
case "start":
|
||
delay_first_obj();
|
||
case "slide":
|
||
case "woods":
|
||
case "midwoods":
|
||
case "ridge":
|
||
case "village":
|
||
//objective_enter_base();
|
||
case "base":
|
||
objective_price();
|
||
objective_get_to_sub();
|
||
case "defend_sub":
|
||
objective_defend_sub();
|
||
//case "exit_sub":
|
||
// objective_exit_sub();
|
||
}
|
||
}
|
||
|
||
delay_first_obj()
|
||
{
|
||
flag_wait( "price_starts_moving" );
|
||
}
|
||
|
||
objective_price()
|
||
{
|
||
while( !isdefined( level.price ) )
|
||
wait .1;
|
||
registerObjective( "obj_price", &"CONTINGENCY_OBJ_PRICE", level.price.origin );
|
||
setObjectiveState( "obj_price", "current" );
|
||
thread setObjectiveLocationMoving( "obj_price", level.price, (0,0,70) );
|
||
|
||
//flag_wait( "time_to_use_UAV" );
|
||
if( level.gameSkill > 1 )
|
||
{
|
||
flag_wait( "base_alerted" );
|
||
}
|
||
else
|
||
{
|
||
flag_wait( "price_splits_off" );
|
||
}
|
||
//flag_wait( "both_gauntlets_destroyed" );
|
||
|
||
setObjectiveState( "obj_price", "done" );
|
||
}
|
||
|
||
//objective_enter_base()
|
||
//{
|
||
// obj_base_entrance = getent( "obj_base_entrance", "targetname" );
|
||
// registerObjective( "obj_enter", &"CONTINGENCY_OBJ_ENTER_BASE", obj_base_entrance.origin );
|
||
// setObjectiveState( "obj_enter", "current" );
|
||
//
|
||
// flag_wait( "obj_base_entrance" );
|
||
//
|
||
// setObjectiveState( "obj_enter", "done" );
|
||
//}
|
||
|
||
|
||
objective_get_to_sub()
|
||
{
|
||
if( level.gameSkill <= 1 )
|
||
return;
|
||
|
||
origin = ( -11742.0, 2368.0, 643.0 );
|
||
|
||
obj_reach_split_off = getstruct( "obj_reach_split_off", "targetname" );
|
||
if( isdefined( obj_reach_split_off ) )
|
||
origin = obj_reach_split_off.origin;
|
||
registerObjective( "obj_reach", &"CONTINGENCY_OBJ_ENTER_SUB", origin );
|
||
setObjectiveState( "obj_reach", "current" );
|
||
|
||
flag_wait( "price_splits_off" );
|
||
|
||
setObjectiveState( "obj_reach", "done" );
|
||
}
|
||
|
||
|
||
objective_defend_sub()
|
||
{
|
||
|
||
//obj_sub_entrance = getent( "obj_sub_entrance", "targetname" );
|
||
//registerObjective( "obj_sub", &"CONTINGENCY_OBJ_ENTER_SUB", obj_sub_entrance.origin );
|
||
//setObjectiveState( "obj_sub", "current" );
|
||
|
||
flag_wait( "price_splits_off" );
|
||
|
||
origin = getstruct( "obj_guard_house", "targetname" ).origin;
|
||
registerObjective( "obj_sub", &"CONTINGENCY_OBJ_DEFEND_SUB", origin + (0,0,48) );
|
||
setObjectiveState( "obj_sub", "current" );
|
||
setObjectiveWaypoint( "obj_sub", &"CONTINGENCY_OBJ_DEFEND" );
|
||
//setObjectiveString( "obj_sub", &"CONTINGENCY_OBJ_DEFEND_SUB" );
|
||
//setObjectiveLocation( "obj_sub", origin + (0,0,48) );
|
||
|
||
|
||
flag_wait( "close_sub_hatch" );
|
||
|
||
setObjectiveState( "obj_sub", "done" );
|
||
}
|
||
|
||
|
||
// flag_wait( "obj_sub_entrance" );
|
||
//
|
||
// origin = getstruct( "control_sub_obj_pos", "targetname" ).origin;
|
||
// setObjectiveString( "obj_sub", &"CONTINGENCY_OBJ_CONTROL_SUB" );
|
||
// setObjectiveLocation( "obj_sub", origin );
|
||
//
|
||
// flag_wait( "player_key_rdy" );
|
||
//
|
||
// origin = getent( "players_key", "targetname" ).origin;
|
||
// setObjectiveString( "obj_sub", &"CONTINGENCY_OBJ_TURN_KEY" );
|
||
// setObjectiveLocation( "obj_sub", origin );
|
||
//
|
||
// flag_wait( "player_turned_key" );
|
||
//
|
||
// setObjectiveState( "obj_sub", "done" );
|
||
//}
|
||
//
|
||
//
|
||
//
|
||
//objective_exit_sub()
|
||
//{
|
||
// while( !isdefined( level.soap_truck ) )
|
||
// wait .1;
|
||
// registerObjective( "obj_exit", &"CONTINGENCY_OBJ_EXIT_SUB", level.soap_truck.origin );
|
||
// setObjectiveState( "obj_exit", "current" );
|
||
// thread setObjectiveLocationMoving( "obj_exit", level.soap_truck );
|
||
//
|
||
// flag_wait( "player_in_uaz" );
|
||
//
|
||
// setObjectiveState( "obj_exit", "done" );
|
||
//}
|
||
|
||
|
||
|
||
base_autosave_logic()
|
||
{
|
||
save = true;
|
||
flag_wait( "base_entrance" );
|
||
|
||
if( isdefined( level.timer_allowed_time ) )
|
||
{
|
||
time_passed = ( gettime() - level.timer_start_time ) / 1000;
|
||
println( "time passed " + time_passed );
|
||
time_left = level.timer_allowed_time - time_passed;
|
||
println( "time left " + time_left );
|
||
if( time_left < 90 )
|
||
save = false;
|
||
else
|
||
save = true;
|
||
}
|
||
if( save )
|
||
autosave_by_name( "partway1" );
|
||
|
||
flag_wait( "player_is_halfway_to_sub" );
|
||
|
||
if( isdefined( level.timer_allowed_time ) )
|
||
{
|
||
time_passed = ( gettime() - level.timer_start_time ) / 1000;
|
||
println( "time passed " + time_passed );
|
||
time_left = level.timer_allowed_time - time_passed;
|
||
println( "time left " + time_left );
|
||
if( time_left < 80 )
|
||
save = false;
|
||
else
|
||
save = true;
|
||
}
|
||
if( save )
|
||
autosave_by_name( "partway2" );
|
||
|
||
flag_wait( "base_ending" );
|
||
|
||
if( isdefined( level.timer_allowed_time ) )
|
||
{
|
||
time_passed = ( gettime() - level.timer_start_time ) / 1000;
|
||
println( "time passed " + time_passed );
|
||
time_left = level.timer_allowed_time - time_passed;
|
||
println( "time left " + time_left );
|
||
if( time_left < 40 )
|
||
save = false;
|
||
else
|
||
save = true;
|
||
}
|
||
if( save )
|
||
autosave_by_name( "partway3" );
|
||
}
|
||
|
||
|
||
timer_start()
|
||
{
|
||
if ( getdvar( "notimer" ) == "1" )
|
||
return;
|
||
dialogue_line = undefined;
|
||
level.timer_allowed_time = undefined;
|
||
switch( level.gameSkill )
|
||
{
|
||
case 0:// easy
|
||
//iSeconds = 240;
|
||
//break;
|
||
return;
|
||
case 1:// regular
|
||
//iSeconds = 240;
|
||
//break;
|
||
return;
|
||
case 2:// hardened
|
||
level.timer_allowed_time = 180;
|
||
break;
|
||
case 3:// veteran
|
||
level.timer_allowed_time = 120;
|
||
break;
|
||
}
|
||
assert( isdefined( level.timer_allowed_time ) );
|
||
|
||
thread dialog_time_nags( level.timer_allowed_time );
|
||
|
||
level thread timer_logic( level.timer_allowed_time, &"CONTINGENCY_TIME_TO_ENTER_SUB" );
|
||
level.timer_start_time = gettime();
|
||
}
|
||
|
||
timer_logic( iSeconds, sLabel, bUseTick )
|
||
{
|
||
|
||
if ( getdvar( "notimer" ) == "1" )
|
||
return;
|
||
|
||
if ( !isdefined( bUseTick ) )
|
||
bUseTick = false;
|
||
// destroy any previous timer just in case
|
||
killTimer();
|
||
level endon( "kill_timer" );
|
||
|
||
/*-----------------------
|
||
TIMER SETUP
|
||
-------------------------*/
|
||
level.hudTimerIndex = 20;
|
||
level.timer = maps\_hud_util::get_countdown_hud( -250 );
|
||
level.timer SetPulseFX( 30, 900000, 700 );// something, decay start, decay duration
|
||
level.timer.label = sLabel;
|
||
level.timer settenthstimer( iSeconds );
|
||
level.start_time = gettime();
|
||
|
||
/*-----------------------
|
||
TIMER EXPIRED
|
||
-------------------------*/
|
||
if ( bUseTick == true )
|
||
thread timer_tick();
|
||
wait( iSeconds );
|
||
|
||
//flag_set( "timer_expired" );
|
||
level.timer destroy();
|
||
// Mission failed. The objective was not completed in time.
|
||
level thread mission_failed_out_of_time( &"CONTINGENCY_SUB_TIMER_EXPIRED" );
|
||
}
|
||
|
||
killTimer()
|
||
{
|
||
level notify( "kill_timer" );
|
||
if ( isdefined( level.timer ) )
|
||
level.timer destroy();
|
||
}
|
||
|
||
timer_tick()
|
||
{
|
||
level endon( "stop_timer_tick" );
|
||
level endon( "kill_timer" );
|
||
while ( true )
|
||
{
|
||
wait( 1 );
|
||
level.player thread play_sound_on_entity( "countdown_beep" );
|
||
level notify( "timer_tick" );
|
||
}
|
||
}
|
||
|
||
mission_failed_out_of_time( deadquote )
|
||
{
|
||
level.player endon( "death" );
|
||
level endon( "kill_timer" );
|
||
level notify( "mission failed" );
|
||
level.player freezeControls( true );
|
||
//level.player thread player_death_effect();
|
||
//level.player thread play_sound_on_entity( "airplane_final_explosion" );
|
||
musicstop( 1 );
|
||
setDvar( "ui_deadquote", deadquote );
|
||
maps\_utility::missionFailedWrapper();
|
||
level notify( "kill_timer" );
|
||
}
|
||
|
||
set_threatbias_group( group )
|
||
{
|
||
assert( threatbiasgroupexists( group ) );
|
||
self setthreatbiasgroup( group );
|
||
}
|
||
|
||
flashlight_when_alerted()
|
||
{
|
||
self endon( "death" );
|
||
self ent_flag_waitopen( "_stealth_normal" );
|
||
|
||
wait randomfloatrange( .2, .8 );
|
||
|
||
PlayFXOnTag( level._effect[ "flashlight" ], self, "tag_flash" );
|
||
self.have_flashlight = true;
|
||
}
|
||
|
||
attach_flashlight()
|
||
{
|
||
PlayFXOnTag( level._effect[ "flashlight" ], self, "tag_flash" );
|
||
self.have_flashlight = true;
|
||
}
|
||
|
||
bmp_turret_attack_player( end_if_cant_see, no_misses )
|
||
{
|
||
if( !isdefined( end_if_cant_see ) )
|
||
end_if_cant_see = false;
|
||
|
||
if( !isdefined( no_misses ) )
|
||
no_misses = false;
|
||
|
||
//self thread debug_bmp_hit_player();
|
||
self endon( "stop_shooting" );
|
||
self endon( "death" );
|
||
while ( 1 )
|
||
{
|
||
//choose our target based on distance and visibility
|
||
player = get_closest_player( self.origin );
|
||
/*
|
||
if ( ! can_see_player( player ) )
|
||
{
|
||
dif_player = get_different_player( player );
|
||
if ( can_see_player( dif_player ) )
|
||
player = dif_player;
|
||
}
|
||
*/
|
||
wait( randomfloatrange( 0.8, 1.3 ) );
|
||
|
||
// don't try to shoot a player with an RPG or Stinger
|
||
//if ( player usingAntiAirWeapon() )
|
||
// continue;
|
||
|
||
//dont try to shoot a player who is hiding a safe volume
|
||
//if ( player is_hidden_from_heli( self ) )
|
||
// continue;
|
||
|
||
//wait for player to be visible
|
||
while ( !can_see_player( player ) )
|
||
wait( randomfloatrange( 0.2, 0.6 ) );//was .8 1.3
|
||
|
||
if( !no_misses )
|
||
{
|
||
//saw player, now miss for 2 bursts
|
||
miss_player( player );
|
||
wait( randomfloatrange( 0.8, 2.4 ) );
|
||
|
||
miss_player( player );
|
||
wait( randomfloatrange( 0.8, 2.4 ) );
|
||
}
|
||
|
||
//if player is still exposed then hit him
|
||
while ( can_see_player( player ) )
|
||
{
|
||
fire_at_player( player );
|
||
wait( randomfloatrange( 2, 3 ) );
|
||
}
|
||
//player is hidden, now will suppress/hit him for 1 burst if he tries to peek out
|
||
//fire_at_player( player );
|
||
//wait( randomfloatrange( .3, 1 ) );
|
||
|
||
if( end_if_cant_see )
|
||
{
|
||
if( !can_see_player( player ) )
|
||
{
|
||
self clearturrettarget();
|
||
self.turret_busy = false;
|
||
//self ent_flag_clear( "spotted_player" );
|
||
//flag_clear ("bmp_has_spotted_player" );
|
||
self notify( "stop_shooting" );
|
||
}
|
||
}
|
||
|
||
//fire_at_player( player );
|
||
}
|
||
}
|
||
|
||
|
||
can_see_player( player )
|
||
{
|
||
if( distance( self.origin, level.player.origin ) < level.min_btr_fighting_range )
|
||
return false;
|
||
|
||
tag_flash_loc = self getTagOrigin( "tag_flash" );
|
||
//BulletTracePassed( <start>, <end>, <hit characters>, <ignore entity> );
|
||
player_eye = player geteye();
|
||
if ( SightTracePassed( tag_flash_loc, player_eye, false, self ) )
|
||
{
|
||
if( isdefined( level.debug ) )
|
||
line( tag_flash_loc, player_eye, ( 0.2, 0.5, 0.8 ), 0.5, false, 60 );
|
||
return true;
|
||
}
|
||
else
|
||
{
|
||
//println( " ---trace failed" );
|
||
return false;
|
||
}
|
||
}
|
||
|
||
|
||
fire_at_player( player )
|
||
{
|
||
burstsize = randomintrange( 3, 5 );
|
||
//println(" **HITTING PLAYER, burst: " + burstsize );
|
||
fireTime = .2;
|
||
for ( i = 0; i < burstsize; i++ )
|
||
{
|
||
self setturrettargetent( player, randomvector( 20 ) + ( 0, 0, 32 ) );//randomvec was 50
|
||
self fireweapon();
|
||
wait fireTime;
|
||
}
|
||
}
|
||
|
||
miss_player( player )
|
||
{
|
||
//println(" missing player" );
|
||
//miss_vec = randomvector( 100 );
|
||
//miss_vec = randomvectorrange( 40, 100 );
|
||
|
||
|
||
//point in front of player
|
||
forward = AnglesToForward( level.player.angles );
|
||
forwardfar = vector_multiply( forward, 100 );
|
||
miss_vec = forwardfar + randomvector( 50 );
|
||
|
||
|
||
burstsize = randomintrange( 4, 6 );
|
||
fireTime = .2;
|
||
for ( i = 0; i < burstsize; i++ )
|
||
{
|
||
offset = randomvector( 15 ) + miss_vec + (0,0,64);
|
||
//println( " offset: " + offset );
|
||
//thread draw_line_for_time( self.origin+(0,0,128), player.origin+offset, 0, 0, 1, 2 );
|
||
//thread draw_line_for_time( player.origin+offset+(0,0,4), player.origin+offset, 0, 0, 1, 2 );
|
||
self setturrettargetent( player, offset );
|
||
self fireweapon();
|
||
wait fireTime;
|
||
}
|
||
} |