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 );