#using_animtree("generic_human"); main() { precacheShellshock("default"); setcvar("introscreen","1"); mort = getent ("mortar attack","targetname"); // level.mortar = loadfx ("fx/surfacehits/mortarImpact.efx"); // level._effect["mortar"] = loadfx ("fx/impacts/dirthit_mortar.efx"); // "fx/impacts/beach_mortar.efx" // level._effect["mortar"] = loadfx ("fx/impacts/newimps/blast_gen3.efx"); level._effect["mortar"] = loadfx ("fx/impacts/newimps/dirthit_mortar2daymarked.efx"); level.mortar = level._effect["mortar"]; thread ai_overrides(); maps\_load::main(); maps\_tank::main(); maps\_mortarteam::main(); maps\_panzerIV::main_camo(); maps\_tiger::main_camo(); maps\dawnville_anim::main(); weapon = level.player getcurrentweapon(); /* while (1) { newweapon = level.player getcurrentweapon(); if (newweapon != weapon) { weapon = newweapon; println ("Player weapon is ", weapon); } wait (0.05); } */ // gun = spawn ("FG42", (0,0,0)); // gun = spawn ("weapon_FG42", (0,0,0)); maps\dawnville_fx::main(); level.ambient_track ["exterior"] = "ambient_dawnville"; level.ambient_track ["interior"] = "ambient_dawnville_int"; thread maps\_utility::set_ambient("exterior"); precacheturret("mg42_tiger_tank"); precacheItem("panzerfaust"); maps\_utility::chain_off ("500"); maps\_utility::chain_off ("450"); maps\_utility::chain_off ("460"); maps\_utility::chain_off ("125"); chain = get_friendly_chain_node ("50"); level.player SetFriendlyChain (chain); level._effect["treads_sand"] = loadfx ("fx/tagged/tread_dust_brown.efx"); level._effect["treads_grass"] = loadfx ("fx/tagged/tread_dust_brown.efx"); level._effect["treads_dirt"] = loadfx ("fx/tagged/tread_dust_brown.efx"); level._effect["treads_rock"] = loadfx ("fx/tagged/tread_dust_brown.efx"); character\moody::precache(); character\foley::precache(); character\elder::precache(); // precachemodel("xmodel/vehicle_tank_tiger_d"); // precachemodel("xmodel/vehicle_tank_PanzerIV_d"); // precacheModel("xmodel/head_blane"); //head for script dieing models precacheModel("xmodel/ammo_panzerfaust_box2"); precacheModel("xmodel/weapon_panzerfaust"); precacheModel("xmodel/vehicle_tank_panzeriv_machinegun"); precacheModel("xmodel/character_moody"); precacheModel("xmodel/head_moody"); precacheModel("xmodel/character_elder"); precacheModel("xmodel/head_elder"); precacheModel("xmodel/dawnville_map"); precacheModel("xmodel/dawnville_pencil"); precacheModel("xmodel/vehicle_car"); // maps\dawnville_anim::main(); // maps\dawnville_export::main(); // fogvars ( 1.4 1.4 1.4 ) 16500 level.scr_anim["generic"]["explode death up"] = %death_explosion_up10; level.scr_anim["generic"]["explode death back"] = %death_explosion_back13; // Flies back 13 feet. level.scr_anim["generic"]["explode death forward"] = %death_explosion_forward13; level.scr_anim["generic"]["explode death left"] = %death_explosion_left11; level.scr_anim["generic"]["explode death right"] = %death_explosion_right13; level.scr_anim["generic"]["knockdown back"] = %stand2prone_knockeddown_back; level.scr_anim["generic"]["knockdown forward"] = %stand2prone_knockeddown_forward; level.scr_anim["generic"]["knockdown left"] = %stand2prone_knockeddown_left; level.scr_anim["generic"]["knockdown right"] = %stand2prone_knockeddown_right; level.scr_anim["generic"]["getup"] = (%scripted_standwabble_A); // Initial level flags: level.flag["west tank finished moving"] = false; level.flag["west tank destroyed"] = false; level.flag["east tank finished moving"] = false; level.flag["east tank destroyed"] = false; level.flag["northeast tank finished moving"] = false; level.flag["northeast tank destroyed"] = false; level.flag["mortars stop"] = false; level.flag["got panzers"] = false; level.flag["church has been defended"] = false; level.flag["player is at church"] = false; level.flag["foley moves on"] = false; level.flag["west tank attacks"] = false; level.flag["friendlies report to the car"] = false; level.flag["player got in car"] = false; level.flag["moody exists"] = false; level.flag["elder exists"] = false; level.flag["falling back"] = false; level.flag["parker speech"] = false; level.flag["church under siege"] = false; level.flag["parker is a go"] = false; level.flag["chain 100 off forever"] = false; level.flag["chain 125 off forever"] = false; level.flag["Friendlies crouch for conference"] = false; // Initial array_threading: array_levelthread (getentarray ("delete","targetname"), ::delete_this); array_thread (getVehicleNodeArray ("tank","targetname"), ::tank_think); // Initial threads, not array threaded: thread mortar_init(); thread shoot_tank(getent ("shoot_tank","targetname")); thread second_flak_early_trigger(getent ("second flak early trigger","targetname")); setCullFog (0, 16500, 0.7, 0.85, 1.0, 0); setCullFog (0, 16500, 0.7, 0.85, 1.0, 0); // Characters: foley = getent ("foley", "targetname"); foley.animname = "foley"; foley character\_utility::new(); foley character\foley::main(); foley.followMin = 4; foley.followMax = 8; foley.script_usemg42 = false; // Foley is too cool for MG42s foley thread animscripts\shared::SetInCombat(60.0); foley.dontFollow = true; // Blocks AI from renetering the safehouse later on. block = getent ("safehouse block","targetname"); block connectpaths(); block notsolid(); // foley animscripted( "single anim", foley.origin, foley.angles, level.scr_anim["foley"]["end"] ); /* foley thread anim_single_solo (foley, "end"); while (1) { foley waittill ( "single anim", notetrack); println ("animation notetrack: ", notetrack, " time ", gettime()); } */ // Elder thread elder (getent ("elder","targetname")); level.player.threatbias = -2; level.player.threatbias = 2000000; ai = getaiarray ("allies"); for (i=0;i currentTime) continue; newdist = distance (level.player.origin, mortars[i].origin); if (newdist < 650) continue; if (newdist > dist) continue; indexSecondClosest = index; index = i; dist = newdist; } if (indexSecondClosest == -1) return undefined; mortars[index].usedTime = currentTime + level.mortarTime; return mortars[index]; } mortar_killplayer () { thread playSoundinSpace ("mortar_incoming", level.player.origin); wait (0.4); thread playSoundinSpace ("mortar_explosion", level.player.origin); playfx (level._effect["mortar"], level.player.origin); radiusDamage (level.player.origin, 2000, 2000, 0); // mystery numbers! earthquake(0.3, 3, level.player.origin, 850); // scale duration source radius } mortar_nearplayer () { mortar = mortar_closest(); if (!isdefined (mortar)) return; mortar_explosion (mortar); } mortar_explosion (mortar) { mortar playsound ("mortar_incoming", "sounddone"); mortar waittill ("sounddone"); mortar playsound ("mortar_explosion"); playfx (level._effect["mortar"], mortar.origin + (0,0,-76)); // Lower into ground MORE -32 radiusDamage (mortar.origin, 200, 200, 0); // mystery numbers! earthquake(0.3, 3, mortar.origin, 850); // scale duration source radius level notify ("mortars ongoing HIT"); } mortar_explosion_prehit (mortar) { wait randomfloat(0.5); mortar_explosion (mortar); } mortar_drop_on_axis () { array_levelthread (getentarray ("mortar automatic","targetname"), ::mortar_explosion_prehit); } mortar_drop_nearplayer () { for (i=0;i<3;i++) { mortar_nearplayer(); wait (randomfloat (3)); } } mortar_ongoing () { level notify ("mortars ongoing STOP"); level endon ("mortars ongoing STOP"); while (1) { mortar_nearplayer(); wait (3 + randomfloat (5)); } } player_mortar_death ( trigger ) { level endon ("mortars stop"); trigger waittill ("trigger"); mortar_killplayer(); } turnChurchMG42backOn () { flag_wait ("player is at church"); array_thread(getentarray ("church rear","script_noteworthy"), maps\_utility::triggerOn); } second_flak_early_trigger ( trigger ) { targets = getentarray (trigger.target,"targetname"); array_levelthread (targets, ::second_flak_spawner); level waittill ("kill second flak early trigger"); trigger delete(); } second_flak_spawner ( spawner ) { level endon ("kill second flak early trigger"); if (isdefined (spawner.target)) return; spawner waittill ("spawned", spawn); if (spawn.team != "axis") return; spawn endon ("death"); wait (0.05); spawn setgoalentity (level.player); num = 800; spawn.goalradius = num; while (num > 300) { num -= 100; wait (15); } } hurtPlayer (trigger) { trigger.deleteself = false; while (1) { while (level.player istouching (trigger)) { level.player DoDamage ( 50, (randomint(5000)-2500,randomint(5000)-2500,randomint(5000)-2500) ); wait (0.05); } wait (0.5); if (trigger.deleteself) { trigger delete(); return; } } } shoot_tank (trigger) { target = getent (trigger.target,"targetname"); clip = getent (target.target,"targetname"); clip disconnectpaths(); // Tank is the tank that hits the trigger leading down the road trigger waittill ("trigger",tank); trigger delete(); // tank setTurretTargetEnt( target, ( 0, 0, 50 ) ); // tank waittill( "turret_on_vistarget" ); // wait (1); // tank FireTurret(); target delete(); wait (0.1); pushed_tank = getent ("tank_pushed","targetname"); tankDamage = getent ("tank damage trigger","targetname"); tankDamage enableLinkto(); tankDamage linkto (pushed_tank); level thread hurtPlayer(tankDamage); clip linkto (pushed_tank); org = getent (pushed_tank.target,"targetname"); pushed_tank linkto (org); clip connectpaths(); // org rotateyaw (75, 3.8, 0, 0.8); org rotateyaw (75, 5, 0, 0.8); // org rotateyaw (75, 1.2, 0, 0.8); wait (5); tankDamage.deleteself = true; clip disconnectpaths(); tank restart_aim(); tank waittill ("reached_end_node"); tank.health = 1000; tank thread triggerHintThink(tank.triggerHint); } tank_rampage_explode (tank, exploder, trigger) { level endon ("northeast tank destroyed"); while (1) { self waittill ("trigger",other); if (other == tank) break; } thread maps\_utility::exploder (exploder); level notify ("stop rampage " + exploder); trigger notify ("destroyed"); // println ("^bstopping rampage ", exploder); } guyFleesTank (trigger) { spawner = getent (trigger.target,"targetname"); spawner waittill ("spawned",spawn); if (maps\_utility::spawn_failed(spawn)) return; spawn endon ("death"); node = getnode (spawn.target,"targetname"); spawn setgoalpos (spawn.origin); spawn.goalradius = 4; level waittill ("tank start northeast"); spawn thread bloody_death_waittill(); spawn.health = 1; wait (0.5); tank = getent ("tank northeast","targetname"); if (!isdefined(tank)) { spawn setgoalentity (level.player); return; } spawn maps\_utility::lookat(tank); spawn setgoalnode (node); node = getnode (node.target,"targetname"); wait (1); spawn setgoalnode (node); node = getnode (node.target,"targetname"); wait (1.5); spawn setgoalnode (node); level thread playSoundinSpace ("weap_kar98k_fire", spawn.origin); spawn DoDamage ( spawn.health + 50, (randomint(5000)-2500,randomint(5000)-2500,randomint(5000)-2500) ); } isTanktouching ( ent ) { org = spawn ("script_origin",self.origin); org.origin = self.origin + (0,0,60); if (org istouching (ent)) answer = true; else answer = false; org delete(); return answer; } tempPlayerKill ( trigger ) { level endon ("northeast tank destroyed"); trigger waittill ("trigger"); //iprintlnbold ("THE TANK KILLED YOU WITH HIS MAGIC MACHINE GUN!"); level.player DoDamage ( level.player.health + 50, (randomint(5000)-2500,randomint(5000)-2500,randomint(5000)-2500) ); } tank_rampage_trigger ( tank ) { level endon ("northeast tank destroyed"); level endon ("stop rampage " + self.script_noteworthy); // println ("^brampage stopper is ", self.script_noteworthy); damage_trigger = getent (self.target,"targetname"); org = getent (damage_trigger.target,"targetname"); level.rampage_done[self.target] = true; tankTrigger = getentarray ("tank rampage includer","targetname"); for (i=0;i ref.origin[0] - (offset))) { println ("was too close to gate to be able to shoot"); continue; } targetOrigin = level.rampage_org.origin; self setTurretTargetEnt( level.rampage_org, ( 0, 0, 50 ) ); self waittill( "turret_on_target" ); self FireTurret(); self thread tank_rampage_wanderaim(); // Shell shock the player for standing near the explosion. // if ((rampageTrigger == level.rampageTrigger) && (level.player istouching (rampageTrigger))) wait (0.1); if ((rampageTrigger != level.rampageTrigger) || (distance (level.player.origin, targetOrigin) > 250)) continue; if (isdefined (level.playerShellShocked_Dawnville)) continue; maps\_shellshock::main(8); level.playerShellShocked_Dawnville = true; } } tank_rampage_wanderaim_org (tank) { waittill_either (tank, "death","stop wanderaiming"); self delete(); } rangeVec (range) { return ((randomint (range) - range*0.5, randomint (range) - range*0.5, randomint (range) - range*0.5)); } tank_rampage_wanderaim () { self endon ("death"); self notify ("stop wanderaiming"); self endon ("stop wanderaiming"); org = spawn ("script_origin",(0,0,0)); org thread tank_rampage_wanderaim_org(self); wait (2); while (1) { org.origin = level.rampage_org.origin + rangeVec(200); self setTurretTargetEnt( org, ( 0, 0, 50 ) ); self waittill( "turret_on_target" ); wait (1 + randomfloat(2)); } } getUnusedAttackNode ( nodes ) { for (i=0;i 2) level waittill ("player attacker died"); else wait (1); if (level.player_attackers <= 3) array_thread(spawners, ::player_attackers_spawner); while (level.player istouching (trigger)) wait (3); } */ } tank_northeast_guard ( trigger ) { trigger waittill ("trigger"); level.tank_guard_nodes = getnodearray (trigger.target,"targetname"); level notify ("new tank guard nodes"); trigger delete(); } tank_northeast_shoot () { self endon ("told to move"); self endon ("death"); self thread tank_rampage(); // Handles tank shooting at player self thread tank_northeast_move(); array_levelthread (getentarray ("tank guard trigger","targetname"), ::tank_northeast_guard); thread player_attackers(); trigger = getent ("tank target","targetname"); trigger waittill ("trigger"); trigger delete(); wait (0.5); target_trigger = getent ("tank target 1","targetname"); org = spawn ("script_origin",(0,0,0)); org.origin = target_trigger getorigin(); self setTurretTargetEnt( org, ( 0, 0, 50 ) ); wait (3); self waittill( "turret_on_vistarget" ); self FireTurret(); wait (0.1); maps\_utility::exploder(target_trigger.script_noteworthy); radiusDamage (org.origin, 400, 500, 0); target_trigger delete(); org delete(); target_trigger = getent ("tank target 2","targetname"); org = spawn ("script_origin",(0,0,0)); org.origin = target_trigger getorigin(); self setTurretTargetEnt( org, ( 0, 0, 50 ) ); wait (3); self waittill( "turret_on_vistarget" ); self FireTurret(); wait (0.1); maps\_utility::exploder(target_trigger.script_noteworthy); radiusDamage (org.origin, 400, 500, 0); target_trigger delete(); org delete(); self setTurretTargetEnt( getent ("new gun target","targetname") , ( 0, 0, 50 ) ); } tank_northeast_move () { self endon ("death"); self endon ("told to move"); thread tank_northeast_restart_move(); stopnode = getvehiclenode ("tank stop node","targetname"); self setwaitnode (stopnode); self waittill ("reached_wait_node"); self.nospawning = false; self setSpeed(0,30); self disconnectpaths(); } tank_northeast_restart_move () { self endon ("death"); trigger = getent ("tank move","targetname"); trigger waittill ("trigger"); foley = getent ("foley","targetname"); foley.followMin = 5; foley.followMax = -5; self setTurretTargetEnt( getent ("new gun target","targetname") , ( 0, 0, 50 ) ); self notify ("told to move"); self endon ("player reached second go point"); thread tank_northwest_restart_2nd(); self resumespeed(10); // self notify ("start self connectpaths(); stopnode = getvehiclenode (trigger.target,"targetname"); self setwaitnode (stopnode); self waittill ("reached_wait_node"); self setSpeed(0,30); self disconnectpaths(); } tank_northwest_restart_2nd () { self endon ("death"); trigger = getent ("tank move 2","targetname"); trigger waittill ("trigger"); self notify ("player reached second go point"); self resumespeed(30); self connectpaths(); self thread restart_aim(); // target_trigger delete(); // org delete(); trigger = getent ("gate","targetname"); trigger waittill ("trigger"); trigger delete(); gate_left = getent ("gate left","targetname"); gate_right = getent ("gate right","targetname"); gate_left connectpaths(); gate_right connectpaths(); gate_left playsound (level.scr_sound["tank gatecrash"]); gate_left rotatepitch (-85, 0.6, 0, 0.4); gate_right rotatepitch (-85, 0.6, 0, 0.4); gate_left notsolid(); gate_right notsolid(); self waittill ("reached_end_node"); self disconnectpaths(); } restart_aim () { org = spawn ("script_model",(0,0,0)); // org setmodel ("xmodel/temp"); angles = anglesToForward (self.angles); dest = maps\_utility::vectorScale (angles, 300); org.origin = self.origin + dest + (0,0,45); org linkto (self); self setTurretTargetEnt( org, ( 0, 0, 50 ) ); self waittill( "turret_on_vistarget" ); self clearturrettarget(); org delete(); } tank_west_escort ( spawner ) { spawner.count = 1; spawn = spawner dospawn(); if (maps\_utility::spawn_failed(spawn)) return; spawn setgoalentity (level.player); spawn.goalradius = 1024 + randomint (200); } tank_west_think ( tank ) { stopnode = getvehiclenode ("tank halt","targetname"); tank setwaitnode (stopnode); thread tank_killers(); // Prep the guys that jump on the west tank tank waittill ("reached_wait_node"); // if (!flag("northeast tank destroyed")) { tank setSpeed(0,3000); wait (0.1); } flag_wait ("northeast tank destroyed"); // flag_wait ("west tank attacks"); // tank setSpeed(15,0.2); tank setSpeed(15,0.8); // 1 tank waittill ("reached_end_node"); } tank_west_trigger ( trigger ) { wait (0.01); level thread tank_west_think ( getent ("tank west","targetname")); trigger waittill ("trigger"); flag_set ("west tank attacks"); } tank_think () { while (1) { level waittill ("tank start " + self.script_noteworthy); thread tank_start(); } } tank_end_events( tank ) { level waittill ("west tank finished moving"); if (self.script_noteworthy == "west") { clip = getent ("west tank clip","targetname"); clip connectpaths(); clip delete(); tank disconnectpaths(); } } tank_death_event ( tank ) { // level endon (tank.script_noteworthy + " tank finished moving"); num = tank.script_noteworthy; level.flag[num + " tank finished moving"] = false; level.flag[num + " tank destroyed"] = false; tank waittill ("death"); if (!flag (num + " tank finished moving")) flag_set (num + " tank finished moving"); flag_set (num + " tank destroyed"); if (num == "west") { org = tank.origin; wait (0.05); maps\_utility::scriptedRadiusDamage ( org, 450 ); } } // Prints hint if you attack tanks with the wrong weapons triggerHintThink ( trigger ) { trigger enableGrenadeTouchDamage(); self endon ("death"); while (1) { trigger waittill ("trigger", other); if (!isdefined (other.classname)) continue; if (other.classname == "worldspawn") continue; if (other == self) continue; if ((other != level.player) && (other.classname != "grenade")) continue; wait (0.05); println ("^2HIT by ", other.classname, " , ", other); //Tanks can not be destroyed by Grenades or Bullets iprintlnbold (&"DAWNVILLE_TANKGRENADESBULLETS"); wait (60); } } tank_start () { path = getvehiclenode (self.target,"targetname"); // tank = spawnVehicle( "xmodel/vehicle_tank_tiger", "tank " + self.script_noteworthy , "tiger", (0,0,0), (0,0,0) ); if (self.script_noteworthy == "northeast") tank = spawnVehicle( "xmodel/vehicle_tank_PanzerIV_camo", "tank " + self.script_noteworthy , "panzerIV", (0,0,0), (0,0,0) ); else tank = spawnVehicle( "xmodel/vehicle_tank_tiger_camo", "tank " + self.script_noteworthy , "tiger", (0,0,0), (0,0,0) ); // tanker = getent ("tank " + self.script_noteworthy , "targetname"); // println (tanker.origin); // tank maps\_tiger::init("mg42_tiger_tank"); // tank maps\_panzerIV::init("mg42_tiger_tank"); triggerHints = getentarray ("tank damage hint","targetname"); for (i=0;i 5) level waittill ("spawner guy died"); wait (randomfloat (3)); random(spawners) thread spawner_think(); } } } secondguy_think ( guy ) { if (!isalive (guy)) println ("SECONDGUY IS DEAD!"); guy waittill ("death"); println ("SECONDGUY DIED!"); } church_flank_think ( node ) { self endon ("death"); self.threatbias = -500; level endon ("fallbacker_trigger1"); self.goalradius = 4; self setgoalnode (node); self waittill ("goal"); while (isdefined (node.target)) { node = getnode (node.target,"targetname"); self setgoalnode (node); self waittill ("goal"); self.grenadeammo = 5; } //THROW GRENADES NOW // iprintlnbold (&"DAWNVILLE_THROWGRENADES"); } foley_moves_on_trigger ( trigger ) { trigger waittill ("trigger"); flag_set("foley moves on"); } foley_moves_on_followup ( foley ) { flag_wait ("foley moves on"); foley setgoalentity (level.player); foley.goalradius = 384; } get_noteworthy_ai ( msg ) { ents = getentarray ( msg, "script_noteworthy" ); for (i=0;i 180) ang -= 360; // println ("angles are ", ang); if ((ang >= 45) && (ang <= 135)) return level.scr_anim[msg]["knockdown forward"]; if ((ang >= -135) && (ang <= -45)) return level.scr_anim[msg]["knockdown back"]; if ((ang <= 45) && (ang >= -45)) return level.scr_anim[msg]["knockdown right"]; return level.scr_anim[msg]["knockdown left"]; } player_got_too_close ( trigger ) { while (1) { trigger waittill ("trigger"); level.player.threatbias = 500000; while (level.player istouching (trigger)) wait (2); level.player.threatbias = 0; } } get_friendly_chain_node (chainstring) { trigger = getentarray ("trigger_friendlychain","classname"); for (i=0;i= waits.size) index = 0; mortar_hit( ent.origin + (0,0,-60)); if (isdefined (ent.target)) ent = getent (ent.target,"targetname"); else ent = starter; } } asset_think () { self endon ("death"); self thread animscripts\shared::SetInCombat(); self.health = 150; self thread maps\_utility::magic_bullet_shield(); self.suppressionwait = 0; self endon ("death"); node = getnode (self.target,"targetname"); self setgoalnode (node); self waittill ("goal"); self.goalradius = 4; level waittill ("go go go"); self notify ("stop magic bullet shield"); self notify ("ä"); node = getnode (node.target,"targetname"); self setgoalnode (node); self waittill ("goal"); level waittill ("go onward"); if (isdefined (node.target)) { node = getnode (node.target,"targetname"); self setgoalnode (node); self waittill ("goal"); } level waittill ("final charge"); if (isdefined (node.target)) { node = getnode (node.target,"targetname"); self setgoalnode (node); self waittill ("goal"); } flag_wait ("got panzers"); self.goalradius = 512; } go_target () { self setgoalnode (getnode (self.target,"targetname")); } playSoundinSpace (alias, origin) { org = spawn ("script_origin",(0,0,1)); org.origin = origin; org playsound (alias, "sounddone"); org waittill ("sounddone"); org delete(); } getExplodeDeath(msg, org, dist) { if (isdefined (org)) { if (dist < 50) return level.scr_anim[msg]["explode death up"]; ang = vectornormalize ( self.origin - org ); ang = vectorToAngles (ang); ang = ang[1]; ang -= self.angles[1]; if (ang <= -180) ang += 360; else if (ang > 180) ang -= 360; if ((ang >= 45) && (ang <= 135)) return level.scr_anim[msg]["explode death forward"]; if ((ang >= -135) && (ang <= -45)) return level.scr_anim[msg]["explode death back"]; if ((ang <= 45) && (ang >= -45)) return level.scr_anim[msg]["explode death right"]; return level.scr_anim[msg]["explode death left"]; } randdeath = randomint(5); if (randdeath == 0) return level.scr_anim[msg]["explode death up"]; else if (randdeath == 1) return level.scr_anim[msg]["explode death back"]; else if (randdeath == 2) return level.scr_anim[msg]["explode death forward"]; else if (randdeath == 3) return level.scr_anim[msg]["explode death left"]; return level.scr_anim[msg]["explode death right"]; } msg_send (guy, lvlmsg, msg) { guy waittill (msg); level notify (lvlmsg); } wait_any (guy, lvlmsg, msg1, msg2, msg3, msg4, msg5, msg6, msg7) { if (isdefined (msg1)) level thread msg_send (guy, lvlmsg, msg1); if (isdefined (msg2)) level thread msg_send (guy, lvlmsg, msg2); if (isdefined (msg3)) level thread msg_send (guy, lvlmsg, msg3); if (isdefined (msg4)) level thread msg_send (guy, lvlmsg, msg4); if (isdefined (msg5)) level thread msg_send (guy, lvlmsg, msg5); if (isdefined (msg6)) level thread msg_send (guy, lvlmsg, msg6); if (isdefined (msg7)) level thread msg_send (guy, lvlmsg, msg7); } german_retreat () // Handles germans that have fled from the church to flee to the end of the level { trigger = getent (self.target,"targetname"); // while (1) // { // self waittill ("trigger"); ai = getaiarray ("axis"); retreater = []; for (i=0;i= nodes.size) index = 0; } ai = undefined; retreater = undefined; nodes = undefined; // wait (2); // } } retreater_think ( node ) { self endon ("death"); self.goalradius = 4; self setgoalnode (node); self.bravery = 500000; self.suppressionwait = 0; self waittill ("goal"); self.goalradius = 512; } elder ( spawner ) { spawner waittill ("spawned",spawn); // Keep trying because Elder is required. while (maps\_utility::spawn_failed(spawn)) { wait (1); spawner.count = 1; spawn = spawner dospawn(); } flag_set ("elder exists"); level.elder = spawn; spawn.animname = "elder"; spawn character\_utility::new(); spawn character\elder::main(); spawn.script_usemg42 = false; spawn.dontFollow = true; spawn thread maps\_utility::magic_bullet_shield(); } moody ( spawner ) { spawner waittill ("spawned",spawn); // Keep trying because Moody is required. while (maps\_utility::spawn_failed(spawn)) { wait (1); spawner.count = 1; spawn = spawner dospawn(); } flag_set ("moody exists"); level.moody = spawn; spawn.animname = "moody"; spawn character\_utility::new(); spawn character\moody::main(); spawn thread maps\_utility::magic_bullet_shield(); spawn.script_usemg42 = false; spawn.dontFollow = true; level thread moodyChat(spawn); } moodyChat ( spawn ) { trigger = getent ("moody chat trigger","targetname"); trigger waittill ("trigger"); if (!level.flag["church has been defended"]) { // Damnit Martin, get to the church with Foley. We got this area covered." spawn anim_single_solo (spawn, "got it covered"); } } second_flak_preaction () { allied_spawners = getentarray ("second flak guys allied","targetname"); axis_spawners = getentarray ("second flak guys axis","targetname"); spawned_allies = false; while (1) { self waittill ("trigger"); if (!flag("church has been defended")) { if (spawned_allies) continue; spawned_allies = true; for (i=0;i We're seeing some light acion, but we've got this area covered sir! //iprintlnbold (&"DAWNVILLE_LIGHTACTION"); flag_wait ("east tank destroyed"); church_entrance_trigger = getent ("church entrance","targetname"); while (level.player istouching (church_entrance_trigger)) wait (0.05); // church_entrance_trigger waittill ("trigger"); // level waittill ("church under siege"); // for (i=0;i 1) teleporter = true; else teleporter = false; spawn = undefined; spawner waittill ("spawned",spawn); /* if (!isalive(spawn)) { println ("spawn aint alive!"); println ("there are ", getaiarray().size," ai"); } else { wait (1); if (isalive (spawn)) spawn delete(); continue; } */ if (maps\_utility::spawn_failed(spawn)) { /* println ("Spawn failed!"); wait (1); if (isalive (spawn)) { println ("but the spawn lives!!!!!"); spawn delete(); } */ continue; } spawn thread churchStayinAlive(); spawn.suppressionwait = 0; if (teleporter) spawn thread churchAttackMove(spawner, teleporter); } } churchStayinAlive () { self endon ("death"); maxhealth = self.maxhealth; if (!flag("player is at church")) { oldhealth = self.health; self.health = 500000; level waittill ("player is at church"); self.health = oldhealth; self.maxhealth = maxhealth; } while (1) { level waittill ("player is not at church"); oldhealth = self.health; self.health = 500000; level waittill ("player is at church"); self.health = oldhealth; self.maxhealth = maxhealth; } } churchAttackMove (spawner, teleporter) { startOrigin = spawner.origin; self endon ("death"); level endon ("fallback initiated " + self.script_fallback); println ("fallback is ", self.script_fallback); node = getnode ("escape","targetname"); startnode = getnode (self.target,"targetname"); oldradius = self.goalradius; while (1) { wait (15 + randomfloat (4)); if (!teleporter) wait (20); self.goalradius = 4; while (distance (self.origin, node.origin) > 64) { self setgoalnode (node); self waittill ("goal"); } if (!teleporter) { self delete(); return; } self teleport (startOrigin); self.goalradius = oldradius; self setgoalnode (startnode); self waittill ("goal"); } } flak_node ( spawn ) { spawn endon ("death"); if (!isdefined (spawn.target)) return; node = getnode (spawn.target,"targetname"); spawn setgoalnode (node); spawn waittill ("goal"); wait (0.2); spawn.goalradius = 1000; } flak_attackers ( spawn ) { level.flak_attackers++; level thread flak_node(spawn); spawn waittill ("death"); level.flak_attackers--; } more_attackers () { // if (level.flag["got panzers"]) // return; // level endon ("got panzers"); if (flag ("east tank destroyed")) return; level endon ("east tank destroyed"); ai = getentarray ("flak_attack","targetname"); level.flak_attackers = 0; for (i=0;i 2) continue; ai[i] thread spawn_node_attack(::flak_attackers); } } } tank_killers_death (node, guy) { node waittill ("death"); for (i=0;i 0) ai[0] DoDamage ( ai[0].health + 50, (randomint(5000)-2500,randomint(5000)-2500,randomint(5000)-2500) ); else return; wait (1 + randomfloat (1)); } } deleteFarthestAllies () { potentialAI = getaiarray ("allies"); ai = []; foley = getent ("foley","targetname"); if (!isdefined (level.moody)) level.moody = foley; if (!isdefined (level.elder)) level.elder = foley; if (!isdefined (level.parker)) level.parker = foley; for (i=0;i range) { range = newrange; index = p; } } if (index != -1) ai[index].goneNow = true; } for (p=0;p spawn.goalradius - 5) wait (0.5); spawn notify ("stop following foley"); */ guy[0] = spawn; guy[1] = foley; node = getnode ("parker scene","targetname"); foley allowedstances ("stand"); maps\_anim::anim_reach (guy, "get mortars", undefined, node); foley lookat (foley, 0); level thread croucher(); maps\_anim::anim_single (guy, "get mortars", undefined, node); flag_set ("parker speech"); level.flag["Friendlies crouch for conference"] = false; maps\_utility::chain_off ("450"); maps\_utility::chain_on ("460"); chain = get_friendly_chain_node ("460"); level.player SetFriendlyChain (chain); foley allowedstances ("crouch", "stand"); foley setgoalentity (level.player); spawn setgoalentity (level.player); spawn notify ("stop magic bullet shield"); } croucher () { wait (1.15); flag_set("Friendlies crouch for conference"); println ("^3time to crouch!"); //trigger = getent ("croucher","targetname"); //thread croucher_trigger (trigger); ai = getaiarray ("allies"); foley = getent ("foley", "targetname"); for (i=0;i= 2) break; } level notify ("mortars ongoing STOP"); } // Give the player a hint for when he first picks up an fg42 rateOfFireHintCheck () { return; while (1) { level.player waittill ("pickup", item); // item = item.classname; println ("^5Item was ", item); if ((item == "FG42") || (item == "weapon_FG42")) break; } maps\_utility::keyHintPrint(&"DAWNVILLE_RATE_OF_FIRE", getKeyBinding("weapalt")); } distanceTankRumbleDeathEnder () { level waittill ("stop tank rumble"); wait (2); self delete(); } distantTankRumble () { org = spawn ("script_origin",(0,0,0)); org endon ("death"); org thread distanceTankRumbleDeathEnder(); // org.origin = (2396, -16170, 50); offset = 11200; vec = (2396, -16170, 50); while (offset > 0) { offset -= 50; org.origin = (vec[0] + offset, vec[1], vec[2]); org playloopsound ("panzerIV_engine_high"); wait (0.05); } } tankBlowsUpBuilding ( tank ) { tank endon ("death"); org = getent ("tank east target","targetname"); tank setTurretTargetEnt( org, ( 0, 0, 0 ) ); tank waittill( "turret_on_vistarget" ); tank FireTurret(); // origin, range, max damage, min damage radiusDamage (org.origin, 550, level.player.health * 0.85, level.player.health * 0.25); // mystery numbers! if (distance (level.player.origin, org.origin) < 500) maps\_shellshock::main(7); maps\_utility::exploder(10); block = getent ("safehouse block","targetname"); block solid(); block disconnectpaths(); destroyed = getentarray ("destroy these","targetname"); for (i=0;i timer) { randomx = randomint ( 15 ) + 25; if (randomint (100) > 50) randomx *= -1; randomy = randomint ( 15 ) + 25; if (randomint (100) > 50) randomy *= -1; timer = gettime() + 12000 + randomint (6500); playSoundinSpace ("mortar_incoming", level.player.origin + (randomx, randomy, 0) ); mortar_hit_explosion ( level.player.origin + (randomx, randomy, 0) ); maps\_shellshock::main(9); break; } wait (1); } timer = gettime() + 6000; while (!level.player istouching (safe_trigger)) { if (gettime() > timer) { playSoundinSpace ("mortar_incoming", level.player.origin); mortar_hit_explosion ( level.player.origin ); } wait (1); } thread punishPlayerForLeavingSafety( safe_trigger ); flag_wait ("mortars stop"); maps\_utility::autosave(1); level thread objective_org (0, foley); level thread house_guy_function(foley, house_guy); level waittill ("left safehouse!"); maps\_spawner::flood_spawn (getentarray ("church annoyer","targetname")); foley lookat( foley, 0 ); wait (0.25); level notify ("go go go"); // if (isalive (tank)) foley setgoalnode (foley_outernode); wait (1); array_thread(getentarray ("reprimand church","targetname"), ::spawn_attack); wait (1.5); array_thread(getentarray ("group2","targetname"), ::spawn_attack); level notify ("tank start east"); clip solid(); clip disconnectpaths(); wait (12); obj0Complete = false; if (level.flag["got panzers"]) { foley notify ("stop being objective"); objective_state(0, "done"); obj0Complete = true; } thread sequence_1_tank(obj0Complete); tank = getent ("tank east","targetname"); if (isalive (tank)) { if (isalive (jackson)) { // We got company! Tiger, moving in from the east!" jackson thread anim_single_solo (jackson, "tiger incoming"); waittill_either (jackson, "tiger incoming","death"); } else if (isalive (baker)) { // Enemy tank! Look out! baker thread anim_single_solo (baker, "enemy tank"); waittill_either (baker, "enemy tank","death"); } wait (1); // Behind you! foley anim_single_solo (foley, "behind you"); } if (!level.flag["got panzers"]) { if (!obj0Complete) { foley notify ("stop being objective"); objective_state(0, "done"); } // objective_state(0, "done"); foley notify ("stop being objective"); objective_add(1, "active", &"DAWNVILLE_OBJ1", getent ("panzerfaust","targetname").origin); objective_current(1); getent ("infinite panzerfaust","targetname") notify ("infinite panzerfaust objective on"); thread gotPanzers(); } level notify ("go onward"); if (isalive (tank)) foley setgoalnode (foley_finalnode); // foley waittill ("goal"); // Guys that run in from off camera to help the player array_thread(getentarray ("reinforcements","targetname"), ::reinforcements_think); if ((isalive (tank)) && (!level.flag["got panzers"])) wait (4); if ((isalive (tank)) && (!level.flag["got panzers"])) { // That's a Tiger! Martin, get a Panzerfaust from the church and take that mother out!" foley anim_single_solo (foley, "get a panzer"); wait (1); } // Turn on the guys in the church level notify ("church defenders start"); if ((isalive (tank)) && (!level.flag["got panzers"])) wait (12); array_thread(getentarray ("group2","targetname"), ::spawn_attack); if ((isalive (tank)) && (!level.flag["got panzers"])) wait (2); if ((isalive (tank)) && (!level.flag["got panzers"])) { // wait (4); // Jackson, Baker, we'll draw their fire! Go!" foley anim_single_solo (foley, "draw their fire"); wait (1); } //iprintlnbold (" Alright everybody, LET'S GO!"); level notify ("final charge"); level notify ("reinforcements move up"); if (isalive (tank)) foley setgoalnode (foley_finalchargeNode); if ((isalive (tank)) && (!level.flag["got panzers"])) wait (6); array_thread(getentarray ("reprimand church","targetname"), ::spawn_attack_moveup); ai = getaiarray ("allies"); for (i=0;i Mortars!! Let's find that mortar team!"); objective_state(4, "done"); maps\_utility::autosave(5); // Take out the mortar team objective_add(5, "active", &"DAWNVILLE_OBJ5", getent ("faux mortar","targetname").origin); objective_current(5); foley.followmin = 4; foley.followmax = 12; push_germans_back_trigger maps\_utility::triggerOn(); regroup_friendly_trigger maps\_utility::triggerOn(); chain = get_friendly_chain_node ("115"); level.player SetFriendlyChain (chain); // Make friendlies move up to the first flak area. foley thread anim_single_solo (foley, "regroup"); } sequence_3b () { foley = getent ("foley","targetname"); start_tank_trigger = getent ("start tank","targetname"); start_tank_trigger maps\_utility::triggerOn(); level thread distantTankRumble(); start_tank_trigger waittill ("trigger"); // Wait for the player to double back // wait (3); level notify ("tank start northeast"); array_thread(getentarray ("east mg42","script_noteworthy"), maps\_utility::triggerOff); wait (0.05); // Friendly chain in the middle of the level // maps\_utility::chain_on ("125"); // level thread tempPlayerKill (getent ("player tank death","targetname")); thread foleyTakeCover(foley); thread killAIbehindTank(); //trigger = getent ("tank target","targetname"); //trigger waittill ("trigger"); //Destroy the second tank. playerWeapon[0] = level.player getweaponslotweapon("primary"); playerWeapon[1] = level.player getweaponslotweapon("primaryb"); if ((playerWeapon[0] == "panzerfaust") || (playerWeapon[1] == "panzerfaust")) { objective_string(5, &"DAWNVILLE_OBJ5SECONDTANK"); level thread objective_org(5, getent ("tank northeast","targetname")); level thread tankObjectiveComplete(); } else { objective_string(5, &"DAWNVILLE_OBJ1"); objective_position(5, getent ("panzerfaust","targetname").origin); getent ("infinite panzerfaust","targetname") notify ("infinite panzerfaust objective on"); thread tankReplacesObjective(); thread foleyTellsYouToGetAnotherPanzerfaust(foley); } objective_current(5); level notify ("stop tank rumble"); // SPlash shield change tank = getent ("tank northeast","targetname"); tank.health = 1000; tank thread splash_shield(); // thread constant_attack("flak_attack", 15); foley setgoalentity (level.player); foley.goalradius = 250; foley lookat( level.player, 4 ); // wait (14); level notify ("tank start west"); thread tank_west_trigger( getent ("last tank attacks","targetname") ); flag_wait ("northeast tank destroyed"); wait (0.1); // Duh the notifies happen simultaneously wait (1); maps\_utility::autosave(6); wait (1); // Nice shot, Martin." if (isalive (level.player)) foley thread anim_single_solo (foley, "hey man nice shot"); if (!flag("chain 125 off forever")) { regroup_friendly_trigger = getent ("regroup friendly chain","targetname"); regroup_friendly_trigger maps\_utility::triggerOff(); chain = get_friendly_chain_node ("125"); level.player SetFriendlyChain (chain); } /* objective_add(7, "active","", (-4288,-15629,76)); objective_string(7,&"DAWNVILLE_OBJ7",2); //Destroy the mortar team [%s remaining] objective_current(7); */ sequence_4(); // Broken off to be able to start at sequence 4 for testing. } splash_shield () { healthbuffer = 2000; self.health += healthbuffer; while(self.health > 0) { oldhealth = self.health; self waittill ("damage",amount, attacker); if (attacker != level.player) { self.health = oldhealth; continue; } else if (amount > 999) break; } radiusDamage ( self.origin, 2, 10000, 9000); } sequence_4 () { // Throw some guys out there to defend the latest tank array_thread(getentarray ("flak_attack","targetname"), ::spawn_attack); // Guy that runs up and tells foley about the mortar guys. thread parkerSpawnerThink(); foley = getent ("foley", "targetname"); // array_levelthread (getentarray ("reinforcers","targetname"), ::tank_west_escort); if (!flag("west tank destroyed")) { if (!flag ("west tank attacks")) { objective_add(6, "active", &"DAWNVILLE_OBJ5", getent ("faux mortar 2","targetname").origin); objective_current(6); flag_wait ("west tank attacks"); } if (!flag("west tank destroyed")) { // // Guys that run out ahead to shoot the player! // array_levelthread (getentarray ("reinforcers","targetname"), ::tank_west_escort); //Destroy the third tank. objective_add(6, "active", &"DAWNVILLE_OBJ6", getnode ("final goal", "targetname").origin); objective_current(6); // objective_string(7,&"DAWNVILLE_OBJ7",mortarTeams); level thread objective_org (6, getent ("tank west","targetname")); // objective_current(6); // iprintlnbold (" Another tank! He's moving in quick!"); flag_wait ("west tank destroyed"); } objective_state(6, "done"); // thread niceShot(foley); } thread sequence_5(); foley.followMin = 0; foley.followMax = 5; // level notify ("tank killers go!"); thread mortar_ongoing(); flag_wait ("parker speech"); // foley setgoalnode (getnode ("foley prep","targetname")); println ("foley go to node"); foley setgoalentity (level.player); maps\_utility::chain_on ("500"); } sequence_5 () { mortarTeams = level.mortar_team_position.size; if (mortarTeams > 0) { // maps\_utility::autosave(7); // chain = get_friendly_chain_node ("100"); // level.player SetFriendlyChain (chain); objectiveOrg = level.mortar_team_position[mortarTeams-1]; objective_add(7, "active","", objectiveOrg); //Destroy the mortar team [%s remaining] objective_string(7,&"DAWNVILLE_OBJ7",mortarTeams); objective_current(7); kill_germans_at_trigger( "germans at second flak" ); while (1) { level waittill ("Mortar Team Dispatched"); mortarTeams = level.mortar_team_position.size; println ("mortar: ", mortarTeams, " mortars left"); if (mortarTeams > 0) { objectiveOrg = level.mortar_team_position[mortarTeams-1]; objective_add(7, "active","", objectiveOrg); //Destroy the mortar team [%s remaining] objective_string(7,&"DAWNVILLE_OBJ7",mortarTeams); objective_current(7); if (isalive (elder)) elder thread getToNode ("elder"); if (isalive (moody)) moody thread getToNode ("moody"); } else break; } // trigger = getent ("final area","targetname"); // trigger waittill ("trigger"); // wait_until_no_axis (trigger); //Destroy the mortar team [%s remaining] } objective_string(7,&"DAWNVILLE_OBJ7",0); objective_state(7, "done"); //Regroup with Cpt Foley at the French car. flag_wait ("parker speech"); objective_add(8, "active", &"DAWNVILLE_OBJ8", (getent ("end level trigger", "targetname")) getorigin()); objective_current(8); level notify ("mortars ongoing STOP"); flag_wait ("friendlies report to the car"); foley = getent ("foley","targetname"); flag_wait ("moody exists"); moody = level.moody; flag_wait ("elder exists"); elder = level.elder; elder getToNode ("elder"); moody getToNode ("moody"); foley lookat( foley, 0 ); car = getent ("car","targetname"); level.car = car; car.health = 50000; car makeVehicleUnusable(); //not usable until appropriate moment // car playloopsound ("peugeot_idle_low"); car.animname = "car"; car assignanimtree(); door_solid = getent ("car door","targetname"); door_solid linkto (car, "tag_door_back_left", (0,0,0), (0,90,0)); if (!isdefined (foley)) maps\_utility::error ("no foley"); if (!isdefined (moody)) maps\_utility::error ("no moody"); if (!isdefined (elder)) maps\_utility::error ("no elder"); // carbase anim_single_solo ( car, "start"); moody linkto (car, "tag_driver", (0,0,0), (0,0,0)); moody animscripts\shared::PutGunInHand("none"); elder linkto (car, "tag_passenger", (0,0,0), (0,0,0)); car thread anim_loop_solo ( moody, "idle", "tag_driver", "moody stop"); car thread anim_loop_solo ( elder, "startidle", "tag_passenger", "elder stop"); maps\_spawner::kill_spawnerNum(7); maps\_spawner::kill_spawnerNum(8); thread killAllAxisOverTime(); car attachPath( getvehiclenode ("ride out","targetname")); car startPath(); wait (0.1); // car thread maps\_utility::playLoopSoundOnTag("peugeot_idle_high", "tag_origin"); car waittill ("reached_end_node"); car setanim (level.scr_anim[car.animname]["start"]); foley setgoalnode (getnode ("foley node","targetname")); println ("foley go to foley node"); foley.goalradius = 256; // car anim_reach_solo ( foley, "reach idle", "tag_driver"); foley allowedstances ("crouch","stand"); println ("foley must now get to foley node"); foley getToNode ("foley"); foley attach("xmodel/dawnville_pencil", "tag_weapon_right"); foley attach("xmodel/dawnville_map", "tag_weapon_left"); foley animscripts\shared::PutGunInHand("none"); car thread anim_loop_solo ( foley, "idle", "tag_driver", "foley stop"); thread getInCar(getent ("end level trigger","targetname")); end_level_trigger = getent ("end level trigger","targetname"); end_level_trigger maps\_utility::triggerOn(); end_level_trigger setHintString(&"DAWNVILLE_CAR"); end_level_trigger enableLinkto(); end_level_trigger linkto (car, "tag_door_back_left", (0,0,0), (0,90,0)); // moody lookat (level.player); while (1) { car notify ("moody stop"); // carbase thread anim_single_solo (moody, "01"); car anim_single_solo ( moody, "wave", "tag_driver"); car thread anim_loop_solo ( moody, "idle", "tag_driver", "moody stop"); timer = 5 + randomfloat (8); timer *= 1000; timer += gettime(); breaker = false; while (gettime() < timer) { if (flag("player got in car")) { breaker = true; break; } else wait (0.1); } if (breaker) break; } // moody lookat (moody, 0); end_level_trigger delete(); door_solid delete(); objective_state(8, "done"); /* carbase anim_single_solo ( car, "playerin"); car.origin = carbase.origin; car.angles = carbase.angles; carbase notify ("elder stop"); carbase thread anim_single_solo ( car, "trans"); carbase anim_single_solo ( elder, "trans", "tag_passenger"); carbase thread anim_loop_solo ( elder, "idle", "tag_passenger"); // carbase thread anim_loop_solo ( car, "idle", "tag_passenger"); car.origin = carbase.origin; car.angles = carbase.angles; */ car notify ("elder stop"); car notify ("moody stop"); car notify ("foley stop"); foley allowedstances ("stand"); foley setgoalnode (getnode ("foley hide","targetname")); foley.goalradius = 4; car thread anim_single_solo ( elder, "end", "tag_passenger"); car thread anim_single_solo ( foley, "end", "tag_driver"); // car thread anim_single_solo ( car, "end"); car setanimknob (level.scr_anim[car.animname]["end"]); level thread playSoundinSpace ("car_door_close", car.origin); car anim_single_solo ( moody, "end", "tag_driver"); car thread anim_loop_solo ( elder, "idle", "tag_passenger"); car thread anim_loop_solo ( moody, "endidle", "tag_driver"); // objective_add(8, "active", "Regroup with Cpt Foley at the French car.", (getent ("end level trigger", "targetname")) getorigin()); // objective_current(8); // if (level.playerWeapon[0] != "none") // level.player giveWeapon(level.playerWeapon[0]); // if (level.playerWeapon[1] != "none") // level.player giveWeapon(level.playerWeapon[1]); missionSuccess ("carride", true); // foley waittill ("goal"); } getInCar( trigger ) { trigger waittill ("trigger"); level.car setmodel ("xmodel/vehicle_car"); org = spawn ("script_origin",(0,0,0)); org.origin = level.player.origin; level.player linkto (org); car = getent ("car","targetname"); origin = car gettagOrigin ("tag_player"); org moveto (origin, 1, 0.5, 0.5); wait (0.8); flag_set ("player got in car"); level.player allowLeanLeft(false); level.player allowLeanRight(false); level.player allowProne(false); level.player allowCrouch(false); // level.playerWeapon[0] = level.player getweaponslotweapon("primary"); // level.playerWeapon[1] = level.player getweaponslotweapon("primaryb"); // level.player takeallweapons(); } carTrigger ( trigger ) { trigger waittill ("trigger"); tank = getent ("tank west","targetname"); if (isalive (tank)) radiusDamage (tank.origin, 2, tank.health + 5000, tank.health + 5000); // mystery numbers! flag_wait ("parker speech"); flag_set ("friendlies report to the car"); foley = getent ("foley","targetname"); flag_wait ("moody exists"); flag_wait ("elder exists"); moody = level.moody; elder = level.elder; foley.dontavoidplayer = true; foley setgoalnode (getnode ("foley node","targetname")); moody.dontavoidplayer = true; moody setgoalnode (getnode ("moody node","targetname")); elder.dontavoidplayer = true; elder setgoalnode (getnode ("elder node","targetname")); } getToNode( msg ) { node = getnode (msg + " node","targetname"); self.goalradius = 4; while (distance (self.origin, node.origin) > 32) { self setgoalnode (node); self waittill ("goal"); } } anim_loop ( guy, anime, tag, ender, node, tag_entity ) { maps\_anim::anim_loop ( guy, anime, tag, ender, node, tag_entity ); } anim_loop_solo ( guy, anime, tag, ender, node, tag_entity ) { newguy[0] = guy; maps\_anim::anim_loop ( newguy, anime, tag, ender, node, tag_entity ); } anim_teleport_solo (guy, anime, tag, node, tag_entity) { newguy[0] = guy; maps\_anim::anim_single (newguy, anime, tag, node, tag_entity); } anim_single (guy, anime, tag, node, tag_entity) { maps\_anim::anim_single (guy, anime, tag, node, tag_entity); } anim_single_solo (guy, anime, tag, node, tag_entity) { newguy[0] = guy; maps\_anim::anim_single (newguy, anime, tag, node, tag_entity); } anim_reach_solo (guy, anime, tag, node, tag_entity) { newguy[0] = guy; maps\_anim::anim_reach (newguy, anime, tag, node, tag_entity); } array_thread (ents, process, var, excluders) { maps\_utility::array_thread (ents, process, var, excluders); } array_levelthread (ents, process, var, excluders) { maps\_utility::array_levelthread (ents, process, var, excluders); } random (array) { return array [randomint (array.size)]; } lookat (ent, timer) { if (!isdefined (timer)) timer = 10000; self animscripts\shared::lookatentity(ent, timer, "alert"); } flag_wait (msg) { if (!level.flag[msg]) level waittill (msg); } flag_set (msg) { level.flag[msg] = true; level notify (msg); } flag (msg) { if (!level.flag[msg]) return false; return true; } assignanimtree() { self UseAnimTree(level.scr_animtree[self.animname]); } waittill_either_think (ent, msg) { println (ent, "^1 is waiting for ", msg); ent waittill (msg); println (ent, "^1 got ", msg); self notify ("got notify"); } waittill_either(waiter, msg1, msg2, msg3 ) { ent = spawnstruct(); if (isdefined (msg1)) ent thread waittill_either_think(waiter, msg1); if (isdefined (msg2)) ent thread waittill_either_think(waiter, msg2); if (isdefined (msg3)) ent thread waittill_either_think(waiter, msg3); ent waittill ("got notify"); } bloody_death_waittill () { self waittill ("death"); if (!isdefined (self)) return; self bloody_death(); } bloody_death() { tag_array = level.scr_dyingguy["tag"]; tag_array = maps\_utility::array_randomize(tag_array); tag_index = 0; waiter = false; if (getcvar ("cg_blood") == "0") level._effect["flesh small"] = level._effect["ground"]; for (i=0;i<3 + randomint (5);i++) { playfxOnTag ( level._effect [random (level.scr_dyingguy["effect"])], self, level.scr_dyingguy["tag"][tag_index] ); thread playSoundOnTag(random (level.scr_dyingguy["sound"]), level.scr_dyingguy["tag"][tag_index]); tag_index++; if (tag_index >= tag_array.size) { tag_array = maps\_utility::array_randomize(tag_array); tag_index = 0; } if (waiter) { wait (0.05); waiter = false; } else waiter = true; // wait (randomfloat (0.3)); } } playSoundOnTag (alias, tag) { if ((isSentient (self)) && (!isalive (self))) return; org = spawn ("script_origin",(0,0,0)); thread delete_on_death (org); if (isdefined (tag)) org linkto (self, tag, (0,0,0), (0,0,0)); else { org.origin = self.origin; org.angles = self.angles; org linkto (self); } org playsound (alias, "sounddone"); org waittill ("sounddone"); org delete(); } delete_on_death (ent) { ent endon ("death"); self waittill ("death"); if (isdefined (ent)) ent delete(); } kill_ai_touching (trigger, team) { println ("^2 killing AI touching trigger"); ai = getaiarray (team); for (i=0;i