Files
VOIDRPG/Assets/90 - Scripts/Generic/Objects/Abstract/AbstractObjectStatusManager.cs
T
2026-07-09 21:33:33 +02:00

67 lines
2.7 KiB
C#

using System.Collections.Generic;
using System.Linq;
using Sirenix.OdinInspector;
using UnityEngine;
using VOID.Generic.Objects.Abstract.Events;
using VOID.Generic.Objects.Unit;
using VOID.ScriptableObjects;
namespace VOID.Generic.Objects.Abstract
{
[System.Serializable]
public class AbstractObjectStatusManager : ObjectComponent<AbstractObject>
{
#region Initialize
protected override void EventInitialize()
{
// When realtime based gameplay is working
parent.basicEvents.onFixedUpdate.AddListener(OnRealTimeDecreaseDuration);
// When turn based gameplay is working
parent.basicEvents.onTurnSelfStart.AddListener(OnTurnSelfStart);
parent.basicEvents.onTurnSelfEnd.AddListener(OnTurnSelfEnd);
// When entering or leaving turn based gameplay
parent.basicEvents.onTurnQueueEnter.AddListener(OnTurnEnter);
parent.basicEvents.onTurnQueueLeave.AddListener(OnTurnLeave);
}
protected override void Initialize()
{
// Statuses already added via inspector need to be started this way
// Important thing - instantiate ScriptableObjects so we wont change original ones
for (var i = 0; i < statuses.Count; i++)
{
statuses[i] = Object.Instantiate(statuses[i]);
statuses[i].Init(parent);
statuses[i].Apply();
}
}
#endregion
[SerializeReference, DisableInPlayMode] private List<BasicStatus> statuses = new();
private void OnTurnEnter(TurnEvent turnEvent) => parent.basicEvents.onFixedUpdate.RemoveListener(OnRealTimeDecreaseDuration);
private void OnTurnLeave(TurnEvent turnEvent) => parent.basicEvents.onFixedUpdate.AddListener(OnRealTimeDecreaseDuration);
private void OnTurnSelfStart(TurnEvent turnEvent) => statuses.ForEach(status => status.OnTurnSelfStart());
private void OnTurnSelfEnd(TurnEvent turnEvent) => statuses.ToList().ForEach(status => status.OnTurnSelfEnd());
private void OnRealTimeDecreaseDuration() => statuses.ToList().ForEach(status => status.DecreaseDurationRealTime());
public void AddStatus(BasicStatus status, UnitObject source = null, bool instantiate = true)
{
// instantiate ScriptableObjects so we wont change original ones if needed
if (instantiate) status = Object.Instantiate(status);
statuses.Add(status);
status.Init(parent, source);
status.Apply();
}
public void RemoveStatus(BasicStatus status) => statuses.Remove(status);
public BasicStatus[] GetStatuses() => statuses.ToArray();
}
}