Newer
Older
TheVengeance-Project-IADE-Unity2D / Assets / Scripts / Player / Stats / StatsMediator.cs
using MyCollections.Generic;
using System;
using System.Collections;
using UnityEngine;

namespace MyCollections.Stats
{
    public class StatsMediator
    {
        private readonly LinkedList<StatModifier> modifiers = new LinkedList<StatModifier>();

        public event EventHandler<Query> Queries;

        public bool IsEmpty => modifiers.IsEmpty();
        public void PerformQuery(object sender, Query query) => Queries?.Invoke(sender, query);

        public void AddModifier(StatModifier modifier)
        {
            modifiers.InsertAtBegin(modifier);
            Queries += modifier.Handle;

            modifier.OnDispose += callback =>
            {
                modifiers.Remove(modifier);
                Queries -= modifier.Handle;
            };
        }

        public void Update(float deltatime)
        {
            ListNode<StatModifier> node = modifiers.Head;

            while (node != null)
            {
                StatModifier modifier = node.Data;
                modifier.Update(deltatime);
                node = node.Next;
            }

            node = modifiers.Head;
            while (node != null)
            {
                ListNode<StatModifier> nextNode = node.Next;
                StatModifier modifier = node.Data;

                if (modifier.MarkedForRemoval) modifier.Dispose();

                node = nextNode;
            }
        }
    }
}