newlon/scripts/particles/FallParticle.cs
2025-07-25 18:48:49 +05:00

37 lines
1.2 KiB
C#

using Godot;
using Newlon.Components.Level;
using Newlon.Components.Zombies;
namespace Newlon.Particles;
[GlobalClass]
public partial class FallParticle : RigidBody2D
{
[Export] private RuntimeZombieData data;
[Export] private float minAngle;
[Export] private float maxAngle;
[Export] private float minTorque;
[Export] private float maxTorque;
[Export] private float Impulse;
public void FallOff()
{
SetDeferred("freeze", false);
foreach (var floor in FallFloor.GetEverythingElse(FallFloor.GetNearest(data.GlobalPosition)))
{
AddCollisionExceptionWith(floor);
}
Callable.From(() =>
{
Reparent(PoolContainer.Instance.Particles);
float rng_angle = Mathf.DegToRad((float)GD.RandRange(minAngle, maxAngle));
float rng_torque = Mathf.DegToRad((float)GD.RandRange(minTorque, maxTorque));
if (Impulse != 0)
ApplyImpulse(new Vector2(Mathf.Sin(rng_angle) * Impulse, Mathf.Cos(rng_angle) * Impulse));
ApplyTorqueImpulse(rng_torque);
}).CallDeferred();
var tween = CreateTween();
tween.TweenInterval(4.0);
tween.TweenProperty(this, "modulate", new Color(Modulate.R, Modulate.G, Modulate.B, 0f), 1.0);
tween.TweenCallback(Callable.From(QueueFree));
}
}