using System.Collections.Generic; using System.ComponentModel; using Godot; using Godot.Bridge; using Godot.NativeInterop; [ScriptPath("res://Scripts/Bullets/WrenchSpin.cs")] public partial class WrenchSpin : Node2D { [Export(PropertyHint.None, "")] private Sprite2D nut; [Export(PropertyHint.None, "")] private Sprite2D wrench; [Export(PropertyHint.None, "")] private Node2D bullet; private float cd; private float nextTarget; private float wait; private int state; private Entity entity; private Vector2 mid; private Vector2 target = new Vector2(0f, -50f); private bool flip; private bool stop; private const float startTime = 45f; private const float speed = 2f; private const float angle = 60f; private List screws = new List(); public override void _EnterTree() { entity = BattleDR.current.activeBoard.caller.entity; entity.Visible = false; wrench.GlobalPosition = entity.GlobalPosition; target += nut.GlobalPosition; mid = wrench.GlobalPosition.Lerp(nut.GlobalPosition, 0.5f) + Vector2.Up * 100f; Audio.PlaySound("snd_jump_ch1.wav"); } public override void _ExitTree() { entity.Visible = true; for (int i = 0; i < screws.Count; i++) { screws[i].QueueFree(); } BattleDR.current.soul.TopLevel = true; } public override void _Process(double delta) { if (state == 0) { if (cd <= 45f) { float num = Mathf.Min(cd / 45f, 1f); cd += Main.deltaTime; wrench.RotationDegrees = Mathf.Lerp(0f, -180f, num); wrench.GlobalPosition = Common.Beizier(entity.GlobalPosition, mid, target, num); } else { state = 1; cd = 30f; CameraController.Shake(10f); Audio.PlaySound("snd_screenshake.wav"); wrench.Reparent(nut); } return; } if (state == 1) { if (cd > 0f) { cd -= Main.deltaTime; return; } state = 2; cd = 0f; if (Mathf.Abs(BattleDR.current.soul.GlobalPosition.X - nut.GlobalPosition.X) <= 1f) { flip = Main.RandomRange(0, 100) > 50; } else { flip = BattleDR.current.soul.GlobalPosition.X < nut.GlobalPosition.X; } GetTarget(); return; } if (wait > 0f) { wait -= Main.deltaTime; return; } if (cd < 60f) { cd += Main.deltaTime; } nut.RotationDegrees += Main.deltaTime * Mathf.Min(1f, cd / 60f) * (float)((!flip) ? 1 : (-1)) * 2f; DWMenu.instance.bulletBoardPivot.RotationDegrees = (0f - nut.RotationDegrees) / 2f; if ((!flip || !(nut.RotationDegrees <= nextTarget)) && (flip || !(nut.RotationDegrees >= nextTarget)) && !stop) { return; } if (!stop && Main.RandomRange(0, 100) >= 50) { stop = true; GetTarget(); return; } Audio.PlaySound("snd_screenshake.wav"); stop = false; CameraController.Shake(15f); wait = 30f; cd = 0f; GetTarget(); for (int i = 0; i < 3; i++) { MoveAhead moveAhead = (MoveAhead)BattleDR.NewBullet(in bullet, Vector2.Zero, BattleDR.current); moveAhead.ZIndex = 4096; moveAhead.Scale *= 0.8f; moveAhead.RotationDegrees = Main.RandomRange(0, 360); float x = ((i != 0) ? ((!(wrench.GlobalPosition < nut.GlobalPosition)) ? Main.RandomRange((0f - BattleDR.current.activeBoard.boardSize.X) / 2.1f, 0f) : Main.RandomRange(0f, BattleDR.current.activeBoard.boardSize.X / 2.1f)) : Main.RandomRange((0f - BattleDR.current.activeBoard.boardSize.X) / 2.1f, BattleDR.current.activeBoard.boardSize.X / 2.1f)); moveAhead.GlobalPosition = base.GlobalPosition + new Vector2(x, -100 - 15 * i); moveAhead.speed *= Main.RandomRange(0.9f, 1.1f); screws.Add(moveAhead); } } private void GetTarget() { nextTarget += (float)((!flip) ? 1 : (-1)) * 60f; } }