using System; using System.Collections.Generic; using JetBrains.Annotations; using UnityEngine; namespace DDD.Restaurant { public static class RestaurantInteractionEventSolvers { public static readonly Dictionary TypeToSolver = new() { {InteractionType.RestaurantManagement, typeof(RestaurantManagementSolver)}, {InteractionType.RestaurantOrder, typeof(RestaurantOrderSolver)}, {InteractionType.RestaurantCook, typeof(RestaurantCookSolver)} }; public static readonly Dictionary TypeToPlayerSolver = new() { {InteractionType.RestaurantOrder, typeof(RestaurantOrderPlayerSolver)}, }; } public class RestaurantInteractionEvent : RestaurantEventBase { protected override bool EventSolve(GameObject causer, GameObject target, InteractionType interactionType, ScriptableObject payload) { if (!RestaurantInteractionEventSolvers.TypeToSolver.TryGetValue(interactionType, out var solverType)) { return false; } Component solverComponent = causer.GetComponent(solverType); IInteractionSolver solver = solverComponent as IInteractionSolver; IInteractor interactor = causer.GetComponent(); IInteractable interactable = target.GetComponent(); // Cast solverComponent to IInteractable if (solver is not null && interactor is not null) { bool canExecute = solver.CanExecuteInteraction(interactor, interactable, payload); if (canExecute) { return solver.ExecuteInteraction(interactor, interactable, payload); } return false; } // Should not reach here! Debug.Assert(false, "Solver Component or Interactor is null"); return false; } } }