122 lines
3.1 KiB
C#
122 lines
3.1 KiB
C#
using Godot;
|
|
using GodotUtilities;
|
|
using SupaLidlGame.Extensions;
|
|
|
|
namespace SupaLidlGame.Entities;
|
|
|
|
public partial class ShungiteSpike : Projectile
|
|
{
|
|
[Export]
|
|
public PackedScene Dart { get; set; }
|
|
|
|
[Export]
|
|
public BoundingBoxes.Hurtbox Hurtbox { get; set; }
|
|
|
|
[Export]
|
|
public AudioStreamPlayer2D HitSound { get; set; }
|
|
|
|
[Export]
|
|
public AnimationPlayer AnimationPlayer { get; set; }
|
|
|
|
public Vector2 Target { get; set; }
|
|
|
|
public double ExplodeTime { get; set; } = 2;
|
|
|
|
public double FreezeTime
|
|
{
|
|
get => _freezeTime;
|
|
set
|
|
{
|
|
_currentFreezeTime = _freezeTime = value;
|
|
}
|
|
}
|
|
|
|
private double _currentExplodeTime;
|
|
private double _freezeTime;
|
|
private double _currentFreezeTime;
|
|
private bool _hasFrozen = false;
|
|
private bool _hasExploded = false;
|
|
|
|
private Scenes.Map _map;
|
|
|
|
public override void _Ready()
|
|
{
|
|
_currentFreezeTime = FreezeTime;
|
|
_currentExplodeTime = ExplodeTime;
|
|
_map = this.GetAncestor<Scenes.Map>();
|
|
|
|
Hurtbox.ReceivedDamage += OnReceivedDamage;
|
|
AnimationPlayer.Play("spin");
|
|
|
|
AnimationPlayer.AnimationFinished += (StringName anim) =>
|
|
{
|
|
if (anim == "explode")
|
|
{
|
|
QueueFree();
|
|
}
|
|
};
|
|
|
|
base._Ready();
|
|
}
|
|
|
|
private void OnReceivedDamage(
|
|
float damage,
|
|
Characters.Character inflictor,
|
|
float knockback,
|
|
Vector2 knockbackDir)
|
|
{
|
|
// if we were hit by the player before the spike freezes,
|
|
// spawn a dart towards where the player is aiming
|
|
if (inflictor is Characters.Player player)
|
|
{
|
|
var mousePos = GetGlobalMousePosition();
|
|
var dart = CreateDart(GlobalPosition.DirectionTo(mousePos));
|
|
dart.Hitbox.Faction = player.Faction;
|
|
Hitbox.IsDisabled = true;
|
|
}
|
|
|
|
HitSound.At(GlobalPosition).PlayOneShot();
|
|
_hasExploded = true;
|
|
_hasFrozen = true;
|
|
AnimationPlayer.Stop();
|
|
AnimationPlayer.Play("explode");
|
|
}
|
|
|
|
|
|
private Entities.ShungiteDart CreateDart(Vector2 direction)
|
|
{
|
|
var dart = _map.SpawnEntity<Entities.ShungiteDart>(Dart);
|
|
dart.Direction = direction;
|
|
dart.Hitbox.Faction = Hitbox.Faction;
|
|
dart.GlobalPosition = GlobalPosition;
|
|
dart.Delay = 0;
|
|
return dart;
|
|
}
|
|
|
|
public override void _Process(double delta)
|
|
{
|
|
if ((_currentFreezeTime -= delta) <= 0)
|
|
{
|
|
if (!_hasFrozen)
|
|
{
|
|
Speed = 0;
|
|
_hasFrozen = true;
|
|
AnimationPlayer.Stop();
|
|
}
|
|
|
|
if ((_currentExplodeTime -= delta) <= 0)
|
|
{
|
|
if (!_hasExploded)
|
|
{
|
|
CreateDart(Vector2.Up);
|
|
CreateDart(Vector2.Down);
|
|
CreateDart(Vector2.Left);
|
|
CreateDart(Vector2.Right);
|
|
AnimationPlayer.Play("explode");
|
|
_hasExploded = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|