65 lines
1.9 KiB
C#
65 lines
1.9 KiB
C#
using Chickensoft.AutoInject;
|
|
using Chickensoft.Introspection;
|
|
using Godot;
|
|
using System.Linq;
|
|
|
|
namespace GameJamDungeon;
|
|
|
|
[Meta(typeof(IAutoNode))]
|
|
public partial class ThrownItem : RigidBody3D
|
|
{
|
|
public override void _Notification(int what) => this.Notify(what);
|
|
|
|
[Dependency] public IPlayer Player => this.DependOn<IPlayer>();
|
|
|
|
public IInventoryItem ItemThatIsThrown;
|
|
|
|
[Node] public Sprite3D Sprite { get; set; } = default!;
|
|
|
|
public void OnResolved()
|
|
{
|
|
BodyEntered += ThrownItem_BodyEntered;
|
|
GlobalPosition = Player.CurrentPosition;
|
|
Sprite.Texture = ItemThatIsThrown.GetTexture();
|
|
AddCollisionExceptionWith((Node)Player);
|
|
}
|
|
|
|
private void ThrownItem_BodyEntered(Node body)
|
|
{
|
|
if (body is IEnemy enemy)
|
|
CalculateEffect(enemy);
|
|
QueueFree();
|
|
}
|
|
|
|
public void Throw()
|
|
{
|
|
ApplyCentralImpulse(-Player.CurrentBasis.Z.Normalized() * ItemThatIsThrown.ThrowSpeed);
|
|
}
|
|
|
|
private void CalculateEffect(IEnemy enemy)
|
|
{
|
|
if (ItemThatIsThrown is ThrowableItem throwableItem)
|
|
{
|
|
switch (throwableItem.ThrowableItemTags.Single())
|
|
{
|
|
case ThrowableItemTag.LowerTargetTo1HP:
|
|
enemy.TakeDamage(enemy.CurrentHP - 1, ignoreDefense: true, ignoreElementalResistance: true);
|
|
break;
|
|
case ThrowableItemTag.TeleportToRandomLocation:
|
|
throwableItem.TeleportToRandomRoom(enemy);
|
|
break;
|
|
}
|
|
if (throwableItem.ThrowableItemTags.Contains(ThrowableItemTag.LowerTargetTo1HP))
|
|
enemy.TakeDamage(enemy.CurrentHP - 1, ignoreDefense: true, ignoreElementalResistance: true);
|
|
else if (throwableItem.ThrowableItemTags.Contains(ThrowableItemTag.TeleportToRandomLocation))
|
|
//enemy teleport
|
|
return;
|
|
else
|
|
enemy.TakeDamage(throwableItem.ThrowDamage, throwableItem.ElementType);
|
|
}
|
|
else
|
|
{
|
|
enemy.TakeDamage(ItemThatIsThrown.ThrowDamage);
|
|
}
|
|
}
|
|
} |