nx1-gsc-dump/maps/_rappel.gsc

1058 lines
37 KiB
Plaintext

//****************************************************************************
// **
// Confidential - (C) Activision Publishing, Inc. 2010 **
// **
//****************************************************************************
// **
// Module: _rappel **
// **
// Created: 06.22.2011 - Riggs **
// **
//****************************************************************************
#include maps\_utility;
#include maps\_nx_utility;
#include common_scripts\utility;
#include maps\_anim;
#include maps\_vehicle;
//*******************************************************************
// *
// *
//*******************************************************************
main()
{
// Internal Initialization
init_rappel_variables();
// Precaches
PrecacheModel( "nx_us_specops_body_assault_a" );
// Anims
player_animations();
legs_animations();
}
//*******************************************************************
// *
// *
//*******************************************************************
init_rappel_variables()
{
level._TIMESTEP = 0.05;
// Rate for "lerping" the anims, i.e the percentage of weight change per frame.
// Valid Range: 0.05 - 1.0
level._anim_rate_in = 0.4;
level._anim_rate_out = 0.6;
}
//*******************************************************************
// *
// *
//*******************************************************************
#using_animtree( "player" );
player_animations()
{
level._scr_animtree[ "player_rig" ] = #animtree;
level._scr_model[ "player_rig" ] = "viewhands_player_us_army";
level._scr_anim[ "player_rig" ][ "sprint" ] = %nx_fp_ss_rappel_ground;
level._scr_anim[ "player_rig" ][ "sprint_forward" ] = %nx_fp_ss_rappel_sprint;
level._scr_anim[ "player_rig" ][ "sprint_left" ] = %nx_fp_ss_rappel_sprint_L;
level._scr_anim[ "player_rig" ][ "sprint_right" ] = %nx_fp_ss_rappel_sprint_R;
level._scr_anim[ "player_rig" ][ "jump_in" ] = %nx_fp_ss_rappel_jump_in;
level._scr_anim[ "player_rig" ][ "jump_loop" ] = %nx_fp_ss_rappel_jump_loop;
level._scr_anim[ "player_rig" ][ "jump_out" ] = %nx_fp_ss_rappel_jump_out;
level._scr_anim[ "player_rig" ][ "slide_in" ] = %nx_fp_ss_rappel_slide_in;
level._scr_anim[ "player_rig" ][ "slide_loop" ] = %nx_fp_ss_rappel_slide_loop;
level._scr_anim[ "player_rig" ][ "slide_out" ] = %nx_fp_ss_rappel_slide_out;
}
//*******************************************************************
// *
// *
//*******************************************************************
#using_animtree( "player" );
legs_animations()
{
level._scr_animtree[ "legs" ] = #animtree;
level._scr_model[ "legs" ] = "nx_us_specops_body_assault_a";
level._scr_anim[ "legs" ][ "idle" ] = %fp_body_default;
level._scr_anim[ "legs" ][ "slide_in" ] = %nx_tp_ss_rappel_slide_in;
level._scr_anim[ "legs" ][ "slide_loop" ] = %nx_tp_ss_rappel_slide_loop;
level._scr_anim[ "legs" ][ "slide_out" ] = %nx_tp_ss_rappel_slide_out;
}
//*******************************************************************
// *
// *
//*******************************************************************
// Sets up a rappel sequence with named trigger and objects
//rappel_start( rappel_type, rappel_objects_targetname, rappel_object_objective_targetname, tether_pos_and_angles, rope_length, physics_speed )
//{
// rappel_object = undefined; // The script_brushmodel "pole" to rappel on
// objective_ent = undefined; // The glowing script_brushmodel pole (for the objective)
// rappel_trigger = undefined; // The trigger to prompt the player to rappel (trigger_use)
// animent_object = undefined; // The script_origin for the rappel animation
//
// // Grab the objects (except glowing objective pole)
// rappel_objects = GetEntArray( rappel_objects_targetname, "targetname" );
//
// // Parse objects, make sure we have everything we need
// foreach( object in rappel_objects )
// {
// switch( object.classname )
// {
// case "script_origin":
// animent_object = object;
// break;
// case "trigger_use":
// rappel_trigger = object;
// break;
// case "script_brushmodel":
// rappel_object = object;
// break;
// default:
// AssertMsg( "Unneeded obj with classname '" + object.classname + "' with targetname '" + rappel_objects_targetname + "... Please remove from radiant" );
// }
// }
//
// // Glowing objective pole entity (this is separate because there are two script_brushmodels for the regular pole and glowing pole and no way to tell them apart)
// objective_ent = GetEnt( rappel_object_objective_targetname, "targetname" );
//
// // Hide normal object
// AssertEx( isdefined( rappel_object ), "_rappel script_brushmodel for rappel object pole is not defined!" );
// AssertEx( isdefined( rappel_trigger ), "_rappel trigger_use trigger is not defined!" );
// AssertEx( isdefined( animent_object ), "_rappel script_origin for animation entity is not defined!" );
// AssertEx( isdefined( objective_ent ), "_rappel objective entity glowing pole is not defined!" );
//
// // Hide rappel pole, show glowing pole and hint string
// rappel_object Hide();
// rappel_trigger SetHintString( &"NX_SS_RAPPEL_START" );
// objective_ent Show();
//
// // Wait for player to interact
// for ( ;; )
// {
// rappel_trigger waittill( "trigger" );
//
// if ( self isthrowinggrenade())
// {
// continue;
// }
//
// if ( self isswitchingweapon())
// {
// continue;
// }
//
// break;
// }
//
// level._player notify( "notify_rappel_start" );
//
// switch( rappel_type )
// {
// case "rappel_standard":
// level._player rappel_setup( tether_pos_and_angles, rope_length, physics_speed );
// break;
// default:
// Assert( "rappel_start(): Unknown rappel_type '" + rappel_type + "'" );
// }
//}
//*******************************************************************
// *
// *
//*******************************************************************
rappel_setup( tether_pos_and_angles, rope_length, physics_speed )
{
// Dvars.
SetSavedDvar( "compass", 0 );
SetSavedDvar( "ammoCounterHide", 1 );
SetSavedDvar( "actionSlotsHide", 1 );
SetSavedDvar( "hud_showStance", 0 );
SetSavedDvar( "hud_drawhud", 0 );
// Constraints
level._player.disableReload = true;
level._player DisableWeapons();
level._player DisableOffhandWeapons();
level._player DisableWeaponSwitch();
level._player AllowCrouch( false );
level._player AllowJump( false );
//level._player AllowLean( false );
level._player AllowMelee( false );
level._player AllowProne( false );
level._player AllowSprint( false );
tether_pos_and_angles = GetEnt( tether_pos_and_angles, "targetname" );
// tagBR< HACK >
level._tether_pos = tether_pos_and_angles.origin;// + ( 0, 100, 0 );
// tagBR< HACK >
level._player SetOrigin( tether_pos_and_angles.origin + ( 0, -100, -100 ) );
// Player Rig ---
level._player_rig = spawn_anim_model( "player_rig", level._player.origin );
level._player_rig.angles = tether_pos_and_angles.angles;
// Cannot animate & move via script the player rig at the same time, so spawn a tag_origin
level._player_mover = spawn_tag_origin();
level._player_mover.origin = level._player.origin;
level._player_mover.angles = tether_pos_and_angles.angles;
level._player.angles = tether_pos_and_angles.angles;
level._player_rig LinkTo( level._player_mover );
level._player PlayerSetGroundReferenceEnt( level._player_mover );
// This call constrains camera movement as well as linking
level._player PlayerLinkToDelta( level._player_rig, "tag_player", 1, 40, 40, 15, 20, true, true );
//level._player SetRelinkPlayerFlag( 1 );
//thread wait_and_reset_relink_player_flag();
// Legs ---
level._legs = spawn_anim_model( "legs", level._player.origin );
//level._legs hide();
level._legs.angles = level._player.angles;
level._legs LinkTo( level._player_rig, "tag_origin", ( -5, 0, -5 ), ( 0, 0, 0 ) );
//level._legs show();
level._player_rig SetAnimKnob( level._scr_anim[ "player_rig" ][ "sprint" ], 1, 0 );
level._legs SetAnimKnob( level._scr_anim[ "legs" ][ "idle" ], 1, 0 );
level._max_rope_length = rope_length;
level._player_rig._anim_state = "sprint";
level._player_rig._slide = false;
level._player_rig._force_jump = false;
level._player_rig.sprint_weight_curr = 1;
level._player_rig.sprint_weight_target = level._player_rig.sprint_weight_curr;
level._player_rig.jump_in_weight_curr = 0;
level._player_rig.jump_in_weight_target = level._player_rig.jump_in_weight_curr;
level._player_rig.jump_loop_weight_curr = 0;
level._player_rig.jump_loop_weight_target = level._player_rig.jump_loop_weight_curr;
level._player_rig.jump_out_weight_curr = 0;
level._player_rig.jump_out_weight_target = level._player_rig.jump_out_weight_curr;
level._player_rig.slide_in_weight_curr = 0;
level._player_rig.slide_in_weight_target = level._player_rig.slide_in_weight_curr;
level._player_rig.slide_loop_weight_curr = 0;
level._player_rig.slide_loop_weight_target = level._player_rig.slide_loop_weight_curr;
level._player_rig.slide_out_weight_curr = 0;
level._player_rig.slide_out_weight_target = level._player_rig.slide_out_weight_curr;
level._player_rig.lateral_weight_curr = 0;
level._player_rig.lateral_weight_target = level._player_rig.lateral_weight_curr;
level._legs.idle_weight_curr = 0;
level._legs.idle_weight_target = level._legs.idle_weight_curr;
level._legs.slide_in_weight_curr = 0;
level._legs.slide_in_weight_target = level._legs.slide_in_weight_curr;
level._legs.slide_loop_weight_curr = 0;
level._legs.slide_loop_weight_target = level._legs.slide_loop_weight_curr;
level._legs.slide_out_weight_curr = 0;
level._legs.slide_out_weight_target = level._legs.slide_out_weight_curr;
//player_rig.incline_slide_weight_curr = 0;
// TagBR< todo > Need anim, and actually hook up it up, but just notify for now...
level._player notify( "notify_rappel_anim_done" );
thread rappel_anim_state_machine();
// setup slide triggers
triggers = GetEntArray( "rappel_slide", "script_noteworthy" );
array_thread( triggers, ::slide_trigger );
level._physics_speed = physics_speed;
thread rappel_physics();
//thread maps\_nx_rappel::flag_rappel_end_watcher();
}
//*******************************************************************
// *
// *
//*******************************************************************
slide_trigger()
{
self waittill( "trigger", ent );
assert( IsPlayer( ent ) );
level._player_rig._slide = true;
while ( true )
{
wait 0.05;
if ( !ent IsTouching( self ) )
{
break;
}
};
level._player_rig._slide = false;
// each trigger only works once
}
//*******************************************************************
// *
// *
//*******************************************************************
update_tether_pos( position )
{
level._tether_pos = position;
}
//*******************************************************************
// *
// *
//*******************************************************************
update_tether_length( length_scalar )
{
level._max_rope_length = length_scalar;
}
//*******************************************************************
// *
// *
//*******************************************************************
// Ends rappel sequence
rappel_end()
{
level._player notify( "notify_rappel_end" );
wait 0.05;
level._player PlayerSetGroundReferenceEnt( undefined );
level._player unlink();
level._player_mover = undefined;
level._tether_pos = undefined;
level._damping_factor = undefined;
level._rappel = undefined;
level._player AllowCrouch( true );
level._player AllowProne( true );
level._player AllowJump( true );
level._player AllowMelee( true );
level._player AllowSprint( true );
SetSavedDvar( "compass", 1 );
SetSavedDvar( "ammoCounterHide", 0 );
SetSavedDvar( "actionSlotsHide", 0 );
SetSavedDvar( "hud_showStance", 1 );
SetSavedDvar( "hud_drawhud", 1 );
}
//*******************************************************************
// *
// *
//*******************************************************************
update_damping_factor( factor_scalar )
{
level._damping_factor = factor_scalar;
}
//*******************************************************************
// *
// *
//*******************************************************************
rappel_pause()
{
// This stops physics & anim state machine
level._player notify( "rappel_pause" );
}
//*******************************************************************
// *
// *
//*******************************************************************
//rappel_resume()
//{
// thread rappel_anim_state_machine();
// thread rappel_physics();
//}
//*******************************************************************
// *
// *
//*******************************************************************
rappel_physics()
{
level._player endon( "notify_rappel_end" );
level._player endon( "notify_rappel_physics_end" );
level._player endon( "rappel_pause" );
// Physics variables ---
absolute_pos = level._player_mover.origin;
absolute_angles = level._player_mover.angles;
total_velocity = ( 0, 0, 0 );
// Lateral movement
analog_acceleration = ( 0, 0, 0 );
analog_scalar = 256;
analog_scalar_air = 64;
analog_scalar_slide = 128;
// Jump height
standard_jump_scalar = 425; // 500
forced_jump_scalar = 700;
// Duration that a jump command is buffered, allowing player to press jump early.
jump_button_buffer_time = 300; // ms
// Starting speed of descent and current downward velocity (increase per frame up to max ) -BMarv
//auto_forward_increase_scalar = 0.5;
//current_forward_speed_scalar = 0;
auto_forward_increase_scalar = 3.5;
current_forward_speed_scalar = 3.5;
// Max speed of descent (per frame)
auto_forward_scalar = 50;
//auto_forward_scalar = 0.1;
// Rope tension force
tension_acceleration = ( 0, 0, 0 );
tension_scalar = 1200;
// Air resistance
level._damping_factor = -0.35;
//level._damping_factor = -2;
up_vector = VectorNormalize( AnglesToUp( level._player_mover.angles ) );
down_vector = -1 * up_vector;
right_vector = VectorNormalize( AnglesToRight( level._player_mover.angles ) );
forward_vector = VectorNormalize( AnglesToForward( level._player_mover.angles ) );
back_vector = -1 * forward_vector;
jump_held = false;
last_time_jump_pressed = 0;
level._surface_normal = undefined;
level._TIMESTEP *= level._physics_speed;
// ----------------------
while ( 1 )
{
//IPrintLn( level._player_rig._anim_state + " : " + total_velocity[ 1 ] );
// track jump button state so taht we only respond to presses
if ( level._player JumpButtonPressed() )
{
if ( jump_held == false )
{
jump_held = true;
last_time_jump_pressed = GetTime();
}
}
else
{
if ( jump_held == true )
{
jump_held = false;
}
}
// Check Rope Length -------
//IPrintLnBold( abs( level._player.origin[2] - level._tether_pos[2] ) );
if ( abs( level._player.origin[2] - level._tether_pos[2] ) > level._max_rope_length )
{
level._tether_pos = ( level._tether_pos[0], level._tether_pos[1], level._player.origin[2] + level._max_rope_length );
}
tether_to_player = level._player.origin - level._tether_pos;
// END Check Rope Length ---
// Analog Movement -------
normalized_move = level._player GetNormalizedMovement();
if ( level._player_rig._slide == true )
{
// adjust analog speed when sliding
normalized_move *= analog_scalar_slide / analog_scalar;
}
// maybe switch to lateral anims
level._player_rig.lateral_weight_target = normalized_move[ 1 ];
//if ( normalized_move[ 1 ] > 0.2 )
//{
// level._player_rig.lateral_weight_target = 1;
//}
//else if ( normalized_move[ 1 ] < -0.2 )
//{
// level._player_rig.lateral_weight_target = -1;
//}
//else
//{
// level._player_rig.lateral_weight_target = 0;
//}
if ( normalized_move[1] == 0 )
{
analog_acceleration = ( 0, 0, 0 );
}
else
{
if ( IsDefined( level._surface_normal ) )
{
normal_minus_z = ( level._surface_normal[0], level._surface_normal[1], 0 );
left_vect = VectorCross( normal_minus_z, forward_vector );
analog_acceleration = left_vect * ( normalized_move[1] * -1 ) * analog_scalar;
}
else // we are in air
{
analog_acceleration = ( right_vector * -1 ) * ( normalized_move[1] * -1 ) * analog_scalar_air;
}
}
total_velocity += analog_acceleration * level._TIMESTEP;
// END Analog Movement ---
// Jump -------
/*if ( IsDefined( level._surface_normal ) )
{
if ( level._player JumpButtonPressed() )
{
normal_minus_z = ( level._surface_normal[0], level._surface_normal[1], 0 );
total_velocity += ( standard_jump_scalar * normal_minus_z );
level._player_rig._anim_state = "jump_in";
}
}*/
// can only jump on the ground
if ( IsDefined( level._surface_normal ) )
{
jump = false;
jump_scalar = standard_jump_scalar;
if ( level._player_rig._force_jump == true )
{
// whoever set force-jump already set the anim-state
jump = true;
jump_scalar = forced_jump_scalar; // use a higher jump coming out of slides
}
else if ( level._player_rig._slide == false ) // can't jump while sliding
{
// if latest jump command is within the buffer time.
if ( GetTime() - last_time_jump_pressed < jump_button_buffer_time )
{
last_time_jump_pressed = 0; // consume the jump command
level._player_rig._anim_state = "jump_in";
jump = true;
}
}
if ( jump )
{
normal_minus_z = ( level._surface_normal[0], level._surface_normal[1], 0 );
normal_minus_z = VectorNormalize( normal_minus_z );
total_velocity += ( jump_scalar * normal_minus_z );
}
}
level._player_rig._force_jump = false;
// END Jump ---
// Auto Movement -------
if( current_forward_speed_scalar < auto_forward_scalar )
{
// Rappelling just started, slowly increase velocity up to max
forward_scalar = current_forward_speed_scalar + auto_forward_increase_scalar;
if( forward_scalar > auto_forward_scalar )
{
forward_scalar = auto_forward_scalar;
}
current_forward_speed_scalar = forward_scalar;
auto_offset = ( forward_vector * forward_scalar );
}
else
{
auto_offset = ( forward_vector * auto_forward_scalar );
}
forward_trace = BulletTrace( level._player GetEye(), ( level._player GetEye() + auto_offset ), false, level._player_mover );
if ( forward_trace["surfacetype"] != "none" )
{
theta = acos( VectorDot( forward_trace["normal"], forward_vector ) );
// Flat wall will be 180;
if ( theta > 150 )
{
auto_offset = ( 0, 0, 0 );
}
}
// END Auto Movement ---
// Tension -------
theta = acos( VectorDot( VectorNormalize( tether_to_player ), forward_vector ) );
tens_vect = VectorNormalize( ( tether_to_player[0], tether_to_player[1], 0 ) * -1 );
tension_acceleration = tension_scalar * tan( theta ) * tens_vect;
total_velocity += tension_acceleration * level._TIMESTEP;
// END Tension ---
// Damping -------
total_velocity += ( level._damping_factor * total_velocity * level._TIMESTEP );
// END Damping ---
// Update Angles -------
ground_trace = BulletTrace( level._player_mover.origin, level._player_mover.origin + 1000 * down_vector, false, level._player_mover );
if ( ground_trace["surfacetype"] != "none" )
{
// This is a little hack that allows the player to jump even when slightly off the surface
if ( Length( level._player_mover.origin - ground_trace["position"] ) < 40 )
{
level._surface_normal = ground_trace["normal"];
}
angles = VectorToAngles( ground_trace["normal"] );
angle_lerp_speed = 0.2;
//level._player_mover RotateTo( ( level._player_mover.angles[0], angles[1] - 270, level._player_mover.angles[2] ), angle_lerp_speed, angle_lerp_speed / 2, angle_lerp_speed / 2 );
level._player_mover RotateTo( ( level._player_mover.angles[0], angles[1] - 180, level._player_mover.angles[2] ), angle_lerp_speed, angle_lerp_speed / 2, angle_lerp_speed / 2 );
}
else
{
// This code runs when we're hanging out over the side of the building and helps give a little extra push back
tens_vect = VectorNormalize( ( tether_to_player[0], 0, 0 ) * -1 );
tension_acceleration = tension_scalar * tan( theta ) * tens_vect;
total_velocity += tension_acceleration * level._TIMESTEP;
}
// END Update Angles ---
// Update Pos -------
old_pos = level._player_mover.origin;
absolute_pos += ( total_velocity * level._TIMESTEP ) + auto_offset;
new_pos = absolute_pos;
// END Update Pos ---
// Need to check for colliding with things (fail condition)
coll_info = PlayerPhysicsTraceExtraInfo( old_pos, new_pos );
collide_pos = coll_info["position"];
if ( !f3D_vectors_equal( collide_pos, new_pos ) )
{
// total hack
//if ( coll_info["surfacetype"] == "glass" /*|| coll_info["surfacetype"] == "metal"*/ )
{
level._surface_normal = coll_info["normal"];
// zero out velocity in dir of normal
total_velocity = ( total_velocity - ( VectorDot( total_velocity, level._surface_normal ) * level._surface_normal ) );
}
// Calculate the offset to not allow interpenetration
dot_result = VectorDot( collide_pos - new_pos, coll_info["normal"] );
ip_offset = dot_result * coll_info["normal"];
resolved_pos = new_pos + ip_offset + coll_info["normal"];
// Iterate a 2nd time
coll_info_2 = PlayerPhysicsTraceExtraInfo( collide_pos, resolved_pos );
collide_pos_2 = coll_info_2["position"];
if ( !f3D_vectors_equal( collide_pos_2, resolved_pos ) )
{
level._surface_normal = coll_info_2["normal"];
dot_result_2 = VectorDot( collide_pos_2 - resolved_pos, coll_info_2["normal"] );
ip_offset_2 = dot_result_2 * coll_info_2["normal"];
resolved_pos_2 = resolved_pos + ip_offset_2 + coll_info_2["normal"];
// Iterate a 3rd time
collide_pos_3 = PlayerPhysicsTrace( collide_pos_2, resolved_pos_2 );
if ( !f3D_vectors_equal( collide_pos_3, resolved_pos_2 ) )
{
// Apply offsets
absolute_pos += ( collide_pos_3 - new_pos );
level._player_mover.origin = collide_pos_3;
// This was required by BMarv's logic in nx_ss_rappel.gsc
level._rappel[ "current_player_vector" ] = collide_pos_3 - old_pos;
}
else
{
// Apply offsets
absolute_pos += ip_offset_2;
level._player_mover.origin = resolved_pos_2;
// This was required by BMarv's logic in nx_ss_rappel.gsc
level._rappel[ "current_player_vector" ] = resolved_pos_2 - old_pos;
}
}
else
{
// Apply offsets
absolute_pos += ip_offset;
level._player_mover.origin = resolved_pos;
// This was required by BMarv's logic in nx_ss_rappel.gsc
level._rappel[ "current_player_vector" ] = resolved_pos - old_pos;
}
}
else
{
level._surface_normal = undefined;
level._player_mover.origin = new_pos;
// This was required by BMarv's logic in nx_ss_rappel.gsc
level._rappel[ "current_player_vector" ] = new_pos - old_pos;
}
rappel_lerp_anims();
wait 0.05;
}
}
//*******************************************************************
// *
// *
//*******************************************************************
rappel_anim_state_machine()
{
level._player endon( "notify_rappel_end" );
level._player endon( "rappel_pause" );
while ( 1 )
{
switch( level._player_rig._anim_state )
{
case "sprint":
level._player_rig rappel_sprint_state();
break;
case "jump_in":
level._player_rig rappel_jump_in_state();
break;
case "jump_loop":
level._player_rig rappel_jump_loop_state();
break;
case "jump_out":
level._player_rig rappel_jump_out_state();
break;
case "slide_in":
level._player_rig rappel_slide_in_state();
break;
case "slide_loop":
level._player_rig rappel_slide_loop_state();
break;
case "slide_out":
level._player_rig rappel_slide_out_state();
break;
default:
Assert( "rappel does not have an appropriate state defined." );
break;
}
wait 0.05;
}
}
//*******************************************************************
// *
// *
//*******************************************************************
set_leg_anims_to_idle()
{
level._legs.idle_weight_target = 1;
level._legs.slide_in_weight_target = 0;
level._legs.slide_loop_weight_target = 0;
level._legs.slide_out_weight_target = 0;
}
//*******************************************************************
// *
// *
//*******************************************************************
rappel_sprint_state()
{
level._player_rig.anim_rate = level._anim_rate_in;
level._player_rig.sprint_weight_target = 1;
level._player_rig.jump_in_weight_target = 0;
level._player_rig.jump_loop_weight_target = 0;
level._player_rig.jump_out_weight_target = 0;
level._player_rig.slide_in_weight_target = 0;
level._player_rig.slide_loop_weight_target = 0;
level._player_rig.slide_out_weight_target = 0;
set_leg_anims_to_idle();
if ( level._player_rig._slide == true )
{
level._player_rig._anim_state = "slide_in";
}
}
//*******************************************************************
// *
// *
//*******************************************************************
rappel_jump_in_state()
{
level._player_rig.anim_rate = level._anim_rate_out;
level._player_rig.jump_in_weight_target = 1;
level._player_rig.sprint_weight_target = 0;
level._player_rig.jump_loop_weight_target = 0;
level._player_rig.jump_out_weight_target = 0;
level._player_rig.slide_in_weight_target = 0;
level._player_rig.slide_loop_weight_target = 0;
level._player_rig.slide_out_weight_target = 0;
set_leg_anims_to_idle();
// if anim complete, then transition to jump_loop
if ( rappel_check_anim_time( "jump_in", 0.98 ) )
{
level._player_rig._anim_state = "jump_loop";
}
}
//*******************************************************************
// *
// *
//*******************************************************************
rappel_jump_loop_state()
{
level._player_rig.anim_rate = level._anim_rate_out;
level._player_rig.jump_loop_weight_target = 1;
level._player_rig.sprint_weight_target = 0;
level._player_rig.jump_in_weight_target = 0;
level._player_rig.jump_out_weight_target = 0;
level._player_rig.slide_in_weight_target = 0;
level._player_rig.slide_loop_weight_target = 0;
level._player_rig.slide_out_weight_target = 0;
set_leg_anims_to_idle();
// if we are back on 'ground', transition to jump_out
if ( IsDefined( level._surface_normal ) )
{
level._player_rig._anim_state = "jump_out";
}
}
//*******************************************************************
// *
// *
//*******************************************************************
rappel_jump_out_state()
{
level._player_rig.anim_rate = level._anim_rate_out;
level._player_rig.jump_out_weight_target = 1;
level._player_rig.sprint_weight_target = 0;
level._player_rig.jump_in_weight_target = 0;
level._player_rig.jump_loop_weight_target = 0;
level._player_rig.slide_in_weight_target = 0;
level._player_rig.slide_loop_weight_target = 0;
level._player_rig.slide_out_weight_target = 0;
set_leg_anims_to_idle();
// if anim complete, then transition to sprint
if ( rappel_check_anim_time( "jump_out", 0.8 ) )
{
level._player_rig._anim_state = "sprint";
}
}
//*******************************************************************
// *
// *
//*******************************************************************
rappel_slide_in_state()
{
level._player_rig.anim_rate = level._anim_rate_in;
level._player_rig.slide_in_weight_target = 1;
level._player_rig.sprint_weight_target = 0;
level._player_rig.jump_in_weight_target = 0;
level._player_rig.jump_loop_weight_target = 0;
level._player_rig.jump_out_weight_target = 0;
level._player_rig.slide_loop_weight_target = 0;
level._player_rig.slide_out_weight_target = 0;
level._legs.slide_in_weight_target = 1;
level._legs.idle_weight_target = 0;
level._legs.slide_loop_weight_target = 0;
level._legs.slide_out_weight_target = 0;
// if anim complete, then transition to slide_loop
if ( rappel_check_anim_time( "slide_in", 0.98 ) )
{
level._player_rig._anim_state = "slide_loop";
}
}
//*******************************************************************
// *
// *
//*******************************************************************
rappel_slide_loop_state()
{
level._player_rig.anim_rate = level._anim_rate_out;
level._player_rig.slide_loop_weight_target = 1;
level._player_rig.sprint_weight_target = 0;
level._player_rig.jump_in_weight_target = 0;
level._player_rig.jump_loop_weight_target = 0;
level._player_rig.jump_out_weight_target = 0;
level._player_rig.slide_in_weight_target = 0;
level._player_rig.slide_out_weight_target = 0;
level._legs.slide_loop_weight_target = 1;
level._legs.idle_weight_target = 0;
level._legs.slide_in_weight_target = 0;
level._legs.slide_out_weight_target = 0;
if ( level._player_rig._slide == false )
{
level._player_rig._anim_state = "slide_out";
}
}
//*******************************************************************
// *
// *
//*******************************************************************
rappel_slide_out_state()
{
level._player_rig.anim_rate = level._anim_rate_out;
level._player_rig.slide_out_weight_target = 1;
level._player_rig.sprint_weight_target = 0;
level._player_rig.jump_in_weight_target = 0;
level._player_rig.jump_loop_weight_target = 0;
level._player_rig.jump_out_weight_target = 0;
level._player_rig.slide_in_weight_target = 0;
level._player_rig.slide_loop_weight_target = 0;
level._legs.slide_out_weight_target = 1;
level._legs.idle_weight_target = 0;
level._legs.slide_in_weight_target = 0;
level._legs.slide_loop_weight_target = 0;
anime = level._scr_anim[ "player_rig" ][ "slide_out" ];
force_jump_times = GetNoteTrackTimes( anime, "slide_out_jump" );
assert ( force_jump_times.size > 0 );
anim_time = level._player_rig GetAnimTime( anime );
if ( anim_time > force_jump_times[ 0 ] )
{
level._player_rig._force_jump = true;
}
// if anim complete, then transition to jump_loop
if ( rappel_check_anim_time( "slide_out", 0.9 ) )
{
level._player_rig._anim_state = "jump_loop";
}
}
//*******************************************************************
// *
// *
//*******************************************************************
rappel_lerp_anims()
{
//IPrintLnBold( level._player_rig GetEntNum() );
//===
// state anim blends
level._player_rig.sprint_weight_curr += ( level._player_rig.sprint_weight_target - level._player_rig.sprint_weight_curr ) * level._player_rig.anim_rate;
level._player_rig.jump_in_weight_curr += ( level._player_rig.jump_in_weight_target - level._player_rig.jump_in_weight_curr ) * level._player_rig.anim_rate;
level._player_rig.jump_loop_weight_curr += ( level._player_rig.jump_loop_weight_target - level._player_rig.jump_loop_weight_curr ) * level._player_rig.anim_rate;
level._player_rig.jump_out_weight_curr += ( level._player_rig.jump_out_weight_target - level._player_rig.jump_out_weight_curr ) * level._player_rig.anim_rate;
level._player_rig.slide_in_weight_curr += ( level._player_rig.slide_in_weight_target - level._player_rig.slide_in_weight_curr ) * level._player_rig.anim_rate;
level._player_rig.slide_loop_weight_curr += ( level._player_rig.slide_loop_weight_target - level._player_rig.slide_loop_weight_curr ) * level._player_rig.anim_rate;
level._player_rig.slide_out_weight_curr += ( level._player_rig.slide_out_weight_target - level._player_rig.slide_out_weight_curr ) * level._player_rig.anim_rate;
level._player_rig SetAnimLimited( level._scr_anim[ "player_rig" ][ "sprint" ], level._player_rig.sprint_weight_curr, 0 );
level._player_rig SetAnimLimited( level._scr_anim[ "player_rig" ][ "jump_in" ], level._player_rig.jump_in_weight_curr, 0 );
level._player_rig SetAnimLimited( level._scr_anim[ "player_rig" ][ "jump_loop" ], level._player_rig.jump_loop_weight_curr, 0 );
level._player_rig SetAnimLimited( level._scr_anim[ "player_rig" ][ "jump_out" ], level._player_rig.jump_out_weight_curr, 0 );
level._player_rig SetAnimLimited( level._scr_anim[ "player_rig" ][ "slide_in" ], level._player_rig.slide_in_weight_curr, 0 );
level._player_rig SetAnimLimited( level._scr_anim[ "player_rig" ][ "slide_loop" ], level._player_rig.slide_loop_weight_curr, 0 );
level._player_rig SetAnimLimited( level._scr_anim[ "player_rig" ][ "slide_out" ], level._player_rig.slide_out_weight_curr, 0 );
//===
// leg anim blends
level._legs.idle_weight_curr += ( level._legs.idle_weight_target - level._legs.idle_weight_curr ) * level._player_rig.anim_rate;
level._legs.slide_in_weight_curr += ( level._legs.slide_in_weight_target - level._legs.slide_in_weight_curr ) * level._player_rig.anim_rate;
level._legs.slide_loop_weight_curr += ( level._legs.slide_loop_weight_target - level._legs.slide_loop_weight_curr ) * level._player_rig.anim_rate;
level._legs.slide_out_weight_curr += ( level._legs.slide_out_weight_target - level._legs.slide_out_weight_curr ) * level._player_rig.anim_rate;
level._legs SetAnimLimited( level._scr_anim[ "legs" ][ "idle" ], level._legs.idle_weight_curr, 0 );
level._legs SetAnimLimited( level._scr_anim[ "legs" ][ "slide_in" ], level._legs.slide_in_weight_curr, 0 );
level._legs SetAnimLimited( level._scr_anim[ "legs" ][ "slide_loop" ], level._legs.slide_loop_weight_curr, 0 );
level._legs SetAnimLimited( level._scr_anim[ "legs" ][ "slide_out" ], level._legs.slide_out_weight_curr, 0 );
//===
// lateral anim blends
level._player_rig.lateral_weight_curr += ( level._player_rig.lateral_weight_target - level._player_rig.lateral_weight_curr ) * 0.15;
lateral_weight = Abs( level._player_rig.lateral_weight_curr );
level._player_rig SetAnimLimited( level._scr_anim[ "player_rig" ][ "sprint_forward" ], 1 - lateral_weight, 0 );
if ( level._player_rig.lateral_weight_curr > 0 )
{
level._player_rig SetAnimLimited( level._scr_anim[ "player_rig" ][ "sprint_left" ], 0, 0 );
level._player_rig SetAnimLimited( level._scr_anim[ "player_rig" ][ "sprint_right" ], lateral_weight, 0 );
}
else
{
level._player_rig SetAnimLimited( level._scr_anim[ "player_rig" ][ "sprint_left" ], lateral_weight, 0 );
level._player_rig SetAnimLimited( level._scr_anim[ "player_rig" ][ "sprint_right" ], 0, 0 );
}
}
//*******************************************************************
// *
// *
//*******************************************************************
rappel_check_anim_time( anime, time )
{
curr_time = level._player_rig GetAnimTime( level._scr_anim[ "player_rig" ][ anime ] );
if ( curr_time >= time )
{
return true;
}
return false;
}