Files
GameJamDungeon/src/items/thrown/ThrownItem.cs

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);
}
}
}