We just released a Feb. 5 '89 prototype of DuckTales for the NES!
If you'd like to support our preservation efforts (and this wasn't cheap), please consider donating or supporting us on Patreon. Thank you!
If you'd like to support our preservation efforts (and this wasn't cheap), please consider donating or supporting us on Patreon. Thank you!
Proto:Call of Duty 4: Modern Warfare (Windows)/Build 253/descent.gsc
Jump to navigation
Jump to search
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); }