Newer
Older
TheVengeance-Project-IADE-Unity2D / Assets / Scripts / Player / Stats / StatsMediator.cs
  1. using MyCollections.Generic;
  2. using System;
  3. using System.Collections;
  4. using UnityEngine;
  5. namespace MyCollections.Stats
  6. {
  7. public class StatsMediator
  8. {
  9. private readonly LinkedList<StatModifier> modifiers = new LinkedList<StatModifier>();
  10. public event EventHandler<Query> Queries;
  11. public event Action<StatModifier> OnModifierAdded;
  12. public event Action<StatModifier> OnModifierRemoved;
  13. public bool IsEmpty => modifiers.IsEmpty();
  14. public void PerformQuery(object sender, Query query) => Queries?.Invoke(sender, query);
  15. public void AddModifier(StatModifier modifier)
  16. {
  17. modifiers.InsertAtBegin(modifier);
  18. OnModifierAdded?.Invoke(modifier);
  19. Queries += modifier.Handle;
  20. modifier.OnDispose += callback =>
  21. {
  22. OnModifierRemoved?.Invoke(modifier);
  23. modifiers.Remove(modifier);
  24. Queries -= modifier.Handle;
  25. };
  26. }
  27. public void Update(float deltatime)
  28. {
  29. ListNode<StatModifier> node = modifiers.Head;
  30. while (node != null)
  31. {
  32. StatModifier modifier = node.Data;
  33. modifier.Update(deltatime);
  34. node = node.Next;
  35. }
  36. node = modifiers.Head;
  37. while (node != null)
  38. {
  39. ListNode<StatModifier> nextNode = node.Next;
  40. StatModifier modifier = node.Data;
  41. if (modifier.MarkedForRemoval) modifier.Dispose();
  42. node = nextNode;
  43. }
  44. }
  45. }
  46. }