예제 #1
0
        public override void Update(Player pPlayer, Player pOtherPlayer)
        {
            if (!m2ndState)             //KnockOverTree
            {
                switch (pPlayer.mCurrentState)
                {
                case 0:
                    //-----Zu Position bewegen-----
                    if (Conditions.PlayerAtActionPosition(pPlayer))
                    {
                        ++pPlayer.mCurrentState;
                    }
                    Sequences.MovePlayerToActionPosition(pPlayer);
                    break;

                case 1:
                    //-----Richtung bestimmen-----
                    Sequences.StartAnimation(pPlayer, Hardcoded.Anim_KnockOverTree_Up);
                    ActivityInstruction.ThumbstickDirection dir = ActivityInstruction.ThumbstickDirection.None;
                    Vector2 DestinationDelta = rIObj.ActionPosition2 - rIObj.ActionPosition1;
                    DestinationDelta.Normalize();
                    if (DestinationDelta.Y > Math.Sin(MathHelper.ToRadians(67.5f)))                             //Runter
                    {
                        dir = ActivityInstruction.ThumbstickDirection.Down;
                    }
                    else if (DestinationDelta.Y > Math.Sin(MathHelper.ToRadians(-22.5f))) //Seitlich
                    {
                        if (DestinationDelta.X < 0)                                       //Links
                        {
                            dir = ActivityInstruction.ThumbstickDirection.Left;
                        }
                        else                                 //Rechts
                        {
                            dir = ActivityInstruction.ThumbstickDirection.Right;
                        }
                    }
                    else                             //Hoch
                    {
                        dir = ActivityInstruction.ThumbstickDirection.Up;
                    }

                    string animPlayer = Character.GetRightDirectionAnimation(rIObj.ActionPosition2 - rIObj.ActionPosition1, Hardcoded.Anim_KnockOverTree_Up, Hardcoded.Anim_KnockOverTree_Down, Hardcoded.Anim_KnockOverTree_Side);
                    string animTree   = Character.GetRightDirectionAnimation(rIObj.ActionPosition2 - rIObj.ActionPosition1, Hardcoded.Anim_Tree_KnockOver_Up, Hardcoded.Anim_Tree_KnockOver_Down, Hardcoded.Anim_Tree_KnockOver_Side);

                    Character.SetSkeletonFlipState(pPlayer, rIObj.ActionPosition2 - rIObj.ActionPosition1);
                    Character.SetSkeletonFlipState(rIObj, rIObj.ActionPosition2 - rIObj.ActionPosition1);
                    Sequences.StartAnimation(pPlayer, animPlayer);
                    Sequences.StartAnimation(rIObj, animTree);

                    ActI.SetThumbstickDir(pPlayer, dir);
                    ActI.SetThumbstickDir(pOtherPlayer, ActivityInstruction.ThumbstickDirection.None);
                    ++pPlayer.mCurrentState;
                    break;

                case 2:
                    //-----Baum umwerfen-----
                    if (!Conditions.ActionThumbstickPressed(pPlayer, rIObj.ActionPosition2 - rIObj.ActionPosition1))
                    {
                        ActI.SetFadingState(pPlayer, true);
                        Progress.StepBackward();
                    }
                    else
                    {
                        ActI.SetFadingState(pPlayer, false, false);
                        Progress.StepForward();
                    }
                    Sequences.UpdateAnimationStepping(rIObj, Progress.Progress);
                    Sequences.UpdateAnimationStepping(pPlayer, Progress.Progress);

                    if (Progress.Complete)
                    {
                        //Baum fällt
                        string anim = Character.GetRightDirectionAnimation(rIObj.ActionPosition2 - rIObj.ActionPosition1, Hardcoded.Anim_Tree_Falling_Up, Hardcoded.Anim_Tree_Falling_Down, Hardcoded.Anim_Tree_Falling_Side);
                        Sequences.StartAnimation(rIObj, anim);
                        //Sequences.StartAnimation(pPlayer, "attack"); kann weg?
                        ActI.SetFadingState(pPlayer, false);
                        ++pPlayer.mCurrentState;
                    }
                    break;

                case 3:
                    //-----Baum umgefallen?-----
                    if (Conditions.AnimationComplete(rIObj))
                    {
                        Sequences.SetPlayerToIdle(pPlayer);
                        m2ndState = true;
                    }
                    break;
                }
                ActI.Update();
            }
            else             //BalanceOverTree
            {
                switch (pPlayer.mCurrentState)
                {
                case 0:
                    //-----Zu Position bewegen-----
                    if (!Conditions.ActivityNotInUseByOtherPlayer(pOtherPlayer, this))
                    {
                        Sequences.SetPlayerToIdle(pPlayer);
                        return;
                    }
                    if (Conditions.PlayerAtNearestActionPosition(pPlayer))
                    {
                        ++pPlayer.mCurrentState;
                    }
                    Sequences.MovePlayerToNearestActionPosition(pPlayer);
                    break;

                case 1:
                    //-----Richtung bestimmen-----
                    IsAvailable   = false;
                    StartPosition = pPlayer.SkeletonPosition;
                    Direction     = rIObj.DistantActionPosition(pPlayer.SkeletonPosition) - StartPosition;
                    Sequences.AnimateAccordingToDirection(pPlayer, Direction, Hardcoded.Anim_Balance_Enter_Up, Hardcoded.Anim_Balance_Enter_Down, Hardcoded.Anim_Balance_Enter_Side);
                    ++pPlayer.mCurrentState;
                    break;

                case 2:
                    //-----Auf Baum steigen-----
                    Direction.Normalize();
                    Sequences.SynchMovementToAnimation(pPlayer, pPlayer, StartPosition, StartPosition + (Direction * Hardcoded.KnockOverTree_EnterBalanceDistance));
                    if (Conditions.AnimationComplete(pPlayer))
                    {
                        ++pPlayer.mCurrentState;
                    }
                    break;

                case 3:
                    //-----Auf Baum balancieren-----
                    //Update Movement
                    Vector2 MovementInput = pPlayer.Input.Movement;
                    if (MovementInput == Vector2.Zero)
                    {
                        Sequences.StartAnimation(pPlayer, Hardcoded.Anim_Balance_Idle);
                        break;                                 //Performance quit
                    }

                    //Sideways?
                    Vector2 DirectionTest = rIObj.ActionPosition2 - rIObj.ActionPosition1;
                    DirectionTest.Normalize();
                    bool Sideways = false;
                    if (DirectionTest.Y <= Math.Sin(MathHelper.ToRadians(45f)) && DirectionTest.Y >= -Math.Sin(MathHelper.ToRadians(45f)))
                    {
                        Sideways = true;
                    }

                    //Runter fallen?
                    if ((MovementInput.X == 0 && MovementInput.Y != 0 && Sideways) || (MovementInput.X != 0 && MovementInput.Y == 0 && !Sideways))
                    {
                        GameScene.End = true;
                        break;
                    }

                    //BalancingMovement ausführen
                    Sequences.AnimateAccordingToDirection(pPlayer, DirectionTest, Hardcoded.Anim_Balance_Up, Hardcoded.Anim_Balance_Down, Hardcoded.Anim_Balance_Side);
                    pPlayer.MoveAgainstPoint(rIObj.NearestActionPosition(pPlayer.SkeletonPosition + MovementInput * 1000f), Hardcoded.KnockOverTree_BalanceSpeedFactor, null, true, false, false);

                    //Leave Tree?
                    Vector2 TargetActionPosition = rIObj.NearestActionPosition(pPlayer.SkeletonPosition + MovementInput * 1000f);
                    Vector2 MovementDirection    = TargetActionPosition - pPlayer.SkeletonPosition;
                    MovementDirection.Normalize();
                    //Wenn Entfernung vom Player zum TargetActionPoint <= EnterBalanceEntfernung
                    if ((TargetActionPosition - pPlayer.SkeletonPosition).Length() <= (MovementDirection * Hardcoded.KnockOverTree_EnterBalanceDistance).Length())
                    {
                        ++pPlayer.mCurrentState;
                        StartPosition = pPlayer.SkeletonPosition;
                        Sequences.AnimateAccordingToDirection(pPlayer, MovementDirection, Hardcoded.Anim_Balance_Leave_Up, Hardcoded.Anim_Balance_Leave_Down, Hardcoded.Anim_Balance_Leave_Side);
                    }
                    break;

                case 4:
                    //-----Von Baum steigen-----
                    Sequences.SynchMovementToAnimation(pPlayer, pPlayer, StartPosition, StartPosition + (Direction * Hardcoded.KnockOverTree_EnterBalanceDistance));
                    while (pPlayer.CollisionBox.Intersects(pOtherPlayer.CollisionBox))
                    {
                        pOtherPlayer.MoveManually(Direction);
                    }
                    if (Conditions.AnimationComplete(pPlayer))
                    {
                        Sequences.SetPlayerToIdle(pPlayer);
                        IsAvailable = true;
                        //pPlayer.mCurrentState = 0;
                    }
                    break;
                }
            }
        }