using Chickensoft.Collections; using Godot; using Zennysoft.Game.Abstractions; using Zennysoft.Game.Implementation; using Zennysoft.Ma.Adapter.Entity; namespace Zennysoft.Ma.Adapter; public interface IGameRepo : IDisposable { event Action? Ended; event Action? CloseInventoryEvent; event Action? AnnounceMessageOnMainScreenEvent; event Action? AnnounceMessageInInventoryEvent; event Action? RemoveItemFromInventoryEvent; event Action? EquippedItem; event Action? UnequippedItem; event Action? EnemyDied; void Pause(); void Resume(); IAutoProp IsPaused { get; } public void AnnounceMessageOnMainScreen(string message); public void AnnounceMessageInInventory(string message); public void RemoveItemFromInventory(IBaseInventoryItem item); public void CloseInventory(); public void GameEnded(); public void OnEquippedItem(IEquipableItem item); public void OnUnequippedItem(IEquipableItem item); public void OnEnemyDied(IEnemy enemy); } public class GameRepo : IGameRepo { public event Action? Ended; public event Action? CloseInventoryEvent; public event Action? AnnounceMessageOnMainScreenEvent; public event Action? AnnounceMessageInInventoryEvent; public event Action? RemoveItemFromInventoryEvent; public event Action? EquippedItem; public event Action? UnequippedItem; public event Action? EnemyDied; public IAutoProp IsPaused => _isPaused; private readonly AutoProp _isPaused; private bool _disposedValue; public GameRepo() { _isPaused = new AutoProp(true); } public void Pause() { _isPaused.OnNext(true); GD.Print("Paused"); } public void Resume() { _isPaused.OnNext(false); GD.Print("Resume"); } public void AnnounceMessageOnMainScreen(string message) { AnnounceMessageOnMainScreenEvent?.Invoke(message); } public void AnnounceMessageInInventory(string message) { AnnounceMessageInInventoryEvent?.Invoke(message); } public void RemoveItemFromInventory(IBaseInventoryItem item) { RemoveItemFromInventoryEvent?.Invoke(item); } public void CloseInventory() { CloseInventoryEvent?.Invoke(); } public void OnEquippedItem(IEquipableItem item) => EquippedItem?.Invoke(item); public void OnUnequippedItem(IEquipableItem item) => UnequippedItem?.Invoke(item); public void OnEnemyDied(IEnemy enemy) => EnemyDied?.Invoke(enemy); public void GameEnded() { Pause(); Ended?.Invoke(); } protected void Dispose(bool disposing) { if (!_disposedValue) { if (disposing) { _isPaused.OnCompleted(); _isPaused.Dispose(); } _disposedValue = true; } } public void Dispose() { Dispose(disposing: true); GC.SuppressFinalize(this); } }