- 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 event Action<StatModifier> OnModifierAdded;
- public event Action<StatModifier> OnModifierRemoved;
- public bool IsEmpty => modifiers.IsEmpty();
- public void PerformQuery(object sender, Query query) => Queries?.Invoke(sender, query);
- public void AddModifier(StatModifier modifier)
- {
- modifiers.InsertAtBegin(modifier);
- OnModifierAdded?.Invoke(modifier);
- Queries += modifier.Handle;
- modifier.OnDispose += callback =>
- {
- OnModifierRemoved?.Invoke(modifier);
- 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;
- }
- }
- }
- }