iw6-scripts-dev/maps/mp/agents/alien/_alien_anim_utils.gsc
2024-12-11 11:28:08 +01:00

829 lines
38 KiB
Plaintext

#include maps\mp\agents\_scriptedAgents;
//=======================================================
// initAlienAnims
//=======================================================
initAlienAnims()
{
level.alienAnimData = SpawnStruct();
initAlienCannedTraverses( level.alienAnimData );
initAlienJumpTraverses( level.alienAnimData );
initAlienPain( level.alienAnimData );
initAlienDeath( level.alienAnimData );
initMoveBackAnims();
//<NOTE JC> The following values are hard-coded here. Need to run calculateAnimData() if the specific animation assets are
// changed.
level.alienAnimData.jumpLaunchArrival_maxMoveDelta = 107.659;
level.alienAnimData.stopSoon_NotifyDist = 99.4488;
}
calculateAnimData()
{
//<NOTE JC> The reason for this function is that we can only GetAnimEntry running on an agent. Only need to run this when
// specific animation set is updated
calculate_jumpLaunchArrivalMaxMoveDelta();
calculate_stopSoonNotifyDist();
}
calculate_jumpLaunchArrivalMaxMoveDelta()
{
iprintln( "level.alienAnimData.jumpLaunchArrival_maxMoveDelta = " + calculate_maxMoveDeltaInAnimState( "jump_launch_arrival" ) );
}
calculate_stopSoonNotifyDist()
{
iprintln( "level.alienAnimData.stopSoon_NotifyDist = " + calculate_maxMoveDeltaInAnimState( "run_stop" ) );
}
calculate_maxMoveDeltaInAnimState( animState )
{
maxMoveDeltaSq = 0;
animCount = self GetAnimEntryCount( animState );
for ( i = 0; i < animCount; i++ )
{
animEntry = self GetAnimEntry( animState, i );
moveDelta = GetMoveDelta( animEntry, 0, 1 );
deltaDistSq = LengthSquared( moveDelta );
if ( deltaDistSq > maxMoveDeltaSq )
maxMoveDeltaSq = deltaDistSq;
}
return sqrt( maxMoveDeltaSq );
}
initAlienCannedTraverses( alienAnimData )
{
alienAnimData.cannedTraverseAnims = [];
// Canned traversals
// Group 1 --- Each group can hold 32 animations
alienAnimData.cannedTraverseAnims[ "alien_crawl_door" ] = registerTraverseData( "traverse_group_1", [ 0 ], false );
alienAnimData.cannedTraverseAnims[ "alien_jump_sidewall_l" ] = registerTraverseData( "traverse_group_1", [ 1 ], false );
alienAnimData.cannedTraverseAnims[ "alien_jump_sidewall_r" ] = registerTraverseData( "traverse_group_1", [ 2 ], false );
alienAnimData.cannedTraverseAnims[ "alien_leap_clear_height_54" ] = registerTraverseData( "traverse_group_1", [ 3 ], false );
alienAnimData.cannedTraverseAnims[ "alien_drone_traverse_corner_wall_crawl" ] = registerTraverseData( "traverse_group_1", [ 4 ], false );
alienAnimData.cannedTraverseAnims[ "alien_leap_clear_height_36" ] = registerTraverseData( "traverse_group_1", [ 5 ], false );
alienAnimData.cannedTraverseAnims[ "alien_leap_tree" ] = registerTraverseData( "traverse_group_1", [ 6 ], false );
alienAnimData.cannedTraverseAnims[ "alien_crawl_under_car" ] = registerTraverseData( "traverse_group_1", [ 7 ], false );
alienAnimData.cannedTraverseAnims[ "alien_crawl_on_car" ] = registerTraverseData( "traverse_group_1", [ 8 ], false );
alienAnimData.cannedTraverseAnims[ "alien_step_up_56" ] = registerTraverseData( "traverse_group_1", [ 9 ], false );
alienAnimData.cannedTraverseAnims[ "alien_step_down_56" ] = registerTraverseData( "traverse_group_1", [ 10 ], false );
alienAnimData.cannedTraverseAnims[ "alien_crawl_deadtree" ] = registerTraverseData( "traverse_group_1", [ 11 ], false );
alienAnimData.cannedTraverseAnims[ "alien_crawl_back_humvee" ] = registerTraverseData( "traverse_group_1", [ 12 ], false );
alienAnimData.cannedTraverseAnims[ "alien_crawl_car" ] = registerTraverseData( "traverse_group_1", [ 13 ], false );
alienAnimData.cannedTraverseAnims[ "alien_crawl_humvee" ] = registerTraverseData( "traverse_group_1", [ 14 ], false );
alienAnimData.cannedTraverseAnims[ "alien_crawl_sidecar" ] = registerTraverseData( "traverse_group_1", [ 15 ], false );
alienAnimData.cannedTraverseAnims[ "alien_crawl_sidehumvee" ] = registerTraverseData( "traverse_group_1", [ 16 ], false );
alienAnimData.cannedTraverseAnims[ "alien_under_fence" ] = registerTraverseData( "traverse_group_1", [ 17,24 ], false );
alienAnimData.cannedTraverseAnims[ "alien_climb_up_spiral_tree" ] = registerTraverseData( "traverse_group_1", [ 18 ], true );
alienAnimData.cannedTraverseAnims[ "alien_climb_up_gutter_L" ] = registerTraverseData( "traverse_group_1", [ 19 ], false );
alienAnimData.cannedTraverseAnims[ "alien_climb_up_gutter_R" ] = registerTraverseData( "traverse_group_1", [ 20 ], false );
alienAnimData.cannedTraverseAnims[ "alien_climb_over_fence_112" ] = registerTraverseData( "traverse_group_1", [ 21,22,23 ], false );
// Group 2 --- This group supports the flexible height notetrack. Does not have 'restart' on the animstate. Hold 32 animations max
alienAnimData.cannedTraverseAnims[ "alien_mantle_36" ] = registerTraverseData( "traverse_group_2", [ 0 ], false, true );
alienAnimData.cannedTraverseAnims[ "alien_drone_traverse_climb_vault_8" ] = registerTraverseData( "traverse_group_2", [ 1 ], false, true );
alienAnimData.cannedTraverseAnims[ "alien_drone_traverse_climb_over_fence" ] = registerTraverseData( "traverse_group_2", [ 2 ], false, true );
alienAnimData.cannedTraverseAnims[ "alien_crawl_rail_vault_lodge" ] = registerTraverseData( "traverse_group_2", [ 3 ], false, true );
alienAnimData.cannedTraverseAnims[ "alien_jump_rail_lodge" ] = registerTraverseData( "traverse_group_2", [ 4 ], false, false );
alienAnimData.cannedTraverseAnims[ "alien_roof_to_ceiling" ] = registerTraverseData( "traverse_group_2", [ 5 ], false, true );
alienAnimData.cannedTraverseAnims[ "alien_climb_over_fence_88" ] = registerTraverseData( "traverse_group_2", [ 6 ], false, true );
alienAnimData.cannedTraverseAnims[ "alien_jump_down_100" ] = registerTraverseData( "traverse_group_2", [ 7 ], false, true );
alienAnimData.cannedTraverseAnims[ "alien_jump_down_200" ] = registerTraverseData( "traverse_group_2", [ 8 ], false, true );
alienAnimData.cannedTraverseAnims[ "alien_jump_up_70" ] = registerTraverseData( "traverse_group_2", [ 9 ], false, true );
alienAnimData.cannedTraverseAnims[ "alien_jump_up_200" ] = registerTraverseData( "traverse_group_2", [ 10 ], false, true );
alienAnimData.cannedTraverseAnims[ "alien_jump_down_straight" ] = registerTraverseData( "traverse_group_2", [ 11 ], false, true );
alienAnimData.cannedTraverseAnims[ "alien_roof_to_ground" ] = registerTraverseData( "traverse_group_2", [ 12 ], false, true );
alienAnimData.cannedTraverseAnims[ "alien_jump_up_128_rail_32" ] = registerTraverseData( "traverse_group_2", [ 13 ], false, false );
alienAnimData.cannedTraverseAnims[ "alien_jump_up_128_rail_36" ] = registerTraverseData( "traverse_group_2", [ 14 ], false, false );
alienAnimData.cannedTraverseAnims[ "alien_jump_up_128_rail_48" ] = registerTraverseData( "traverse_group_2", [ 15 ], false, false );
alienAnimData.cannedTraverseAnims[ "alien_climb_up_rail_32_idle" ] = registerTraverseData( "traverse_group_2", [ 16 ], false, true );
alienAnimData.cannedTraverseAnims[ "alien_climb_up_rail_32_run" ] = registerTraverseData( "traverse_group_2", [ 17 ], false, true );
alienAnimData.cannedTraverseAnims[ "alien_mantle_32" ] = registerTraverseData( "traverse_group_2", [ 18 ], false, true );
alienAnimData.cannedTraverseAnims[ "alien_mantle_48" ] = registerTraverseData( "traverse_group_2", [ 19 ], false, true );
alienAnimData.cannedTraverseAnims[ "alien_jump_down_128_rail_32" ] = registerTraverseData( "traverse_group_2", [ 20 ], false, true );
alienAnimData.cannedTraverseAnims[ "alien_jump_down_128_rail_36" ] = registerTraverseData( "traverse_group_2", [ 21 ], false, true );
alienAnimData.cannedTraverseAnims[ "alien_jump_down_128_rail_48" ] = registerTraverseData( "traverse_group_2", [ 22 ], false, true );
alienAnimData.cannedTraverseAnims[ "alien_climb_down_128_rail_36" ] = registerTraverseData( "traverse_group_2", [ 23 ], true, true );
alienAnimData.cannedTraverseAnims[ "alien_mantle_crate_48" ] = registerTraverseData( "traverse_group_2", [ 24 ], false, true );
alienAnimData.cannedTraverseAnims[ "alien_mantle_crate_64" ] = registerTraverseData( "traverse_group_2", [ 25 ], false, true );
alienAnimData.cannedTraverseAnims[ "alien_jump_down_56_idle" ] = registerTraverseData( "traverse_group_2", [ 26 ], false, true );
alienAnimData.cannedTraverseAnims[ "alien_jump_down_56_run" ] = registerTraverseData( "traverse_group_2", [ 27 ], false, true );
alienAnimData.cannedTraverseAnims[ "alien_jump_up_56_idle" ] = registerTraverseData( "traverse_group_2", [ 28 ], false, true );
alienAnimData.cannedTraverseAnims[ "alien_jump_up_56_run" ] = registerTraverseData( "traverse_group_2", [ 29 ], false, true );
alienAnimData.cannedTraverseAnims[ "alien_jump_fence_88_enter_scale" ] = registerTraverseData( "traverse_group_2", [ 30 ], false, false );
alienAnimData.cannedTraverseAnims[ "alien_jump_fence_88_exit_scale" ] = registerTraverseData( "traverse_group_2", [ 31 ], false, true );
// Group 3 --- This group supports the flexible height notetrack. Does not have 'restart' on the animstate. Hold 32 animations max
alienAnimData.cannedTraverseAnims[ "alien_jump_up_90_rail_32" ] = registerTraverseData( "traverse_group_3", [ 0 ], false, false );
alienAnimData.cannedTraverseAnims[ "alien_jump_fence_high_to_low" ] = registerTraverseData( "traverse_group_3", [ 1 ], false,false );
alienAnimData.cannedTraverseAnims[ "alien_jump_fence_low_to_high" ] = registerTraverseData( "traverse_group_3", [ 2 ], false, true );
alienAnimData.cannedTraverseAnims[ "alien_jump_down_straight_forward_56" ] = registerTraverseData( "traverse_group_3", [ 3 ], false, true );
alienAnimData.cannedTraverseAnims[ "alien_jump_down_straight_360_dlc" ] = registerTraverseData( "traverse_group_3", [ 4 ], false, true );
alienAnimData.cannedTraverseAnims[ "alien_rail_32_jump_down_idle_dlc" ] = registerTraverseData( "traverse_group_3", [ 5 ], false, true );
alienAnimData.cannedTraverseAnims[ "alien_rail_36_jump_down_idle_dlc" ] = registerTraverseData( "traverse_group_3", [ 6 ], false, true );
alienAnimData.cannedTraverseAnims[ "alien_rail_48_jump_down_idle_dlc" ] = registerTraverseData( "traverse_group_3", [ 7 ], false, true );
// Special traversals
alienAnimData.cannedTraverseAnims[ "alien_climb_up" ] = registerTraverseData( "traverse_climb_up" );
alienAnimData.cannedTraverseAnims[ "alien_climb_down" ] = registerTraverseData( "traverse_climb_down" );
alienAnimData.cannedTraverseAnims[ "alien_climb_up_over_56" ] = registerTraverseData( "traverse_climb_up_over_56" );
alienAnimData.cannedTraverseAnims[ "alien_climb_over_56_down" ] = registerTraverseData( "traverse_climb_over_56_down" );
alienAnimData.cannedTraverseAnims[ "climb_up_end_jump_side_l" ] = registerTraverseData( "climb_up_end_jump_side_l" );
alienAnimData.cannedTraverseAnims[ "climb_up_end_jump_side_r" ] = registerTraverseData( "climb_up_end_jump_side_r" );
alienAnimData.cannedTraverseAnims[ "alien_climb_up_ledge_18_run" ] = registerTraverseData( "traverse_climb_up_ledge_18_run" );
alienAnimData.cannedTraverseAnims[ "alien_climb_up_ledge_18_idle" ] = registerTraverseData( "traverse_climb_up_ledge_18_idle" );
alienAnimData.cannedTraverseAnims[ "alien_wall_run" ] = registerTraverseData( "run" );
}
initAlienJumpTraverses( alienAnimData )
{
level.alienAnimData.jumpGravity = 20.0 / 0.02205; // cScrAgent_JumpGravity
level.alienAnimData.jumpLaunchGroundDelta = 16.8476;
level.alienAnimData.jumpLaunchInAirAnimLength = 0.111111;
level.alienAnimData.jumpLaunchDirection = [];
level.alienAnimData.jumpLaunchDirection[ "jump_launch_up" ] = [];
level.alienAnimData.jumpLaunchDirection[ "jump_launch_level" ] = [];
level.alienAnimData.jumpLaunchDirection[ "jump_launch_down" ] = [];
level.alienAnimData.jumpLaunchDirection[ "jump_launch_up" ][0] = (0.338726, 0, 0.940885);
level.alienAnimData.jumpLaunchDirection[ "jump_launch_up" ][1] = (0.688542, 0, 0.725196);
level.alienAnimData.jumpLaunchDirection[ "jump_launch_up" ][2] = (0.906517, 0, 0.422169);
level.alienAnimData.jumpLaunchDirection[ "jump_launch_level" ][0] = (0.248516, 0, 0.968628);
level.alienAnimData.jumpLaunchDirection[ "jump_launch_level" ][1] = (0.579155, 0, 0.815218);
level.alienAnimData.jumpLaunchDirection[ "jump_launch_level" ][2] = (0.906514, 0, 0.422177);
level.alienAnimData.jumpLaunchDirection[ "jump_launch_down" ][0] = (0.333125, 0, 0.942883);
level.alienAnimData.jumpLaunchDirection[ "jump_launch_down" ][1] = (0.518112, 0, 0.855313);
level.alienAnimData.jumpLaunchDirection[ "jump_launch_down" ][2] = (0.892489, 0, 0.451068);
level.alienAnimData.inAirAnimEntry = [];
level.alienAnimData.inAirAnimEntry[ "jump_launch_up" ] = [];
level.alienAnimData.inAirAnimEntry[ "jump_launch_level" ] = [];
level.alienAnimData.inAirAnimEntry[ "jump_launch_down" ] = [];
level.alienAnimData.inAirAnimEntry[ "jump_launch_up" ][ "jump_land_up" ] = 0;
level.alienAnimData.inAirAnimEntry[ "jump_launch_up" ][ "jump_land_level" ] = 1;
level.alienAnimData.inAirAnimEntry[ "jump_launch_up" ][ "jump_land_down" ] = 2;
level.alienAnimData.inAirAnimEntry[ "jump_launch_level" ][ "jump_land_up" ] = 3;
level.alienAnimData.inAirAnimEntry[ "jump_launch_level" ][ "jump_land_level" ] = 4;
level.alienAnimData.inAirAnimEntry[ "jump_launch_level" ][ "jump_land_down" ] = 5;
level.alienAnimData.inAirAnimEntry[ "jump_launch_down" ][ "jump_land_up" ] = 6;
level.alienAnimData.inAirAnimEntry[ "jump_launch_down" ][ "jump_land_level" ] = 7;
level.alienAnimData.inAirAnimEntry[ "jump_launch_down" ][ "jump_land_down" ] = 8;
level.alienAnimData.inAirAnimEntry[ "jump_launch_up" ][ "jump_land_sidewall_high" ] = 9;
level.alienAnimData.inAirAnimEntry[ "jump_launch_level" ][ "jump_land_sidewall_high" ] = 9;
level.alienAnimData.inAirAnimEntry[ "jump_launch_down" ][ "jump_land_sidewall_high" ] = 9;
level.alienAnimData.inAirAnimEntry[ "jump_launch_up" ][ "jump_land_sidewall_low" ] = 9;
level.alienAnimData.inAirAnimEntry[ "jump_launch_level" ][ "jump_land_sidewall_low" ] = 9;
level.alienAnimData.inAirAnimEntry[ "jump_launch_down" ][ "jump_land_sidewall_low" ] = 9;
}
initAlienPain( alienAnimData )
{
alienAnimData.painAnims = [];
//Idle, anim states are: idle_pain_light, idle_pain_heavy
idlePainAnims = [];
idlePainAnims [ "front" ][ "head" ] = [ 0 ];
idlePainAnims [ "front" ][ "up_chest" ] = [ 1 ];
idlePainAnims [ "front" ][ "low_chest" ] = [ 1 ];
idlePainAnims [ "front" ][ "up_body_L" ] = [ 1 ];
idlePainAnims [ "front" ][ "up_body_R" ] = [ 2 ];
idlePainAnims [ "front" ][ "low_body_L" ] = [ 2 ];
idlePainAnims [ "front" ][ "low_body_R" ] = [ 2 ];
idlePainAnims [ "front" ][ "armor" ] = [ 0 ];
idlePainAnims [ "front" ][ "soft" ] = [ 0 ];
idlePainAnims [ "right" ][ "head" ] = [ 0 ];
idlePainAnims [ "right" ][ "up_chest" ] = [ 3 ];
idlePainAnims [ "right" ][ "low_chest" ] = [ 3 ];
idlePainAnims [ "right" ][ "up_body_L" ] = [ 3 ];
idlePainAnims [ "right" ][ "up_body_R" ] = [ 2 ];
idlePainAnims [ "right" ][ "low_body_L" ] = [ 4 ];
idlePainAnims [ "right" ][ "low_body_R" ] = [ 4 ];
idlePainAnims [ "right" ][ "armor" ] = [ 0 ];
idlePainAnims [ "right" ][ "soft" ] = [ 0 ];
idlePainAnims [ "left" ][ "head" ] = [ 0 ];
idlePainAnims [ "left" ][ "up_chest" ] = [ 1 ];
idlePainAnims [ "left" ][ "low_chest" ] = [ 1 ];
idlePainAnims [ "left" ][ "up_body_L" ] = [ 5 ];
idlePainAnims [ "left" ][ "up_body_R" ] = [ 5 ];
idlePainAnims [ "left" ][ "low_body_L" ] = [ 6 ];
idlePainAnims [ "left" ][ "low_body_R" ] = [ 6 ];
idlePainAnims [ "left" ][ "armor" ] = [ 2 ];
idlePainAnims [ "left" ][ "soft" ] = [ 2 ];
idlePainAnims [ "back" ][ "head" ] = [ 0 ];
idlePainAnims [ "back" ][ "up_chest" ] = [ 1 ];
idlePainAnims [ "back" ][ "low_chest" ] = [ 1 ];
idlePainAnims [ "back" ][ "up_body_L" ] = [ 1 ];
idlePainAnims [ "back" ][ "up_body_R" ] = [ 7 ];
idlePainAnims [ "back" ][ "low_body_L" ] = [ 7 ];
idlePainAnims [ "back" ][ "low_body_R" ] = [ 7 ];
idlePainAnims [ "back" ][ "armor" ] = [ 0 ];
idlePainAnims [ "back" ][ "soft" ] = [ 0 ];
alienAnimData.painAnims[ "idle" ] = idlePainAnims;
//Run, anim states are: run_stumble_light, run_stumble_heavy
/*
0 alien_drone_run_pain_upbody_f_light
1 alien_drone_run_pain_upbody_f_medium
2 alien_drone_run_pain_upbody_v2_f_medium
3 alien_drone_run_pain_Lshoulder_f_heavy
4 alien_drone_run_pain_Rshoulder_f_heavy
5 alien_drone_run_pain_Lupbody_l_light
6 alien_drone_run_pain_Llowbody_l_light
7 alien_drone_run_pain_Rupbody_r_light
8 alien_drone_run_pain_Lupbody_f_light
9 alien_drone_run_pain_Rupbody_f_light
10 alien_drone_run_pain_lowbody_f_light
11 alien_drone_run_pain_Rlowbody_r_light
12 alien_drone_run_pain_upbody_b_light
13 alien_drone_run_pain_lowbody_b_light
*/
runPainAnims = [];
runPainAnims [ "front" ][ "head" ] = [ 0 ];
runPainAnims [ "front" ][ "up_chest" ] = [ 9 ];
runPainAnims [ "front" ][ "low_chest" ] = [ 8 ];
runPainAnims [ "front" ][ "up_body_L" ] = [ 8 ];
runPainAnims [ "front" ][ "up_body_R" ] = [ 9 ];
runPainAnims [ "front" ][ "low_body_L" ] = [ 10 ];
runPainAnims [ "front" ][ "low_body_R" ] = [ 10 ];
runPainAnims [ "front" ][ "armor" ] = [ 0 ];
runPainAnims [ "front" ][ "soft" ] = [ 0 ];
runPainAnims [ "right" ][ "head" ] = [ 7 ];
runPainAnims [ "right" ][ "up_chest" ] = [ 7 ];
runPainAnims [ "right" ][ "low_chest" ] = [ 11 ];
runPainAnims [ "right" ][ "up_body_L" ] = [ 7 ];
runPainAnims [ "right" ][ "up_body_R" ] = [ 7 ];
runPainAnims [ "right" ][ "low_body_L" ] = [ 11 ];
runPainAnims [ "right" ][ "low_body_R" ] = [ 11 ];
runPainAnims [ "right" ][ "armor" ] = [ 0 ];
runPainAnims [ "right" ][ "soft" ] = [ 0 ];
runPainAnims [ "left" ][ "head" ] = [ 5 ];
runPainAnims [ "left" ][ "up_chest" ] = [ 5 ];
runPainAnims [ "left" ][ "low_chest" ] = [ 6 ];
runPainAnims [ "left" ][ "up_body_L" ] = [ 5 ];
runPainAnims [ "left" ][ "up_body_R" ] = [ 5 ];
runPainAnims [ "left" ][ "low_body_L" ] = [ 6 ];
runPainAnims [ "left" ][ "low_body_R" ] = [ 6 ];
runPainAnims [ "left" ][ "armor" ] = [ 0 ];
runPainAnims [ "left" ][ "soft" ] = [ 0 ];
runPainAnims [ "back" ][ "head" ] = [ 12 ];
runPainAnims [ "back" ][ "up_chest" ] = [ 12 ];
runPainAnims [ "back" ][ "low_chest" ] = [ 13 ];
runPainAnims [ "back" ][ "up_body_L" ] = [ 12 ];
runPainAnims [ "back" ][ "up_body_R" ] = [ 12 ];
runPainAnims [ "back" ][ "low_body_L" ] = [ 13 ];
runPainAnims [ "back" ][ "low_body_R" ] = [ 13 ];
runPainAnims [ "back" ][ "armor" ] = [ 0 ];
runPainAnims [ "back" ][ "soft" ] = [ 0 ];
alienAnimData.painAnims[ "run" ] = runPainAnims;
//Jump, anim states are: jump_pain_light, jump_pain_heavy
jumpPainAnims = [];
jumpPainAnims [ "front" ][ "head" ] = [ 0 ];
jumpPainAnims [ "front" ][ "up_chest" ] = [ 1 ];
jumpPainAnims [ "front" ][ "low_chest" ] = [ 1 ];
jumpPainAnims [ "front" ][ "up_body_L" ] = [ 2 ];
jumpPainAnims [ "front" ][ "up_body_R" ] = [ 3 ];
jumpPainAnims [ "front" ][ "low_body_L" ] = [ 4 ];
jumpPainAnims [ "front" ][ "low_body_R" ] = [ 4 ];
jumpPainAnims [ "front" ][ "armor" ] = [ 0 ];
jumpPainAnims [ "front" ][ "soft" ] = [ 0 ];
jumpPainAnims [ "right" ][ "head" ] = [ 7 ];
jumpPainAnims [ "right" ][ "up_chest" ] = [ 7 ];
jumpPainAnims [ "right" ][ "low_chest" ] = [ 8 ];
jumpPainAnims [ "right" ][ "up_body_L" ] = [ 7 ];
jumpPainAnims [ "right" ][ "up_body_R" ] = [ 7 ];
jumpPainAnims [ "right" ][ "low_body_L" ] = [ 8 ];
jumpPainAnims [ "right" ][ "low_body_R" ] = [ 8 ];
jumpPainAnims [ "right" ][ "armor" ] = [ 0 ];
jumpPainAnims [ "right" ][ "soft" ] = [ 0 ];
jumpPainAnims [ "left" ][ "head" ] = [ 5 ];
jumpPainAnims [ "left" ][ "up_chest" ] = [ 5 ];
jumpPainAnims [ "left" ][ "low_chest" ] = [ 6 ];
jumpPainAnims [ "left" ][ "up_body_L" ] = [ 5 ];
jumpPainAnims [ "left" ][ "up_body_R" ] = [ 5 ];
jumpPainAnims [ "left" ][ "low_body_L" ] = [ 6 ];
jumpPainAnims [ "left" ][ "low_body_R" ] = [ 6 ];
jumpPainAnims [ "left" ][ "armor" ] = [ 0 ];
jumpPainAnims [ "left" ][ "soft" ] = [ 0 ];
jumpPainAnims [ "back" ][ "head" ] = [ 9 ];
jumpPainAnims [ "back" ][ "up_chest" ] = [ 9 ];
jumpPainAnims [ "back" ][ "low_chest" ] = [ 10 ];
jumpPainAnims [ "back" ][ "up_body_L" ] = [ 9 ];
jumpPainAnims [ "back" ][ "up_body_R" ] = [ 9 ];
jumpPainAnims [ "back" ][ "low_body_L" ] = [ 10 ];
jumpPainAnims [ "back" ][ "low_body_R" ] = [ 10 ];
jumpPainAnims [ "back" ][ "armor" ] = [ 0 ];
jumpPainAnims [ "back" ][ "soft" ] = [ 0 ];
alienAnimData.painAnims[ "jump" ] = jumpPainAnims;
//Push back, anim state is: pain_pushback
pushbackPainAnims = [];
pushbackPainAnims [ "front" ] = [ 0, 1 ];
pushbackPainAnims [ "right" ] = [ 2 ];
pushbackPainAnims [ "left" ] = [ 3 ];
pushbackPainAnims [ "back" ] = [ 4 ];
alienAnimData.painAnims[ "push_back" ] = pushbackPainAnims;
//Move back, anim state are: move_back_pain_light, move_back_pain_heavy
movebackPainAnims = [];
movebackPainAnims [ "front" ] = [ 0 ];
movebackPainAnims [ "right" ] = [ 0 ];
movebackPainAnims [ "left" ] = [ 0 ];
movebackPainAnims [ "back" ] = [ 0 ];
alienAnimData.painAnims[ "move_back" ] = movebackPainAnims;
//Melee, anim state are: melee_pain_light, melee_pain_heavy
meleePainAnims = [];
meleePainAnims [ "front" ] = [ 0, 1, 2 ];
meleePainAnims [ "right" ] = [ 0, 1, 2 ];
meleePainAnims [ "left" ] = [ 0, 1, 2 ];
meleePainAnims [ "back" ] = [ 0, 1, 2 ];
alienAnimData.painAnims[ "melee" ] = meleePainAnims;
combinedHitLoc = [];
combinedHitLoc [ "head" ] = "head";
combinedHitLoc [ "neck" ] = "head";
combinedHitLoc [ "torso_upper" ] = "up_chest";
combinedHitLoc [ "none" ] = "up_chest";
combinedHitLoc [ "torso_lower" ] = "low_chest";
combinedHitLoc [ "left_arm_upper" ] = "up_body_L";
combinedHitLoc [ "left_arm_lower" ] = "up_body_L";
combinedHitLoc [ "left_hand" ] = "up_body_L";
combinedHitLoc [ "right_arm_upper" ] = "up_body_R";
combinedHitLoc [ "right_arm_lower" ] = "up_body_R";
combinedHitLoc [ "right_hand" ] = "up_body_R";
combinedHitLoc [ "left_leg_upper" ] = "low_body_L";
combinedHitLoc [ "left_leg_lower" ] = "low_body_L";
combinedHitLoc [ "left_foot" ] = "low_body_L";
combinedHitLoc [ "right_leg_upper" ] = "low_body_R";
combinedHitLoc [ "right_leg_lower" ] = "low_body_R";
combinedHitLoc [ "right_foot" ] = "low_body_R";
combinedHitLoc [ "armor" ] = "armor";
combinedHitLoc [ "soft" ] = "soft";
alienAnimData.painAnims[ "hitLoc" ] = combinedHitLoc;
hitDirection = [];
hitDirection[ 0 ] = "back";
hitDirection[ 1 ] = "back";
hitDirection[ 2 ] = "right";
hitDirection[ 3 ] = "right";
hitDirection[ 4 ] = "front";
hitDirection[ 5 ] = "left";
hitDirection[ 6 ] = "left";
hitDirection[ 7 ] = "back";
hitDirection[ 8 ] = "back";
alienAnimData.painAnims[ "hitDirection" ] = hitDirection;
jumpPainIdleToImpactMap = [];
// *idle index *Impact index
jumpPainIdleToImpactMap[ 0 ] = [ 0 ];
jumpPainIdleToImpactMap[ 1 ] = [ 1 ];
jumpPainIdleToImpactMap[ 2 ] = [ 2 ];
jumpPainIdleToImpactMap[ 3 ] = [ 3 ];
jumpPainIdleToImpactMap[ 4 ] = [ 4 ];
jumpPainIdleToImpactMap[ 5 ] = [ 5 ];
jumpPainIdleToImpactMap[ 6 ] = [ 6 ];
jumpPainIdleToImpactMap[ 7 ] = [ 7 ];
jumpPainIdleToImpactMap[ 8 ] = [ 8 ];
jumpPainIdleToImpactMap[ 9 ] = [ 9 ];
jumpPainIdleToImpactMap[ 10 ] = [ 10 ];
alienAnimData.painAnims[ "idleToImpactMap" ] = jumpPainIdleToImpactMap;
}
initAlienDeath( alienAnimData )
{
alienAnimData.deathAnims = [];
//Idle, anim states are: idle_death_light, idle_death_heavy
idleDeathAnims = [];
idleDeathAnims [ "front" ][ "head" ] = [ 0 ];
idleDeathAnims [ "front" ][ "up_chest" ] = [ 1 ];
idleDeathAnims [ "front" ][ "low_chest" ] = [ 1 ];
idleDeathAnims [ "front" ][ "up_body_L" ] = [ 1 ];
idleDeathAnims [ "front" ][ "up_body_R" ] = [ 2 ];
idleDeathAnims [ "front" ][ "low_body_L" ] = [ 2 ];
idleDeathAnims [ "front" ][ "low_body_R" ] = [ 2 ];
idleDeathAnims [ "front" ][ "armor" ] = [ 0 ];
idleDeathAnims [ "front" ][ "soft" ] = [ 0 ];
idleDeathAnims [ "right" ][ "head" ] = [ 0 ];
idleDeathAnims [ "right" ][ "up_chest" ] = [ 4 ];
idleDeathAnims [ "right" ][ "low_chest" ] = [ 3 ];
idleDeathAnims [ "right" ][ "up_body_L" ] = [ 4 ];
idleDeathAnims [ "right" ][ "up_body_R" ] = [ 4 ];
idleDeathAnims [ "right" ][ "low_body_L" ] = [ 2 ];
idleDeathAnims [ "right" ][ "low_body_R" ] = [ 2 ];
idleDeathAnims [ "right" ][ "armor" ] = [ 0 ];
idleDeathAnims [ "right" ][ "soft" ] = [ 0 ];
idleDeathAnims [ "left" ][ "head" ] = [ 0 ];
idleDeathAnims [ "left" ][ "up_chest" ] = [ 1 ];
idleDeathAnims [ "left" ][ "low_chest" ] = [ 1 ];
idleDeathAnims [ "left" ][ "up_body_L" ] = [ 1 ];
idleDeathAnims [ "left" ][ "up_body_R" ] = [ 2 ];
idleDeathAnims [ "left" ][ "low_body_L" ] = [ 5 ];
idleDeathAnims [ "left" ][ "low_body_R" ] = [ 5 ];
idleDeathAnims [ "left" ][ "armor" ] = [ 0 ];
idleDeathAnims [ "left" ][ "soft" ] = [ 0 ];
idleDeathAnims [ "back" ][ "head" ] = [ 0 ];
idleDeathAnims [ "back" ][ "up_chest" ] = [ 1 ];
idleDeathAnims [ "back" ][ "low_chest" ] = [ 1 ];
idleDeathAnims [ "back" ][ "up_body_L" ] = [ 1 ];
idleDeathAnims [ "back" ][ "up_body_R" ] = [ 2 ];
idleDeathAnims [ "back" ][ "low_body_L" ] = [ 2 ];
idleDeathAnims [ "back" ][ "low_body_R" ] = [ 2 ];
idleDeathAnims [ "back" ][ "armor" ] = [ 0 ];
idleDeathAnims [ "back" ][ "soft" ] = [ 0 ];
alienAnimData.deathAnims[ "idle" ] = idleDeathAnims;
//Run, anim states are: run_death_light, run_death_heavy
runDeathAnims = [];
runDeathAnims [ "front" ][ "head" ] = [ 0 ];
runDeathAnims [ "front" ][ "up_chest" ] = [ 1 ];
runDeathAnims [ "front" ][ "low_chest" ] = [ 3 ];
runDeathAnims [ "front" ][ "up_body_L" ] = [ 4 ];
runDeathAnims [ "front" ][ "up_body_R" ] = [ 9 ];
runDeathAnims [ "front" ][ "low_body_L" ] = [ 4 ];
runDeathAnims [ "front" ][ "low_body_R" ] = [ 3 ];
runDeathAnims [ "front" ][ "armor" ] = [ 0 ];
runDeathAnims [ "front" ][ "soft" ] = [ 0 ];
runDeathAnims [ "right" ][ "head" ] = [ 2 ];
runDeathAnims [ "right" ][ "up_chest" ] = [ 1 ];
runDeathAnims [ "right" ][ "low_chest" ] = [ 0 ];
runDeathAnims [ "right" ][ "up_body_L" ] = [ 7 ];
runDeathAnims [ "right" ][ "up_body_R" ] = [ 7 ];
runDeathAnims [ "right" ][ "low_body_L" ] = [ 3 ];
runDeathAnims [ "right" ][ "low_body_R" ] = [ 4 ];
runDeathAnims [ "right" ][ "armor" ] = [ 0 ];
runDeathAnims [ "right" ][ "soft" ] = [ 0 ];
runDeathAnims [ "left" ][ "head" ] = [ 5 ];
runDeathAnims [ "left" ][ "up_chest" ] = [ 5 ];
runDeathAnims [ "left" ][ "low_chest" ] = [ 6 ];
runDeathAnims [ "left" ][ "up_body_L" ] = [ 5 ];
runDeathAnims [ "left" ][ "up_body_R" ] = [ 5 ];
runDeathAnims [ "left" ][ "low_body_L" ] = [ 8 ];
runDeathAnims [ "left" ][ "low_body_R" ] = [ 6 ];
runDeathAnims [ "left" ][ "armor" ] = [ 0 ];
runDeathAnims [ "left" ][ "soft" ] = [ 0 ];
runDeathAnims [ "back" ][ "head" ] = [ 1 ];
runDeathAnims [ "back" ][ "up_chest" ] = [ 5 ];
runDeathAnims [ "back" ][ "low_chest" ] = [ 4 ];
runDeathAnims [ "back" ][ "up_body_L" ] = [ 3 ];
runDeathAnims [ "back" ][ "up_body_R" ] = [ 2 ];
runDeathAnims [ "back" ][ "low_body_L" ] = [ 1 ];
runDeathAnims [ "back" ][ "low_body_R" ] = [ 4 ];
runDeathAnims [ "back" ][ "armor" ] = [ 0 ];
runDeathAnims [ "back" ][ "soft" ] = [ 0 ];
alienAnimData.deathAnims[ "run" ] = runDeathAnims;
//Jump, anim states are: jump_death_light, jump_death_heavy
jumpDeathAnims = [];
jumpDeathAnims [ "front" ][ "head" ] = [ 1 ];
jumpDeathAnims [ "front" ][ "up_chest" ] = [ 0 ];
jumpDeathAnims [ "front" ][ "low_chest" ] = [ 0 ];
jumpDeathAnims [ "front" ][ "up_body_L" ] = [ 2 ];
jumpDeathAnims [ "front" ][ "up_body_R" ] = [ 3 ];
jumpDeathAnims [ "front" ][ "low_body_L" ] = [ 4 ];
jumpDeathAnims [ "front" ][ "low_body_R" ] = [ 4 ];
jumpDeathAnims [ "front" ][ "armor" ] = [ 1 ];
jumpDeathAnims [ "front" ][ "soft" ] = [ 1 ];
jumpDeathAnims [ "right" ][ "head" ] = [ 7 ];
jumpDeathAnims [ "right" ][ "up_chest" ] = [ 7 ];
jumpDeathAnims [ "right" ][ "low_chest" ] = [ 8 ];
jumpDeathAnims [ "right" ][ "up_body_L" ] = [ 7 ];
jumpDeathAnims [ "right" ][ "up_body_R" ] = [ 7 ];
jumpDeathAnims [ "right" ][ "low_body_L" ] = [ 8 ];
jumpDeathAnims [ "right" ][ "low_body_R" ] = [ 8 ];
jumpDeathAnims [ "right" ][ "armor" ] = [ 1 ];
jumpDeathAnims [ "right" ][ "soft" ] = [ 1 ];
jumpDeathAnims [ "left" ][ "head" ] = [ 5 ];
jumpDeathAnims [ "left" ][ "up_chest" ] = [ 5 ];
jumpDeathAnims [ "left" ][ "low_chest" ] = [ 6 ];
jumpDeathAnims [ "left" ][ "up_body_L" ] = [ 5 ];
jumpDeathAnims [ "left" ][ "up_body_R" ] = [ 5 ];
jumpDeathAnims [ "left" ][ "low_body_L" ] = [ 6 ];
jumpDeathAnims [ "left" ][ "low_body_R" ] = [ 6 ];
jumpDeathAnims [ "left" ][ "armor" ] = [ 1 ];
jumpDeathAnims [ "left" ][ "soft" ] = [ 1 ];
jumpDeathAnims [ "back" ][ "head" ] = [ 9 ];
jumpDeathAnims [ "back" ][ "up_chest" ] = [ 9 ];
jumpDeathAnims [ "back" ][ "low_chest" ] = [ 10 ];
jumpDeathAnims [ "back" ][ "up_body_L" ] = [ 9 ];
jumpDeathAnims [ "back" ][ "up_body_R" ] = [ 9 ];
jumpDeathAnims [ "back" ][ "low_body_L" ] = [ 10 ];
jumpDeathAnims [ "back" ][ "low_body_R" ] = [ 10 ];
jumpDeathAnims [ "back" ][ "armor" ] = [ 1 ];
jumpDeathAnims [ "back" ][ "soft" ] = [ 1 ];
alienAnimData.deathAnims[ "jump" ] = jumpDeathAnims;
combinedHitLoc = [];
combinedHitLoc [ "head" ] = "head";
combinedHitLoc [ "neck" ] = "head";
combinedHitLoc [ "torso_upper" ] = "up_chest";
combinedHitLoc [ "none" ] = "up_chest";
combinedHitLoc [ "torso_lower" ] = "low_chest";
combinedHitLoc [ "left_arm_upper" ] = "up_body_L";
combinedHitLoc [ "left_arm_lower" ] = "up_body_L";
combinedHitLoc [ "left_hand" ] = "up_body_L";
combinedHitLoc [ "right_arm_upper" ] = "up_body_R";
combinedHitLoc [ "right_arm_lower" ] = "up_body_R";
combinedHitLoc [ "right_hand" ] = "up_body_R";
combinedHitLoc [ "left_leg_upper" ] = "low_body_L";
combinedHitLoc [ "left_leg_lower" ] = "low_body_L";
combinedHitLoc [ "left_foot" ] = "low_body_L";
combinedHitLoc [ "right_leg_upper" ] = "low_body_R";
combinedHitLoc [ "right_leg_lower" ] = "low_body_R";
combinedHitLoc [ "right_foot" ] = "low_body_R";
combinedHitLoc [ "armor" ] = "armor";
combinedHitLoc [ "soft" ] = "soft";
alienAnimData.deathAnims[ "hitLoc" ] = combinedHitLoc;
hitDirection = [];
hitDirection[ 0 ] = "back";
hitDirection[ 1 ] = "back";
hitDirection[ 2 ] = "right";
hitDirection[ 3 ] = "right";
hitDirection[ 4 ] = "front";
hitDirection[ 5 ] = "left";
hitDirection[ 6 ] = "left";
hitDirection[ 7 ] = "back";
hitDirection[ 8 ] = "back";
alienAnimData.deathAnims[ "hitDirection" ] = hitDirection;
//Special death
specialDeathAnims = [];
specialDeathAnims [ "electric_shock_death" ] = [ 0 ];
specialDeathAnims [ "traverse" ] = [ 1 ];
alienAnimData.deathAnims[ "special" ] = specialDeathAnims;
}
initMoveBackAnims()
{
level.alienAnimData.alienMoveBackAnimChance[ 0 ] = 40;
level.alienAnimData.alienMoveBackAnimChance[ 1 ] = 40;
level.alienAnimData.alienMoveBackAnimChance[ 2 ] = 20;
}
registerTraverseData( animState, animIndexArray, endInOriented, flexHeightEndAtTraverseEnd, traverseSound, traverseAnimScale )
{
assertEx( isDefined( animState));
traverseData = [];
traverseData [ "animState" ] = animState;
if ( isDefined ( animIndexArray ) )
traverseData [ "animIndexArray" ] = animIndexArray;
if ( isDefined ( endInOriented ) )
traverseData [ "endInOriented" ] = endInOriented;
if ( isDefined ( flexHeightEndAtTraverseEnd ) )
traverseData [ "flexHeightEndAtTraverseEnd" ] = flexHeightEndAtTraverseEnd;
if ( isDefined ( traverseSound ) )
traverseData [ "traverseSound" ] = traverseSound;
if ( isDefined ( traverseAnimScale ) )
traverseData [ "traverseAnimScale" ] = traverseAnimScale;
return traverseData;
}
turnTowardsEntity( entity )
{
targetVector = entity.origin - self.origin;
return turnTowardsVector( targetVector );
}
turnTowardsVector( targetVector )
{
turnIndex = getTurnInPlaceIndex( AnglesToForward( self.angles ), targetVector, AnglesToUp( self.angles ) );
self ScrAgentSetOrientMode( "face angle abs", self.angles );
if ( turnIndex != 4 )
{
self.stateLocked = true;
if( self.oriented )
self ScrAgentSetAnimMode( "anim angle delta" );
else
self ScrAgentSetAnimMode( "anim deltas" );
animState = getTurnInPlaceAnimState();
self PlayAnimNUntilNotetrack( animState, turnIndex, "turn_in_place", "code_move" );
if ( !self maps\mp\alien\_utility::is_idle_state_locked() )
self.stateLocked = false;
return true;
}
return false;
}
getTurnInPlaceAnimState()
{
if ( IsDefined( level.dlc_alien_turn_in_place_anim_state_override_func ) )
{
animState = [[level.dlc_alien_turn_in_place_anim_state_override_func]]();
if ( IsDefined( animState ) )
return animState;
}
return "turn_in_place";
}
getTurnInPlaceIndex ( inVector, outVector, surfaceNormal )
{
turnAnim = undefined;
index = undefined;
projData = getProjectionData( inVector, outVector, surfaceNormal );
rotatedYaw = projData.rotatedYaw;
projInToOutRight = projData.projInToOutRight;
// favor underturning, unless you're within <threshold> degrees of the next one up.
threshold = 10;
if ( projInToOutRight > 0 ) //Entering from the right
{
index = int( ceil( ( 180 - rotatedYaw - threshold ) / 45 ) );
}
else //Entering from the left
{
index = int( floor( ( 180 + rotatedYaw + threshold ) / 45 ) );
}
index = int( clamp( index, 0, 8 )); //the threshold in getTurnInPlaceIndex might cause the index to be out of range
return index;
}
getProjectionData( inVector, outVector, surfaceNormal )
{
projectionData = SpawnStruct();
inVectorNoNormal = vectorNormalize( projectVectorToPlane( inVector, surfaceNormal));
outVectorNoNormal = vectorNormalize( projectVectorToPlane( outVector, surfaceNormal ));
outVectorRight = VectorCross ( outVectorNoNormal, surfaceNormal );
outVectorRightNoNormal = VectorNormalize ( projectVectorToPlane( outVectorRight, surfaceNormal ) );
projInToOutRight = VectorDot ( inVectorNoNormal * -1, outVectorRightNoNormal );
ratio = vectorDot( outVectorNoNormal, inVectorNoNormal );
// Need to make sure the value is within the domain of Acos
ratio = clamp( ratio, -1, 1 );
rotatedYaw = Acos ( ratio );
projectionData.rotatedYaw = rotatedYaw;
projectionData.projInToOutRight = projInToOutRight;
return projectionData;
}
projectVectorToPlane( vector, planeUp )
{
dotResult = VectorDot( vector, planeUp );
projVector = vector - ( planeUp * dotResult );
return projVector;
}
pain_getCombinedHitLoc( hitLoc )
{
return ( level.alienAnimData.painAnims[ "hitLoc" ][ hitLoc ] );
}
pain_getIncomingDirection( direction )
{
directionIndex = maps\mp\agents\_scriptedagents::GetAngleIndexFromSelfYaw( direction );
return ( level.alienAnimData.painAnims[ "hitDirection" ][ directionIndex ] );
}
death_getCombinedHitLoc( hitLoc )
{
return ( level.alienAnimData.deathAnims[ "hitLoc" ][ hitLoc ] );
}
death_getIncomingDirection( direction )
{
directionIndex = maps\mp\agents\_scriptedagents::GetAngleIndexFromSelfYaw( direction );
return ( level.alienAnimData.deathAnims[ "hitDirection" ][ directionIndex ] );
}
getPainAnimState( state, iDamage, is_stun )
{
secondaryState = getDamageDegree( iDamage, is_stun );
return ( state + "_" + secondaryState );
}
getDamageDegree( iDamage, is_stun )
{
alienType = self maps\mp\alien\_utility::get_alien_type();
damageThreshold = level.alien_types[ alienType ].attributes[ "heavy_damage_threshold" ];
if ( iDamage < damageThreshold && !is_stun )
return "light";
else
return "heavy";
}
getPainAnimIndex( state, damageDirection, hitLoc )
{
damageDirection = pain_getIncomingDirection( damageDirection * -1 );
if ( isDefined ( hitLoc ) )
hitLoc = pain_getCombinedHitLoc( hitLoc );
return getPainDeathAnimIndex_Internal( state, damageDirection, hitLoc, level.alienAnimData.painAnims );
}
GetImpactPainAnimIndex( jump_pain_index )
{
available_impact = level.alienAnimData.painAnims[ "idleToImpactMap" ][ jump_pain_index ];
random_impact_index = randomIntRange( 0, available_impact.size );
return available_impact [ random_impact_index ];
}
getDeathAnimState( state, iDamage )
{
secondaryState = getDamageDegree( iDamage, false );
return ( state + "_" + secondaryState );
}
getDeathAnimIndex( state, damageDirection, hitLoc )
{
damageDirection = death_getIncomingDirection( damageDirection * -1 );
hitLoc = death_getCombinedHitLoc( hitLoc );
return getPainDeathAnimIndex_Internal( state, damageDirection, hitLoc, level.alienAnimData.deathAnims );
}
getPainDeathAnimIndex_Internal( state, damageDirection, hitLoc, animArray )
{
if ( isDefined ( hitLoc ) )
availableIndexList = animArray[ state ][ damageDirection ][ hitLoc ];
else
availableIndexList = animArray[ state ][ damageDirection ];
return ( availableIndexList[ randomInt ( availableIndexList.size ) ] );
}
getSpecialDeathAnimIndex( state )
{
availableIndexList = level.alienAnimData.deathAnims[ "special" ][ state ];
return ( availableIndexList[ randomInt ( availableIndexList.size ) ] );
}
resetScriptable( scriptableName, endPos )
{
scriptable_obj = GetEnt( scriptableName, "targetname" );
AssertEx( isDefined( scriptable_obj ), "Unable to find a scriptable object with targetname: " + scriptableName + " at location " + endPos );
scriptable_obj SetScriptablePartState( 0, 0 );
}
playAnimOnScriptable( scriptableName, endPos, scriptableState )
{
scriptable_obj = GetEnt( scriptableName, "targetname" );
AssertEx( isDefined( scriptable_obj ), "Unable to find a scriptable object with targetname: " + scriptableName + " at location " + endPos );
if ( !isDefined( scriptableState ) )
scriptableState = 1;
scriptable_obj SetScriptablePartState( 0, scriptableState );
level notify( "scriptable",scriptableName );
}
getLerpTime( startAnim )
{
startAnimLength = GetAnimLength( startAnim );
return min( 0.2, startAnimLength );
}
getPosInSpaceAtAnimTime( anime, start_pos, start_angles, time )
{
animLength = GetAnimLength( anime );
animDelta = GetMoveDelta( anime, 0, time / animLength );
offsetFromStart = RotateVector( animDelta, start_angles );
return ( start_pos + offsetFromStart );
}
doLerp( lerp_target_pos, lerp_time )
{
self endon( "death" );
level endon( "game_ended" );
self ScrAgentDoAnimLerp( self.origin, lerp_target_pos, lerp_time );
wait lerp_time;
self ScrAgentSetAnimMode( "anim deltas" );
}