cod5-sdk/raw/maps/ber1_event2.gsc
2008-11-20 00:00:00 +00:00

812 lines
17 KiB
Text

// scripting by Bloodlust
// level design by BSouds
#include maps\_anim;
#include maps\_utility;
#include maps\ber1_util;
#include maps\pel2_util;
#include common_scripts\utility;
#include maps\_music;
#using_animtree("generic_human");
// main function for handeling Event 2
main()
{
/#
maps\_status::show_task("event2");
#/
level thread cafe_wall_crumble();
level thread street_ambush();
level thread street_first_floodspawners();
}
// play FXs for Tank 1 getting killed and the wall blowing up, opening the way into the asylum
street_ambush()
{
// TODO might want to add another node closer
wallnode = getVehicleNode( "tank1_cleared_wall", "targetname" );
wallnode waittill( "trigger" );
//TUEY set music state to TANK_HIT
setmusicstate("TANK_HIT");
flag_set( "tank_ambush" );
street_battle();
}
///////////////////
//
// where most of the street battle threads are started
//
///////////////////////////////
street_battle()
{
maps\_debug::set_event_printname( "Streets" );
// decrease amount of color spawners by 1
redshirts = getaiarray( "allies" );
for( i = 0; i < redshirts.size; i++ )
{
if( isdefined( redshirts[i].script_forcecolor ) && redshirts[i].script_forcecolor == "r" )
{
redshirts[i] disable_replace_on_death();
break;
}
}
level thread bookcase_push();
level thread chain_near_asylum();
level thread chain_street_right_1();
level thread chain_street_right_2();
level thread chain_street_left_1();
level thread chain_street_left_2();
level thread roof_shreks();
level thread panzershrek_hits_wall();
level thread monitor_killspawner_151();
level thread save_mid_yard();
level thread save_asylum_entry();
level thread spawn_street_pickup_weapons();
level thread maps\ber1_asylum::setup_crows();
//level thread bathroom_mg_exploder_200();
bathroom_mg = getent( "bathroom_mg", "script_noteworthy" );
bathroom_mg setturretignoregoals( true );
maps\ber1_asylum::main();
}
//bathroom_mg_exploder_200()
//{
//
// // notify from flag on trigger
// level endon( "asylum_exit" );
//
// dmg_trigger = getent( "exploder_200", "targetname" );
// dmg_trigger waittill( "trigger" );
//
// //mg_sandbag_cleanup( "auto3749", 165 );
//
// dmg_trigger delete();
//
//}
streets_vo()
{
play_vo( level.commissar, "vo", "keep_pushing" );
wait( 2.5 );
play_vo( level.chernov, "vo", "panzershrek_fire" );
wait( 3 );
play_vo( level.reznov, "vo", "deal_with_it" );
wait( 2 );
flag_wait( "roof_shreks" );
play_vo( level.reznov, "vo", "split_up" );
wait( 3 );
play_vo( level.reznov, "vo", "rest_of_you" );
wait( 3 );
flag_wait( "last_yard_floodspawners" );
play_vo( level.commissar, "vo", "fight_your_way" );
wait( 3 );
play_vo( level.reznov, "vo", "hunt_them_down" );
}
street_first_floodspawners()
{
trigger_wait( "trig_street_first_floodspawners", "targetname" );
simple_floodspawn( "street_first_floodspawners" );
level thread streets_vo();
}
///////////////////
//
// will delete a floodspawner trigger that targets a spawner that may be killspawned early, depending if the yard path is taken
//
///////////////////////////////
monitor_killspawner_151()
{
trigger_wait( "trig_killspawner_151", "targetname" );
spawn_trig = getent( "trig_spawn_street_guys_late_2", "script_noteworthy" );
if( isdefined( spawn_trig ) )
{
spawn_trig delete();
}
}
///////////////////
//
// guys way up on the roof that shoot towards the street
//
///////////////////////////////
roof_shreks()
{
trigger_wait( "trig_roof_shreks", "targetname" );
flag_set( "roof_shreks" );
simple_spawn( "street_asylum_roof_shreks", ::street_asylum_roof_shreks_strat );
shrek_target = getent( "shrek_1_orig", "targetname" );
shrek_target.health = 1000000;
level thread flame_move_target( shrek_target, 6 );
shrek_target = getent( "shrek_2_orig", "targetname" );
shrek_target.health = 1000000;
level thread flame_move_target( shrek_target, 6 );
shrek_target = getent( "shrek_3_orig", "targetname" );
shrek_target.health = 1000000;
level thread flame_move_target( shrek_target, 6 );
shrek_target = getent( "shrek_4_orig", "targetname" );
shrek_target.health = 1000000;
level thread flame_move_target( shrek_target, 6 );
}
street_asylum_roof_shreks_strat()
{
self endon( "death" );
self.accuracy = 0.05;
self.ignoreme = 1;
self.pacifist = 1;
self.pacifistwait = 0.05;
self.ignoresuppression = 1;
origins = [];
origins[origins.size] = getent( "shrek_1_orig", "targetname" );
origins[origins.size] = getent( "shrek_2_orig", "targetname" );
origins[origins.size] = getent( "shrek_3_orig", "targetname" );
origins[origins.size] = getent( "shrek_4_orig", "targetname" );
self.a.rockets = 7;
self waittill( "goal" );
while( 1 )
{
// dont fire further up the street until flag has been set (flag set on a trigger)
if( flag( "chain_street_left_1" ) || flag( "chain_street_right_1" ) )
{
self SetEntityTarget( origins[ randomint( origins.size ) ] );
}
else
{
self SetEntityTarget( origins[ randomint( 2 ) ] );
}
wait( RandomIntRange( 10, 13 ) );
self ClearEntityTarget();
if( !self.a.rockets )
{
break;
}
wait( 0.5 );
}
goal = getnode( "node_shrek_goto_die", "targetname" );
self setgoalnode( goal );
self waittill( "goal" );
self delete();
}
///////////////////
//
// if all axis near asylum entrance are cleared, move up friendlies
//
///////////////////////////////
chain_near_asylum()
{
// notify from flag on trigger
level endon( "asylum_start" );
waittill_aigroupcount( "last_street_ai", 3 );
waittill_aigroupcleared( "last_street_mg" );
killspawner_trig = getent( "trig_killspawner_164", "targetname" );
if( isdefined( killspawner_trig ) )
{
killspawner_trig notify( "trigger" );
}
color_trig = getent( "chain_near_asylum", "targetname" );
if( isdefined( color_trig ) )
{
quick_text( "chain_near_asylum" );
color_trig notify( "trigger" );
}
}
///////////////////
//
// if all axis near street area 1 are cleared, move up friendlies
//
///////////////////////////////
chain_street_right_1()
{
// notify from flag on trigger
level endon( "asylum_start" );
waittill_aigroupcount( "street_right_ai_0", 2 );
wait( randomfloatrange( 0.75, 1.75 ) );
color_trig = getent( "chain_street_1a", "targetname" );
if( isdefined( color_trig ) )
{
quick_text( "chain_street_1a" );
color_trig notify( "trigger" );
}
// some spawners that should get triggered
spawn_trig = getent( "trig_roof_shreks", "targetname" );
if( isdefined( spawn_trig ) )
{
spawn_trig notify( "trigger" );
}
waittill_aigroupcleared( "street_right_ai_1" );
wait( randomfloatrange( 0.75, 1.75 ) );
// color chain
color_trig = getent( "chain_street_right_1", "targetname" );
if( isdefined( color_trig ) )
{
quick_text( "chain_street_right_1" );
color_trig notify( "trigger" );
}
// some spawners that should get triggered
spawn_trig = getent( "trig_spawn_street_guys_late", "script_noteworthy" );
if( isdefined( spawn_trig ) )
{
spawn_trig notify( "trigger" );
}
wait( 7 );
spawn_trig = getent( "trig_spawn_street_guys_late_2", "script_noteworthy" );
if( isdefined( spawn_trig ) )
{
spawn_trig notify( "trigger" );
}
}
///////////////////
//
// if all axis near street area 2 are cleared, move up friendlies
//
///////////////////////////////
chain_street_right_2()
{
// notify from flag on trigger
level endon( "asylum_start" );
waittill_aigroupcleared( "street_right_ai_2a" );
waittill_aigroupcount( "street_right_ai_2", 2 );
wait( randomfloatrange( 0.75, 1.75 ) );
color_trig = getent( "chain_street_2", "targetname" );
if( isdefined( color_trig ) )
{
quick_text( "chain_street_2" );
color_trig notify( "trigger" );
}
// delete some earlier chains if not hit yet
old_color_trig = getent( "chain_street_right_1", "targetname" );
if( isdefined( old_color_trig ) )
{
old_color_trig delete();
}
old_color_trig = getent( "chain_street_left_1", "targetname" );
if( isdefined( old_color_trig ) )
{
old_color_trig delete();
}
}
///////////////////
//
// if all axis near street-left-1 area are cleared, move up friendlies
//
///////////////////////////////
chain_street_left_1()
{
// notify from flag on trigger
level endon( "asylum_start" );
// notify from script_notify on trigger
level endon( "end_chain_street_left_1" );
waittill_aigroupcleared( "street_left_ai_1" );
wait( randomfloatrange( 0.75, 1.75 ) );
// color chain
color_trig = getent( "chain_street_left_1", "targetname" );
if( isdefined( color_trig ) )
{
quick_text( "chain_street_left_1" );
color_trig notify( "trigger" );
}
// some spawners that should get triggered
spawn_trig = getent( "trig_spawn_street_guys_left_1", "script_noteworthy" );
if( isdefined( spawn_trig ) )
{
spawn_trig notify( "trigger" );
}
bookcase_trig = getent( "trig_close_to_bookcase", "targetname" );
if( isdefined( bookcase_trig ) )
{
bookcase_trig notify( "trigger" );
}
}
///////////////////
//
// if all axis near street-left-2 area are cleared, move up friendlies
//
///////////////////////////////
chain_street_left_2()
{
// notify from flag on trigger
level endon( "asylum_start" );
// notify from script_notify on trigger
level endon( "end_chain_street_left_2" );
waittill_aigroupcount( "street_left_ai_2", 2 );
wait( randomfloatrange( 0.75, 1.75 ) );
quick_text( "chain_street_left_2" );
// // color chain
// color_trig = getent( "chain_street_left_1", "targetname" );
// if( isdefined( color_trig ) )
// {
// color_trig notify( "trigger" );
// }
// some spawners that should get triggered
spawn_trig = getent( "trig_asylum_entryway_spawners", "script_noteworthy" );
if( isdefined( spawn_trig ) )
{
spawn_trig notify( "trigger" );
}
waittill_aigroupcount( "last_street_ai", 8 );
spawn_trig = getent( "trig_last_yard_floodspawners", "script_noteworthy" );
if( isdefined( spawn_trig ) )
{
spawn_trig notify( "trigger" );
}
}
///////////////////
//
// animation of guy pushing over bookcase for cover
//
///////////////////////////////
bookcase_push()
{
// wait till near the pub
trigger_wait( "trig_close_to_bookcase", "targetname" );
// pushes over bookcase if player doesn't look at the lookat trigger but moves far ahead enough
level thread trig_override( "trig_lookat_bookcase" );
// wait for player to look at the bookcase area
trigger_wait( "trig_lookat_bookcase", "targetname" );
simple_spawn_single( "pub_bookcase_spawner", ::pub_bookcase_strat );
// Wii optimizations
if( !level.wii)
{
simple_spawn_single( "extra_bookcase_guy", ::extra_bookcase_strat );
}
}
pub_bookcase_strat()
{
self endon( "death" );
self.goalradius = 30;
self.animname = "street";
anim_node = getent( "orig_pub_bookcase", "targetname" );
anim_reach_solo( self, "bookcase_push", undefined, anim_node );
// clip brush turn on
bookcase_clip_brush = getent( "pub_bookcase_brush", "targetname" );
bookcase_clip_brush solid();
self.a.pose = "crouch";
flag_set( "bookcase_push_starting" );
self setcandamage( false );
anim_single_solo( self, "bookcase_push", undefined, anim_node );
self setcandamage( true );
flag_set( "bookcase_pushed_over" );
goal_node = getnode( "node_bookcase_goto", "targetname" );
self setgoalnode( goal_node );
wait( 5 );
self.goalradius = 250;
}
///////////////////
//
// 2nd bookcase guy
//
///////////////////////////////
extra_bookcase_strat()
{
self endon( "death" );
self.goalradius = 20;
flag_wait_or_timeout( "bookcase_push_starting", 5 );
original_pusher = get_specific_single_ai( "bookcase_ai" );
// if bookcase pushed over already, take cover behind it
if( isdefined( original_pusher ) && isalive( original_pusher ) )
{
goal = getnode( "node_bookcase_goto_2", "targetname" );
self setgoalnode( goal );
self waittill( "goal" );
self.goalradius = 60;
}
// or if the pusher has been killed, push it over yourself
else
{
self thread pub_bookcase_strat();
}
}
///////////////////
//
// play anim of cafe wall crumbling
//
///////////////////////////////
cafe_wall_crumble()
{
vnode = getvehiclenode( "auto3542", "targetname" );
vnode waittill( "trigger" );
waittillframeend;
// animate all the wall pieces
org_node = getNode("cafe_wall_node", "targetname");
pieces = getEntArray("tank_wall", "targetname");
for (i = 0; i < pieces.size; i++)
{
pieces[i] notsolid();
pieces[i] connectpaths();
}
getent( "delete_chunk","targetname" ) connectpaths();
getent( "delete_chunk","targetname" ) delete();
playfx(level._effect["tank_thru_cafe_wall"], org_node.origin + (0,0,54), anglestoforward(org_node.angles - (0,90,0)));
//client notify for Kevins audio
SetClientSysState("levelNotify","tank_wall_sound");
level maps\_anim::anim_ents(pieces, "crumble", undefined, undefined, org_node, "cafe_wall");
autosave_by_name( "Ber1 cafe crumble" );
set_flags_on_street_triggers();
level thread event2_split_squad();
simple_floodspawn( "street_right_spawners_1" );
// Wii optimizations
if( !level.wii && !NumRemoteClients())
{
// start ambient drones
drone_trig = getent( "street_drones_1", "script_noteworthy" );
drone_trig notify( "trigger" );
}
}
///////////////////
//
// sets some flags on triggers that can't be setup to use script_flag automatically through radiant
//
///////////////////////////////
set_flags_on_street_triggers()
{
trig = getent( "chain_street_right_1", "targetname" );
level thread set_flag_on_trigger( trig, "chain_street_right_1" );
trig = getent( "chain_street_left_1", "targetname" );
level thread set_flag_on_trigger( trig, "chain_street_left_1" );
trig = getent( "trig_last_yard_floodspawners", "script_noteworthy" );
level thread set_flag_on_trigger( trig, "last_yard_floodspawners" );
}
///////////////////
//
// the wall between the street and yard that the panzershrek blows open
//
///////////////////////////////
panzershrek_hits_wall()
{
trigger_wait( "trig_spawn_street_guys_late", "script_noteworthy" );
panzershrek_2_spawn = getstruct( "ps2_spawn", "targetname" );
low_wall = getstruct( "ps2_target", "targetname" );
level thread fire_shrecks( panzershrek_2_spawn, low_wall, undefined, "rpg_impact_boom", 1 );
//panzershrek_2_spawn playsound( "weap_pnzr_fire" );
wait( 1 );
playfx( level._effect["asylum_wall_explode"], low_wall.origin );
playSoundAtPosition( "concrete_wall_explo", low_wall.origin );
exploder( 103 );
//wait randomfloatrange(1.5, 2);
//thread fire_shrecks(panzershrek_2_spawn, gate, undefined, "iron_gate_explo", 1);
//ps1_spawn playsound("weap_pnzr_fire");
//wait 1;
//gate_clip connectpaths();
//waittillframeend;
//gate_clip delete();
//gate maps\ber1_anim::asylum_grounds_gate_open();
//gate_clip2 solid();
}
///////////////////
//
// split the squad to move through the asylum street and grounds simultaneously
//
///////////////////////////////
event2_split_squad()
{
set_color_chain( "courtyard_squad_split" );
allies = getaiarray( "allies" );
for (i = 0; i < allies.size; i++)
{
// if is an even number of the array
if (i % 2 == 0)
{
allies[i] set_force_color("r");
}
else // odd
{
allies[i] set_force_color("c");
}
}
}
///////////////////
//
// piggybacking autosaves onto other triggers, to save entities
//
///////////////////////////////
save_mid_yard()
{
trigger_wait( "trig_save_mid_yard", "script_noteworthy" );
autosave_by_name( "Ber1 mid yard" );
}
///////////////////
//
// piggybacking autosaves onto other triggers, to save entities
//
///////////////////////////////
save_asylum_entry()
{
trigger_wait( "trig_save_asylum_entry", "script_noteworthy" );
autosave_by_name( "Ber1 asylum entry" );
}
///////////////////
//
// spawn these manually when the event starts, to save on entities at load time
//
///////////////////////////////
spawn_street_pickup_weapons()
{
street_weapons = [];
street_weapons[0] = spawnstruct();
street_weapons[0].weapon_name = "weapon_panzerschrek";
street_weapons[0].origin = (3169.9, 1566.6, -382.5);
street_weapons[0].angles = (287.17, 355.56, -50.1497);
street_weapons[1] = spawnstruct();
street_weapons[1].weapon_name = "weapon_panzerschrek";
street_weapons[1].origin = (3169.9, 1526.6, -382.5);
street_weapons[1].angles = (287.17, 355.56, -50.1497);
spawn_pickup_weapons( street_weapons );
}