1624 lines
41 KiB
Text
1624 lines
41 KiB
Text
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|||
|
|
|||
|
Level: The Bog_A Back Half( bog_a_backhalf.bsp )
|
|||
|
Campaign: American Force Recon and regular Marines
|
|||
|
Objectives: 1. Get to the stranded M1A1 Abrams tank.
|
|||
|
2. Destroy the ZPU anti - aircraft gun.
|
|||
|
3. Debrief with Captain Price at the tank.
|
|||
|
|
|||
|
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * **/
|
|||
|
|
|||
|
#include maps\_utility;
|
|||
|
#include maps\_vehicle;
|
|||
|
#include common_scripts\utility;
|
|||
|
#include maps\_anim;
|
|||
|
|
|||
|
bog_backhalf_shell()
|
|||
|
{
|
|||
|
// // this function is loaded from Steve's shell map, not from the actual bog_a
|
|||
|
// // the actual bog_a calls bog_backhalf_init and has all this stuff already in its main()
|
|||
|
// setSavedDvar( "r_specularColorScale", "2.42" );
|
|||
|
//
|
|||
|
// setsaveddvar( "compassMaxRange", 2500 );
|
|||
|
// precacheItem( "rpg_straight" );
|
|||
|
// precacheModel( "tag_laser" );
|
|||
|
// precacheModel( "vehicle_zpu4_burn" );
|
|||
|
// precacheItem( "cobra_FFAR_bog_a_lite" );
|
|||
|
//
|
|||
|
// add_start( "zpu", ::start_zpu );
|
|||
|
// add_start( "cobras", ::start_cobras );
|
|||
|
// add_start( "end", ::start_end );
|
|||
|
// // add_start( "seaknights", ::start_seaknights );
|
|||
|
// default_start( ::start_bog_backhalf );
|
|||
|
//
|
|||
|
// maps\bog_a_fx::main();
|
|||
|
//
|
|||
|
// maps\_flare::main( "tag_flash" );
|
|||
|
// maps\_seaknight::main( "vehicle_ch46e_low" );
|
|||
|
// maps\_cobra::main( "vehicle_cobra_helicopter_fly_low" );
|
|||
|
// maps\_m1a1::main( "vehicle_m1a1_abrams" );
|
|||
|
//// maps\_blackhawk::main( "vehicle_blackhawk_low" );
|
|||
|
//
|
|||
|
// maps\createart\bog_a_art::main();
|
|||
|
// maps\createfx\bog_a_fx::main();
|
|||
|
//
|
|||
|
// maps\_load::main();
|
|||
|
// battlechatter_off( "allies" );
|
|||
|
// battlechatter_off( "axis" );
|
|||
|
//
|
|||
|
// maps\_zpu::main( "vehicle_zpu4" );
|
|||
|
//
|
|||
|
// maps\bog_a_backhalf_anim::main();
|
|||
|
//
|
|||
|
// maps\_compass::setupMiniMap( "compass_map_bog_a" );
|
|||
|
// maps\_c4::main();
|
|||
|
//
|
|||
|
// level thread maps\bog_a_amb::main();
|
|||
|
// level._effect[ "vehicle_explosion" ] = loadfx( "explosions/large_vehicle_explosion" );
|
|||
|
//
|
|||
|
// heroShield();
|
|||
|
//
|
|||
|
// level.price = getent( "price_spawner", "targetname" ) stalingradspawn();
|
|||
|
// spawn_failed( level.price );
|
|||
|
// level.mark = getent( "mark_spawner", "targetname" ) stalingradspawn();
|
|||
|
// spawn_failed( level.mark );
|
|||
|
//
|
|||
|
// level.price make_hero();
|
|||
|
// level.mark make_hero();
|
|||
|
// otherSpawners = getentarray( "main_friendly_unit", "script_noteworthy" );
|
|||
|
// array_thread( otherSpawners, ::force_spawn );
|
|||
|
//
|
|||
|
// level.price.animName = "price";
|
|||
|
// level.mark.animName = "mark";
|
|||
|
//
|
|||
|
// bog_backhalf_init();
|
|||
|
}
|
|||
|
|
|||
|
force_spawn()
|
|||
|
{
|
|||
|
self stalingradspawn();
|
|||
|
}
|
|||
|
|
|||
|
bog_backhalf_init()
|
|||
|
{
|
|||
|
level.tankExplosion_fx = loadfx( "explosions/javelin_explosion" );
|
|||
|
level.abrams = getent( "abrams", "targetname" );
|
|||
|
level.abrams.godmode = true;
|
|||
|
assert( isdefined( level.abrams ) );
|
|||
|
level.zpu = getent( "zpu", "targetname" );
|
|||
|
|
|||
|
//* * Enemy Flood_spawner Tank Encroachment Parameters( only happens when all original tank defenders are dead )
|
|||
|
level.tankDefenderPop = 0;
|
|||
|
level.tankAtkDead = 0;
|
|||
|
level.totalCount = 0;
|
|||
|
level.tankDefenseFailsafeTime = 900;
|
|||
|
|
|||
|
level.encroacherInit = 3;
|
|||
|
level.encroacherDiv = 3;
|
|||
|
|
|||
|
level.zpuBlastRadius = 384;
|
|||
|
|
|||
|
level.playerIsTargeted = false;
|
|||
|
|
|||
|
flag_init( "tankoverrun" );
|
|||
|
// flag_init( "tank_defense_completed" );
|
|||
|
|
|||
|
flag_init( "zpu_speech_started" );
|
|||
|
flag_init( "zpu_orders_given" );
|
|||
|
flag_init( "zpus_destroyed" );
|
|||
|
flag_init( "activate_final_bldg" );
|
|||
|
flag_init( "lower_health_of_tank_defense_stragglers" );
|
|||
|
|
|||
|
flag_init( "beacon_orders" );
|
|||
|
// flag_init( "beacon_ready_to_use" );
|
|||
|
flag_init( "beacon_planted" );
|
|||
|
|
|||
|
flag_init( "final_bldg_fired_upon" );
|
|||
|
|
|||
|
flag_init( "pilot_final_dialogue" );
|
|||
|
flag_init( "cobra_success" );
|
|||
|
flag_init( "reached_ending_area" );
|
|||
|
flag_init( "ending_final_positions" );
|
|||
|
flag_init( "clipped_off_dest" );
|
|||
|
|
|||
|
// house_dest_clip = getent( "house_dest_clip", "targetname" );
|
|||
|
// house_dest_clip connectpaths();
|
|||
|
// house_dest_clip notsolid();
|
|||
|
|
|||
|
level.c4_sound_override = true;
|
|||
|
|
|||
|
level.tankEncroachSteps = 3;
|
|||
|
level.tankEncroachInitRadius = 1600;
|
|||
|
level.tankEncroachRate = 0.8;
|
|||
|
level.tankEncroachPauseTime = 7;
|
|||
|
level.defenseSuccessRatio = 0.87; // percentage of enemy tank attack guys killed at which the objective completes
|
|||
|
|
|||
|
level.beacon = getent( "beacon", "targetname" );
|
|||
|
level.beacon.origin = level.beacon.origin + (0,0,2.85);
|
|||
|
|
|||
|
thread do_in_order( ::flag_wait, "final_bldg_fired_upon", maps\_spawner::kill_spawnerNum, 1008 );
|
|||
|
|
|||
|
array_thread( getentarray( "tank_defender", "script_noteworthy" ), ::add_spawn_function, ::tank_defender_spawn_setup );
|
|||
|
array_thread( getentarray( "tank_defender", "script_noteworthy" ), ::add_spawn_function, ::replace_on_death );
|
|||
|
array_thread( getentarray( "tank_attack_enemy", "script_noteworthy" ), ::add_spawn_function, ::enemy_infantry_spawn_setup );
|
|||
|
array_thread( getentarray( "tank_attack_enemy", "script_noteworthy" ), ::add_spawn_function, ::tank_attack_death_tally );
|
|||
|
}
|
|||
|
|
|||
|
//* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * **//
|
|||
|
|
|||
|
start_bog_backhalf()
|
|||
|
{
|
|||
|
flag_set( "tank_defense_activate" );
|
|||
|
|
|||
|
thread objectives();
|
|||
|
thread bog_a_backhalf_autosaves();
|
|||
|
|
|||
|
level.abrams thread tank_setup();
|
|||
|
level.abrams thread tank_turret_slewing();
|
|||
|
|
|||
|
thread temp_friendly_boost();
|
|||
|
|
|||
|
// array_thread( getentarray( "main_friendly_unit", "script_noteworthy" ), ::add_spawn_function, ::replace_on_death );
|
|||
|
// aGenericFriendlies = getentarray( "main_friendly_unit", "script_noteworthy" );
|
|||
|
// array_thread( aGenericFriendlies, ::replace_on_death );
|
|||
|
|
|||
|
thread tank_defense_flares();
|
|||
|
|
|||
|
thread tank_defender_deathmonitor();
|
|||
|
thread tank_defense_enforcement();
|
|||
|
thread tank_defense_victory_check();
|
|||
|
|
|||
|
thread tank_defense_killspawner_check();
|
|||
|
|
|||
|
thread zpu_battle_init();
|
|||
|
thread zpu_c4();
|
|||
|
thread zpu_dialogue();
|
|||
|
|
|||
|
thread cobra_bldg_activate();
|
|||
|
thread cobra_bldg_mg();
|
|||
|
|
|||
|
thread cobra_sequence();
|
|||
|
|
|||
|
thread dialogue();
|
|||
|
|
|||
|
// Bad place so they don't go over the hill through fires on the way back, until I clip the fires haha
|
|||
|
badPlaceHill = getent( "badplace_fires", "targetname" );
|
|||
|
badplace_cylinder( "hill_fires", -1, badPlaceHill.origin, badPlaceHill.radius, badPlaceHill.height, "allies" );
|
|||
|
}
|
|||
|
|
|||
|
start_zpu()
|
|||
|
{
|
|||
|
flag_set( "zpu_orders_given" );
|
|||
|
player_org = getent( "zpu_player_org", "targetname" );
|
|||
|
level.player setorigin( player_org.origin );
|
|||
|
level.player setplayerangles( player_org.angles );
|
|||
|
|
|||
|
|
|||
|
thread objectives();
|
|||
|
thread bog_a_backhalf_autosaves();
|
|||
|
|
|||
|
level.abrams thread tank_setup();
|
|||
|
|
|||
|
thread temp_friendly_boost();
|
|||
|
|
|||
|
thread zpu_battle_init();
|
|||
|
thread zpu_c4();
|
|||
|
thread zpu_dialogue();
|
|||
|
|
|||
|
thread cobra_bldg_activate();
|
|||
|
thread cobra_bldg_mg();
|
|||
|
|
|||
|
thread cobra_sequence();
|
|||
|
|
|||
|
thread dialogue();
|
|||
|
wait( 0.1 );
|
|||
|
activate_trigger_with_noteworthy( "zpu_trigger" );
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
start_cobras()
|
|||
|
{
|
|||
|
flag_set( "tank_defense_completed" );
|
|||
|
flag_set( "final_bldg_activate" );
|
|||
|
flag_set( "zpu_orders_given" );
|
|||
|
flag_set( "zpus_destroyed" );
|
|||
|
|
|||
|
thread cobra_bldg_activate();
|
|||
|
thread cobra_bldg_mg();
|
|||
|
|
|||
|
thread start_cobras_pos();
|
|||
|
|
|||
|
thread objectives();
|
|||
|
thread bog_a_backhalf_autosaves();
|
|||
|
|
|||
|
level.abrams thread tank_setup();
|
|||
|
|
|||
|
thread temp_friendly_boost();
|
|||
|
|
|||
|
thread cobra_sequence();
|
|||
|
|
|||
|
thread dialogue();
|
|||
|
|
|||
|
wait 5;
|
|||
|
|
|||
|
level.zpu delete();
|
|||
|
}
|
|||
|
|
|||
|
start_cobras_pos()
|
|||
|
{
|
|||
|
playerStart = getent( "start_cobras_player", "targetname" );
|
|||
|
level.player setorigin( playerStart.origin );
|
|||
|
|
|||
|
priceStart = getent( "start_cobras_price", "targetname" );
|
|||
|
level.price = getent( "price", "targetname" );
|
|||
|
level.price teleport( priceStart.origin );
|
|||
|
}
|
|||
|
|
|||
|
start_end()
|
|||
|
{
|
|||
|
level.player setplayerangles( ( 0, 80, 0 ) );
|
|||
|
level.player setorigin( ( 4968, 1528, -12320 ) );
|
|||
|
|
|||
|
ai = getaiarray();
|
|||
|
array_thread( ai, ::set_ignoreme, true );
|
|||
|
level.abrams thread tank_setup();
|
|||
|
level.abrams thread tank_turret_slewing();
|
|||
|
|
|||
|
tank_defenders = getentarray( "tank_defender", "script_noteworthy" );
|
|||
|
array_thread( tank_defenders, ::self_delete );
|
|||
|
|
|||
|
wait( 0.05 );
|
|||
|
set_vision_set( "bog_a_sunrise", 1 );
|
|||
|
abrams_gets_drawing();
|
|||
|
|
|||
|
level.price = getent( "price", "targetname" );
|
|||
|
price_spawner = getent( "price_spawner", "targetname" );
|
|||
|
level.price teleport( price_spawner.origin );
|
|||
|
|
|||
|
mark = getent( "mark_spawner", "targetname" ) stalingradspawn();
|
|||
|
level.mark = mark;
|
|||
|
spawn_failed( mark );
|
|||
|
spawn_failed( level.price );
|
|||
|
|
|||
|
level.price make_hero();
|
|||
|
mark make_hero();
|
|||
|
|
|||
|
allies = getaiarray( "allies" );
|
|||
|
allies = remove_heroes_from_array( allies );
|
|||
|
array_delete( allies );
|
|||
|
|
|||
|
otherSpawners = getentarray( "main_friendly_unit", "script_noteworthy" );
|
|||
|
array_thread( otherSpawners, ::force_spawn );
|
|||
|
|
|||
|
|
|||
|
// for the guys to spawn
|
|||
|
waittillframeend;
|
|||
|
thread ending_sequence();
|
|||
|
|
|||
|
wait( 0.05 );
|
|||
|
level.player setplayerangles( ( 0, 80, 0 ) );
|
|||
|
level.player setorigin( ( 4777, 1491, 20 ) );
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
//* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * **//
|
|||
|
|
|||
|
temp_friendly_boost()
|
|||
|
{
|
|||
|
|
|||
|
allies = getaiarray( "allies" );
|
|||
|
allies = remove_heroes_from_array( allies );
|
|||
|
for ( i = 0; i < allies.size; i++ )
|
|||
|
{
|
|||
|
ally = allies[ i ];
|
|||
|
ally.ignoresuppression = true;
|
|||
|
ally.health = 1000;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * **//
|
|||
|
|
|||
|
tank_defense_flares()
|
|||
|
{
|
|||
|
level endon( "tank_defense_completed" );
|
|||
|
level waittill( "detpack_rush_flare" );
|
|||
|
|
|||
|
wait 10;
|
|||
|
maps\_flare::flare_from_targetname( "flare1" );
|
|||
|
|
|||
|
wait 12;
|
|||
|
maps\_flare::flare_from_targetname( "flare2" );
|
|||
|
|
|||
|
wait 14;
|
|||
|
maps\_flare::flare_from_targetname( "flare1" );
|
|||
|
|
|||
|
wait 8;
|
|||
|
maps\_flare::flare_from_targetname( "flare2" );
|
|||
|
|
|||
|
wait 18;
|
|||
|
maps\_flare::flare_from_targetname( "flare1" );
|
|||
|
|
|||
|
wait 20;
|
|||
|
maps\_flare::flare_from_targetname( "flare1" );
|
|||
|
|
|||
|
wait 7;
|
|||
|
maps\_flare::flare_from_targetname( "flare2" );
|
|||
|
|
|||
|
wait 14;
|
|||
|
maps\_flare::flare_from_targetname( "flare1" );
|
|||
|
|
|||
|
wait 8;
|
|||
|
maps\_flare::flare_from_targetname( "flare2" );
|
|||
|
|
|||
|
wait 18;
|
|||
|
maps\_flare::flare_from_targetname( "flare1" );
|
|||
|
|
|||
|
wait 20;
|
|||
|
maps\_flare::flare_from_targetname( "flare1" );
|
|||
|
|
|||
|
wait 7;
|
|||
|
maps\_flare::flare_from_targetname( "flare2" );
|
|||
|
}
|
|||
|
|
|||
|
tank_defender_spawn_setup()
|
|||
|
{
|
|||
|
level.tankDefenderPop++ ;
|
|||
|
self.ignoresuppression = true;
|
|||
|
self.health = 1000;
|
|||
|
// self.IgnoreRandomBulletDamage = true;
|
|||
|
self thread tank_defender_deathnotify();
|
|||
|
}
|
|||
|
|
|||
|
tank_defender_deathnotify()
|
|||
|
{
|
|||
|
self waittill( "death" );
|
|||
|
level.tankDefenderPop -- ;
|
|||
|
}
|
|||
|
|
|||
|
tank_defender_deathmonitor()
|
|||
|
{
|
|||
|
battleTrigger = getent( "tank_battle_spawner", "targetname" );
|
|||
|
battleTrigger waittill( "trigger" );
|
|||
|
|
|||
|
// wait 0.05;
|
|||
|
|
|||
|
/*
|
|||
|
while ( level.tankDefenderPop > 3 )
|
|||
|
{
|
|||
|
wait 1;
|
|||
|
}
|
|||
|
|
|||
|
flag_set( "tankoverrun" );
|
|||
|
*/
|
|||
|
|
|||
|
wait 10;
|
|||
|
|
|||
|
// iprintlnbold( "They're rushing with detpacks! Take 'em out before they hit the tank!" );
|
|||
|
level notify( "detpack_rush_flare" );
|
|||
|
|
|||
|
// They're movin' in with detpacks! Don't let 'em get close to the tank!
|
|||
|
radio_dialogue_queue( "movingindetpacks" );
|
|||
|
}
|
|||
|
|
|||
|
tank_defense_victory_check()
|
|||
|
{
|
|||
|
aTankAttackSpawners = [];
|
|||
|
aEnemySpawners = [];
|
|||
|
|
|||
|
aEnemySpawners = getspawnerteamarray( "axis" );
|
|||
|
for ( i = 0; i < aEnemySpawners.size; i++ )
|
|||
|
{
|
|||
|
enemy = aEnemySpawners[ i ];
|
|||
|
|
|||
|
if ( !isdefined( enemy.script_noteworthy ) )
|
|||
|
continue;
|
|||
|
|
|||
|
if ( enemy.script_noteworthy == "tank_attack_enemy" )
|
|||
|
{
|
|||
|
aTankAttackSpawners[ aTankAttackSpawners.size ] = enemy;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
enemyPop = 0;
|
|||
|
currentCount = 0;
|
|||
|
|
|||
|
// Get the original total of spawner .count values
|
|||
|
|
|||
|
for ( j = 0; j < aTankAttackSpawners.size; j++ )
|
|||
|
{
|
|||
|
if ( !isdefined( aTankAttackSpawners[ j ].count ) )
|
|||
|
{
|
|||
|
count = 1;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
count = aTankAttackSpawners[ j ].count;
|
|||
|
}
|
|||
|
|
|||
|
level.totalCount = level.totalCount + count;
|
|||
|
}
|
|||
|
|
|||
|
while ( !flag( "tank_defense_completed" ) )
|
|||
|
{
|
|||
|
completionRatio = level.tankAtkDead / level.totalCount;
|
|||
|
|
|||
|
if ( completionRatio >= level.defenseSuccessRatio )
|
|||
|
{
|
|||
|
flag_set( "tank_defense_completed" );
|
|||
|
|
|||
|
thread tank_defense_stragglers();
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
currentCount = 0;
|
|||
|
wait 2;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
tank_defense_killspawner_check()
|
|||
|
{
|
|||
|
// In case the player manages to hit a bunch of tank attack killspawner triggers, effectively reducing the level.totalCount
|
|||
|
// This thread will setup the adjustment of level.totalCount accordingly
|
|||
|
|
|||
|
aKillTrigsDirectory = [];
|
|||
|
aKillTrigs = getentarray( "tank_attack_killspawner", "targetname" );
|
|||
|
for ( i = 0; i < aKillTrigs.size; i++ )
|
|||
|
{
|
|||
|
aKillTrigs[ i ] thread tank_defense_killspawner_monitor();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
tank_defense_killspawner_monitor()
|
|||
|
{
|
|||
|
// Subtract the total .count of the associated killspawner trigger's targeted spawners from level.totalCount
|
|||
|
|
|||
|
level endon( "tank_defense_completed" );
|
|||
|
|
|||
|
aKillTrigSpawners = [];
|
|||
|
killTriggerCount = 0;
|
|||
|
aEnemySpawners = getspawnerteamarray( "axis" );
|
|||
|
for ( i = 0; i < aEnemySpawners.size; i++ )
|
|||
|
{
|
|||
|
if ( !isdefined( aEnemySpawners[ i ].script_killspawner ) )
|
|||
|
continue;
|
|||
|
|
|||
|
if ( aEnemySpawners[ i ].script_killspawner == self.script_killspawner )
|
|||
|
aKillTrigSpawners[ aKillTrigSpawners.size ] = aEnemySpawners[ i ];
|
|||
|
}
|
|||
|
|
|||
|
for ( i = 0; i < aKillTrigSpawners.size; i++ )
|
|||
|
{
|
|||
|
if ( !isdefined( aKillTrigSpawners[ i ].count ) )
|
|||
|
count = 1;
|
|||
|
else
|
|||
|
count = aKillTrigSpawners[ i ].count;
|
|||
|
|
|||
|
killTriggerCount = killTriggerCount + count;
|
|||
|
}
|
|||
|
|
|||
|
self waittill( "trigger" );
|
|||
|
level.totalCount = level.totalCount - killTriggerCount;
|
|||
|
}
|
|||
|
|
|||
|
bog_a_backhalf_autosaves()
|
|||
|
{
|
|||
|
flag_wait( "tank_defense_completed" );
|
|||
|
|
|||
|
autosave_by_name( "tank_defense_finished" );
|
|||
|
|
|||
|
if ( !flag( "zpus_destroyed" ) )
|
|||
|
{
|
|||
|
zpuMidSaveTrig = getent( "zpuMidSaveTrig", "targetname" );
|
|||
|
zpuMidSaveTrig waittill( "trigger" );
|
|||
|
autosave_by_name( "zpu_midpoint_approach" );
|
|||
|
|
|||
|
zpuCloseSaveTrig = getent( "zpu_autosave", "targetname" );
|
|||
|
zpuCloseSaveTrig waittill( "trigger" );
|
|||
|
autosave_by_name( "zpu_dont_blow_yourself_up" );
|
|||
|
}
|
|||
|
|
|||
|
flag_wait( "zpus_destroyed" );
|
|||
|
|
|||
|
autosave_by_name( "airstrike_begin" );
|
|||
|
}
|
|||
|
|
|||
|
tank_defense_stragglers()
|
|||
|
{
|
|||
|
// trigger all killspawners for the tank attack enemies to stop their spawning
|
|||
|
aKillTriggers = getentarray( "tank_attack_killspawner", "targetname" );
|
|||
|
array_thread( aKillTriggers, ::activate_trigger );
|
|||
|
flag_set( "lower_health_of_tank_defense_stragglers" );
|
|||
|
}
|
|||
|
|
|||
|
//* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * **//
|
|||
|
|
|||
|
tank_attack_death_tally()
|
|||
|
{
|
|||
|
self waittill( "death" );
|
|||
|
level.tankAtkDead++ ;
|
|||
|
}
|
|||
|
|
|||
|
enemy_infantry_spawn_setup()
|
|||
|
{
|
|||
|
self endon( "death" );
|
|||
|
self waittill( "reached_path_end" );
|
|||
|
/*
|
|||
|
while ( !flag( "tankoverrun" ) )
|
|||
|
{
|
|||
|
wait 1;
|
|||
|
}
|
|||
|
*/
|
|||
|
self thread enemy_infantry_tank_encroach();
|
|||
|
|
|||
|
flag_wait( "lower_health_of_tank_defense_stragglers" );
|
|||
|
self.health = 5;
|
|||
|
}
|
|||
|
|
|||
|
enemy_infantry_tank_encroach()
|
|||
|
{
|
|||
|
self endon( "death" );
|
|||
|
level endon( "tank_defense_completed" );
|
|||
|
level endon( "suicide_bomber_reached_tank" );
|
|||
|
|
|||
|
self enemy_tank_encroach_mvmt();
|
|||
|
|
|||
|
// 1 in every level.encroacherInit guys will rush the tank
|
|||
|
choke = level.encroacherInit % level.encroacherDiv;
|
|||
|
level.encroacherInit++ ;
|
|||
|
|
|||
|
if ( !choke )
|
|||
|
{
|
|||
|
self.goalradius = 64;
|
|||
|
self.pathenemyfightdist = 512;
|
|||
|
self.pathenemylookahead = 512;
|
|||
|
|
|||
|
self waittill( "goal" );
|
|||
|
/#
|
|||
|
if ( isgodmode( level.player ) )
|
|||
|
return;
|
|||
|
#/
|
|||
|
|
|||
|
|
|||
|
if ( !flag( "tank_defense_completed" ) )
|
|||
|
{
|
|||
|
thread tank_destruction();
|
|||
|
waittillframeend;
|
|||
|
level notify( "suicide_bomber_reached_tank" );
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
self.goalradius = 1000;
|
|||
|
self setgoalentity( level.player );
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
enemy_tank_encroach_mvmt()
|
|||
|
{
|
|||
|
self endon( "death" );
|
|||
|
destNode = getnode( "tank_suicide_bomb_dest", "targetname" );
|
|||
|
|
|||
|
// self setgoalentity( level.abrams );
|
|||
|
self setgoalnode( destNode );
|
|||
|
self.goalradius = level.tankEncroachInitRadius;
|
|||
|
|
|||
|
self.pathenemyfightdist = 96;
|
|||
|
self.pathenemylookahead = 512;
|
|||
|
|
|||
|
for ( i = 0; i < level.tankEncroachSteps; i++ )
|
|||
|
{
|
|||
|
wait level.tankEncroachPauseTime;
|
|||
|
self.goalradius = self.goalradius * level.tankEncroachRate;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * **//
|
|||
|
|
|||
|
objectives()
|
|||
|
{
|
|||
|
objective_add( 1, "active", &"BOG_A_SECURE_THE_M1A1_ABRAMS", ( 4800, 1488, 32 ) );
|
|||
|
|
|||
|
objective_add( 5, "active", &"BOG_A_INTERCEPT_THE_ENEMY_BEFORE", ( 4800, 1488, 32 ) );
|
|||
|
objective_current( 5 );
|
|||
|
|
|||
|
flag_wait( "tank_defense_completed" );
|
|||
|
flag_clear( "aa_bog" );
|
|||
|
|
|||
|
flag_wait( "zpu_orders_given" );
|
|||
|
flag_init( "aa_zpu" );
|
|||
|
flag_set( "aa_zpu" );
|
|||
|
|
|||
|
objective_state( 5, "done" );
|
|||
|
|
|||
|
arcademode_checkpoint( 4.5, "d" );
|
|||
|
|
|||
|
objective_add( 6, "active", &"BOG_A_DESTROY_THE_ZPU_ANTI", level.zpu.origin );
|
|||
|
objective_current( 6 );
|
|||
|
|
|||
|
// iprintlnbold( "End of scripted section." );
|
|||
|
|
|||
|
flag_wait( "zpus_destroyed" );
|
|||
|
flag_clear( "aa_zpu" );
|
|||
|
|
|||
|
objective_state( 6, "done" );
|
|||
|
|
|||
|
southernObjLoc = getent( "southern_area_objective", "targetname" );
|
|||
|
|
|||
|
objective_add( 7, "active", &"BOG_A_SECURE_THE_SOUTHERN_SECTOR", southernObjLoc.origin );
|
|||
|
objective_current( 7 );
|
|||
|
|
|||
|
flag_wait( "beacon_orders" );
|
|||
|
|
|||
|
objective_add( 8, "active", &"BOG_A_PLANT_THE_IR_BEACON_TO", level.beacon.origin );
|
|||
|
obj_fx = spawnFx( getfx( "beacon_glow" ), level.beacon.origin );
|
|||
|
triggerFx( obj_fx );
|
|||
|
|
|||
|
objective_current( 8 );
|
|||
|
arcademode_checkpoint( 1.5, "e" );
|
|||
|
|
|||
|
flag_wait( "beacon_planted" );
|
|||
|
obj_fx delete();
|
|||
|
|
|||
|
arcademode_checkpoint( 3, "f" );
|
|||
|
objective_state( 8, "done" );
|
|||
|
|
|||
|
objective_current( 7 );
|
|||
|
|
|||
|
flag_wait( "cobra_success" );
|
|||
|
|
|||
|
objective_state( 7, "done" );
|
|||
|
|
|||
|
endingOrigin = ( 5099.6, 1602.45, -6.36579 );
|
|||
|
|
|||
|
objective_add( 9, "active", &"BOG_A_REGROUP_WITH_THE_SQUAD", endingOrigin );
|
|||
|
objective_current( 9 );
|
|||
|
|
|||
|
flag_wait( "reached_ending_area" );
|
|||
|
|
|||
|
objective_state( 9, "done" );
|
|||
|
objective_state( 1, "current" );
|
|||
|
}
|
|||
|
|
|||
|
//* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * **//
|
|||
|
|
|||
|
cobra_bldg_activate()
|
|||
|
{
|
|||
|
// wake up the final bldg so there is less chance of player fighting forever against it
|
|||
|
|
|||
|
flag_wait( "activate_final_bldg" );
|
|||
|
|
|||
|
trig = getent( "post_zpu_final_bldg_spawn", "script_linkname" );
|
|||
|
trig notify( "trigger" );
|
|||
|
}
|
|||
|
|
|||
|
cobra_bldg_mg()
|
|||
|
{
|
|||
|
flag_wait( "activate_final_bldg" );
|
|||
|
|
|||
|
backhalfmgs = getentarray( "backhalf_manual_mg", "targetname" );
|
|||
|
array_thread( backhalfmgs, ::backhalf_mg_setmode, "manual" );
|
|||
|
array_thread( backhalfmgs, ::cobra_bldg_mg_targeting );
|
|||
|
array_thread( backhalfmgs, ::cobra_bldg_mg_cleanup );
|
|||
|
}
|
|||
|
|
|||
|
cobra_bldg_mg_targeting()
|
|||
|
{
|
|||
|
level endon( "final_bldg_fired_upon" );
|
|||
|
|
|||
|
targets = getentarray( self.target, "targetname" );
|
|||
|
|
|||
|
self thread backhalf_manual_mg_fire();
|
|||
|
|
|||
|
n = 0;
|
|||
|
|
|||
|
while ( 1 )
|
|||
|
{
|
|||
|
target = random( targets );
|
|||
|
|
|||
|
wait( randomfloatrange( 1, 2 ) );
|
|||
|
|
|||
|
if ( n > 6 && !flag( "beacon_planted" ) && !level.playerIsTargeted )
|
|||
|
{
|
|||
|
level.playerIsTargeted = true;
|
|||
|
self settargetentity( level.player );
|
|||
|
n = 0;
|
|||
|
}
|
|||
|
else
|
|||
|
self settargetentity( target );
|
|||
|
|
|||
|
wait( randomfloatrange( 1, 5 ) );
|
|||
|
level.playerIsTargeted = false;
|
|||
|
n++ ;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
backhalf_mg_setmode( mode )
|
|||
|
{
|
|||
|
self setmode( mode );
|
|||
|
}
|
|||
|
|
|||
|
backhalf_manual_mg_fire()
|
|||
|
{
|
|||
|
self endon( "stop_firing" );
|
|||
|
self.turret_fires = true;
|
|||
|
for ( ;; )
|
|||
|
{
|
|||
|
timer = randomfloatrange( 0.2, 0.7 ) * 20;
|
|||
|
if ( self.turret_fires )
|
|||
|
{
|
|||
|
for ( i = 0; i < timer; i++ )
|
|||
|
{
|
|||
|
self shootturret();
|
|||
|
wait( 0.05 );
|
|||
|
}
|
|||
|
}
|
|||
|
wait( randomfloat( 0.5, 2 ) );
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
cobra_bldg_mg_cleanup()
|
|||
|
{
|
|||
|
thread do_in_order( ::flag_wait, "final_bldg_fired_upon", ::send_notify, "stop_firing" );
|
|||
|
|
|||
|
flag_wait( "final_bldg_fired_upon" );
|
|||
|
self delete();
|
|||
|
}
|
|||
|
|
|||
|
cobra_sequence()
|
|||
|
{
|
|||
|
flag_wait( "zpus_destroyed" );
|
|||
|
|
|||
|
wait 4;
|
|||
|
|
|||
|
// Carver, I've got air support on the way but they need our exact location.
|
|||
|
// Plant the IR beacon and get their attention. Out.
|
|||
|
radio_dialogue_queue( "plantbeacon" );
|
|||
|
|
|||
|
thread cobra_sequence_reminder();
|
|||
|
|
|||
|
flag_set( "beacon_orders" );
|
|||
|
|
|||
|
glowingBeacon = spawn( "script_model", level.beacon.origin + (0,0,-3) );
|
|||
|
glowingBeacon setmodel( "com_night_beacon_obj" );
|
|||
|
|
|||
|
flag_set( "beacon_ready_to_use" );
|
|||
|
beaconUseTrig = getent( "beaconTrig", "targetname" );
|
|||
|
beaconUseTrig sethintstring( &"SCRIPT_PLATFORM_HINT_PLANTBEACON" );
|
|||
|
beaconUseTrig waittill( "trigger" );
|
|||
|
|
|||
|
beaconUseTrig delete();
|
|||
|
|
|||
|
glowingBeacon setmodel( "com_night_beacon" );
|
|||
|
|
|||
|
flag_set( "beacon_planted" );
|
|||
|
|
|||
|
// Vampire Six - Four! Fire mission at grid 238165! We<57>re lightin<69> up the target!! Confirm!
|
|||
|
// level.price anim_single_queue( level.price, "vampiresixfour" );
|
|||
|
|
|||
|
cobra1 = spawn_vehicle_from_targetname( "cobra1" );
|
|||
|
cobra2 = spawn_vehicle_from_targetname( "cobra2" );
|
|||
|
|
|||
|
cobra1 thread mgon();
|
|||
|
cobra2 thread mgon();
|
|||
|
|
|||
|
cobra1 thread cobra_flightplan();
|
|||
|
cobra2 thread cobra_flightplan();
|
|||
|
|
|||
|
musicStop( 1.9 );
|
|||
|
wait 2;
|
|||
|
|
|||
|
MusicPlayWrapper( "bog_a_victory" );
|
|||
|
|
|||
|
// Ok, positive ID on your sparkle. We<57>re comin<69> in hot from the northeast.
|
|||
|
radio_dialogue_queue( "cominhot" );
|
|||
|
|
|||
|
wait 2;
|
|||
|
|
|||
|
// Standby.
|
|||
|
radio_dialogue_queue( "standby" );
|
|||
|
}
|
|||
|
|
|||
|
cobra_sequence_reminder()
|
|||
|
{
|
|||
|
level endon( "beacon_planted" );
|
|||
|
|
|||
|
n = 0;
|
|||
|
|
|||
|
while ( 1 )
|
|||
|
{
|
|||
|
wait 40;
|
|||
|
|
|||
|
if( n == 0 )
|
|||
|
{
|
|||
|
//They've got that building buttoned up! We need to call in the air support!! Jackson! Plant the IR beacon!!
|
|||
|
radio_dialogue_queue( "buttonedup" );
|
|||
|
}
|
|||
|
else
|
|||
|
if( n == 1 )
|
|||
|
{
|
|||
|
//Where - is - the - air suppooort???!
|
|||
|
radio_dialogue_queue( "whereistheairsupport" );
|
|||
|
}
|
|||
|
else
|
|||
|
if( n == 2 )
|
|||
|
{
|
|||
|
//We can't take that building without some air support! Jackson! Plant the beacon!!!
|
|||
|
radio_dialogue_queue( "canttakebuilding" );
|
|||
|
}
|
|||
|
else
|
|||
|
if( n == 3 )
|
|||
|
{
|
|||
|
//Those machine guns are rippin' us apart! Jackson! Plant the IR beacon and get those choppers over here! Now!
|
|||
|
radio_dialogue_queue( "rippingusapart" );
|
|||
|
}
|
|||
|
else
|
|||
|
if( n == 4 )
|
|||
|
{
|
|||
|
// Carver, I've got air support on the way but they need our exact location.
|
|||
|
// Plant the IR beacon and get their attention. Out.
|
|||
|
radio_dialogue_queue( "plantbeacon" );
|
|||
|
n = 0;
|
|||
|
}
|
|||
|
|
|||
|
n++ ;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
cobra_flightplan()
|
|||
|
{
|
|||
|
speed = 50;
|
|||
|
yawAccel = 25;
|
|||
|
|
|||
|
self setspeed( speed, 50 );
|
|||
|
self setyawspeed( 45, yawAccel );
|
|||
|
self setmaxpitchroll( 25, 50 );
|
|||
|
self sethoverparams( 128 );
|
|||
|
|
|||
|
pathpoint = undefined;
|
|||
|
if ( isdefined( self.target ) )
|
|||
|
pathpoint = getent( self.target, "targetname" );
|
|||
|
else
|
|||
|
assertmsg( "helicopter without target" );
|
|||
|
|
|||
|
pathpoints = [];
|
|||
|
while ( isdefined( pathpoint ) )
|
|||
|
{
|
|||
|
pathpoints[ pathpoints.size ] = pathpoint;
|
|||
|
if ( isdefined( pathpoint.target ) )
|
|||
|
pathpoint = getent( pathpoint.target, "targetname" );
|
|||
|
else
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
hoverwait = 0;
|
|||
|
attackPattern = "alpha";
|
|||
|
radius = 256;
|
|||
|
accel = 20;
|
|||
|
decel = 20;
|
|||
|
for ( i = 0; i < pathpoints.size; i++ )
|
|||
|
{
|
|||
|
engageDelay = 0;
|
|||
|
waypoint = pathpoints[ i ];
|
|||
|
|
|||
|
if ( isdefined( waypoint.radius ) )
|
|||
|
radius = waypoint.radius;
|
|||
|
self setNearGoalNotifyDist( radius );
|
|||
|
|
|||
|
if ( isdefined( waypoint.script_engageDelay ) )
|
|||
|
engageDelay = waypoint.script_engageDelay;
|
|||
|
|
|||
|
if ( isdefined( waypoint.script_attackPattern ) )
|
|||
|
attackPattern = waypoint.script_attackPattern;
|
|||
|
|
|||
|
if ( isdefined( waypoint.script_engage ) )
|
|||
|
self thread cobra_fire( engageDelay, attackPattern );
|
|||
|
|
|||
|
if ( isdefined( waypoint.script_pilottalk ) )
|
|||
|
flag_set( "pilot_final_dialogue" );
|
|||
|
|
|||
|
if ( isdefined( waypoint.script_hoverwait ) )
|
|||
|
{
|
|||
|
hoverwait = waypoint.script_hoverwait;
|
|||
|
wait hoverwait;
|
|||
|
hoverwait = 0;
|
|||
|
}
|
|||
|
|
|||
|
if ( isdefined( waypoint.script_airspeed ) )
|
|||
|
speed = waypoint.script_airspeed;
|
|||
|
|
|||
|
if ( isdefined( waypoint.script_accel ) )
|
|||
|
accel = waypoint.script_accel;
|
|||
|
|
|||
|
if ( isdefined( waypoint.script_decel ) )
|
|||
|
self setspeed( speed, accel, waypoint.script_decel );
|
|||
|
else
|
|||
|
self setspeed( speed, accel );
|
|||
|
|
|||
|
if ( isdefined( waypoint.script_yawspeed ) )
|
|||
|
self setyawspeed( waypoint.script_yawspeed, yawAccel );
|
|||
|
|
|||
|
if ( isdefined( waypoint.script_forceyaw ) )
|
|||
|
self settargetyaw( waypoint.angles[ 1 ] );
|
|||
|
|
|||
|
if ( isdefined( waypoint.script_cleartargetyaw ) )
|
|||
|
self cleartargetyaw();
|
|||
|
|
|||
|
stop = false;
|
|||
|
if ( isdefined( pathpoints[ i ].script_stopnode ) )// z: stop at nodes if there is a script_stopnode = 1 value
|
|||
|
stop = pathpoints[ i ].script_stopnode;
|
|||
|
|
|||
|
self setvehgoalpos( pathpoints[ i ].origin, stop );
|
|||
|
self waittill( "near_goal" );
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
cobra_fire( delay, pattern )
|
|||
|
{
|
|||
|
wait delay;
|
|||
|
|
|||
|
switch( pattern )
|
|||
|
{
|
|||
|
case "alpha":
|
|||
|
eTarget = getent( "ffar_1001", "targetname" );
|
|||
|
self maps\_helicopter_globals::fire_missile( "ffar_bog_a_lite", 1, eTarget );
|
|||
|
self thread cobra_missile_fired_earthquake();
|
|||
|
thread cobra_building_damage_fx( 1001 );
|
|||
|
|
|||
|
// Stop all spawning now
|
|||
|
|
|||
|
killTrigs = getentarray( "finalBldgKillSpawn", "targetname" );
|
|||
|
|
|||
|
for ( i = 0; i < killTrigs.size; i++ )
|
|||
|
{
|
|||
|
trig = killTrigs[ i ];
|
|||
|
trig notify( "trigger" );
|
|||
|
}
|
|||
|
|
|||
|
aFinalGuys = [];
|
|||
|
aFinalGuys = getentarray( "finalBldgGuys", "script_noteworthy" );
|
|||
|
for ( i = 0; i < ( aFinalGuys.size / 2 ); i++ )
|
|||
|
{
|
|||
|
guy = aFinalGuys[ i ];
|
|||
|
guy doDamage( guy.health + 5000, guy.origin );
|
|||
|
}
|
|||
|
|
|||
|
wait 0.5;
|
|||
|
|
|||
|
// Stop final bldg MGs now
|
|||
|
flag_set( "final_bldg_fired_upon" );
|
|||
|
|
|||
|
eTarget = getent( "ffar_1002", "targetname" );
|
|||
|
self maps\_helicopter_globals::fire_missile( "ffar_bog_a_lite", 2, eTarget );
|
|||
|
self thread cobra_missile_fired_earthquake();
|
|||
|
thread cobra_building_damage_fx( 1002 );
|
|||
|
eTarget = getent( "ffar_1003", "targetname" );
|
|||
|
self maps\_helicopter_globals::fire_missile( "ffar_bog_a_lite", 2, eTarget );
|
|||
|
self thread cobra_missile_fired_earthquake();
|
|||
|
thread cobra_building_damage_fx( 1003 );
|
|||
|
|
|||
|
if ( !flag( "clipped_off_dest" ) )
|
|||
|
{
|
|||
|
flag_set( "clipped_off_dest" );
|
|||
|
// house_dest_clip = getent( "house_dest_clip", "targetname" );
|
|||
|
// house_dest_clip solid();
|
|||
|
// house_dest_clip disconnectpaths();
|
|||
|
}
|
|||
|
|
|||
|
break;
|
|||
|
case "gamma":
|
|||
|
eTarget = getent( "ffar_1008", "targetname" );
|
|||
|
self maps\_helicopter_globals::fire_missile( "ffar_bog_a_lite", 2, eTarget );
|
|||
|
self thread cobra_missile_fired_earthquake();
|
|||
|
thread cobra_building_damage_fx( 1008 );
|
|||
|
break;
|
|||
|
case "delta":
|
|||
|
eTarget = getent( "ffar_1000", "targetname" );
|
|||
|
self maps\_helicopter_globals::fire_missile( "ffar_bog_a_lite", 2, eTarget );
|
|||
|
self thread cobra_missile_fired_earthquake();
|
|||
|
thread cobra_building_damage_fx( 1000 );
|
|||
|
wait 2;
|
|||
|
eTarget = getent( "ffar_1004", "targetname" );
|
|||
|
self maps\_helicopter_globals::fire_missile( "ffar_bog_a_lite", 1, eTarget );
|
|||
|
self thread cobra_missile_fired_earthquake();
|
|||
|
thread cobra_building_damage_fx( 1004 );
|
|||
|
|
|||
|
|
|||
|
wait 2;
|
|||
|
|
|||
|
eTarget = getent( "ffar_1005", "targetname" );
|
|||
|
self maps\_helicopter_globals::fire_missile( "ffar_bog_a_lite", 1, eTarget );
|
|||
|
self thread cobra_missile_fired_earthquake();
|
|||
|
thread cobra_building_damage_fx( 1005 );
|
|||
|
break;
|
|||
|
case "zeta":
|
|||
|
eTarget = getent( "ffar_1007", "targetname" );
|
|||
|
self maps\_helicopter_globals::fire_missile( "ffar_bog_a_lite", 2, eTarget );
|
|||
|
self thread cobra_missile_fired_earthquake();
|
|||
|
thread cobra_building_damage_fx( 1007 );
|
|||
|
wait 3;
|
|||
|
eTarget = getent( "ffar_1006", "targetname" );
|
|||
|
self maps\_helicopter_globals::fire_missile( "ffar_bog_a_lite", 2, eTarget );
|
|||
|
self thread cobra_missile_fired_earthquake();
|
|||
|
thread cobra_building_damage_fx( 1006 );
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
cobra_building_damage_fx( number )
|
|||
|
{
|
|||
|
wait 0.2;
|
|||
|
exploder( number );
|
|||
|
}
|
|||
|
|
|||
|
cobra_missile_fired_earthquake()
|
|||
|
{
|
|||
|
earthquake( 0.3, 1.0, self.origin, 4000 );
|
|||
|
}
|
|||
|
|
|||
|
//* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * **//
|
|||
|
|
|||
|
tank_defense_enforcement()
|
|||
|
{
|
|||
|
desertionWarnTrig = getent( "tank_defense_warning", "targetname" );
|
|||
|
desertionFailTrig = getent( "tank_defense_failed", "targetname" );
|
|||
|
|
|||
|
desertionWarnTrig thread tank_defense_warning();
|
|||
|
desertionFailTrig thread tank_defense_failure();
|
|||
|
}
|
|||
|
|
|||
|
tank_defense_warning()
|
|||
|
{
|
|||
|
level endon( "zpu_speech_started" );
|
|||
|
level endon( "tank_was_overrun" );
|
|||
|
level endon( "tank_defense_completed" );
|
|||
|
|
|||
|
i = 0;
|
|||
|
j = 0;
|
|||
|
|
|||
|
while ( !flag( "zpu_speech_started" ) )
|
|||
|
{
|
|||
|
self waittill( "trigger" );
|
|||
|
|
|||
|
switch( i )
|
|||
|
{
|
|||
|
case 0:
|
|||
|
radio_dialogue_queue( "dangeroverrun" );
|
|||
|
break;
|
|||
|
case 1:
|
|||
|
radio_dialogue_queue( "jacksonawol" );
|
|||
|
break;
|
|||
|
case 2:
|
|||
|
radio_dialogue_queue( "fallbacktank" );
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
wait 20;
|
|||
|
i++ ;
|
|||
|
|
|||
|
if ( i > 2 )
|
|||
|
{
|
|||
|
i = 0; // reset warning dialogue to recycle
|
|||
|
j++ ; // player is messing around with the situation so the mission fails anyway after enough cycles
|
|||
|
}
|
|||
|
|
|||
|
if ( j == 2 )
|
|||
|
thread tank_destruction();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
tank_defense_failure()
|
|||
|
{
|
|||
|
level endon( "zpu_speech_started" );
|
|||
|
level endon( "tank_defense_completed" );
|
|||
|
|
|||
|
self waittill( "trigger" );
|
|||
|
thread tank_destruction();
|
|||
|
}
|
|||
|
|
|||
|
//* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * **//
|
|||
|
|
|||
|
tank_setup()
|
|||
|
{
|
|||
|
tank_path = getVehicleNode( self.target, "targetname" );
|
|||
|
self attachPath( tank_path );
|
|||
|
self startPath();
|
|||
|
}
|
|||
|
|
|||
|
tank_turret_slewing()
|
|||
|
{
|
|||
|
level endon( "abrams_stop_slewing_turret" );
|
|||
|
self endon( "death" );
|
|||
|
|
|||
|
aDummyTargets = [];
|
|||
|
aDummyTargets = getentarray( "abrams_targetref", "targetname" );
|
|||
|
assert( aDummyTargets.size > 2 );
|
|||
|
|
|||
|
i = randomint( aDummyTargets.size );
|
|||
|
j = i + 1;
|
|||
|
cycleCount = 0;
|
|||
|
|
|||
|
while ( 1 )
|
|||
|
{
|
|||
|
if ( i == j )
|
|||
|
{
|
|||
|
wait 1;
|
|||
|
i = randomint( aDummyTargets.size );
|
|||
|
continue;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
self setturrettargetent( aDummyTargets[ i ] );
|
|||
|
self waittill( "turret_on_target" );
|
|||
|
wait randomfloatrange( 1, 2 );
|
|||
|
cycleCount++ ;
|
|||
|
if ( cycleCount == 2 )
|
|||
|
{
|
|||
|
wait randomfloatrange( 3, 5 );
|
|||
|
cycleCount = 0;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
j = i;
|
|||
|
i = randomint( aDummyTargets.size );
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
tank_destruction()
|
|||
|
{
|
|||
|
level endon( "tank_defense_completed" );
|
|||
|
level notify( "tank_was_overrun" );
|
|||
|
|
|||
|
thread tank_missionfailure();
|
|||
|
|
|||
|
play_sound_in_space( "generic_meleecharge_arab_6", level.abrams.origin );
|
|||
|
level.player playsound( "explo_mine" );
|
|||
|
playfx( level.tankExplosion_fx, level.abrams.origin );
|
|||
|
// level.abrams dodamage( level.abrams.health, level.abrams.origin );
|
|||
|
earthquake( 0.5, 2, level.player.origin, 1250 );
|
|||
|
|
|||
|
// radiusDamage( origin, range, maxdamage, mindamage );
|
|||
|
radiusDamage( level.abrams.origin, 512, 100500, 100500 );
|
|||
|
}
|
|||
|
|
|||
|
tank_missionfailure()
|
|||
|
{
|
|||
|
wait 2.25;
|
|||
|
|
|||
|
setDvar( "ui_deadquote", &"BOG_A_THE_TANK_WAS_OVERRUN" );
|
|||
|
maps\_utility::missionFailedWrapper();
|
|||
|
}
|
|||
|
|
|||
|
//* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * **//
|
|||
|
|
|||
|
zpu_battle_init()
|
|||
|
{
|
|||
|
flag_wait( "zpu_orders_given" );
|
|||
|
flag_set( "zpu_battle_started" );
|
|||
|
|
|||
|
thread zpu_battle_friendly_advance();
|
|||
|
|
|||
|
zpuBadPlace = getnode( "zpu_badplace", "targetname" );
|
|||
|
badplace_cylinder( "zpuNoAllies", -1, zpuBadPlace.origin, zpuBadPlace.radius, zpuBadPlace.height, "allies" );
|
|||
|
|
|||
|
zpuBattleSeedTrig = getent( "zpu_battle_seed", "targetname" );
|
|||
|
wait 2;
|
|||
|
zpuBattleSeedTrig notify( "trigger" );
|
|||
|
}
|
|||
|
|
|||
|
zpu_battle_friendly_advance()
|
|||
|
{
|
|||
|
aTrigs = getentarray( "zpu_friendly_advance_trigger", "script_noteworthy" );
|
|||
|
for ( i = 0; i < aTrigs.size; i++ )
|
|||
|
{
|
|||
|
aTrigs[ i ] thread zpu_battle_trigger_control();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
zpu_battle_trigger_control()
|
|||
|
{
|
|||
|
self endon( "deleted" );
|
|||
|
self waittill( "trigger" );
|
|||
|
|
|||
|
triggers = [];
|
|||
|
oldTrigger = undefined;
|
|||
|
|
|||
|
if ( isdefined( self.target ) )
|
|||
|
oldTrigger = getent( self.target, "targetname" );
|
|||
|
|
|||
|
while ( isdefined( oldTrigger ) )
|
|||
|
{
|
|||
|
triggers[ triggers.size ] = oldTrigger;
|
|||
|
if ( isdefined( oldTrigger.target ) )
|
|||
|
oldTrigger = getent( oldTrigger.target, "targetname" );
|
|||
|
else
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
for ( i = 0; i < triggers.size; i++ )
|
|||
|
{
|
|||
|
trig = triggers[ i ];
|
|||
|
|
|||
|
trig notify( "deleted" );
|
|||
|
trig delete();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
zpu_c4()
|
|||
|
{
|
|||
|
zpu = getent( "zpu", "targetname" );
|
|||
|
|
|||
|
zpu maps\_c4::c4_location( "tag_c4", (0,0,0), (0,0,0) );
|
|||
|
zpu waittill( "c4_detonation" );
|
|||
|
zpu notify( "death" );
|
|||
|
|
|||
|
playfx( level.tankExplosion_fx, zpu.origin );
|
|||
|
|
|||
|
thread play_sound_in_space( "bog_aagun_explode", zpu.origin );
|
|||
|
|
|||
|
zpu setmodel( "vehicle_zpu4_burn" );
|
|||
|
radiusDamage( zpu.origin + ( 0, 0, 96 ), level.zpuBlastRadius, 1000, 50 );
|
|||
|
// for the love of all that is holy in this world, why is this done in level script instead of the _zpu script? srsly
|
|||
|
|
|||
|
arcadeMode_kill( zpu.origin, "explosive", 2000 );
|
|||
|
flag_set( "zpus_destroyed" );
|
|||
|
abrams_gets_drawing();
|
|||
|
}
|
|||
|
|
|||
|
zpu_dialogue()
|
|||
|
{
|
|||
|
trig = getent( "plantc4_dialogue", "targetname" );
|
|||
|
trig waittill( "trigger" );
|
|||
|
|
|||
|
// The final bldg wakes up now
|
|||
|
flag_set( "activate_final_bldg" );
|
|||
|
|
|||
|
node = getnode( "zpuTalkingFriendly", "targetname" );
|
|||
|
allies = getaiarray( "allies" );
|
|||
|
allies = remove_heroes_from_array( allies );
|
|||
|
guy = getclosest( node.origin, allies );
|
|||
|
guy thread magic_bullet_shield();
|
|||
|
guy.animname = "marine";
|
|||
|
|
|||
|
// Carver, plant the C4 on the gun, move!
|
|||
|
guy thread anim_single_queue( guy, "plantc4" );
|
|||
|
|
|||
|
level waittill( "c4_in_place" );
|
|||
|
|
|||
|
thread zpu_interface();
|
|||
|
|
|||
|
//iprintlnbold( "Move to a safe distance!" );
|
|||
|
autosave_by_name( "zpu_c4_planted" );
|
|||
|
|
|||
|
// Good job, let's get to a safe distance!
|
|||
|
guy anim_single_queue( guy, "goodjob" );
|
|||
|
|
|||
|
zpu = getent( "zpu", "targetname" );
|
|||
|
dist = length( level.player.origin - zpu.origin );
|
|||
|
|
|||
|
// % buffer safe blast distance
|
|||
|
while ( dist <= ( level.zpuBlastRadius * 1.05 ) )
|
|||
|
{
|
|||
|
dist = length( level.player.origin - zpu.origin );
|
|||
|
wait 0.05;
|
|||
|
}
|
|||
|
|
|||
|
// We're good to go! Carver - do it!
|
|||
|
|
|||
|
if ( !flag( "zpus_destroyed" ) )
|
|||
|
{
|
|||
|
guy anim_single_queue( guy, "jacksondoit" );
|
|||
|
}
|
|||
|
|
|||
|
guy stop_magic_bullet_shield();
|
|||
|
}
|
|||
|
|
|||
|
dont_show_C4_hint()
|
|||
|
{
|
|||
|
if ( flag( "zpus_destroyed" ) )
|
|||
|
return false;
|
|||
|
//don't show c4 hint if this returns true
|
|||
|
weapon = level.player getcurrentweapon();
|
|||
|
return ( weapon == "c4" );
|
|||
|
}
|
|||
|
|
|||
|
zpu_interface()
|
|||
|
{
|
|||
|
level endon( "zpus_destroyed" );
|
|||
|
wait 2;
|
|||
|
|
|||
|
thread display_hint( "c4_use" );
|
|||
|
|
|||
|
/*
|
|||
|
while ( !flag( "zpus_destroyed" ) )
|
|||
|
{
|
|||
|
wait 2;
|
|||
|
|
|||
|
weapon = level.player getcurrentweapon();
|
|||
|
|
|||
|
if ( weapon != "c4" )
|
|||
|
{
|
|||
|
display_hint( "disable_nvg" );
|
|||
|
break;
|
|||
|
}
|
|||
|
//level.player switchtoweapon( "c4" );
|
|||
|
|
|||
|
|
|||
|
wait 0.5;
|
|||
|
}
|
|||
|
*/
|
|||
|
}
|
|||
|
|
|||
|
//* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * **//
|
|||
|
|
|||
|
dialogue()
|
|||
|
{
|
|||
|
if ( !flag( "tank_defense_completed" ) )
|
|||
|
{
|
|||
|
thread dialogue_south_tank_attack();
|
|||
|
|
|||
|
trig = getent( "backhalf_dialogue", "targetname" );
|
|||
|
trig waittill( "trigger" );
|
|||
|
|
|||
|
// Alpha Six what's your status over?
|
|||
|
radio_dialogue_queue( "alphasixstatus" );
|
|||
|
|
|||
|
battlechatter_on( "allies" );
|
|||
|
battlechatter_on( "axis" );
|
|||
|
|
|||
|
// We're still surrounded sir! There's just the four of us left but the tank's still ok Over!
|
|||
|
radio_dialogue_queue( "stillsurrounded" );
|
|||
|
|
|||
|
// Bravo Six this is Warpig! The main gun's offline but we still have our machine gun, over!
|
|||
|
radio_dialogue_queue( "maingunsoffline" );
|
|||
|
}
|
|||
|
|
|||
|
flag_wait( "tank_defense_completed" );
|
|||
|
|
|||
|
if ( !flag( "zpus_destroyed" ) )
|
|||
|
{
|
|||
|
thread zpu_player_followers();
|
|||
|
|
|||
|
// Bravo Six, be advised, more hostiles assembling to the west of your position over.
|
|||
|
radio_dialogue_queue( "morewest" );
|
|||
|
|
|||
|
// Two Charlie, Bravo Six! Requesting air support for fire mission, over!
|
|||
|
level.price anim_single_queue( level.price, "twocharliebravosix" );
|
|||
|
|
|||
|
flag_set( "zpu_speech_started" );
|
|||
|
|
|||
|
// Uh, negative Bravo Six, there's an enemy ZPU to the south of your position.
|
|||
|
// Until you take it out, we can NOT risk sending in any more choppers over.
|
|||
|
radio_dialogue_queue( "negativebravo" );
|
|||
|
|
|||
|
flag_set( "zpu_orders_given" );
|
|||
|
|
|||
|
// Carver! Find that ZPU and take it out so we can get some air support! Lopez! Gaines! Cover him!
|
|||
|
level.price anim_single_queue( level.price, "jacksonfindzpu" );
|
|||
|
|
|||
|
// Roger that!
|
|||
|
// level.scr_sound[ "marine" ][ "rogerthat" ] = "bog_a_gm1_rogerthat";
|
|||
|
|
|||
|
// All right let<65>s move out! Secure the western approach, move!
|
|||
|
radio_dialogue_queue( "securewest" );
|
|||
|
|
|||
|
wait 2;
|
|||
|
level.scr_sound[ "price" ][ "letsmoveout" ] = "bog_a_pri_letsmoveout";
|
|||
|
}
|
|||
|
|
|||
|
flag_wait( "pilot_final_dialogue" );
|
|||
|
|
|||
|
ai = getaiarray( "axis" );
|
|||
|
array_thread( ai, ::die );
|
|||
|
|
|||
|
spawners = getspawnerteamarray( "axis" );
|
|||
|
array_thread( spawners, ::self_delete );
|
|||
|
|
|||
|
// Uh, two, you see anyone left down there?
|
|||
|
radio_dialogue_queue( "seeanyoneleft" );
|
|||
|
|
|||
|
wait 0.5;
|
|||
|
|
|||
|
// Negative, we got <20>em.
|
|||
|
radio_dialogue_queue( "negative" );
|
|||
|
|
|||
|
wait 0.3;
|
|||
|
|
|||
|
// Roger that. All targets destroyed and we<77>re outta here. Good luck boys. Out.
|
|||
|
radio_dialogue_queue( "alltargetsdestroyed" );
|
|||
|
|
|||
|
set_vision_set( "bog_a_sunrise", 90 );
|
|||
|
wait 3;
|
|||
|
|
|||
|
// Command, LZ is secure. Bring in the engineers and let<65>s get this tank moving.
|
|||
|
level.price anim_single_queue( level.price, "lzissecure" );
|
|||
|
|
|||
|
wait 0.15;
|
|||
|
|
|||
|
flag_set( "cobra_success" );
|
|||
|
thread ending_sequence();
|
|||
|
level notify( "abrams_stop_slewing_turret" );
|
|||
|
|
|||
|
// Roger that. They<65>re on the way. Good work. Out.
|
|||
|
radio_dialogue_queue( "goodworkout" );
|
|||
|
|
|||
|
// Squad, regroup at the tank, let<65>s go!
|
|||
|
level.mark.animname = "left_guy";
|
|||
|
level.mark anim_single_queue( level.mark, "regroupattank" );
|
|||
|
//radio_dialogue_queue( "regroupattank" );
|
|||
|
}
|
|||
|
|
|||
|
abrams_gets_drawing()
|
|||
|
{
|
|||
|
level.abrams setmodel( getmodel( "tank_draw" ) );
|
|||
|
level.vtmodel = getmodel( "tank_draw" );
|
|||
|
level.abrams build_exhaust( "distortion/abrams_exhaust" );
|
|||
|
level.abrams build_deckdust( "dust/abrams_desk_dust" );
|
|||
|
}
|
|||
|
|
|||
|
zpu_player_followers()
|
|||
|
{
|
|||
|
thread promote_nearest_friendly( "c", "p" );
|
|||
|
thread promote_nearest_friendly( "c", "p" );
|
|||
|
}
|
|||
|
|
|||
|
ending_sequence()
|
|||
|
{
|
|||
|
// ai = getaiarray();
|
|||
|
// array_thread( ai, ::set_ignoreme, true );
|
|||
|
|
|||
|
level.price make_hero();
|
|||
|
allies = getaiarray( "allies" );
|
|||
|
allies = remove_heroes_from_array( allies );
|
|||
|
|
|||
|
level.price.animname = "price";
|
|||
|
|
|||
|
allies[ 0 ].animname = "right_guy";
|
|||
|
// allies[ 1 ].animname = "right_guy";
|
|||
|
level.mark.animname = "left_guy";
|
|||
|
|
|||
|
extraGuys = [];
|
|||
|
for ( i = 1; i < allies.size; i++ )
|
|||
|
{
|
|||
|
extraGuys[ extraGuys.size ] = allies[ i ];
|
|||
|
}
|
|||
|
|
|||
|
thread schoolcircle( "schoolcircle", extraGuys );
|
|||
|
|
|||
|
team = [];
|
|||
|
team[ team.size ] = level.price;
|
|||
|
team[ team.size ] = allies[ 0 ];
|
|||
|
team[ team.size ] = level.mark;
|
|||
|
|
|||
|
org = spawn( "script_origin", ( 0, 0, 0 ) );
|
|||
|
org.origin = level.abrams.origin;
|
|||
|
org.angles = level.abrams.angles;
|
|||
|
|
|||
|
|
|||
|
// if ( level.start_point == "end" )
|
|||
|
{
|
|||
|
org anim_teleport( team, "tank_talk" );
|
|||
|
}
|
|||
|
|
|||
|
org anim_reach_and_idle( team, "tank_talk", "tank_talk_idle", "stop_loop" );
|
|||
|
|
|||
|
while ( distance( level.player.origin, org.origin ) > 220 )
|
|||
|
{
|
|||
|
wait( 0.05 );
|
|||
|
}
|
|||
|
|
|||
|
flag_set( "reached_ending_area" );
|
|||
|
|
|||
|
// end_heli = spawn_vehicle_from_targetname( "end_heli" );
|
|||
|
// end_heli thread gopath( end_heli );
|
|||
|
|
|||
|
org notify( "stop_loop" );
|
|||
|
|
|||
|
// Listen up. We don<6F>t have much time to get this tank outta here.
|
|||
|
// We<57>ll take up defensive positions around the bog here, here, and here, and buy
|
|||
|
// the engineers some time to get the tank moving. Oorah?
|
|||
|
level.price thread new_goal_at_scene_end();
|
|||
|
|
|||
|
/*
|
|||
|
level.price delaythread( 0.2, ::anim_single_solo, level.price, "listen_up" );
|
|||
|
level.price delaythread( 2.3, ::anim_single_solo, level.price, "dont_have_much_time" );
|
|||
|
level.price delaythread( 5.6, ::anim_single_solo, level.price, "defensive_positions" ); // 5.6
|
|||
|
level.price delaythread( 13.8, ::anim_single_solo, level.price, "oorah" );
|
|||
|
*/
|
|||
|
|
|||
|
org thread anim_single( team, "tank_talk" );
|
|||
|
wait( 14.95 );
|
|||
|
// end_heli setVehGoalPos( end_heli.origin, false );
|
|||
|
// end_heli notify( "unload" );
|
|||
|
|
|||
|
objective_state( 1, "done" );
|
|||
|
nextmission();
|
|||
|
}
|
|||
|
|
|||
|
new_goal_at_scene_end()
|
|||
|
{
|
|||
|
self waittillend( "single anim" );
|
|||
|
self setgoalpos( self.origin );
|
|||
|
self.goalradius = 0;
|
|||
|
self.walkdist = 15010;
|
|||
|
}
|
|||
|
|
|||
|
dialogue_south_tank_attack()
|
|||
|
{
|
|||
|
trig = undefined;
|
|||
|
|
|||
|
aTrigs = getentarray( "flood_spawner", "targetname" );
|
|||
|
for ( i = 0; i < aTrigs.size; i++ )
|
|||
|
{
|
|||
|
if ( !isdefined( aTrigs[ i ].script_noteworthy ) )
|
|||
|
continue;
|
|||
|
|
|||
|
if ( aTrigs[ i ].script_noteworthy == "south_tank_attack_wave" )
|
|||
|
{
|
|||
|
trig = aTrigs[ i ];
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if ( isdefined( trig ) )
|
|||
|
trig waittill( "trigger" );
|
|||
|
|
|||
|
// Contacts to the east and more flanking to the south! Hold the perimeter!!!
|
|||
|
wait( 4 );
|
|||
|
radio_dialogue_queue( "contactseast" );
|
|||
|
}
|
|||
|
|
|||
|
//=======================================================================
|
|||
|
// Utilities
|
|||
|
//=======================================================================
|
|||
|
|
|||
|
heroShield()
|
|||
|
{
|
|||
|
hero_spawners = getentarray( "hero", "script_noteworthy" );
|
|||
|
array_thread( hero_spawners, ::add_spawn_function, ::hero );
|
|||
|
}
|
|||
|
|
|||
|
hero()
|
|||
|
{
|
|||
|
self thread magic_bullet_shield();
|
|||
|
self.IgnoreRandomBulletDamage = true;
|
|||
|
}
|
|||
|
|
|||
|
schoolcircle( nodename, guys )
|
|||
|
{
|
|||
|
// Makes any number of Allied troops assemble with a leader, useful for regrouping for in - level briefings
|
|||
|
|
|||
|
// nodename = targetname of the nodes used by the grunts
|
|||
|
// guys = array of guys to distribute at the destination
|
|||
|
|
|||
|
nodearray = getnodearray( nodename, "targetname" );
|
|||
|
|
|||
|
assertEX( nodearray.size >= guys.size, "You have more guys than nodes for them to go to." );
|
|||
|
|
|||
|
for ( i = 0; i < guys.size; i++ )
|
|||
|
{
|
|||
|
guys[ i ] thread schoolcircle_nav( nodearray, i );
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
schoolcircle_nav( nodearray, i )
|
|||
|
{
|
|||
|
self endon( "death" );
|
|||
|
|
|||
|
wait 2.5; // soft wait to avoid traffic jams w / leader
|
|||
|
self setgoalnode( nodearray[ i ] );
|
|||
|
self.goalradius = 32;
|
|||
|
self.dontavoidplayer = true;
|
|||
|
self allowedstances( "stand" );
|
|||
|
if ( !isdefined( nodearray[ i ].script_noteworthy ) )
|
|||
|
return;
|
|||
|
if ( nodearray[ i ].script_noteworthy == "kneel" )
|
|||
|
thread schoolcircle_crouch( self );
|
|||
|
}
|
|||
|
|
|||
|
schoolcircle_crouch( soldier )
|
|||
|
{
|
|||
|
soldier waittill( "goal" );
|
|||
|
soldier allowedstances( "crouch" );
|
|||
|
}
|
|||
|
|