193 lines
6.0 KiB
Plaintext
193 lines
6.0 KiB
Plaintext
#include common_scripts\utility;
|
|
#include maps\_utility;
|
|
#include maps\_specialops;
|
|
#include maps\so_escape_airport_code;
|
|
#include maps\airport_code;
|
|
|
|
/*------------------- tweakables -------------------*/
|
|
|
|
CONST_regular_obj = &"SO_ESCAPE_AIRPORT_OBJ_REGULAR";
|
|
CONST_hardened_obj = &"SO_ESCAPE_AIRPORT_OBJ_HARDENED";
|
|
CONST_veteran_obj = &"SO_ESCAPE_AIRPORT_OBJ_VETERAN";
|
|
|
|
/*------------------- tweakables -------------------*/
|
|
|
|
main()
|
|
{
|
|
level.so_compass_zoom = "close";
|
|
level.friendlyfire_warnings = true;
|
|
|
|
// Special Op mode deleting all original spawn triggers, vehicles and spawners
|
|
// ::type_script_model_civilian
|
|
// ::type_spawners
|
|
// ::type_vehicle
|
|
// ::type_spawn_trigger
|
|
// ::type_trigger
|
|
|
|
so_delete_all_by_type( ::type_spawn_trigger, ::type_vehicle, ::type_spawners, ::type_script_model_civilian );
|
|
|
|
default_start( ::start_so_escape );
|
|
add_start( "so_escape", ::start_so_escape );
|
|
|
|
maps\createart\airport_art::main();
|
|
maps\createfx\airport_audio::main();
|
|
maps\createfx\airport_fx::main();
|
|
maps\airport_fx::main();
|
|
|
|
common_scripts\_destructible_types_anim_light_fluo_on::main();
|
|
|
|
maps\_load::main();
|
|
|
|
maps\airport_amb::main();
|
|
maps\_utility::set_ambient( "airport_terminal0" );
|
|
|
|
maps\_compass::setupMiniMap( "compass_map_airport" );
|
|
|
|
disable_elevators();
|
|
}
|
|
|
|
disable_elevators()
|
|
{
|
|
// Connect the top floor paths for the elevator that doesn't crash.
|
|
elevator = level.elevators[ 0 ];
|
|
left_door = elevator common_scripts\_elevator::get_outer_leftdoor( 1 );
|
|
right_door = elevator common_scripts\_elevator::get_outer_rightdoor( 1 );
|
|
left_door ConnectPaths();
|
|
right_door ConnectPaths();
|
|
|
|
// Just remove the triggers in the elevator
|
|
housings = GetEntArray( "elevator_housing", "targetname" );
|
|
|
|
foreach ( housing in housings )
|
|
{
|
|
housing disable_elevator_internal();
|
|
}
|
|
|
|
buttons = GetEntArray( "elevator_call", "targetname" );
|
|
foreach ( button in buttons )
|
|
{
|
|
button.origin = ( 0, 0, -50000 );
|
|
}
|
|
|
|
}
|
|
|
|
disable_elevator_internal()
|
|
{
|
|
ent = self;
|
|
num = 0;
|
|
while ( 1 )
|
|
{
|
|
if ( !IsDefined( ent.target ) )
|
|
{
|
|
return;
|
|
}
|
|
|
|
ent = GetEnt( ent.target, "targetname" );
|
|
switch ( num )
|
|
{
|
|
case 2:
|
|
case 3:
|
|
ent.origin = ( 0, 0, -50000 );
|
|
}
|
|
|
|
num++;
|
|
}
|
|
}
|
|
|
|
start_so_escape()
|
|
{
|
|
so_escape_airport_init();
|
|
|
|
foreach( enemy_group, delete_num in level.enemy_remove_trigs )
|
|
thread past_enemy_remove( enemy_group, delete_num );
|
|
|
|
music_loop( "so_escape_airport_music", 148 );
|
|
|
|
thread fade_challenge_in();
|
|
thread fade_challenge_out( "escaped_terminal" );
|
|
thread enable_triggered_start( "start_terminal" );
|
|
thread enable_triggered_complete( "escaped_trigger", "escaped_terminal", "all" );
|
|
thread enable_challenge_timer( "start_terminal", "escaped_terminal" );
|
|
}
|
|
|
|
#using_animtree( "generic_human" );
|
|
so_escape_airport_init()
|
|
{
|
|
// Will create an _anim file if we get more.
|
|
level.scr_anim[ "generic" ][ "pronehide_dive" ] = %hunted_dive_2_pronehide_v1;
|
|
|
|
flag_init( "escaped_terminal" );
|
|
flag_init( "start_terminal" );
|
|
flag_init( "challenge_success" );
|
|
|
|
/*dummy*/flag_init( "escaped_trigger" );
|
|
|
|
thread shoot_out_glass();
|
|
thread glass_elevator_setup();
|
|
thread sign_departure_status_init();
|
|
thread sign_departure_status_eratic();
|
|
|
|
level.enemy_remove_trigs = [];
|
|
|
|
add_global_spawn_function( "axis", ::enemy_register );
|
|
|
|
thread spawn_smoke( "smoke_escalators_first", "enemy_waiting_area_above_movein_trig" );
|
|
thread spawn_smoke( "smoke_escalators_ending", "enemy_security_area_final_movein_trig", 0.0 );
|
|
thread crash_elevator();
|
|
array_thread( GetEntArray( "glass_delete", "targetname" ), ::delete_glass );
|
|
|
|
// enemy_move_to_struct( move trigger, seek_goalradius, stay, duration of stay before seeking )
|
|
|
|
// First round of guys to the right of the entrance. Should pull player away from obvious escalator target.
|
|
array_spawn_function_noteworthy( "enemy_waiting_area_intro", ::enemy_move_to_struct, "enemy_waiting_area_intro", 384 );
|
|
level.enemy_remove_trigs[ "enemy_waiting_area_intro" ] = 0;
|
|
|
|
// Surround the player now that they've gone into the exposed area
|
|
array_spawn_function_noteworthy( "enemy_waiting_area_above", ::enemy_move_to_struct, "enemy_waiting_area_above", 384, true, randomintrange( 20, 30 ) );
|
|
array_spawn_function_noteworthy( "enemy_waiting_area_above", ::enemy_ignore_cover );
|
|
level.enemy_remove_trigs[ "enemy_waiting_area_above" ] = 0;
|
|
|
|
// Urban ghillie up into view.
|
|
array_spawn_function_noteworthy( "enemy_dining_area_prone", ::enemy_prone_to_stand, "enemy_dining_area_riot", 512 );
|
|
array_spawn_function_noteworthy( "enemy_dining_area_riot", ::enemy_move_to_struct, "enemy_dining_area_riot", 512, true, randomintrange( 10, 15 ) );
|
|
level.enemy_remove_trigs[ "enemy_dining_area_prone" ] = 0;
|
|
|
|
// Hitting hard with shield guys now
|
|
array_spawn_function_noteworthy( "enemy_store_area_prone", ::enemy_prone_to_stand, "enemy_store_area_start", 512 );
|
|
array_spawn_function_noteworthy( "enemy_store_area_start", ::enemy_move_to_struct, "enemy_store_area_start", 512, true, randomintrange( 10, 15 ) );
|
|
level.enemy_remove_trigs[ "enemy_store_area_start" ] = 0;
|
|
|
|
// Hitting hard with shield guys now
|
|
array_spawn_function_noteworthy( "enemy_security_area_top", ::enemy_move_to_struct, "enemy_security_area_final", 1024 );
|
|
array_spawn_function_noteworthy( "enemy_security_area_bottom", ::enemy_move_to_struct, "enemy_security_area_final", 1024, true, randomintrange( 30, 45 ) );
|
|
array_spawn_function_noteworthy( "enemy_security_area_final", ::enemy_move_to_struct, "enemy_security_area_final", 1024, true, randomintrange( 45, 135 ) );
|
|
level.enemy_remove_trigs[ "enemy_security_area_final" ] = 0;
|
|
|
|
hide_destroyed_parts();
|
|
|
|
assert( isdefined( level.gameskill ) );
|
|
switch( level.gameSkill )
|
|
{
|
|
case 0: // Easy
|
|
case 1: so_setup_regular(); break; // Regular
|
|
case 2: so_setup_hardened(); break; // Hardened
|
|
case 3: so_setup_veteran(); break; // Veteran
|
|
}
|
|
|
|
thread objective_breadcrumb();
|
|
}
|
|
|
|
so_setup_regular()
|
|
{
|
|
level.challenge_objective = CONST_regular_obj;
|
|
}
|
|
|
|
so_setup_hardened()
|
|
{
|
|
level.challenge_objective = CONST_hardened_obj;
|
|
}
|
|
|
|
so_setup_veteran()
|
|
{
|
|
level.challenge_objective = CONST_veteran_obj;
|
|
} |