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; 
    6 #insert scripts\shared\shared.gsh; 
    7 #insert scripts\shared\ai\robot_phalanx.gsh; 
    9 #namespace RobotPhalanx; 
   13     assert( IsArray( robots ) );
 
   15     foreach ( index, robot 
in robots )
 
   17         if ( IsDefined( robot) && IsAlive( robot ) )
 
   25     phalanxType, tier, phalanxPosition, forward, maxTierSize, spawner = undefined )
 
   29     if ( !IsSpawner( spawner ) )
 
   35     angles = VectorToAngles( forward );
 
   37     foreach ( index, position 
in positions )
 
   39         if ( index >= maxTierSize )
 
   46         navMeshPosition = GetClosestPointOnNavMesh(
 
   57         if ( IsAlive( robot ) )
 
   64             robots[ robots.size ] = robot;
 
   73     inflictor, attacker, 
damage, flags, meansOfDamage, weapon, point, dir, hitLoc, offsetTime, boneIndex, modelIndex )
 
   77     isExplosive = IsInArray(
 
   82             "MOD_PROJECTILE_SPLASH",
 
   86     if ( isExplosive && IsDefined( inflictor ) && IsDefined( inflictor.weapon ) )
 
   88         weapon = inflictor.weapon;
 
   90         distanceToEntity = Distance( entity.origin, inflictor.origin );
 
   95         if ( weapon.explosionradius > 0 )
 
   97             fractionDistance = ( weapon.explosionradius - distanceToEntity ) / weapon.explosionradius;
 
  101         return Int( Max( 
damage * fractionDistance, 1 ) );
 
  109     switch ( phalanxType )
 
  178             assert( 
"Unknown phalanx type \"" + phalanxType + 
"\"." );
 
  181     assert( 
"Unknown phalanx tier \"" + tier + 
"\"." );
 
  186     spawner = GetSpawnerArray( tier, 
"targetname" );
 
  188     assert( spawner.size >= 0,
 
  189         "No spawners for the robot phalanx system were found, make sure you include " +
 
  190         "the \"game/map_source/_prefabs/ai/robot_phalanx.map\" prefab within your " +
 
  191         "map to use the system." );
 
  192     assert( spawner.size == 1,
 
  193         "Too many spawners for the robot phalanx system were found, make sure you " +
 
  194         "don't include multiple copies of the " +
 
  195         "\"game/map_source/_prefabs/ai/robot_phalanx.map\" prefab in your map." );
 
  202     assert( IsArray( robots ) );
 
  204     foreach ( index, robot 
in robots )
 
  206         if ( IsDefined( robot) && IsAlive( robot ) && robot HasPath() )
 
  208             navMeshPosition = GetClosestPointOnNavMesh(
 
  211             robot UsePosition( navMeshPosition );
 
  219     assert( IsArray( robots ) );
 
  221     foreach ( index, robot 
in robots )
 
  223         if ( IsDefined( robot) && IsAlive( robot ) )
 
  225             robot.ignoreall = 
true;
 
  232     assert( IsActor( robot ) );
 
  238     robot SetAvoidanceMask( 
"avoid none" );
 
  246     angles = VectorToAngles( forward );
 
  248     assert( robots.size <= positions.size,
 
  249         "There must be enough positions for the phalanx tier to move to." );
 
  251     foreach ( index, robot 
in robots )
 
  253         if ( IsDefined( robot ) && IsAlive( robot ) )
 
  255             assert( IsVec( positions[ index ] ),
 
  256                 "Must have a formation position for position(" + index + 
") in tier " +
 
  257                 tier + 
" of formation " + phalanxType );
 
  261             navMeshPosition = GetClosestPointOnNavMesh(
 
  264             robot UsePosition( navMeshPosition );
 
  274     foreach ( index, robot 
in robots )
 
  276         if ( IsDefined( robot ) && IsAlive( robot ) )
 
  278             liveRobots[ index ] = robot;
 
  287     if ( IsDefined( robot ) && IsAlive( robot ) )
 
  289         robot ClearUsePosition();
 
  290         robot PathMode( 
"move delayed", 
true, RandomFloatRange( 0.5, 1 ) );
 
  300         robot SetAvoidanceMask( 
"avoid all" );
 
  308     foreach ( index, robot 
in robots )
 
  314         wait RandomFloatRange( 0.5, 5 );
 
  320     if ( IsDefined( robot) && IsAlive( robot ) )
 
  322         robot.ignoreall = 
false;
 
  328     assert( IsArray( robots ) );
 
  330     foreach ( index, robot 
in robots )
 
  338     return ( vector[0] * Cos( angle ) - vector[1] * Sin( angle ),
 
  339         vector[0] * Sin( angle ) + vector[1] * Cos( angle ),
 
  345     while ( [[ phalanx ]]->_UpdatePhalanx() )
 
  442         tierOneSpawner = undefined,
 
  443         tierTwoSpawner = undefined,
 
  444         tierThreeSpawner = undefined )
 
  446         assert( IsString( phalanxType ) );
 
  447         assert( IsInt( breakingPoint ) );
 
  448         assert( IsVec( origin ) );
 
  449         assert( IsVec( destination ) );
 
  453         forward = VectorNormalize( destination - origin );
 
  524             wait RandomFloatRange( 5, 7 );
 
  532             wait RandomFloatRange( 5, 7 );