1 #using scripts\shared\ai\systems\animation_state_machine_mocomp;
2 #using scripts\shared\ai\systems\animation_state_machine_utility;
3 #using scripts\shared\ai\systems\behavior_tree_utility;
4 #using scripts\shared\ai\systems\blackboard;
5 #using scripts\shared\ai\archetype_utility;
7 #insert scripts\shared\ai\systems\animation_state_machine.gsh;
8 #insert scripts\shared\ai\systems\behavior.gsh;
9 #insert scripts\shared\ai\systems\behavior_tree.gsh;
10 #insert scripts\shared\ai\systems\blackboard.gsh;
11 #insert scripts\shared\ai\utility.gsh;
12 #insert scripts\shared\shared.gsh;
37 #define COVER_ANY "cover_any"
38 #define STANCE_ANY "stance_any"
57 _AddAdjustToCover(
"human",
COVER_ANY,
STANCE_ANY, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.9, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8 );
59 _AddAdjustToCover(
"human",
COVER_STAND,
STANCE_ANY, 0.4, 0.8, 0.6, 0.4, 0.6, 0.3, 0.3, 0.6, 0.9, 0.6, 0.3, 0.4, 0.7, 0.6, 0.6, 0.6 );
60 _AddAdjustToCover(
"human",
COVER_CROUCH,
STANCE_ANY, 0.4, 0.4, 0.4, 0.4, 0.8, 0.5, 0.2, 0.7, 0.9, 0.4, 0.2, 0.4, 0.5, 0.5, 0.5, 0.5 );
62 _AddAdjustToCover(
"human",
COVER_LEFT,
STANCE_STAND, 0.8, 0.4, 0.4, 0.4, 0.4, 0.7, 0.3, 0.5, 0.8, 0.8, 0.8, 0.9, 0.6, 0.6, 0.4, 0.4 );
63 _AddAdjustToCover(
"human",
COVER_LEFT,
STANCE_CROUCH, 0.8, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.8, 0.8, 0.7, 0.6, 0.6, 0.4, 0.4 );
65 _AddAdjustToCover(
"human",
COVER_RIGHT,
STANCE_STAND, 0.8, 0.4, 0.3, 0.4, 0.6, 0.8, 0.4, 0.4, 0.4, 0.4, 0.3, 0.4, 0.6, 0.6, 0.5, 0.4 );
66 _AddAdjustToCover(
"human",
COVER_RIGHT,
STANCE_CROUCH, 0.8, 0.4, 0.2, 0.4, 0.4, 0.7, 0.2, 0.3, 0.3, 0.5, 0.5, 0.7, 0.6, 0.6, 0.5, 0.4 );
68 _AddAdjustToCover(
"human",
COVER_PILLAR,
STANCE_ANY, 0.8, 0.7, 0.6, 0.7, 0.6, 0.5, 0.4, 0.4, 0.4, 0.6, 0.4, 0.3, 0.7, 0.5, 0.1, 0.7 );
70 _AddAdjustToCover(
"robot",
COVER_ANY,
STANCE_ANY, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.6, 0.7, 0.5, 0.5, 0.5, 0.5, 0.4, 0.4, 0.4 );
71 _AddAdjustToCover(
"robot",
COVER_EXPOSED,
STANCE_ANY, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.9, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8 );
75 archetype, node, stance, rot2, rot32, rot3, rot36, rot6, rot69, rot9, rot98, rot8, rot87, rot7, rot47, rot4, rot14, rot1, rot21 )
77 if ( !IsDefined( level.adjustToCover ) )
79 level.adjustToCover = [];
82 if ( !IsDefined( level.adjustToCover[ archetype ] ) )
84 level.adjustToCover[ archetype ] = [];
87 if ( !IsDefined( level.adjustToCover[ archetype ][ node ] ) )
89 level.adjustToCover[ archetype ][ node ] = [];
93 directions[ 2 ] = rot2;
94 directions[ 32 ] = rot32;
95 directions[ 3 ] = rot3;
96 directions[ 63 ] = rot36;
97 directions[ 6 ] = rot6;
98 directions[ 96 ] = rot69;
99 directions[ 9 ] = rot9;
100 directions[ 89 ] = rot98;
101 directions[ 8 ] = rot8;
102 directions[ 78 ] = rot87;
103 directions[ 7 ] = rot7;
104 directions[ 47 ] = rot47;
105 directions[ 4 ] = rot4;
106 directions[ 14 ] = rot14;
107 directions[ 1 ] = rot1;
108 directions[ 21 ] = rot21;
110 level.adjustToCover[ archetype ][ node ][ stance ] = directions;
116 assert( IsArray( level.adjustToCover[ archetype ] ) );
118 if ( !IsDefined( level.adjustToCover[ archetype ][ node ] ) )
123 assert( IsArray( level.adjustToCover[ archetype ][ node ] ) );
125 if ( !IsDefined( level.adjustToCover[ archetype ][ node ][ stance ] ) )
130 assert( IsArray( level.adjustToCover[ archetype ][ node ][ stance ] ) );
131 assert( angleToNode >= 0 && angleToNode < 360 );
133 direction = undefined;
145 if ( angletonode < 11.25 )
147 else if ( angletonode < 33.75 )
149 else if ( angletonode < 56.25 )
151 else if ( angletonode < 78.75 )
153 else if ( angletonode < 101.25 )
155 else if ( angletonode < 123.75 )
157 else if ( angletonode < 146.25 )
159 else if ( angletonode < 168.75 )
161 else if ( angletonode < 191.25 )
163 else if ( angletonode < 213.75 )
165 else if ( angletonode < 236.25 )
167 else if ( angletonode < 258.75 )
169 else if ( angletonode < 281.25 )
171 else if ( angletonode < 303.75 )
173 else if ( angletonode < 326.25 )
175 else if ( angletonode < 348.75 )
180 assert( IsDefined( level.adjustToCover[archetype][ node ][ stance ][ direction ] ) );
182 adjustTime = level.adjustToCover[archetype][ node ][ stance ][ direction ];
184 if ( IsDefined( adjustTime ) )
195 entity endon(
"death" );
198 startOrigin = entity.origin;
199 startYawForward = AnglesToForward( ( 0, entity.angles[1], 0 ) );
200 damageYawForward = AnglesToForward( ( 0, entity.damageyaw - entity.angles[1], 0 ) );
206 RecordSphere( startOrigin, 5,
RED,
"Animscript", entity );
207 RecordLine( startOrigin, startOrigin + startYawForward * 100,
BLUE,
"Animscript", entity );
208 RecordLine( startOrigin, startOrigin + damageYawForward * 100,
RED,
"Animscript", entity );
215 function private mocompFlankStandInit( entity, mocompAnim, mocompAnimBlendOutTime, mocompAnimFlag, mocompDuration )
218 entity OrientMode(
"face angle", entity.angles[1] );
220 entity PathMode(
"move delayed",
false, RandomFloatRange( 0.5, 1.0 ) );
222 if ( IsDefined( entity.enemy ) )
224 entity GetPerfectInfo( entity.enemy );
225 entity.newEnemyReaction =
false;
232 entity OrientMode(
"face angle", entity.angles[1] );
235 if ( GetDvarInt(
"ai_debugLocoExplosionMocomp" ) )
242 #define MAX_MOVE_DISTANCE 1
246 entity OrientMode(
"face angle", entity.angles[1] );
248 entity.blockingPain =
true;
250 if ( IsDefined( entity.node ) )
252 entity.adjustNode = entity.node;
253 entity.nodeOffsetOrigin = entity GetNodeOffsetPosition( entity.node );
254 entity.nodeOffsetAngles = entity GetNodeOffsetAngles( entity.node );
255 entity.nodeOffsetForward = AnglesToForward( entity.nodeOffsetAngles );
256 entity.nodeForward = AnglesToForward( entity.node.angles );
260 if ( !IsDefined( entity.nodeFinalStance ) )
266 angleDifference = Floor( AbsAngleClamp360( entity.angles[1] - entity.node.angles[1] ) );
268 entity.mocompAngleStartTime =
_GetAdjustToCoverRotation( entity.archetype, coverType, entity.nodeFinalStance, angleDifference );
274 if( !IsDefined( entity.adjustNode ) )
279 moveVector = entity.nodeOffsetOrigin - entity.origin;
287 entity ForceTeleport( entity.origin + moveVector, entity.angles,
false );
289 normalizedTime = ( ( entity GetAnimTime( mocompAnim ) * GetAnimLength( mocompAnim ) ) + mocompAnimBlendOutTime ) / mocompDuration;
291 if ( normalizedTime > entity.mocompAngleStartTime )
293 entity OrientMode(
"face angle", entity.nodeOffsetAngles );
298 if ( GetDvarInt(
"ai_debugAdjustMocomp" ) )
300 record3DText( entity.mocompAngleStartTime, entity.origin + (0, 0, 5),
GREEN,
"Animscript" );
302 hipTagOrigin = entity GetTagOrigin(
"j_mainroot" );
304 recordLine( entity.nodeOffsetOrigin, entity.nodeOffsetOrigin + entity.nodeOffsetForward * 30,
ORANGE,
"Animscript", entity );
305 recordLine( entity.adjustNode.origin, entity.adjustNode.origin + entity.nodeForward * 20,
GREEN,
"Animscript", entity );
306 recordLine( entity.origin, entity.origin + AnglesToForward( entity.angles ) * 10,
RED,
"Animscript", entity );
308 recordLine( hipTagOrigin, ( hipTagOrigin[0], hipTagOrigin[1], entity.origin[2] ),
BLUE,
"Animscript", entity );
315 entity.blockingPain =
false;
316 entity.mocompAngleStartTime = undefined;
317 entity.nodeOffsetAngle = undefined;
318 entity.nodeOffsetForward = undefined;
319 entity.nodeForward = undefined;
320 entity.nodeFinalStance = undefined;
322 if( entity.adjustNode !== entity.node )
324 entity.nodeOffsetOrigin = undefined;
325 entity.nodeOffsetAngles = undefined;
326 entity.adjustNode = undefined;
330 entity ForceTeleport( entity.nodeOffsetOrigin, entity.nodeOffsetAngles,
false );
331 entity.nodeOffsetOrigin = undefined;
332 entity.nodeOffsetAngles = undefined;
333 entity.adjustNode = undefined;