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

198 lines
4.1 KiB
C#

using System.Collections.Generic;
using System.ComponentModel;
using Godot;
using Godot.Bridge;
using Godot.NativeInterop;
[ScriptPath("res://Scripts/Bullets/BearingJump.cs")]
public partial class BearingJump : Node2D
{
[Export(PropertyHint.None, "")]
private Node2D bullet;
[Export(PropertyHint.None, "")]
private AudioStream jump;
[Export(PropertyHint.None, "")]
private AudioStream charge;
[Export(PropertyHint.None, "")]
private AudioStream impact;
[Export(PropertyHint.None, "")]
private float waitDelay = 30f;
[Export(PropertyHint.None, "")]
private float fallTime = 15f;
[Export(PropertyHint.None, "")]
private float bulletSpeedMod = 0.65f;
private Entity entity;
private Vector2 sp;
private Vector2 bp;
private int state;
private float cd;
private float wait;
private bool bul;
private Vector2[] pos;
private List<MoveAhead> bullets = new List<MoveAhead>();
private readonly StringName jumpAnim = "Fall";
private readonly StringName punchAnim = "Land";
private readonly StringName chargeAnim = "Charge";
private readonly Color glow = new Color(2.5f, 2.5f, 2.5f);
private readonly Vector2[] bspd = new Vector2[4]
{
new Vector2(0.7f, 1.7f),
new Vector2(-0.7f, 1.7f),
new Vector2(0.7f, -0.7f),
new Vector2(-0.7f, -0.7f)
};
private readonly Vector2 grav = new Vector2(0f, -0.02f);
public override void _EnterTree()
{
entity = BattleDR.current.enemies[0].entity;
entity.Modulate = Main.colorWhite;
sp = entity.GlobalPosition;
entity.doTrail = true;
bp = BattleDR.current.activeBoard.GlobalPosition;
entity.Reparent(this);
entity.CollisionLayer = 4u;
if (BattleDR.current.enemies[0].HPPercent() <= 0.5f || BattleDR.current.enemies[0].spare >= 50)
{
wait = fallTime * 2f;
waitDelay = Mathf.RoundToInt(waitDelay * 0.75f);
}
else
{
wait = fallTime * 3f;
}
}
public override void _ExitTree()
{
entity.doTrail = false;
entity.Modulate = Main.colorWhite;
entity.Reparent(BattleDR.current);
entity.shake = 0f;
entity.CollisionLayer = 1u;
}
public override void _Process(double delta)
{
for (int num = bullets.Count - 1; num >= 0; num--)
{
if (!GodotObject.IsInstanceValid(bullets[num]))
{
bullets.RemoveAt(num);
}
else
{
bullets[num].speed += grav * Main.deltaTime;
}
}
switch (state)
{
case 0:
if (pos == null)
{
pos = new Vector2[3]
{
entity.GlobalPosition,
new Vector2(BattleDR.current.soul.GlobalPosition.X, bp.Y - 55f),
Vector2.Zero
};
pos[2] = new Vector2(Mathf.Lerp(pos[0].X, pos[1].X, 0.5f), bp.Y - 80f);
Audio.PlaySound(jump);
entity.anim.Play(jumpAnim);
}
if (cd < 40f)
{
cd += Main.deltaTime;
entity.GlobalPosition = Common.Beizier(pos[0], pos[2], pos[1], cd / 40f);
break;
}
state = 1;
cd = 0f;
pos = new Vector2[2]
{
entity.GlobalPosition,
new Vector2(pos[1].X, bp.Y + BattleDR.current.activeBoard.boardSize.Y / 2f)
};
entity.Shake(waitDelay, 1f);
entity.anim.Play(chargeAnim);
Audio.PlaySound(charge);
break;
case 1:
if (cd < waitDelay)
{
cd += Main.deltaTime;
entity.Modulate = ((Common.SinOverTime(1.25f) > 0f) ? Main.colorWhite : glow);
break;
}
entity.Modulate = Main.colorWhite;
state = 2;
cd = 0f;
entity.anim.Play(punchAnim);
break;
case 2:
cd += Main.deltaTime;
if (cd <= fallTime)
{
entity.GlobalPosition = pos[0].Lerp(pos[1], cd / fallTime);
}
else if (cd < wait)
{
if (bul)
{
break;
}
entity.GlobalPosition = pos[1];
Audio.PlaySound(impact);
CameraController.Shake(15f, 2f);
entity.Shake(10f, 2f);
bul = true;
if (!(BattleDR.current.activeBoard.timer > 10f))
{
break;
}
for (int i = 0; i < 4; i++)
{
MoveAhead moveAhead = (MoveAhead)BattleDR.NewBullet(in bullet, entity.GlobalPosition + Vector2.Up * 32f, this);
moveAhead.speed = bspd[i] * bulletSpeedMod;
bullets.Add(moveAhead);
moveAhead.RotationDegrees = Main.RandomRange(0, 360);
if (bspd[i].X > 0f)
{
moveAhead.rotation *= -1f;
}
}
}
else
{
bul = false;
cd = 0f;
state = 0;
pos = null;
}
break;
}
}
}