using System; using System.Collections.Generic; using System.ComponentModel; using Godot; using Godot.Bridge; using Godot.NativeInterop; [ScriptPath("res://Scripts/Bullets/PencilEraser.cs")] public partial class PencilEraser : Node2D { [Export(PropertyHint.None, "")] private NodePath pencilPath; [Export(PropertyHint.None, "")] private NodePath eraserPath; [Export(PropertyHint.None, "")] private NodePath trailPath; [Export(PropertyHint.None, "")] private NodePath colliderPath; [Export(PropertyHint.None, "")] private NodePath trailColliderPath; [Export(PropertyHint.None, "")] private NodePath boxPath; [Export(PropertyHint.None, "")] private NodePath eraserSprite; private Node2D pencil; private Node2D eraser; private Node2D eraserVisual; private Line2D trail; private CollisionShape2D trailCollider; private Node2D collider; private Control box; private IBullet pencilB; private IBullet eraserB; [Export(PropertyHint.None, "")] private float startDelay = 20f; [Export(PropertyHint.None, "")] private float pencilSpeed = 0.5f; [Export(PropertyHint.None, "")] private float eraserSpeed = 0.35f; private const float snap = (float)Math.PI / 4f; private float startwait; private float cd; private float grazeReset; private Vector2 dir = Vector2.Left; private List colliders = new List(); private List shapes = new List(); private static readonly Vector2 snapVec = Vector2.One.Rotated((float)Math.PI / 4f); public override void _EnterTree() { pencil = GetNode(pencilPath); eraser = GetNode(eraserPath); trail = GetNode(trailPath); collider = GetNode(colliderPath); trailCollider = GetNode(trailColliderPath); box = GetNode(boxPath); eraserVisual = GetNode(eraserSprite); box.Size = BattleDR.current.activeBoard.boardSize; box.Position = -box.Size / 2f; trail.Position = box.Position * -1f; eraserB = eraser as IBullet; pencilB = pencil as IBullet; base.Modulate = Main.colorClear; Main.SetActive(trailCollider, state: false); startwait = startDelay; Add(); } private void Add() { colliders.Insert(0, (CollisionShape2D)trailCollider.Duplicate()); colliders[0].Shape = new SegmentShape2D { A = pencil.Position, B = ((colliders.Count == 0) ? eraser.Position : pencil.Position) }; shapes.Insert(0, (SegmentShape2D)colliders[0].Shape); collider.AddChild(colliders[0], forceReadableName: false, InternalMode.Disabled); Main.SetActive(colliders[0], state: true); cd = 15f; } public override void _Process(double delta) { base.Modulate = base.Modulate.Lerp(Main.colorWhite, Main.deltaTime * 0.1f); if (grazeReset < 15f) { grazeReset += Main.deltaTime; } else { grazeReset = 0f; pencilB.grazed = false; eraserB.grazed = false; } if (startDelay > 0f) { startDelay -= Main.deltaTime; return; } Vector2 to = ToLocal(DWMenu.instance.soulBody.GlobalPosition); Vector2 vector = pencil.Position.DirectionTo(to).Snapped(snapVec).Normalized(); if (dir != vector && cd <= 0f) { Add(); dir = vector; } else if (cd > 0f) { cd -= Main.deltaTime; } if (pencil.Position.DistanceTo(to) > 2f) { pencil.RotationDegrees = Common.SinOverTime(0.5f) * 2f; pencil.Position += dir * pencilSpeed * Main.deltaTime; shapes[0].A = pencil.Position; } Vector2 position = eraser.Position; List list = shapes; if (position.DistanceTo(list[list.Count - 1].A) > 1f) { Node2D node2D = eraser; Vector2 position2 = node2D.Position; position = eraser.Position; List list2 = shapes; node2D.Position = position2 + position.DirectionTo(list2[list2.Count - 1].A) * eraserSpeed * Main.deltaTime; eraserVisual.RotationDegrees = Common.SinOverTime() * 2f; List list3 = shapes; list3[list3.Count - 1].B = eraser.Position; } else { if (shapes.Count > 1) { List list4 = colliders; list4[list4.Count - 1].QueueFree(); colliders.RemoveAt(colliders.Count - 1); shapes.RemoveAt(shapes.Count - 1); } eraserVisual.RotationDegrees = 0f; } List list5 = new List(); for (int i = 0; i < shapes.Count; i++) { list5.Add(shapes[i].A); list5.Add(shapes[i].B); } trail.Points = list5.ToArray(); } }