@@ -474,7 +474,7 @@ namespace oob_state
474474 {
475475 shared.fade_alpha = 1 .0f ;
476476 }
477-
477+
478478 if (this ->fade_time > 0 .0f )
479479 {
480480 return SS_FADE_IN;
@@ -608,7 +608,7 @@ namespace oob_state
608608 {
609609 shared.vel = 0 .0f ;
610610 shared.loc = fixed.in_loc ;
611- shared.accel = 0 .0f ;
611+ shared.accel = 0 .0f ;
612612 }
613613 else
614614 {
@@ -637,8 +637,142 @@ namespace oob_state
637637 this ->updatess [9 ] = &supdate_fade_out;
638638 }
639639
640- oob_state::grab_state_type::substate_enum oob_state::grab_state_type::update_stopping (xScene& scene,
641- F32& dt)
640+ grab_state_type::tutorial_callback::tutorial_callback (grab_state_type& owner) : owner(owner)
641+ {
642+ }
643+
644+ grab_state_type::substate_enum grab_state_type::supdate_fade_out (grab_state_type& gst,
645+ xScene& scene, F32& dt)
646+ {
647+ return gst.update_fade_out (scene, dt);
648+ }
649+
650+ grab_state_type::substate_enum grab_state_type::update_fade_out (xScene& scene, F32& dt)
651+ {
652+ this ->fade_time -= dt;
653+ shared.fade_alpha = this ->fade_time / fixed.grab .fade_time ;
654+
655+ if (shared.fade_alpha < 0 .0f )
656+ {
657+ shared.fade_alpha = 0 .0f ;
658+ }
659+
660+ if (this ->fade_time > 0 .0f )
661+ {
662+ return SS_FADE_OUT;
663+ }
664+
665+ dt += this ->fade_time ;
666+ return SS_INVALID;
667+ }
668+
669+ grab_state_type::substate_enum
670+ grab_state_type::supdate_start_fade_out (grab_state_type& gst, xScene& scene, F32& dt)
671+ {
672+ return gst.update_start_fade_out (scene, dt);
673+ }
674+
675+ grab_state_type::substate_enum grab_state_type::update_start_fade_out (xScene& scene,
676+ F32& dt)
677+ {
678+ this ->fade_start_time -= dt;
679+
680+ if (this ->fade_start_time > 0 .0f )
681+ {
682+ return SS_START_FADE_OUT;
683+ }
684+
685+ dt += this ->fade_start_time ;
686+ return SS_FADE_OUT;
687+ }
688+
689+ grab_state_type::substate_enum grab_state_type::supdate_moving_out (grab_state_type& gst,
690+ xScene& scene, F32& dt)
691+ {
692+ return gst.update_moving_out (scene, dt);
693+ }
694+
695+ grab_state_type::substate_enum grab_state_type::update_moving_out (xScene& scene, F32& dt)
696+ {
697+ move_hand (dt);
698+
699+ if ((shared.loc - fixed.out_loc ).dot (shared.dir ) >= 0 .0f )
700+ {
701+ return SS_MOVING_OUT;
702+ }
703+
704+ dt = 0 .0f ;
705+ return SS_INVALID;
706+ }
707+
708+ grab_state_type::substate_enum grab_state_type::supdate_starting (grab_state_type& gst,
709+ xScene& scene, F32& dt)
710+ {
711+ return gst.update_starting (scene, dt);
712+ }
713+
714+ grab_state_type::substate_enum grab_state_type::update_starting (xScene& scene, F32& dt)
715+ {
716+ move_hand (dt);
717+
718+ if (shared.vel > -fixed.grab .out_vel )
719+ {
720+ return SS_STARTING;
721+ }
722+
723+ shared.vel = -fixed.grab .out_vel ;
724+ shared.accel = 0 .0f ;
725+ return SS_MOVING_OUT;
726+ }
727+
728+ grab_state_type::substate_enum grab_state_type::supdate_tutorial (grab_state_type& gst,
729+ xScene& scene, F32& dt)
730+ {
731+ return gst.update_tutorial (scene, dt);
732+ }
733+
734+ grab_state_type::substate_enum grab_state_type::update_tutorial (xScene& scene, F32& dt)
735+ {
736+ this ->delay -= dt;
737+ if (!this ->finished_tutorial || this ->delay > 0 .0f )
738+ {
739+ return SS_TUTORIAL;
740+ }
741+
742+ dt = 0 .0f ;
743+ shared.accel =
744+ (-fixed.grab .out_vel * fixed.grab .out_vel ) / (2 .0f * fixed.grab .out_start_dist );
745+ return SS_STARTING;
746+ }
747+
748+ grab_state_type::substate_enum grab_state_type::supdate_stopped (grab_state_type& gst,
749+ xScene& scene, F32& dt)
750+ {
751+ return gst.update_stopped (scene, dt);
752+ }
753+
754+ grab_state_type::substate_enum grab_state_type::update_stopped (xScene& scene, F32& dt)
755+ {
756+ this ->delay -= dt;
757+
758+ if (this ->delay > 0 .0f )
759+ {
760+ return SS_STOPPED;
761+ }
762+
763+ dt += this ->delay ;
764+ shared.accel =
765+ (-fixed.grab .out_vel * fixed.grab .out_vel ) / (2 .0f * fixed.grab .out_start_dist );
766+ return SS_STARTING;
767+ }
768+
769+ grab_state_type::substate_enum grab_state_type::supdate_stopping (grab_state_type& gst,
770+ xScene& scene, F32& dt)
771+ {
772+ return gst.update_stopping (scene, dt);
773+ }
774+
775+ grab_state_type::substate_enum grab_state_type::update_stopping (xScene& scene, F32& dt)
642776 {
643777 move_hand (dt);
644778
@@ -652,7 +786,7 @@ namespace oob_state
652786 shared.vel = 0 .0f ;
653787 shared.accel = 0 .0f ;
654788
655- this ->fade_start_time = fixed.grab .out_wait_time ;
789+ this ->delay = fixed.grab .out_wait_time ;
656790
657791 if (assume_player_is_stupid ())
658792 {
@@ -663,18 +797,69 @@ namespace oob_state
663797 return SS_STOPPED;
664798 }
665799
666- grab_state_type::substate_enum oob_state::grab_state_type::update_reorient (xScene&, F32&)
800+ grab_state_type::substate_enum grab_state_type::supdate_moving_in (grab_state_type& gst,
801+ xScene& scene, F32& dt)
667802 {
668- return SS_REORIENT ;
669- };
803+ return gst. update_moving_in (scene, dt) ;
804+ }
670805
671- grab_state_type::tutorial_callback::tutorial_callback (grab_state_type& owner) : owner(owner)
806+ grab_state_type::substate_enum grab_state_type::update_moving_in (xScene& scene, F32& dt)
807+ {
808+ move_hand (dt);
809+
810+ xVec2 in_out_path = fixed.in_loc - fixed.out_loc ;
811+ xVec2 norm = in_out_path.normal ();
812+
813+ F32 projection = norm.dot (fixed.in_loc - shared.loc );
814+ if (projection > fixed.grab .in_stop_dist )
815+ {
816+ return SS_MOVING_IN;
817+ }
818+ else if (projection <= 0 .0f )
819+ {
820+ shared.vel = 0 .0f ;
821+ shared.loc = fixed.in_loc ;
822+ shared.accel = 0 .0f ;
823+ }
824+ else
825+ {
826+ shared.accel = (-shared.vel * shared.vel ) / (2 .0f * projection);
827+ }
828+
829+ return SS_STOPPING;
830+ }
831+
832+ grab_state_type::substate_enum grab_state_type::supdate_begin_wait (grab_state_type& gst,
833+ xScene& scene, F32& dt)
672834 {
835+ return gst.update_begin_wait (scene, dt);
673836 }
674- } // namespace
675- } // namespace oob_state
676837
838+ grab_state_type::substate_enum grab_state_type::update_begin_wait (xScene& scene, F32& dt)
839+ {
840+ this ->delay -= dt;
841+ if (this ->delay > 0 .0f )
842+ {
843+ return SS_BEGIN_WAIT;
844+ }
677845
846+ shared.render_hand = true ;
847+ return SS_MOVING_IN;
848+ }
849+
850+ grab_state_type::substate_enum grab_state_type::supdate_reorient (grab_state_type& gst,
851+ xScene& scene, F32& dt)
852+ {
853+ return gst.update_reorient (scene, dt);
854+ }
855+
856+ grab_state_type::substate_enum oob_state::grab_state_type::update_reorient (xScene& scene,
857+ F32& dt)
858+ {
859+ return SS_BEGIN_WAIT;
860+ };
861+ } // namespace
862+ } // namespace oob_state
678863
679864float oob_state::oob_timer ()
680865{
@@ -715,10 +900,6 @@ void oob_state::state_type::stop() {
715900
716901};
717902
718- void oob_state::grab_state_type::stop () {
719-
720- };
721-
722903bool oob_state::IsPlayerInControl ()
723904{
724905 return oob_state::shared.control == 0 ;
@@ -728,22 +909,33 @@ namespace oob_state
728909{
729910 namespace
730911 {
731- void drop_state_type ::start ()
912+ void grab_state_type ::start ()
732913 {
914+ }
733915
916+ void grab_state_type::stop ()
917+ {
734918 }
735919
736- void drop_state_type::stop ( )
920+ state_enum grab_state_type::update (xScene& scene, F32& dt )
737921 {
922+ return STATE_DROP;
923+ }
738924
925+ void drop_state_type::start ()
926+ {
927+ }
928+
929+ void drop_state_type::stop ()
930+ {
739931 }
740932
741933 state_enum drop_state_type::update (xScene& scene, F32& dt)
742934 {
743935 return STATE_DROP;
744936 }
745- }
746- }
937+ } // namespace
938+ } // namespace oob_state
747939
748940WEAK F32 xVec2::dot (const xVec2& b) const
749941{
0 commit comments