etqw-sdk/base/script/vehicles/cockpits/husky.script
2008-05-29 00:00:00 +00:00

150 lines
No EOL
3.6 KiB
Text

object vehicle_husky_cockpit : vehicle_basic_cockpit {
void preinit();
void destroy();
void OnEntered();
void AnimThread();
float HideSurface( string surfaceName );
void ShowSurface( float id );
string turnLeftAnim;
string turnRightAnim;
string centerAnim;
string brakeAnim;
float surfaceId0;
float surfaceId1;
float surfaceId2;
float surfaceId3;
}
void vehicle_husky_cockpit::preinit() {
surfaceId0 = -1;
surfaceId1 = -1;
surfaceId2 = -1;
surfaceId3 = -1;
turnLeftAnim = getKey( "turn_left_anim" );
turnRightAnim = getKey( "turn_right_anim" );
centerAnim = getKey( "base_anim" );
brakeAnim = getKey( "brake_anim" );
}
void vehicle_husky_cockpit::OnEntered() {
surfaceId0 = HideSurface( getKey( "surface_name0" ) );
surfaceId1 = HideSurface( getKey( "surface_name1" ) );
surfaceId2 = HideSurface( getKey( "surface_name2" ) );
surfaceId3 = HideSurface( getKey( "surface_name3" ) );
thread AnimThread();
}
void vehicle_husky_cockpit::destroy() {
ShowSurface( surfaceId0 );
ShowSurface( surfaceId1 );
ShowSurface( surfaceId2 );
ShowSurface( surfaceId3 );
sys.killThread( "vehicle_husky_cockpit::AnimThread" );
}
#define HUSKY_STEER_LEFT 0
#define HUSKY_STEER_RIGHT 1
#define HUSKY_STEER_CENTER 2
void vehicle_husky_cockpit::AnimThread() {
sys.threadName( "vehicle_husky_cockpit::AnimThread" );
playAnimBlended( ANIMCHANNEL_TORSO, centerAnim, 0.25f );
sys.wait( playAnim( ANIMCHANNEL_LEGS, "into" ) );
float steerState = HUSKY_STEER_CENTER;
float newSteerState;
boolean isBraking;
float oldSteer = 0.f;
while ( true ) {
entity driver = myVehicle.getDriver();
vector move;
boolean leaning = false;
if ( driver != $null_entity ) {
move = driver.getMove();
if ( driver.getButton( PK_LEANLEFT ) || driver.getButton( PK_LEANRIGHT ) ) {
leaning = true;
}
} else {
move = '0 0 0';
}
boolean braking = leaning;
if ( !braking ) {
float vel = myVehicle.getLinearVelocity() * myVehicle.getWorldAxis( 0 );
if ( sys.fabs( vel ) > 10.f && move_x != 0.f ) {
if ( ( move_x < 0.f ) != ( vel < 0.f ) ) {
braking = true;
}
}
}
if ( isBraking != braking ) {
isBraking = braking;
if ( isBraking ) {
playAnimBlended( ANIMCHANNEL_TORSO, brakeAnim, 0.25f );
} else {
playAnimBlended( ANIMCHANNEL_TORSO, centerAnim, 0.25f );
}
}
if ( move_y < 0 ) {
if ( move_y > oldSteer ) {
newSteerState = HUSKY_STEER_CENTER;
} else {
newSteerState = HUSKY_STEER_LEFT;
}
} else if ( move_y > 0 ) {
if ( move_y < oldSteer ) {
newSteerState = HUSKY_STEER_CENTER;
} else {
newSteerState = HUSKY_STEER_RIGHT;
}
} else {
newSteerState = HUSKY_STEER_CENTER;
}
if ( newSteerState != steerState ) {
steerState = newSteerState;
if ( steerState == HUSKY_STEER_CENTER ) {
playAnimBlended( ANIMCHANNEL_LEGS, centerAnim, 0.25f );
} else if ( steerState == HUSKY_STEER_RIGHT ) {
playAnimBlended( ANIMCHANNEL_LEGS, turnRightAnim, 0.25f );
} else if ( steerState == HUSKY_STEER_LEFT ) {
playAnimBlended( ANIMCHANNEL_LEGS, turnLeftAnim, 0.25f );
}
}
oldSteer = move_y;
sys.waitFrame();
}
}
float vehicle_husky_cockpit::HideSurface( string surfaceName ) {
float id = -1;
if ( surfaceName != "" ) {
id = myVehicle.getSurfaceId( surfaceName );
myVehicle.hideSurface( id );
}
return id;
}
void vehicle_husky_cockpit::ShowSurface( float id ) {
if ( id != -1 ) {
myVehicle.showSurface( id );
}
}