2025-05-13 19:22:01 +08:00

125 lines
3.3 KiB
C#

using System.Collections.Generic;
using System.ComponentModel;
using Godot;
using Godot.Bridge;
using Godot.Collections;
using Godot.NativeInterop;
[ScriptPath("res://Scripts/Bullets/RulerBehavior.cs")]
public partial class RulerBehavior : Node2D
{
private Entity entity;
[Export(PropertyHint.None, "")]
private Node2D bullet;
[Export(PropertyHint.None, "")]
private Array<int> exceptions = new Array<int> { 1 };
private IBullet bulletData;
public static List<Node2D> active = new List<Node2D>();
private float cd;
private bool hard;
private static readonly Vector2 off = new Vector2(300f, 0f);
public override void _EnterTree()
{
if (BattleDR.current == null)
{
QueueFree();
return;
}
entity = GetParent<Entity>();
bulletData = bullet as IBullet;
}
public override void _Process(double delta)
{
if (BattleDR.current != null && GodotObject.IsInstanceValid(BattleDR.current.activeBoard) && BattleDR.current?.activeBoard?.caller?.entity != entity)
{
BattleDR current = BattleDR.current;
if (current != null && current.activeBoard?.timer > 1f)
{
BattleDR current2 = BattleDR.current;
if (current2 != null && current2.activeBoard.IsInsideTree())
{
if (exceptions != null && (exceptions.Contains(BattleDR.current.activeBoard.id) || active.Count >= 2) && !active.Contains(bulletData.node))
{
return;
}
if (!active.Contains(bulletData.node))
{
entity.Modulate = Main.colorWhite;
hard = entity.battleData.internalFlags.Contains("Bad");
base.Visible = true;
base.GlobalPosition = BattleDR.current.activeBoard.GlobalPosition;
bulletData.node.Position = off;
if (active.Count == 0)
{
base.GlobalRotationDegrees = GD.RandRange(0, 360);
}
else
{
base.GlobalRotationDegrees = active[0].GlobalRotationDegrees + 180f;
}
Main.SetActive(bulletData.node, state: true);
active.Add(bulletData.node);
if (active[0] == bulletData.node)
{
Audio.PlaySound("snd_arrow.wav");
}
cd = 0f;
return;
}
cd += Main.deltaTime;
if (cd < 30f)
{
bulletData.node.Position = off.Lerp(Vector2.Zero, Mathf.SmoothStep(0f, 1f, cd / 30f));
}
else if (cd < 40f)
{
if (active[0] == bulletData.node)
{
Audio.PlaySound("snd_impact_ch1.wav");
}
cd = 50f;
}
else if (cd < 55f)
{
bulletData.node.Position = Vector2.One * GD.RandRange(-1, 1);
}
else if (BattleDR.current.enemies.Count == 1)
{
bulletData.node.Position = bulletData.node.Position.Lerp(new Vector2(0f, 0f - Mathf.Abs(Mathf.Sin((cd - 55f) * 0.025f) * (float)(hard ? 65 : 45))), Main.deltaTime * 0.1f);
base.GlobalRotationDegrees += Main.deltaTime * 0.5f;
}
else if (active[0] == bulletData.node)
{
bulletData.node.Position = bulletData.node.Position.Lerp(new Vector2(0f, Mathf.Sin((cd - 55f) * ((active.Count == 1) ? 0.05f : 0.025f)) * (float)(hard ? 35 : 25)), Main.deltaTime * 0.1f);
}
else
{
bulletData.node.Position = new Vector2(0f, 0f - active[0].Position.Y);
}
if (Engine.GetProcessFrames() % 10 == 0L)
{
bulletData.grazed = false;
}
return;
}
}
}
if (base.Visible)
{
base.Visible = false;
active.Remove(bulletData.node);
Main.SetActive(bullet, state: false);
}
}
}