// Animation Skrit: select_walk // // History: // VERSION 1.0: Initial implementation // VERSION 1.1 Marked as not persistent // // Notes: // This walk pays attention to the speedbias parameter // property int MAJORVERSION$ = 1; property int MINORVERSION$ = 1; property bool _PERSIST$ = false; owner = Aspect; Goid m_Goid$; bool m_Revived$; ///////////////////////////////////////////////////////////////////////////// // Utilities ///////////////////////////////////////////////////////////////////////////// // States //---------------------------- startup state LoopForever$ { event OnEnterState$ { m_Revived$ = ( UIShell.FindUIWindow( "rollover_bg2", "rollover_help" ) != NULL ); } event OnStartChore$ ( int /*subanim$*/, int /*flags$*/ ) { m_Goid$ = owner.Goid; int best_anim$ = 0; int override$ = GoDb.GetQuestInt( m_Goid$, "chore", "walk", 0 ); if ( override$ < 0 ) { //random animation override range specified int override_min$ = GoDb.GetQuestInt( m_Goid$, "chore", "walk_min", 0 ); if ( override$ < -1 ) { int override_max$ = GoDb.GetQuestInt( m_Goid$, "chore", "walk_max", 0 ); best_anim$ = ( override_min$ >= override_max$ ? override_min$ : GoMath.RandomInt( override_min$, override_max$ ) ); } else { best_anim$ = override_min$; } } else { best_anim$ = -1; if ( m_Revived$ ) { if ( m_Goid$.go.HasInventory() ) { Go weapon$ = m_Goid$.go.Inventory.SelectedItem; if ( weapon$ != NULL ) { if ( weapon$.HasComponent( "subanim" ) ) { best_anim$ = owner.Blender.GetSubAnimIndex( CHORE_WALK, 'rvwk' ); } } } } if ( best_anim$ < 0 ) { // try to chose the best anim for how fast we are moving. // also want to adjust for how big we are. float desired_animation_speed$ = 1.0; eAnimStance stance$ = AS_PLAIN; if ( m_Goid$.IsValid() ) { if ( m_Goid$.go.HasFollower() && m_Goid$.go.HasAspect() ) { desired_animation_speed$ = m_Goid$.go.follower.CurrentVelocity * m_Goid$.go.aspect.RenderScale; } if ( m_Goid$.go.HasInventory() ) { stance$ = m_Goid$.go.inventory.animstance; } } int i$ = 0; int iend$ = owner.blender.GetNumSubAnims(CHORE_WALK,stance$); float error$ = Math.Abs( desired_animation_speed$ - owner.blender.GetScalarVelocity( CHORE_WALK, stance$, 0) ); //subtract rvwk and w0k1 (assumes that they are at the end) if ( owner.Blender.GetSubAnimIndex( CHORE_WALK, '0wk1' ) > -1 ) { iend$ -= 1; } if ( owner.Blender.GetSubAnimIndex( CHORE_WALK, 'rvwk' ) > -1 ) { iend$ -= 1; } while( i$ < iend$ ) { float new_error$ = Math.Abs( desired_animation_speed$ - owner.blender.GetScalarVelocity( CHORE_WALK, stance$, i$) ); if( new_error$ < error$ ) { error$ = new_error$; best_anim$ = i$; } i$ += 1; } } } if ( best_anim$ < 0 ) { best_anim$ = 0; } owner.blender.ResetTimeWarp(); int bg$ = owner.blender.OpenBlendGroup(); owner.blender.AddAnimToBlendGroup(best_anim$,1); owner.blender.CloseBlendGroup(); owner.blender.SetBlendGroupWeight(bg$,1); } event OnUpdate$( float delta_t$ ) { // Velocity is stored in the Aspect, yet RenderScale is stored in the GoAspect! float desired_animation_speed$ = 1.0; if ( m_Goid$.IsValid() ) { if ( m_Goid$.go.HasFollower() && m_Goid$.go.HasAspect() ) { float animated_v$ = owner.CurrentVelocity * m_Goid$.go.aspect.RenderScale; float follower_v$ = m_Goid$.go.follower.CurrentVelocity; if ((animated_v$>0.01) && (follower_v$>0.01)) { delta_t$ = delta_t$ * follower_v$/animated_v$; } } } /* if (follower_v$ <= 0.01) { Report.errorf("[SELECT_WALK] The follower velocity for [%s] is [%f]\n",owner.DebugName,follower_v$); } */ int events$ = owner.UpdateBlender(delta_t$); if (AnimEventBitTest(events$,ANIMEVENT_SFX_1)) { PostWorldMessage( WE_ANIM_SFX, m_Goid$, m_Goid$, 1, 0 ); } if (AnimEventBitTest(events$,ANIMEVENT_SFX_2)) { PostWorldMessage( WE_ANIM_SFX, m_Goid$, m_Goid$, 2, 0 ); } if (AnimEventBitTest(events$,ANIMEVENT_SFX_3)) { PostWorldMessage( WE_ANIM_SFX, m_Goid$, m_Goid$, 3, 0 ); } if (AnimEventBitTest(events$,ANIMEVENT_SFX_4)) { PostWorldMessage( WE_ANIM_SFX, m_Goid$, m_Goid$, 4, 0 ); } if (AnimEventBitTest(events$,ANIMEVENT_LEFT_FOOT_DOWN)) { PostWorldMessage( WE_ANIM_OTHER, m_Goid$, m_Goid$, 'lfdn', 0 ); } if (AnimEventBitTest(events$,ANIMEVENT_RIGHT_FOOT_DOWN)) { PostWorldMessage( WE_ANIM_OTHER, m_Goid$, m_Goid$, 'rfdn', 0 ); } if (AnimEventBitTest(events$,ANIMEVENT_FIRE_WEAPON)) { PostWorldMessage( WE_ANIM_WEAPON_FIRE, m_Goid$, m_Goid$, owner.CurrentReqBlock, 0 ); } if (AnimEventBitTest(events$,ANIMEVENT_HIDE_MESH)) { owner.SetHideMeshFlag(true); } if (AnimEventBitTest(events$,ANIMEVENT_SHOW_MESH)) { owner.SetHideMeshFlag(false); } if (AnimEventBitTest(events$,ANIMEVENT_FINISH)) { PostWorldMessage( WE_ANIM_LOOPED, m_Goid$, m_Goid$, owner.CurrentReqBlock, 0 ); } } }