‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
phalanx.gsc
Go to the documentation of this file.
1 #using scripts\shared\ai_shared;
2 #using scripts\shared\math_shared;
3 #using scripts\shared\spawner_shared;
4 #using scripts\shared\ai\archetype_utility;
5 
6 #insert scripts\shared\shared.gsh;
7 #insert scripts\shared\ai\phalanx.gsh;
8 #insert scripts\shared\archetype_shared\archetype_shared.gsh;
9 
10 #namespace Phalanx;
11 
12 function private ‪_AssignPhalanxStance( sentients, stance )
13 {
14  assert( IsArray( sentients ) );
15 
16  foreach ( index, sentient in sentients )
17  {
18  if ( IsDefined( sentient) && IsAlive( sentient ) )
19  {
20  sentient ‪ai::set_behavior_attribute( "phalanx_force_stance", stance );
21  }
22  }
23 }
24 
25 function private ‪_CreatePhalanxTier(
26  phalanxType, tier, phalanxPosition, forward, maxTierSize, spawner = undefined )
27 {
28  sentients = [];
29 
30  if ( !IsSpawner( spawner ) )
31  {
32  spawner = ‪_GetPhalanxSpawner( tier );
33  }
34 
35  positions = ‪_GetPhalanxPositions( phalanxType, tier );
36  angles = VectorToAngles( forward );
37 
38  foreach ( index, position in positions )
39  {
40  if ( index >= maxTierSize )
41  {
42  break;
43  }
44 
45  orientedPos = ‪_RotateVec( position, angles[1] - ‪PHALANX_ROTATION_OFFSET );
46 
47  navMeshPosition = GetClosestPointOnNavMesh(
48  phalanxPosition + orientedPos, ‪PHALANX_NAVMESH_TOLERANCE );
49 
50  // Make sure the spawner can actually spawn a sentient.
51  if ( !( spawner.spawnflags & ‪SPAWNFLAG_ACTOR_SCRIPTINFINITESPAWN ) )
52  {
53  spawner.count++;
54  }
55 
56  sentient = spawner ‪spawner::spawn( true, "", navMeshPosition, angles );
57 
58  ‪_InitializeSentient( sentient );
59 
60  // Wait till all sentients have been created.
62 
63  sentients[ sentients.size ] = sentient;
64  }
65 
66  return sentients;
67 }
68 
69 // Caps the maximum damage the phalanx takes from a single explosive entity.
70 function private ‪_DampenExplosiveDamage(
71  inflictor, attacker, ‪damage, flags, meansOfDamage, weapon, point, dir, hitLoc, offsetTime, boneIndex, modelIndex )
72 {
73  entity = self;
74 
75  isExplosive = IsInArray(
76  ‪array(
77  "MOD_GRENADE",
78  "MOD_GRENADE_SPLASH",
79  "MOD_PROJECTILE",
80  "MOD_PROJECTILE_SPLASH",
81  "MOD_EXPLOSIVE" ),
82  meansOfDamage );
83 
84  if ( isExplosive && IsDefined( inflictor ) && IsDefined( inflictor.weapon ) )
85  {
86  weapon = inflictor.weapon;
87 
88  distanceToEntity = Distance( entity.origin, inflictor.origin );
89 
90  // Linear falloff from grenade distance.
91  fractionDistance = 1;
92 
93  if ( weapon.explosionradius > 0 )
94  {
95  fractionDistance = ( weapon.explosionradius - distanceToEntity ) / weapon.explosionradius;
96  }
97 
98  // This causes near exponential damage falloff since the original damage already considers radius at a near linear falloff.
99  return Int( Max( ‪damage * fractionDistance, 1 ) );
100  }
101 
102  return ‪damage;
103 }
104 
105 function private ‪_GetPhalanxPositions( phalanxType, tier )
106 {
107  switch ( phalanxType )
108  {
109  case ‪PHALANX_WEDGE:
110  switch( tier )
111  {
112  case ‪PHALANX_TIER_ONE:
114  case ‪PHALANX_TIER_TWO:
118  }
119  break;
121  switch( tier )
122  {
123  case ‪PHALANX_TIER_ONE:
125  case ‪PHALANX_TIER_TWO:
129  }
130  break;
132  switch( tier )
133  {
134  case ‪PHALANX_TIER_ONE:
136  case ‪PHALANX_TIER_TWO:
140  }
141  break;
143  switch( tier )
144  {
145  case ‪PHALANX_TIER_ONE:
147  case ‪PHALANX_TIER_TWO:
151  }
152  break;
153  case ‪PHALANX_FORWARD:
154  switch( tier )
155  {
156  case ‪PHALANX_TIER_ONE:
158  case ‪PHALANX_TIER_TWO:
162  }
163  break;
164  case ‪PHALANX_COLUMN:
165  switch( tier )
166  {
167  case ‪PHALANX_TIER_ONE:
169  case ‪PHALANX_TIER_TWO:
173  }
174  break;
176  switch( tier )
177  {
178  case ‪PHALANX_TIER_ONE:
180  case ‪PHALANX_TIER_TWO:
184  }
185  break;
186  default:
187  assert( "Unknown phalanx type \"" + phalanxType + "\"." );
188  }
189 
190  assert( "Unknown phalanx tier \"" + tier + "\"." );
191 }
192 
193 function private ‪_GetPhalanxSpawner( tier )
194 {
195  spawner = GetSpawnerArray( tier, "targetname" );
196 
197  assert( spawner.size >= 0,
198  "No spawners for the phalanx system were found, make sure you include " +
199  "the \"game/map_source/_prefabs/ai/robot_phalanx.map\" prefab within your " +
200  "map to use the system." );
201  assert( spawner.size == 1,
202  "Too many spawners for the phalanx system were found, make sure you " +
203  "don't include multiple copies of the " +
204  "\"game/map_source/_prefabs/ai/robot_phalanx.map\" prefab in your map." );
205 
206  return spawner[0];
207 }
208 
209 function private ‪_HaltAdvance( sentients )
210 {
211  assert( IsArray( sentients ) );
212 
213  foreach ( index, sentient in sentients )
214  {
215  if ( IsDefined( sentient ) && IsAlive( sentient ) && sentient HasPath() )
216  {
217  navMeshPosition = GetClosestPointOnNavMesh(
218  sentient.origin, ‪PHALANX_NAVMESH_TOLERANCE );
219 
220  sentient UsePosition( navMeshPosition );
221  sentient ClearPath();
222  }
223  }
224 }
225 
226 function private ‪_HaltFire( sentients )
227 {
228  assert( IsArray( sentients ) );
229 
230  foreach ( index, sentient in sentients )
231  {
232  if ( IsDefined( sentient ) && IsAlive( sentient ) )
233  {
234  sentient.ignoreall = true;
235  }
236  }
237 }
238 
239 function ‪_InitializeSentient( sentient )
240 {
241  assert( IsActor( sentient ) );
242 
243  sentient ‪ai::set_behavior_attribute( "phalanx", true );
244  if ( sentient.archetype === "human" )
245  {
246  sentient.allowPain = false;
247  }
248  sentient SetAvoidanceMask( "avoid none" );
249 
250  if ( ‪IS_ROBOT( sentient ) )
251  {
252  sentient ‪ai::set_behavior_attribute( "move_mode", "marching" );
253  sentient ‪ai::set_behavior_attribute( "force_cover", true );
254  }
255 
257 }
258 
259 function private ‪_MovePhalanxTier( sentients, phalanxType, tier, destination, forward )
260 {
261  positions = ‪_GetPhalanxPositions( phalanxType, tier );
262  angles = VectorToAngles( forward );
263 
264  assert( sentients.size <= positions.size,
265  "There must be enough positions for the phalanx tier to move to." );
266 
267  foreach ( index, sentient in sentients )
268  {
269  if ( IsDefined( sentient ) && IsAlive( sentient ) )
270  {
271  assert( IsVec( positions[ index ] ),
272  "Must have a formation position for position(" + index + ") in tier " +
273  tier + " of formation " + phalanxType );
274 
275  orientedPos = ‪_RotateVec( positions[ index ], angles[1] - ‪PHALANX_ROTATION_OFFSET );
276 
277  navMeshPosition = GetClosestPointOnNavMesh(
278  destination + orientedPos, ‪PHALANX_NAVMESH_TOLERANCE );
279 
280  sentient UsePosition( navMeshPosition );
281  }
282  }
283 }
284 
285 function private ‪_PruneDead( sentients )
286 {
287  liveSentients = [];
288 
289  // Removes dead sentients and keeps living ones with the same array index.
290  foreach ( index, sentient in sentients )
291  {
292  if ( IsDefined( sentient ) && IsAlive( sentient ) )
293  {
294  liveSentients[ index ] = sentient;
295  }
296  }
297 
298  return liveSentients;
299 }
300 
301 function private ‪_ReleaseSentient( sentient )
302 {
303  if ( IsDefined( sentient ) && IsAlive( sentient ) )
304  {
305  sentient ClearUsePosition();
306  sentient PathMode( "move delayed", true, RandomFloatRange( 0.5, 1 ) );
307 
308  sentient ‪ai::set_behavior_attribute( "phalanx", false );
309 
310  // Wait a frame to make sure sentients's are released from the phalanx.
312 
313  if ( sentient.archetype === "human" )
314  {
315  sentient.allowPain = true;
316  }
317  sentient SetAvoidanceMask( "avoid all" );
318 
320 
321  if ( ‪IS_ROBOT( sentient ) )
322  {
323  sentient ‪ai::set_behavior_attribute( "move_mode", "normal" );
324  sentient ‪ai::set_behavior_attribute( "force_cover", false );
325  }
326  }
327 }
328 
329 function private ‪_ReleaseSentients( sentients )
330 {
331  foreach ( index, sentient in sentients )
332  {
333  ‪_ResumeFire( sentient );
334  ‪_ReleaseSentient( sentient );
335 
336  // Release sentients slowly from their group.
337  wait RandomFloatRange( 0.5, 5 );
338  }
339 }
340 
341 function private ‪_ResumeFire( sentient )
342 {
343  if ( IsDefined( sentient ) && IsAlive( sentient ) )
344  {
345  sentient.ignoreall = false;
346  }
347 }
348 
349 function private ‪_ResumeFireSentients( sentients )
350 {
351  assert( IsArray( sentients ) );
352 
353  foreach ( index, sentient in sentients )
354  {
355  ‪_ResumeFire( sentient );
356  }
357 }
358 
359 function private ‪_RotateVec( vector, angle )
360 {
361  return ( vector[0] * Cos( angle ) - vector[1] * Sin( angle ),
362  vector[0] * Sin( angle ) + vector[1] * Cos( angle ),
363  vector[2] );
364 }
365 
366 function private ‪_UpdatePhalanxThread( phalanx )
367 {
368  while ( [[ phalanx ]]->_UpdatePhalanx() )
369  {
371  }
372 }
373 
375 {
376  // All tiers of sentients.
378 
379  // Total starting sentients in the formation.
381  // Current count of all sentients in the formation.
383 
384  // Number of sentients that must die for the formation to scatter.
386 
387  // Phalanx move positions
390 
391  // Phalanx type
393 
394  // Mark whether the formation has already been scattered.
396 
398  {
399  ‪sentientTiers_ = [];
400 
403  ‪breakingPoint_ = 0;
404 
405  ‪scattered_ = false;
406  }
407 
409  {
410  }
411 
412  function private ‪_UpdatePhalanx()
413  {
414  if ( ‪scattered_ )
415  {
416  // Terminate the phalanx if someone else has already scattered the formation.
417  return false;
418  }
419 
421 
422  // Discard dead sentients from the phalanx.
423  foreach ( ‪name, tier in ‪sentientTiers_ )
424  {
426 
428  }
429 
430  // Break up the phalanx if enough sentients died.
432  {
434 
435  return false;
436  }
437 
438  return true;
439  }
440 
441  function ‪HaltFire()
442  {
443  foreach ( ‪name, tier in ‪sentientTiers_ )
444  {
445  ‪Phalanx::_HaltFire( tier );
446  }
447  }
448 
449  function ‪HaltAdvance()
450  {
451  if ( !‪scattered_ )
452  {
453  foreach ( ‪name, tier in ‪sentientTiers_ )
454  {
455  ‪Phalanx::_HaltAdvance( tier );
456  }
457  }
458  }
459 
460  function ‪Initialize(
461  phalanxType,
462  origin,
463  destination,
464  breakingPoint,
465  maxTierSize = ‪PHALANX_MAX_TIER_SIZE,
466  tierOneSpawner = undefined,
467  tierTwoSpawner = undefined,
468  tierThreeSpawner = undefined )
469  {
470  assert( IsString( phalanxType ) );
471  assert( IsInt( breakingPoint ) );
472  assert( IsVec( origin ) );
473  assert( IsVec( destination ) );
474 
475  tierSpawners = [];
476  tierSpawners[ ‪PHALANX_TIER_ONE ] = tierOneSpawner;
477  tierSpawners[ ‪PHALANX_TIER_TWO ] = tierTwoSpawner;
478  tierSpawners[ ‪PHALANX_TIER_THREE ] = tierThreeSpawner;
479 
481 
482  forward = VectorNormalize( destination - origin );
483 
484  foreach ( tierName in ‪PHALANX_TIERS )
485  {
487  phalanxType, tierName, origin, forward, maxTierSize, tierSpawners[ tierName ] );
488 
489  ‪startSentientCount_ += ‪sentientTiers_[ tierName ].size;
490  }
491 
492  // The first tier facing the enemy always crouches.
494 
495  // Assign phalanx positions to all sentient tiers.
496  foreach ( ‪name, tier in ‪sentientTiers_ )
497  {
499  ‪sentientTiers_[ ‪name ], phalanxType, ‪name, destination, forward );
500  }
501 
502  ‪breakingPoint_ = breakingPoint;
503  ‪startPosition_ = origin;
504  ‪endPosition_ = destination;
505  ‪phalanxType_ = phalanxType;
506 
507  // Initiate the main update loop, a single thread that updates the phalanx.
508  self thread ‪Phalanx::_UpdatePhalanxThread( self );
509  }
510 
511  function ‪ResumeAdvance()
512  {
513  if ( !‪scattered_ )
514  {
516 
517  // TODO(David Young 10-21-14): Too hardcoded, waiting for animation to complete.
518  wait 1;
519 
520  forward = VectorNormalize( ‪endPosition_ - ‪startPosition_ );
521 
528 
530  }
531  }
532 
533  function ‪ResumeFire()
534  {
538  }
539 
540  function ‪ScatterPhalanx()
541  {
542  if ( !‪scattered_ )
543  {
544  ‪scattered_ = true;
545 
548 
550 
551  // Settling time for the tier.
552  wait RandomFloatRange( 5, 7 );
553 
556 
558 
559  // Settling time for the tier.
560  wait RandomFloatRange( 5, 7 );
561 
564  }
565  }
566 }
‪PHALANX_DIAGONAL_LEFT_TIER_THREE
‪#define PHALANX_DIAGONAL_LEFT_TIER_THREE
Definition: phalanx.gsh:70
‪Phalanx::_UpdatePhalanx
‪function private _UpdatePhalanx()
Definition: phalanx.gsc:412
‪RemoveAIOverrideDamageCallback
‪function RemoveAIOverrideDamageCallback(entity, callback)
Definition: archetype_utility.gsc:577
‪_InitializeSentient
‪function _InitializeSentient(sentient)
Definition: phalanx.gsc:239
‪AddAIOverrideDamageCallback
‪function AddAIOverrideDamageCallback(entity, callback, addToFront)
Definition: archetype_utility.gsc:542
‪Phalanx::phalanxType_
‪var phalanxType_
Definition: phalanx.gsc:392
‪PHALANX_WEDGE_TIER_THREE
‪#define PHALANX_WEDGE_TIER_THREE
Definition: phalanx.gsh:47
‪PHALANX_TIERS
‪#define PHALANX_TIERS
Definition: phalanx.gsh:25
‪_ReleaseSentient
‪function private _ReleaseSentient(sentient)
Definition: phalanx.gsc:301
‪PHALANX_FORWARD_TIER_THREE
‪#define PHALANX_FORWARD_TIER_THREE
Definition: phalanx.gsh:98
‪Phalanx::scattered_
‪var scattered_
Definition: phalanx.gsc:395
‪PHALANX_NAVMESH_TOLERANCE
‪#define PHALANX_NAVMESH_TOLERANCE
Definition: phalanx.gsh:130
‪Phalanx::sentientTiers_
‪var sentientTiers_
Definition: phalanx.gsc:377
‪_RotateVec
‪function private _RotateVec(vector, angle)
Definition: phalanx.gsc:359
‪Phalanx::constructor
‪constructor()
Definition: phalanx.gsc:397
‪_AssignPhalanxStance
‪function private _AssignPhalanxStance(sentients, stance)
Definition: phalanx.gsc:12
‪PHALANX_WEDGE_TIER_ONE
‪#define PHALANX_WEDGE_TIER_ONE
Definition: phalanx.gsh:36
‪PHALANX_DIAGONAL_LEFT
‪#define PHALANX_DIAGONAL_LEFT
Definition: phalanx.gsh:11
‪PHALANX_DIAGONAL_RIGHT_TIER_THREE
‪#define PHALANX_DIAGONAL_RIGHT_TIER_THREE
Definition: phalanx.gsh:84
‪_HaltFire
‪function private _HaltFire(sentients)
Definition: phalanx.gsc:226
‪_GetPhalanxSpawner
‪function private _GetPhalanxSpawner(tier)
Definition: phalanx.gsc:193
‪Phalanx::Initialize
‪function Initialize(phalanxType, origin, destination, breakingPoint, maxTierSize=PHALANX_MAX_TIER_SIZE, tierOneSpawner=undefined, tierTwoSpawner=undefined, tierThreeSpawner=undefined)
Definition: phalanx.gsc:460
‪PHALANX_FORWARD_TIER_TWO
‪#define PHALANX_FORWARD_TIER_TWO
Definition: phalanx.gsh:92
‪spawn
‪function spawn(v_origin=(0, 0, 0), v_angles=(0, 0, 0))
Definition: struct.csc:23
‪Phalanx::startPosition_
‪var startPosition_
Definition: phalanx.gsc:388
‪_ResumeFireSentients
‪function private _ResumeFireSentients(sentients)
Definition: phalanx.gsc:349
‪PHALANX_FORWARD
‪#define PHALANX_FORWARD
Definition: phalanx.gsh:9
‪Phalanx
Definition: phalanx.gsc:374
‪_CreatePhalanxTier
‪function private _CreatePhalanxTier(phalanxType, tier, phalanxPosition, forward, maxTierSize, spawner=undefined)
Definition: phalanx.gsc:25
‪PHALANX_DIAGONAL_LEFT_TIER_TWO
‪#define PHALANX_DIAGONAL_LEFT_TIER_TWO
Definition: phalanx.gsh:64
‪damage
‪function damage(trap)
Definition: _zm_trap_electric.gsc:116
‪PHALANX_DIAGONAL_RIGHT_TIER_TWO
‪#define PHALANX_DIAGONAL_RIGHT_TIER_TWO
Definition: phalanx.gsh:78
‪PHALANX_DIAGONAL_LEFT_TIER_ONE
‪#define PHALANX_DIAGONAL_LEFT_TIER_ONE
Definition: phalanx.gsh:58
‪PHALANX_ROTATION_OFFSET
‪#define PHALANX_ROTATION_OFFSET
Definition: phalanx.gsh:132
‪_UpdatePhalanxThread
‪function private _UpdatePhalanxThread(phalanx)
Definition: phalanx.gsc:366
‪Phalanx::HaltFire
‪function HaltFire()
Definition: phalanx.gsc:441
‪PHALANX_WEDGE_TIER_TWO
‪#define PHALANX_WEDGE_TIER_TWO
Definition: phalanx.gsh:43
‪PHALANX_DIAGONAL_RIGHT_TIER_ONE
‪#define PHALANX_DIAGONAL_RIGHT_TIER_ONE
Definition: phalanx.gsh:72
‪PHALANX_TIER_TWO
‪#define PHALANX_TIER_TWO
Definition: phalanx.gsh:22
‪PHALANX_DIAGONAL_RIGHT
‪#define PHALANX_DIAGONAL_RIGHT
Definition: phalanx.gsh:10
‪PHALANX_REVERSE_WEDGE_TIER_THREE
‪#define PHALANX_REVERSE_WEDGE_TIER_THREE
Definition: phalanx.gsh:56
‪Phalanx::HaltAdvance
‪function HaltAdvance()
Definition: phalanx.gsc:449
‪PHALANX_TIER_ONE
‪#define PHALANX_TIER_ONE
Definition: phalanx.gsh:21
‪Phalanx::destructor
‪destructor()
Definition: phalanx.gsc:408
‪_MovePhalanxTier
‪function private _MovePhalanxTier(sentients, phalanxType, tier, destination, forward)
Definition: phalanx.gsc:259
‪PHALANX_COLUMN_TIER_TWO
‪#define PHALANX_COLUMN_TIER_TWO
Definition: phalanx.gsh:106
‪_ReleaseSentients
‪function private _ReleaseSentients(sentients)
Definition: phalanx.gsc:329
‪array
‪function filter array
Definition: array_shared.csc:16
‪_HaltAdvance
‪function private _HaltAdvance(sentients)
Definition: phalanx.gsc:209
‪Phalanx::currentSentientCount_
‪var currentSentientCount_
Definition: phalanx.gsc:382
‪PHALANX_COLUMN_TIER_ONE
‪#define PHALANX_COLUMN_TIER_ONE
Definition: phalanx.gsh:100
‪_ResumeFire
‪function private _ResumeFire(sentient)
Definition: phalanx.gsc:341
‪PHALANX_COLUMN
‪#define PHALANX_COLUMN
Definition: phalanx.gsh:7
‪Phalanx::breakingPoint_
‪var breakingPoint_
Definition: phalanx.gsc:385
‪PHALANX_TIER_THREE
‪#define PHALANX_TIER_THREE
Definition: phalanx.gsh:23
‪PHALANX_COLUMN_RIGHT
‪#define PHALANX_COLUMN_RIGHT
Definition: phalanx.gsh:8
‪PHALANX_FORWARD_TIER_ONE
‪#define PHALANX_FORWARD_TIER_ONE
Definition: phalanx.gsh:86
‪PHALANX_REVERSE_WEDGE_TIER_TWO
‪#define PHALANX_REVERSE_WEDGE_TIER_TWO
Definition: phalanx.gsh:53
‪set_behavior_attribute
‪function set_behavior_attribute(attribute, value)
Definition: ai_shared.gsc:159
‪PHALANX_REVERSE_WEDGE_TIER_ONE
‪#define PHALANX_REVERSE_WEDGE_TIER_ONE
Definition: phalanx.gsh:49
‪_GetPhalanxPositions
‪function private _GetPhalanxPositions(phalanxType, tier)
Definition: phalanx.gsc:105
‪PHALANX_MIN_TIER_SIZE
‪#define PHALANX_MIN_TIER_SIZE
Definition: phalanx.gsh:136
‪PHALANX_WEDGE
‪#define PHALANX_WEDGE
Definition: phalanx.gsh:13
‪clamp
‪function clamp(val, val_min, val_max)
Definition: math_shared.csc:16
‪Phalanx::ResumeAdvance
‪function ResumeAdvance()
Definition: phalanx.gsc:511
‪PHALANX_COLUMN_RIGHT_TIER_TWO
‪#define PHALANX_COLUMN_RIGHT_TIER_TWO
Definition: phalanx.gsh:120
‪Phalanx::ResumeFire
‪function ResumeFire()
Definition: phalanx.gsc:533
‪name
‪class GroundFx name
‪_PruneDead
‪function private _PruneDead(sentients)
Definition: phalanx.gsc:285
‪PHALANX_MAX_TIER_SIZE
‪#define PHALANX_MAX_TIER_SIZE
Definition: phalanx.gsh:134
‪_DampenExplosiveDamage
‪function private _DampenExplosiveDamage(inflictor, attacker, damage, flags, meansOfDamage, weapon, point, dir, hitLoc, offsetTime, boneIndex, modelIndex)
Definition: phalanx.gsc:70
‪PHALANX_COLUMN_RIGHT_TIER_THREE
‪#define PHALANX_COLUMN_RIGHT_TIER_THREE
Definition: phalanx.gsh:122
‪PHALANX_COLUMN_TIER_THREE
‪#define PHALANX_COLUMN_TIER_THREE
Definition: phalanx.gsh:112
‪PHALANX_REVERSE_WEDGE
‪#define PHALANX_REVERSE_WEDGE
Definition: phalanx.gsh:12
‪IS_ROBOT
‪#define IS_ROBOT(__e)
Definition: archetype_shared.gsh:43
‪PHALANX_COLUMN_RIGHT_TIER_ONE
‪#define PHALANX_COLUMN_RIGHT_TIER_ONE
Definition: phalanx.gsh:114
‪Phalanx::ScatterPhalanx
‪function ScatterPhalanx()
Definition: phalanx.gsc:540
‪PHALANX_UPDATE_RATE_SEC
‪#define PHALANX_UPDATE_RATE_SEC
Definition: robot_phalanx.gsh:123
‪Phalanx::endPosition_
‪var endPosition_
Definition: phalanx.gsc:389
‪SPAWNFLAG_ACTOR_SCRIPTINFINITESPAWN
‪#define SPAWNFLAG_ACTOR_SCRIPTINFINITESPAWN
Definition: shared.gsh:54
‪WAIT_SERVER_FRAME
‪#define WAIT_SERVER_FRAME
Definition: shared.gsh:265
‪Phalanx::startSentientCount_
‪var startSentientCount_
Definition: phalanx.gsc:380