1 #using scripts\shared\ai_shared;
2 #using scripts\shared\ai\systems\animation_state_machine_utility;
3 #using scripts\shared\ai\systems\behavior_state_machine;
4 #using scripts\shared\ai\systems\behavior_tree_utility;
5 #using scripts\shared\ai\systems\blackboard;
6 #using scripts\shared\ai\archetype_cover_utility;
7 #using scripts\shared\ai\archetype_utility;
8 #using scripts\shared\math_shared;
10 #insert scripts\shared\ai\systems\animation_state_machine.gsh;
11 #insert scripts\shared\ai\systems\behavior.gsh;
12 #insert scripts\shared\ai\systems\behavior_state_machine.gsh;
13 #insert scripts\shared\ai\systems\behavior_tree.gsh;
14 #insert scripts\shared\ai\systems\blackboard.gsh;
15 #insert scripts\shared\ai\utility.gsh;
16 #insert scripts\shared\shared.gsh;
87 startNode = behaviorTreeEntity.traverseStartNode;
88 if ( IsDefined( startNode ) && behaviorTreeEntity ShouldStartTraversal() )
90 if( IsDefined( startNode.animscript ) && IsSubStr( ToLower( startNode.animscript ),
"stairs" ) )
99 assert( IsDefined( behaviorTreeEntity._stairsStartNode ) && IsDefined( behaviorTreeEntity._stairsEndNode ) );
112 totalStepsWithoutOut = numTotalSteps - numOutSteps;
114 if( stepsSoFar >= ( totalStepsWithoutOut ) )
119 remainingSteps = totalStepsWithoutOut - stepsSoFar;
121 if( remainingSteps >=3 || remainingSteps >= 6 || remainingSteps >= 8 )
131 assert( IsDefined( behaviorTreeEntity._stairsStartNode ) && IsDefined( behaviorTreeEntity._stairsEndNode ) );
154 if( stepsSoFar >= ( numTotalSteps - numOutSteps ) )
156 behaviorTreeEntity SetStairsExitTransform();
165 startNode = behaviorTreeEntity.traverseStartNode;
166 endNode = behaviorTreeEntity.traverseEndNode;
168 assert( IsDefined( startNode ) && IsDefined( endNode ) );
170 behaviorTreeEntity._stairsStartNode = startNode;
171 behaviorTreeEntity._stairsEndNode = endNode;
173 if( startNode.type ==
"Begin" )
182 numTotalSteps = undefined;
184 if( IsDefined( startNode.script_int ) )
186 numTotalSteps = int( endNode.script_int );
188 else if( IsDefined( endNode.script_int ) )
190 numTotalSteps = int( endNode.script_int );
194 assert( IsDefined( numTotalSteps ) && IsInt( numTotalSteps ) && numTotalSteps > 0 );
200 exitType = undefined;
203 switch(
int( behaviorTreeEntity._stairsStartNode.script_int ) % 4 )
213 switch(
int( behaviorTreeEntity._stairsStartNode.script_int ) % 2 )
226 assert( IsDefined( behaviorTreeEntity._stairsStartNode ) && IsDefined( behaviorTreeEntity._stairsEndNode ) );
240 return ( entity HasPath() && entity HasValidInterrupt(
"pain") );
245 behaviorTreeEntity ClearPath();
250 if( !behaviorTreeEntity HasPath() )
253 if(
IS_TRUE( behaviorTreeEntity.accurateFire ) )
257 if( IsDefined( behaviorTreeEntity.enemy ) )
265 if( !behaviorTreeEntity HasPath() )
269 if(
IS_TRUE( behaviorTreeEntity.accurateFire ) )
274 if( IsDefined( behaviorTreeEntity.enemy ) )
282 return behaviorTreeEntity HasPath();
296 startNode = behaviorTreeEntity.traverseStartNode;
297 if ( IsDefined( startNode ) && behaviorTreeEntity ShouldStartTraversal() )
320 animationResults = behaviorTreeEntity ASTSearch( IString( asmStateName ) );
323 behaviorTreeEntity.archetype
324 +
" does not support traversal of type "
325 + behaviorTreeEntity.traverseStartNode.animscript
327 + behaviorTreeEntity.traverseStartNode.origin
338 entity.disableRepath =
true;
343 entity.disableRepath =
false;
349 if( behaviorTreeEntity ShouldStartArrival() )
367 if ( !IsDefined( behaviorTreeEntity.isarrivalpending ) ||
IS_TRUE( behaviorTreeEntity.isarrivalpending ) )
369 self ClearUsePosition();
377 entity PathMode(
"move delayed",
false, RandomFloatRange( 1, 2 ) );
397 behaviorTreeEntity.newEnemyReaction =
false;
400 behaviorTreeEntity OrientMode(
"face enemy" );
418 behaviorTreeEntity OrientMode(
"face enemy" );
427 jukeNavmeshThreshold = 6;
429 forwardPosition = entity.origin + lateralOffset + forwardOffset;
430 backwardPosition = entity.origin + lateralOffset - forwardOffset;
432 forwardPositionValid = IsPointOnNavMesh( forwardPosition, entity ) && TracePassedOnNavMesh( entity.origin, forwardPosition );
433 backwardPositionValid = IsPointOnNavMesh( backwardPosition, entity ) && TracePassedOnNavMesh( entity.origin, backwardPosition );
435 if ( !IsDefined( entity.ignoreBackwardPosition ) )
437 return forwardPositionValid && backwardPositionValid;
441 return forwardPositionValid;
449 jukeNavmeshThreshold = 6;
450 defaultDirection =
"forward";
452 if ( IsDefined( entity.defaultJukeDirection ) )
454 defaultDirection = entity.defaultJukeDirection;
457 if ( IsDefined( entity.enemy ) )
459 navmeshPosition = GetClosestPointOnNavMesh( entity.origin, jukeNavmeshThreshold );
461 if ( !IsVec( navmeshPosition ) )
463 return defaultDirection;
466 vectorToEnemy = entity.enemy.origin - entity.origin;
467 vectorToEnemyAngles = VectorToAngles( vectorToEnemy );
468 forwardDistance = AnglesToForward( vectorToEnemyAngles ) * entityRadius;
469 rightJukeDistance = AnglesToRight( vectorToEnemyAngles ) *
jukeDistance;
471 preferLeft = undefined;
473 if ( entity HasPath() )
476 rightPosition = entity.origin + rightJukeDistance;
477 leftPosition = entity.origin - rightJukeDistance;
479 preferLeft = DistanceSquared( leftPosition, entity.pathgoalpos ) <=
480 DistanceSquared( rightPosition, entity.pathgoalpos );
493 else if (
validJukeDirection( entity, navmeshPosition, forwardDistance, rightJukeDistance ) )
504 else if (
validJukeDirection( entity, navmeshPosition, forwardDistance, -rightJukeDistance ) )
511 return defaultDirection;
519 if ( IsDefined( entity.jukeDistance ) )
524 if ( IsDefined( entity.entityRadius ) )
526 entityRadius = entity.entityRadius;
539 if ( IsDefined( entity.jukeMaxDistance ) && IsDefined( entity.enemy ) )
541 maxDistSquared = entity.jukeMaxDistance * entity.jukeMaxDistance;
543 if ( Distance2DSquared( entity.origin, entity.enemy.origin ) > maxDistSquared )