using System; using System.Collections.Generic; using Robust.Shared.Interfaces.GameObjects; using Robust.Shared.Interfaces.Reflection; using Robust.Shared.IoC; using Robust.Shared.Utility; namespace Content.Server.AI.WorldState { /// /// The blackboard functions as an AI's repository of knowledge in a common format. /// public sealed class Blackboard { // Some stuff like "My Health" is easy to represent as components but abstract stuff like "How much food is nearby" // is harder. This also allows data to be cached if it's being hit frequently. // This also stops you from re-writing the same boilerplate everywhere of stuff like "Do I have OuterClothing on?" private readonly Dictionary _states = new Dictionary(); private readonly List _planningStates = new List(); public Blackboard(IEntity owner) { Setup(owner); } private void Setup(IEntity owner) { var typeFactory = IoCManager.Resolve(); var blackboardManager = IoCManager.Resolve(); foreach (var state in blackboardManager.AiStates) { var newState = (IAiState) typeFactory.CreateInstance(state); newState.Setup(owner); _states.Add(newState.GetType(), newState); switch (newState) { case IPlanningState planningState: _planningStates.Add(planningState); break; } } } /// /// All planning states will have their values reset /// public void ResetPlanning() { foreach (var state in _planningStates) { state.Reset(); } } public void GetStoredState(Type type, out StoredStateData state) { state = (StoredStateData) _states[type]; } /// /// Get the AI state class /// /// /// /// public T GetState() where T : IAiState { return (T) _states[typeof(T)]; } } }