mirror of
https://github.com/jmarshall23/Quake_4_Alpha.git
synced 2026-08-14 05:01:17 +02:00
1723 lines
50 KiB
Plaintext
1723 lines
50 KiB
Plaintext
//---------------------------------------------------------------------------------------
|
|
// m06_mcc_invasion.script for use with m06_mcc_invasion.map
|
|
//
|
|
// (C) Ritual Entertainment 2005
|
|
//---------------------------------------------------------------------------------------
|
|
|
|
#include "scripts/doom_defs.script"
|
|
|
|
namespace m06b
|
|
{
|
|
// FOR THE LOVE OF GOD AND ALL THAT IS HOLY SET TO 0 FOR SHIP (or just cut entirely)
|
|
float CUT_THE_CRAP = 0;
|
|
float SKIP_TURRET_SEQUENCE = 0;
|
|
float SKIP_SAVEGAMES = 0;
|
|
// NOW BACK TO YOUR REGULARLY SCHEDULED PROGRAMMING
|
|
|
|
// VARIABLES
|
|
float DONE = 0;
|
|
float TURRET_DEAD = 0;
|
|
entity entFlyingTurretEnemy;
|
|
string strFlyingTurretEnemyName = "";
|
|
|
|
entity spawnedFighter;
|
|
entity spawnedFighterDriver;
|
|
|
|
float spawnTurret1Fighters = 1;
|
|
boolean teleporterDestroyed;
|
|
boolean commTeleporterDestroyed;
|
|
boolean hallTeleporterDestroyed;
|
|
|
|
// invasion threads
|
|
void setupEmergencyLights();
|
|
void speederHangarLiftUp();
|
|
void speederHangarLiftDown();
|
|
void turret_obj01();
|
|
|
|
void setupLockedDoors();
|
|
void setupRouteToTurret();
|
|
void setupRouteToHangar();
|
|
|
|
// turret sequence added functions
|
|
void turretSequence();
|
|
void skyboxFighters();
|
|
void manageFighter(string spline);
|
|
void fighterGroup1();
|
|
void lastSpawnedFighter(entity f);
|
|
void lastSpawnedFighterDriver(entity d);
|
|
|
|
void backgroundSounds();
|
|
void radioBattle();
|
|
void turretBattleRadioChatter();
|
|
void attackInfluence(entity inf, entity snd, entity snd_1);
|
|
|
|
|
|
//--------------------------------------------------------------------------
|
|
// FUNCTION DEFINITONS
|
|
// (here there be code)
|
|
//--------------------------------------------------------------------------
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Locks all doors that get unlocked at a later time
|
|
//--------------------------------------------------------------------------
|
|
void setupLockedDoors()
|
|
{
|
|
// speeder hangar
|
|
$door_speeder.lock( 1 );
|
|
|
|
// mess hall
|
|
$func_door_166.lock( 1 );
|
|
$func_door_167.lock( 1 );
|
|
|
|
// control room
|
|
$func_door_130.lock( 1 );
|
|
$func_door_131.lock( 1 );
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------------
|
|
// The guys that are sitting react to the explosion
|
|
//--------------------------------------------------------------------------
|
|
void sittingReaction( entity ent, float variant )
|
|
{
|
|
string temp;
|
|
string anim;
|
|
temp = ent.getKey( "anim" );
|
|
|
|
if ( variant == 1 )
|
|
{
|
|
anim = "mcc_console_reaction1";
|
|
}
|
|
else
|
|
{
|
|
anim = "mcc_console_reaction2";
|
|
}
|
|
|
|
aiScriptedAnimWait( ent, anim, 4, 0 );
|
|
aiScriptedAnimLoop( ent, temp, 4 );
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Player meets with Whedon and Markswell in Sci-Tech
|
|
//--------------------------------------------------------------------------
|
|
void attackMusic()
|
|
{
|
|
sys.trigger( $musicAction );
|
|
$musicAction.fadeSound( SND_CHANNEL_ANY, 0, 5 );
|
|
$musicSubtle.fadeSound( SND_CHANNEL_ANY, -80, 2 );
|
|
sys.wait( 2 );
|
|
$musicSubtle.remove();
|
|
}
|
|
|
|
void sciTechMeeting()
|
|
{
|
|
// objective complete
|
|
sys.trigger( $item_objectivecomplete_1 );
|
|
|
|
sys.println("m06b::sciTechMeeting()");
|
|
|
|
// SEQUENCE GOES HERE
|
|
if ( !CUT_THE_CRAP )
|
|
{
|
|
$tak.lookAt( $player1 );
|
|
aiSpeakWait( $tak, "lipsync_tak_dekwepouringover" );
|
|
$tak.lookAt( $orig_mon_3 );
|
|
aiSpeakWait( $tak, "lipsync_tak_numrefvalk" );
|
|
$tak.lookAt( $player1 );
|
|
aiSpeakWait( $tak, "lipsync_tak_wemins" );
|
|
radioChatterPlay( $mcc2_briefingPA, "" );
|
|
thread setupEmergencyLights();
|
|
$tak.lookAt( $orig_mon_3 );
|
|
sys.wait( 3 );
|
|
aiSpeakWait( $tak, "lipsync_tak_whathellgo" );
|
|
$tak.setTalkState( TALK_OK );
|
|
}
|
|
|
|
sys.wait( 1 );
|
|
|
|
sys.trigger( $fxShake );
|
|
sys.trigger( $largeExplosion ); // attacked
|
|
thread attackMusic(); // here?
|
|
thread sittingReaction( $poisson, 1 );
|
|
thread sittingReaction( $dakin, 2 );
|
|
thread sittingReaction( $heckler, 1 );
|
|
radioChatterPlayWait( $func_radiochatter_0, "vo_mcc_allperidef" );
|
|
|
|
sys.trigger( $target_objectivebeacon_2 ); // turret area
|
|
sys.trigger( $item_objective_2 ); // get to PDGs
|
|
|
|
thread setupRouteToTurret(); // DESTROY THE REST OF THE MCC
|
|
thread radioBattle();
|
|
thread backgroundSounds(); // background battle sounds
|
|
|
|
$scitech_door.lock( 0 );
|
|
|
|
sys.wait( 1 );
|
|
radioChatterPlayWait( $func_radiochatter_0, "vo_marks_dekgettodef" );
|
|
|
|
if ( !SKIP_SAVEGAMES )
|
|
{
|
|
sys.trigger( $func_savegame_1 );
|
|
}
|
|
}
|
|
|
|
void scitechAncillary()
|
|
{
|
|
$FLANAGAN.setTalkState( TALK_WAIT );
|
|
$KETCHERSIDE.setTalkState( TALK_WAIT );
|
|
$FLANAGAN.lookAt( $func_static_54976 );
|
|
$KETCHERSIDE.lookAt( $func_static_54976 );
|
|
aiSpeakWait( $FLANAGAN, "lipsync_flan_data1" );
|
|
$KETCHERSIDE.lookAt( $FLANAGAN );
|
|
aiSpeakWait( $KETCHERSIDE, "lipsync_ketch_data2" );
|
|
$FLANAGAN.lookAt( $KETCHERSIDE );
|
|
aiSpeakWait( $FLANAGAN, "lipsync_flan_data3" );
|
|
$KETCHERSIDE.lookAt( $func_static_54976 );
|
|
$FLANAGAN.lookAt( $func_static_54976 );
|
|
aiSpeakWait( $KETCHERSIDE, "lipsync_ketch_data4" );
|
|
$FLANAGAN.lookAt( $null_entity );
|
|
$KETCHERSIDE.lookAt( $null_entity );
|
|
$FLANAGAN.setTalkState( TALK_OK );
|
|
$KETCHERSIDE.setTalkState( TALK_OK );
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------------
|
|
// randomly play explosions
|
|
//--------------------------------------------------------------------------
|
|
void backgroundSounds()
|
|
{
|
|
while( 1 )
|
|
{
|
|
sys.trigger( $func_earthquake_1 );
|
|
sys.wait( 8 + sys.random(5) );
|
|
}
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------------
|
|
// While the player is inside the intel room, make MASSIVE CHANGES to set up
|
|
// their new path to the turrets
|
|
// -- new lighting
|
|
// -- path gets changed
|
|
// -- armory gets emptied
|
|
// -- some guys get hidden, some get unhidden
|
|
// -- some triggers are enabled
|
|
//--------------------------------------------------------------------------
|
|
void setupRouteToTurret()
|
|
{
|
|
$func_door_130.lock(1);
|
|
$func_door_131.lock(1);
|
|
|
|
// dudes no talky
|
|
$heckler.setTalkState( TALK_BUSY );
|
|
$dakin.setTalkState( TALK_BUSY );
|
|
$poisson.setTalkState( TALK_BUSY );
|
|
|
|
$FLANAGAN.setTalkState( TALK_BUSY );
|
|
$KETCHERSIDE.setTalkState( TALK_BUSY );
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Guys climb up the magical turrets
|
|
//--------------------------------------------------------------------------
|
|
void hatchGuy0()
|
|
{
|
|
$env_q4x_mcc_hatch_3.playAnim( ANIMCHANNEL_ALL, "hatch_climb" );
|
|
aiScriptedAnimWait( $tubemarine0, "unarmed_mcc_hatch_climb", 0, 0 );
|
|
$tubemarine0.remove();
|
|
}
|
|
|
|
void hatchGuy1()
|
|
{
|
|
$RED_SHIRT_6.setTalkState( TALK_OK );
|
|
$env_q4x_mcc_hatch_1.playAnim( ANIMCHANNEL_ALL, "hatch_climb" );
|
|
aiScriptedAnimWait( $randomGuard1, "unarmed_mcc_hatch_climb", 0, 0 );
|
|
$randomGuard1.remove();
|
|
}
|
|
|
|
void hatchGuy2()
|
|
{
|
|
aiScriptedAnim( $darnell_turret, "weaponless_point_left", 4, 0 );
|
|
aiSpeakWait( $darnell_turret, "lipsync_darn_overdef" );
|
|
aiScriptedMoveWait( $darnell_turret, $hatch3_origin, 4, 0 );
|
|
//aiScriptedFaceWait( $darnell_turret, $hatchguy2face, 0 );
|
|
$env_q4x_mcc_hatch_2.playAnim( ANIMCHANNEL_ALL, "hatch_climb" );
|
|
aiScriptedAnimWait( $darnell_turret, "unarmed_mcc_hatch_climb", 0, 0 );
|
|
$darnell_turret.remove();
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------------
|
|
// guys protecting the control center
|
|
//--------------------------------------------------------------------------
|
|
void bcrdude1()
|
|
{
|
|
aiScriptedTetherMoveWait( $crblocker1, $crblocker1tether );
|
|
}
|
|
|
|
void bcrdude2()
|
|
{
|
|
$crblocker2.setMoveSpeed( AIMOVESPEED_RUN );
|
|
aiScriptedTetherMoveWait( $crblocker2, $crblocker2tether );
|
|
//$crblocker2.forcePosture( AIPOSTURE_CROUCH );
|
|
aiScriptedAnimWait( $crblocker2, "stand_to_crouch_scripted", 4, 1 );
|
|
aiScriptedAnimLoop( $crblocker2, "crouch_idle", 4 );
|
|
}
|
|
|
|
void blockedControlRoomDudes()
|
|
{
|
|
//sys.println("m06b::blockedControlRoomDudes()");
|
|
thread bcrdude1();
|
|
thread bcrdude2();
|
|
|
|
$crblocker1.setTalkState( TALK_OK );
|
|
$crblocker2.setTalkState( TALK_OK );
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Player getting to the turret, and the sequence
|
|
//--------------------------------------------------------------------------
|
|
void shipDamaged()
|
|
{
|
|
sys.trigger( $item_objectivefailed_2 );
|
|
|
|
$player1.enterVehicle( $turret ); //test
|
|
}
|
|
|
|
void monitorShipHealth()
|
|
{
|
|
float h = 20000;
|
|
|
|
$mcc_2.setHealth( 20000 );
|
|
|
|
while( 1 )
|
|
{
|
|
h = $mcc_2.getHealth();
|
|
if( h <= 0 )
|
|
{
|
|
$turret.setGuiParm( "mcchealth", 0 );
|
|
thread shipDamaged();
|
|
return;
|
|
}
|
|
$turret.setGuiParm( "mcchealth", sys.floor( h/10 ) );
|
|
sys.waitFrame();
|
|
}
|
|
}
|
|
|
|
void turretOnline()
|
|
{
|
|
aiScriptedAnim( $turret, "intro", 4, 0 );
|
|
sys.wait(2);
|
|
$turret.enableWeapon();
|
|
}
|
|
|
|
void startTurretSpawners()
|
|
{
|
|
sys.wait(3);
|
|
sys.trigger( $flyingTurretSpawner_1 );
|
|
sys.wait(5);
|
|
sys.trigger( $flyingTurretSpawner_3 );
|
|
sys.wait(4);
|
|
sys.trigger( $flyingTurretSpawner_2 );
|
|
}
|
|
|
|
void exitTurretSequence()
|
|
{
|
|
sys.trigger( $item_objectivecomplete_2 ); //Completed objective #2
|
|
sys.fadeOut( '0 0 0', 1);
|
|
sys.wait( 1 );
|
|
|
|
thread setupRouteToHangar();
|
|
|
|
$turret.lock( 0 );
|
|
$player1.exitVehicle( 0 );
|
|
sys.waitFrame();
|
|
sys.trigger( $player_post_turret ); // info_player_teleport
|
|
//$player1.setViewAngles ( '0 180 0' );
|
|
//$player1.setOrigin( $target_player_post_turret.getOrigin() );
|
|
|
|
sys.fadeIn( '0 0 0', 1);
|
|
}
|
|
|
|
void turretSequence()
|
|
{
|
|
sys.println("m06b::turretSequence()");
|
|
|
|
if ( !SKIP_SAVEGAMES )
|
|
{
|
|
sys.trigger( $func_savegame_1 );
|
|
}
|
|
|
|
sys.trigger( $target_objectivebeacon_2 ); // turret area beacon off
|
|
//sys.killthread("m06b::radioBattle");
|
|
$player1.exitVehicle( 1 ); // exiting dummyTurret
|
|
sys.waitFrame();
|
|
|
|
if ( SKIP_TURRET_SEQUENCE )
|
|
{
|
|
sys.println("TURRET SEQUENCE BEING SKIPPED FOR THE TIME BEING OKAY");
|
|
//Completed objective #2
|
|
thread setupRouteToHangar();
|
|
return;
|
|
}
|
|
|
|
sys.fadeOut( '0 0 0', 1);
|
|
sys.wait(1);
|
|
|
|
thread skyboxFighters();
|
|
thread fighterGroup1();
|
|
thread monitorShipHealth();
|
|
|
|
$player1.enterVehicle( $turret );
|
|
$dummyTurret.lock( 1 );
|
|
//$turret.lock( 1 ); // uncomment for release
|
|
sys.fadeIn( '0 0 0', 1);
|
|
|
|
thread turretOnline();
|
|
|
|
// markswell gives the rundown
|
|
thread startTurretSpawners();
|
|
|
|
// looping script that waits for player to complete obj01
|
|
turret_obj01();
|
|
|
|
// stop spawning plz
|
|
spawnTurret1Fighters = 0;
|
|
$flyingTurretSpawner_1.remove();
|
|
$flyingTurretSpawner_2.remove();
|
|
$flyingTurretSpawner_3.remove();
|
|
|
|
thread exitTurretSequence(); // okay we're done
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Func_fx fighters in the skybox
|
|
//--------------------------------------------------------------------------
|
|
void skyboxFighters()
|
|
{
|
|
// float t;
|
|
// for (t = 1; t <= 2; t++)
|
|
// {
|
|
// thread map_airdefense1::maintainStroggFlyerSprite( sys.getEntity("mvr_fx_strogg_flyer_" + t), sys.getEntity("fx_air_strogg_fighter_" + t), sys.getEntity("fx_air_strogg_fighter_" + (t + 6) ), $tgt_strogg_flyer_hangar, $tgr_strogg_flyer_end, '-1 0 .1' );
|
|
// thread map_airdefense1::maintainStroggFlyerSprite( sys.getEntity("mvr_fx_marine_flyer_" + t), sys.getEntity("fx_air_marine_fighter_" + t), sys.getEntity("fx_air_marine_fighter_" + (t + 6) ), $tgt_marine_flyer_hangar, $tgr_marine_flyer_end, '1 0 .1' );
|
|
// }
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Setting variables from func_spawned entities so that they can do things
|
|
//--------------------------------------------------------------------------
|
|
void lastSpawnedFighter( entity f )
|
|
{
|
|
spawnedFighter = f;
|
|
}
|
|
|
|
void lastSpawnedFighterDriver( entity d )
|
|
{
|
|
spawnedFighterDriver = d;
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------------
|
|
// triggering the fighter spawners and making them do their thing
|
|
//--------------------------------------------------------------------------
|
|
void manageFighter( string spline )
|
|
{
|
|
entity currVehicle;
|
|
entity currDriver;
|
|
|
|
entity currVehicleSpawner = sys.getEntity( "func_spawner_vehicle_" + spline );
|
|
entity currVehicleDriverSpawner = sys.getEntity( "func_spawner_driver_" + spline );
|
|
entity currSpline = sys.getEntity( "func_mover_fighter_spline_" + spline );
|
|
entity currMover = sys.getEntity( "func_mover_fighter_" + spline );
|
|
entity currMoverPitch = sys.getEntity( "func_mover_pitch_" + spline );
|
|
entity currSpeaker = sys.getEntity( "strogg_fighter_speaker_" + spline );
|
|
entity currMoverOrigin = sys.getEntity( "tar_start_mover_" + spline );
|
|
|
|
float t;
|
|
float whilechecker = 1;
|
|
|
|
do
|
|
{
|
|
//sys.println( "Fighter plane on spline " + spline + " spawned" );
|
|
sys.trigger( currVehicleSpawner );
|
|
sys.waitFrame();
|
|
currVehicle = spawnedFighter;
|
|
currVehicle.bind( currMoverPitch );
|
|
sys.waitFrame();
|
|
|
|
sys.trigger( currVehicleDriverSpawner );
|
|
sys.waitFrame();
|
|
currDriver = spawnedFighterDriver;
|
|
currDriver.enterVehicle( currVehicle );
|
|
currDriver.fireWeapon( 0, 5 );
|
|
|
|
currMover.speed( 2000 );
|
|
currMover.startSpline( currSpline );
|
|
|
|
// INSERT TIMING FOR SETTING OFF THE SPEAKER AND BANKING HERE
|
|
sys.wait( 2.75 );
|
|
if ( isValidEntity( currVehicle ) )
|
|
{
|
|
sys.trigger( currSpeaker );
|
|
}
|
|
// DONE FANCY-SCHMANCY TIMING
|
|
|
|
sys.waitFor( currMover );
|
|
currMover.stopSpline();
|
|
currMover.setOrigin( currMoverOrigin.getOrigin() );
|
|
if ( isValidEntity( currVehicle ) ) {
|
|
currVehicle.remove();
|
|
}
|
|
|
|
t = randomRoundFloat( 1, 5 ) + 5;
|
|
sys.wait( t );
|
|
}
|
|
while( spawnTurret1Fighters );
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------------
|
|
// vehicle fighters on splines at the first turret position
|
|
//--------------------------------------------------------------------------
|
|
void fighterGroup1()
|
|
{
|
|
float t;
|
|
thread manageFighter("2");
|
|
|
|
t = randomRoundFloat( 1, 5 ) + 3;
|
|
sys.wait(t);
|
|
thread manageFighter("3");
|
|
|
|
t = randomRoundFloat( 1, 5 ) + 3;
|
|
sys.wait(t);
|
|
thread manageFighter("4");
|
|
|
|
t = randomRoundFloat( 1, 5 ) + 3;
|
|
sys.wait(t);
|
|
thread manageFighter("5");
|
|
|
|
t = randomRoundFloat( 1, 5 ) + 3;
|
|
sys.wait(t);
|
|
thread manageFighter("6");
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Sends off the flatbed trucks and walkers for the convoy sequence
|
|
//--------------------------------------------------------------------------
|
|
void convoyAway()
|
|
{
|
|
$truck1.show();
|
|
$truck2.show();
|
|
$truck3.show();
|
|
|
|
sys.trigger( $walkerTether1 );
|
|
sys.trigger( $walkerTether2 );
|
|
|
|
$truck1.setAngles ('0 0 0');
|
|
setNewTimes( $truck1Mover , 25 , 3 , 0 );
|
|
$truck1Mover.startSpline( $truck1Spline );
|
|
|
|
$truck2.setAngles ('0 0 0');
|
|
setNewTimes( $truck2Mover , 26 , 3 , 0 );
|
|
$truck2Mover.startSpline( $truck2Spline );
|
|
|
|
$truck3.setAngles ('0 0 0');
|
|
setNewTimes( $truck3Mover , 27 , 3 , 0 );
|
|
$truck3Mover.startSpline( $truck3Spline );
|
|
|
|
sys.wait( 18 );
|
|
|
|
sys.trigger( $func_bigdoor_11 );
|
|
sys.wait( 8 );
|
|
sys.trigger( $func_bigdoor_11 );
|
|
}
|
|
|
|
void skyboxDroppods()
|
|
{
|
|
$skyboxDroppod_1.time( 60 );
|
|
$skyboxDroppod_2.time( 60 );
|
|
$skyboxDroppod_3.time( 60 );
|
|
$skyboxDroppod_4.time( 60 );
|
|
$skyboxDroppod_5.time( 60 );
|
|
$skyboxDroppod_6.time( 60 );
|
|
$skyboxDroppod_7.time( 60 );
|
|
$skyboxDroppod_8.time( 60 );
|
|
$skyboxDroppod_9.time( 60 );
|
|
$skyboxDroppod_10.time( 60 );
|
|
|
|
$skyboxDroppod_1.moveTo( $tar_skyboxDroppod_1 );
|
|
$skyboxDroppod_2.moveTo( $tar_skyboxDroppod_2 );
|
|
$skyboxDroppod_3.moveTo( $tar_skyboxDroppod_3 );
|
|
$skyboxDroppod_4.moveTo( $tar_skyboxDroppod_4 );
|
|
$skyboxDroppod_5.moveTo( $tar_skyboxDroppod_5 );
|
|
$skyboxDroppod_6.moveTo( $tar_skyboxDroppod_6 );
|
|
$skyboxDroppod_7.moveTo( $tar_skyboxDroppod_7 );
|
|
$skyboxDroppod_8.moveTo( $tar_skyboxDroppod_8 );
|
|
$skyboxDroppod_9.moveTo( $tar_skyboxDroppod_9 );
|
|
$skyboxDroppod_10.moveTo( $tar_skyboxDroppod_10 );
|
|
|
|
sys.wait( 10 );
|
|
thread startTurretSpawners(); // OFF
|
|
|
|
sys.wait( 10 );
|
|
thread startTurretSpawners(); // ON
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------------
|
|
// looping function that keeps the turret at the position,
|
|
// when this falls out the turret sequence is over
|
|
//--------------------------------------------------------------------------
|
|
void turret_obj01()
|
|
{
|
|
//thread turretBattleRadioChatter();
|
|
|
|
radioChatterPlayWait( $func_radiochatter_whedon, "vo_marine1_thisperdef" ); // inc harvesters
|
|
sys.wait(2);
|
|
|
|
sys.println( "ROUND 1: wave of flyers" );
|
|
sys.println( "NOT YET IMPLEMENTED" );
|
|
sys.wait( 2 );
|
|
|
|
radioChatterPlayWait( $func_radiochatter_whedon, "vo_marine1_harvinb" );
|
|
|
|
sys.println( "ROUND 2: HOLY SHIT HARVESTER OVER HILL + DESTRUCTION OF MCC GUN" );
|
|
sys.trigger( $monster_q4x_harvester_combat_2 );
|
|
aiScriptedAnim( $monster_q4x_harvester_combat_2, "mcc_mountain_climb", 4, 0 );
|
|
|
|
sys.wait( 3 );
|
|
|
|
radioChatterPlayWait( $func_radiochatter_whedon, "vo_marine1_nexdroppod" );
|
|
thread skyboxDroppods();
|
|
|
|
while ( !TURRET_DEAD )
|
|
{
|
|
sys.waitFrame();
|
|
}
|
|
|
|
while ( isLivingEntity($monster_q4x_harvester_combat_5) )
|
|
{
|
|
sys.waitFrame();
|
|
}
|
|
|
|
radioChatterPlayWait( $func_radiochatter_whedon, "vo_marine1_nexasspod" );
|
|
radioChatterPlayWait( $func_radiochatter_whedon, "vo_marks_attfalcspeed" ); // okay done meet us at the speeder hangar
|
|
|
|
sys.wait( 5 );
|
|
// "Aerial pods deployed."
|
|
//sys.trigger( $radioBattle_11 );
|
|
|
|
sys.println( "ROUND 4: flyers and bombers attack, ground forces getting ready to move out" );
|
|
sys.wait(6);
|
|
radioChatterPlayWait( $func_radiochatter_whedon, "vo_marine1_morestrgg" ); // additional signals
|
|
sys.wait(3);
|
|
|
|
// "Mechanized, Transport, and Infantry Units mobilized."
|
|
//sys.trigger( $radioBattle_12 );
|
|
sys.wait(5);
|
|
|
|
radioChatterPlayWait( $func_radiochatter_whedon, "vo_marine1_grnsred" );
|
|
// "Ground forces deployed."
|
|
//sys.trigger( $radioBattle_13 );
|
|
sys.wait(5);
|
|
|
|
thread convoyAway();
|
|
|
|
radioChatterPlayWait( $func_radiochatter_whedon, "vo_marine1_holdshharv" ); // contact bearing....
|
|
|
|
sys.trigger( $monster_q4x_harvester_combat_4 ); // OH GOD THE HORROR
|
|
|
|
while ( isLivingEntity( $monster_q4x_harvester_combat_4 ) )
|
|
{
|
|
//sys.println("waiting for harvester 2 to die");
|
|
sys.wait( 1 );
|
|
}
|
|
radioChatterPlayWait( $func_radiochatter_whedon, "vo_marine1_nexgaway" );
|
|
|
|
sys.println( "TURRET SEQUENCE OVER" );
|
|
sys.wait(2);
|
|
}
|
|
|
|
void harvesterKillsTurret()
|
|
{
|
|
TURRET_DEAD = 1;
|
|
$monster_q4x_mcc_turret_1.kill();
|
|
$monster_q4x_harvester_combat_2.remove();
|
|
sys.trigger( $monster_q4x_harvester_combat_5 );
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------------
|
|
// guy who gives the player a weapon after the turret sequence
|
|
//--------------------------------------------------------------------------
|
|
void spawnSwekel()
|
|
{
|
|
//giving weapon mod setup
|
|
$SWEKEL2.showSurface("models/weapons/mp_guns/w_sg");
|
|
$SWEKEL2.showSurface("models/weapons/mp_guns/w_sg_mod_ammo");
|
|
}
|
|
|
|
void giveGun2()
|
|
{
|
|
sys.wait(1);
|
|
$SWEKEL2.hideSurface("models/weapons/mp_guns/w_sg");
|
|
$SWEKEL2.hideSurface("models/weapons/mp_guns/w_sg_mod_ammo");
|
|
sys.trigger($goodies);
|
|
sys.trigger($pickUpWeaponSnd);
|
|
$player1.enableWeapon();
|
|
}
|
|
|
|
void swekelStabbedFx()
|
|
{
|
|
sys.wait( 1 );
|
|
aiSpeak( $SWEKEL2, "lipsync_belica_die" );
|
|
sys.trigger($stabFxShake_1);
|
|
sys.trigger($stabFxSound_1);
|
|
}
|
|
|
|
void giveWeaponAnims()
|
|
{
|
|
aiScriptedAnimWait( $SWEKEL2, "ad_sgt_holding_wounded", 4, 0 );
|
|
aiScriptedAnimLoop( $SWEKEL2, "unarmed_idle", 4 );
|
|
}
|
|
|
|
void giveWeapon()
|
|
{
|
|
sys.trigger( $SWEKEL2 );
|
|
//aiScriptedFaceWait( $SWEKEL2, $player1, 1 );
|
|
thread giveGun2();
|
|
thread giveWeaponAnims();
|
|
aiSpeakWait( $SWEKEL2, "lipsync_belica_sirgun" );
|
|
$env_q4x_harvester_leg_1.show();
|
|
$env_q4x_harvester_leg_1.playAnim( ANIMCHANNEL_ALL, "stabby_stabby" );
|
|
thread swekelStabbedFx();
|
|
aiScriptedAnimWait( $SWEKEL2, "mcc_stabby_stabby", 4, 0 );
|
|
|
|
$SWEKEL2.kill();
|
|
// $SWEKEL2.becomeNonSolid();
|
|
// $SWEKEL2.disableBlinking();
|
|
// $SWEKEL2.setTalkState( TALK_NEVER );
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Hallway to the engine room is blocked due to marines constantly shooting at
|
|
// a monster closet door thing
|
|
//--------------------------------------------------------------------------
|
|
void blockHallway()
|
|
{
|
|
sys.trigger( $marineBlocker1 );
|
|
sys.trigger( $ai_tether_radius_1 );
|
|
$marineBlocker1.forcePosture( AIPOSTURE_CROUCH );
|
|
|
|
sys.trigger( $marineBlocker2 );
|
|
//$marineBlocker2.forcePosture( AIPOSTURE_CROUCH );
|
|
//sys.trigger( $ai_tether_radius_2 );
|
|
}
|
|
|
|
void blockedHallwaySpawner( entity spawnee )
|
|
{
|
|
spawnee.setEnemy( $marineBlocker1 );
|
|
$marineBlocker1.setEnemy( spawnee );
|
|
$marineBlocker2.setEnemy( spawnee );
|
|
spawnee.activate ( $ai_tether_hallwayblocker );
|
|
}
|
|
|
|
void dudesDialog()
|
|
{
|
|
aiSpeakWait( $marineBlocker1, "lipsync_russ_dieyoupsh" );
|
|
sys.wait( 2 );
|
|
aiSpeakWait( $marineBlocker2, "lipsync_mason_getyrhead" );
|
|
sys.wait( 1 );
|
|
aiSpeakWait( $marineBlocker1, "lipsync_russ_weneedbacks" );
|
|
sys.wait( 3 );
|
|
aiSpeakWait( $marineBlocker2, "lipsync_mason_takethatshit" );
|
|
sys.wait( 1 );
|
|
aiSpeakWait( $marineBlocker1, "lipsync_russ_youlikesome" );
|
|
sys.wait( 3 );
|
|
aiSpeakWait( $marineBlocker2, "lipsync_mason_theflank" );
|
|
}
|
|
|
|
void blockedHallwayDude()
|
|
{
|
|
$marineBlocker1.setTalkState( TALK_OK );
|
|
$marineBlocker2.setTalkState( TALK_OK );
|
|
|
|
thread dudesDialog();
|
|
sys.println("m06b::blockedHallwayDude()");
|
|
aiScriptedTetherMoveWait( $marineBlocker2, $ai_tether_radius_2 );
|
|
aiScriptedFaceWait( $marineblocker2, $downHallway, 1 );
|
|
$marineBlocker2.forcePosture( AIPOSTURE_CROUCH );
|
|
$marineBlocker2.becomeAggressive();
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Round and round she goes... (HALLWAY VERSION)
|
|
//--------------------------------------------------------------------------
|
|
void spinHallTeleBall()
|
|
{
|
|
while( !hallTeleporterDestroyed ) {
|
|
//spin the balls
|
|
$rear_tele_ball_1.time( 1 );
|
|
$rear_tele_ball_1.rotateOnce( '0 180 0' );
|
|
sys.waitFor( $rear_tele_ball_1 );
|
|
sys.waitFrame();
|
|
}
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Allows the destruction of the teleporter ball thing and the turning off
|
|
// of the teleporter (HALLWAY VERSION)
|
|
//--------------------------------------------------------------------------
|
|
void monitorHallTeleHealth()
|
|
{
|
|
float r;
|
|
hallTeleporterDestroyed = false;
|
|
|
|
thread spinHallTeleBall();
|
|
|
|
while ( !hallTeleporterDestroyed )
|
|
{
|
|
r = $rear_tele_ball_1.getHealth();
|
|
|
|
if ( r <= 1 )
|
|
{
|
|
$rear_tele_broken_1.show();
|
|
$rear_tele_ball_1.remove();
|
|
sys.trigger( $rear_tele_broken_fx_1 );
|
|
sys.trigger( $rear_tele_break_fx_1 );
|
|
sys.trigger( $func_fx_809 );
|
|
sys.wait( 0.2 );
|
|
sys.trigger( $func_fx_809 );
|
|
sys.wait( 0.1 );
|
|
sys.trigger( $func_fx_809 );
|
|
$light_8546.remove();
|
|
hallTeleporterDestroyed = true;
|
|
$func_spawner_enemy_light_4.remove();
|
|
}
|
|
|
|
sys.wait(0.1);
|
|
}
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Round and round she goes... (COMMAND VERSION)
|
|
//--------------------------------------------------------------------------
|
|
void spinCommTeleBall()
|
|
{
|
|
while( !commTeleporterDestroyed ) {
|
|
//spin the balls
|
|
$comm_tele_ball.time( 1 );
|
|
$comm_tele_ball.rotateOnce( '0 180 0' );
|
|
sys.waitFor( $comm_tele_ball );
|
|
sys.waitFrame();
|
|
}
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Allows the destruction of the teleporter ball thing and the turning off
|
|
// of the teleporter (COMMAND VERSION)
|
|
//--------------------------------------------------------------------------
|
|
void monitorCommTeleHealth()
|
|
{
|
|
float r;
|
|
commTeleporterDestroyed = false;
|
|
|
|
thread spinCommTeleBall();
|
|
|
|
while ( !commTeleporterDestroyed )
|
|
{
|
|
r = $comm_tele_ball.getHealth();
|
|
|
|
if ( r <= 1 )
|
|
{
|
|
$comm_tele_broken.show();
|
|
$comm_tele_ball.remove();
|
|
sys.trigger( $comm_tele_broken_fx );
|
|
sys.trigger( $comm_tele_break_fx );
|
|
sys.trigger( $func_fx_comm_tele );
|
|
sys.wait( 0.2 );
|
|
sys.trigger( $func_fx_comm_tele );
|
|
sys.wait( 0.1 );
|
|
sys.trigger( $func_fx_comm_tele );
|
|
$controlRoomTeleporterLight.remove();
|
|
commTeleporterDestroyed = true;
|
|
$func_spawner_command_dropin.remove();
|
|
}
|
|
|
|
sys.wait(0.1);
|
|
}
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Round and round she goes...
|
|
//--------------------------------------------------------------------------
|
|
void spinTeleBall()
|
|
{
|
|
while( !teleporterDestroyed ) {
|
|
//spin the balls
|
|
$rear_tele_ball.time( 1 );
|
|
$rear_tele_ball.rotateOnce( '0 180 0' );
|
|
sys.waitFor( $rear_tele_ball );
|
|
sys.waitFrame();
|
|
}
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Allows the destruction of the teleporter ball thing and the turning off
|
|
// of the teleporter
|
|
//--------------------------------------------------------------------------
|
|
void monitorTeleHealth()
|
|
{
|
|
float r;
|
|
teleporterDestroyed = false;
|
|
|
|
thread spinTeleBall();
|
|
|
|
while ( !teleporterDestroyed )
|
|
{
|
|
r = $rear_tele_ball.getHealth();
|
|
|
|
if ( r <= 1 )
|
|
{
|
|
$rear_tele_broken.show();
|
|
$rear_tele_ball.remove();
|
|
sys.trigger( $rear_tele_broken_fx );
|
|
sys.trigger( $rear_tele_break_fx );
|
|
sys.trigger( $func_fx_9 );
|
|
sys.wait( 0.2 );
|
|
sys.trigger( $func_fx_9 );
|
|
sys.wait( 0.1 );
|
|
sys.trigger( $func_fx_9 );
|
|
$light_8176.remove();
|
|
teleporterDestroyed = true;
|
|
$func_spawner_enemy_light_3.remove();
|
|
}
|
|
|
|
sys.wait(0.1);
|
|
}
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Setting up the route for the player after the turret objective to get to the
|
|
// speeder hangar
|
|
//--------------------------------------------------------------------------
|
|
void setupRouteToHangar()
|
|
{
|
|
$corey_light_3517.setShader( "lights/square_flicker" );
|
|
$corey_light_3524.setShader( "lights/square_flicker" );
|
|
|
|
if ( !SKIP_SAVEGAMES )
|
|
{
|
|
sys.trigger( $func_savegame_1 );
|
|
}
|
|
|
|
$func_door_130.lock( 0 );
|
|
$func_door_131.lock( 0 );
|
|
|
|
thread giveWeapon();
|
|
thread monitorTeleHealth();
|
|
thread blockHallway();
|
|
|
|
$func_door_126.lock( 1 ); // initial door (damaged by dropdown thingie)
|
|
$func_door_127.lock( 1 );
|
|
|
|
$func_door_154.lock( 1 ); // engine room
|
|
$func_door_153.lock( 1 );
|
|
|
|
$func_door_166.lock( 0 ); // mess hall
|
|
$func_door_167.lock( 0 );
|
|
|
|
$door_speeder.lock( 0 );
|
|
$scitech_door.lock( 1 );
|
|
|
|
sys.trigger( $trig_explosion_1 );
|
|
sys.trigger( $trig_explosion_2 );
|
|
sys.trigger( $trig_explosion_3 );
|
|
sys.trigger( $trig_hall_teleporter );
|
|
|
|
sys.trigger( $trig_start_controlroom );
|
|
sys.trigger( $trig_start_controlroom_1 );
|
|
|
|
$crblocker1.remove();
|
|
$crblocker2.remove();
|
|
/*
|
|
//$crblocker2.forcePosture( AIPOSTURE_STAND );
|
|
aiScriptedAnimWait( $crblocker2, "crouch_to_stand_scripted", 4, 1 );
|
|
//sys.trigger( $ai_tether_none_1 );
|
|
*/
|
|
|
|
sys.wait( 5 );
|
|
sys.trigger( $target_objectivebeacon_3 ); // speeder hangar
|
|
sys.trigger( $item_objective_3 );
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Random stuff for smoke and mirrors in the control room
|
|
//--------------------------------------------------------------------------
|
|
void controlRoomKnockBackHelper( entity knockbackee )
|
|
{
|
|
vector vKnockback;
|
|
vector vGrunt = $target_null_7.getWorldOrigin();
|
|
vector vPlayer = knockbackee.getWorldOrigin();
|
|
|
|
vKnockback = VectorSubtract( vPlayer, vGrunt);
|
|
vKnockback = sys.vecNormalize( vKnockback);
|
|
|
|
//high numbers? Yes but they work very well.
|
|
vKnockback *= 150000;
|
|
vKnockback_z = 4000;
|
|
|
|
knockbackee.applyImpulse( knockbackee, knockbackee.getWorldOrigin(), vKnockback);
|
|
}
|
|
|
|
void controlRoomKnockBack()
|
|
{
|
|
sys.trigger( $target_launchprojectile_1 );
|
|
thread controlRoomKnockBackHelper( $player1 );
|
|
/*
|
|
$crblocker2.becomeRagdoll();
|
|
thread controlRoomKnockBackHelper( $crblocker2 );
|
|
sys.waitFrame();
|
|
$crblocker2.becomeNonSolid();
|
|
$crblocker2.setTalkState( TALK_NEVER );
|
|
$crblocker2.disableBlinking();
|
|
$crblocker2.becomePassive( 1 );
|
|
//$crblocker2.kill();
|
|
*/
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Player steps in control room, Strogg teleporter crashes into it
|
|
//--------------------------------------------------------------------------
|
|
void controlRoomCrash()
|
|
{
|
|
sys.println("m06b::controlRoomCrash()");
|
|
sys.wait( 1 );
|
|
|
|
sys.trigger( $controlRoomShakefx );
|
|
sys.trigger( $controlRoomLargeExplosion );
|
|
sys.trigger( $func_fx_controlRoomCrash );
|
|
thread controlRoomKnockBack();
|
|
sys.trigger( $target_light_fadeout_command );
|
|
//sys.wait( 1 );
|
|
|
|
// HIDE/SHOW EVERYTHING HERE
|
|
$controlroom_pipes_before.hide();
|
|
$controlroom_ceiling_before.hide();
|
|
$controlroom_randombar.hide();
|
|
|
|
$controlroom_pipes_after.show();
|
|
$controlroom_ceiling_after.show();
|
|
|
|
$strogg_teleporter_base_controlroom.show();
|
|
$controlroom_teleporter_base.show();
|
|
$teleporter_controllroom_arm_north.show();
|
|
$teleporter_controllroom_arm_south.show();
|
|
$teleporter_controllroom_arm_east.show();
|
|
$controlroom_teleporter_arm_west.show();
|
|
$comm_tele_ball.show();
|
|
$comm_tele_socket.show();
|
|
sys.trigger( $func_fx_comm_tele );
|
|
thread monitorCommTeleHealth();
|
|
|
|
$corey_light_2604.Off();
|
|
$corey_light_2614.Off();
|
|
$corey_light_2616.Off();
|
|
$corey_light_2647.Off();
|
|
$corey_light_3595.Off();
|
|
$corey_light_3596.Off();
|
|
$corey_light_3601.Off();
|
|
//$corey_light_3594.setShader("lights/square_blast");
|
|
//$corey_light_2600.setShader("lights/round_flicker2"); //what broken?
|
|
|
|
sys.trigger( $target_light_fadein_command );
|
|
$controlRoomTeleporterLight.fadeInLight(1.5);
|
|
|
|
sys.trigger( $controlroom_steam_1 );
|
|
sys.trigger( $controlroom_steam_2 );
|
|
sys.trigger( $controlroom_steam_3 );
|
|
sys.trigger( $controlroom_steam_4 );
|
|
sys.trigger( $controlroom_steam_5 );
|
|
sys.trigger( $controlroom_steam_6 );
|
|
|
|
sys.trigger( $controlroom_pipesteam_1 );
|
|
sys.trigger( $controlroom_pipesteam_2 );
|
|
|
|
sys.trigger( $func_fx_controlroom_sparks_1 );
|
|
sys.trigger( $func_fx_controlroom_sparks_2 );
|
|
sys.trigger( $func_fx_controlroom_sparks_3 );
|
|
|
|
sys.trigger( $func_fx_controlroom_fire_1 );
|
|
|
|
sys.wait(3);
|
|
|
|
// TELEPORTER ENABLED
|
|
sys.trigger( $func_spawner_command_dropin );
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Player almost gets hit by a leg thing
|
|
//--------------------------------------------------------------------------
|
|
void commandCenterStab()
|
|
{
|
|
$env_q4x_harvester_leg_2.show();
|
|
$env_q4x_harvester_leg_2.playAnim( ANIMCHANNEL_ALL, "stabby_stabby" );
|
|
|
|
sys.wait( 1 );
|
|
sys.trigger( $stabFxShake_2 );
|
|
sys.trigger( $stabFxSound_2 );
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Mustaine opens this door for you
|
|
//--------------------------------------------------------------------------
|
|
void openPremesshallDoor()
|
|
{
|
|
sys.trigger( $trigger_gladiatorPull );
|
|
$func_door_234.lock( 0 );
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------------
|
|
// EDIT: GLADIATOR pulls guy out of fucking turret hold (wtf)
|
|
//--------------------------------------------------------------------------
|
|
void berserkerSequence()
|
|
{
|
|
aiSpeak( $berserkerGuy, "lipsync_turguy_arrrrg" );
|
|
aiScriptedAnimWait( $berserkerGuy, "mcc_berzerker_pull", 4, 0 );
|
|
$berserkerGuy.disableBlinking();
|
|
$berserkerGuy.setTalkState( TALK_NEVER );
|
|
$berserkerGuy.becomeNonSolid();
|
|
$berserkerGuy.disableTarget();
|
|
aiScriptedAnimLoop( $berserkerGuy, "mcc_berzerker_pull_end_idle", 4 );
|
|
|
|
//aiScriptedFaceWait( $gladiatorPuller, $player1, 1 );
|
|
$gladiatorPuller.becomeAggressive();
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------------
|
|
// PHYSICS LOLOLOLOLOLOLOLOLOLOLOLOL (KILL ME NOW)
|
|
//--------------------------------------------------------------------------
|
|
void throwCrate()
|
|
{
|
|
sys.println("m06b::throwCrate()");
|
|
|
|
vector vForce = sys.angToForward( $cratePusher.getAngles() );
|
|
vForce_x *= -500;
|
|
vForce_y *= -5000;
|
|
///vForce_z *= -2500;
|
|
vForce_z = 50;
|
|
|
|
$thrownCrate.setLinearVelocity( vForce );
|
|
//$thrownCrate.applyImpulse( $thrownCrate, $thrownCrate.getWorldOrigin(), vKnockback);
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Past the mess hall
|
|
//--------------------------------------------------------------------------
|
|
void darnellNavajas()
|
|
{
|
|
aiScriptedAnimLoop( $darnell_outro, "idle", 4 );
|
|
aiScriptedAnimLoop( $navajas_outro, "crouch_idle", 4 );
|
|
$navajas_outro.lookAt( $player1 );
|
|
aiSpeakWait( $navajas_outro, "lipsync_nava_holdfire" );
|
|
$darnell_outro.lookAt( $player1 );
|
|
aiSpeak( $darnell_outro, "lipsync_darn_wasted" );
|
|
aiScriptedAnim( $darnell_outro, "stand_to_relaxed", 4, 0 );
|
|
sys.wait( 1.5 );
|
|
aiScriptedAnimWait( $darnell_outro, "point_back", 4, 1 );
|
|
$func_door_232.open();
|
|
aiScriptedMove( $darnell_outro, $darnell_goto_1, 32, 0 );
|
|
aiScriptedAnimWait( $navajas_outro, "crouch_to_stand_scripted", 4, 1 );
|
|
aiScriptedMove( $navajas_outro, $navajas_goto_1, 32, 0 );
|
|
sys.wait( 1 );
|
|
sys.trigger( $speaker_speederann_1 );
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------------
|
|
// ...entering the speeder hangar
|
|
//--------------------------------------------------------------------------
|
|
void morganWork()
|
|
{
|
|
$morgan.setMoveSpeed( AIMOVESPEED_WALK );
|
|
aiScriptedFaceWait( $morgan, $markswell, 0 );
|
|
aiScriptedAnimWait( $morgan, "at_attention_start", 4, 0 );
|
|
aiScriptedAnimWait( $morgan, "at_attention_end", 4, 0 );
|
|
aiScriptedMoveWait( $morgan, $morgan_goto, 4, 0 );
|
|
aiScriptedFaceWait( $morgan, $func_static_55181, 0 );
|
|
aiScriptedAnimLoop( $morgan, "console_w_weapon_loop", 8 );
|
|
}
|
|
|
|
void dekardMoves()
|
|
{
|
|
$dekard.setMoveSpeed( AIMOVESPEED_WALK );
|
|
aiScriptedMoveWait( $dekard, $tar_dekard_spot_outro, 4, 0 );
|
|
aiScriptedFace( $dekard, $markswell, 0 );
|
|
}
|
|
|
|
void enterSpeederHangar()
|
|
{
|
|
$vehicle_speederbike_1.lock( 1 );
|
|
$tak_outro.disableHeal();
|
|
aiScriptedAnimLoop( $naymushin, "cover_left_idle", 4 );
|
|
|
|
sys.setCamera( $func_cameraview_1 );
|
|
$player1.setOrigin( $tar_dekard_spot_outro_HACK.getOrigin() );
|
|
sys.trigger( $dekard );
|
|
thread dekardMoves();
|
|
|
|
thread morganWork();
|
|
sys.wait( 1 );
|
|
$door_speeder.close();
|
|
|
|
$markswell.lookAt( $dekard );
|
|
$tak_outro.lookAt( $dekard );
|
|
aiSpeakWait( $markswell, "lipsync_marks_dekgoodnex" );
|
|
aiSpeakWait( $tak_outro, "lipsync_tak_wefindec" );
|
|
sys.setCamera( $func_cameraview_tak );
|
|
aiSpeakWait( $tak_outro, "lipsync_tak_valkact" );
|
|
aiSpeakWait( $tak_outro, "lipsync_tak_datapoint" );
|
|
sys.setCamera( $func_cameraview_markswell );
|
|
aiSpeakWait( $markswell, "lipsync_marks_wetrycomm" );
|
|
sys.setCamera( $func_cameraview_tak );
|
|
aiSpeakWait( $tak_outro, "lipsync_tak_unfortstrgg" );
|
|
sys.setCamera( $func_cameraview_markswell );
|
|
aiSpeakWait( $markswell, "lipsync_marks_dektimeshort" );
|
|
sys.setCamera( $func_cameraview_group );
|
|
aiSpeakWait( $markswell, "lipsync_marks_youonlyfew" );
|
|
aiSpeakWait( $markswell, "lipsync_marks_moveout5" );
|
|
|
|
$dekard.remove();
|
|
sys.firstPerson();
|
|
$door_speeder.lock( 1 );
|
|
$player1.setOrigin( $tar_dekard_spot_outro.getOrigin() );
|
|
$player1.setViewAngles( '0 90 0' );
|
|
|
|
$tak_outro.setTalkState( TALK_OK );
|
|
$navajas_outro.setTalkState( TALK_OK );
|
|
$darnell_outro.setTalkState( TALK_OK );
|
|
$markswell.setTalkState( TALK_OK );
|
|
$naymushin.setTalkState( TALK_OK );
|
|
$morgan.setTalkState( TALK_OK );
|
|
|
|
sys.trigger( $speaker_speederann_2 );
|
|
|
|
$tak_outro.enableHeal();
|
|
|
|
sys.trigger( $blueLightSpecial );
|
|
sys.trigger( $exitareaalert );
|
|
$vehicle_speederbike_1.lock( 0 );
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Player gets in the speederbike, sets off events that end the level
|
|
//--------------------------------------------------------------------------
|
|
void getInSpeeder()
|
|
{
|
|
//Completed objective #5
|
|
sys.trigger( $item_objectivecomplete_3 );
|
|
$vehicle_speederbike_1.lock( 1 );
|
|
|
|
thread speederHangarLiftDown(); // going down
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------
|
|
// When the player gets on the bikes, lower the hangar doors
|
|
//-----------------------------------------------------------------------
|
|
void awayMusic()
|
|
{
|
|
sys.trigger( $musicTheme );
|
|
$musicTheme.fadeSound( SND_CHANNEL_ANY, 0, 5 );
|
|
$musicAction.fadeSound( SND_CHANNEL_ANY, -80, 2 );
|
|
sys.wait( 2 );
|
|
$musicAction.remove();
|
|
}
|
|
|
|
void speederHangarLiftDown()
|
|
{
|
|
thread awayMusic();
|
|
|
|
$speeder_hangar_floor.time( 15 );
|
|
$speeder_hangar_floor.accelTime( 3 );
|
|
|
|
// door used just to close off a vis portal
|
|
sys.trigger( $speeder_hangar_floor_door );
|
|
sys.wait( 3 );
|
|
|
|
// eventually get some dialog telling the player to stand still
|
|
$speeder_hangar_floor.move( DOWN, 394 );
|
|
sys.wait( 12 );
|
|
sys.fadeOut( '0 0 0', 2);
|
|
sys.wait( 2 );
|
|
|
|
$player1.setHealth( 100 ); // give the player what he needs
|
|
$player1.refillAmmo();
|
|
|
|
sys.trigger( $target_leveltrigger_1 );
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Raise the platform that the speeder bikes are on
|
|
//-----------------------------------------------------------------------
|
|
void speederHangarLiftUp()
|
|
{
|
|
$speeder_hangar_floor.time( 15 );
|
|
$speeder_hangar_floor.decelTime( .5 );
|
|
|
|
sys.trigger( $speeder_hangar_floor_door );
|
|
$speeder_hangar_floor_door.hide();
|
|
$speeder_hangar_floor.move( UP, 394 );
|
|
sys.waitFor( $speeder_hangar_floor );
|
|
$speeder_hangar_floor_door.show();
|
|
|
|
// door used just to close off a vis portal
|
|
sys.trigger( $speeder_hangar_floor_door );
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Sci-Tech monitor setup
|
|
//--------------------------------------------------------------------------
|
|
void scitechMonsDown()
|
|
{
|
|
$monitor_base.time( 5 );
|
|
$monitor_base.accelTime( .5 );
|
|
$monitor_base.decelTime( .5 );
|
|
|
|
$monitor_base.moveTo( $mon_base_DN );
|
|
sys.waitFor( $monitor_base );
|
|
$horz_mon_1.rotateUpTo( 2, 30 );
|
|
$orig_mon_3.rotateDownTo( 0, 330 );
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------------
|
|
//==========================================================================
|
|
// Environmental changes for the invasion
|
|
//==========================================================================
|
|
//--------------------------------------------------------------------------
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Global MCC changes
|
|
//--------------------------------------------------------------------------
|
|
void setupEmergencyLights()
|
|
{
|
|
sys.println("Setting up MCC emergency lighting");
|
|
|
|
/*==========================================
|
|
MESS HALL HALLWAY
|
|
===========================================*/
|
|
sys.trigger($messHallwayAttackedTrig);
|
|
thread attackInfluence($messHallwayInfluence, $messHallwayAttackSnd, $messHallwayAttackSnd);
|
|
|
|
/*==========================================
|
|
POST MESS HALL HALLWAY ROOM
|
|
===========================================*/
|
|
sys.trigger($postMessHallwayAttackedTrig);
|
|
thread attackInfluence($postMessHallwayInfluence, $postMessHallwayAttackSnd, $postMessHallwayAttackSnd_1);
|
|
|
|
/*==========================================
|
|
MEDLABS HALLWAY ROOM
|
|
===========================================*/
|
|
//sys.trigger($medHallwayAreaAttackedTrig);
|
|
thread attackInfluence($medHallwayInfluence, $medHallwayAttackSnd, $medHallwayAttackSnd_1);
|
|
|
|
/*==========================================
|
|
ENGINE HALLWAY ROOM
|
|
===========================================*/
|
|
//sys.trigger($engineHallwayAreaAttackedTrig);
|
|
thread attackInfluence($engineHallwayInfluence, $engineHallwayAttackSnd, $engineHallwayAttackSnd_1);
|
|
|
|
/*==========================================
|
|
DECON HALLWAY
|
|
===========================================*/
|
|
sys.trigger($deconHallwayAttackedTrig);
|
|
thread attackInfluence($deconHallwayInfluence, $deconHallwayAttackSnd, $deconHallwayAttackSnd_1);
|
|
|
|
/*==========================================
|
|
POD CONTROLROOM HALLWAY
|
|
===========================================*/
|
|
//sys.trigger($podControlHallwayAttackedTrig);
|
|
thread attackInfluence($podControlHallwayInfluence, $podControlHallwayAttackSnd, $podControlHallwayAttackSnd_1);
|
|
|
|
/*==========================================
|
|
POD CONTROLROOM HALLWAY
|
|
===========================================*/
|
|
//sys.trigger($podControlAttackedTrig);
|
|
thread attackInfluence($podControlInfluence, $podControlAttackSnd, $podControlAttackSnd_1);
|
|
|
|
// CURRENTLY UNIMPLEMENTED
|
|
/*==========================================
|
|
MESS HALL
|
|
===========================================*/
|
|
//sys.trigger($messHallAttackedTrig);
|
|
//thread attackInfluence($messHallInfluence, $messHallAttackSnd, $messHallAttackSnd);
|
|
|
|
/*==========================================
|
|
SCI-TECH ROOM
|
|
===========================================*/
|
|
sys.trigger($scitechAttackedTrig);
|
|
thread attackInfluence($scitechInfluence, $scitechAttackSnd, $scitechAttackSnd_1);
|
|
|
|
/*==========================================
|
|
SCI-TECH HALLWAY
|
|
===========================================*/
|
|
//TODO: blue light trigger
|
|
//thread attackInfluence($sciTechHallwayInfluence, $scitechHallAttackSnd, $scitechHallAttackSnd_1);
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------------
|
|
//==========================================================================
|
|
// Q4 from Raven below - MCC Setup practices and stuff
|
|
//==========================================================================
|
|
//--------------------------------------------------------------------------
|
|
|
|
//--------------------------------------------------------------------------
|
|
// loop for the target_setinfluence and speaker
|
|
// There are 2 speakers because the sounds overlap. If the speaker would be triggered again before finishing, it's shut off.
|
|
//--------------------------------------------------------------------------
|
|
void attackInfluence(entity inf, entity snd, entity snd_1)
|
|
{
|
|
while(1)
|
|
{
|
|
sys.trigger( snd );
|
|
sys.wait(1);
|
|
sys.trigger( inf );
|
|
sys.wait(1);
|
|
|
|
sys.trigger( snd_1 );
|
|
sys.wait(1);
|
|
sys.trigger( inf );
|
|
sys.wait(1);
|
|
}
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Setting up anims for idle chars
|
|
//--------------------------------------------------------------------------
|
|
void spawnScitechDudes()
|
|
{
|
|
$poisson.setTalkState( TALK_OK );
|
|
$heckler.setTalkState( TALK_OK );
|
|
$dakin.setTalkState( TALK_OK );
|
|
}
|
|
|
|
void spawnRs1()
|
|
{
|
|
aiScriptedAnimLoop( $RED_SHIRT_1, "working_on_knee", 4 );
|
|
sys.wait( 2 );
|
|
aiSpeakWait( $RED_SHIRT_1, "lipsync_must_dooropen" );
|
|
sys.wait( 4 );
|
|
aiSpeakWait( $RED_SHIRT_1, "lipsync_must_onemore" );
|
|
sys.wait( 4 );
|
|
aiSpeakWait( $RED_SHIRT_1, "lipsync_must_gotit" );
|
|
thread openPremesshallDoor();
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------------
|
|
// copy->paste mcc_2 radio battle
|
|
//--------------------------------------------------------------------------
|
|
void radioBattle()
|
|
{
|
|
// "Heavy Damage"
|
|
sys.trigger($radioWarnings_1);
|
|
sys.wait(5);
|
|
|
|
// "3 o'clock"
|
|
radioChatterPlayWait ($radioTurret1_1, "");
|
|
// "I'm on 'em."
|
|
radioChatterPlayWait ($radioTurret1_2, "");
|
|
|
|
// "keep coming"
|
|
radioChatterPlayWait ($radioRandoms_1, "");
|
|
|
|
// "86%"
|
|
sys.trigger($radioWarnings_2);
|
|
sys.wait(5);
|
|
|
|
// "comin' in too low"
|
|
radioChatterPlayWait ($radioTurret2_1, "");
|
|
// "target visually."
|
|
radioChatterPlayWait ($radioTurret2_2, "");
|
|
|
|
// "72%"
|
|
sys.trigger($radioWarnings_3);
|
|
sys.wait(7);
|
|
|
|
// "take that"
|
|
radioChatterPlayWait ($radioRandoms_2, "");
|
|
sys.wait(1);
|
|
|
|
// "turret's been hit"
|
|
radioChatterPlayWait ($radioTurret3_1, "");
|
|
|
|
// "63%"
|
|
sys.trigger($radioWarnings_4);
|
|
sys.wait(5);
|
|
|
|
// "harvesters, left flank"
|
|
radioChatterPlayWait ($radioWalker1_1, "");
|
|
// "taking engineering"
|
|
radioChatterPlayWait ($radioRandoms_3, "");
|
|
|
|
// "48%"
|
|
sys.trigger($radioWarnings_5);
|
|
sys.wait(6);
|
|
|
|
// "get banks out of there"
|
|
radioChatterPlayWait ($radioWalker2_1, "");
|
|
|
|
// "air support right now"
|
|
radioChatterPlayWait ($radioWalker3_1, "");
|
|
// "can't stop them"
|
|
radioChatterPlayWait ($radioRandoms_4, "");
|
|
|
|
// "Decks 2 and 3"
|
|
sys.trigger($radioWarnings_6);
|
|
sys.wait(7);
|
|
|
|
// "coord 43, 82"
|
|
radioChatterPlayWait ($radioField1_1, "");
|
|
// "roger that"
|
|
radioChatterPlayWait ($radioField1_2, "");
|
|
sys.wait(1);
|
|
|
|
// "29%"
|
|
sys.trigger($radioWarnings_7);
|
|
sys.wait(6);
|
|
|
|
// "air support?"
|
|
radioChatterPlayWait ($radioField2_1, "");
|
|
// "eta 3 min."
|
|
radioChatterPlayWait ($radioField2_2, "");
|
|
// "last that long"
|
|
radioChatterPlayWait ($radioField2_3, "");
|
|
|
|
// "13%"
|
|
sys.trigger($radioWarnings_8);
|
|
sys.wait(6);
|
|
|
|
// "another transport"
|
|
radioChatterPlayWait ($radioField3_1, "");
|
|
// "too damn many"
|
|
radioChatterPlayWait ($radioRandoms_5, "");
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------------
|
|
// random stuff going on during the turret sequence
|
|
//--------------------------------------------------------------------------
|
|
void turretBattleRadioChatter()
|
|
{
|
|
sys.wait(4);
|
|
|
|
// "hull breach"
|
|
//sys.trigger( $radioBattle_1 );
|
|
sys.wait(6);
|
|
|
|
// "they're dropping teleporters!"
|
|
radioChatterPlayWait( $func_radiochatter_0, "vo_7_13_11" );
|
|
sys.wait(1);
|
|
|
|
|
|
// "medical attention required"
|
|
//sys.trigger( $radioBattle_3 );
|
|
sys.wait(8);
|
|
|
|
// "got contact, 3 incoming squadrons bearing..."
|
|
radioChatterPlayWait( $func_radiochatter_0, "vo_7_13_18" );
|
|
sys.wait(4);
|
|
|
|
// "going for the reactor"
|
|
radioChatterPlayWait( $func_radiochatter_0, "vo_7_13_2" );
|
|
sys.wait(9);
|
|
|
|
// "panther squad requesting support on deck 12"
|
|
radioChatterPlayWait( $func_radiochatter_0, "vo_7_13_6" );
|
|
|
|
// "that's a negative panther, they've locked down..."
|
|
radioChatterPlayWait( $func_radiochatter_0, "vo_7_13_12" );
|
|
sys.wait(8);
|
|
|
|
// "nexus's assault's almost prepped"
|
|
radioChatterPlayWait( $func_radiochatter_0, "vo_7_13_5" );
|
|
|
|
|
|
// "strogg lifeforms detected"
|
|
//sys.trigger( $radioBattle_2 );
|
|
sys.wait(7);
|
|
|
|
// "got contact, watch the engine room"
|
|
radioChatterPlayWait( $func_radiochatter_0, "vo_7_13_1" );
|
|
sys.wait(8);
|
|
|
|
// "3 men down on deck 5, requesting medical"
|
|
radioChatterPlayWait( $func_radiochatter_0, "vo_7_13_9" );
|
|
sys.wait(3);
|
|
|
|
// "coming from port, hold them off"
|
|
radioChatterPlayWait( $func_radiochatter_0, "vo_7_13_3" );
|
|
sys.wait(5);
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------------
|
|
// In the beginning...
|
|
//--------------------------------------------------------------------------
|
|
void main()
|
|
{
|
|
// remove the players weapon
|
|
$player1.disableWeapon();
|
|
|
|
// wait to be enabled
|
|
$turret.disableWeapon();
|
|
|
|
/////////////////////
|
|
// Q4X addition /////
|
|
/////////////////////
|
|
|
|
// Hangar lift going up into the hangar (speeders)
|
|
thread speederHangarLiftUp();
|
|
|
|
$vehicle_speederbike_2.disableMovement();
|
|
$vehicle_speederbike_2.bind( $speeder_hangar_floor );
|
|
$vehicle_speederbike_2.lock( 1 );
|
|
|
|
$vehicle_speederbike_1.disableMovement();
|
|
$vehicle_speederbike_1.bind( $speeder_hangar_floor );
|
|
$vehicle_speederbike_1.disableWeapon();
|
|
|
|
thread scitechMonsDown();
|
|
thread spawnScitechDudes();
|
|
|
|
thread setupLockedDoors();
|
|
|
|
sys.fadeIn( '0 0 0', 2 );
|
|
|
|
sys.trigger( $musicSubtle );
|
|
$musicSubtle.fadeSound( SND_CHANNEL_ANY, -80, .1 );
|
|
sys.wait( .1 );
|
|
$musicSubtle.fadeSound( SND_CHANNEL_ANY, -6, 2 );
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Stuff I don't think I need
|
|
//--------------------------------------------------------------------------
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Stuff that gets said before the player gets on the turrets
|
|
//--------------------------------------------------------------------------
|
|
/*
|
|
void preTurretRadioChatter()
|
|
{
|
|
// "looks like some of them are already here" is currently playing
|
|
|
|
sys.wait(4);
|
|
|
|
|
|
// "primary power systems offline"
|
|
sys.trigger( $radioBattle_7 );
|
|
sys.wait(7);
|
|
|
|
// "they're fucking all over us"
|
|
radioChatterPlayWait( $func_radiochatter_0, "vo_7_5_13_29" );
|
|
sys.wait(3);
|
|
|
|
// "deck 3 is lost"
|
|
radioChatterPlayWait( $func_radiochatter_0, "vo_7_5_13_18" );
|
|
|
|
|
|
|
|
// "primary reactors exposed"
|
|
sys.trigger( $radioBattle_4 );
|
|
sys.wait(7);
|
|
|
|
// "three heavy contacts off starboard... they're..."
|
|
radioChatterPlayWait( $func_radiochatter_0, "vo_7_5_13_14" );
|
|
sys.wait(1);
|
|
|
|
// "got hostile signatures all over"
|
|
radioChatterPlayWait( $func_radiochatter_0, "vo_7_5_13_17" );
|
|
sys.wait(7);
|
|
|
|
// "primary hanger under attack"
|
|
sys.trigger( $radioBattle_5 );
|
|
sys.wait(8);
|
|
|
|
// "deck 9 secure... what the fu..."
|
|
radioChatterPlayWait( $func_radiochatter_0, "vo_7_5_13_25" );
|
|
sys.wait(2);
|
|
|
|
// "we've got squibs in the main hangar"
|
|
radioChatterPlayWait( $func_radiochatter_0, "vo_7_5_13_27" );
|
|
sys.wait(9);
|
|
|
|
|
|
// "hull integrity at 68%"
|
|
sys.trigger( $radioBattle_6 );
|
|
sys.wait(8);
|
|
|
|
// "they've hit the reactor chamber, we've got leaks"
|
|
radioChatterPlayWait( $func_radiochatter_0, "vo_7_5_13_23" );
|
|
sys.wait(3);
|
|
|
|
|
|
|
|
|
|
|
|
// "primary weapons battery has been destroyed"
|
|
sys.trigger( $radioBattle_8 );
|
|
sys.wait(8);
|
|
|
|
// "ah shit, where do they keep coming from"
|
|
radioChatterPlayWait( $func_radiochatter_0, "vo_7_5_13_30" );
|
|
sys.wait(3);
|
|
|
|
// "tarrant! answer me!"
|
|
radioChatterPlayWait( $func_radiochatter_0, "vo_7_5_13_26" );
|
|
sys.wait(2);
|
|
|
|
// "life support systems failing"
|
|
sys.trigger( $radioBattle_9 );
|
|
sys.wait(7);
|
|
|
|
// "watch it! reactor's critical"
|
|
radioChatterPlay( $func_radiochatter_0, "vo_7_5_13_24" );
|
|
sys.wait(1);
|
|
|
|
// "reactor critical"
|
|
sys.trigger( $radioBattle_10 );
|
|
sys.wait(8);
|
|
}
|
|
*/
|
|
} // end namespace
|