#include maps\mp\agents\_scriptedAgents; //======================================================= // initAlienAnims //======================================================= initAlienAnims() { level.alienAnimData = SpawnStruct(); initAlienCannedTraverses( level.alienAnimData ); initAlienJumpTraverses( level.alienAnimData ); initAlienPain( level.alienAnimData ); initAlienDeath( level.alienAnimData ); initMoveBackAnims(); // 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() { // 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 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" ); }