using System; using System.Collections.Generic; using System.Linq; using Goap.Agent.Core; using Goap.Core; using UnityEngine; namespace Goap.Runtime { public class AgentTypeBuilder { private readonly AgentTypeConfig agentTypeConfig; private readonly List capabilityBuilders = new(); private readonly List capabilityConfigs = new(); public AgentTypeBuilder(string name) { this.agentTypeConfig = new AgentTypeConfig(name); } /// /// Creates a new capability with the specified name. /// /// The name of the capability. /// A new instance of . public CapabilityBuilder CreateCapability(string name) { var capabilityBuilder = new CapabilityBuilder(name); this.capabilityBuilders.Add(capabilityBuilder); return capabilityBuilder; } /// /// Creates a new capability with the specified name and applies the given callback. /// /// The name of the capability. /// The callback to apply to the capability builder. public void CreateCapability(string name, Action callback) { var capabilityBuilder = new CapabilityBuilder(name); callback(capabilityBuilder); this.capabilityBuilders.Add(capabilityBuilder); } /// /// Adds a capability of the specified type. /// /// The type of the capability. public void AddCapability() where TCapability : CapabilityFactoryBase, new() { this.capabilityConfigs.Add(new TCapability().Create()); } /// /// Adds a capability using the specified capability factory. /// /// The capability factory. public void AddCapability(CapabilityFactoryBase capabilityFactory) { this.capabilityConfigs.Add(capabilityFactory.Create()); } /// /// Adds a capability using the specified mono capability factory. /// /// The mono capability factory. public void AddCapability(MonoCapabilityFactoryBase capabilityFactory) { this.capabilityConfigs.Add(capabilityFactory.Create()); } /// /// Adds a capability using the specified scriptable capability factory. /// /// The scriptable capability factory. public void AddCapability(ScriptableCapabilityFactoryBase capabilityFactory) { this.capabilityConfigs.Add(capabilityFactory.Create()); } /// /// Adds a capability using the specified capability builder. /// /// The capability builder. public void AddCapability(CapabilityBuilder capabilityBuilder) { this.capabilityConfigs.Add(capabilityBuilder.Build()); } /// /// Adds a capability using the specified capability config. /// /// The capability config. public void AddCapability(ICapabilityConfig capabilityConfig) { this.capabilityConfigs.Add(capabilityConfig); } /// /// Builds the agent type configuration. /// /// The built . public AgentTypeConfig Build() { this.capabilityConfigs.AddRange(this.capabilityBuilders.Select(x => x.Build())); this.agentTypeConfig.Actions = this.capabilityConfigs.SelectMany(x => x.Actions).ToList(); this.agentTypeConfig.Goals = this.capabilityConfigs.SelectMany(x => x.Goals).ToList(); this.agentTypeConfig.TargetSensors = this.capabilityConfigs.SelectMany(x => x.TargetSensors).ToList(); this.agentTypeConfig.WorldSensors = this.capabilityConfigs.SelectMany(x => x.WorldSensors).ToList(); this.agentTypeConfig.MultiSensors = this.capabilityConfigs.SelectMany(x => x.MultiSensors).ToList(); return this.agentTypeConfig; } } }