// // /*=============================================================================== // // Copyright (C) 2025 PhantomsXR Ltd. All Rights Reserved. // // // // This file is part of the Goap.Runtime. // // // // The TankBrawl cannot be copied, distributed, or made available to // // third-parties for commercial purposes without written permission of PhantomsXR Ltd. // // // // Contact nswell@phantomsxr.com for licensing requests. // // ===============================================================================*/ using System; using System.Collections.Generic; using System.Linq; using Goap.Agent.Core; using Goap.Core; namespace Goap.Runtime { public class CapabilityBuilder { private readonly CapabilityConfig capabilityConfig; private readonly List actionBuilders = new(); private readonly List goalBuilders = new(); private readonly List targetSensorBuilders = new(); private readonly List worldSensorBuilders = new(); private readonly List multiSensorBuilders = new(); private readonly WorldKeyBuilder worldKeyBuilder = new(); private readonly TargetKeyBuilder targetKeyBuilder = new(); public CapabilityBuilder(string name) { this.capabilityConfig = new CapabilityConfig(name); } /// /// Adds an action to the capability. /// /// The type of the action. /// An instance of . public ActionBuilder AddAction() where TAction : IAction { var actionBuilder = ActionBuilder.Create(this.worldKeyBuilder, this.targetKeyBuilder); this.actionBuilders.Add(actionBuilder); return actionBuilder; } /// /// Adds a goal to the capability. /// /// The type of the goal. /// An instance of . public GoalBuilder AddGoal() where TGoal : IGoal { var goalBuilder = GoalBuilder.Create(this.worldKeyBuilder); this.goalBuilders.Add(goalBuilder); return goalBuilder; } /// /// Adds a world sensor to the capability. /// /// The type of the world sensor. /// An instance of . public WorldSensorBuilder AddWorldSensor() where TWorldSensor : IWorldSensor { var worldSensorBuilder = WorldSensorBuilder.Create(this.worldKeyBuilder); this.worldSensorBuilders.Add(worldSensorBuilder); return worldSensorBuilder; } /// /// Adds a target sensor to the capability. /// /// The type of the target sensor. /// An instance of . public TargetSensorBuilder AddTargetSensor() where TTargetSensor : ITargetSensor { var targetSensorBuilder = TargetSensorBuilder.Create(this.targetKeyBuilder); this.targetSensorBuilders.Add(targetSensorBuilder); return targetSensorBuilder; } /// /// Adds a multi sensor to the capability. /// /// The type of the multi sensor. /// An instance of . public MultiSensorBuilder AddMultiSensor() where TMultiSensor : IMultiSensor { var multiSensorBuilder = MultiSensorBuilder.Create(); this.multiSensorBuilders.Add(multiSensorBuilder); return multiSensorBuilder; } public WorldKeyBuilder GetWorldKeyBuilder() { return this.worldKeyBuilder; } /// /// Builds the capability configuration. /// /// The built . public CapabilityConfig Build() { this.capabilityConfig.Actions = this.actionBuilders.Select(x => x.Build()).ToList(); this.capabilityConfig.Goals = this.goalBuilders.Select(x => x.Build()).ToList(); this.capabilityConfig.TargetSensors = this.targetSensorBuilders.Select(x => x.Build()).ToList(); this.capabilityConfig.WorldSensors = this.worldSensorBuilders.Select(x => x.Build()).ToList(); this.capabilityConfig.MultiSensors = this.multiSensorBuilders.Select(x => x.Build()).ToList(); return this.capabilityConfig; } internal TargetSensorBuilder AddTargetSensor(Type _type) { var targetSensorBuilder = TargetSensorBuilder.Create(_type, this.targetKeyBuilder); this.targetSensorBuilders.Add(targetSensorBuilder); return targetSensorBuilder; } internal ActionBuilder AddAction(Type _type) { var actionBuilder = ActionBuilder.Create(_type, this.worldKeyBuilder, this.targetKeyBuilder); this.actionBuilders.Add(actionBuilder); return actionBuilder; } internal GoalBuilder AddGoal(Type _goalType) { var goalBuilder = GoalBuilder.Create(_goalType, this.worldKeyBuilder); this.goalBuilders.Add(goalBuilder); return goalBuilder; } internal WorldSensorBuilder AddWorldSensor(Type _type) { var worldSensorBuilder = WorldSensorBuilder.Create(_type, this.worldKeyBuilder); this.worldSensorBuilders.Add(worldSensorBuilder); return worldSensorBuilder; } internal MultiSensorBuilder AddMultiSensor(Type _type) { var multiSensorBuilder = MultiSensorBuilder.Create(_type); this.multiSensorBuilders.Add(multiSensorBuilder); return multiSensorBuilder; } } }