Esempio n. 1
0
        private void Smash(Vector2 dir, bool force = false)
        {
            MoveDir = dir;

            if (MoveDir == -Vector2.UnitY && CurrentNode.NodeUp != null)
            {
                nextNode     = CurrentNode.NodeUp;
                currentTrack = CurrentNode.TrackUp;
            }
            else if (MoveDir == Vector2.UnitY && CurrentNode.NodeDown != null)
            {
                nextNode     = CurrentNode.NodeDown;
                currentTrack = CurrentNode.TrackDown;
            }
            else if (MoveDir == -Vector2.UnitX && CurrentNode.NodeLeft != null)
            {
                nextNode     = CurrentNode.NodeLeft;
                currentTrack = CurrentNode.TrackLeft;
            }
            else if (MoveDir == Vector2.UnitX && CurrentNode.NodeRight != null)
            {
                nextNode     = CurrentNode.NodeRight;
                currentTrack = CurrentNode.TrackRight;
            }

            IsMoving = force && currentTrack.CanBeUsed;
            if (!force)
            {
                scale = new Vector2(
                    1f + Math.Abs(dir.Y) * 0.35f - Math.Abs(dir.X) * 0.35f,
                    1f + Math.Abs(dir.X) * 0.35f - Math.Abs(dir.Y) * 0.35f);
                hitOffset = dir * 5f;
                IsMoving  = true;
            }
        }
Esempio n. 2
0
        public void Attach(Node node)
        {
            IsAttachedToTrack = true;
            CurrentNode       = node;

            if (node.NodeUp != null)
            {
                arrowDir = ArrowDir.Up;
            }
            else if (node.NodeRight != null)
            {
                arrowDir = ArrowDir.Right;
            }
            else if (node.NodeLeft != null)
            {
                arrowDir = ArrowDir.Left;
            }
            else if (node.NodeDown != null)
            {
                arrowDir = ArrowDir.Down;
            }

            arrowSprite.Play("Idle" + Enum.GetName(typeof(ArrowDir), arrowDir), true);
        }
Esempio n. 3
0
        private IEnumerator Sequence()
        {
            while (true)
            {
                while (!IsMoving)
                {
                    yield return(null);
                }

                StartShaking(0.2f);
                Input.Rumble(RumbleStrength.Medium, RumbleLength.Short);

                Vector2 dirSign = Calc.Sign(MoveDir);
                float   f       = dirSign.X == -1 || dirSign.Y == -1 ? -1 : 1f;

                bool travel = nextNode != null && CurrentNode != nextNode && currentTrack.CanBeUsed &&
                              !(currentTrack.OneWayDir.HasValue && currentTrack.OneWayDir.Value == -MoveDir);

                Sfx.Play("event:/CommunalHelperEvents/game/stationBlock/" + (Theme == Themes.Normal ? "station" : "moon") + "_block_seq", "travel", travel ? 1f : 0f);

                if (travel)
                {
                    Safe = false;
                    if (CurrentNode.PushForce != Vector2.Zero)
                    {
                        Audio.Play(CustomSFX.game_stationBlock_force_cue, Center);
                    }
                    arrowSprite.Play(GetTurnAnim(arrowDir, MoveDir), true);
                    yield return(0.2f);

                    float t = 0f;
                    StopPlayerRunIntoAnimation = false;
                    Vector2 start  = CurrentNode.Center - offset;
                    Vector2 target = nextNode.Center - offset;

                    while (t < 1f)
                    {
                        float tNextUnclamped = t + speedFactor * 2f * Engine.DeltaTime;
                        t = Calc.Approach(t, 1f, speedFactor * 2f * Engine.DeltaTime);

                        Percent = Ease.SineIn(t);
                        currentTrack.TrackOffset = f * Percent * 16;
                        CurrentNode.Percent      = nextNode.Percent = currentTrack.Percent = Percent;

                        if (nextNode.HasIndicator && nextNode.PushForce != Vector2.Zero)
                        {
                            nextNode.ColorLerp = Math.Min(1f, t * 2f);
                        }

                        Vector2 to = Vector2.Lerp(start, target, Percent);
                        ScrapeParticlesCheck(to);
                        if (Scene.OnInterval(0.05f))
                        {
                            currentTrack.CreateSparks(Center, p_sparks);
                        }

                        Vector2 toUnclamped          = Vector2.Lerp(start, target, Ease.SineIn(tNextUnclamped));
                        Vector2 theoreticalLiftSpeed = Engine.DeltaTime == 0f ? Vector2.Zero : (toUnclamped - ExactPosition) / Engine.DeltaTime;
                        MoveToX(to.X, theoreticalLiftSpeed.X);
                        MoveToY(to.Y, theoreticalLiftSpeed.Y);
                        yield return(null);
                    }

                    StartShaking(0.2f);
                    Sfx.Param(Theme == Themes.Moon ? "end_moon" : "end", 1);
                    Input.Rumble(RumbleStrength.Strong, RumbleLength.Medium);
                    SceneAs <Level>().Shake(0.2f);
                    StopPlayerRunIntoAnimation = true;

                    currentTrack.TrackOffset = 0f;
                    CurrentNode.Percent      = nextNode.Percent = currentTrack.Percent = Percent = 0f;
                    CurrentNode = nextNode;
                }
                else
                {
                    arrowSprite.Play(GetAnimName(arrowDir, arrowDir), true);
                    yield return(0.25f);
                }
                Safe     = true;
                IsMoving = false;
            }
        }