146 lines
2.9 KiB
C#
146 lines
2.9 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using Godot;
|
|
using Godot.Bridge;
|
|
using Godot.NativeInterop;
|
|
|
|
[ScriptPath("res://Scripts/Bullets/EraserSolo.cs")]
|
|
public partial class EraserSolo : Node2D, IBullet
|
|
{
|
|
[Export(PropertyHint.None, "")]
|
|
private float jump = 110f;
|
|
|
|
[Export(PropertyHint.None, "")]
|
|
private float time = 60f;
|
|
|
|
[Export(PropertyHint.None, "")]
|
|
private float variance = 15f;
|
|
|
|
[Export(PropertyHint.None, "")]
|
|
private float startDelay;
|
|
|
|
[Export(PropertyHint.None, "")]
|
|
private float jumpVariance = 15f;
|
|
|
|
[Export(PropertyHint.None, "")]
|
|
private bool alwaysRandom;
|
|
|
|
private float cd;
|
|
|
|
private float x;
|
|
|
|
private bool first;
|
|
|
|
private bool bouncing;
|
|
|
|
private bool resetGraze;
|
|
|
|
private Vector2 sp;
|
|
|
|
private Vector2 tp;
|
|
|
|
private Vector2 mp;
|
|
|
|
private float floor;
|
|
|
|
private float currentTime;
|
|
|
|
private static readonly Vector2 bounceScale = new Vector2(1.5f, 0.5f);
|
|
|
|
private static readonly Vector2 jumpScale = new Vector2(0.65f, 1.35f);
|
|
|
|
private const float bounceTime = 10f;
|
|
|
|
public bool grazed { get; set; }
|
|
|
|
public Node2D node { get; set; }
|
|
|
|
public Action<Node> onShot { get; set; }
|
|
|
|
public AnimationPlayer anim { get; set; }
|
|
|
|
public BulletGenerator generatedFrom { get; set; }
|
|
|
|
[Export(PropertyHint.None, "")]
|
|
public int HP { get; set; } = 1;
|
|
|
|
[Export(PropertyHint.None, "")]
|
|
public IBullet.Type type { get; set; }
|
|
|
|
public override void _EnterTree()
|
|
{
|
|
x = DWMenu.instance.bulletBoard.Size.X / 2f - 10f;
|
|
floor = DWMenu.instance.bulletBoard.Size.Y / 2f;
|
|
sp = base.Position;
|
|
tp = new Vector2(base.Position.X, floor);
|
|
currentTime = time;
|
|
}
|
|
|
|
public override void _Process(double delta)
|
|
{
|
|
if (startDelay > 0f)
|
|
{
|
|
startDelay -= Main.deltaTime;
|
|
return;
|
|
}
|
|
if (bouncing)
|
|
{
|
|
base.Scale = Vector2.One.Lerp(bounceScale, cd / 10f);
|
|
if (cd >= 10f)
|
|
{
|
|
bouncing = false;
|
|
cd = 0f;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (startDelay > -50f)
|
|
{
|
|
startDelay = -100f;
|
|
}
|
|
if (cd < currentTime)
|
|
{
|
|
if (cd < currentTime / 2f)
|
|
{
|
|
base.Scale = jumpScale.Lerp(Vector2.One, cd * 2f / currentTime);
|
|
resetGraze = true;
|
|
}
|
|
else if (resetGraze)
|
|
{
|
|
grazed = false;
|
|
resetGraze = false;
|
|
}
|
|
if (!first)
|
|
{
|
|
base.Position = sp.Lerp(tp, cd / currentTime);
|
|
}
|
|
else
|
|
{
|
|
base.Position = Common.Beizier(sp, mp, tp, cd / currentTime);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
sp = base.Position;
|
|
if (alwaysRandom || Main.RandomRange(0, 10) < 3)
|
|
{
|
|
tp = new Vector2(Main.RandomRange(0f - x, x), floor);
|
|
}
|
|
else
|
|
{
|
|
tp = new Vector2(Mathf.Clamp(GetParent<Node2D>().ToLocal(DWMenu.instance.soulBody.GlobalPosition).X, 0f - x, x), floor);
|
|
}
|
|
mp = sp.Lerp(tp, 0.5f) + Vector2.Up * (jump + Main.RandomRange(0f, jumpVariance));
|
|
cd = 0f;
|
|
currentTime = time + Main.RandomRange(0f, variance);
|
|
first = true;
|
|
Audio.PlaySound("snd_jump_ch1.wav");
|
|
bouncing = true;
|
|
}
|
|
}
|
|
cd += Main.deltaTime;
|
|
}
|
|
|
|
}
|