cod-sdk/main/maps/dawnville.gsc

4082 lines
102 KiB
Plaintext
Raw Permalink Blame History

#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<ai.size;i++)
ai[i] setgoalpos (ai[i].origin);
thread sequence_init();
if (getcvar ("start") == "whale")
{
chain = get_friendly_chain_node ("50");
level.player SetFriendlyChain (chain);
thread sequence_3b();
thread guyFleesTank (getent ("player advances","targetname"));
clip = getent ("second flak monster clip","targetname");
clip connectpaths();
clip delete();
array_thread(getentarray ("church rear","script_noteworthy"), maps\_utility::triggerOff);
level.player setOrigin ((900, -15045, -24));
level.flag["west tank finished moving"] = false;
level.flag["west tank destroyed"] = false;
level.flag["east tank finished moving"] = true;
level.flag["east tank destroyed"] = true;
level.flag["northeast tank finished moving"] = false;
level.flag["northeast tank destroyed"] = false;
level.flag["mortars stop"] = true;
level.flag["got panzers"] = true;
level.flag["church has been defended"] = true;
level.flag["player is at church"] = true;
spawner = getent ("moody","script_noteworthy");
spawner.count = 1;
spawn = spawner dospawn();
wait (1);
spawn setgoalentity (level.player);
return;
}
if (getcvar ("start") == "tank")
{
// level.flag["west tank finished moving"] = true;
// level.flag["west tank destroyed"] = true;
level.flag["east tank finished moving"] = true;
level.flag["east tank destroyed"] = true;
level.flag["northeast tank finished moving"] = true;
level.flag["northeast tank destroyed"] = true;
level.flag["mortars stop"] = true;
level.flag["got panzers"] = true;
level.flag["church has been defended"] = true;
level.flag["player is at church"] = true;
level.flag["foley moves on"] = true;
// level.flag["west tank attacks"] = true;
chain = get_friendly_chain_node ("50");
level.player SetFriendlyChain (chain);
level.player setOrigin ((729, -16475, 72));
level notify ("tank start west");
wait (1);
thread tank_west_trigger( getent ("last tank attacks","targetname") );
thread sequence_4();
/*
spawners = getentarray ("end allies","targetname");
for (i=0;i<spawners.size;i++)
{
spawn = spawners[i] stalingradspawn();
if (spawn.script_friendname == "Moody")
{
spawn character\_utility::new();
spawn character\moody::main();
}
else
{
spawn character\_utility::new();
spawn character\elder::main();
}
}
*/
spawner = getent ("moody","script_noteworthy");
spawner.count = 1;
spawn = spawner dospawn();
wait (1);
spawn setgoalentity (level.player);
return;
}
thread sequence_1();
wait (10);
}
ai_overrides()
{
spawners = getspawnerteamarray("allies");
for (i=0;i<spawners.size;i++)
spawners[i] thread spawner_overrides();
ai = getaiarray("allies");
for (i=0;i<ai.size;i++)
ai[i].bravery = 500000;
if (getcvar ("scr_dawnville_fast") == "1")
{
for (i=0;i<ai.size;i++)
{
if (!isdefined (ai[i].script_dawnville_fast))
continue;
if (ai[i].script_dawnville_fast != 2)
continue;
ai[i] DoDamage ( 1500, (randomint(5000)-2500,randomint(5000)-2500,randomint(5000)-2500) );
}
}
}
spawner_overrides()
{
if (getcvar ("scr_dawnville_fast") == "1")
{
if ((isdefined (self.script_dawnville_fast)) && (self.script_dawnville_fast == 2))
{
self delete();
return;
}
}
while (1)
{
self waittill ("spawned", spawned);
wait (0.05);
if (issentient (spawned))
spawned.bravery = 500000;
}
}
delete_this (ent)
{
ent delete();
}
wait_until_no_axis (trigger)
{
while (1)
{
ai = getaiarray ("axis");
breaker = true;
for (i=0;i<ai.size;i++)
{
if (ai[i] istouching (trigger))
breaker = false;
}
if (breaker)
{
wait (5);
ai = getaiarray ("axis");
for (i=0;i<ai.size;i++)
{
if (ai[i] istouching (trigger))
breaker = false;
}
}
if (breaker)
break;
wait (2.5);
}
}
// Various functions for doing mortars near the player
mortar_init ()
{
level.mortarTime = 5000;
mortars = getentarray ("mortar spot","targetname");
for (i=0;i<mortars.size;i++)
{
mortars[i].usedTime = 0;
}
}
mortar_closest ()
{
mortars = getentarray ("mortar spot","targetname");
index = 0;
dist = distance (level.player.origin, mortars[index].origin);
currentTime = gettime();
indexSecondClosest = -1;
for (i=0;i<mortars.size;i++)
{
if (mortars[i].usedTime > 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<tankTrigger.size;i++)
{
if (tankTrigger[i].script_noteworthy == self.script_noteworthy)
{
tankTrigger = tankTrigger[i];
break;
}
}
damage_trigger thread tank_rampage_explode(tank, self.script_noteworthy, self);
self endon ("destroyed");
tank = getent ("tank northeast","targetname");
if (!isalive (tank))
return;
tank endon ("death");
while (1)
{
self waittill ("trigger");
if (!tank isTanktouching (tankTrigger))
continue;
level.rampage_index = self.target;
level.rampage_org = org;
level.rampageTrigger = self;
level notify ("got rampage trigger");
}
}
tank_rampage()
{
self endon ("death");
// These triggers make the northeast tank shoot at the player
array_thread(getentarray ("tank rampage","targetname"), ::tank_rampage_trigger, self);
ref = getent ("gate reference","targetname");
offset = 50;
while (1)
{
level waittill ("got rampage trigger");
self notify ("stop wanderaiming");
rampageTrigger = level.rampageTrigger;
if ((self.origin[0] < ref.origin[0] + offset) && (self.origin[0] > 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<nodes.size;i++)
{
if (isdefined (nodes[i].usedForAttack))
continue;
nodes[i].usedForAttack = true;
return nodes[i];
}
return undefined;
}
player_attackers_reroute ()
{
level waittill ("new tank guard nodes");
node = getUnusedAttackNode (level.tank_guard_nodes);
if (isdefined(node))
{
self setgoalnode (node);
self.goalradius = node.radius;
}
}
player_attackers_spawner ()
{
self.count = 1;
spawn = self dospawn();
if (maps\_utility::spawn_failed(spawn))
return;
if (isdefined (level.tank_guard_nodes))
node = getUnusedAttackNode (level.tank_guard_nodes);
if (isdefined(node))
{
spawn setgoalnode (node);
spawn.goalradius = node.radius;
}
else
{
spawn setgoalentity (level.player);
spawn.goalradius = 340;
}
level.player_attackers++;
spawn thread player_attackers_reroute();
spawn waittill ("death");
if (isdefined (node))
node.usedForAttack = undefined;
level.player_attackers--;
level notify ("player attacker died");
}
player_attackers_spawnAgain ( trigger, spawners )
{
trigger waittill ("trigger");
array_thread(spawners, ::player_attackers_spawner);
}
player_attackers ()
{
level endon ("northeast tank destroyed");
level.player_attackers = 0;
spawners = getentarray ("attack player","targetname");
trigger = getent ("player attack trigger","targetname");
wait (5);
array_thread(spawners, ::player_attackers_spawner);
array_levelthread(getentarray ("tank defenders attack","targetname"), ::player_attackers_spawnAgain, spawners);
/*
while (1)
{
if (level.player_attackers > 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<triggerHints.size;i++)
{
if (triggerHints[i].script_noteworthy == self.script_noteworthy)
{
tank.triggerHint = triggerHints[i];
tank.triggerHint enableLinkto();
tank.triggerHint linkto (tank,"tag_origin",(0,0,0),(0,0,0));
break;
}
}
if (self.script_noteworthy == "northeast")
{
tank.nospawning = true;
tank thread maps\_panzerIV::init("mg42_tiger_tank");
}
else
tank thread maps\_tiger::init();
tank.script_noteworthy = self.script_noteworthy;
if (self.script_noteworthy == "west")
{
clip = getent ("west tank clip","targetname");
clip disconnectpaths();
}
tank.health = 1000;
if (self.script_noteworthy == "northeast")
{
tank thread tank_northeast_shoot();
tank.health = 100000;
}
if (self.script_noteworthy == "west")
tank.health = 100000;
else
tank thread triggerHintThink(tank.triggerHint);
thread tank_end_events(tank);
tank endon ("death");
level thread tank_death_event(tank);
// thread tank_death(tank);
tank attachPath( path );
tank startPath();
tank thread tank_quake();
if (self.script_noteworthy == "northeast")
return;
tank waittill ("reached_end_node");
flag_set (self.script_noteworthy + " tank finished moving");
return;
wait (1);
while (1)
{
tank setTurretTargetEnt( level.player, ( 0, 0, 50 ) );
tank waittill( "turret_on_vistarget" );
tank FireTurret();
wait (4);
}
}
escort_think (spawner)
{
spawner.count = 1;
spawn = spawner stalingradspawn();
if (!isdefined (spawn))
return;
spawn endon ("death");
/*
org = spawn ("script_model",(0,0,3));
org setmodel ("xmodel/temp");
if (!isdefined (tank.left))
tank.left = org;
else
tank.right = org;
forward = anglesToForward(tank.angles);
forward = maps\_utility::vectorScale (forward, 120);
right = anglesToRight(tank.angles);
if (tank.left == org)
right = maps\_utility::vectorScale (right, 135);
else
right = maps\_utility::vectorScale (right, -135);
org.origin = tank.origin + forward + right;
org linkto (tank);
spawn.goalradius = 4;
while (1)
{
spawn setgoalpos (org.origin);
wait (0.05);
}
return;
*/
spawn.goalradius = 32;
node = spawn;
while (isdefined (node.target))
{
node = getnode (node.target,"targetname");
spawn setgoalnode (node);
spawn waittill ("goal");
}
}
tank_death(tank)
{
tank waittill ("death");
tank delete();
}
tank_quake()
{
return;
while (1)
{
earthquake(0.1, 0.5, self.origin, 1450); // scale duration source radius
wait (0.05);
}
}
player_flak ()
{
level.player_flak = self;
self.health = 1000;
self endon ("death");
level thread player_flak_death( self );
while( 1 )
{
self waittill( "turret_fire" );
self FireTurret();
}
}
player_flak_death (flak)
{
flak waittill ("death");
//THE FLAK IS DESTROYED, MISSION FAILED
iprintlnbold (&"DAWNVILLE_FLAKDESTROYED");
wait (2);
while (1)
{
level.player DoDamage ( level.player.health + 50, (randomint(5000)-2500,randomint(5000)-2500,randomint(5000)-2500) );
wait randomfloat (0.5);
}
}
spawn_attack()
{
self.count = 1;
spawn = self dospawn();
if (maps\_utility::spawn_failed(spawn))
return;
if (!isdefined (spawn.target))
{
println ("Spawner at origin ", self.origin, " had no target");
return;
}
node = getnode (spawn.target,"targetname");
spawn setgoalnode (node);
spawn.goalradius = 4;
spawn waittill ("goal");
if (isdefined (node.script_radius))
spawn.goalradius = node.script_radius;
else
spawn.goalradius = 512;
}
spawn_attack_moveup ()
{
self.count = 1;
spawn = self dospawn();
if (maps\_utility::spawn_failed(spawn))
return;
spawn endon ("death");
wait (10);
node = getnode (spawn.target,"targetname");
node = getnode (node.target,"targetname");
spawn setgoalnode (node);
spawn.goalradius = node.radius;
}
group6_attack ()
{
self.count = 1;
spawn = self dospawn();
if (!isdefined (spawn))
return;
spawn endon ("death");
node = getnode (spawn.target,"targetname");
spawn.goalradius = 4;
spawn.oldaccuracy = spawn.accuracy;
spawn.accuracy = 1;
spawn.threatbias = -5000;
spawn setgoalnode (node);
spawn waittill ("goal");
spawn.goalradius = 512;
spawn.accuracy = spawn.oldaccuracy;
spawn.threatbias = 0;
}
spawn_node_attack (optionalThread)
{
self.count = 1;
spawn = self dospawn();
if (maps\_utility::spawn_failed(spawn))
return;
if (isdefined (optionalThread))
level thread [[optionalThread]](spawn);
spawn endon ("death");
spawn.goalradius = 0;
node = getnode(spawn.target,"targetname");
spawn setgoalnode (node);
spawn waittill ("goal");
if (isdefined (node.radius))
spawn.goalradius = node.radius;
}
friendly_start ()
{
self.suppressionwait = 0;
self.goalradius = 32;
if (!isdefined (self.target))
return;
node = getnode (self.target, "targetname");
self setgoalnode (node);
// guy setgoalentity (level.player);
}
player_at_church_trigger ()
{
trigger = getent ("at church","targetname");
if (level.player istouching (trigger))
{
level notify ("player is at church");
flag_set ("player is at church");
}
else
{
level notify ("player is not at church");
level.flag["player is at church"] = false;
}
while (1)
{
while (level.player istouching (trigger))
wait (1.5);
level.flag["player is at church"] = false;
println (level.player.origin);
println ("^5 player is NOT at church");
level notify ("player is not at church");
trigger waittill ("trigger");
level.flag["player is at church"] = true;
println ("^5 player is at church");
println (level.player.origin);
level notify ("player is at church");
}
}
foleyTakeCover ( foley )
{
wait (3);
// Tiger tank!!! Take cover!!!
foley anim_single_solo (foley, "tiger tank");
}
killAIbehindTank ()
{
flag_wait ("northeast tank destroyed");
kill_ai_touching (getent ("tank kill axis touching","targetname"), "axis");
}
constant_attack (msg, timer)
{
timer *= 1000;
spawners = getentarray ( msg,"targetname");
timer = gettime() + timer;
level.spawner_guy_total = 0;
while (gettime() < timer)
{
spawners = maps\_utility::array_randomize(spawners);
for (i=0;i<spawners.size*0.75;i++)
{
if (level.spawner_guy_total > 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<ents.size;i++)
if (isalive (ents[i]))
return ents[i];
}
kill_germans_at_trigger ( msg )
{
trigger = getent (msg,"targetname");
ai = getaiarray ("axis");
for (i=0;i<ai.size;i++)
{
if (!ai[i] istouching (trigger))
continue;
ai[i] delete();
}
}
second_flak_think ()
{
self.count = 1;
self waittill ("spawned",spawn);
/*
spawn = self dospawn("second flak defenders");
if (!isdefined (spawn))
return;
*/
if (spawn.team != "axis")
return;
if (!isdefined (spawn.target))
return;
wait (0.01);
node = getnode (spawn.target,"targetname");
spawn.suppressionwait = 0;
spawn setgoalnode (node);
spawn.goalradius = 4;
spawn waittill ("goal");
if (isdefined (node.radius))
spawn.goalradius = node.radius;
else
spawn.goalradius = 128;
spawn.suppressionwait = 2;
}
spawner_follow_player ()
{
spawn = self dospawn();
if (maps\_utility::spawn_failed(spawn))
return;
spawn endon ("death");
spawn setgoalentity (level.player);
level waittill ("tank start northeast");
wait (3);
spawn maps\_spawner::friendly_mg42_stop_use();
spawn setgoalentity (level.player);
println ("^5following player B");
}
spawner_death_notify ( guy )
{
guy waittill ("death");
level notify ("spawner guy died");
level.spawner_guy_total--;
}
spawner_think()
{
level.spawner_guy_total++;
level thread spawner_death_notify(self);
self.count = 1;
spawn = self stalingradspawn();
// println ("Trying to spawn constant attack guy");
if (!isdefined (spawn))
return;
// println ("Spawned constant attack guy");
}
mortar_hit ( vec )
{
playSoundinSpace ("mortar_incoming", vec);
mortar_hit_explosion ( vec );
}
mortar_hit_explosion ( vec )
{
playfx ( level._effect["mortar"], vec );
thread playSoundinSpace ("mortar_explosion", vec);
earthquake(0.3, 3, vec, 850); // scale duration source radius
do_mortar_deaths (getaiarray(), vec);
radiusDamage (vec, 150, 150, 0);
}
mortar_hit_running ( guy )
{
guy endon ("death");
wait (2);
playSoundinSpace ("mortar_incoming", guy.origin);
playfx ( level._effect["mortar"], guy.origin );
vec = guy.origin;
thread playSoundinSpace ("mortar_explosion", vec);
earthquake(0.3, 3, vec, 850); // scale duration source radius
do_mortar_deaths (getaiarray(), vec);
radiusDamage (vec, 150, 150, 0);
}
do_mortar_deaths (ai, org)
{
for (i=0;i<ai.size;i++)
{
if (isdefined (ai[i].magic_bullet_shield))
continue;
dist = distance (ai[i].origin, org);
if (dist < 190)
{
ai[i].allowDeath = true;
ai[i].deathAnim = ai[i] getExplodeDeath("generic", org, dist);
ai[i] DoDamage ( ai[i].health + 50, (0,0,0) );
println ("Killing an AI");
continue;
}
// if (isdefined (ai[i].getting_up))
// continue;
// if (dist < 300)
// ai[i] thread getup(ai[i] getKnockDown(org), org);
}
}
getKnockDown(org)
{
msg = "generic";
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;
// 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<trigger.size;i++)
{
if ((isdefined (trigger[i].script_chain)) && (trigger[i].script_chain == chainstring))
{
chain = trigger[i];
break;
}
}
if (!isdefined (chain))
{
maps\_utility::error ("Tried to get chain " + chainstring + " which does not exist with script_chain on a trigger.");
return undefined;
}
node = getnode (chain.target,"targetname");
return node;
}
reinforcements_think ()
{
self.count = 1;
spawn = self dospawn();
if (maps\_utility::spawn_failed(spawn))
return;
spawn endon ("death");
node = getnode (spawn.target,"targetname");
spawn setgoalnode (node);
spawn.goalradius = node.radius;
level waittill ("reinforcements move up");
node = getnode (node.target,"targetname");
spawn setgoalnode (node);
spawn.goalradius = node.radius;
}
church_defender_start ( )
{
self.count = 1;
while (1)
{
if (isdefined (self.script_noteworthy))
spawn = self dospawn(self.script_noteworthy);
else
spawn = self dospawn();
if (isdefined (spawn))
break;
wait (2);
}
spawn.health = 500;
spawn thread maps\_utility::magic_bullet_shield();
spawn.suppressionwait = 0;
spawn endon ("death");
flag_wait ("church under siege");
spawn maps\_spawner::friendly_mg42_stop_use();
node = getnode (spawn.target,"targetname");
node = getnode (node.target,"targetname");
spawn setgoalnode (node);
spawn.goalradius = node.radius;
spawn notify ("stop magic bullet shield");
spawn.oldaccuracy = spawn.accuracy;
while (1)
{
if (!level.flag["player is at church"])
{
spawn.accuracy = 0;
level waittill ("player is at church");
}
else
{
spawn.accuracy = spawn.oldaccuracy;
level waittill ("player is not at church");
}
}
}
mortar_stopper()
{
safe_trigger = getent ("safe house","targetname");
wait (10);
while (!level.player istouching (safe_trigger))
wait (0.5);
flag_set("mortars stop");
}
mortar_thread ()
{
thread mortar_stopper();
waits[0] = 0;
waits[1] = 1.1;
waits[2] = 0.2;
waits[3] = 1.5;
waits[4] = 1.2;
waits[5] = 0.9;
waits[6] = 0.5;
waits[7] = 0.8;
waits[8] = 1.2;
waits[9] = 1.5;
waits[10]= 0.7;
index = 0;
starter = self;
ent = self;
while (!level.flag["mortars stop"])
{
wait (waits[index]);
index++;
if (index >= 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 ("<22>");
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<ai.size;i++)
{
if (isdefined (ai[i].retreating))
continue;
if (!ai[i] istouching (trigger))
continue;
retreater[retreater.size] = ai[i];
}
nodes = getnodearray ("retreat node","targetname");
index = 0;
for (i=0;i<retreater.size;i++)
{
retreater[i] thread retreater_think (nodes[index]);
index++;
if (index >= 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<allied_spawners.size;i++)
allied_spawners[i] thread spawn_node_attack(::followPlayerLater);
}
else
{
if (!spawned_allies)
for (i=0;i<allied_spawners.size;i++)
allied_spawners[i] thread spawn_node_attack(::followPlayerLater);
for (i=0;i<axis_spawners.size;i++)
axis_spawners[i] thread spawn_node_attack();
break;
}
}
maps\_spawner::flood_spawn (getentarray ("second flak flood spawner","targetname"));
}
church_preaction_trigger (trigger)
{
level endon ("church defenders start");
trigger waittill ("trigger");
level notify ("church defenders start");
}
// Start up the church guys
church_preaction ()
{
// self waittill ("trigger");
thread church_preaction_trigger(getent ("start church trigger","targetname"));
level waittill ("church defenders start");
array_thread(getentarray ("church defend","targetname"), ::church_defender_start); // Start up church defenders to hang out
trigger = getent ("at church","targetname");
while (level.player istouching (trigger))
wait (1);
// trigger waittill ("trigger");
// pre_attack_spawners = getentarray ("church preattack","targetname");
// maps\_spawner::flood_spawn (pre_attack_spawners); // Give the defenders a couple guys to shoot at
wait (2);
//<Lewis> 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<pre_attack_spawners.size;i++)
// pre_attack_spawners[i] notify ("disable");
spawners = getentarray ("church attack","targetname");
array_levelthread (spawners, ::church_spawner_think);
maps\_spawner::flood_spawn (spawners);
trigger waittill ("trigger");
}
church_spawner_think (spawner)
{
spawner endon ("death");
while (1)
{
if (spawner.count > 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<ai.size;i++)
ai[i] thread spawn_node_attack(::flak_attackers);
while (1)
{
ai = maps\_utility::array_randomize(ai);
for (i=0;i<ai.size;i++)
{
wait (20 + randomfloat (5));
if (level.flak_attackers > 2)
continue;
ai[i] thread spawn_node_attack(::flak_attackers);
}
}
}
tank_killers_death (node, guy)
{
node waittill ("death");
for (i=0;i<guy.size;i++)
{
if (!isalive (guy[i]))
continue;
guy[i] notify ("stop magic bullet shield");
guy[i] setgoalentity (level.player);
guy[i] stopanimscripted();
guy[i].allowDeath = true;
guy[i].deathanim = %death_explosion_back13;
println ("guy ",i," health ", guy[i].health);
}
}
tank_killers_killThread (node, gun_guy)
{
node endon ("death");
node maps\_anim::anim_single (gun_guy, "run", "tag_hatch");
node thread anim_loop ( gun_guy, "idle", "tag_hatch", "stop anim");
}
tank_killers_destroyed ()
{
self endon ("death");
flag_wait("west tank destroyed");
self notify ("stop magic bullet shield");
}
tank_killers_think (tank_killers)
{
for (i=0;i<tank_killers.size;i++)
if (tank_killers[i].animname == "gun guy")
gun_guy[0] = tank_killers[i];
else
grenade_guy[0] = tank_killers[i];
node = getent ("tank west","targetname");
node.nospawning = true;
node endon ("death");
guy[0] = gun_guy[0];
guy[1] = grenade_guy[0];
array_thread(guy, ::tank_killers_destroyed);
level thread tank_killers_death(node, guy);
flag_wait ("west tank attacks");
flag_wait ("west tank finished moving");
println ("Time to attack the tank!");
node maps\_anim::anim_reach (gun_guy, "run", "tag_hatch");
level thread tank_killers_killThread (node, gun_guy);
node maps\_anim::anim_reach (grenade_guy, "run", "tag_hatch");
node thread maps\_anim::anim_single (grenade_guy, "run", "tag_hatch");
node waittill ("run");
node notify ("stop anim");
node maps\_anim::anim_reach (guy, "attack", "tag_hatch");
node.animname = "tank";
node assignanimtree();
node setFlaggedAnim( "single anim", level.scr_anim[node.animname]["attack"]);
node thread maps\_anim::notetrack_wait (node, "single anim", undefined, "attack");
// maps\_utility::chain_off ("125");
node thread maps\_anim::anim_single (guy, "attack", "tag_hatch");
node waittill ("attack");
badplace_cylinder("why must I set a name?", 3, node.origin, 400, 400, "allies");
for (i=0;i<guy.size;i++)
{
if (!isalive (guy[i]))
continue;
guy[i] notify ("stop magic bullet shield");
guynode = getnode (guy[i].target,"targetname");
guynode = getnode (guynode.target,"targetname");
guy[i] setgoalnode (guynode);
guy[i].goalradius = 4;
}
wait (3);
for (i=0;i<guy.size;i++)
{
if (!isalive (guy[i]))
continue;
guy[i] setgoalentity (level.player);
guy[i].deathanim = undefined;
}
// radiusDamage (node.origin + (0,0,50), 1900, 1700, 1300); // mystery numbers!
radiusDamage (node.origin, 2, node.health + 5000, node.health + 5000); // mystery numbers!
// node DoDamage ( node.health + 50, (randomint(5000)-2500,randomint(5000)-2500,randomint(5000)-2500) );
}
tank_killers_spawn (spawners)
{
guy = [];
for (i=0;i<spawners.size;i++)
{
if (!i)
animname = "gun guy";
else
animname = "grenade guy";
spawners[i].count = 1;
spawn[animname] = spawners[i] dospawn();
while (!isalive (spawn[animname]))
{
spawners[i].count = 1;
spawn[animname] = spawners[i] dospawn();
wait (1);
}
spawn[animname] thread maps\_utility::magic_bullet_shield();
spawn[animname].dontFollow = true;
// spawn[animname].allowDeath = true;
spawn[animname].animname = animname;
// spawn[animname] endon ("death");
// spawn[animname] animscripts\shared::putGunInHand ("none");
guy[guy.size] = spawn[animname];
}
return guy;
}
/*
tank_killers_trigger( trigger, spawners )
{
trigger waittill ("trigger");
guy = tank_killers_spawn (spawners);
guy.setgoalpos = guy.origin;
guy.goalradius = 64;
level notify ("tank killers trigger");
thread tank_killers_think(guy);
}
*/
tank_killers ()
{
spawners = getentarray ("tank killer", "targetname");
trigger = getent ("last tank attacks","targetname");
level endon ("tank killers trigger");
guy = tank_killers_spawn (spawners);
thread tank_killers_think(guy);
}
// If the player leaves the safe house before Foley, he gets in trouble for it.
punishPlayerForLeavingSafety ( trigger )
{
level endon ("left safehouse!");
while (level.player istouching (trigger))
wait (1);
level notify ("left safehouse!");
// array_thread(getentarray ("group2","targetname"), ::spawn_attack);
// array_thread(getentarray ("reprimand church","targetname"), ::spawn_attack);
}
house_guy_think()
{
self endon ("death");
self thread animscripts\shared::SetInCombat();
node = getnode (self.target,"targetname");
self setgoalnode (node);
self.goalradius = 0;
self waittill ("goal");
wait (3);
node = getnode (node.target,"targetname");
self setgoalnode (node);
self.deathanim = %death_run_left;
wait (0.7);
self notify ("reached final objective");
}
goToLaterPartOfLevel ()
{
self endon ("death");
self.goalradius = 600;
self maps\_spawner::friendly_mg42_stop_use();
self.script_usemg42 = false; // Foley is too cool for MG42s
self setgoalentity (level.player);
wait (4);
self waittill ("goal");
self setgoalentity (level.player);
wait (4);
self waittill ("goal");
self setgoalentity (level.player);
}
killAllAxisOverTime ()
{
while (1)
{
ai = getaiarray ("axis");
if (ai.size > 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<potentialAI.size;i++)
{
if (potentialAI[i] == foley)
continue;
if (potentialAI[i] == level.moody)
continue;
if (potentialAI[i] == level.parker)
continue;
if (potentialAI[i] == level.elder)
continue;
ai[ai.size] = potentialAI[i];
}
if (ai.size <= 0)
return;
saveFriendlies = 4;
// if (getcvar ("scr_dawnville_fast") == "1")
// saveFriendlies = 2;
num = ai.size - (saveFriendlies);
for (p=0;p<ai.size;p++)
ai[p].goneNow = false;
for (i=0;i<num;i++)
{
index = -1;
range = 0;
for (p=0;p<ai.size;p++)
{
if (ai[p].goneNow)
continue;
newrange = distance (level.player.origin, ai[p].origin);
if (newrange > range)
{
range = newrange;
index = p;
}
}
if (index != -1)
ai[index].goneNow = true;
}
for (p=0;p<ai.size;p++)
{
if (!ai[p].goneNow)
continue;
ai[p] DoDamage ( ai[p].health + 50, (randomint(5000)-2500,randomint(5000)-2500,randomint(5000)-2500) );
}
}
parkerSpawnerThink ()
{
flag_wait ("parker is a go");
println ("parker is a go..");
spawner = level.parkerSpawner;
println (level.parkerSpawner.origin);
println ("0spawner ", spawner.origin);
while (1)
{
spawner.count = 1;
spawn = spawner dospawn();
if (!maps\_utility::spawn_failed(spawn))
break;
wait (0.1);
}
spawn endon ("death");
spawn.animname = "parker";
spawn thread maps\_utility::magic_bullet_shield();
spawn.dontavoidplayer = true;
spawn.dontFollow = true;
level.parker = spawn;
// Set the friendlies running to the parker spot
maps\_utility::chain_on ("450");
chain = get_friendly_chain_node ("450");
level.player SetFriendlyChain (chain);
flag_Set ("chain 100 off forever");
flag_Set ("chain 125 off forever");
level thread deleteFarthestAllies();
ai = getaiarray ("allies");
for (i=0;i<ai.size;i++)
{
if (isdefined (ai[i].dontFollow))
continue;
ai[i] thread goToLaterPartOfLevel();
}
level.moody setgoalentity (level.player);
foley = getent ("foley","targetname");
/*
spawn waittill ("goal");
while (distance (foley.origin, spawn.origin) > 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<ai.size;i++)
{
if (ai[i] == foley)
continue;
// if (!ai[i] istouching (trigger))
// continue;
if (ai[i].anim_pose == "prone")
{
ai[i] OrientMode ("face default"); // We were most likely in "face current" while we were prone.
ai[i] exitprone(1.0); // make code stop lerping in the prone orientation to ground
ai[i] UpdateProne(%prone_shootfeet_straight45up, %prone_shootfeet_straight45down, 1, 0.1, 1);
}
ai[i].anim_pose = "crouch";
}
return;
flag_wait ("parker speech");
ai = getaiarray ("allies");
for (i=0;i<ai.size;i++)
{
if (ai[i] == foley)
continue;
ai[i] allowedStances ("prone", "stand", "crouch");
}
}
croucher_trigger (trigger)
{
level endon ("parker speech");
while (1)
{
trigger waittill ("trigger", other);
if (!isalive (other))
continue;
if (flag("Friendlies crouch for conference"))
{
if (other.anim_pose == "crouch")
continue;
if (other.anim_pose == "prone")
{
other OrientMode ("face default"); // We were most likely in "face current" while we were prone.
other exitprone(1.0); // make code stop lerping in the prone orientation to ground
other UpdateProne(%prone_shootfeet_straight45up, %prone_shootfeet_straight45down, 1, 0.1, 1);
}
other.anim_pose = "crouch";
}
else
other allowedStances ("prone", "stand", "crouch");
}
}
lookaround (foley)
{
foley endon ("get mortars");
allies = getaiarray ("allies");
for (i=0;i<allies.size;i++)
{
wait ((1) + randomfloat (1));
if (!isalive (allies[i]))
continue;
foley lookat(allies[i]);
}
}
parkerTrigger ( trigger )
{
level.parkerSpawner = getent (trigger.target,"targetname");
println (level.parkerspawner.origin);
trigger.target = "moot";
trigger waittill ("trigger");
println (level.parkerspawner.origin);
flag_set ("parker is a go");
println (level.parkerspawner.origin);
trigger delete();
}
house_guy_function ( foley, house_guy )
{
level endon ("left safehouse!");
wait (4.2); // 4.2
if (isalive (house_guy))
{
house_guy.health = 1;
house_guy.animname = "johnson";
// All right, the mortars are taking a break."
node = getnode (foley.target,"targetname");
// (Boon 01/09/03) Removed this SetInCombat because it isn't necessary, and it is overriding the one from the beginning of the level.
// foley thread animscripts\shared::SetInCombat();
foley thread anim_single_solo (foley, "mortars stopped", undefined, node);
wait (1.0);
if (isalive (house_guy))
{
foley lookat(house_guy);
house_guy lookat(foley);
wait (2.5);
}
if (isalive (house_guy))
{
// Right, Captain.
house_guy thread anim_single_solo (house_guy, "right captain");
wait (0.7);
}
if (isalive (house_guy))
{
house_guy lookat(house_guy, 2);
house_guy thread bloody_death_waittill();
house_guy thread house_guy_think();
house_guy.goalradius = 200;
level thread wait_any (house_guy, "house guy finishes", "reached final objective", "death");
level waittill ("house guy finishes");
}
if ((isalive (house_guy)) && (level.player istouching (getent ("safe house","targetname"))))
{
level thread playSoundinSpace ("weap_kar98k_fire", house_guy.origin);
house_guy DoDamage ( house_guy.health + 50, (randomint(5000)-2500,randomint(5000)-2500,randomint(5000)-2500) );
}
wait (0.3);
if (!isalive (house_guy))
{
// They got him! Damn!
foley thread anim_single_solo (foley, "they got him");
}
}
else
{
// All right, the mortars are taking a break."
foley thread anim_single_solo (foley, "mortars stopped 2");
wait (1);
}
level notify ("left safehouse!");
}
fallback_wait ()
{
level waittill ("fallback initiated " + 1);
flag_set ("falling back");
}
deathInTime (timer)
{
self endon ("death");
wait (timer);
self delete();
}
kill_axis ( trigger )
{
while (1)
{
trigger waittill ("trigger",other);
if (!isSentient(other))
continue;
other thread deathInTime(8);
}
}
tankObjectiveComplete()
{
flag_wait ("northeast tank destroyed");
objective_state(5, "done");
}
tankReplacesObjective ()
{
level waittill ("picked up infinite panzerfaust");
objective_string(5, &"DAWNVILLE_OBJ5SECONDTANK");
level thread objective_org(5, getent ("tank northeast","targetname"));
objective_current(5);
flag_wait ("northeast tank destroyed");
objective_state(5, "done");
}
foleyTellsYouToGetAnotherPanzerfaust ( foley )
{
wait (5);
foley thread anim_single_solo (foley, "get another panzer");
}
niceShot ( foley )
{
wait (2);
//*-15. Good job, son!
if (isalive (level.player))
foley thread anim_single_solo (foley, "good job");
}
gotPanzers ()
{
flag_wait ("got panzers");
objective_state(1, "done");
maps\_utility::autosave(2);
}
objective_org (num, ent)
{
ent endon ("death");
ent endon ("stop being objective");
while (1)
{
objective_position(num, ent.origin);
wait (0.1);
}
}
mortarStopper ()
{
usedOrgs = [];
while (1)
{
level waittill ("mortar teams got off mortar");
used = false;
for (i=0;i<usedOrgs.size;i++)
{
if (usedOrgs[i] == level.stoppedmortarOrigin)
used = true;
}
if (!used)
usedOrgs[usedOrgs.size] = level.stoppedmortarOrigin;
if (usedOrgs.size >= 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<destroyed.size;i++)
destroyed[i] delete();
}
// For the northern approach sequence where the friendlies push the Germans back
followPlayerLater (spawn)
{
if (!isalive (spawn))
return;
spawn endon ("death");
level waittill ("friendlies push germans back");
spawn setgoalentity (level.player);
level waittill ("tank start northeast");
wait (3);
spawn maps\_spawner::friendly_mg42_stop_use();
spawn setgoalentity (level.player);
println ("^5following player A");
}
sequence_init ()
{
regroup_friendly_trigger = getent ("regroup friendly chain","targetname");
push_germans_back_trigger = getent ("end of the road", "targetname");
push_germans_back_trigger maps\_utility::triggerOff();
regroup_friendly_trigger maps\_utility::triggerOff();
end_level_trigger = getent ("end level trigger","targetname");
end_level_trigger maps\_utility::triggerOff();
clip = getent ("second flak monster clip","targetname");
clip connectpaths();
clip notsolid();
thread parkerTrigger(getent ("parker trigger","targetname"));
// Trigger at the end of the retreat that kills Germans as they flee.
thread kill_axis(getent ("kill axis","targetname"));
thread moody( getent ("moody","script_noteworthy"));
foley = getent ("foley", "targetname");
baker = getent ("baker","script_noteworthy");
jackson = getent ("jackson","script_noteworthy");
foley.animname = "foley";
baker.animname = "baker";
jackson.animname = "jackson";
foley thread maps\_utility::magic_bullet_shield();
thread fallback_wait();
// For later in the game, make ai get to the right places for car finale
thread carTrigger( getent ("car sequence","targetname"));
// Stop mortars if player interrupts both mortar teams
thread mortarStopper();
// Give the player a hint for when he first picks up an fg42
thread rateOfFireHintCheck();
}
sequence_1 () // Go to the Safe house, get the panzerfaust, kill the tank
{
// firstguy = getent ("firstguy", "targetname");
explosionguy = getent ("explosion guy","targetname");
foley = getent ("foley", "targetname");
flak_trigger = getent ("at flak","targetname");
house_guy = getent ("house guy","targetname");
safe_trigger = getent ("safe house","targetname");
church_entrance_trigger = getent ("church entrance trigger","targetname");
player_advance_trigger = getent ("player advances","targetname");
baker = getent ("baker","script_noteworthy");
jackson = getent ("jackson","script_noteworthy");
player_start_trigger = getent ("player start","targetname");
// Kill the player if he strays too far!
thread player_mortar_death (getent ("player mortar death","targetname"));
// For a tank later on
start_tank_trigger = getent ("start tank","targetname");
start_tank_trigger maps\_utility::triggerOff();
thread church_preaction();
// getent ("start church trigger","targetname") thread church_preaction ();
getent ("second flak guys trigger","targetname") thread second_flak_preaction();
thread sequence_2();
player_advance_trigger maps\_utility::triggerOff();
clip = getent ("east tank clip","targetname");
clip connectpaths();
clip notsolid();
getent ("mortar attack","targetname") thread mortar_thread();
wait (0.05);
if (isalive (baker))
{
// Up! Get up! Wake it and shake it! The Germans are bringing your coffee!
baker thread anim_single_solo (baker, "wake up");
}
level waittill ("starting final intro screen fadeout");
foley_node = getnode (foley.target,"targetname");
foley_outernode = getnode (foley_node.target,"targetname");
foley_finalnode = getnode (foley_outernode.target,"targetname");
foley_finalchargeNode = getnode (foley_finalnode.target,"targetname");
foley.goalradius = 4;
foley.suppressionwait = 0;
node = getnode (explosionguy.target,"targetname");
explosionguy.goalradius = 128;
explosionguy setgoalnode (node);
if (isalive (explosionguy))
level thread mortar_hit_running (explosionguy);
// Off the streets! Mortars!
// if (level.player istouching (player_start_trigger))
wait (0.4);
foley lookat(foley, 0);
foley setgoalnode (foley_node);
wait (.8);
foley anim_single_solo (foley, "off the streets");
//Follow Captain Foley to a safe place.
objective_add(0, "active", &"DAWNVILLE_OBJ0", safe_trigger getorigin());
objective_current(0);
// foley lookat(level.player, 4);
// if (level.player istouching (player_start_trigger))
// foley thread anim_single_solo (foley, "wave follow");
array_thread(getentarray ("asset","targetname"), ::asset_think); // Baker and Jackson
if (isalive (jackson))
{
// Incoming! Take cover!
jackson thread anim_single_solo (jackson, "mortars");
waittill_either (jackson, "mortars","death");
}
wait (1);
if (isalive (baker))
{
// Mortars, incoming!"
baker thread anim_single_solo (baker, "mortars");
}
foley waittill ("goal");
timer = gettime() + 8000;
while (!level.player istouching (safe_trigger))
{
if (gettime() > 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 ("<Foley> 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<ai.size;i++)
ai[i].grenadeammo = 5;
if ((isalive (tank)) && (!level.flag["got panzers"]))
{
// Martin! The Panzerfausts are in the church! Go!
foley thread anim_single_solo (foley, "panzer reminder");
}
ai = getentarray ("third flak defenders","targetname");
ai = maps\_utility::array_randomize(ai);
for (i=0;i<ai.size;i++)
{
wait (0.5 + randomfloat (1));
ai[i] thread spawn_attack();
}
if (isalive (tank))
tankBlowsUpBuilding( tank );
if (!level.flag["got panzers"])
wait (4);
if (!level.flag["got panzers"])
{
// Martin! The church! Go! Go! Go!
foley thread anim_single_solo (foley, "panzer reminder 2");
}
}
sequence_1_tank (obj0Complete)
{
flag_wait ("got panzers");
foley = getent ("foley", "targetname");
foley.goalradius = 512;
tank = getent ("tank east","targetname");
if (!obj0Complete)
{
foley notify ("stop being objective");
objective_state(0, "done");
}
if (isalive (tank))
{
objective_add(2, "active", &"DAWNVILLE_OBJ2", getent ("tank east","targetname").origin);
level thread objective_org (2, getent ("tank east","targetname"));
objective_current(2);
// array_thread(getentarray ("flak_attack","targetname"), ::spawn_attack);
thread more_attackers();
flag_wait ("east tank destroyed");
objective_state(2, "done");
}
// wait (2.5);
// array_thread(getentarray ("flak_attack","targetname"), ::spawn_attack);
}
sequence_2() // Defend the Church
{
flak_trigger = getent ("at flak","targetname");
foley = getent ("foley", "targetname");
level waittill ("picked up infinite panzerfaust");
/*
trigger = getent ("get panzer","targetname");
trigger waittill ("trigger");
trigger delete();
*/
flag_set("got panzers");
flag_wait ("east tank destroyed");
flag_set ("church under siege");
// Turn off rear MG42s for friendly use.
array_thread(getentarray ("church rear","script_noteworthy"), maps\_utility::triggerOff);
wait (0.5);
// Martin - back to the church with me! The rest of you hold this position!
foley anim_single_solo (foley, "to the church");
node = getnode ("church","targetname");
foley setgoalnode (node);
/*
foley.goalradius = 32;
foley waittill ("goal");
foley.goalradius = 512;
*/
//Defend the Church.
objective_add(3, "active", &"DAWNVILLE_OBJ3", (214, -15984, 64));
objective_current(3);
maps\_spawner::kill_spawnerNum(10);
maps\_utility::autosave(3);
level thread player_at_church_trigger();
foley lookat( foley, 0 );
thread sequence_3();
}
sequence_3 ()
{
foley = getent ("foley", "targetname");
lewis = get_noteworthy_ai ("lewis");
franklin = get_noteworthy_ai ("franklin");
backyard_trigger = getent ("backyard","targetname");
player_advance_trigger = getent ("player advances","targetname");
push_germans_back_trigger = getent ("end of the road", "targetname");
regroup_friendly_trigger = getent ("regroup friendly chain","targetname");
church_trigger = getent ("at church","targetname");
church_trigger waittill ("trigger");
flag_wait ("falling back");
wait (8);
thread foley_moves_on_trigger ( getent ("foley moves on","targetname") );
spawners = getentarray ("second flak guys","targetname");
for (i=0;i<spawners.size;i++)
spawners[i] thread second_flak_think();
maps\_spawner::kill_spawnerNum(2);
// "They're pullin' back! Alright! Good work, but don't let down. They'll be back."
foley anim_single_solo (foley, "germans retreat");
if ((isalive (lewis)) && (isalive (franklin)))
{
foley lookat( franklin );
// Lewis, Franklin, hold the church."
foley anim_single_solo (foley, "L + F hold church");
}
else
if (isalive (lewis))
{
foley lookat( lewis );
// Lewis, hold the church."
foley anim_single_solo (foley, "L hold church");
}
else
if (isalive (franklin))
{
foley lookat( franklin );
// Franklin, hold the church."
foley anim_single_solo (foley, "F hold church");
}
if ((isalive (lewis)) || (isalive (franklin)))
{
if (isalive (lewis))
foley lookat( lewis );
else
foley lookat( franklin );
// Everyone else, follow me!"
foley anim_single_solo (foley, "everyone else follow");
}
else
{
// Everyone follow me!
foley anim_single_solo (foley, "everyone follow");
}
flag_wait ("player is at church");
if (!flag ("foley moves on"))
{
foley setgoalnode (getnode (getent ("foley moves on","targetname").target, "targetname"));
foley.goalradius = 4;
thread foley_moves_on_followup(foley);
}
else
foley setgoalentity (level.player);
level notify ("kill second flak early trigger");
objective_state(3, "done");
//Reinforce the Northern approach.
objective_add(4, "active", &"DAWNVILLE_OBJ4", (2336, -15887, -20));
objective_current(4);
// Turn the front mg42 off.
array_thread(getentarray ("church front","script_noteworthy"), maps\_utility::triggerOff);
flag_set("church has been defended");
clip = getent ("second flak monster clip","targetname");
clip disconnectpaths();
clip solid();
foley lookat( foley, 0 );
chain = get_friendly_chain_node ("50");
level.player SetFriendlyChain (chain);
// Make foley run ahead then wait for the player.
// thread foley_moves_on (foley, getent ("foley moves on","targetname"));
spawn = getentarray ("second flak defenders","targetname");
for (i=0;i<spawn.size;i++)
{
if (spawn[i].team != "allies")
continue;
spawn[i] setgoalentity (level.player);
}
guys = getentarray ("churchgoer guys","targetname");
for (i=0;i<guys.size;i++)
guys[i] setgoalentity (level.player);
if (level.player istouching (church_trigger))
{
church_exit_trigger = getent ("foley church trigger","targetname");
while (1)
{
church_exit_trigger waittill ("trigger", other);
if (other == level.player)
break;
}
array_thread(getentarray ("church spawner","targetname"), ::spawner_follow_player);
}
// foley setgoalentity (level.player);
// array_thread(getentarray ("group3","targetname"), ::spawn_attack);
trigger = getent ("second flak guys trigger", "targetname");
trigger waittill ("trigger");
maps\_spawner::kill_spawnerNum(10);
maps\_spawner::kill_spawnerNum(11);
maps\_spawner::kill_spawnerNum(12);
// Kill unnecessary axis
ai = getaiarray ("axis");
for (i=0;i<ai.size;i++)
{
if ((isdefined (ai[i].script_noteworthy)) && (ai[i].script_noteworthy == "second flak germans"))
continue;
ai[i] DoDamage ( ai[i].health + 50, (randomint(5000)-2500,randomint(5000)-2500,randomint(5000)-2500) );
}
maps\_utility::autosave(4);
level thread player_got_too_close (getent ("target the player","targetname"));
wait (10);
array_thread(getentarray ("group5","targetname"), ::spawn_attack);
wait (9);
array_thread(getentarray ("group4","targetname"), ::spawn_attack);
// array_thread(getentarray ("group4","targetname"), ::spawn_attack);
wait (5);
array_thread(getentarray ("group5","targetname"), ::spawn_attack);
wait (5);
axis_trigger = getent ("germans under arch","targetname");
wait_until_no_axis (axis_trigger); // Wait until all the axis here are dead.
clip = getent ("second flak monster clip","targetname");
clip connectpaths();
clip delete();
chain = get_friendly_chain_node ("150");
level.player SetFriendlyChain (chain); // Make friendlies move up to the first flak area.
level notify ("friendlies push germans back");
// They're fallin' back! Push 'em outta here! Move it -- go!
foley thread anim_single_solo (foley, "push them back");
objective_position(4, getnode ("third objective", "targetname").origin);
wait (0.8);
player_advance_trigger maps\_utility::triggerOn();
thread guyFleesTank (player_advance_trigger);
player_advance_trigger waittill ("trigger"); // Wait until the player advances with the friendlies
// Turn the rear church mg42 back on once the player reenters the church.
thread turnChurchMG42backOn();
// wait_until_no_axis (getent ("germans at second flak","targetname"));
thread mortar_drop_on_axis();
thread mortar_drop_nearplayer();
thread sequence_3b();
wait (1);
//iprintlnbold ("<Foley> 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 ("<Random Guy> 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<ai.size;i++)
{
if (ai[i] istouching (trigger))
{
println ("killing ai at origin ", ai[i].origin);
ai[i] DoDamage ( ai[i].health + 50, (randomint(5000)-2500,randomint(5000)-2500,randomint(5000)-2500) );
}
}
}