This is a sub-page of Proto:Call of Duty 4: Modern Warfare (Windows)/Build 253.
#include maps\_utility;
#include maps\_anim;
#include maps\mo_tools;
main()
{
maps\descent_fx::main();
maps\_blackhawk::main("vehicle_blackhawk");
maps\_load::main();
maps\descent_anim::main();
maps\mo_globals::main("descent");
maps\mo_fastrope::main();
level thread maps\descent_amb::main();
flag_init("floor2_pipehall_go");
flag_init("floor3_kitchen_doorkicked");
flag_init("insite_of_elevator");
flag_init("random_events_hole");
flag_init("random_events_inner");
flag_init("move_on_to_pipehall");
level.xenon = false;
if (isdefined( getdvar("xenonGame") ) && getdvar("xenonGame") == "true" )
level.xenon = true;
jumptoInit();
playerInit();
misc_precacheInit();
misc_radiusInit();
thread objective_main();
thread random_event_main();
misc_soundDebug();
if(level.soundDebug != "none")
return;
switch(level.jumptoFL)
{
case "NA":{}
case "1": thread floor1_main();
case "2": thread floor2_main();
case "3": thread floor3_main();
case "4": thread floor4_main();
}
jumptoThink();
thread playerFall();
}
misc_soundDebug()
{
if (getdvar("debug_sound") == "")
setdvar("debug_sound", "");
if (!isdefined(getdvar ("debug_sound")))
setdvar ("debug_sound", "");
string1 = getdvar("debug_sound");
if(!(isdefined(string1) && string1 != ""))
{
level.soundDebug = "none";
return;
}
level.soundDebug = string1;
if(issubstr("screams", string1))
random_event_lock("quake", "script_noteworthy");
flag_set("random_events_hole");
flag_set("random_events_inner");
trig = getent("floor2_stairs_start","targetname");
trig notify("trigger");
}
misc_radiusInit()
{
trigs = getentarray("trigger_radius","classname");
array_thread(trigs, ::misc_radiusHandle);
}
misc_radiusHandle()
{
if(!isdefined(self.script_color_allies) && !isdefined(self.script_color_axis) && !(isdefined(self.script_noteworthy) && self.script_noteworthy == "friendly_spawner") )
return;
self waittill("trigger");
wait .05;
self.origin += (0, 0, -100000);
if ( isDefined( self.realOrigin ) )
self.realOrigin = self.origin;
}
misc_precacheInit()
{
precacheModel("defaultactor");
precacheModel("vehicle_mig29_desert");
level.strings["obj_alassad"] = &"DESCENT_OBJ_ALASSAD";
level.strings["obj_photo_backhall"] = &"DESCENT_OBJ_PHOTO_BACKHALL";
level.strings["obj_photo_bathroom"] = &"DESCENT_OBJ_PHOTO_BATHROOM";
level.strings["obj_photo_dropdown"] = &"DESCENT_OBJ_PHOTO_DROPDOWN";
level.strings["obj_photo_final"] = &"DESCENT_OBJ_PHOTO_FINAL";
level.strings["obj_photo_prison"] = &"DESCENT_OBJ_PHOTO_PRISON";
level.strings["obj_photo_stairs"] = &"DESCENT_OBJ_PHOTO_STAIRS";
level.strings["obj_secure"] = &"DESCENT_OBJ_SECURE";
level.strings["obj_detpack"] = &"DESCENT_OBJ_DETPACK";
level.strings["hint_fastrope"] = &"DESCENT_HINTSTR_FASTROPE";
level.strings["hint_camera_out"] = &"DESCENT_HINTSTR_CAMERA_OUT";
level.strings["hint_camera_click"] = &"DESCENT_HINTSTR_CAMERA_CLICK";
level.strings["intro1"] = &"DESCENT_TITLE";
level.strings["intro2"] = &"DESCENT_DATE";
level.strings["intro3"] = &"DESCENT_PLACE";
level.strings["intro4"] = &"DESCENT_INFO";
precacheString(level.strings["obj_alassad"]);
precacheString(level.strings["obj_photo_backhall"]);
precacheString(level.strings["obj_photo_bathroom"]);
precacheString(level.strings["obj_photo_dropdown"]);
precacheString(level.strings["obj_photo_final"]);
precacheString(level.strings["obj_photo_prison"]);
precacheString(level.strings["obj_photo_stairs"]);
precacheString(level.strings["obj_secure"]);
precacheString(level.strings["obj_detpack"]);
precacheString(level.strings["hint_fastrope"]);
precacheString(level.strings["hint_camera_out"]);
precacheString(level.strings["hint_camera_click"]);
precacheString(level.strings["intro1"]);
precacheString(level.strings["intro2"]);
precacheString(level.strings["intro3"]);
precacheString(level.strings["intro4"]);
}
playerFall()
{
while(1)
{
thread playerFallLogic();
level waittill("player_fall_on");
}
}
playerFallLogic()
{
level notify("player_fall_off");
level endon("player_fall_off");
fallspeed = 50;
height = level.player.origin[2];
while(1)
{
newheight = level.player.origin[2];
if( (height - newheight) > fallspeed )
{
thread playerFallDeath();
break;
}
height = newheight;
wait .1;
}
}
playerFallDeath()
{
level.player thread play_sound_on_entity("descent_ge1_yell");
while(1)
{
level.player waittill("damage", dmg, other);
if((isdefined(other.classname) && other.classname == "worldspawn"))
break;
}
level.player enableHealthShield( false );
level.player dodamage(level.player.health + 100000, level.player.origin);
level.player enableHealthShield( true );
}
playerInit()
{
level.player takeAllWeapons();
level.player giveWeapon("USP");
level.player giveWeapon("m4_grunt");
level.player giveWeapon("fraggrenade");
level.player switchToWeapon("m4_grunt");
thread playerAmmo();
}
playerAmmo()
{
while (1)
{
currentweapon = level.player getCurrentWeapon();
currentammo = level.player getFractionMaxAmmo(currentweapon);
if (currentammo < .2)
level.player giveMaxAmmo(currentweapon);
wait 5;
}
}
/************************************************************************************************************************************/
/************************************************************************************************************************************/
/* OBJECTIVE LOGIC */
/************************************************************************************************************************************/
/************************************************************************************************************************************/
objective_camera(name, final)
{
trig = level.obj_camera[name];
trig objective_camera_dialog_introduce();
level notify("objective_camera_" + name);
trig thread objective_camera_on();
objective_string(1, level.strings["obj_photo_" + name]);
objective_position(1, trig getorigin());
trig thread objective_camera_dialog_nag();
trig thread objective_camera_dialog_correct();
trig waittill("objective_done");
wait 1;
trig play_sound_on_entity("descent_ge1_datareceived");
wait 3;
if(!isdefined(final))
{
rand = randomint(2);
switch(rand)
{
case 0:{ trig play_sound_on_entity("descent_ge1_negativeguy"); }break;
case 1:{ trig play_sound_on_entity("descent_ge1_facialscan"); }break;
//case 2:{ trig play_sound_on_entity("descent_ge1_nothim"); }break;
}
wait .5;
trig thread play_sound_on_entity("descent_ge1_letsgo");
objective_string(1, level.strings["obj_alassad"]);
objective_position(1, level.objective_position["obj_alassad"]);
}
else
{
trig play_sound_on_entity("descent_ge1_positivescan");
objective_string_nomessage(1, level.strings["obj_alassad"]);
objective_state(1, "done");
}
autosave_by_name("objective_camera_" + name);
}
objective_camera_dialog_nag()
{
self endon("objective_done");
self endon("click");
self.nagrand = 1;
rand = 0;
while(1)
{
wait 15;
while(1)
{
rand = randomint(2);
if(rand != self.nagrand)
break;
wait .05;
}
self.nagrand = rand;
switch(rand)
{
case 0:{ self play_sound_on_entity("descent_ge4_comeonman"); }break;
case 1:{ self play_sound_on_entity("descent_ge4_whatthehell"); }break;
}
}
}
objective_camera_dialog_correct()
{
self endon("objective_done");
self.correctrand = 0;
rand = 0;
while(1)
{
self waittill("click");
wait .25;
while(1)
{
rand = randomint(3);
if(rand != self.correctrand)
break;
wait .05;
}
self.correctrand = rand;
switch(rand)
{
case 0:{ self play_sound_on_entity("descent_ge4_nohisface"); }break;
case 1:{ self play_sound_on_entity("descent_ge4_identifyboots"); }break;
case 2:{ self play_sound_on_entity("descent_ge4_zoomonface"); }break;
}
}
}
objective_camera_dialog_introduce()
{
rand = randomint(4);
switch(rand)
{
case 0:{ self play_sound_on_entity("descent_ge4_takepicture"); }break;
case 1:{ self play_sound_on_entity("descent_ge4_mightbehim"); }break;
case 2:{ self play_sound_on_entity("descent_ge4_bealassad"); }break;
case 3:{ self play_sound_on_entity("descent_ge4_foundsomebody"); }break;
}
}
objective_camera_on()
{
org = self getorigin();
dist = 128;
check = dist * dist;
while(distancesquared(level.player.origin, org) > check)
wait .1;
hint = hint_create(level.strings["hint_camera_out"]);
self thread objective_camera_off(hint);
self thread objective_camera_click(hint);
}
objective_camera_click(hint)
{
hint endon("left_area");
while( !(level.player useButtonPressed()) )
wait .05;
playerWeaponTake();
hint hint_delete();
playerCameraGive();
hint = hint_create(level.strings["hint_camera_click"]);
self thread objective_camera_off(hint);
hint endon("left_area");
while(1)
{
while( !(level.player attackButtonPressed()) )
wait .05;
play_sound_in_space("end_of_autoclip",level.player.origin);
self notify("click");
if(level.player islookingat(self))
break;
wait .05;
}
hint hint_delete();
playerCameraTake();
playerWeaponGive();
self notify("objective_done");
}
objective_camera_off(hint)
{
hint endon("death");
org = self getorigin();
dist = 256;
check = dist * dist;
while(distancesquared(level.player.origin, org) < check)
wait .1;
hint notify("left_area");
playerCameraTake();
playerWeaponGive();
thread objective_camera_on();
hint thread hint_delete();
}
playerCameraGive()
{
level.camera endon("take_away");
level.camera show();
level.camera.given = true;
level.camera.fov = getdvar("cg_fov");
thread playerCameraHold();
wait .5;
thread playerCameraZoom();
}
playerCameraHold()
{
level.camera endon("take_away");
while(1)
{
height = 60;
if(level.player getstance() == "crouch")
height = 40;
else if(level.player getstance() == "prone")
height = 12;
ang1 = level.player getplayerangles();
ang = level.player.angles;
forward2 = anglestoforward(ang1);
forward2 = vector_multiply(forward2, 20);
up = anglestoup(ang);
up = vector_multiply(up, height);
up2 = anglestoup(ang1);
up2 = vector_multiply(up2, -2);
org = (level.player.origin + up + forward2 + up2);
level.camera.angles = (ang1);
level.camera moveto(org, .12);
wait .05;
}
}
playerCameraZoom()
{
level.camera endon("take_away");
range = 0.0;
while(1)
{
while(!(level.player useButtonPressed()) )
{
if(range > 0)
range -= 5;
setsaveddvar("cg_fov", int(level.camera.fov) - (range));
wait .05;
}
if(range < 30)
range += 5;
setsaveddvar("cg_fov", int(level.camera.fov) - (range));
wait .05;
}
}
playerCameraTake()
{
if(!isdefined(level.camera.given))
return;
level.camera.givin = undefined;
level.camera notify("take_away");
level.camera hide();
level.camera unlink();
waittillframeend;
if( getdvar("cg_fov") != level.camera.fov )
setsaveddvar("cg_fov", level.camera.fov);
}
objective_camera_init()
{
level.camera = getent("player_camera","targetname");
level.camera hide();
obj = getentarray("objective_camera", "targetname");
level.obj_camera = [];
for(i=0; i<obj.size; i++)
level.obj_camera[obj[i].script_noteworthy] = obj[i];
}
objective_main()
{
objective_camera_init();
if(level.jumpto == "start")
wait 5;
objnum = 1;
objective_add(1, "active");
objective_string_nomessage(1, level.strings["obj_alassad"]);
if(level.jumpto != "start")
objective_current(1);
thread objective_move(level.jumpto, 1);
objnum++;
switch(level.jumpto)
{
case "start":{
node = getstruct("obj_pos_secure", "targetname");
objective_add(objnum, "active", level.strings["obj_secure"], node.origin);
objective_current(objnum);
level waittill("secured_landing_zone");
objective_state(objnum, "done");
objnum++;
trig = getentarray("floor1_start_breach", "script_noteworthy");//if the player already blew through the wall
if(trig.size)
{
objective_add(objnum, "active", level.strings["obj_detpack"], trig[0] getorigin());
objective_current(objnum);
array_wait(trig, "trigger", 0);
wait (trig[0].time);
objective_state(objnum, "done");
objnum++;
}
objective_current(1);
//objective_string(1, level.strings["obj_alassad"]);
}
case "office":{
thread objective_move("start", 1, "office");
}
case "bathroom":{
thread objective_move("start", 1, "bathroom");
}
case "loadingdock":{
}
case "road":{
}
case "gate":{
thread objective_move("road", 1, "gate");
}
case "food":{
}
case "dropdown":{
}
case "pipehall":{
}
case "airfilter":{
}
case "boiler":{
}
case "stairs":{
}
case "backhall":{
}
case "backhall2":{
thread objective_move("backhall5", 1, undefined, "floor3_new_route");
}
case "cafeteria":{
}
case "kitchen":{
}
case "shaft":{
thread objective_move("kitchen", 1,"shaft");
}
case "fubar":{
}
}
}
objective_move(name, objnum, check, msg)
{
if(isdefined(check) && level.jumpto != check)
return;
if(!isdefined(level.objective_position))
level.objective_position = [];
if(isdefined(msg))
level waittill(msg);
level notify("objective_move_" + objnum);
level endon("objective_move_" + objnum);
trig = getent("objective_move_" + name, "targetname");
while(isdefined(trig))
{
objective_position(objnum, trig.origin);
level.objective_position["obj_alassad"] = trig.origin;
trig waittill("trigger");
if(!isdefined(trig.target))
trig = undefined;
else
trig = getent(trig.target, "targetname");
}
}
/************************************************************************************************************************************/
/************************************************************************************************************************************/
/* JUMPTO LOGIC */
/************************************************************************************************************************************/
/************************************************************************************************************************************/
jumptoInit()
{
if (getdvar("jumpto") == "")
setdvar("jumpto", "");
if (!isdefined(getdvar ("jumpto")))
setdvar ("jumpto", "");
//skip to a point in the level
string1 = getdvar("start");
string2 = getdvar("jumpto");
level.jumptoFL = "NA";
level.jumpto = "start";
if(isdefined(string1) && string1 != "")
level.jumpto = string1;
if(isdefined(string2) && string2 != "")
level.jumpto = string2;
jumpnum = 1;
if(level.jumpto == "office" || level.jumpto == "" + jumpnum)
{ level.jumptoFL = "1"; level.jumpto = "office"; return; }
jumpnum++;
if(level.jumpto == "bathroom" || level.jumpto == "" + jumpnum)
{ level.jumptoFL = "1"; level.jumpto = "bathroom"; return; }
jumpnum++;
if(level.jumpto == "loadingdock" || level.jumpto == "" + jumpnum)
{ level.jumptoFL = "1"; level.jumpto = "loadingdock"; return; }
jumpnum++;
if(level.jumpto == "road" || level.jumpto == "" + jumpnum)
{ level.jumptoFL = "1"; level.jumpto = "road"; return; }
jumpnum++;
if(level.jumpto == "gate" || level.jumpto == "" + jumpnum)
{ level.jumptoFL = "1"; level.jumpto = "gate"; return; }
jumpnum++;
if(level.jumpto == "food" || level.jumpto == "" + jumpnum)
{ level.jumptoFL = "1"; level.jumpto = "food"; return; }
jumpnum++;
if(level.jumpto == "dropdown" || level.jumpto == "" + jumpnum)
{ level.jumptoFL = "1"; level.jumpto = "dropdown"; return; }
jumpnum++;
if(level.jumpto == "pipehall" || level.jumpto == "floor2" || level.jumpto == "" + jumpnum)
{ level.jumptoFL = "2"; level.jumpto = "pipehall"; return; }
jumpnum++;
if(level.jumpto == "airfilter" || level.jumpto == "" + jumpnum)
{ level.jumptoFL = "2"; level.jumpto = "airfilter"; return; }
jumpnum++;
if(level.jumpto == "boiler" || level.jumpto == "" + jumpnum)
{ level.jumptoFL = "2"; level.jumpto = "boiler"; return; }
jumpnum++;
if(level.jumpto == "stairs" || level.jumpto == "" + jumpnum)
{ level.jumptoFL = "2"; level.jumpto = "stairs"; return; }
jumpnum++;
if(level.jumpto == "backhall" || level.jumpto == "floor3" || level.jumpto == "" + jumpnum)
{ level.jumptoFL = "3"; level.jumpto = "backhall"; return; }
jumpnum++;
if(level.jumpto == "backhall2" || level.jumpto == "" + jumpnum)
{ level.jumptoFL = "3"; level.jumpto = "backhall2"; return; }
jumpnum++;
if(level.jumpto == "cafeteria" || level.jumpto == "" + jumpnum)
{ level.jumptoFL = "3"; level.jumpto = "cafeteria"; return; }
jumpnum++;
if(level.jumpto == "kitchen" || level.jumpto == "" + jumpnum)
{ level.jumptoFL = "3"; level.jumpto = "kitchen"; return; }
jumpnum++;
if(level.jumpto == "shaft" || level.jumpto == "elevator" || level.jumpto == "" + jumpnum)
{ level.jumptoFL = "3"; level.jumpto = "shaft"; return; }
jumpnum++;
if(level.jumpto == "fubar" || level.jumpto == "floor4" || level.jumpto == "" + jumpnum)
{ level.jumptoFL = "4"; level.jumpto = "fubar"; return; }
jumpnum++;
}
jumptoThink()
{
jumptoRandomTrig(level.jumpto);
trig = [];
on = getent("random_quake_on","targetname"); //inner random events
on.jumptoRandomType = "trigger";
off = getent("floor1_dummies2_trig","targetname");
off.jumptoRandomType = "off";
switch(level.jumpto)
{
case "bathroom":{
trig = array_add(trig, off);
trig[trig.size] = getent("floor1_office_backup", "targetname");
trig[trig.size-1].jumptoRandomType = "off";
trig[trig.size] = getentarray("floor1_start_breach", "script_noteworthy")[0];
trig[trig.size-1].jumptoRandomType = "trigger";
}
case "office":{
trig = array_add(trig, off);
trig[trig.size] = getent("floor1_intro_runners", "target");
trig[trig.size-1].jumptoRandomType = "off";
trig[trig.size] = getent("floor1_intro_enemy_trig", "targetname");
trig[trig.size-1].jumptoRandomType = "off";
trig = array_combine(trig, getentarray("auto2164","targetname"));
}break;
case "loadingdock":{
trig = array_add(trig, off);
trig = array_combine(trig, getentarray("auto29","targetname"));
}break;
case "road":{
trig = array_add(trig, on);
trig = array_add(trig, off);
trig = array_combine(trig, getentarray("auto28","targetname"));
}break;
case "gate":{
trig = array_add(trig, on);
trig = array_add(trig, off);
trig = array_combine(trig, getentarray("auto53","targetname"));
}break;
case "food":{
trig = array_add(trig, on);
trig = array_add(trig, off);
trig = array_combine(trig, getentarray("auto75","targetname"));
}break;
case "dropdown":{
trig = array_add(trig, on);
trig = array_add(trig, off);
trig = array_combine(trig, getentarray("auto81","targetname"));
}break;
case "pipehall":{
trig = array_add(trig, off);
}break;
case "airfilter":{
trig = array_add(trig, on);
trig = array_combine(trig, getentarray("auto315","targetname"));
}break;
case "boiler":{
trig = array_add(trig, on);
trig = array_combine(trig, getentarray("floor2_airfilter_start","targetname"));
}break;
case "stairs":{
trig = array_add(trig, on);
trig = array_combine(trig, getentarray("auto362","targetname"));
}break;
case "backhall":{
trig = array_add(trig, on);
trig = array_combine(trig, getentarray("floor2_stairs_start","targetname"));
}break;
case "backhall2":{
trig = array_add(trig, on);
trig = array_combine(trig, getentarray("floor2_stairs_start","targetname"));
}break;
case "cafeteria":{
trig = array_add(trig, on);
trig[trig.size] = getent("auto216", "targetname");//door to the gameroom area that needs to open
trig[trig.size-1].jumptoRandomType = "open";
trig = array_combine(trig, getentarray("auto185","targetname"));
}break;
case "kitchen":{
trig = array_add(trig, on);
}break;
case "shaft":{
trig = array_add(trig, on);
trig = array_combine(trig, getentarray("floor3_kitchen_spawner","targetname"));
}break;
case "fubar":{
trig = array_add(trig, on);
trig = array_combine(trig, getentarray("floor4_elevatorguys","targetname"));
}break;
}
array_thread(trig, ::jumptoRandomTrigThink);
if(level.jumpto != "start")
flag_set("random_events_inner");
node = getstruct(("jumpto_" + level.jumpto), "targetname");
if(!isdefined(node))
return;
level.player setorigin (node.origin + (0,0,32));
level.player setplayerangles (node.angles);
}
jumptoRandomTrig(name)
{
array = getentarray("jumptoRandomTrig", "script_noteworthy");
for(i=0;i<array.size;i++)
{
attr = strtok(array[i].script_parameters, ":;, ");
for(j=0;j<attr.size; j++)
{
if(attr[j] == name)
{
array[i].jumptoRandomType = tolower(attr[j+1]);
array[i] thread jumptoRandomTrigThink();
break;
}
}
}
}
jumptoRandomTrigThink()
{
if(self.classname != "trigger_multiple" && self.classname != "trigger_radius" && (!isdefined(self.jumptoRandomType)) )
return;
if(!isdefined(self.jumptoRandomType))
self.jumptoRandomType = "trigger";
switch(self.jumptoRandomType)
{
case "trigger": {wait .1; self notify("trigger"); }break;
case "off": {self trigger_off(); }break;
case "open": {self door_breach_door(); }break;
}
}
/************************************************************************************************************************************/
/************************************************************************************************************************************/
/* *FLOOR 1* */
/************************************************************************************************************************************/
/************************************************************************************************************************************/
floor1_main()
{
switch(level.jumpto)
{
case "start":{
floor1_intro();
flag_set("random_events_inner");
floor1_intro_breach();
}
case "office":{
wait .1;
flag_set("random_events_hole");
floor1_office();
}
case "bathroom":{
thread floor1_bathroom_guy();
floor1_bathroom();
}
case "loadingdock":{
floor1_loadingdock();
}
case "road":{
floor1_road();
}
case "gate":{
floor1_gate();
}
case "food":{
thread floor1_food();
}
case "dropdown":{
floor1_dropdown();
}
}
}
floor1_bathroom_guy()
{
node = getnode("floor1_restroom_blocknode", "targetname");
spawner = getentarray("floor1_restroom_friendlies","target");
chain = getent("floor1_restroomdone_chain","targetname");
trig = getent("floor1_bathroom_start","targetname");
trig waittill("trigger");
guy = spawner[0] maps\mo_globals::friendly_spawner_think();
guy.ignoreme = true;
guy thread magic_bullet_shield();
guy pushplayer(true);
createThreatBiasGroup("bathroomguy");
guy setthreatbiasgroup("bathroomguy");
setignoremegroup("axis", "bathroomguy");
wait .5;
guy disable_ai_color();
guy setgoalnode(node);
guy.goalradius = node.radius;
chain waittill("trigger");
guy pushplayer(false);
guy.ignoreme = false;
guy notify("stop magic bullet shield");
guy enable_ai_color();
guy setthreatbiasgroup();
}
floor1_bathroom()
{
trig = getent("floor1_bathroom_start","targetname");
chain = getent("floor1_restroomdone_chain","targetname");
trig waittill("trigger");
wait .5;
ai = getaiarray("allies");
array_wait(ai, "goal", .5);
objective_camera("bathroom");
chain notify("trigger");
}
floor1_intro()
{
thread floor1_intro_fx();
thread floor1_intro_officer();
spwn = getentarray("floor1_intro_runners","targetname");
array_thread(spwn, ::floor1_intro_runners);
spawners = getentarray("intro_ally_dummies1","targetname");
array_thread(spawners, ::floor1_intro_dummies1);
spawners = getentarray("intro_ally_dummies2", "targetname");
array_thread(spawners, ::floor1_intro_dummies2);
//for clear dialogue
spwn = array_combine(spwn, getentarray("floor1_intro_enemy","targetname"));
temp = getent("floor1_dummies2_trig","targetname");
spwn = array_combine(spwn, getentarray(temp.target, "targetname"));
musicPlay("descent_intro_music");
//level thread maps\_introscreen::introscreen_delay(level.strings["intro1"], level.strings["intro2"], level.strings["intro3"], level.strings["intro4"], 2, 2, 1);
//player blackhawk repel shit
floor1_intro_player();
autosave_by_name("default");
thread play_sound_in_space("descent_ga1_theyreup", (1912, -408, -180));
ai = get_ai("floor1_intro_enemy", "axis", "script_noteworthy");
officer = get_ai("floor1_intro_officer", "axis", "script_noteworthy");
ai = array_combine(ai, officer);
for(i=0; i<ai.size; i++)
{
ai[i].suppressionwait = 0;
ai[i].anim_forced_cover = "show";
}
wait 2.5;
thread play_sound_in_space("descent_ga1_hurryup", (1920, 0, -116));
ai_clear_dialog(spwn);
thread floor1_events_handler();
}
floor1_intro_officer()
{
model = getent("floor2_objective_guy", "targetname");
spawner = getent("floor1_intro_officer","script_noteworthy");
guy = undefined;
model hide();
while(1)
{
spawner waittill("spawned", guy);
if(!spawn_failed(guy))
break;
}
guy waittill("death");
model show();
}
floor1_intro_fx()
{
ent = getstruct("intro_temp_explosions","targetname");
wait 5;
playfx(level._effect["exp_randomevent"], ent.origin, anglestoforward(ent.angles));
thread play_sound_in_space("bricks_exploding", ent.origin);
ent = getstruct(ent.target,"targetname");
wait 5;
playfx(level._effect["exp_randomevent"], ent.origin, anglestoforward(ent.angles));
thread play_sound_in_space("bricks_exploding", ent.origin);
ent = getstruct(ent.target,"targetname");
wait 2;
playfx(level._effect["exp_randomevent"], ent.origin, anglestoforward(ent.angles));
thread play_sound_in_space("bricks_exploding", ent.origin);
ent = getstruct(ent.target,"targetname");
wait 5;
playfx(level._effect["exp_randomevent"], ent.origin, anglestoforward(ent.angles));
thread play_sound_in_space("bricks_exploding", ent.origin);
ent = getstruct(ent.target,"targetname");
wait 15;
playfx(level._effect["exp_randomevent"], ent.origin, anglestoforward(ent.angles));
thread play_sound_in_space("bricks_exploding", ent.origin);
}
floor1_events_handler()
{
//the player has almost landed so lets turn the bottom half of the random events on...wait for the 2nd helicopter to pass by before turning the rest on
random_event_lock("flyby", "script_noteworthy");
random_event_lock("dropoff","script_noteworthy");
flag_set("random_events_hole");
heli = level.fastrope_globals.helicopters[maps\mo_fastrope::fastrope_heliname("intro_ally_dummies1")];
heli.vehicle waittill("going_home");
wait 2;
random_event_unlock("flyby","script_noteworthy");
random_event_unlock("dropoff","script_noteworthy");
}
floor1_intro_player()
{
trig = getent("intro_spawners","targetname");
temp = getentarray("intro_spawners", "target");
name = temp[0].targetname;
trig notify ("trigger");
wait .1;
heli = level.fastrope_globals.helicopters[maps\mo_fastrope::fastrope_heliname(name)];
wait .1;
level.player setplayerangles((30, 45, 0));
wait 1;
heli.model play_sound_on_entity("descent_plt_thirtyseconds");
wait 5;
heli.model play_sound_on_entity("descent_cop_intelreports");
heli.model play_sound_on_entity("descent_cop_yourobjective");
wait .75;
heli.model play_sound_on_entity("descent_jns_cameradetail");
wait 6;
heli.model play_sound_on_entity("descent_plt_fiveseconds");
heli.vehicle waittill("reached_wait_node");
heli.model play_sound_on_entity("descent_jns_letsdoit");
}
floor1_intro_breach2(chain)
{
chain2 = getent("floor1_office_chain", "script_noteworthy");
chain waittill("trigger");
level notify("secured_landing_zone");
chain2 waittill("trigger");
ai = getaiarray("axis");
for(i=0; i<ai.size; i++)
ai[i] delete();
}
floor1_intro_breach()
{
chain2 = getent("floor1_office_prechain","targetname");
chain = getent("intro_wallbreach_chain","targetname");
thread floor1_intro_breach2(chain2);
chain2 endon("trigger");
level waittill("ai_clear_dialog_done");
wait .25;
//play_sound_in_space("descent_ge3_exithallway", (1448, -712, 28));
play_sound_in_space("descent_cmd_badshape", (1448, -712, 28));
level notify("secured_landing_zone");
chain notify("trigger");
play_sound_in_space("descent_cmd_plantdetpack", (1472, -1024, 28));
}
floor1_intro_dummies2death()
{
self endon("survived");
org = self.origin;
self waittill("death");
ai = get_ai("floor1_intro_dummy2bad", "axis", "script_noteworthy");
if(ai.size)
ai[0] dodamage(ai[0].health + 200, org);
}
floor1_intro_dummies2()
{
guy = undefined;
trig = getent("floor1_dummies2_trig","targetname");
while(1)
{
self waittill("spawned", guy);
if(!spawn_failed(guy))
break;
}
wait .1;
self notify("death");//this gets him off the friendly logic
level.friendly_globals.cur_num--;
guy thread floor1_intro_dummies2death();
guy endon("death");
guy.health = guy.health * 2;
guy.baseaccuracy = 1;
trig waittill("trigger");
wait 1;
ai = get_ai("floor1_intro_dummy2bad", "axis", "script_noteworthy");
if(ai.size)
array_wait(ai, "death");
guy notify("survived");
node = getnode("floor1_intro_dummy2node","targetname");
guy set_forcegoal();
guy setgoalnode(node);
guy.goalradius = node.radius;
guy waittill("goal");
guy delete();
}
floor1_intro_dummies1()
{
guy = undefined;
while(1)
{
self waittill("spawned", guy);
if(!spawn_failed(guy))
break;
}
wait .1;
self notify("death");//this gets him off the friendly logic
level.friendly_globals.cur_num--;
guy endon("death");
guy waittill("goal");
guy delete();
}
floor1_intro_runners()
{
node = getnode(self.target, "targetname");
guy = undefined;
while(1)
{
self waittill("spawned", guy);
if(!spawn_failed(guy))
break;
}
guy.pathenemyfightdist = guy.pathenemyfightdist * 1.75;
guy.pathenemylookahead = guy.pathenemylookahead * 1.75;
guy.maxsightdistsqrd = guy.maxsightdistsqrd * 1.75;
//guy thread floor1_intro_runnersthink(node);
guy thread floor1_intro_runnersdelete();
}
floor1_intro_runnersthink(node)
{
self endon("death");
while(1)
{
set_forcegoal();
wait randomfloatrange(2, 4);
while(1)
{
if(self cansee(level.player))
break;
wait .5;
}
self setgoalpos(self.origin);
unset_forcegoal();
wait randomfloatrange(5,8);
self setgoalnode(node);
}
}
floor1_intro_runnersdelete()
{
self endon("death");
self waittill("goal");
self delete();
}
floor1_dropdown_allies()
{
node = getnode("floor2_dropdown_ally_goal","targetname");
clip = getent("floor2_dropdown_clip","targetname");
spawners = getentarray("dropdown_spawners","targetname");
trig = getent("dropdown2_friendlies","targetname");
wait 1;
while(level.floor2_dropdown_baddies)
level waittill("floor2_dropdown_baddies");
for(i=0; i<spawners.size; i++)
spawners[i] delete();
ai = getaiarray("allies");
org = (0,0,0);
clip notsolid();
clip connectpaths();
clip delete();
for(i=0; i<ai.size; i++)
{
if(isdefined(ai[i] get_force_color()) )
continue;
wait randomfloat(.5);
ai[i] thread floor1_dropdown_allies_think(node);
org = ai[i].origin;
}
if(flag("floor2_pipehall_go"))
return;
level endon("floor2_pipehall_go");
thread play_sound_in_space("descent_ge3_thanksfellas", (1500, -883, -271));
wait 2;
thread play_sound_in_space("descent_ge3_anytime", trig getorigin());
flag_set("move_on_to_pipehall");
trig notify("trigger");
}
floor1_dropdown_allies_think(node)
{
self setgoalnode(node);
self.goalradius = node.radius;
self endon("death");
self waittill("goal");
self delete();
}
floor1_dropdown_baddies()
{
while(1)
{
self waittill("spawned", guy);
if(!spawn_failed(guy))
break;
}
level.floor2_dropdown_baddies++;
guy waittill("death");
level.floor2_dropdown_baddies--;
level notify("floor2_dropdown_baddies");
}
floor1_dropdown_pipehallcheck()
{
trig = getent("floor2_pipehall_go","targetname");
trig waittill("trigger");
flag_set("floor2_pipehall_go");
ai = get_ai("floor2_dropdown_badies","axis","script_noteworthy");
for(i=0; i<ai.size; i++)
ai[i] dodamage(ai[i].health + 100, ai[i].origin);
}
floor1_dropdown()
{
trig = getent("dropdown_yellowspawners","targetname");
drop = getent("objective_move_dropdown2","targetname");
spawners = getentarray("dropdown_forcecolor_switch", "targetname");
baddies = getentarray("floor2_dropdown_badies","script_noteworthy");
forcethis = spawners;
temp = getentarray("dropdown_yellowspawners","target");
for(i=0; i<temp.size; i++)
{
if(isdefined(temp[i].script_parameters) && issubstr(temp[i].script_parameters, "hack_floor2specialguy") )
forcethis[forcethis.size] = temp[i];
}
level.floor2_dropdown_baddies = 0;
array_thread(baddies, ::floor1_dropdown_baddies);
thread floor1_dropdown_pipehallcheck();
thread floor1_dropdown_objective();
trig waittill("trigger");
level notify("player_fall_off");
thread play_sound_in_space("descent_ge3_troubledownthere", (1085, 228, 0));
thread floor1_dropdown_allies();
//wait for the fight to last 15 second or immediately if the trigger is hit
drop wait_timeout("trigger", 10);
if(flag("move_on_to_pipehall"))
return;
for(i=0; i<spawners.size; i++)
spawners[i] set_force_color("yellow");
for(i=0; i<forcethis.size; i++)
forcethis[i].force_this_color = "yellow";
ai = getaiarray("allies");
org = (0,0,0);
for(i=0; i<ai.size; i++)
{
if(isdefined(ai[i] get_force_color()) && ai[i] check_force_color("red") )
{
wait randomfloat(.5);
ai[i] set_force_color("yellow");
org = ai[i].origin;
}
}
thread play_sound_in_space("descent_ge1_letsgo", org);
}
floor1_dropdown_objective()
{
chain = getent("dropdown_chain","targetname");
trig = getent("food_done_chain","targetname");
trig waittill("trigger");
wait 1;
ai = get_ai("red", "allies", "script_forcecolor");
array_wait(ai, "goal", 0);
objective_camera("dropdown");
chain notify("trigger");
}
floor1_road()
{
trig = getent("floor1_road_backup","target");
spwn = getentarray(trig.target,"targetname");
spwn = array_combine(spwn, getentarray("floor1_road_enemies","targetname"));
trig waittill("trigger");
thread play_sound_in_space("descent_ga1_dirkadirka", (1587, -1836, 0));
ai_clear_dialog(spwn);
}
floor1_gate()
{
}
floor1_loadingdock()
{
flee = getent("loadingdock_flee","targetname");
trig = getent("loadingdock_start","targetname");
flee thread floor1_loadingdock_flee();
trig waittill ("trigger");
backup = getentarray("floor1_loadingdock_guys","targetname");
wait .25;
ai = getaiarray("axis");
floodspawner_switch(ai, backup);
level.loadingdockdeaths = 0;
array_thread(ai, ::floor1_loadingdock_death);
array_thread(backup, ::floor1_loadingdock_spwner);
flee endon("trigger");
while(level.loadingdockdeaths < 4)
level waittill("loadingdockdeath");
flee notify("trigger");
}
floor1_loadingdock_flee()
{
self waittill("trigger");
thread play_sound_in_space("descent_ga1_retreat", (2864, -1272, 28));
}
floor1_loadingdock_spwner()
{
self endon("death");
while(1)
{
self waittill("spawned", guy);
if(spawn_failed(guy))
continue;
guy thread floor1_loadingdock_death();
}
}
floor1_loadingdock_death()
{
self waittill("death");
level.loadingdockdeaths++;
level notify("loadingdockdeath");
}
floor1_food()
{
chain = getent("dropdown_chain","targetname");
trig = getent("food_enemycheck", "targetname");
spwn = getentarray("floor1_food_enemies", "targetname");
thread floor1_food_endchain(chain);
thread floor1_food_breach(chain);
trig waittill("trigger");
waittillframeend;
ai_clear_dialog(spwn, chain, "trigger");
}
floor1_food_breach(chain)
{
chain endon("trigger");
check = getent("floor1_food_breach_check","script_noteworthy");
trig = getent("floor1_food_enemies","target");
check waittill("trigger");
trig notify("trigger");
}
floor1_food_endchain(chain)
{
chain endon("trigger");
trig = getent("food_enemycheck", "targetname");
trig waittill("trigger");
axis = getaiarray("axis");
if(axis.size)
array_wait(axis, "death");
trig = getent("food_done_chain","targetname");
trig notify("trigger");
}
floor1_office()
{
thread floor1_office_breach();
trig = getent("floor1_office_backup", "targetname");
spwn = getentarray(trig.target, "targetname");
trig waittill("trigger");
waittillframeend;
ai_clear_dialog(spwn);
}
floor1_office_breach()
{
check = getent("office_breach_check","script_noteworthy");
trig = getentarray("floor1_office_breach", "script_noteworthy");
spwn = getent("floor1_office_backup", "targetname");
end = getent("loadingdock_start","targetname");
end endon("trigger");
array_wait(trig, "trigger", 0);
thread play_sound_in_space("descent_ga1_behindwall", (2208, -488, 28));
wait(trig[0].time);
spwn notify("trigger");
}
/************************************************************************************************************************************/
/************************************************************************************************************************************/
/* *FLOOR 2* */
/************************************************************************************************************************************/
/************************************************************************************************************************************/
floor2_main()
{
jumpto = level.jumpto;
if(level.jumptoFL != "2")
jumpto = "start";
switch(jumpto)
{
case "start":{
floor2_dropdown();
}
case "pipehall":{
floor2_pipehall();
}
case "airfilter":{
floor2_airfilter();
}
case "boiler":{
floor2_boiler();
}
case "stairs":{
floor2_stairs();
}
}
}
floor2_stairs()
{
chain = getent("floor1_stairsdone_chain","targetname");
trig = getent("stairs_dropin_friendlies","targetname");
trig waittill("trigger");
wait 1;
ai = getaiarray("allies");
array_wait(ai, "goal", 0);
objective_camera("stairs");
chain notify("trigger");
}
floor2_dropdown()
{
trig = getent("dropdown2_friendlies","targetname");
drop = getent("objective_move_dropdown2","targetname");
temp = getentarray("dropdown_yellowspawners","target");
forcethis = undefined;
for(i=0; i<temp.size; i++)
{
if(isdefined(temp[i].script_parameters) && issubstr(temp[i].script_parameters, "hack_floor2specialguy") )
forcethis = temp[i];
}
drop thread floor2_dropdown_playerfall();
drop waittill("trigger");
if(!flag("move_on_to_pipehall"))
trig waittill("trigger");
flag_set("move_on_to_pipehall");
ai = get_ai("yellow", "allies", "script_forcecolor");
for(i=0; i<ai.size; i++)
ai[i] set_force_color("red");
forcethis.force_this_color = "red";
}
floor2_dropdown_playerfall()
{
self waittill("trigger");
wait 1;
level notify("player_fall_on");
}
floor2_pipehall()
{
thread floor2_pipehall_killspawner();
trig = getent("floor2_pipehall_donechain","targetname");
trig waittill("trigger");
ai = getaiarray("allies");
for(i=0; i<ai.size; i++)
ai[i] set_force_color("red");
}
floor2_pipehall_killspawner()
{
start = getent("floor2_pipehall_enemies","target");
spwn = getentarray(start.target,"targetname");
trig = getent("floor2_pipehall_donechain","targetname");
trig endon("trigger");
start waittill("trigger");
waittillframeend;
ai_clear_dialog(spwn);
level waittill("ai_clear_dialog_done");
trig notify("trigger");
}
floor2_airfilter()
{
thread floor2_airfilter_wav2();
thread floor2_airfilter_wallbreach();
watch = getent("floor2_airfilter_watchleft","targetname");
flank = getent("floor2_airfilter_flankingus","targetname");
kill = getent("floor2_airfilter_wav2_trig","targetname");
trig = getent("floor2_airfilter_wav1","target");
flankers = getent("floor2_airfilter_flankers","targetname");
trig waittill("trigger");
wait 1;
thread play_sound_in_space("descent_ga1_downthere", (2008, 1808, -180));
wait randomfloatrange(2, 3);
thread play_sound_in_space("descent_ge1_flankem", trig.origin);
flankers notify("trigger");
kill endon("trigger");
watch waittill("trigger");
thread play_sound_in_space("descent_ge3_leftside", (1264, 1712, -264));
flank waittill("trigger");
thread play_sound_in_space("descent_ge3_flankingus", (1502, 1760, -244));
}
floor2_airfilter_wallbreach()
{
kill = getent("floor2_airfilter_wav2_trig","targetname");
trig = getent("floor2_airfilter_flank_chain", "targetname");
right = getent("floor2_airfilter_comingright","targetname");
kill endon("trigger");
trig waittill("trigger");
thread play_sound_in_space("descent_ge3_leftflank", trig.origin);
right waittill("trigger");
thread play_sound_in_space("descent_ga1_comingright", (2008, 1808, -180));
}
floor2_airfilter_wav2()
{
trig = getent("floor2_airfilter_wav2_trig","targetname");
backup = getentarray("floor2_airfilter_wav2", "targetname");
trig waittill("trigger");
axis = get_ai("floor2_airfilter_wav1", "axis", "script_noteworthy");
floodspawner_switch(axis, backup);
}
floor2_boiler()
{
chain = getent("floor2_boiler_done","targetname");
kill = getent("floor2_boiler_killspawner","targetname");
spwn = getentarray("floor2_boiler_wav3","targetname");
spwn = array_combine(spwn, getentarray("floor2_airfilter_wav2", "targetname"));
kill waittill("trigger");
ai = get_ai("floor2_airfilter_lowerguys","axis","script_noteworthy");
for(i=0; i< ai.size; i++)
ai[i] delete();
waittillframeend;
ai_clear_dialog(spwn);
level waittill("ai_clear_dialog_done");
chain notify("trigger");
}
/************************************************************************************************************************************/
/************************************************************************************************************************************/
/* *FLOOR 3* */
/************************************************************************************************************************************/
/************************************************************************************************************************************/
floor3_main()
{
jumpto = level.jumpto;
if(level.jumptoFL != "3")
jumpto = "start";
switch(jumpto)
{
case "start":{
}
case "backhall":{
floor3_backhall();
}
case "backhall2":{
floor3_backhall2();
}
case "cafeteria":{
floor3_cafeteria();
}
case "kitchen":{
floor3_kitchen();
}
case "shaft":{
thread floor3_elevator_jumpto();
floor3_elevator();
}
}
}
floor3_elevator_jumpto()
{
if(level.jumpto!= "shaft")
return;
wait .1;
endnodes = getnodearray("elevator_waitnodes","targetname");
ai = getaiarray("allies");
for(i=0; i<ai.size; i++)
{
ai[i] setgoalnode( endnodes[i]);
ai[i].goalradius = endnodes[i].radius;
ai[i] disable_ai_color();
}
}
floor3_elevator()
{
trig = getentarray("elevator_repel","targetname");
trig[0] setHintString(level.strings["hint_fastrope"]);
trig = array_add(trig, getent(trig[0].target, "targetname"));
check1 = getent("floor3_player_closetoelevator","targetname");
check2 = getent("floor3_player_insiteelevator","targetname");
node = getnode(check2.target, "targetname");
ent = getstruct(node.target, "targetname");
maps\mo_fastrope::fastrope_calc(ent);
check1 waittill("trigger");
ai = getaiarray("allies");
array_thread(ai, ::floor3_elevator_think, node);
check2 waittill("trigger");
flag_set("insite_of_elevator");
array_wait(trig, "trigger", 0);
player_fastrope_go(ent);
level.player unlink();
}
floor3_elevator_think(node)
{
/*
ent = undefined;
ent = getstruct(name, "target");
//is it a node?
if(! (isdefined(ent.script_noteworthy) && ent.script_noteworthy == "fastrope_friendly_vehicle") )
{
struct = undefined;
//if so does it exist already?
struct = level.friendly_globals.fastrope_nodes[("node_" + name)];
//if we find it - then it's a node we've already made
if(isdefined(struct))
return struct;
//otherwise lets make it
struct = spawnstruct();
struct.origin = ent.origin;
struct.angles = ent.angles;
struct.targetname = ("node_" + name);
struct.target = ent.target;
struct.fastrope_que = [];
struct friendly_fastrope_calc(ent);
level.friendly_globals.fastrope_nodes[struct.targetname] = struct;
return struct;
}
*/
ent = getstruct(node.target, "targetname");
self pushplayer(true);
if(!isdefined(ent.fastrope_que))
ent.fastrope_que = [];
index = ent.fastrope_que.size;
ent.fastrope_que[ent.fastrope_que.size] = self;
while(ent.fastrope_que[0] != self)
ent waittill("check_fastrope_que");
//run to the node
self setgoalnode(node);
self.goalradius = node.radius;
self thread floor3_elevator_think2(ent, index);
flag_wait("insite_of_elevator");
//get the guys behind you movin
waittillframeend;
ent.fastrope_que = array_remove(ent.fastrope_que, self);
ent thread floor3_elevator_que_check();
}
floor3_elevator_think2(ent, index)
{
self waittill("goal");
//lets go!
flag_wait("insite_of_elevator");
//this is where you would animated a jump to the rope
pos = [];
pos[0] = 0;
pos[1] = .25;
pos[2] = -1.5;
pos[3] = 1;
pos[4] = 0;
pos[5] = .25;
pos[6] = -1.5;
pos[7] = 1;
displacement = (0, ( (45 * pos[index]) + 45 ) ,0);
pivot = spawn("script_origin", self.origin);
self linkto(pivot);
self.animname = "fastrope_friendly";
pivot moveto(ent.origin, .05);
pivot.angles = ent.startangle + displacement;
wait .1;
//go go go
self pushplayer(false);
self set_force_color("red");
self enable_ai_color();
pivot movez(ent.range * -1, ent.time);
pivot thread anim_loop_solo(self, "loop", undefined, "stopanimscripted");
wait ent.time;
pivot notify ("stopanimscripted");
pivot.angles = self.angles;
pivot anim_single_solo (self, "land");
self unlink();
pivot delete();
}
floor3_elevator_que_check()
{
wait 2;
self notify ("check_fastrope_que");
}
floor3_backhall2()
{
trig = getent("floor3_goto_backhall2_kick","targetname");
chain = getent("floor3_goto_backhall2_kick2","targetname");
node2 = getnode("floor3_backhall2_kick_node2","targetname");
door2 = getentarray(node2.target, "targetname");
chain2_spwntrig = getent(door2[0].target, "targetname");
bd_spawner = getent("floor3_backdraft_guy","targetname");
bd_node = getnode(bd_spawner.target, "targetname");
door2[0].script_parameters = "xleft";
trig waittill("trigger");
wait .5;
ai = get_ai("red", "allies", "script_forcecolor");
array_wait(ai, "goal", 0);
objective_camera("backhall");
//kicker = get_closest_living(node.origin, ai);
//this will have to be custom
/* thread door_breach(node, kicker, door, "backdraft");
kicker waittillmatch("single anim", "kick");
wait .2;
ang = anglestoforward(node.angles + (0,180,0));
playfx(level._effect["exp_breach"], node.origin, ang);*/
//////////////
chain notify("trigger");
ai = get_ai("red", "allies", "script_forcecolor");
array_wait(ai, "goal", .5);//time out after x seconds if at least one guy is there
kicker = get_closest_living(node2.origin, ai);
bd_guy = undefined;
while(1)
{
bd_guy = bd_spawner dospawn();
if(!spawn_failed(bd_guy))
break;
wait .1;
}
thread door_breach(node2, kicker, door2, "backdraft");
wait .15;
bd_guy traverseMode("noclip");
bd_guy.animname = "guy";
bd_guy.deathanim = level.scr_anim["guy"]["backdraft"];
bd_node anim_reach_solo (bd_guy, "backdraft");
bd_guy animscripted("backdraft", bd_node.origin, bd_node.angles, level.scr_anim["guy"]["backdraft"]);
wait .5;
bd_guy stopanimscripted();
bd_guy dodamage(bd_guy.health + 100, (0,0,0));
wait 1;
thread play_sound_in_space("grenade_explode_default", bd_node.origin);
wait 2;
chain2_spwntrig notify("trigger");
}
floor3_backhall()
{
trig = getent("floor3_backhall_explosion","targetname");
whole = getent(trig.target, "targetname");
broken = getent(whole.target, "targetname");
broken notsolid();
flyer = getent("floor3_backhall_flyer","targetname");
coughers = getentarray("floor3_backhall_guys","targetname");
broken hide();
trig waittill("trigger");
earthquake(0.25, .25, (whole getorigin()), 5000);
ang = anglestoforward((0, 180, 0));
playfx(level._effect["exp_backhall"], (whole getorigin()), ang);
whole delete();
broken show();
maps\_fx::loopfx("fire_crawl", (3051,-696,-309), 2, (3061,-695,-187));
maps\_fx::loopfx("fire_crawl", (3048,-524,-307), 2, (3058,-523,-185));
flyer thread floor3_backhall_flyer();
array_thread(coughers, ::floor3_backhall_coughers);
wait .5;
broken solid();
play_sound_in_space("descent_ga1_whathappened", (3024, -704, -372));
thread play_sound_in_space("descent_ga1_idontknow", (3024, -704, -372));
}
#using_animtree("generic_human");
floor3_backhall_coughers()
{
while(1)
{
guy = self stalingradSpawn();
if(!spawn_failed(guy))
break;
wait .1;
}
node = getnode(self.target, "targetname");
guy.animname = "guy";
guy.walk_combatanim2 = %wounded_run_forward1;
guy.walk_combatanim = %wounded_run_forward1;
guy.walk_noncombatanim2 = %wounded_run_forward1;
guy.walk_noncombatanim = %wounded_run_forward1;
guy.run_combatanim = %wounded_run_forward1;
guy.anim_combatrunanim = %wounded_run_forward1;
guy.run_noncombatanim = %wounded_run_forward1;
guy set_forcegoal();
guy.goalradius = 16;
guy setgoalnode(node);
guy waittill("goal");
guy thread floor3_backhall_coughers2(node);
node thread anim_loop_solo(guy, "dazed", undefined, "stop_dazed");//, undefined, "stop");
wait 4;
node notify("stop_dazed");
}
floor3_backhall_coughers2(node)
{
self unset_forcegoal();
self.goalradius = 128;
self waittill("damage");
node notify("stop_dazed");
}
floor3_backhall_flyer()
{
while(1)
{
guy = self stalingradSpawn();
if(!spawn_failed(guy))
break;
wait .1;
}
node = getnode(self.target, "targetname");
guy.animname = "guy";
guy traverseMode("noclip");
node thread anim_single_solo(guy, "backhallexp");
wait .05;
guy stopanimscripted();
guy.deathanim = level.scr_anim["guy"]["backhallexp"];
guy dodamage(guy.health + 10000000, (0,0,0));
}
floor3_kitchen_closedoors()
{
trig = getent("floor3_cafeteria_lockdoors", "targetname");
trig waittill("trigger");
self notsolid();
if (self.spawnflags & 1)
self connectpaths();
x = 0;
y = 0;
z = 0;
switch( self.script_parameters )
{
case "right": {y = randomfloatrange(88, 92);}break;
case "left": {y = -1 * randomfloatrange(88, 92);}break;
}
time = .2;
ang = (x,y,z);
self rotateto(ang, time,0.05,0.05);
wait time;
self solid();
self disconnectpaths();
}
floor3_kitchen_spawner(kitchen_struct)
{
trig = getent("floor3_player_closetoelevator","targetname");
trig endon("trigger");
self endon("death");
while(1)
{
self waittill("spawned", guy);
if(spawn_failed(guy))
continue;
guy floor3_kitchen_setup(kitchen_struct);
if(!flag("floor3_kitchen_doorkicked"))
{
guy thread floor3_kitchen_think();
continue;
}
guy thread floor3_kitchen_thinkend();
}
}
floor3_kitchen_setup(kitchen_struct)
{
self disable_ai_color();
if(self check_force_color("yellow"))
{
for(i=0; i<kitchen_struct.ywaitnodes.size; i++)
{
if(isdefined(kitchen_struct.ywaitnodes[i].taken))
continue;
kitchen_struct.ywaitnodes[i].taken = true;;
self.waitnode = kitchen_struct.ywaitnodes[i];
self.kicknode = kitchen_struct.ykicknode;
self.kickdoor = kitchen_struct.ykickdoor;
break;
}
}
else
{
for(i=0; i<kitchen_struct.rwaitnodes.size; i++)
{
if(isdefined(kitchen_struct.rwaitnodes[i].taken))
continue;
kitchen_struct.rwaitnodes[i].taken = true;
self.waitnode = kitchen_struct.rwaitnodes[i];
self.kicknode = kitchen_struct.rkicknode;
self.kickdoor = kitchen_struct.rkickdoor;
break;
}
}
for(i=0; i<kitchen_struct.endnodes.size; i++)
{
if(isdefined(kitchen_struct.endnodes[i].taken))
continue;
kitchen_struct.endnodes[i].taken = true;
self.endnode = kitchen_struct.endnodes[i];
break;
}
}
floor3_kitchen()
{
kitchen_struct = spawnstruct();
//grab all the variables
kitchen_struct.ywaitnodes = getnodearray("floor3_kitchen_yellows", "targetname");
kitchen_struct.ykicknode = getnode("floor3_kitchen_kickyellow", "targetname");
kitchen_struct.ykickdoor = getentarray(kitchen_struct.ykicknode.target, "targetname");
kitchen_struct.rwaitnodes = getnodearray("floor3_kitchen_reds","targetname");
kitchen_struct.rkicknode = getnode("floor3_kitchen_kickred", "targetname");
kitchen_struct.rkickdoor = getentarray(kitchen_struct.rkicknode.target, "targetname");
kitchen_struct.endnodes = getnodearray("elevator_waitnodes","targetname");
kitchen_struct.trigs = getentarray("floor3_kitchen_start","targetname");
doors = array_combine(kitchen_struct.ykickdoor, kitchen_struct.rkickdoor);
spawners = getentarray("floor3_kitchen_spawner","target");
spawners = array_combine(spawners, getentarray("floor3_cafeteria_spawner","target"));
level.floor3_kitchen_readytokick = [];
level.floor3_kitchen_readytokick["yellow"] = false;
level.floor3_kitchen_readytokick["red"] = false;
//make sure the doors close before the player sees them
array_thread(doors,::floor3_kitchen_closedoors);
if(level.jumpto != "kitchen")
level waittill("ai_clear_dialog_done");
//grab the ai and set them up
ai = getaiarray("allies");
array_thread(ai, ::floor3_kitchen_setup, kitchen_struct);
array_thread(spawners, ::floor3_kitchen_spawner, kitchen_struct);
waittillframeend;
//send them on their ways
array_thread(ai, ::floor3_kitchen_think);
//as soon as first guy is ready - lets see where the player is
level waittill("floor3_kitchen_readytokick");
array_wait(kitchen_struct.trigs, "trigger", 0);
//now lets see which group to teleport
color = [];
color["teleport"] = "none";
color["kick"] = "none";
while(1)
{
wait .1;
if(level.player istouching(kitchen_struct.trigs[0]))
{
if(!level.floor3_kitchen_readytokick[kitchen_struct.trigs[0].script_noteworthy])
continue;
color["teleport"] = kitchen_struct.trigs[1].script_noteworthy;
color["kick"] = kitchen_struct.trigs[0].script_noteworthy;
}
else
{
if(!level.floor3_kitchen_readytokick[kitchen_struct.trigs[1].script_noteworthy])
continue;
color["teleport"] = kitchen_struct.trigs[0].script_noteworthy;
color["kick"] = kitchen_struct.trigs[1].script_noteworthy;
}
break;
}
teleports = get_ai(color["teleport"], "allies", "script_forcecolor");
array_notify(teleports, "teleport");
normals = get_ai(color["kick"], "allies", "script_forcecolor");
kickers = [];
//who's ready to kick the door in the players view?
for(i=0; i<normals.size; i++)
{
if(isdefined(normals[i].readytokick))
kickers[kickers.size] = normals[i];
}
//dont move this to another line - above this is where we regrab the AI
//because we regrab them - the spawner thread doesn't need to wait and
//do it on it's own - it just lets the guy who was spawned before this
//get grabbed here and follow the logic
flag_set("floor3_kitchen_doorkicked");
switch(color["kick"])
{
case "red":{
//move the guys the player can't see through the door immediately
array_thread(teleports[0].kickdoor, ::door_breach_door);
array_thread(teleports, ::floor3_kitchen_thinkend);
wait .15;
//kick down the door for the player
kicker = get_closest_living(kickers[0].kicknode.origin, kickers, 128);
door_breach(kicker.kicknode, kicker, kicker.kickdoor, "shootkick");
array_thread(normals, ::floor3_kitchen_thinkend);
}break;
case "yellow":{
//kick down the door for the player
kicker = get_closest_living(kickers[0].kicknode.origin, kickers, 128);
thread door_breach(kicker.kicknode, kicker, kicker.kickdoor, "shootkick");
wait .33;
//move the guys the player can't see through the door immediately
array_thread(teleports[0].kickdoor, ::door_breach_door);
array_thread(teleports, ::floor3_kitchen_thinkend);
kicker waittillmatch("single anim", "kick");
array_thread(normals, ::floor3_kitchen_thinkend);
}break;
}
}
floor3_kitchen_think()
{
self thread floor3_kitchen_thinkdeath();
self endon("death");
self pushplayer(true);
self setgoalnode(self.waitnode);
self.goalradius = self.waitnode.radius;
self thread floor3_kitchen_think2();
self waittill("goal");
level notify("floor3_kitchen_readytokick");
color = self get_force_color();
if(color == "r")
level.floor3_kitchen_readytokick["red"] = true;
else
level.floor3_kitchen_readytokick["yellow"] = true;
self.readytokick = true;
}
floor3_kitchen_thinkdeath()
{
waitnode = self.waitnode;
endnode = self.endnode;
self waittill("death");
waitnode.taken = undefined;
endnode.taken = undefined;
}
floor3_kitchen_think2()
{
self endon("goal");
self waittill("teleport");
self teleport(self.waitnode.origin);
}
floor3_kitchen_thinkend()
{
self endon("death");
self setgoalnode(self.endnode);
self.goalradius = self.endnode.radius;
self waittill("goal");
self pushplayer(false);
}
floor3_cafeteria()
{
start = getent("floor3_cafeteria_start", "targetname");
spwntrig = getent(start.target, "targetname");
array = getentarray(spwntrig.target, "targetname");
backup = getentarray("floor3_cafeteria_replacements","targetname");
backuptrig = getent("floor3_cafeteria_backuptrig","targetname");
backup2 = getentarray("floor3_cafeteria_replacements2","targetname");
backuptrig2 = getent("floor3_set_replacements2", "targetname");
spwn = array_combine(backup, backup2);
last = getent("floor3_cafeteria_lastkiller","targetname");
start waittill("trigger");
ai = getaiarray("axis");
for(i=0; i<ai.size; i++)
ai[i] set_force_color("blue");
if(ai.size < 12)
{
diff = 12 - ai.size;
x = array.size - diff;
while(x > 0)
{
spwn = random(array);
array = array_remove(array, spwn);
spwn delete();
x--;
}
spwntrig notify("trigger");
}
backuptrig waittill("trigger");
ai = getaiarray("axis");
floodspawner_switch(ai, backup);
thread play_sound_in_space("descent_ga1_theyrecoming", (1416, 360, -336));
backuptrig2 waittill("trigger");
ai = getaiarray("axis");
floodspawner_switch(ai, backup2);
thread play_sound_in_space("descent_ga1_retreat", (640, 352, -340));
last waittill("trigger");
waittillframeend;
ai_clear_dialog(spwn);
}
/************************************************************************************************************************************/
/************************************************************************************************************************************/
/* *FLOOR 4* */
/************************************************************************************************************************************/
/************************************************************************************************************************************/
floor4_main()
{
jumpto = level.jumpto;
if(level.jumptoFL != "4")
jumpto = "start";
array_thread(getentarray("fastrope_friendlies_noheli","script_noteworthy"), ::floor4_fastrope_spawner_think);
switch(jumpto)
{
case "start":{
floor4_prison();
}
case "fubar":{
floor4_fubar();
}
}
}
floor4_prison()
{
chain = getent("floor4_startchain","targetname");
trig = getent("floor4_elevatorguys", "targetname");
trig waittill ("trigger");
wait .5;
ai = getaiarray("allies");
array_wait(ai, "goal", 0);
objective_camera("prison");
chain notify("trigger");
}
floor4_fubar()
{
wave4 = getentarray("floor4_wave4","targetname");
trig = getent("floor4_wave3","target");
chain = getent("objective_move_fubar","targetname");
array_thread(wave4, ::floor4_fubar_wave4);
flag_clear( "random_events_hole" );
trig waittill("trigger");
ai = getaiarray("axis");
level.floor4_fubar_deaths = 0;
array_thread(ai, ::floor4_fubar_deaths);
floodspawner_switch(ai, wave4);
wait .1;
while(level.floor4_fubar_deaths)
level waittill("floor4_fubar_deaths");
autosave_by_name("final_fight");
random_event_lock("exp_upper","script_noteworthy");
random_event_lock("exp_lower","script_noteworthy");
wait .5;
play_sound_in_space("descent_cmd_lastofthem", (1464, -336, -967));
wait .75;
play_sound_in_space("descent_cmd_marinesonme", (1464, -336, -967));
play_sound_in_space("descent_ge1_yessir", (1464, -336, -967));
chain notify("trigger");
wait .25;
ai = get_ai("red", "allies", "script_forcecolor");
array_wait(ai, "goal", 1);
objective_camera("final", true);
musicPlay("descent_end_music");
wait .5;
ai = get_ai("red", "allies", "script_forcecolor");
ai[0] play_sound_on_entity("descent_cmd_welldonemarines");
// wait .5;
// play_sound_in_space("descent_ge1_jeezelook", (1464, -336, -967));
// ai[1] play_sound_on_entity("descent_ge1_seenlikethat");
ai[0] play_sound_on_entity("descent_cmd_noson");
maps\_endmission::nextmission();
}
floor4_fubar_wave4()
{
guy = undefined;
while(1)
{
self waittill("spawned", guy);
if(!spawn_failed(guy))
break;
}
guy thread floor4_fubar_deaths();
}
floor4_fubar_deaths()
{
level.floor4_fubar_deaths++;
self waittill("death");
level.floor4_fubar_deaths--;
level notify("floor4_fubar_deaths");
}
floor4_fastrope_spawner_think()
{
self endon("death");
ent = getstruct(self.targetname, "target");
while(1)
{
self waittill("spawned", guy);
if(spawn_failed(guy))
continue;
guy thread floor4_fastrope_guy_think(ent);
}
}
floor4_fastrope_guy_think(ent)
{
self endon("death");
maps\mo_fastrope::fastrope_calc(ent);
if(!isdefined(ent.fastrope_que))
ent.fastrope_que = [];
index = ent.fastrope_que.size;
ent.fastrope_que[ent.fastrope_que.size] = self;
waittillframeend;
while(ent.fastrope_que[0] != self)
ent waittill("check_fastrope_que");
waittillframeend;
ent.fastrope_que = array_remove(ent.fastrope_que, self);
ent thread floor3_elevator_que_check();
pos = [];
pos[0] = 0;
pos[1] = .25;
pos[2] = -1.5;
pos[3] = 1;
pos[4] = 0;
pos[5] = .25;
pos[6] = -1.5;
pos[7] = 1;
displacement = (0, ( (45 * pos[index]) + 45 ) ,0);
pivot = spawn("script_origin", self.origin);
self linkto(pivot);
self.animname = "fastrope_friendly";
pivot moveto(ent.origin, .05);
pivot.angles = ent.startangle + displacement;
wait .1;
//go go go
pivot thread anim_loop_solo(self, "loop", undefined, "stopanimscripted");
pivot movez(ent.range *- 1, ent.time);
wait ent.time;
pivot notify ("stopanimscripted");
pivot.angles = self.angles;
pivot anim_single_solo (self, "land");
self unlink();
pivot delete();
}
/************************************************************************************************************************************/
/************************************************************************************************************************************/
/* *RANDOM EVENTS* */
/************************************************************************************************************************************/
/************************************************************************************************************************************/
random_event_main()
{
//SETUP
on = getent("random_quake_on","targetname");
//main hole
level.random_event_process = [];
level.random_event_locked = [];
level.random_event = [];
level.random_event["upper"] = getstructarray("flyby", "script_noteworthy");
level.random_event["upper"] = array_combine(level.random_event["upper"], getstructarray("dropoff", "script_noteworthy"));
level.random_event["upper"] = array_combine(level.random_event["upper"], getstructarray("exp_upper", "script_noteworthy"));
level.random_event["lower"] = getstructarray("exp_lower","script_noteworthy");
level.random_event["inner"] = [];
//inner structure
struct = spawnstruct();
struct.script_noteworthy = "quake";
struct.origin = on getorigin();
level.random_event["inner"][level.random_event["inner"].size] = struct;
level.random_event["inner"][level.random_event["inner"].size] = struct;
level.random_event["inner"][level.random_event["inner"].size] = struct;//this gives me more quakes than screams
struct = spawnstruct();
struct.script_noteworthy = "scream";
struct.origin = on getorigin();
level.random_event["inner"][level.random_event["inner"].size] = struct;
//the functions for the types
level.random_event_process["flyby"] = ::random_event_flyby;
level.random_event_process["dropoff"] = ::random_event_dropoff;
level.random_event_process["exp_upper"] = ::random_event_exp_upper;
level.random_event_process["exp_lower"] = ::random_event_exp_lower;
level.random_event_process["quake"] = ::random_event_quake;
level.random_event_process["scream"] = ::random_event_scream;
//call the logic
thread random_event_hole();
thread random_event_inner();
}
random_event_inner()
{
on = getent("random_quake_on","targetname");
off = getent(on.target, "targetname");
flag_wait("random_events_inner");
while(1)
{
on waittill("trigger");
on thread random_event_inner_logic();
off waittill("trigger");
on notify("stop");
}
}
random_event_inner_logic()
{
self endon("stop");
valid = true;
event = undefined;
while(1)
{
if(!valid)
wait 2;
else
{
if(level.soundDebug != "none")
wait 1;
else
wait(randomfloatrange(20, 60));
wait 2;
event = random(level.random_event["inner"]);
}
valid = event [[level.random_event_process[event.script_noteworthy]]]();
}
}
random_event_quake()
{
vec = (0,level.player.angles[1], 0);
forward = anglestoforward(vec);
right = anglestoright(vec);
forward = vector_multiply(forward, 200);
right = vector_multiply(right, (randomfloat(64) - 32));
start = level.player.origin;
end = start + forward + right;
pos = physicstrace(start, end );
if(pos!= end)
return false;
start = end;
pos = physicstrace(start, (start + (0,0,512)) );
up = anglestoup(vec);
playfx(level._effect["debri_ceiling"], pos, (pos - up));
thread play_sound_in_space("descent_quake_rumble", self.origin);//distant_explosion_triggered
earthquake(0.15, 6, level.player.origin, 2048);
wait .5;
thread play_sound_in_space("ceiling_debris", pos);//distant_explosion_triggered
wait 5;
return true;
}
random_event_scream()
{
if(level.soundDebug != "none")
play_sound_in_space("descent_ge1_yellfaraway", self.origin);
return true;
}
random_event_hole()
{
trig = getentarray("center_hole_lookat","targetname");
prevevent = random(level.random_event["upper"]);
while(1)
{
flag_wait("random_events_hole");
array_thread(trig, ::random_event_trigs);
array_wait(trig, "trigger", 0);
waittillframeend;
array_notify(trig, "stop");
if(!flag("random_events_hole"))
continue;
if(!level.random_event[level.randomeventtrig].size)
{
wait .1;
continue;
}
while(1)
{
event = random(level.random_event[level.randomeventtrig]);
if(event != prevevent)
break;
}
prevevent = event;
event [[level.random_event_process[event.script_noteworthy]]]();
if(level.soundDebug != "none")
wait 1;
else
wait 15;
}
}
random_event_lock(name, type)
{
title = random_event_lockname(name, type);
lock = spawnstruct();
lock.position = "none";
lock.array = undefined;
lock.array = random_event_lock_logic(name, type, "upper");
if(lock.array.size)
{
lock.position = "upper";
level.random_event_locked[title] = lock;
return;
}
lock.array = random_event_lock_logic(name, type, "lower");
if(lock.array.size)
{
lock.position = "lower";
level.random_event_locked[title] = lock;
return;
}
lock.array = random_event_lock_logic(name, type, "inner");
if(lock.array.size)
{
lock.position = "inner";
level.random_event_locked[title] = lock;
return;
}
}
random_event_lock_logic(name, type, pos)
{
array = [];
index = 0;
while(index < level.random_event[pos].size)
{
string = undefined;
switch(type)
{
case "target":{
string = level.random_event[pos][index].target;
}break;
case "targetname":{
string = level.random_event[pos][index].targetname;
}break;
case "script_noteworthy":{
string = level.random_event[pos][index].script_noteworthy;
}break;
}
if(isdefined(string) && string == name)
{
array[array.size] = level.random_event[pos][index];
level.random_event[pos] = array_remove(level.random_event[pos], level.random_event[pos][index]);
continue;
}
index++;
}
return array;
}
random_event_unlock(name, type)
{
title = random_event_lockname(name, type);
lock = level.random_event_locked[title];
if(!isdefined(lock) || lock.array.size == 0)
return;
level.random_event_locked[title] = undefined;
level.random_event[lock.position] = array_combine(level.random_event[lock.position], lock.array);
level notify("random_event_unlocked");
}
random_event_lockname(name, type)
{
return ("event_" + type + name);
}
random_event_trigs()
{
self endon("stop");
self waittill("trigger");
level.randomeventtrig = self.script_noteworthy;
}
random_event_dropoff()
{
trig = getent(self.target, "targetname");
node = getnode(trig.target, "targetname");
spwners = getentarray(trig.targetname, "target");
array_thread(spwners, ::random_event_dropoff_spwners, node);
waittillframeend;
old = level.friendly_globals.curr_trigger;//this line and the one 3 down make sure the correct friendly triggers stay on (also insures that these spawners can be spawned again)
trig notify ("trigger");
waittillframeend;
old notify("trigger");
node wait_timeout("reached", 20);
}
random_event_dropoff_spwners(node)
{
while(1)
{
self waittill("spawned", guy);
if(!spawn_failed(guy))
break;
}
wait .1;
self notify("death");//this gets him off the friendly logic
level.friendly_globals.cur_num--;
guy endon("death");
guy setgoalnode(node);
guy.goalradius = node.radius;
guy waittill("goal");
node notify("reached");
guy delete();
}
random_event_flyby()
{
nodes = getvehiclenodearray(self.target, "targetname");
for(i=0; i<nodes.size; i++)
{
plane = random_event_flyby_makeplane(nodes[i]);
plane thread random_event_flyby_flyplane();
wait randomfloatrange(.25, 1.5);
}
}
random_event_flyby_flyplane()
{
self thread play_sound_on_entity("descent_flyover_sonicboom");
self startpath();
self waittill("reached_end_node");
self delete();
}
random_event_flyby_makeplane(node)
{
plane = spawnVehicle( "vehicle_mig29_desert", "plane", "blackhawk", node.origin, (0,0,0) );
plane setmodel ("vehicle_mig29_desert");
plane attachPath( node );
return plane;
}
random_event_exp_upper()
{
self random_event_exp();
thread random_event_exp_lock("exp_upper");
}
random_event_exp_lower()
{
self random_event_exp();
thread random_event_exp_lock("exp_lower");
}
random_event_exp_lock(pos)
{
//this is to make sure explosions don't happen too often
random_event_lock(pos, "script_noteworthy");
wait 90;
random_event_unlock(pos, "script_noteworthy");
}
random_event_exp()
{
vec = anglestoforward(self.angles);
playfx(level._effect["exp_randomevent"], self.origin, vec);
thread play_sound_in_space("bricks_exploding");
earthquake(0.25, 1, self.origin, 2048);
}