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; } }
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); }
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; } }