mirror of
https://github.com/reaaLx/nx1-gsc-dump.git
synced 2025-04-23 17:45:47 +00:00
929 lines
29 KiB
Plaintext
929 lines
29 KiB
Plaintext
//****************************************************************************
|
||
// **
|
||
// Confidential - (C) Activision Publishing, Inc. 2010 **
|
||
// **
|
||
//****************************************************************************
|
||
// **
|
||
// Module: Lava Outpost **
|
||
// **
|
||
// Created: 07/25/10 - Travis Chen (trchen x 4143) **
|
||
// **
|
||
//****************************************************************************
|
||
|
||
#include maps\_utility;
|
||
#include common_scripts\utility;
|
||
|
||
//*******************************************************************
|
||
// *
|
||
// *
|
||
//*******************************************************************
|
||
|
||
section_main()
|
||
{
|
||
// setup station 1 spawners
|
||
self thread setup_spawners();
|
||
|
||
// reduce ammo
|
||
level._player setWeaponAmmoStock( "lunar_sniper_l3", 8 );
|
||
}
|
||
|
||
//*******************************************************************
|
||
// *
|
||
// *
|
||
//*******************************************************************
|
||
|
||
section_precache()
|
||
{
|
||
PrecacheItem( "lunarrifle_l3" );
|
||
PrecacheItem( "lunar_sniper_l3" );
|
||
}
|
||
|
||
section_flag_inits()
|
||
{
|
||
// Surface Approach
|
||
flag_init( "op_surface_start_walk" );
|
||
flag_init( "op_surface_found_outpost" );
|
||
flag_init( "op_surface_vehicle_start" );
|
||
|
||
// Surface Battle
|
||
flag_init( "op_surface_start_battle" );
|
||
flag_init( "op_surface_secured_outpost" );
|
||
flag_init( "op_surface_get_O2" );
|
||
|
||
// Surface Explore
|
||
flag_init( "op_surface_action_o2" );
|
||
flag_init( "op_surface_found_o2" );
|
||
flag_init( "op_surface_got_weapons" );
|
||
flag_init( "op_surface_used_lift" );
|
||
|
||
flag_init( "op_garage_lift_baker" );
|
||
flag_init( "op_garage_lift_tilman" );
|
||
flag_init( "op_garage_lift_franklin" );
|
||
|
||
// Garage
|
||
flag_init( "op_garage_lift_almost_down" );
|
||
flag_init( "op_garage_lift_down" );
|
||
|
||
// Garage Battle
|
||
flag_init( "op_garage_secured" );
|
||
|
||
// Vehicle Sneak Around
|
||
flag_init( "op_sub_vehicle_sneak" );
|
||
flag_init( "op_sub_move_vehicle" );
|
||
flag_init( "op_sub_vehicle_passed" );
|
||
|
||
flag_init( "op_s1_lift_baker" );
|
||
flag_init( "op_s1_lift_tilman" );
|
||
flag_init( "op_s1_lift_franklin" );
|
||
|
||
// Pre-Platform
|
||
flag_init( "s1p_lift_used" );
|
||
}
|
||
|
||
//*******************************************************************
|
||
// *
|
||
// *
|
||
//*******************************************************************
|
||
|
||
outpost_objectives( objective_num )
|
||
{
|
||
flag_wait( "op_surface_start_walk" );
|
||
|
||
// Find enemy outpost
|
||
objective_add( objective_num, "current", &"NX_LAVA_OBJECTIVE_OP_FIND_OUTPOST" );
|
||
objective_onEntity( objective_num, level.baker, (0, 0, 74) );
|
||
objective_current( objective_num );
|
||
|
||
flag_wait( "op_surface_found_outpost" );
|
||
objective_complete( objective_num );
|
||
objective_num++;
|
||
|
||
// Secure outpost
|
||
objective_add( objective_num, "current", &"NX_LAVA_OBJECTIVE_OP_FIND_O2" );
|
||
objective_onEntity( objective_num, level.baker, (0, 0, 74) );
|
||
objective_current( objective_num );
|
||
|
||
// find o2
|
||
flag_wait( "op_surface_get_O2" );
|
||
objective_clearAdditionalPositions( objective_num );
|
||
waypoint = getStruct( "op_surface_o2_org", "targetname" );
|
||
objective_position( objective_num, waypoint.origin );
|
||
|
||
flag_wait( "op_surface_found_o2" );
|
||
objective_complete( objective_num );
|
||
objective_num++;
|
||
|
||
// get weapons
|
||
objective_add( objective_num, "current", &"NX_LAVA_OBJECTIVE_OP_GET_WEAPONS" );
|
||
waypoint = getStruct( "op_surface_weapons_org", "targetname" );
|
||
objective_position( objective_num, waypoint.origin );
|
||
objective_current( objective_num );
|
||
|
||
flag_wait( "op_surface_got_weapons" );
|
||
objective_complete( objective_num );
|
||
objective_num++;
|
||
|
||
return objective_num;
|
||
}
|
||
|
||
garage_objectives( objective_num )
|
||
{
|
||
// explore outpost
|
||
waypoint = getStruct( "op_surface_elevator_org", "targetname" );
|
||
objective_add( objective_num, "current", &"NX_LAVA_OBJECTIVE_OP_EXPLORE_OUTPOST", waypoint.origin );
|
||
objective_current( objective_num );
|
||
|
||
// in garage
|
||
flag_wait( "op_surface_used_lift" );
|
||
objective_clearAdditionalPositions( objective_num );
|
||
objective_onEntity( objective_num, level.baker, (0, 0, 74) );
|
||
|
||
// go to lift
|
||
flag_wait( "op_sub_vehicle_passed" );
|
||
waypoint = getStruct( "op_sub_to_s1_lift_org", "targetname" );
|
||
objective_clearAdditionalPositions( objective_num );
|
||
objective_position( objective_num, waypoint.origin );
|
||
|
||
// taking lift to s1
|
||
flag_wait( "s1p_lift_used" );
|
||
objective_clearAdditionalPositions( objective_num );
|
||
objective_onEntity( objective_num, level.baker, (0, 0, 74) );
|
||
|
||
return objective_num;
|
||
}
|
||
|
||
//*******************************************************************
|
||
// *
|
||
// *
|
||
//*******************************************************************
|
||
|
||
outpost_start()
|
||
{
|
||
// spawn and teleport allies
|
||
maps\nx_lava_util::lava_ally_spawn( "outpost_start" );
|
||
|
||
// setup and teleport player
|
||
maps\nx_lava_util::player_start( "outpost_player_start" );
|
||
thread maps\nx_lava_fx::set_vision_and_fog("outpost", 0); // set initial vision and fog for this checkpoint.
|
||
}
|
||
|
||
outpost()
|
||
{
|
||
//**********************************************
|
||
// Surface Approach
|
||
flag_set( "op_surface_start_walk" );
|
||
|
||
// get vehicle ready
|
||
thread op_surface_vehicle();
|
||
|
||
// look for outpost
|
||
thread op_surface_approach();
|
||
|
||
// outpost found
|
||
flag_wait( "op_surface_found_outpost" );
|
||
thread op_surface_outpost_found();
|
||
|
||
//**********************************************
|
||
// Surface Battle
|
||
flag_wait( "op_surface_start_battle" );
|
||
autosave_by_name( "outpost_battle" );
|
||
|
||
// start the battle
|
||
thread op_surface_battle();
|
||
|
||
//**********************************************
|
||
// Surface Explore Base
|
||
|
||
// look for o2
|
||
flag_wait( "op_surface_secured_outpost" );
|
||
thread op_surface_find_o2();
|
||
|
||
// find lift
|
||
flag_wait( "op_surface_found_o2" );
|
||
thread op_surface_find_lift();
|
||
|
||
// use lift
|
||
flag_wait( "op_surface_used_lift" );
|
||
}
|
||
|
||
garage_start()
|
||
{
|
||
// spawn and teleport allies
|
||
maps\nx_lava_util::lava_ally_spawn( "outpost_subsection_start" );
|
||
|
||
// put allies in CQB
|
||
level.baker enable_cqbwalk();
|
||
level.tilman enable_cqbwalk();
|
||
level.franklin enable_cqbwalk();
|
||
|
||
// setup and teleport player
|
||
maps\nx_lava_util::player_start( "outpost_subsection_player_start" );
|
||
|
||
// step objective forward
|
||
flag_set( "op_surface_used_lift" );
|
||
}
|
||
|
||
garage()
|
||
{
|
||
autosave_by_name( "garage" );
|
||
|
||
//**********************************************
|
||
// Going down to garage
|
||
thread op_move_surface_lift();
|
||
|
||
//**********************************************
|
||
// Garage Setup
|
||
flag_wait( "op_garage_lift_almost_down" );
|
||
thread op_garage_setup();
|
||
|
||
|
||
//**********************************************
|
||
// Garage Battle
|
||
flag_wait( "op_garage_lift_down" );
|
||
op_garage_cleanup();
|
||
thread op_garage_battle();
|
||
|
||
//**********************************************
|
||
// Vehicle Sneak Around
|
||
flag_wait( "op_sub_vehicle_sneak" );
|
||
thread op_sub_vehicle_sneak();
|
||
|
||
//**********************************************
|
||
// Vehicle Sneak Around
|
||
flag_wait( "op_sub_vehicle_passed" );
|
||
thread op_sub_goto_s1();
|
||
//apm: fire off the dusty tunnel fx
|
||
exploder ( "lgv_tunnel_dustfx01" );
|
||
|
||
//**********************************************
|
||
// Pre-Platform
|
||
thread s1_plat_lift_use();
|
||
|
||
flag_wait( "s1p_lift_used" );
|
||
}
|
||
|
||
//*******************************************************************
|
||
// Outpost Approach Surface Base *
|
||
// *
|
||
//*******************************************************************
|
||
|
||
op_surface_approach()
|
||
{
|
||
// set up allies & player
|
||
level.baker set_ignoreall( true );
|
||
level.tilman set_ignoreall( true );
|
||
level.franklin set_ignoreall( true );
|
||
|
||
// play opening walk vignette
|
||
// maps\nx_lava_anim::opening_walk(); // TEMP TEMP - Remove vignette
|
||
|
||
// starting dialog
|
||
// wait( 1 );
|
||
// level.franklin radio_dialogue( "lava_fra_surface_headtobase" ); // dialog: "(breathing in short breaths) Sir<69> shouldn<64>t we<77> head to base?... I<>m almost bingo O2<4F>."
|
||
// level.baker thread radio_dialogue( "lava_kee_surface_keepmoving" ); // dialog: "Keep moving, Franklin."
|
||
|
||
// move to ledge
|
||
node = getNode( "outpost_ledge_tilman", "targetname" ); // TEMP TEMP - Remove vignette - REMOVE
|
||
level.tilman thread follow_path( node ); // TEMP TEMP - Remove vignette - REMOVE
|
||
wait( 0.5 );
|
||
node = getNode( "outpost_ledge_baker", "targetname" ); // TEMP TEMP - Remove vignette - REMOVE
|
||
level.baker thread follow_path( node ); // TEMP TEMP - Remove vignette - REMOVE
|
||
node = getNode( "outpost_ledge_franklin", "targetname" ); // TEMP TEMP - Remove vignette - REMOVE
|
||
level.franklin thread follow_path( node ); // TEMP TEMP - Remove vignette - REMOVE
|
||
// level.baker radio_dialogue( "lava_kee_surface_wontmatter" ); // dialog: "We don<6F>t find out what<61>s going on, not havin<69> air won<6F>t matter anymore."
|
||
|
||
// dialog: see anything?
|
||
wait( 3 ); // ( 1 )
|
||
level.baker radio_dialogue( "lava_kee_surface_seeanything" ); // dialog: "Carson <20> you see anything up there?"
|
||
|
||
flag_set( "op_surface_found_outpost" );
|
||
}
|
||
|
||
op_surface_outpost_found()
|
||
{
|
||
// dialog: found a base
|
||
level.tilman radio_dialogue( "lava_car_surface_nosirohshit" ); // dialog: "No sir, not a fucking<6E> oh shit!"
|
||
level.tilman radio_dialogue( "lava_car_surface_upheresomething" ); // dialog: "Sir <20> up here <20> we definitely have something?!"
|
||
level.baker thread radio_dialogue( "lava_kee_surface_doubletime" ); // dialog: "Everyone <20> double-time it up there, but keep it low when you get to the top!"
|
||
|
||
// allies slide down hill to sniper spot
|
||
wait( 0.25 );
|
||
thread maps\nx_lava_anim::hillslide_tilman();
|
||
thread maps\nx_lava_anim::hillslide_franklin();
|
||
maps\nx_lava_anim::hillslide_baker();
|
||
|
||
if( !flag( "op_surface_start_battle" ) )
|
||
{
|
||
// baker hold position
|
||
thread maps\nx_lava_anim::hold_motion();
|
||
wait( 1 );
|
||
level.baker radio_dialogue( "lava_kee_surface_threetangos" ); // dialog: "Ready your rifles<65> we've got three Tangos on that rover."
|
||
level.baker thread radio_dialogue( "lava_kee_surface_assigntargets" ); // dialog: "Walker, you take the gunner, Carson, the one on the left. I have the one on the right. Franklin, you cover our slop."
|
||
|
||
// wait for player to initiate surface battle
|
||
level._player waittill( "weapon_fired" );
|
||
flag_set( "op_surface_start_battle" );
|
||
}
|
||
}
|
||
|
||
op_surface_vehicle()
|
||
{
|
||
// spawn surface vehicle
|
||
level.op_sur_vehicle = maps\_vehicle::spawn_vehicle_from_targetname( "op_surface_vehicle" );
|
||
level.op_sur_vehicle.dontunloadonend = true;
|
||
level.op_sur_vehicle maps\_vehicle::vehicle_lights_on( "running" );
|
||
|
||
flag_wait( "op_surface_vehicle_start" );
|
||
|
||
// move vehicle
|
||
// level.op_sur_vehicle Vehicle_SetSpeed( 27.0, 100.0 );
|
||
level.op_sur_vehicle thread maps\_vehicle::goPath();
|
||
|
||
level.op_sur_vehicle playsound("scn_lava_rover_entrance");
|
||
|
||
// vehicle reaches surface garage
|
||
level.op_sur_vehicle waittill( "reached_end_node" );
|
||
|
||
if( !flag( "op_surface_start_battle" ) )
|
||
{
|
||
// baker talks
|
||
level.baker radio_dialogue( "lava_kee_surface_holdon321" ); // dialog: "Hold on 3<> 2<> 1<>"
|
||
}
|
||
|
||
// unload vehicle and start battle
|
||
wait( 1 );
|
||
unloaded_guys = level.op_sur_vehicle maps\_vehicle::vehicle_unload( "all" );
|
||
flag_set( "op_surface_start_battle" );
|
||
}
|
||
|
||
|
||
//*******************************************************************
|
||
// Outpost Surface Battle *
|
||
// *
|
||
//*******************************************************************
|
||
|
||
op_surface_battle()
|
||
{
|
||
wait( 0.2 );
|
||
|
||
// shoot two of the vehicle riders
|
||
thread kill_deathflag( "op_surface_vehicle_enemies", 2 );
|
||
|
||
// set allies and enemies to no ignore
|
||
level.baker set_ignoreall( false );
|
||
level.tilman set_ignoreall( false );
|
||
level.franklin set_ignoreall( false );
|
||
|
||
wait( 1 );
|
||
// spawn & ready enemies
|
||
thread maps\nx_lava_util::spawn_group_by_name( "op_surface_bad_spawn" );
|
||
|
||
vehicle_enemies = get_ai_group_ai( "op_surface_vehicle_bad" );
|
||
foreach( enemy in vehicle_enemies )
|
||
{
|
||
enemy set_ignoreall( false );
|
||
}
|
||
|
||
// setup a hassle-free auto-end
|
||
thread hassle_free_battle_end( "op_surface_secured_outpost", [ "op_surface_bad", "op_surface_vehicle_bad" ] );
|
||
|
||
// jump down crater
|
||
level.baker radio_dialogue_stop();
|
||
level.baker thread radio_dialogue_interupt( "lava_kee_station1_letsmove" ); // dialog: "Let's move"
|
||
maps\nx_lava_anim::ledgejump();
|
||
|
||
// wait to reach the bottom and go to cover
|
||
level.baker set_force_color( "c" );
|
||
level.tilman set_force_color( "b" );
|
||
level.franklin set_force_color( "o" );
|
||
}
|
||
|
||
|
||
//*******************************************************************
|
||
// Outpost Explore Base *
|
||
// *
|
||
//*******************************************************************
|
||
|
||
op_surface_find_o2()
|
||
{
|
||
level.baker thread radio_dialogue( "lava_kee_surface_stackup" ); // dialog: "Stack up at the entrance! <20> let<65>s find out what this place is."
|
||
|
||
// prep allies
|
||
level.baker disable_ai_color();
|
||
level.tilman disable_ai_color();
|
||
level.franklin disable_ai_color();
|
||
|
||
// go to O2 vignette
|
||
maps\nx_lava_anim::air_resupply_reach();
|
||
flag_set( "op_surface_get_O2" );
|
||
|
||
// activate useable o2 tank
|
||
thread o2_tank_use();
|
||
|
||
// play Tilman & Franklin O2 vignette
|
||
thread maps\nx_lava_anim::air_resupply_play();
|
||
|
||
// play O2 vignette
|
||
flag_wait( "op_surface_action_o2" );
|
||
maps\nx_lava_anim::air_resupply_baker_faint();
|
||
|
||
// go to garage lift
|
||
flag_set( "op_surface_found_o2" );
|
||
}
|
||
|
||
o2_tank_use()
|
||
{
|
||
// Wait for player to use o2 tank
|
||
use = GetEnt( "op_use_o2_tank", "targetname" );
|
||
use sethintstring( &"NX_LAVA_OP_USE_O2_TANK" );
|
||
|
||
use waittill( "trigger" );
|
||
use trigger_off();
|
||
|
||
// put allies in CQB
|
||
level.baker enable_cqbwalk();
|
||
level.tilman enable_cqbwalk();
|
||
level.franklin enable_cqbwalk();
|
||
|
||
flag_set( "op_surface_action_o2" );
|
||
}
|
||
|
||
op_surface_find_lift()
|
||
{
|
||
// activate lift
|
||
thread op_garage_lift_use();
|
||
|
||
// dialog: look for weapons
|
||
level.baker thread radio_dialogue( "lava_kee_outpost_goodforo2" ); // dialog: "OK <20> we are good for O2 now, let<65>s find out what this place is<69>"
|
||
|
||
|
||
// move allies to elevator
|
||
level.tilman disable_ai_color();
|
||
t_path = getNode( "op_tilman_explore_lift", "targetname" );
|
||
level.tilman thread follow_path( t_path );
|
||
level.tilman thread op_garage_lift_ready_check( "tilman" );
|
||
|
||
level.franklin disable_ai_color();
|
||
f_path = getNode( "op_franklin_explore_lift", "targetname" );
|
||
level.franklin thread follow_path( f_path );
|
||
level.franklin thread op_garage_lift_ready_check( "franklin" );
|
||
|
||
// move baker to shotguns
|
||
level.baker disable_ai_color();
|
||
b_path = getNode( "op_baker_get_weapons", "targetname" );
|
||
level.baker thread follow_path( b_path );
|
||
|
||
// dialog: get guns
|
||
trig = getEnt( "outpost_trig_get_weapons", "targetname" );
|
||
trig waittill( "trigger" );
|
||
level.baker radio_dialogue( "lava_kee_outpost_pickupshotgun" ); // dialog: "Walker, pick up that shotgun <20> we may need it."
|
||
wait( 1.5 );
|
||
level.baker radio_dialogue( "lava_kee_outpost_wtfbasehere" ); // dialog: "We<57>re Charlie Mike <20> find out what the fuck this is base doing here<72>"
|
||
|
||
// baker: go to elevator
|
||
wait( 1 );
|
||
level.baker thread radio_dialogue( "lava_kee_outpost_figureoutcontrols" ); // dialog: "Walker, can you figure out the controls over there?"
|
||
wait( 1 );
|
||
|
||
flag_set( "op_surface_got_weapons" );
|
||
b_path = getNode( "op_baker_explore_lift", "targetname" );
|
||
level.baker thread follow_path( b_path );
|
||
level.baker thread op_garage_lift_ready_check( "baker" );
|
||
}
|
||
|
||
op_garage_lift_ready_check( name )
|
||
{
|
||
self waittill( "reached_path_end" );
|
||
flag_set( "op_garage_lift_" + name );
|
||
}
|
||
|
||
op_garage_lift_use()
|
||
{
|
||
// Wait for player to use garage lift
|
||
use = GetEnt( "op_use_surface_lift", "targetname" );
|
||
use sethintstring( &"NX_LAVA_OP_USE_SURFACE_LIFT" );
|
||
|
||
use waittill( "trigger" );
|
||
use trigger_off();
|
||
|
||
flag_wait( "op_garage_lift_baker" );
|
||
flag_wait( "op_garage_lift_tilman" );
|
||
flag_wait( "op_garage_lift_franklin" );
|
||
|
||
flag_set( "op_surface_used_lift" );
|
||
}
|
||
|
||
op_move_surface_lift()
|
||
{
|
||
// spawn garage mechanics
|
||
thread maps\nx_lava_anim::rover_maintance_spawn();
|
||
|
||
// set allies to stun
|
||
level.baker set_ignoreall( true );
|
||
level.tilman set_ignoreall( true );
|
||
level.franklin set_ignoreall( true );
|
||
battlechatter_off();
|
||
|
||
// move elevator
|
||
storage_elevator_trigger = GetEnt( "storage_elevator_trigger", "targetname" );
|
||
storage_elevator_target_01 = GetEnt( "storage_elevator_target_01", "targetname" );
|
||
storage_elevator_target_02 = GetEnt( "storage_elevator_target_02", "targetname" );
|
||
storage_elevator = GetEnt( "storage_elevator", "targetname" );
|
||
storage_elevator_linkers = GetEntArray( "storage_elevator_link", "targetname" );
|
||
|
||
foreach( linker in storage_elevator_linkers )
|
||
{
|
||
linker LinkTo( storage_elevator );
|
||
}
|
||
|
||
level.baker linkTo( storage_elevator );
|
||
level.tilman linkTo( storage_elevator );
|
||
level.franklin linkTo( storage_elevator );
|
||
|
||
wait( 1.0 );
|
||
|
||
// Initial elevator drop
|
||
storage_elevator MoveTo( storage_elevator_target_01.origin, 3.0, 0.5, 0.2 );
|
||
thread maps\nx_lava_fx::set_vision_and_fog("garage", 3.0); // transition to new vision
|
||
wait( 4 );
|
||
|
||
// dialog: Christ?!
|
||
level.franklin thread radio_dialogue( "lava_fra_outpost_christ" ); // dialog: "Christ?!"
|
||
|
||
// Main elevator movement
|
||
storage_elevator MoveTo( storage_elevator_target_02.origin, 21.0, 2.0, 1.0 );
|
||
storage_elevator PlaySound( "scn_lava_lift01" );
|
||
|
||
// dialog for 10 seconds
|
||
wait( 1 );
|
||
level.baker thread radio_dialogue( "lava_kee_outpost_elevatorsystem" ); // dialog: "Keene to Base <20> the remote EC base is an elevator system to something below <20>continuing to investigate."
|
||
|
||
// allies notice enemies!
|
||
wait( 8 );
|
||
level.baker set_ignoreall( false );
|
||
level.tilman set_ignoreall( false );
|
||
level.franklin set_ignoreall( false );
|
||
level.tilman thread radio_dialogue( "lava_car_garage_tangosahead" ); // dialog: "Tangos ahead!"
|
||
battlechatter_on( "allies" );
|
||
|
||
wait( 12 );
|
||
level.baker unlink();
|
||
level.tilman unlink();
|
||
level.franklin unlink();
|
||
flag_set( "op_garage_lift_down" );
|
||
}
|
||
|
||
|
||
//*******************************************************************
|
||
// Subsection Garage Setup *
|
||
// *
|
||
//*******************************************************************
|
||
|
||
op_garage_setup()
|
||
{
|
||
// spawn enemies
|
||
thread maps\nx_lava_util::spawn_group_by_name( "op_garage_bad_spawner" );
|
||
|
||
wait( 0.5 );
|
||
level.baker radio_dialogue( "lava_kee_garage_takethemdown" ); // dialog: "Take 'em down"
|
||
}
|
||
|
||
op_garage_cleanup()
|
||
{
|
||
// clean up surface vehicle
|
||
if( IsDefined( level.op_sur_vehicle ) )
|
||
level.op_sur_vehicle delete();
|
||
}
|
||
|
||
|
||
//*******************************************************************
|
||
// Subsection Garage Battle *
|
||
// *
|
||
//*******************************************************************
|
||
|
||
op_garage_battle()
|
||
{
|
||
// color allies
|
||
level.baker set_force_color( "c" );
|
||
level.tilman set_force_color( "b" );
|
||
level.franklin set_force_color( "o" );
|
||
|
||
// double check enemy spawn
|
||
if( !flag( "op_garage_lift_almost_down" ) )
|
||
thread maps\nx_lava_util::spawn_group_by_name( "op_garage_bad_spawner" );
|
||
|
||
flag_wait( "op_garage_secured" );
|
||
if( !flag( "op_sub_vehicle_sneak" ) )
|
||
{
|
||
// move allies
|
||
level.baker disable_ai_color();
|
||
b_path = getNode( "op_vehicle_start_baker", "targetname" );
|
||
level.baker thread follow_path( b_path );
|
||
|
||
level.tilman disable_ai_color();
|
||
t_path = getNode( "op_vehicle_start_tilman", "targetname" );
|
||
level.tilman thread follow_path( t_path );
|
||
|
||
level.franklin disable_ai_color();
|
||
f_path = getNode( "op_vehicle_start_franklin", "targetname" );
|
||
level.franklin thread follow_path( f_path );
|
||
|
||
wait( 3 );
|
||
level.tilman radio_dialogue( "lava_car_garage_technicalsandtroops" ); // dialog: "So, this is how they are getting technical and troops moved around?!"
|
||
wait( 0.5 );
|
||
level.baker radio_dialogue( "lava_kee_garage_notlookinggood" ); //dialog: "If it is <20> they would need hundreds of these<73> either way this is not looking good<6F>"
|
||
}
|
||
}
|
||
|
||
op_sub_vehicle_sneak()
|
||
{
|
||
// spawn vehicle
|
||
level.op_sub_vehicle = maps\_vehicle::spawn_vehicle_from_targetname( "op_sub_vehicle" );
|
||
level.op_sub_vehicle maps\_vehicle::vehicle_lights_on( "running" );
|
||
|
||
// turn off battlechatter
|
||
battlechatter_off();
|
||
|
||
|
||
// move allies
|
||
level.baker disable_ai_color();
|
||
b_path = getNode( "op_vehicle_hide_baker", "targetname" );
|
||
level.baker thread follow_path( b_path );
|
||
|
||
level.tilman disable_ai_color();
|
||
t_path = getNode( "op_vehicle_hide_tilman", "targetname" );
|
||
level.tilman thread follow_path( t_path );
|
||
|
||
level.franklin disable_ai_color();
|
||
f_path = getNode( "op_vehicle_hide_franklin", "targetname" );
|
||
level.franklin thread follow_path( f_path );
|
||
|
||
// dialog: vehicle.. get to cover
|
||
wait( 4 );
|
||
level.baker thread radio_dialogue( "lava_kee_garage_technicalincoming" ); // dialog: "Technical incoming! Get to cover!"
|
||
|
||
// move vehicle
|
||
thread op_vehicle_ready_check();
|
||
|
||
flag_wait( "op_sub_move_vehicle" );
|
||
level.op_sub_vehicle.mgturret[0] SetRightArc( 10 );
|
||
level.op_sub_vehicle.mgturret[0] SetLeftArc( 10 );
|
||
level.op_sub_vehicle Vehicle_SetSpeed( 7.5, 100.0 );
|
||
level.op_sub_vehicle thread maps\_vehicle::goPath();
|
||
|
||
// dialog: stay down!
|
||
level.baker thread radio_dialogue( "lava_kee_garage_staydown" ); // dialog: "Stay down and don<6F>t move."
|
||
|
||
//wait till vehicle is passed
|
||
wait( 15 );
|
||
flag_set( "op_sub_vehicle_passed" );
|
||
}
|
||
|
||
op_vehicle_ready_check()
|
||
{
|
||
level.franklin waittill( "reached_path_end" );
|
||
|
||
flag_set( "op_sub_move_vehicle" );
|
||
}
|
||
|
||
op_sub_goto_s1()
|
||
{
|
||
b_path = getNode( "op_to_s1_baker", "targetname" );
|
||
level.baker thread follow_path( b_path );
|
||
level.baker thread op_s1_lift_ready_check( "baker" );
|
||
|
||
wait( randomFloat( .5 ) );
|
||
level.baker thread radio_dialogue( "lava_kee_garage_deadfriends" ); // dialog: "Let<65>s keep it moving <20>they<65>re about to have some dead friends to find back there."
|
||
|
||
// move tilman and franklin
|
||
wait( randomFloatRange( .5, 1.5 ) );
|
||
t_path = getNode( "op_to_s1_tilman", "targetname" );
|
||
level.tilman thread follow_path( t_path );
|
||
level.tilman thread op_s1_lift_ready_check( "tilman" );
|
||
|
||
wait( randomFloatRange( 1.0, 1.75 ) );
|
||
f_path = getNode( "op_to_s1_franklin", "targetname" );
|
||
level.franklin thread follow_path( f_path );
|
||
level.franklin thread op_s1_lift_ready_check( "franklin" );
|
||
|
||
// dialog: another lift
|
||
trig = getEnt( "op_to_s1_nearby", "targetname" );
|
||
trig waittill( "trigger" );
|
||
|
||
level.tilman radio_dialogue( "lava_car_garage_anotherlift" ); // dialog: "Another lift."
|
||
wait( 0.5 );
|
||
level.baker radio_dialogue( "lava_kee_garage_theconsole" ); // dialog: "Walker <20> the console<6C>"
|
||
}
|
||
|
||
op_s1_lift_ready_check( name )
|
||
{
|
||
self waittill( "reached_path_end" );
|
||
flag_set( "op_s1_lift_" + name );
|
||
}
|
||
|
||
//*******************************************************************
|
||
// Lava Tube Elevator *
|
||
// *
|
||
//*******************************************************************
|
||
|
||
s1_plat_lift_use()
|
||
{
|
||
// Wait for player to use o2 tank
|
||
use = GetEnt( "s1_use_plat_lift", "targetname" );
|
||
use sethintstring( &"NX_LAVA_S1_USE_PLAT_LIFT" );
|
||
|
||
use waittill( "trigger" );
|
||
use trigger_off();
|
||
|
||
flag_wait( "op_s1_lift_baker" );
|
||
flag_wait( "op_s1_lift_tilman" );
|
||
flag_wait( "op_s1_lift_franklin" );
|
||
|
||
flag_set( "s1p_lift_used" );
|
||
}
|
||
|
||
//*******************************************************************
|
||
// ALLIES & ENEMIES *
|
||
// *
|
||
//*******************************************************************
|
||
|
||
setup_spawners()
|
||
{
|
||
spawners = GetEntArray( "outpost_enemy_spawner", "script_noteworthy" );
|
||
array_thread( spawners, ::add_spawn_function, maps\nx_lava_util::l3_enemy_common );
|
||
|
||
spawners = GetEntArray( "outpost_surface_enemy_spawner", "script_noteworthy" );
|
||
array_thread( spawners, ::add_spawn_function, ::outpost_surface_bad_logic );
|
||
|
||
spawners = GetEntArray( "outpost_garage_enemy_spawner", "script_noteworthy" );
|
||
array_thread( spawners, ::add_spawn_function, maps\nx_lava_util::l3_enemy_common, true );
|
||
|
||
spawners = GetEntArray( "outpost_garage_mech_spawner", "script_noteworthy" );
|
||
array_thread( spawners, ::add_spawn_function, ::outpost_garage_mech_bad_logic );
|
||
|
||
spawners = GetEntArray( "outpost_vehicle_enemy", "script_noteworthy" );
|
||
array_thread( spawners, ::add_spawn_function, ::outpost_vehicle_bad_logic );
|
||
}
|
||
|
||
outpost_surface_bad_logic()
|
||
{
|
||
self endon( "death" );
|
||
|
||
self.a.nodeath = false;
|
||
self.allowdeath = true;
|
||
self set_ignoreall( true );
|
||
self disable_ai_color();
|
||
self enable_cqbwalk();
|
||
}
|
||
|
||
outpost_garage_mech_bad_logic()
|
||
{
|
||
self endon( "death" );
|
||
|
||
self set_ignoreall( true );
|
||
self enable_cqbwalk();
|
||
|
||
self waittill( "fleeing" );
|
||
|
||
self waittill( "goal" );
|
||
self kill();
|
||
}
|
||
|
||
outpost_vehicle_bad_logic()
|
||
{
|
||
self endon( "death" );
|
||
self set_ignoreall( true );
|
||
|
||
sightCheck = false;
|
||
|
||
while( self.ignoreall )
|
||
{
|
||
can_see = self can_see_char( level._player );
|
||
if( can_see )
|
||
{
|
||
if( sightCheck )
|
||
{
|
||
// make enemies attack
|
||
baddies = get_ai_group_ai( "op_sub_vehicle_bad" );
|
||
foreach( baddie in baddies )
|
||
baddie set_ignoreall( false );
|
||
|
||
// unlock turret
|
||
level.op_sub_vehicle.mgturret[0] SetRightArc( 180 );
|
||
level.op_sub_vehicle.mgturret[0] SetLeftArc( 180 );
|
||
level.op_sub_vehicle.mgturret[0].wait_duration_after_aiming_before_firing = 0.5;
|
||
|
||
// setup battlechatter
|
||
battlechatter_on( "allies" );
|
||
}
|
||
else
|
||
{
|
||
sightCheck = true;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
sightCheck = false;
|
||
}
|
||
wait( 1.0 );
|
||
}
|
||
}
|
||
|
||
can_see_char( target )
|
||
{
|
||
AssertEx( IsPlayer( self ) || IsAI( self ), "can_see_char() can only be called on a player or AI." );
|
||
|
||
// check to see if I can see head or feet of my target
|
||
myEyes = self getEye() + ( cos(self.angles[1])*72, sin(self.angles[1])*72, 0);
|
||
targetEyes = target getEye();
|
||
|
||
// check minimum neccesities (all needed )
|
||
// within 1536 units
|
||
// within 180 degrees FoV
|
||
// has LoS
|
||
if( !(distance(myEyes, targetEyes) < 1536 && within_fov( self.origin, self.angles, targetEyes, Cos( 180 ) ) && SightTracePassed( myEyes, targetEyes, false, self ) ) )
|
||
{
|
||
return false;
|
||
}
|
||
|
||
// check details (any one needed)
|
||
// within 100 FoV
|
||
// within 540 units && player is standing
|
||
if( within_fov( self.origin, self.angles, targetEyes, Cos( 100 ) ) )
|
||
{
|
||
return true;
|
||
}
|
||
else if( distance(myEyes, targetEyes) < 540 && level._player GetStance() == "stand" )
|
||
{
|
||
return true;
|
||
}
|
||
|
||
// cannot see
|
||
return false;
|
||
}
|
||
|
||
|
||
//*******************************************************************
|
||
// LOCAL UTILITIES *
|
||
// *
|
||
//*******************************************************************
|
||
|
||
/*
|
||
=============
|
||
///ScriptDocBegin
|
||
"Name: hassle_free_battle_end( <death_flag>, <groups_array>, <kill_time>, <num_left_target>, <loop_time> )"
|
||
"Summary: Kill everything associated with a deathflag after only a certain number of enemies are left"
|
||
"Module: Utility"
|
||
"MandatoryArg: <death_flag>: The flag to kill on "
|
||
"MandatoryArg: <groups_array>: An array of AIgroup names to track numbers "
|
||
"OptionalArg: <kill_time>: random amount of time to wait before death (default - 2 seconds) "
|
||
"OptionalArg: <num_left_target>: nubmer of targets left before you auto-kill (default - 1) "
|
||
"OptionalArg: <loop_time>: amount of time to wait between checks (default - 1 second) "
|
||
"Example: kill_deathflag( "tower_cleared" );"
|
||
"SPMP: singleplayer"
|
||
///ScriptDocEnd
|
||
=============
|
||
*/
|
||
hassle_free_battle_end( death_flag, groups_array, kill_time, num_left_target, loop_time )
|
||
{
|
||
// init vars
|
||
if( !IsDefined( num_left_target ) )
|
||
num_left_target = 1;
|
||
if( !IsDefined( kill_time ) )
|
||
kill_time = 2;
|
||
if( !IsDefined( loop_time ) )
|
||
loop_time = 1;
|
||
|
||
num_left = num_left_target + 1;
|
||
|
||
|
||
if( IsArray( groups_array ) )
|
||
{
|
||
while( num_left > num_left_target )
|
||
{
|
||
wait( loop_time );
|
||
|
||
// init count
|
||
num_left = 0;
|
||
|
||
// count enemies
|
||
for( i=0; i < groups_array.size; i++ )
|
||
{
|
||
num_left += get_ai_group_count( groups_array[i] );
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
while( num_left > num_left_target )
|
||
{
|
||
wait( loop_time );
|
||
|
||
// count enemies
|
||
num_left = get_ai_group_count( groups_array );
|
||
}
|
||
}
|
||
|
||
// once there are only num_left_target left
|
||
kill_deathflag( death_flag, kill_time );
|
||
} |