cod5-sdk/raw/maps/hol1.gsc

1934 lines
53 KiB
Plaintext

#include common_scripts\utility;
#include maps\_utility;
#include maps\_anim;
#include maps\hol1_util;
#include maps\hol1_rail;
#include maps\hol1_stealth;
#include maps\_stealth_logic;
#using_animtree( "generic_human" );
////////////////////////// Holland 1 //////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////
main()
{
// setup skiptos
// to run, try: +set start charge
add_start( "event1", ::start_event1 ); // rail intro through German checkpoint
add_start( "event2", ::start_event2 ); // rail escape
add_start( "event2b", ::start_event2b );
add_start( "event2c", ::start_event2c );
add_start( "event2d", ::start_event2d );
add_start( "event2e", ::start_event2e );
add_start( "event3", ::start_event3 );
add_start( "event4", ::start_event4 );
add_start( "event5", ::start_event5 );
default_start( ::opening );
// player detection
level thread onPlayerConnect();
level thread onFirstPlayerConnect();
// setup vehicles
maps\_jeep::main( "vehicle_ger_wheeled_horch1a_backseat", "jeep" );
maps\_truck::main( "vehicle_ger_wheeled_opel_blitz_winter", "opel" );
maps\_panther::main( "vehicle_ger_tracked_panther", "panther" );
// other setups
level.maxfriendlies = 4;
level.ev2_rail_start_section = "a"; // used to identify which portion of rail to start with
level.rail_sequence = false; // true if rail section is being played
level.rail_seat_taken_1 = false;
level.rail_seat_taken_2 = false;
level.rail_seat_taken_3 = false;
level.rail_seat_taken_4 = false;
// load anything that needs loaded
precache_items();
// init functions
maps\hol1_fx::main(); // must be before _load::main
maps\_load::main(); // must be before the other stuff here
maps\hol1_anim::main();
maps\hol1_amb::main();
maps\hol1_status::main();
stealth_init();
maps\_stealth_behavior::main();
// misc
set_environment ("cold");
level.goddard = getent( "goddard", "targetname" );
level.friend1 = getent( "friend1", "targetname" );
level.friend2 = getent( "friend2", "targetname" );
}
precache_items()
{
// just objectives for now
level.obj1_string = &"HOL1_OBJECTIVE_0"; // Pose as Germans to sneak pass the checkpoint
level.obj2_string = &"HOL1_OBJECTIVE_1"; // Escape
level.obj3_string = &"HOL1_OBJECTIVE_2"; // Locate document
level.obj4A_string = &"HOL1_OBJECTIVE_3A"; // Snipers 1
level.obj4B_string = &"HOL1_OBJECTIVE_3B"; // Snipers 2
level.obj5A_string = &"HOL1_OBJECTIVE_4A"; // Explosives 1
level.obj5B_string = &"HOL1_OBJECTIVE_4B"; // Explosives 2
level.obj5C_string = &"HOL1_OBJECTIVE_4C"; // Explosives 3
level.obj6_string = &"HOL1_OBJECTIVE_5"; // Regroup
level.obj7_string = &"HOL1_OBJECTIVE_6"; // Get document
level.obj8_string = &"HOL1_OBJECTIVE_7"; // Get on truck
}
/////////////////////// Start functions ////////////////////////
////////////////////////////////////////////////////////////////
start_event1()
{
}
start_event2()
{
level.rail_sequence = true;
// delete this trigger (player starts inside, and we don't want it triggered)
trigger = getent( "ev1_move_truck_trigger", "targetname" );
trigger delete();
rail_standard_vehicle_setup( "ev1_end_jeep1", "ev1_end_jeep2" );
wait( 4 );
level.jeep1 startpath();
level.jeep2 startpath();
level.jeep1 setspeed( 0, 999, 999 );
level.jeep2 setspeed( 0, 999, 999 );
level.ev2_rail_start_section = "a";
level thread event2();
}
start_event2b()
{
level.rail_sequence = true;
rail_standard_vehicle_setup( "ev2_lake_stop1", "ev2_lake_stop2" );
wait( 5 );
level.jeep1 startpath();
level.jeep2 startpath();
level.jeep1 setspeed( 0, 999, 999 );
level.jeep2 setspeed( 0, 999, 999 );
level.ev2_rail_start_section = "b";
level thread event2();
}
start_event2c()
{
level.rail_sequence = true;
rail_standard_vehicle_setup( "ev2_convoy_ends_1", "ev2_convoy_ends_2" );
wait( 5 );
level.jeep1 startpath();
level.jeep2 startpath();
level.jeep1 setspeed( 0, 999, 999 );
level.jeep2 setspeed( 0, 999, 999 );
level.ev2_rail_start_section = "c";
level thread event2();
}
start_event2d()
{
level.rail_sequence = true;
rail_standard_vehicle_setup( "ev2_forest_end_1", "ev2_forest_end_2" );
wait( 10 );
level.jeep1 startpath();
level.jeep2 startpath();
level.jeep1 setspeed( 0, 999, 999 );
level.jeep2 setspeed( 0, 999, 999 );
level.ev2_rail_start_section = "d";
level thread event2();
}
start_event2e()
{
level.rail_sequence = true;
rail_standard_vehicle_setup( "ev2_lake_enter1", "ev2_lake_enter2" );
wait( 4 );
level.jeep1 startpath();
level.jeep2 startpath();
level.jeep1 setspeed( 0, 999, 999 );
level.jeep2 setspeed( 0, 999, 999 );
level.ev2_rail_start_section = "e";
level thread event2();
}
start_event3()
{
level.rail_sequence = false;
//friendlies_force_teleport( "event3" );
teleport_players( "event3_start" );
level thread event3();
}
start_event4()
{
}
start_event5()
{
}
/////////////////////// Opening functions //////////////////////
////////////////////////////////////////////////////////////////
// TODO: Any opening IGC scripting
// This is separated from Event 1 so I can debug without keep watching the IGCs
opening()
{
//level waittill ("introscreen_complete");
// IGC
level.rail_sequence = true;
level thread event1();
}
/////////////////////// Event1 functions ///////////////////////
////////////////////////////////////////////////////////////////
// Event 1: Rail Sequence. Ends just after escaping from checkpoint
event1()
{
// typical event threads
maps\_status::show_task( "Event1" );
level thread maps\hol1_amb::event1();
level thread event1_objectives();
level.rail_sequence = true;
//////////////////////////// MISC SETUPS /////////////////////////////////
// spawn functions on the camp enemies, so they animate correctly once spawned
ev1_spawners_init();
// prepare the jeeps
rail_standard_vehicle_setup( "ev1_jeep1_start", "ev1_jeep2_start" );
// initialize the nodes along the rail. Once hit, these nodes will send specific notifies to the AIs
// NOTE: Since each reaction node will run a thread, we will limit this function with a starting and ending node
// so it can be used for pieces of the rail
jeep1_start = getvehiclenode( "ev1_jeep1_start", "script_noteworthy" );
jeep2_start = getvehiclenode( "ev1_jeep2_start", "script_noteworthy" );
jeep1_end = getvehiclenode( "ev1_end_jeep1", "script_noteworthy" );
jeep2_end = getvehiclenode( "ev1_end_jeep2", "script_noteworthy" );
level.jeep1 thread ev1_rail_reactions_init( jeep1_start, jeep1_end );
level.jeep2 thread ev1_rail_reactions_init( jeep2_start, jeep2_end );
//level.maddock animscripts\shared::placeWeaponOn( level.maddock.primaryweapon, "none");
level.maddock.ignorall = 1;
level.maddock.pacifist = 1;
// misc other setups
// play headlight effect at specific places
level thread maps\hol1_fx::attach_headlights_to_struct( "ev1_fake_headlights" );
// a truck is at the checkpoint. It moves after the player gets there
level thread ev1_spawn_checkpoint_truck();
// a few trucks drive by in the background at the checkpoint
level thread ev1_spawn_checkpoint_trucks_ambient();
// get rid of players' weapons
get_players()[0] disableWeapons();
// temp text on the screen
level thread ev1_temp_text();
level thread ev1_cleanup();
//////////////////////////// MAIN EVENT //////////////////////////////////////
// start the rail
level.jeep1 startpath();
level.jeep2 startpath();
// Stop at the checkpoint. A truck is in the way, so the crew waits
// is notify is sent by the vehivle when a node is reached
level waittill( "stop_at_checkpoint" );
// TODO: Play anim of guard checking paper of a truck
wait( 3 );
level notify( "gate_opens" );
//iprintlnbold( "Gate opens" );
wait( 2 ); // wait for the gate to fully open
level notify( "move_opel" ); // the truck in front of the player should move
wait( 2 );
// TODO: Play anim of guard waving at player
level notify( "gate_closes" );
//iprintlnbold( "Gate closes" );
level notify( "move_forward" ); // player's cars move forward
level waittill( "stop_at_checkpoint2" ); // player's car reached stop point
wait( 1 );
level thread maps\hol1_anim::maddock_capture_anims( level.maddock ); // special thing for maddock
level waittill( "maddock_captured" );
wait( 1 );
level notify( "checkpoint_break_through" );
get_players()[0] enableWeapons();
trigger1 = getent( "ev1_sccessful_escape", "targetname" );
trigger1 waittill( "trigger" );
// do something about the maddock moving
trigger2 = getent( "ev1_oversees_camp", "targetname" );
trigger2 waittill( "trigger" );
level notify( "oversees_camp" );
level thread ev1_enemies_run_chasing();
level waittill( "stop_jeep_at_overlook" );
wait( 1 );
level.jeep1 notify( "stop_reactions" );
level.jeep2 notify( "stop_reactions" );
// end of event 1
level notify( "event1_ends" );
wait( 0.05 );
level thread event2();
}
event1_objectives()
{
// snwak through checkpoint
level waittill( "see_checkpoint" );
objective_add( 1, "current", level.obj1_string, ( 2368, -912, 60.3 ) );
// escape
level waittill( "checkpoint_break_through" );
objective_state( 1, "done" );
objective_add( 2, "current", level.obj2_string );
}
event1_objectives_finish()
{
objective_add( 1, "done", level.obj1_string );
objective_add( 2, "current", level.obj2_string );
}
ev1_spawners_init()
{
// enemies from train (some run and die, while others fight normally)
maps\hol1_anim::ev1_spawners_anims_init();
}
ev1_cleanup()
{
trigger = getent( "ev1_cleanup", "targetname" );
trigger waittill( "trigger" );
// all enemies run to chase the player
enemies = getaiarray( "axis" );
for( i = 0; i < enemies.size; i++ )
{
if( isalive( enemies[i] ) )
{
enemies[i] dodamage( enemies[i].health + 100, ( 0, 0, 0 ) );
}
}
}
ev1_temp_text()
{
level waittill ("introscreen_complete");
wait( 1 );
iprintlnbold( "Goddard: You think these German Uniforms will fool them?" );
wait( 3 );
iprintlnbold( "AI: Don't worry. Our Sgt found fake papers." );
wait( 3 );
iprintlnbold( "AI: The Germans will think we have some captured prisoners." );
wait( 4 );
iprintlnbold( "Maddock: Be quiet. We are still behind enemy lines." );
wait( 15 );
level notify( "see_checkpoint" );
iprintlnbold( "Maddock: A checkpoint. Stay quiet and let me handle it." );
level waittill( "stop_at_checkpoint2" );
iprintlnbold( "Maddock presents paper to guard" );
level waittill ("maddock_out");
iprintlnbold( "Fake paper identified by guard" );
wait( 2 );
iprintlnbold( "Maddock: Our cover is blown! RUN! Get out of here!" );
level notify("sound_alarm");
level waittill( "stop_jeep_at_overlook" );
iprintlnbold( "Goddard: There's our Sgt. He's still alive!" );
wait( 2 );
iprintlnbold( "AI: We'll have to rescue him later. Let's get out of here." );
}
ev1_spawn_checkpoint_truck()
{
trigger = getent( "ev1_spawn_checkpoint", "targetname" );
start_node = getvehiclenode( "checkpoint_truck", "script_noteworthy" );
opel = spawnvehicle( "vehicle_ger_wheeled_opel_blitz_winter",
"truck",
"opel",
start_node.origin,
start_node.angles );
opel attachPath( start_node );
wait( 2 );
playfxontag( level._effect["headlight"], opel, "tag_headlight_left" );
playfxontag( level._effect["headlight"], opel, "tag_headlight_right" );
//playfxontag( level._effect["brakelight"], opel, "tag_brakelight_left" );
level waittill( "move_opel" );
opel startpath();
level thread ev1_truck_delete_at_end( opel );
}
ev1_spawn_checkpoint_trucks_ambient()
{
level waittill( "stop_at_checkpoint" );
wait( 2 );
start_nodes = [];
start_nodes[0] = getvehiclenode( "checkpoint_truck_1", "script_noteworthy" );
start_nodes[1] = getvehiclenode( "checkpoint_truck_2", "script_noteworthy" );
start_nodes[2] = getvehiclenode( "checkpoint_truck_3", "script_noteworthy" );
for( i = 0; i < start_nodes.size; i++ )
{
opel = spawnvehicle( "vehicle_ger_wheeled_opel_blitz_winter",
"truck",
"opel",
start_nodes[i].origin,
start_nodes[i].angles );
opel attachPath( start_nodes[i] );
level thread put_fx_on_truck_wait( opel );
opel startpath();
level thread ev1_truck_delete_at_end( opel );
}
}
put_fx_on_truck_wait( opel )
{
wait( 0.5 );
playfxontag( level._effect["headlight"], opel, "tag_headlight_left" );
playfxontag( level._effect["headlight"], opel, "tag_headlight_right" );
//playfxontag( level._effect["brakelight"], opel, "tag_brakelight_left" );
}
ev1_truck_delete_at_end( truck )
{
end_node = getvehiclenode( "checkpoint_truck_delete", "script_noteworthy" );
truck setwaitnode( end_node );
truck waittill( "reached_wait_node" );
truck delete();
}
ev1_enemies_run_chasing()
{
// all enemies run to chase the player
enemies = getaiarray( "axis" );
goal_node = getnode( "ev1_goal", "targetname" );
for( i = 0; i < enemies.size; i++ )
{
if( isalive( enemies[i] ) && i <= 10)
{
enemies[i].goalradius = 4;
enemies[i] setgoalpos( goal_node.origin );
}
}
wait( 0.5 );
trucks = getentarray( "ev1_truck", "targetname" );
for( i = 0; i < trucks.size; i++ )
{
playfxontag( level._effect["headlight"], trucks[i], "tag_headlight_left" );
playfxontag( level._effect["headlight"], trucks[i], "tag_headlight_right" );
//playfxontag( level._effect["brakelight"], trucks[i], "tag_brakelight_left" );
level thread ev1_truck_delete_at_end( trucks[i] );
}
}
/////////////////////// Event2 functions ///////////////////////
////////////////////////////////////////////////////////////////
event2()
{
//iprintlnbold( "EVENT2" );
maps\_status::show_task( "Event2" );
level thread maps\hol1_amb::event2();
level thread event2_objectives();
level thread ev2_spawners_init();
level thread ev2_cleanup();
if( level.ev2_rail_start_section == "a" )
{
jeep1_start = getvehiclenode( "ev1_end_jeep1", "script_noteworthy" );
jeep2_start = getvehiclenode( "ev1_end_jeep2", "script_noteworthy" );
jeep1_end = getvehiclenode( "ev2_lake_stop1", "script_noteworthy" );
jeep2_end = getvehiclenode( "ev2_lake_stop2", "script_noteworthy" );
level.jeep1 thread ev2_rail_reactions_init_a( jeep1_start, jeep1_end );
level.jeep2 thread ev2_rail_reactions_init_a( jeep2_start, jeep2_end );
// jeep 2 backs a bit, then go forward, ahead of jeep 1
level.jeep2 setspeed( 15, 7, 7 );
level waittill( "jeep2_starts" );
level.jeep1 setspeed( 20, 7, 7 );
maps\hol1_amb::set_fog_culling( 0, 600, 0, 3000 );
level waittill( "rail_section_a_ends" );
level.jeep1 notify( "stop_reactions" );
level.jeep2 notify( "stop_reactions" );
wait( 0.05 );
level.ev2_rail_start_section = "b";
}
if( level.ev2_rail_start_section == "b" )
{
jeep1_start = getvehiclenode( "ev2_lake_stop1", "script_noteworthy" );
jeep2_start = getvehiclenode( "ev2_lake_stop2", "script_noteworthy" );
jeep1_end = getvehiclenode( "ev2_convoy_ends_1", "script_noteworthy" );
jeep2_end = getvehiclenode( "ev2_convoy_ends_2", "script_noteworthy" );
level.jeep1 thread ev2_rail_reactions_init_b( jeep1_start, jeep1_end );
level.jeep2 thread ev2_rail_reactions_init_b( jeep2_start, jeep2_end );
maps\hol1_amb::set_fog_culling( 0, 200, 300, 2000 );
wait( 3 );
level.jeep1 setspeed( 20, 7, 7 );
level.jeep2 setspeed( 20, 7, 7 );
level thread maps\hol1_anim::ev2_truck_crash_anim();
level waittill( "rail_section_b_ends" );
level.jeep1 notify( "stop_reactions" );
level.jeep2 notify( "stop_reactions" );
wait( 0.05 );
level.ev2_rail_start_section = "c";
}
if( level.ev2_rail_start_section == "c")
{
jeep1_start = getvehiclenode( "ev2_convoy_ends_1", "script_noteworthy" );
jeep2_start = getvehiclenode( "ev2_convoy_ends_2", "script_noteworthy" );
jeep1_end = getvehiclenode( "ev2_forest_end_1", "script_noteworthy" );
jeep2_end = getvehiclenode( "ev2_forest_end_2", "script_noteworthy" );
level.jeep1 thread ev2_rail_reactions_init_c( jeep1_start, jeep1_end );
level.jeep2 thread ev2_rail_reactions_init_c( jeep2_start, jeep2_end );
level.jeep2 setspeed( 25, 99, 99 );
wait( 1 );
level.jeep1 setspeed( 30, 99, 99 );
wait( 1 );
maps\hol1_amb::set_fog_culling( 0, 200, 370, 2000 );
level waittill( "raise fog" );
maps\hol1_amb::set_fog_culling( 0, 400, 25, 3000 );
level waittill( "rail_section_c_ends" );
level.jeep1 notify( "stop_reactions" );
level.jeep2 notify( "stop_reactions" );
wait( 0.05 );
level.ev2_rail_start_section = "d";
}
if( level.ev2_rail_start_section == "d")
{
jeep1_start = getvehiclenode( "ev2_forest_end_1", "script_noteworthy" );
jeep2_start = getvehiclenode( "ev2_forest_end_2", "script_noteworthy" );
jeep1_end = getvehiclenode( "ev2_lake_enter1", "script_noteworthy" );
jeep2_end = getvehiclenode( "ev2_lake_enter2", "script_noteworthy" );
level.jeep1 thread ev2_rail_reactions_init_d( jeep1_start, jeep1_end );
level.jeep2 thread ev2_rail_reactions_init_d( jeep2_start, jeep2_end );
trigger = getent( "ev2_tank_guard_trigger", "targetname" );
trigger notify( "trigger" );
maps\hol1_amb::set_fog_culling( 0, 500, 25, 3000 );
// tells jeep 1 to check out the cabin
wait( 1 );
iprintlnbold( "Go clear the cabin. We'll hold them here" );
wait( 1 );
level.jeep1 setspeed( 15, 10, 10 );
level waittill( "ready_to_spawn_panther" );
level thread ev2_panther();
wait( 2 );
iprintlnbold( "Panther ahead" );
wait( 4 );
level.jeep2 setspeed( 15, 15, 15 );
iprintlnbold( "Back up! Back up!" );
level waittill( "rail_section_d_ends" );
level.jeep1 notify( "stop_reactions" );
level.jeep2 notify( "stop_reactions" );
wait( 0.05 );
level.ev2_rail_start_section = "e";
}
if( level.ev2_rail_start_section == "e")
{
jeep1_start = getvehiclenode( "ev2_lake_enter1", "script_noteworthy" );
jeep2_start = getvehiclenode( "ev2_lake_enter2", "script_noteworthy" );
jeep1_end = getvehiclenode( "ev2_stop_rail_1", "script_noteworthy" );
jeep2_end = getvehiclenode( "ev2_stop_rail_2", "script_noteworthy" );
level.jeep1 thread ev2_rail_reactions_init_e( jeep1_start, jeep1_end );
level.jeep2 thread ev2_rail_reactions_init_e( jeep2_start, jeep2_end );
level.jeep1 resumespeed( 10 );
level.jeep2 resumespeed( 10 );
level waittill( "rail_section_e_ends" );
level.jeep1 notify( "stop_reactions" );
level.jeep2 notify( "stop_reactions" );
}
wait( 3 );
// dismount
//level.goddard thread move_to_struct_pos( "ev2_goddard_off" );
//level.friend1 thread move_to_struct_pos( "ev2_friend1_off" );
//level.friend2 thread move_to_struct_pos( "ev2_friend2_off" );
players = get_players();
for( i = 0; i < players.size; i++ )
{
if( players[i].current_seat == 1 )
{
players[i] thread move_to_struct_pos( "ev2_player1_off" );
}
else if( players[i].current_seat == 2 )
{
players[i] thread move_to_struct_pos( "ev2_player2_off" );
}
else if( players[i].current_seat == 3 )
{
players[i] thread move_to_struct_pos( "ev2_player3_off" );
}
else if( players[i].current_seat == 4 )
{
players[i] thread move_to_struct_pos( "ev2_player4_off" );
}
}
level.rail_sequence = false;
level notify( "end_rail" );
teleport_players( "event3_start" );
//iprintlnbold( "Event 3 starts" );
level thread event3();
}
event2_objectives()
{
}
ev2_spawners_init()
{
// enemies from train (some run and die, while others fight normally)
maps\hol1_anim::ev2_spawners_anims_init();
}
ev2_panther()
{
start_node = getvehiclenode( "ev2_panther_start", "script_noteworthy" );
tank = spawnvehicle( "vehicle_ger_tracked_panther",
"panther",
"panther",
start_node.origin,
start_node.angles );
tank attachPath( start_node );
tank.health = 10000000;
wait( 0.5 );
playfxontag( level._effect["headlight"], tank, "tag_headlight_left" );
tank startpath();
node = getvehiclenode( "splash_entry", "script_noteworthy" );
maps\hol1_rail::wait_till_reach_vehicle_node( node, tank );
pos = getstruct( "splash_entry_pos", "targetname" );
playfx( level._effect["snow_splash_large"], pos.origin );
playfx( level._effect["snow_tree_falling"], pos.origin + (0,0,80) );
node = getvehiclenode( "fire_at_player_1", "script_noteworthy" );
maps\hol1_rail::wait_till_reach_vehicle_node( node, tank );
players = get_players();
for( i = 0; i < players.size; i++ )
{
players[i] EnableInvulnerability();
}
level thread ev2_panther_fire_at_jeep2( tank );
node = getvehiclenode( "fire_at_player_2", "script_noteworthy" );
maps\hol1_rail::wait_till_reach_vehicle_node( node, tank );
level thread ev2_panther_fire_at_jeep2( tank );
node = getvehiclenode( "tank_at_edge", "script_noteworthy" );
maps\hol1_rail::wait_till_reach_vehicle_node( node, tank );
level notify( "tank_at_edge" );
players = get_players();
for( i = 0; i < players.size; i++ )
{
players[i] DisableInvulnerability();
}
}
ev2_panther_fire_at_jeep2( tank )
{
target_ent = spawn( "script_origin", level.jeep2.origin );
tank setturrettargetent( target_ent );
tank waittill( "turret_on_target" );
tank fireWeapon();
//iprintlnbold( "fire" );
target_ent delete();
tank setturrettargetent( level.jeep2 );
}
ev2_cleanup()
{
trigger = getent( "ev2_cleanup", "targetname" );
trigger waittill( "trigger" );
// all enemies run to chase the player
enemies = getaiarray( "axis" );
for( i = 0; i < enemies.size; i++ )
{
if( isalive( enemies[i] ) )
{
enemies[i] dodamage( enemies[i].health + 100, ( 0, 0, 0 ) );
}
}
trucks = getentarray( "opel", "targetname" );
for( i = 0; i < trucks.size; i++ )
{
trucks[i] notify( "death" );
}
//iprintlnbold( "clean up" );
}
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
event3()
{
level thread event3_objectives();
custom_stealth_detection_range_setup( 5, 256, 50, 512, 128, 1024, false );
// temp: remove this once friendlies dismount correctly
level thread event3_temp_replace_friendlies();
level thread event3_section_1();
level waittill( "event3_section_1_complete" );
level thread event3_execution();
level waittill( "event3_section_2_complete" );
custom_stealth_detection_range_setup( 5, 50, 50, 512, 128, 1024, true );
level.goddard thread avoid_combat();
level.friend1 thread avoid_combat();
level.friend2 thread avoid_combat();
level thread custom_stealth_react_to_gun_fire( "ev3_area_1" );
level thread custom_stealth_react_to_gun_fire( "ev3_area_2" );
level thread reinforcements_monitor( "ev3_reinforcement_trigger", "ev3_area_1" );
level thread reinforcements_monitor( "ev3_reinforcement_trigger_2", "ev3_area_2" );
enemies1 = getentarray( "ev3_enemies_area1", "targetname" );
array_thread( enemies1, ::add_spawn_function, ::ev3_spawners_1_custom_init );
enemies2 = getentarray( "ev3_enemies_area2", "targetname" );
array_thread( enemies2, ::add_spawn_function, ::ev3_spawners_2_custom_init );
event3_ambient_anims();
level thread event3_stealth_run();
level thread event3_stealth_attack();
level waittill( "event3_done" );
level thread event4();
}
event3_temp_replace_friendlies()
{
if( isdefined( level.goddard ) )
{
level.goddard thread stop_magic_bullet_shield();
}
if( isdefined( level.maddock ) )
{
level.maddock thread stop_magic_bullet_shield();
}
if( isdefined( level.friend1 ) )
{
level.friend1 thread stop_magic_bullet_shield();
}
if( isdefined( level.friend2 ) )
{
level.friend2 thread stop_magic_bullet_shield();
}
new_friends = getentarray( "ev3_temp_friendlies", "targetname" );
array_thread( new_friends, ::add_spawn_function, ::ev3_temp_friends_init );
}
ev3_temp_friends_init()
{
wait( 1 );
if( self.script_noteworthy == "temp1" )
{
level.goddard = self;
level notify( "goddard_re_spawned" );
//iprintlnbold( "Goddard In" );
}
else if( self.script_noteworthy == "temp2" )
{
level.friend1 = self;
level notify( "friend1_re_spawned" );
//iprintlnbold( "Guy 1 In" );
}
else if( self.script_noteworthy == "temp3" )
{
level.friend2 = self;
level notify( "friend2_re_spawned" );
//iprintlnbold( "Guy 2 In" );
}
self thread magic_bullet_shield();
self avoid_combat();
}
event3_stealth_run()
{
level endon( "break_stealth" );
dont_attack_trigger = getent( "ev3_friends_dont_attack", "targetname" );
dont_attack_trigger waittill( "trigger" );
level.goddard avoid_combat();
level.friend1 avoid_combat();
level.friend2 avoid_combat();
stealth_start_trigger = getent( "ev3_friends_start_stealth", "targetname" );
stealth_start_trigger waittill( "trigger" );
level.goddard disable_ai_color();
level.friend1 disable_ai_color();
level.friend2 disable_ai_color();
nodes = getnodearray( "ev3_stealth_start_covers", "targetname" );
level.goddard thread go_to_node_with_notify( nodes[0], "1_in_position" );
level.friend1 thread go_to_node_with_notify( nodes[1], "2_in_position" );
level.friend2 thread go_to_node_with_notify( nodes[2], "3_in_position" );
level waittill_multiple( "1_in_position", "2_in_position", "3_in_position" );
level notify( "all_in_position" );
////////////////////////////////////
iprintlnbold( "Some of us are still in German uniform" );
wait( 2 );
iprintlnbold( "We can sneak through, posing as captor and prisoners" );
wait( 2 );
iprintlnbold( "Follow me closely and don't alert the Germans" );
wait( 2 );
iprintlnbold( "Let's go" );
////////////////////////////////////
level.goddard.animname = "captor";
level.friend1.animname = "prisonerL";
level.friend2.animname = "prisonerR";
//level.friend1 animscripts\shared::placeWeaponOn( level.friend1.primaryweapon, "none");
//level.friend2 animscripts\shared::placeWeaponOn( level.friend2.primaryweapon, "none");
// 1. Get them to reach the start positions
maps\hol1_anim::formation_anim();
maps\hol1_anim::everyone_single_solo( "capture_walk_in" );
// 2. start walking loop
maps\hol1_anim::set_capture_walk_anims();
everyone_walk_to_trigger( "walk_captor_turn", "walk_prisonerL_turn", "walk_prisonerR_turn", "walk_right_trigger" );
// now the trigger is hit, make then reach for there and do idle
maps\hol1_anim::turn_anim_with_idle();
everyone_walk_to_trigger( "walk_captor_stop", "walk_prisonerL_stop", "walk_prisonerR_stop", "walk_stop_trigger" );
maps\hol1_anim::everyone_single_solo( "capture_walk_out" );
maps\hol1_anim::reset_capture_walk_anims();
go_to_cover_nodes( "walk_captor_cover", "walk_prisonerL_cover", "walk_prisonerR_cover" );
iprintlnbold( "Take out that guard in the road" );
}
event3_stealth_attack()
{
level waittill_any( "ev3_area_1", "ev3_area_2", "ev4_inside", "ev4_outside" );
level notify( "break_stealth" );
level.goddard resume_combat();
level.friend1 resume_combat();
level.friend2 resume_combat();
level.goddard enable_ai_color();
level.friend1 enable_ai_color();
level.friend2 enable_ai_color();
}
everyone_walk_to_trigger( node_name_captor, node_name_prisonerL, node_name_prisonerR, trigger_name )
{
goal_captor = getnode( node_name_captor, "targetname" );
goal_prisonerL = getnode( node_name_prisonerL, "targetname" );
goal_prisonerR = getnode( node_name_prisonerR, "targetname" );
level.goddard setgoalnode( goal_captor );
level.friend1 setgoalnode( goal_prisonerL );
level.friend2 setgoalnode( goal_prisonerR );
// wait until the trigger is touched. The prisoners will hit the trigger first
turn_trigger = getent( trigger_name, "targetname" );
while( level.friend1 istouching( turn_trigger ) == false )
{
wait( 0.1 );
}
level notify( "everyone_in_position" );
}
go_to_cover_nodes( node_name_captor, node_name_prisonerL, node_name_prisonerR )
{
goal_captor = getnode( node_name_captor, "targetname" );
goal_prisonerL = getnode( node_name_prisonerL, "targetname" );
goal_prisonerR = getnode( node_name_prisonerR, "targetname" );
level.goddard setgoalnode( goal_captor );
level.friend1 setgoalnode( goal_prisonerL );
level.friend2 setgoalnode( goal_prisonerR );
level.goddard.goalradius = 512;
level.friend1.goalradius = 512;
level.friend2.goalradius = 512;
}
event3_ambient_anims()
{
enemies1 = getentarray( "ev3_digger", "script_noteworthy" );
array_thread( enemies1, ::add_spawn_function, ::ev3_digger_init );
enemies2 = getentarray( "ev3_barrel", "script_noteworthy" );
array_thread( enemies2, ::add_spawn_function, ::ev3_barrels_init );
enemies3 = getentarray( "ev3_weapons_check_1", "script_noteworthy" );
array_thread( enemies3, ::add_spawn_function, ::ev3_weapons_check_1_init );
enemies4 = getentarray( "ev3_weapons_check_2", "script_noteworthy" );
array_thread( enemies4, ::add_spawn_function, ::ev3_weapons_check_2_init );
enemies5 = getentarray( "ev3_weapons_check_3", "script_noteworthy" );
array_thread( enemies5, ::add_spawn_function, ::ev3_weapons_check_3_init );
enemies6 = getentarray( "ev3_weapons_check_4", "script_noteworthy" );
array_thread( enemies6, ::add_spawn_function, ::ev3_weapons_check_4_init );
}
ev3_digger_init()
{
self thread maps\hol1_anim::digger_anim();
}
ev3_barrels_init()
{
self thread maps\hol1_anim::barrel_anim();
}
ev3_weapons_check_1_init()
{
self thread maps\hol1_anim::weapon_check_1_anim();
}
ev3_weapons_check_2_init()
{
self thread maps\hol1_anim::weapon_check_2_anim();
}
ev3_weapons_check_3_init()
{
self thread maps\hol1_anim::weapon_check_3_anim();
}
ev3_weapons_check_4_init()
{
self thread maps\hol1_anim::weapon_check_4_anim();
}
event3_objectives()
{
// update objective to point to camp
objective_position( 2, ( 21741, -1587, 7.1 ) );
trigger = getent( "ev3_spawn_enemies", "targetname" );
trigger waittill( "trigger" );
objective_state( 2, "done" );
objective_add( 3, "current", level.obj3_string, ( 28680.8, -1513.5, 90 ) );
trigger = getent( "ev4_start_trigger", "targetname" );
trigger waittill( "trigger" );
objective_state( 3, "done" );
objective_add( 4, "current", level.obj4A_string, ( 27460.6, -1865, 280 ) );
objective_add( 5, "current", level.obj4B_string, ( 27833.6, -3021.25, 280 ) );
objective_add( 6, "current", level.obj5A_string, ( 26597.8, -3551.75, 33.298 ) );
objective_add( 7, "current", level.obj5B_string, ( 27055.3, -3549.25, 33.298 ) );
objective_add( 8, "current", level.obj5C_string, ( 27344.1, -3709.25, 25.9966 ) );
level notify( "event3_done" );
}
ev3_spawners_1_custom_init()
{
self thread custom_stealth_ai( "ev3_area_1" );
}
ev3_spawners_2_custom_init()
{
self thread custom_stealth_ai( "ev3_area_2" );
}
temp_level_end()
{
trigger = getent( "temp_end_level", "targetname" );
trigger waittill( "trigger" );
//iprintlnbold( "END OF SCRIPTING" );
missionsuccess( "hol3", false );
}
reinforcements_monitor( trigger_name, notify_name )
{
triggers = getentarray( trigger_name, "targetname" );
// initially disable them
for( i = 0; i < triggers.size; i++ )
{
triggers[i] trigger_off();
}
level waittill( notify_name );
for( i = 0; i < triggers.size; i++ )
{
triggers[i] trigger_on();
}
}
event3_section_1()
{
level.ev3_section1_stealth_broken = false;
level thread ev3_section1_check_stealth_level();
level thread ev3_section1_failsafe();
level thread ev3_force_end_section_1();
// Step 1: prepare the spawners in the enemy area
knife_kill_enemy = getentarray( "ev3_first_blood", "script_noteworthy" );
array_thread( knife_kill_enemy, ::add_spawn_function, ::ev3_knife_kill_enemy_ai );
player_kill_enemy = getentarray( "ev3_camp1_guy1", "script_noteworthy" );
array_thread( player_kill_enemy, ::add_spawn_function, ::ev3_player_kill_enemy_ai );
weapon_check_enemy = getentarray( "ev3_camp1_guy2", "script_noteworthy" );
array_thread( weapon_check_enemy, ::add_spawn_function, ::ev3_weapon_check_enemy_ai );
level waittill_multiple( "goddard_re_spawned", "friend1_re_spawned", "friend2_re_spawned" );
//iprintlnbold( "Move Guys" );
level thread custom_stealth_react_to_gun_fire( "ev3_first_blood" );
level thread custom_stealth_react_to_gun_fire( "ev3_camp1_patrol" );
level thread custom_stealth_react_to_gun_fire( "ev3_camp1_weapon" );
// Step 2: tell AIs to run to first set of covers
level.goddard.goalradius = 16;
level.goddard setgoalnode( getnode( "goddard_cover_0", "targetname" ) );
level.friend1.goalradius = 16;
level.friend1 setgoalnode( getnode( "friend1_cover_0", "targetname" ) );
level.friend2.goalradius = 16;
level.friend2 setgoalnode( getnode( "friend2_cover_0", "targetname" ) );
iprintlnbold( "Stay hidden. Don't make any noise" );
// Step 3: When player approaches, play the kill anim
trigger = getent( "ev3_section_1_approach", "targetname" );
trigger waittill( "trigger" );
level notify( "player_approaches" );
level.goddard.goalradius = 16;
level.goddard setgoalnode( getnode( "goddard_cover_1", "targetname" ) );
level.friend1.goalradius = 16;
level.friend1 setgoalnode( getnode( "friend1_cover_1", "targetname" ) );
level.friend2.goalradius = 16;
level.friend2 setgoalnode( getnode( "friend2_cover_1", "targetname" ) );
level thread ev3_section1_anim();
level waittill_either( "anim_kill_complete", "stealth_broken" );
players = get_players();
for( i = 0; i < players.size; i++ )
{
players[i] enableWeapons();
}
// Step 2: tell AIs to run to first set of covers
level.goddard.goalradius = 16;
level.goddard setgoalnode( getnode( "goddard_cover_2", "targetname" ) );
level.friend1.goalradius = 16;
level.friend1 setgoalnode( getnode( "friend1_cover_2", "targetname" ) );
level.friend2.goalradius = 16;
level.friend2 setgoalnode( getnode( "friend2_cover_2", "targetname" ) );
wait( 0.5 );
if( level.ev3_section1_stealth_broken == false )
{
iprintlnbold( "STEALTH OK" );
level.goddard thread gesture_closer( "Melee this guy down. Wait till his back is turned" );
level waittill_either( "entering_combat", "move_on" );
}
else
{
iprintlnbold( "STEALTH BROKEN. Wait for kills" );
// wait till all enemies have died
wait( 2 );
guys1 = get_ai_group_ai( "ev3_first_blood" );
guys2 = get_ai_group_ai( "ev3_camp1_patrol" );
guys3 = get_ai_group_ai( "ev3_camp1_weapon" );
for( i = 0; i < guys1.size; i++ )
{
guys1[i] DoDamage( guys1[i].health + 5, (0,0,0) );
}
for( i = 0; i < guys2.size; i++ )
{
guys2[i] DoDamage( guys2[i].health + 5, (0,0,0) );
}
for( i = 0; i < guys3.size; i++ )
{
guys3[i] DoDamage( guys3[i].health + 5, (0,0,0) );
}
}
iprintlnbold( "move" );
level.goddard thread avoid_combat();
level.friend1 thread avoid_combat();
level.friend2 thread avoid_combat();
// Step 2: tell AIs to run to next nodes
level.goddard.goalradius = 16;
level.goddard setgoalnode( getnode( "goddard_cover_3", "targetname" ) );
level.friend1.goalradius = 16;
level.friend1 setgoalnode( getnode( "friend1_cover_3", "targetname" ) );
level.friend2.goalradius = 16;
level.friend2 setgoalnode( getnode( "friend2_cover_3", "targetname" ) );
//level.goddard waittill( "goal" );
//level.goddard thread gesture_stop( "Wait here. Don't alert them" );
level notify( "event3_section_1_complete" );
}
ev3_section1_anim()
{
if( level.ev3_section1_stealth_broken == false )
{
iprintlnbold( "Wait here. I'll take that guard out" );
level.goddard waittill( "goal" );
// Step 4: now play it
node = getstruct("knife_node", "targetname");
level.goddard.animname = "sneaky_goddard";
if( isalive( level.knife_enemy ) )
{
//iprintlnbold( "Enemy defined" );
nazi = level.knife_enemy;
nazi.animname = "nazi_knifed";
vignette_dudes = [];
vignette_dudes = array_add( vignette_dudes, level.goddard );
vignette_dudes = array_add( vignette_dudes, nazi );
level.goddard.goalradius = 4;
//node anim_reach_solo( level.goddard, "goddard_sneak");
if( level.ev3_section1_stealth_broken == false && isalive( level.knife_enemy ) )
{
node anim_single_solo( level.goddard, "goddard_sneak");
}
if( level.ev3_section1_stealth_broken == false && isalive( level.knife_enemy ) )
{
node anim_single( vignette_dudes, "goddard_knife" );
}
if( level.ev3_section1_stealth_broken == false && isalive( level.knife_enemy ) )
{
nazi.deathanim = level.scr_anim["nazi_knifed"]["nazi_death"];
nazi dodamage( nazi.health * 10, ( nazi.origin ) );
node anim_single_solo(level.goddard, "goddard_kill");
}
if( level.ev3_section1_stealth_broken == false )
{
wait( 4 );
level.goddard thread gesture_closer( "Follow me" );
}
wait( 2 );
}
}
level notify( "anim_kill_complete" );
}
ev3_section1_check_stealth_level()
{
level endon( "event3_section_1_complete" );
level waittill_either( "entering_combat", "attack_button_pressed" );
level notify( "stealth_broken" );
//iprintlnbold( "stealth broken" );
level.ev3_section1_stealth_broken = true;
level.goddard stopanimscripted();
level.goddard thread resume_combat();
level.friend1 thread resume_combat();
level.friend2 thread resume_combat();
players = get_players();
for( i = 0; i < players.size; i++ )
{
players[i] enableWeapons();
}
guys1 = get_ai_group_ai( "ev3_first_blood" );
guys2 = get_ai_group_ai( "ev3_camp1_patrol" );
guys3 = get_ai_group_ai( "ev3_camp1_weapon" );
if( isalive( guys1[0] ) )
{
guys1[0] notify( "enemy_in_sight" );
}
if( isalive( guys2[0] ) )
{
guys2[0] notify( "enemy_in_sight" );
}
if( isalive( guys3[0] ) )
{
guys3[0] notify( "enemy_in_sight" );
}
}
ev3_section1_failsafe()
{
/*
level waittill( "player_approaches" );
// wait till all enemies have died
while( 1 )
{
guys1 = get_ai_group_ai( "ev3_first_blood" );
guys2 = get_ai_group_ai( "ev3_camp1_patrol" );
guys3 = get_ai_group_ai( "ev3_camp1_weapon" );
if( guys1.size + guys2.size + guys3.size != 0 )
{
wait( 0.05 );
}
else
{
break;
}
}
iprintlnbold( "FAILSAFE" );
// Step 2: tell AIs to run to next nodes
level.goddard.goalradius = 16;
level.goddard setgoalnode( getnode( "goddard_cover_3", "targetname" ) );
level.friend1.goalradius = 16;
level.friend1 setgoalnode( getnode( "friend1_cover_3", "targetname" ) );
level.friend2.goalradius = 16;
level.friend2 setgoalnode( getnode( "friend2_cover_3", "targetname" ) );
level.goddard thread gesture_stop( "Wait here. Don't alert them" );
level notify( "event3_section_1_complete" );
*/
}
ev3_section2_check_stealth_level()
{
level endon( "event3_section_2_complete" );
level waittill_either( "entering_combat", "attack_button_pressed" );
//iprintlnbold( "stealth 2 broken" );
level.ev3_section2_stealth_broken = true;
level.goddard stopanimscripted();
level.goddard thread resume_combat();
level.friend1 thread resume_combat();
level.friend2 thread resume_combat();
players = get_players();
for( i = 0; i < players.size; i++ )
{
players[i] enableWeapons();
}
guys = get_ai_group_ai( "ev3_execution" );
for( i = 0; i < guys.size; i++ )
{
guys[i] notify( "enemy_in_sight" );
}
}
gesture_closer( msg )
{
self.animname = "gesture";
self waittill( "goal" );
self anim_single_solo( self, "gesture_closer" );
if( isdefined( msg ) )
{
iprintlnbold( msg );
}
}
gesture_stop( msg )
{
self.animname = "gesture";
self waittill( "goal" );
self anim_single_solo( self, "gesture_stop" );
if( isdefined( msg ) )
{
iprintlnbold( msg );
}
}
ev3_knife_kill_enemy_ai()
{
level.knife_enemy = self;
self.ignoreall = 1;
self.pacifist = 1;
//self thread custom_stealth_ai( "ev3_first_blood" );
}
ev3_player_kill_enemy_ai()
{
self thread custom_stealth_ai( "ev3_camp1_patrol" );
level thread wait_for_player_to_kill_him( self );
}
wait_for_player_to_kill_him( guy )
{
guy waittill( "death" );
level notify( "move_on" );
}
ev3_force_end_section_1()
{
level endon( "event3_section_1_complete" );
trig = GetEnt( "ev3_intro_camp_2", "targetname" );
trig waittill ("trigger");
iprintlnbold( "move" );
guys1 = get_ai_group_ai( "ev3_first_blood" );
guys2 = get_ai_group_ai( "ev3_camp1_patrol" );
guys3 = get_ai_group_ai( "ev3_camp1_weapon" );
for( i = 0; i < guys1.size; i++ )
{
guys1[i] DoDamage( guys1[i].health + 5, (0,0,0) );
}
for( i = 0; i < guys2.size; i++ )
{
guys2[i] DoDamage( guys2[i].health + 5, (0,0,0) );
}
for( i = 0; i < guys3.size; i++ )
{
guys3[i] DoDamage( guys3[i].health + 5, (0,0,0) );
}
level.goddard thread avoid_combat();
level.friend1 thread avoid_combat();
level.friend2 thread avoid_combat();
// Step 2: tell AIs to run to next nodes
level.goddard.goalradius = 16;
level.goddard setgoalnode( getnode( "goddard_cover_3", "targetname" ) );
level.friend1.goalradius = 16;
level.friend1 setgoalnode( getnode( "friend1_cover_3", "targetname" ) );
level.friend2.goalradius = 16;
level.friend2 setgoalnode( getnode( "friend2_cover_3", "targetname" ) );
//level.goddard waittill( "goal" );
//level.goddard thread gesture_stop( "Wait here. Don't alert them" );
level notify( "event3_section_1_complete" );
}
ev3_weapon_check_enemy_ai()
{
self thread custom_stealth_ai( "ev3_camp1_weapon" );
self thread maps\hol1_anim::weapon_check_1_anim();
}
event3_execution()
{
level.goddard thread avoid_combat();
level.friend1 thread avoid_combat();
level.friend2 thread avoid_combat();
level.ev3_section2_stealth_broken = false;
trig = GetEnt( "ev3_intro_camp_2", "targetname" );
animSpot = GetStruct( trig.target, "targetname" );
trig waittill ("trigger");
level thread ev3_section2_check_stealth_level();
trig Delete();
if( level.ev3_section2_stealth_broken == true )
{
iprintlnbold( "broken" );
}
// setup watchers
execution_enemy = getentarray( "execution_watcher", "script_noteworthy" );
array_thread( execution_enemy, ::add_spawn_function, ::ev3_execution_enemy_ai );
executioner = getentarray( "execution_watcher", "script_noteworthy" );
array_thread( executioner, ::add_spawn_function, ::ev3_executioner_ai );
// spawn the guys
victim_spawner = GetEnt( "execution_friendly_spawner", "targetname" );
executioner_spawner = GetEnt( "execution_enemy_spawner", "targetname" );
// spawn victim
victim = victim_spawner spawn_ai();
if ( spawn_failed( victim ) )
{
ASSERTMSG( "Key friendly failed to spawn." );
return;
}
victim.ignoreme = true;
victim.anim_disableLongDeath = true;
victim.og_pathenemyfightdist = victim.pathenemyfightdist;
victim.og_pathenemylookahead = victim.pathenemylookahead;
victim.og_goalheight = victim.goalheight;
victim.og_goalradius = victim.goalradius;
victim.og_animname = victim.animname;
victim.pathenemyfightdist = 0;
victim.pathenemylookahead = 0;
victim.goalheight = 64;
victim.goalradius = 32;
victim.animname = "knees_execution_victim";
victim.targetname = "knees_execution_guys";
victim.ignoreall = 1;
victim.pacifist = 1;
// TODO take weapons from victim
// spawn executioner
executioner = executioner_spawner spawn_ai();
if ( spawn_failed( executioner ) )
{
ASSERTMSG( "Key enemy failed to spawn." );
return;
}
executioner.ignoreme = true;
executioner.goalradius = 32;
executioner.animname = "knees_execution_executioner";
executioner.targetname = "knees_execution_guys";
executioner.victim = victim;
executioner.allowdeath = true;
// TODO give rifle to executioner
victim.executioner = executioner;
executioner.ignoreall = 1;
executioner.pacifist = 1;
// kick off the victim/executioner anims
level thread maps\hol1_anim::event3_execution_2man_anims( victim, executioner, animSpot );
if( level.ev3_section2_stealth_broken == false )
{
level waittill( "execution_done" );
}
if( isalive( executioner ) )
{
executioner.health = 1;
}
if( isalive( victim ) )
{
victim DoDamage( victim.health + 5, (0,0,0) );
}
if( level.ev3_section2_stealth_broken == false )
{
level notify( "run_back" );
}
/*
if( level.ev3_section2_stealth_broken == false )
{
wait( 7 );
}
else
{
// wait till all enemies have died
count = 0;
while( count < 20 * 15 ) // 15 seconds
{
guys1 = get_ai_group_ai( "ev3_execution" );
guys2 = get_ai_group_ai( "ev3_executioner" );
if( guys1.size + guys2.size != 0 )
{
wait( 0.05 );
count++;
}
else
{
break;
}
}
}
*/
wait( 7 );
level notify( "time_to_move_on" );
iprintlnbold( "Time to move" );
level.goddard.goalradius = 16;
level.goddard setgoalnode( getnode( "goddard_cover_4", "targetname" ) );
level.friend1.goalradius = 16;
level.friend1 setgoalnode( getnode( "friend1_cover_4", "targetname" ) );
level.friend2.goalradius = 16;
level.friend2 setgoalnode( getnode( "friend2_cover_4", "targetname" ) );
level notify( "event3_section_2_complete" );
}
ev3_execution_enemy_ai()
{
self thread custom_stealth_ai( "ev3_execution" );
escape_node = getnode( "ev3_escape", "targetname" );
level waittill( "run_back" );
self.goalradius = 64;
self setgoalnode( escape_node );
self waittill( "goal" );
self delete();
}
ev3_executioner_ai()
{
self.health = 100000;
self.ignoreall = true;
level waittill( "execution_done" );
self.health = 1;
//self thread custom_stealth_ai( "ev3_executioner" );
//if( level.ev3_section2_stealth_broken == true )
//{
// self notify( "enemy_in_sight" );
//}
}
///////////////////////////////////////////////////////////////////////
event4()
{
level thread event4_objective();
//iprintlnbold( "event 4 starts" );
custom_stealth_detection_range_setup( 5, 512, 25, 512, 128, 1024, false );
level thread custom_stealth_react_to_gun_fire( "ev4_outside" );
level thread custom_stealth_react_to_gun_fire( "ev4_inside" );
enemies1 = getentarray( "ev4_outside", "targetname" );
array_thread( enemies1, ::add_spawn_function, ::ev4_spawners_custom_1_init );
enemies2 = getentarray( "ev4_inside", "targetname" );
array_thread( enemies2, ::add_spawn_function, ::ev4_spawners_custom_2_init );
snipers1 = getentarray( "sniper1", "script_noteworthy" );
array_thread( snipers1, ::add_spawn_function, ::snipers1_ai );
snipers2 = getentarray( "sniper2", "script_noteworthy" );
array_thread( snipers2, ::add_spawn_function, ::snipers2_ai );
//overwrite_detect_ranges_2();
level thread bombs_set();
level thread snipers_kill();
level thread prepare_escape_truck();
iprintlnbold( "Radio: Intruders alert!" );
wait( 2 );
iprintlnbold( "Don't get close to the enemies and stay in cover" );
wait( 2 );
iprintlnbold( "Kill snipers on the roof" );
wait( 2 );
iprintlnbold( "and set explosive underneath the trucks" );
level waittill( "regrouped" );
inspection_node = getnode( "inspection_node", "targetname" );
insiders = get_ai_group_ai( "ev4_inside" );
for( i = 0; i < insiders.size; i++ )
{
insiders[i] thread avoid_combat();
insiders[i].goalradius = 64;
insiders[i] setgoalnode( inspection_node );
}
level thread temp_level_end();
}
event4_objective()
{
level waittill_multiple( "all_bombs_set", "all_snipers_killed" );
objective_add( 9, "current", level.obj6_string, ( 28315.6, -3264.6, 53.4 ) );
regroup_trigger = getent( "regroup_trigger", "targetname" );
regroup_trigger waittill( "trigger" );
iprintlnbold( "Bombs go off. Germans inside running out" );
level notify( "regrouped" );
objective_state( 9, "done" );
objective_add( 10, "current", level.obj7_string, ( 28296.3, -2222.4, 88 ) );
document_trigger = getent( "document_trigger", "targetname" );
document_trigger waittill( "trigger" );
iprintlnbold( "Found documents on desk. Exit through the back door" );
objective_state( 10, "done" );
objective_add( 11, "current", level.obj8_string, ( 28811, -2374, 70.1552 ) );
level thread get_players_into_truck();
level waittill( "all_players_in_position" );
objective_state( 11, "done" );
}
get_players_into_truck()
{
get_on_trigger = getent( "get_on_truck", "targetname" );
get_on_trigger waittill( "trigger" );
level notify( "all_players_in_position" );
players = get_players();
if( isdefined( players[0] ) )
{
players[0] playerlinktodelta( level.escape_opel, "tag_passenger3", 1.0, 180, 180, 180, 180);
}
if( isdefined( players[1] ) )
{
players[1] playerlinktodelta( level.escape_opel, "tag_passenger4", 1.0, 180, 180, 180, 180);
}
if( isdefined( players[2] ) )
{
players[2] playerlinktodelta( level.escape_opel, "tag_passenger5", 1.0, 180, 180, 180, 180);
}
if( isdefined( players[3] ) )
{
players[3] playerlinktodelta( level.escape_opel, "tag_passenger6", 1.0, 180, 180, 180, 180);
}
level.friend1 linkto( level.escape_opel, "tag_passenger7" );
level.friend2 linkto( level.escape_opel, "tag_passenger8" );
level.goddard linkto( level.escape_opel, "tag_driver" );
germans = getaiarray("axis");
for( i = 0; i < germans.size; i++ )
{
germans[i].accuracy = 0;
}
}
overwrite_detect_ranges_2()
{
//these values represent the BASE huristic for max visible distance base meaning
//when the character is completely still and not turning or moving
//HIDDEN is self explanatory
hidden = [];
hidden[ "prone" ] = 32;
hidden[ "crouch" ] = 64;
hidden[ "stand" ] = 256;
//ALERT levels are when the same AI has sighted the same enemy twice OR found a body
alert = [];
alert[ "prone" ] = 256;
alert[ "crouch" ] = 512;
alert[ "stand" ] = 2000;
//SPOTTED is when they are completely aware and go into NORMAL COD AI mode...however, the
//distance they can see you is still limited by these numbers because of the assumption that
//you're wearing a ghillie suit in woodsy areas
spotted = [];
spotted[ "prone" ] = 512;
spotted[ "crouch" ] = 5000;
spotted[ "stand" ] = 8000;
system_set_detect_ranges( hidden, alert, spotted );
}
prepare_escape_truck()
{
start_node = getvehiclenode( "escape_truck_start", "targetname" );
opel = spawnvehicle( "vehicle_ger_wheeled_opel_blitz_winter",
"truck",
"opel",
start_node.origin,
start_node.angles );
level.escape_opel = opel;
wait( 1 );
playfxontag( level._effect["headlight"], opel, "tag_headlight_left" );
playfxontag( level._effect["headlight"], opel, "tag_headlight_right" );
//playfxontag( level._effect["brakelight"], opel, "tag_brakelight_left" );
opel attachPath( start_node );
level waittill( "all_players_in_position" );
opel startpath();
}
bombs_set()
{
bomb1 = getent( "bomb1", "targetname" );
bomb2 = getent( "bomb2", "targetname" );
bomb3 = getent( "bomb3", "targetname" );
bomb1 hide();
bomb2 hide();
bomb3 hide();
use_trigger1 = getent( "bomb_trigger1", "targetname" );
use_trigger2 = getent( "bomb_trigger2", "targetname" );
use_trigger3 = getent( "bomb_trigger3", "targetname" );
level thread bomb_set_single( bomb1, use_trigger1, 6, "bomb1_set" );
level thread bomb_set_single( bomb2, use_trigger2, 7, "bomb2_set" );
level thread bomb_set_single( bomb3, use_trigger3, 8, "bomb3_set" );
level waittill_multiple( "bomb1_set", "bomb2_set", "bomb3_set" );
level notify( "all_bombs_set" );
}
bomb_set_single( bomb, trigger, obj_num, msg )
{
trigger waittill( "trigger" );
trigger delete();
bomb show();
objective_state( obj_num, "done" );
level notify( msg );
}
snipers_kill()
{
level thread sniper_1_kill();
level thread sniper_2_kill();
level waittill_multiple( "sniper1_killed", "sniper2_killed" );
level notify( "all_snipers_killed" );
}
snipers1_ai()
{
level.sniper1 = self;
level notify( "sniper1_spawned" );
}
snipers2_ai()
{
level.sniper2 = self;
level notify( "sniper2_spawned" );
}
sniper_1_kill()
{
level waittill( "sniper1_spawned" );
level.sniper1 waittill( "death" );
objective_state( 4, "done" );
level notify( "sniper1_killed" );
}
sniper_2_kill()
{
level waittill( "sniper2_spawned" );
level.sniper2 waittill( "death" );
objective_state( 5, "done" );
level notify( "sniper2_killed" );
}
ev4_spawners_custom_1_init()
{
self thread custom_stealth_ai( "ev4_outside" );
}
ev4_spawners_custom_2_init()
{
self thread custom_stealth_ai( "ev4_inside" );
}