Item Effects system

This commit is contained in:
Marco 2025-03-17 16:20:22 +01:00
commit dae952af8b
15 changed files with 255 additions and 84 deletions

View file

@ -0,0 +1,41 @@
using System;
using Cirno.Scripts.Components.FSM.Player;
using Godot;
namespace Cirno.Scripts.Resources.ItemEffects;
[GlobalClass]
public partial class HealEffectResource : ItemEffectResource
{
[Export] public float HealAmount { get; private set; } = 10f;
[Export] public HealResourceType ResourceType { get; private set; } = HealResourceType.Health;
public override IITemEffectMachine Execute(PlayerFSMItemUseModule parent, LootItem item)
{
return new HealEffectmachine(this, parent, item).Execute();
}
public class HealEffectmachine(HealEffectResource resource, PlayerFSMItemUseModule parent, LootItem item)
: IITemEffectMachine
{
public IITemEffectMachine Execute()
{
switch (resource.ResourceType)
{
case HealResourceType.Health:
parent.Health.CurrentResource += resource.HealAmount;
break;
case HealResourceType.Shield:
parent.Shield.CurrentResource += resource.HealAmount;
break;
}
return this;
}
}
public enum HealResourceType
{
Health,
Shield
}
}

View file

@ -0,0 +1 @@
uid://ppuaa7avtsgq

View file

@ -0,0 +1,33 @@
using Cirno.Scripts.Components.FSM.Player;
using Godot;
namespace Cirno.Scripts.Resources.ItemEffects;
[GlobalClass]
public partial class HealPercentEffectResource : ItemEffectResource
{
[Export] public float HealPercentage = 25f;
[Export] public HealEffectResource.HealResourceType ResourceType { get; private set; } = HealEffectResource.HealResourceType.Health;
public override IITemEffectMachine Execute(PlayerFSMItemUseModule parent, LootItem item)
{
return new HealPercentEffectmachine(this, parent, item).Execute();
}
public class HealPercentEffectmachine(HealPercentEffectResource resource, PlayerFSMItemUseModule parent, LootItem item) : IITemEffectMachine
{
public IITemEffectMachine Execute()
{
switch (resource.ResourceType)
{
case HealEffectResource.HealResourceType.Health:
parent.Health.CurrentResource += Mathf.CeilToInt(parent.Health.MaxResource * resource.HealPercentage / 100);
break;
case HealEffectResource.HealResourceType.Shield:
parent.Shield.CurrentResource += Mathf.CeilToInt(parent.Shield.MaxResource * resource.HealPercentage / 100);
break;
}
return this;
}
}
}

View file

@ -0,0 +1 @@
uid://bxgjw8wis5l0t

View file

@ -0,0 +1,8 @@
using Cirno.Scripts.Components.FSM.Player;
namespace Cirno.Scripts.Resources.ItemEffects;
public interface IITemEffectMachine
{
public IITemEffectMachine Execute();
}

View file

@ -0,0 +1 @@
uid://bb8cess7hkvwg

View file

@ -0,0 +1,10 @@
using Cirno.Scripts.Components.FSM.Player;
using Godot;
namespace Cirno.Scripts.Resources.ItemEffects;
[GlobalClass]
public abstract partial class ItemEffectResource : Resource
{
public abstract IITemEffectMachine Execute(PlayerFSMItemUseModule parent, LootItem item);
}

View file

@ -0,0 +1 @@
uid://cmkhe0q83rkmd

View file

@ -0,0 +1,44 @@
using Cirno.Scripts.Components.FSM.Player;
using Godot;
namespace Cirno.Scripts.Resources.ItemEffects;
[GlobalClass]
public partial class SpiderbombEffectResource : ItemEffectResource
{
public override IITemEffectMachine Execute(PlayerFSMItemUseModule parent, LootItem item)
{
return new SpiderbombEffectmachine(this, parent, item).Execute();
}
public class SpiderbombEffectmachine(SpiderbombEffectResource resource, PlayerFSMItemUseModule parent, LootItem item) : IITemEffectMachine
{
public IITemEffectMachine Execute()
{
var bullet = parent.CreateChildOf<Bullet>(GameManager.Instance.BulletsContainer, item.WeaponData.BulletData.BulletScene, parent.GlobalPosition);
var bulletData = item.WeaponData.MakeBullet(parent.GlobalPosition);
bullet.Initialize(bulletData, GameManager.Instance);
bullet.SetDirection(parent.FacingDirection);
bullet.RotateSpriteDegrees(-90);
//bullet.SetDirection(_facingDirection);
bullet.Speed = item.WeaponData.BulletData.BulletSpeed;
parent.Machine.SetState(PlayerState.Controlling);
//RequestMovementDisable(true);
// set camera
GameManager.Instance.CameraTargetObject(bullet);
// set event destroy
bullet.OnDestroy += () =>
{
GameManager.Instance.CameraTargetPlayer();
parent.Machine.SetState(PlayerState.Active);
//RequestMovementDisable(false);
};
return this;
}
}
}

View file

@ -0,0 +1 @@
uid://cyipg3seetrxd